Tatooine
differentiated_flowmap.h
Go to the documentation of this file.
1#ifndef TATOOINE_DIFFERENTIATED_FLOWMAP_H
2#define TATOOINE_DIFFERENTIATED_FLOWMAP_H
3//==============================================================================
5#include <tatooine/tags.h>
6#include <tatooine/tensor.h>
7//==============================================================================
8namespace tatooine {
9//==============================================================================
11template <flowmap_concept Flowmap>
13 //============================================================================
14 public:
15 using flowmap_type = std::decay_t<Flowmap>;
17 using real_type = typename flowmap_type::real_type;
18 static constexpr auto num_dimensions() -> std::size_t {
19 return flowmap_type::num_dimensions();
20 }
21 using vec_type = typename flowmap_type::vec_type;
22 using pos_type = typename flowmap_type::pos_type;
25 static constexpr auto default_epsilon = 1e-6;
26 //============================================================================
27 private:
30 //============================================================================
31 public:
35 : m_flowmap{std::forward<decltype(flowmap)>(flowmap)},
36 m_epsilon{tag::fill{epsilon}} {}
37 //----------------------------------------------------------------------------
39 vec_type const& epsilon)
40 : m_flowmap{std::forward<decltype(flowmap)>(flowmap)},
42 //============================================================================
43 auto evaluate(pos_type const& y0, real_type const t0,
44 real_type const tau) const {
45 auto derivative = value_type{};
46
47 auto offset = pos_type::zeros();
48 for (std::size_t i = 0; i < num_dimensions(); ++i) {
49 offset(i) = m_epsilon(i);
50 auto const dx = 1 / (2 * m_epsilon(i));
51 derivative.col(i) = m_flowmap(y0 + offset, t0, tau) * dx -
52 m_flowmap(y0 - offset, t0, tau) * dx;
53 offset(i) = 0;
54 }
55 return derivative;
56 }
57 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
58 auto operator()(pos_type const& y0, real_type const t0,
59 real_type const tau) const {
60 return evaluate(y0, t0, tau);
61 }
62 //----------------------------------------------------------------------------
63 auto epsilon() const -> auto const& { return m_epsilon; }
64 auto epsilon() -> auto& { return m_epsilon; }
65 auto epsilon(std::size_t i) const { return m_epsilon(i); }
66 auto epsilon(std::size_t i) -> auto& { return m_epsilon(i); }
68 auto set_epsilon(vec_type&& epsilon) { m_epsilon = std::move(epsilon); }
69 auto flowmap() const -> auto const& { return m_flowmap; }
70 auto flowmap() -> auto& { return m_flowmap; }
71};
72//==============================================================================
73// copy when having rvalue
74template <flowmap_concept Flowmap>
77//------------------------------------------------------------------------------
78// copy when having rvalue
79template <flowmap_concept Flowmap>
82//------------------------------------------------------------------------------
83// copy when having rvalue
84template <flowmap_concept Flowmap>
85numerically_differentiated_flowmap(Flowmap&&, typename Flowmap::pos_type const&)
87//------------------------------------------------------------------------------
88// keep reference when having lvalue
89template <flowmap_concept Flowmap>
92//------------------------------------------------------------------------------
93// keep reference when having lvalue
94template <flowmap_concept Flowmap>
97//==============================================================================
98// keep reference when having lvalue
99template <flowmap_concept Flowmap>
101 typename Flowmap::pos_type const&)
103//==============================================================================
106 std::forward<decltype(flowmap)>(flowmap)};
107}
108//------------------------------------------------------------------------------
110 arithmetic auto const epsilon) {
112 std::forward<decltype(flowmap)>(flowmap), epsilon};
113}
114//------------------------------------------------------------------------------
115auto diff(
118 std::decay_t<decltype(flowmap)>::num_dimensions()> auto&& epsilon) {
120 std::forward<decltype(flowmap)>(flowmap),
121 std::forward<decltype(epsilon)>(epsilon)};
122}
123//------------------------------------------------------------------------------
124auto diff(flowmap_concept auto&& flowmap, arithmetic auto const epsilon) {
125 return diff(std::forward<decltype(flowmap)>(flowmap), tag::numerical,
126 epsilon);
127}
128//------------------------------------------------------------------------------
129auto diff(
132 std::decay_t<decltype(flowmap)>::num_dimensions()> auto&& epsilon) {
134 std::forward<decltype(flowmap)>(flowmap),
135 std::forward<decltype(epsilon)>(epsilon)};
136}
137//==============================================================================
140template <flowmap_concept Flowmap>
144};
145//==============================================================================
146// copy when having rvalue
147template <typename Flowmap>
149//------------------------------------------------------------------------------
150// keep reference when having lvalue
151template <typename Flowmap>
154//==============================================================================
156 return differentiated_flowmap{std::forward<decltype(flowmap)>(flowmap)};
157}
158//==============================================================================
159template <typename T>
160struct is_differentiated_flowmap_impl : std::false_type {};
161//------------------------------------------------------------------------------
162template <typename Flowmap>
164 : std::true_type {};
165//------------------------------------------------------------------------------
166template <typename Flowmap>
168 numerically_differentiated_flowmap<Flowmap>> : std::true_type {};
169//------------------------------------------------------------------------------
170template <typename T>
171static constexpr auto is_differentiated_flowmap =
173//==============================================================================
174} // namespace tatooine
175//==============================================================================
176#endif
Definition: concepts.h:33
Definition: concepts.h:39
Definition: tensor_concepts.h:36
Definition: flowmap_concept.h:15
static constexpr numerical_t numerical
Definition: tags.h:93
Definition: algorithm.h:6
auto flowmap(vectorfield< V, Real, NumDimensions > const &v, tag::numerical_t)
Definition: numerical_flowmap.h:412
constexpr auto diff(polynomial< Real, Degree > const &f)
Definition: polynomial.h:179
static constexpr forward_tag forward
Definition: tags.h:9
static constexpr auto is_differentiated_flowmap
Definition: differentiated_flowmap.h:171
Definition: differentiated_flowmap.h:141
Definition: differentiated_flowmap.h:160
Definition: mat.h:14
Default differentiated flowmap uses central differences for differentiating.
Definition: differentiated_flowmap.h:12
typename flowmap_type::pos_type pos_type
Definition: differentiated_flowmap.h:22
numerically_differentiated_flowmap(convertible_to< Flowmap > auto &&flowmap, vec_type const &epsilon)
Definition: differentiated_flowmap.h:38
auto set_epsilon(vec_type &&epsilon)
Definition: differentiated_flowmap.h:68
auto epsilon(std::size_t i) -> auto &
Definition: differentiated_flowmap.h:66
std::decay_t< Flowmap > flowmap_type
Definition: differentiated_flowmap.h:15
static constexpr auto default_epsilon
Definition: differentiated_flowmap.h:25
vec_type m_epsilon
Definition: differentiated_flowmap.h:29
typename flowmap_type::vec_type vec_type
Definition: differentiated_flowmap.h:21
auto epsilon() const -> auto const &
Definition: differentiated_flowmap.h:63
auto set_epsilon(vec_type const &epsilon)
Definition: differentiated_flowmap.h:67
static constexpr auto num_dimensions() -> std::size_t
Definition: differentiated_flowmap.h:18
typename flowmap_type::real_type real_type
Definition: differentiated_flowmap.h:17
auto flowmap() -> auto &
Definition: differentiated_flowmap.h:70
numerically_differentiated_flowmap(convertible_to< Flowmap > auto &&flowmap, real_type const epsilon=default_epsilon)
Definition: differentiated_flowmap.h:32
auto epsilon() -> auto &
Definition: differentiated_flowmap.h:64
auto operator()(pos_type const &y0, real_type const t0, real_type const tau) const
Definition: differentiated_flowmap.h:58
auto epsilon(std::size_t i) const
Definition: differentiated_flowmap.h:65
auto flowmap() const -> auto const &
Definition: differentiated_flowmap.h:69
auto evaluate(pos_type const &y0, real_type const t0, real_type const tau) const
Definition: differentiated_flowmap.h:43
mat< real_type, num_dimensions(), num_dimensions()> mat_type
Definition: differentiated_flowmap.h:23
flowmap_type m_flowmap
Definition: differentiated_flowmap.h:28
Definition: tags.h:92