Loading [MathJax]/extensions/tex2jax.js
Tatooine
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages Concepts
ftle.h
Go to the documentation of this file.
1#ifndef TATOOINE_FTLE_FIELD_H
2#define TATOOINE_FTLE_FIELD_H
3//==============================================================================
4#include <tatooine/concepts.h>
6#include <tatooine/field.h>
9#include <tatooine/tags.h>
10//==============================================================================
11namespace tatooine {
12//==============================================================================
13template <typename FlowmapGradient>
15 : scalarfield<ftle_field<FlowmapGradient>, typename FlowmapGradient::real_type,
16 FlowmapGradient::num_dimensions()> {
17 using real_type = typename FlowmapGradient::real_type;
19 using parent_type = scalarfield<this_type, real_type, FlowmapGradient::num_dimensions()>;
20 using vec_type = typename FlowmapGradient::vec_type;
21 using typename parent_type::pos_type;
22 using typename parent_type::tensor_type;
23 static auto constexpr num_dimensions() {
24 return FlowmapGradient::num_dimensions();
25 }
26 //============================================================================
27 private:
28 FlowmapGradient m_flowmap_gradient;
30 //============================================================================
31 public:
32 template <typename V, typename VReal, size_t N,
33 template <typename, size_t> typename ODESolver>
34 requires requires(V&& v, typename V::pos_type&& x, typename V::real_type&& t) {
35 v(x, t);
36 }
38 ODESolver<VReal, N> const&)
39 : m_flowmap_gradient{diff(flowmap<ODESolver>(v))},
40 m_tau{static_cast<real_type>(tau)} {}
41 //------------------------------------------------------------------------------
42 template <typename V, typename VReal, size_t N>
43 requires requires(V&& v, typename V::pos_type&& x, typename V::real_type&& t) {
44 v(x, t);
45 }
47 : m_flowmap_gradient{diff(flowmap(v))}, m_tau{static_cast<real_type>(tau)} {}
48 //------------------------------------------------------------------------------
49 template <typename V, typename VReal, size_t N>
50 requires requires(V&& v, typename V::pos_type&& x, typename V::real_type&& t) {
51 { v(x, t) }
52 ->std::convertible_to<typename V::tensor_type>;
53 }
55 arithmetic auto eps)
57 m_tau{static_cast<real_type>(tau)} {}
58 //------------------------------------------------------------------------------
59 template <typename V, typename VReal, size_t N>
60 requires requires(V&& v, typename V::pos_type&& x, typename V::real_type&& t) {
61 v(x, t);
62 }
64 vec_type const& eps)
66 m_tau{static_cast<real_type>(tau)} {}
68 // template <typename FlowmapGradient_>
69 // constexpr ftle_field(FlowmapGradient_&& flowmap_gradient, arithmetic auto
70 // tau)
71 // : m_flowmap_gradient{std::forward<FlowmapGradient_>(flowmap_gradient)},
72 // m_tau{static_cast<real_type>(tau)} {}
73 //============================================================================
74 auto evaluate(pos_type const& x, real_type t) const -> tensor_type final {
75 auto const g = m_flowmap_gradient(x, t, m_tau);
76 auto const eigvals = eigenvalues_sym(transposed(g) * g);
77 return gcem::log(gcem::sqrt(eigvals(num_dimensions() - 1))) /
78 std::abs(m_tau);
79 }
80 //----------------------------------------------------------------------------
81 auto tau() const { return m_tau; }
82 auto tau() -> auto& { return m_tau; }
84 //----------------------------------------------------------------------------
85 auto flowmap_gradient() const -> const auto& { return m_flowmap_gradient; }
86 auto flowmap_gradient() -> auto& { return m_flowmap_gradient; }
87};
88//==============================================================================
89template <typename V, typename Real, size_t N,
90 template <typename, size_t> typename ODESolver>
92 ODESolver<Real, N>)
93 -> ftle_field<
95//------------------------------------------------------------------------------
96template <typename V, typename Real, size_t N>
98 -> ftle_field<decltype(diff(flowmap(v)))>;
99//------------------------------------------------------------------------------
100template <typename V, typename Real, size_t N>
102 -> ftle_field<decltype(diff(flowmap(v)))>;
103//------------------------------------------------------------------------------
104template <typename V, typename Real, size_t N, typename EpsReal>
106 vec<EpsReal, N> const&) -> ftle_field<decltype(diff(flowmap(v)))>;
107//==============================================================================
108template <typename... Domains, typename Flowmap>
110 arithmetic auto const t0, arithmetic auto const tau,
111 execution_policy_tag auto const exec) -> auto& {
112 auto const fixed_time_phi = [&flowmap, t0, tau](auto const& x) {
113 return flowmap(x, t0, tau);
114 };
115
116 auto const& phi =
117 grid.sample_to_vertex_property(fixed_time_phi, "[ftle]_phi", exec);
118 auto const& nabla_phi =
119 grid.sample_to_vertex_property(diff(phi), "[ftle]_nabla_phi", exec);
120
121 auto const ftle_field = [&](integral auto const... is) {
122 auto const& nabla_phi_at_pos = nabla_phi(is...);
123 auto const eigvals =
124 eigenvalues_sym(transposed(nabla_phi_at_pos) * nabla_phi_at_pos);
125 return gcem::log(gcem::sqrt(eigvals(sizeof...(Domains) - 1))) /
126 std::abs(tau);
127 };
128 return grid.sample_to_vertex_property(ftle_field, "ftle", exec);
129}
130//==============================================================================
131template <typename... Domains, typename Flowmap>
133 arithmetic auto const t0, arithmetic auto const tau)
134 -> decltype(auto) {
136}
137//==============================================================================
138} // namespace tatooine
139//==============================================================================
140#endif
Definition: grid_edge.h:16
Definition: rectilinear_grid.h:38
Definition: concepts.h:33
Definition: tags.h:72
Definition: concepts.h:21
static constexpr sequential_t sequential
Definition: tags.h:63
Definition: algorithm.h:6
auto flowmap(vectorfield< V, Real, NumDimensions > const &v, tag::numerical_t)
Definition: numerical_flowmap.h:412
auto ftle(rectilinear_grid< Domains... > &grid, Flowmap &&flowmap, arithmetic auto const t0, arithmetic auto const tau, execution_policy_tag auto const exec) -> auto &
Definition: ftle.h:109
auto transposed(dynamic_tensor auto &&t)
Definition: transposed_tensor.h:170
constexpr auto diff(polynomial< Real, Degree > const &f)
Definition: polynomial.h:179
constexpr auto eigenvalues_sym(Mat &&A)
Definition: eigenvalues.h:55
Definition: field.h:134
vec< real_type, NumDimensions > pos_type
Definition: field.h:20
Tensor tensor_type
Definition: field.h:18
Definition: ftle.h:16
constexpr ftle_field(vectorfield< V, VReal, N > const &v, arithmetic auto tau, vec_type const &eps)
Definition: ftle.h:63
typename FlowmapGradient::vec_type vec_type
Definition: ftle.h:20
auto flowmap_gradient() const -> const auto &
Definition: ftle.h:85
constexpr ftle_field(vectorfield< V, VReal, N > const &v, arithmetic auto tau, arithmetic auto eps)
Definition: ftle.h:54
constexpr ftle_field(vectorfield< V, VReal, N > const &v, arithmetic auto tau, ODESolver< VReal, N > const &)
Definition: ftle.h:37
ftle_field< FlowmapGradient > this_type
Definition: ftle.h:18
void set_tau(real_type tau)
Definition: ftle.h:83
FlowmapGradient m_flowmap_gradient
Definition: ftle.h:28
auto tau() -> auto &
Definition: ftle.h:82
auto flowmap_gradient() -> auto &
Definition: ftle.h:86
typename FlowmapGradient::real_type real_type
Definition: ftle.h:17
auto evaluate(pos_type const &x, real_type t) const -> tensor_type final
Definition: ftle.h:74
static auto constexpr num_dimensions()
Definition: ftle.h:23
real_type m_tau
Definition: ftle.h:29
auto tau() const
Definition: ftle.h:81
constexpr ftle_field(vectorfield< V, VReal, N > const &v, arithmetic auto tau)
Definition: ftle.h:46
Default differentiated flowmap uses central differences for differentiating.
Definition: differentiated_flowmap.h:12
Definition: vec.h:12