Tatooine
numerical_flowmap.h
Go to the documentation of this file.
1#ifndef TATOOINE_NUMERICAL_FLOWMAP_H
2#define TATOOINE_NUMERICAL_FLOWMAP_H
3//==============================================================================
5#include <tatooine/field.h>
9#include <tatooine/cache.h>
10#include <tatooine/tags.h>
11//==============================================================================
12namespace tatooine {
13//==============================================================================
14template <typename V, template <typename, std::size_t> typename ODESolver,
15 template <typename> typename InterpolationKernel =
16 interpolation::cubic>
19 using raw_field_type = std::remove_pointer_t<std::decay_t<V>>;
20 using real_type = typename raw_field_type::real_type;
21 static constexpr auto num_dimensions() -> std::size_t {
22 return raw_field_type::num_dimensions();
23 }
27 using cache_type =
31 std::map<std::pair<pos_type, real_type>, std::pair<bool, bool>>;
32 static constexpr auto holds_field_pointer = std::is_pointer_v<V>;
33 static constexpr auto default_use_caching = false;
34 //============================================================================
35 // members
36 //============================================================================
37 private:
38 V m_v;
43 //============================================================================
44 // ctors
45 //============================================================================
46 public:
48 : m_v{other.m_v},
51 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
53 : m_v{std::move(other.m_v)},
54 m_ode_solver{std::move(other.m_ode_solver)},
55 m_use_caching{other.m_use_caching} {}
56 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
58 if (&other == this) {
59 return *this;
60 }
61 m_v = other.m_v;
62 m_ode_solver = other.m_ode_solver;
63 m_use_caching = other.m_use_caching;
64 return *this;
65 }
66 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
67 auto operator=(numerical_flowmap&& other) noexcept -> numerical_flowmap& {
68 m_v = std::move(other.m_v);
69 m_ode_solver = std::move(other.m_ode_solver);
70 m_use_caching = other.m_use_caching;
71 return *this;
72 }
73 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
74 ~numerical_flowmap() = default;
75 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
76 template <std::convertible_to<V> W, arithmetic WReal,
77 std::size_t NumDimensions, typename V_ = V>
78 requires(!holds_field_pointer)
79 explicit constexpr numerical_flowmap(
83 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
84 template <std::convertible_to<V> W, arithmetic WReal,
85 std::size_t NumDimensions, typename V_ = V>
86 requires holds_field_pointer
87 explicit constexpr numerical_flowmap(
90 : m_v{&w->as_derived()}, m_use_caching{use_caching} {}
91 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
92 template <arithmetic WReal, std::size_t NumDimensions, typename V_ = V>
93 requires holds_field_pointer
94 explicit constexpr numerical_flowmap(
98 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
99 template <arithmetic WReal, std::size_t NumDimensions, typename V_ = V>
100 requires holds_field_pointer
101 explicit constexpr numerical_flowmap(
103 bool const use_caching = default_use_caching)
105 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
106 template <typename V_ = V>
107 requires holds_field_pointer
108 explicit constexpr numerical_flowmap(
109 bool const use_caching = default_use_caching)
110 : m_v{nullptr}, m_use_caching{use_caching} {}
111 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
112 template <typename W, typename WReal, std::size_t NumDimensions,
113 typename V_ = V>
114 requires(!holds_field_pointer)
118 bool const use_caching = default_use_caching)
119 : m_v{w.as_derived()},
122 //============================================================================
123 [[nodiscard]] constexpr auto evaluate(
124 fixed_num_rows_mat<num_dimensions()> auto const& x0s, real_type const t0,
125 real_type tau) const {
126 auto xes = mat<real_type, x0s.dimension(0), x0s.dimension(1)>{x0s};
127 for (std::size_t i = 0; i < xes.dimension(1); ++i) {
128 xes.col(i) = evaluate(pos_type{xes.col(i)}, t0, tau);
129 }
130 return xes;
131 }
132 //============================================================================
133 [[nodiscard]] constexpr auto evaluate_uncached(
134 fixed_size_vec<num_dimensions()> auto const& x0, real_type const t0,
135 real_type const tau) const -> pos_type {
136 if (tau == 0) {
137 return pos_type{x0};
138 }
139 auto x1 = pos_type::fill(nan<real_type>());
140 auto const t_end = t0 + tau;
141 auto callback = [t_end, &x1](const auto& y, auto const t) {
142 if (t_end == t) {
143 x1 = y;
144 }
145 };
146 m_ode_solver.solve(vectorfield(), x0, t0, tau, callback);
147 return x1;
148 }
149 //============================================================================
150 [[nodiscard]] constexpr auto evaluate_uncached_with_arc_length(
151 fixed_size_vec<num_dimensions()> auto const& x0, real_type const t0,
152 real_type const tau) const {
153 auto arc_length = real_type{};
154 if (tau == 0) {
155 return std::pair{pos_type{x0}, arc_length};
156 }
157 auto x1 = x0;
158 auto const t_end = t0 + tau;
159 auto callback = [t_end, &x1, &arc_length](const auto& y, auto const /*t*/) {
160 arc_length += euclidean_distance(y, x1);
161 x1 = y;
162 };
163 m_ode_solver.solve(vectorfield(), x0, t0, tau, callback);
164 return std::pair{x1, arc_length};
165 }
166 //============================================================================
167 [[nodiscard]] constexpr auto evaluate(
168 fixed_size_vec<num_dimensions()> auto const& x0, real_type const t0,
169 real_type const tau) const -> pos_type {
170 if (tau == 0) {
171 return pos_type{x0};
172 }
173 auto x1 = pos_type::fill(nan<real_type>());
174 auto const t_end = t0 + tau;
175 if (!m_use_caching) {
176 auto callback = [t_end, &x1](const auto& y, auto const t) {
177 if (t_end == t) {
178 x1 = y;
179 }
180 };
181 m_ode_solver.solve(vectorfield(), x0, t0, tau, callback);
182 return x1;
183 }
184 // use caching
185 constexpr real_type security_eps = 1e-7;
186 auto const& integral_curve = cached_curve(x0, t0, tau);
187 auto t = t0 + tau;
188 if (tau < 0 &&
190 .parameterization()[integral_curve.vertices().front()]) {
191 if (t + security_eps <
193 .parameterization()[integral_curve.vertices().front()]) {
195 .parameterization()[integral_curve.vertices().front()];
196 } else {
197 throw out_of_domain_error{};
198 }
199 }
200 if (tau > 0 &&
202 .parameterization()[integral_curve.vertices().back()]) {
203 if (t - security_eps <
204 integral_curve.parameterization()[integral_curve.vertices().back()]) {
205 t = integral_curve.parameterization()[integral_curve.vertices().back()];
206 } else {
207 throw out_of_domain_error{};
208 }
209 }
210 return integral_curve.template sampler<InterpolationKernel>()(t);
211 }
212 //----------------------------------------------------------------------------
213 [[nodiscard]] constexpr auto operator()(
214 fixed_num_rows_mat<num_dimensions()> auto const& x0s, real_type const t0,
215 real_type const tau) const {
216 return evaluate(x0s, t0, tau);
217 }
218 //----------------------------------------------------------------------------
219 [[nodiscard]] constexpr auto operator()(
220 fixed_size_vec<num_dimensions()> auto const& y0, real_type const t0,
221 real_type const tau) const -> pos_type {
222 return evaluate(vec{y0}, t0, tau);
223 }
224 //----------------------------------------------------------------------------
225 auto integral_curve(pos_type const& y0, real_type const t0,
226 real_type const tau) const {
228 auto const v = c.push_back(y0);
229 c.parameterization()[v] = t0;
230 auto const full_integration = continue_integration(c, tau);
231 return std::pair{std::move(c), full_integration};
232 }
233 //----------------------------------------------------------------------------
234 auto integral_curve(pos_type const& y0, real_type const t0,
235 real_type const btau, real_type const ftau) const {
237 auto const v = c.push_back(y0);
238 c.parameterization()[v] = t0;
239
240 bool const backward_full = [this, &c, btau] {
241 if (btau < 0) {
242 return continue_integration(c, btau);
243 }
244 return true;
245 }();
246 bool const forward_full = [this, &c, ftau] {
247 if (ftau > 0) {
248 return continue_integration(c, ftau);
249 }
250 return true;
251 }();
252 return std::tuple{std::move(c), backward_full, forward_full};
253 }
254 //----------------------------------------------------------------------------
261 real_type const tau) const -> bool {
262 auto& tangents = integral_curve.tangents();
263 auto& parameterization = integral_curve.parameterization();
264 auto const& y0 = [&integral_curve, tau] {
265 if (tau > 0) {
266 return integral_curve.back_vertex();
267 }
268 return integral_curve.front_vertex();
269 }();
270 auto const& t0 = [&integral_curve, &parameterization, tau] {
271 if (tau > 0) {
272 return parameterization[integral_curve.vertices().back()];
273 }
274 return parameterization[integral_curve.vertices().front()];
275 }();
276 auto callback = [&integral_curve, &parameterization, &tangents, tau](
277 const auto& y, auto const t, const auto& dy) {
278 if (integral_curve.vertices().size() > 0 &&
279 std::abs(parameterization[integral_curve.vertices().back()] - t) <
280 1e-13) {
281 return;
282 }
283 auto const v = [&] {
284 if (tau < 0) {
285 return integral_curve.push_front(y);
286 }
287 return integral_curve.push_back(y);
288 }();
289 parameterization[v] = t;
290 tangents[v] = dy;
291 };
292
293 auto solver_copy = m_ode_solver;
294 solver_copy.solve(vectorfield(), y0, t0, tau, callback);
295 if (!integral_curve.empty()) {
296 if ((tau > 0 &&
297 parameterization[integral_curve.vertices().back()] < t0 + tau) ||
298 (tau < 0 &&
299 parameterization[integral_curve.vertices().front()] < t0 + tau)) {
300 return false;
301 }
302 }
303 return true;
304 }
305 //----------------------------------------------------------------------------
306 auto cached_curve(pos_type const& y0, real_type const t0) const
307 -> auto const& {
308 return *m_cache.emplace({t0, y0}).first->second;
309 }
310 //----------------------------------------------------------------------------
311 auto cached_curve(pos_type const& y0, real_type const t0,
312 real_type const tau) const -> auto const& {
313 return cached_curve(y0, t0, tau < 0 ? tau : 0, tau > 0 ? tau : 0);
314 }
315 //----------------------------------------------------------------------------
316 auto cached_curve(pos_type const& y0, real_type const t0, real_type btau,
317 real_type ftau) const -> auto const& {
318 auto [curve_it, new_integral_curve] = m_cache.emplace({t0, y0});
319 auto& curve = curve_it->second;
320
321 auto& [backward_on_border, forward_on_border] =
322 m_on_domain_border[{y0, t0}];
323
324 if (new_integral_curve || curve.empty()) {
325 // integral_curve not yet integrated
326 auto [fresh_curve, fullback, fullforw] =
327 integral_curve(y0, t0, btau, ftau);
328 curve = std::move(fresh_curve);
329 backward_on_border = !fullback;
330 forward_on_border = !fullforw;
331 } else {
332 if (btau > ftau) {
333 std::swap(btau, ftau);
334 }
335 if (auto const tf = curve.parameterization()[curve.vertices().front()];
336 btau < 0 && tf > t0 + btau && !backward_on_border) {
337 // continue integration in backward time
338 bool const full = continue_integration(curve, t0 + btau - tf);
339 backward_on_border = !full;
340 }
341 if (auto const tb = curve.parameterization()[curve.vertices().back()];
342 ftau > 0 && tb < t0 + ftau && !forward_on_border) {
343 // continue integration in forward time
344 bool const full = continue_integration(curve, t0 + ftau - tb);
345 forward_on_border = !full;
346 }
347 }
348 return curve;
349 }
350 //============================================================================
351 auto vectorfield() const -> auto const& {
352 if constexpr (holds_field_pointer) {
353 return *m_v;
354 } else {
355 return m_v;
356 }
357 }
358 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
359 auto vectorfield() -> auto& {
360 if constexpr (holds_field_pointer) {
361 return *m_v;
362 } else {
363 return m_v;
364 }
365 }
366 //----------------------------------------------------------------------------
367 template <typename = void>
370 m_v = w;
371 }
372 //----------------------------------------------------------------------------
373 auto ode_solver() const -> auto const& { return *m_ode_solver; }
374 auto ode_solver() -> auto& { return *m_ode_solver; }
375 //----------------------------------------------------------------------------
376 auto use_caching(bool const b = true) -> void { m_use_caching = b; }
377 auto is_using_caching() const { return m_use_caching; }
378 auto is_using_caching() -> auto& { return m_use_caching; }
379 //----------------------------------------------------------------------------
380 auto invalidate_cache() const {
381 m_cache.clear();
382 m_on_domain_border.clear();
383 }
384};
385//==============================================================================
386template <typename V, typename Real, std::size_t NumDimensions>
390//------------------------------------------------------------------------------
391template <typename V, typename Real, std::size_t NumDimensions>
394//------------------------------------------------------------------------------
395template <typename V, typename Real, std::size_t NumDimensions,
396 template <typename, std::size_t> typename ODESolver>
398 ODESolver<Real, NumDimensions> const&)
400//------------------------------------------------------------------------------
401template <typename V, typename Real, std::size_t NumDimensions,
402 template <typename, std::size_t> typename ODESolver>
404 ODESolver<Real, NumDimensions> const&)
406//==============================================================================
407template <
408 template <typename, std::size_t>
409 typename ODESolver = ode::boost::rungekuttafehlberg78,
410 template <typename> typename InterpolationKernel = interpolation::cubic,
411 typename V, typename Real, std::size_t NumDimensions>
413 tag::numerical_t /*tag*/) {
415}
416// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
417template <
418 template <typename> typename InterpolationKernel = interpolation::cubic,
419 template <typename, std::size_t> typename ODESolver,
420 typename V, typename Real, std::size_t NumDimensions>
422 ODESolver<Real, NumDimensions> const& ode_solver,
423 tag::numerical_t /*tag*/) {
425 v, ode_solver};
426}
427// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
428template <
429 template <typename, std::size_t>
430 typename ODESolver = ode::boost::rungekuttafehlberg78,
431 template <typename> typename InterpolationKernel = interpolation::cubic,
432 typename V, typename Real, std::size_t NumDimensions>
434 tag::numerical_t /*tag*/) {
436}
437// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
438template <
439 template <typename, std::size_t> typename ODESolver,
440 template <typename> typename InterpolationKernel = interpolation::cubic,
441 typename V, typename Real, std::size_t NumDimensions>
443 ODESolver<Real, NumDimensions> const& ode_solver,
444 tag::numerical_t /*tag*/) {
446 ode_solver};
447}
448// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
449template <
450 template <typename, std::size_t>
451 typename ODESolver = ode::boost::rungekuttafehlberg78,
452 template <typename> typename InterpolationKernel = interpolation::cubic,
453 typename V, typename Real, std::size_t NumDimensions>
456}
457// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
458template <
459 template <typename, std::size_t> typename ODESolver,
460 template <typename> typename InterpolationKernel = interpolation::cubic,
461 typename V, typename Real, std::size_t NumDimensions>
463 ODESolver<Real, NumDimensions> const& ode_solver) {
465 v, ode_solver};
466}
467// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
468template <
469 template <typename, std::size_t>
470 typename ODESolver = ode::boost::rungekuttafehlberg78,
471 template <typename> typename InterpolationKernel = interpolation::cubic,
472 typename V, typename Real, std::size_t NumDimensions>
474 ODESolver<Real, NumDimensions> const& ode_solver) {
476 ode_solver);
477}
478// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
479template <
480 template <typename, std::size_t>
481 typename ODESolver = ode::boost::rungekuttafehlberg78,
482 template <typename> typename InterpolationKernel = interpolation::cubic,
483 typename V, typename Real, std::size_t NumDimensions>
486}
487// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
488template <
489 template <typename, std::size_t>
490 typename ODESolver = ode::boost::rungekuttafehlberg78,
491 template <typename> typename InterpolationKernel = interpolation::cubic,
492 typename Real, std::size_t NumDimensions>
495 ODESolver, InterpolationKernel>(&v);
496}
497// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
498template <
499 template <typename, std::size_t>
500 typename ODESolver = ode::boost::rungekuttafehlberg78,
501 template <typename> typename InterpolationKernel = interpolation::cubic,
502 typename Real, std::size_t NumDimensions>
504 ODESolver<Real, NumDimensions> const& ode_solver) {
506 ODESolver, InterpolationKernel>(&v, ode_solver);
507}
508//==============================================================================
509} // namespace tatooine
510//==============================================================================
512//==============================================================================
513namespace tatooine {
514//==============================================================================
515// typedefs
516//==============================================================================
517template <arithmetic Real, std::size_t NumDimensions,
518 template <typename, std::size_t> typename ODESolver,
519 template <typename> typename InterpolationKernel>
522 InterpolationKernel>;
523//==============================================================================
524// type traits
525//==============================================================================
526template <typename T>
527struct is_numerical_flowmap_impl : std::false_type {};
528// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
529template <typename V, template <typename, std::size_t> typename ODESolver,
530 template <typename> typename InterpolationKernel>
532 numerical_flowmap<V, ODESolver, InterpolationKernel>> : std::true_type {};
533// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
534template <typename T>
535static constexpr auto is_numerical_flowmap =
537//==============================================================================
538} // namespace tatooine
539//==============================================================================
540#endif
void clear()
Definition: cache.h:145
auto emplace(const Key &key, Args &&... args)
Definition: cache.h:112
Definition: tensor_concepts.h:48
Definition: tensor_concepts.h:33
Definition: algorithm.h:6
auto flowmap(vectorfield< V, Real, NumDimensions > const &v, tag::numerical_t)
Definition: numerical_flowmap.h:412
static constexpr auto is_numerical_flowmap
Definition: numerical_flowmap.h:535
constexpr auto euclidean_distance(base_tensor< Tensor0, T0, N > const &lhs, base_tensor< Tensor1, T1, N > const &rhs)
Definition: distance.h:19
Definition: field.h:134
auto as_derived() -> auto &
Definition: field.h:161
Definition: interpolation.h:216
Definition: numerical_flowmap.h:527
auto push_back(arithmetic auto const ... components)
Definition: line.h:176
auto parameterization() -> auto &
Definition: line.h:502
Definition: mat.h:14
Definition: numerical_flowmap.h:17
auto integral_curve(pos_type const &y0, real_type const t0, real_type const tau) const
Definition: numerical_flowmap.h:225
std::remove_pointer_t< std::decay_t< V > > raw_field_type
Definition: numerical_flowmap.h:19
static constexpr auto holds_field_pointer
Definition: numerical_flowmap.h:32
auto integral_curve(pos_type const &y0, real_type const t0, real_type const btau, real_type const ftau) const
Definition: numerical_flowmap.h:234
constexpr numerical_flowmap(bool const use_caching=default_use_caching)
Definition: numerical_flowmap.h:108
bool m_use_caching
Definition: numerical_flowmap.h:42
constexpr auto operator()(fixed_num_rows_mat< num_dimensions()> auto const &x0s, real_type const t0, real_type const tau) const
Definition: numerical_flowmap.h:213
constexpr auto evaluate_uncached_with_arc_length(fixed_size_vec< num_dimensions()> auto const &x0, real_type const t0, real_type const tau) const
Definition: numerical_flowmap.h:150
auto vectorfield() -> auto &
Definition: numerical_flowmap.h:359
auto cached_curve(pos_type const &y0, real_type const t0) const -> auto const &
Definition: numerical_flowmap.h:306
auto operator=(numerical_flowmap const &other) -> numerical_flowmap &
Definition: numerical_flowmap.h:57
auto cached_curve(pos_type const &y0, real_type const t0, real_type btau, real_type ftau) const -> auto const &
Definition: numerical_flowmap.h:316
constexpr numerical_flowmap(vectorfield< W, WReal, NumDimensions > const &w, ode_solver_type const &ode_solver, bool const use_caching=default_use_caching)
Definition: numerical_flowmap.h:115
constexpr numerical_flowmap(vectorfield< W, WReal, NumDimensions > const &w, bool const use_caching=default_use_caching)
Definition: numerical_flowmap.h:79
constexpr numerical_flowmap(polymorphic::vectorfield< WReal, NumDimensions > const *w, bool const use_caching=default_use_caching)
Definition: numerical_flowmap.h:94
numerical_flowmap(numerical_flowmap const &other)
Definition: numerical_flowmap.h:47
V m_v
Definition: numerical_flowmap.h:38
constexpr numerical_flowmap(vectorfield< W, WReal, NumDimensions > const *w, bool const use_caching=default_use_caching)
Definition: numerical_flowmap.h:87
typename raw_field_type::real_type real_type
Definition: numerical_flowmap.h:20
constexpr auto evaluate(fixed_num_rows_mat< num_dimensions()> auto const &x0s, real_type const t0, real_type tau) const
Definition: numerical_flowmap.h:123
vec< real_type, num_dimensions()> vec_type
Definition: numerical_flowmap.h:24
numerical_flowmap(numerical_flowmap &&other) noexcept
Definition: numerical_flowmap.h:52
auto ode_solver() const -> auto const &
Definition: numerical_flowmap.h:373
constexpr numerical_flowmap(polymorphic::vectorfield< WReal, NumDimensions > *w, bool const use_caching=default_use_caching)
Definition: numerical_flowmap.h:101
auto cached_curve(pos_type const &y0, real_type const t0, real_type const tau) const -> auto const &
Definition: numerical_flowmap.h:311
constexpr auto operator()(fixed_size_vec< num_dimensions()> auto const &y0, real_type const t0, real_type const tau) const -> pos_type
Definition: numerical_flowmap.h:219
auto operator=(numerical_flowmap &&other) noexcept -> numerical_flowmap &
Definition: numerical_flowmap.h:67
domain_border_flags_type m_on_domain_border
Definition: numerical_flowmap.h:41
auto is_using_caching() -> auto &
Definition: numerical_flowmap.h:378
auto continue_integration(integral_curve_type &integral_curve, real_type const tau) const -> bool
Definition: numerical_flowmap.h:260
auto use_caching(bool const b=true) -> void
Definition: numerical_flowmap.h:376
ode_solver_type m_ode_solver
Definition: numerical_flowmap.h:39
static constexpr auto num_dimensions() -> std::size_t
Definition: numerical_flowmap.h:21
cache_type m_cache
Definition: numerical_flowmap.h:40
constexpr auto evaluate(fixed_size_vec< num_dimensions()> auto const &x0, real_type const t0, real_type const tau) const -> pos_type
Definition: numerical_flowmap.h:167
auto invalidate_cache() const
Definition: numerical_flowmap.h:380
auto vectorfield() const -> auto const &
Definition: numerical_flowmap.h:351
std::map< std::pair< pos_type, real_type >, std::pair< bool, bool > > domain_border_flags_type
Definition: numerical_flowmap.h:31
auto set_vectorfield(polymorphic::vectorfield< real_type, num_dimensions()> *w)
Definition: numerical_flowmap.h:368
auto ode_solver() -> auto &
Definition: numerical_flowmap.h:374
constexpr auto evaluate_uncached(fixed_size_vec< num_dimensions()> auto const &x0, real_type const t0, real_type const tau) const -> pos_type
Definition: numerical_flowmap.h:133
static constexpr auto default_use_caching
Definition: numerical_flowmap.h:33
auto is_using_caching() const
Definition: numerical_flowmap.h:377
Definition: rungekuttafehlberg78.h:28
Definition: exceptions.h:8
Definition: field.h:13
Definition: tags.h:96
Definition: tags.h:92