Tatooine
saddle.h
Go to the documentation of this file.
1#ifndef TATOOINE_ANALYTICAL_NUMERICAL_SADDLE_H
2#define TATOOINE_ANALYTICAL_NUMERICAL_SADDLE_H
3//==============================================================================
6#include <tatooine/field.h>
7//==============================================================================
9//==============================================================================
10template <floating_point Real, std::size_t NumDimensions>
11struct saddle;
12template <floating_point Real>
13struct saddle<Real, 2> : vectorfield<saddle<Real, 2>, Real, 2> {
16 using typename parent_type::pos_type;
17 using typename parent_type::tensor_type;
18 //============================================================================
19 constexpr saddle() noexcept {}
20 constexpr saddle(saddle const&) = default;
21 constexpr saddle(saddle&&) noexcept = default;
22 auto constexpr operator=(saddle const&) -> saddle& = default;
23 auto constexpr operator=(saddle&&) noexcept -> saddle& = default;
24 //----------------------------------------------------------------------------
25 virtual ~saddle() = default;
26 //----------------------------------------------------------------------------
27 [[nodiscard]] auto constexpr evaluate(pos_type const& x,
28 Real const /*t*/) const -> tensor_type {
29 return tensor_type{-x(0), x(1)};
30 }
31};
32template <floating_point Real>
33struct saddle<Real, 3> : vectorfield<saddle<Real, 3>, Real, 3> {
36 using typename parent_type::pos_type;
37 using typename parent_type::tensor_type;
38 //============================================================================
39 constexpr saddle() noexcept {}
40 constexpr saddle(saddle const&) = default;
41 constexpr saddle(saddle&&) noexcept = default;
42 auto constexpr operator=(saddle const&) -> saddle& = default;
43 auto constexpr operator=(saddle&&) noexcept -> saddle& = default;
44 //----------------------------------------------------------------------------
45 virtual ~saddle() = default;
46 //----------------------------------------------------------------------------
47 [[nodiscard]] auto constexpr evaluate(pos_type const& x,
48 Real const /*t*/) const -> tensor_type {
49 return tensor_type{-x(0), -x(1), x(2)/10};
50 }
51};
52//==============================================================================
53template <std::size_t NumDimensions>
57//==============================================================================
58template <floating_point Real>
59struct rotated_saddle : vectorfield<rotated_saddle<Real>, Real, 2> {
62 using typename parent_type::pos_type;
63 using typename parent_type::tensor_type;
64 //----------------------------------------------------------------------------
65 private:
66 //----------------------------------------------------------------------------
68 //----------------------------------------------------------------------------
69 public:
70 //----------------------------------------------------------------------------
71 explicit constexpr rotated_saddle(Real angle_in_radians = M_PI / 4) noexcept
72 : m_angle_in_radians{angle_in_radians} {}
73 constexpr rotated_saddle(rotated_saddle const&) = default;
74 constexpr rotated_saddle(rotated_saddle&&) noexcept = default;
75 auto constexpr operator=(rotated_saddle const&) -> rotated_saddle& = default;
76 auto constexpr operator=(rotated_saddle&&) noexcept
77 -> rotated_saddle& = default;
78 //----------------------------------------------------------------------------
79 virtual ~rotated_saddle() = default;
80 //----------------------------------------------------------------------------
81 [[nodiscard]] auto constexpr evaluate(pos_type const& x,
82 Real const /*t*/) const -> tensor_type {
83 auto const R = Mat2<Real>{
84 {gcem::cos(m_angle_in_radians), -gcem::sin(m_angle_in_radians)},
85 {gcem::sin(m_angle_in_radians), gcem::cos(m_angle_in_radians)}};
86 return R * tensor_type{-x(0), x(1)} * transposed(R);
87 }
88};
89//==============================================================================
91//==============================================================================
92template <typename Real>
94 using real_type = Real;
97 saddle_flowmap() = default;
99 static auto constexpr num_dimensions() { return 2; }
100 //----------------------------------------------------------------------------
101 auto constexpr evaluate(pos_type const& x, Real const t, Real const tau) const
102 -> pos_type {
103 return {std::exp(-tau) * x(0), std::exp(tau) * x(1)};
104 }
105 //----------------------------------------------------------------------------
106 auto constexpr operator()(pos_type const& x, Real const t,
107 Real const tau) const -> pos_type {
108 return evaluate(x, t, tau);
109 }
110};
111template <floating_point Real>
112auto constexpr flowmap(saddle<Real, 2> const& /*v*/, tag::analytical_t /*tag*/) {
114}
115// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
116template <floating_point Real>
117auto constexpr flowmap(saddle<Real, 2> const& v) {
118 return flowmap(v, tag::analytical);
119}
120//==============================================================================
121} // namespace tatooine::analytical::numerical
122//==============================================================================
123namespace tatooine {
124//==============================================================================
125template <floating_point Real>
126struct differentiated_field<analytical::numerical::saddle<Real, 2>>
127 : matrixfield<analytical::numerical::saddle<Real, 2>, Real, 2> {
130 using typename parent_type::pos_type;
131 using typename parent_type::tensor_type;
132
133 //============================================================================
134 public:
135 auto constexpr evaluate(pos_type const& x, Real const t) const
136 -> tensor_type {
137 return {{-1, 0}, {0, 1}};
138 }
139};
140//==============================================================================
141template <floating_point Real>
142struct differentiated_flowmap<analytical::numerical::saddle_flowmap<Real>> {
143 using real_type = Real;
148 static auto constexpr num_dimensions() { return 2; }
149 //----------------------------------------------------------------------------
150 auto constexpr evaluate(pos_type const& x, Real const t, Real const tau) const
151 -> gradient_type {
152 return {{std::exp(-tau), real_type(0)}, {real_type(0), std::exp(tau)}};
153 }
154 //----------------------------------------------------------------------------
155 auto constexpr operator()(pos_type const& x, Real const t,
156 Real const tau) const {
157 return evaluate(x, t, tau);
158 }
159};
160//==============================================================================
161} // namespace tatooine
162//==============================================================================
163#endif
Definition: abcflow.h:7
constexpr auto flowmap(vectorfield< autonomous_particles_test< Real >, Real, 2 > const &v, tag::numerical_t)
Definition: autonomous_particles_test.h:75
static constexpr analytical_t analytical
Definition: tags.h:91
Definition: algorithm.h:6
auto transposed(dynamic_tensor auto &&t)
Definition: transposed_tensor.h:170
auto constexpr evaluate(pos_type const &x, Real const) const -> tensor_type
Definition: saddle.h:81
constexpr rotated_saddle(rotated_saddle &&) noexcept=default
constexpr rotated_saddle(Real angle_in_radians=M_PI/4) noexcept
Definition: saddle.h:71
constexpr rotated_saddle(rotated_saddle const &)=default
Real m_angle_in_radians
Definition: saddle.h:67
constexpr saddle(saddle const &)=default
constexpr saddle(saddle &&) noexcept=default
constexpr saddle() noexcept
Definition: saddle.h:19
constexpr saddle(saddle const &)=default
constexpr saddle() noexcept
Definition: saddle.h:39
constexpr saddle(saddle &&) noexcept=default
auto constexpr evaluate(pos_type const &x, Real const t, Real const tau) const -> pos_type
Definition: saddle.h:101
auto constexpr operator()(pos_type const &x, Real const t, Real const tau) const -> pos_type
Definition: saddle.h:106
vec< Real, 2 > vec_type
Definition: saddle.h:95
static auto constexpr num_dimensions()
Definition: saddle.h:99
saddle_flowmap(saddle< Real, 2 > const &)
Definition: saddle.h:98
vec_type pos_type
Definition: axis_aligned_bounding_box.h:109
auto constexpr evaluate(pos_type const &x, Real const t) const -> tensor_type
Definition: saddle.h:135
Definition: differentiated_field.h:173
auto constexpr operator()(pos_type const &x, Real const t, Real const tau) const
Definition: saddle.h:155
auto constexpr evaluate(pos_type const &x, Real const t, Real const tau) const -> gradient_type
Definition: saddle.h:150
Definition: differentiated_flowmap.h:141
Definition: field.h:134
vec< real_type, NumDimensions > pos_type
Definition: field.h:20
Tensor tensor_type
Definition: field.h:18
interpolation_tensor_type< tensor< Real, Dims... > > tensor_type
Definition: interpolation.h:135
Definition: mat.h:14
typename flowmap_type::vec_type vec_type
Definition: differentiated_flowmap.h:21
typename flowmap_type::real_type real_type
Definition: differentiated_flowmap.h:17
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
Definition: tags.h:90
Definition: vec.h:12