Tatooine
autonomous_particle_flowmap_discretization.h
Go to the documentation of this file.
1#ifndef TATOOINE_AUTONOMOUS_PARTICLE_FLOWMAP_DISCRETIZATION_H
2#define TATOOINE_AUTONOMOUS_PARTICLE_FLOWMAP_DISCRETIZATION_H
3//==============================================================================
7
8#include <boost/range/adaptor/transformed.hpp>
9#include <boost/range/algorithm/copy.hpp>
10//==============================================================================
11namespace tatooine {
12//==============================================================================
13template <floating_point Real, std::size_t NumDimensions,
14 typename SplitBehavior = typename autonomous_particle<
15 Real, NumDimensions>::split_behaviors::three_splits>
17 using this_type =
19 SplitBehavior>;
20 using real_type = Real;
25 using particle_list_type = std::vector<particle_type>;
26
28 // tatooine::unstructured_triangular_grid<Real, NumDimensions>;
31 typename pointset_type::template typed_vertex_property_type<pos_type>;
33 typename pointset_type::template typed_vertex_property_type<
35
36 using cgal_kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
37 using cgal_triangulation_type = std::conditional_t<
38 NumDimensions == 2,
40 std::conditional_t<
41 NumDimensions == 3,
45 3, cgal_kernel>>,
46 void>>;
47 using cgal_triangulation_ptr_type = std::unique_ptr<cgal_triangulation_type>;
48 using cgal_point = typename cgal_triangulation_type::Point;
49
50 static constexpr auto num_dimensions() { return NumDimensions; }
51 //----------------------------------------------------------------------------
52private:
53 //----------------------------------------------------------------------------
58
63 //----------------------------------------------------------------------------
64public:
65 //----------------------------------------------------------------------------
66 auto pointset(forward_or_backward_tag auto const direction) -> auto & {
67 if constexpr (is_forward<decltype(direction)>) {
68 return m_pointset_forward;
69 } else {
71 }
72 }
73 //----------------------------------------------------------------------------
74 auto pointset(forward_or_backward_tag auto const direction) const
75 -> auto const & {
76 if constexpr (is_forward<decltype(direction)>) {
77 return m_pointset_forward;
78 } else {
80 }
81 }
82 //----------------------------------------------------------------------------
83 auto flowmaps(forward_or_backward_tag auto const direction) -> auto & {
84 if constexpr (is_forward<decltype(direction)>) {
85 return *m_flowmaps_forward;
86 } else {
87 return *m_flowmaps_backward;
88 }
89 }
90 //----------------------------------------------------------------------------
91 auto flowmaps(forward_or_backward_tag auto const direction) const
92 -> auto const & {
93 if constexpr (is_forward<decltype(direction)>) {
94 return *m_flowmaps_forward;
95 } else {
96 return *m_flowmaps_backward;
97 }
98 }
99 //----------------------------------------------------------------------------
101 -> auto & {
102 if constexpr (is_forward<decltype(direction)>) {
104 } else {
106 }
107 }
108 //----------------------------------------------------------------------------
109 auto flowmap_gradients(forward_or_backward_tag auto const direction) const
110 -> auto const & {
111 if constexpr (is_forward<decltype(direction)>) {
113 } else {
115 }
116 }
117 //----------------------------------------------------------------------------
118 auto triangulation(forward_or_backward_tag auto const direction) -> auto & {
119 if constexpr (is_forward<decltype(direction)>) {
121 } else {
123 }
124 }
125 //----------------------------------------------------------------------------
126 auto triangulation(forward_or_backward_tag auto const direction) const
127 -> auto const & {
128 if constexpr (is_forward<decltype(direction)>) {
130 } else {
132 }
133 }
134 //============================================================================
135private:
138 .template vertex_property<pos_type>(
139 "flowmaps")},
140 // m_flowmap_gradients_forward{
141 // &m_pointset_forward.template vertex_property<gradient_type>(
142 // "flowmap_gradients")},
143
145 &m_pointset_backward.template vertex_property<pos_type>("flowmaps")}
146
147 //,m_flowmap_gradients_backward{
148 // &m_pointset_backward.template vertex_property<gradient_type>(
149 // "flowmap_gradients")}
150 {}
151 //============================================================================
152public:
153 static auto
154 from_advected(std::vector<particle_type> const &advected_particles)
155 -> this_type {
156 return from_advected(advected_particles,
157 std::make_index_sequence<num_dimensions()>{});
158 }
159 //============================================================================
160private:
161 template <std::size_t... Is>
162 static auto
163 from_advected(std::vector<particle_type> const &advected_particles,
164 std::index_sequence<Is...> /*seq*/) -> this_type {
165 auto disc = this_type{};
166 using namespace std::ranges;
167 using cgal_point_list = std::vector<std::pair<cgal_point, vertex_handle>>;
168 auto points_forward = cgal_point_list{};
169 auto points_backward = cgal_point_list{};
170 points_forward.reserve(size(advected_particles));
171 points_backward.reserve(size(advected_particles));
172 for (auto const &p : advected_particles) {
173 {
174 // forward
175 auto v = disc.m_pointset_forward.insert_vertex(p.x0());
176 disc.flowmaps(forward)[v] = p.x();
177 // disc.flowmap_gradients(forward)[v] = p.nabla_phi();
178 points_forward.emplace_back(
179 cgal_point{disc.m_pointset_forward[v](Is)...}, v);
180 }
181 {
182 // backward
183 auto v = disc.m_pointset_backward.insert_vertex(p.x());
184 disc.flowmaps(backward)[v] = p.x0();
185 // disc.flowmap_gradients(backward)[v] = *inv(p.nabla_phi());
186 points_backward.emplace_back(
187 cgal_point{disc.m_pointset_backward[v](Is)...}, v);
188 }
189 }
190
191 disc.m_triangulation_forward = std::make_unique<cgal_triangulation_type>(
192 begin(points_forward), end(points_forward));
193 if constexpr (NumDimensions == 2) {
194 for (auto it = disc.m_triangulation_forward->finite_faces_begin();
195 it != disc.m_triangulation_forward->finite_faces_end(); ++it) {
196 disc.m_pointset_forward.insert_simplex(
197 vertex_handle{it->vertex(0)->info()},
198 vertex_handle{it->vertex(1)->info()},
199 vertex_handle{it->vertex(2)->info()});
200 }
201 disc.m_triangulation_backward = make_unique<cgal_triangulation_type>(
202 begin(points_backward), end(points_backward));
203 for (auto it = disc.m_triangulation_backward->finite_faces_begin();
204 it != disc.m_triangulation_backward->finite_faces_end(); ++it) {
205 disc.m_pointset_backward.insert_simplex(
206 vertex_handle{it->vertex(0)->info()},
207 vertex_handle{it->vertex(1)->info()},
208 vertex_handle{it->vertex(2)->info()});
209 }
210 } else if constexpr (NumDimensions == 3) {
211 for (auto it = disc.m_triangulation_forward->finite_cells_begin();
212 it != disc.m_triangulation_forward->finite_cells_end(); ++it) {
213 disc.m_pointset_forward.insert_simplex(
214 vertex_handle{it->vertex(0)->info()},
215 vertex_handle{it->vertex(1)->info()},
216 vertex_handle{it->vertex(2)->info()},
217 vertex_handle{it->vertex(3)->info()});
218 }
219 disc.m_triangulation_backward = std::make_unique<cgal_triangulation_type>(
220 begin(points_backward), end(points_backward));
221 for (auto it = disc.m_triangulation_backward->finite_cells_begin();
222 it != disc.m_triangulation_backward->finite_cells_end(); ++it) {
223 disc.m_pointset_backward.insert_simplex(
224 vertex_handle{it->vertex(0)->info()},
225 vertex_handle{it->vertex(1)->info()},
226 vertex_handle{it->vertex(2)->info()},
227 vertex_handle{it->vertex(3)->info()});
228 }
229 }
230 return disc;
231 }
232 //============================================================================
233public:
236 read(p);
237 }
238 //----------------------------------------------------------------------------
242 .template vertex_property<pos_type>(
243 "flowmaps")},
244 // m_flowmap_gradients_forward{
245 // &m_pointset_forward.template vertex_property<gradient_type>(
246 // "flowmap_gradients")},
247
249 &m_pointset_backward.template vertex_property<pos_type>("flowmaps")}
250
251 //, m_flowmap_gradients_backward{
252 // &m_pointset_backward.template vertex_property<gradient_type>(
253 // "flowmap_gradients")}
254 {
255 copy(other);
256 }
257 //----------------------------------------------------------------------------
260 : m_pointset_forward{std::move(other.m_pointset_forward)},
261 m_flowmaps_forward{std::exchange(other.m_flowmaps_forward, nullptr)},
263 std::exchange(other.m_flowmap_gradients_forward, nullptr)},
265 m_flowmaps_backward{std::exchange(other.m_flowmaps_backward, nullptr)},
267 std::exchange(other.m_flowmap_gradients_backward, nullptr)},
270 //----------------------------------------------------------------------------
273 // m_flowmaps_forward =
274 // &m_pointset_forward.template vertex_property<pos_type>("flowmaps");
275 // m_flowmap_gradients_forward =
276 // &m_pointset_forward.template vertex_property<gradient_type>(
277 // "flowmap_gradients");
278 // m_flowmaps_backward =
279 // &m_pointset_backward.template vertex_property<pos_type>("flowmaps");
280 // m_flowmap_gradients_backward =
281 // &m_pointset_backward.template vertex_property<gradient_type>(
282 // "flowmap_gradients");
283 copy(other);
284 return *this;
285 }
286 //----------------------------------------------------------------------------
289 m_flowmaps_forward = std::exchange(other.m_flowmaps_forward, nullptr);
291 std::exchange(other.m_flowmap_gradients_forward, nullptr);
292 m_flowmaps_backward = std::exchange(other.m_flowmaps_backward, nullptr);
294 std::exchange(other.m_flowmap_gradients_backward, nullptr);
295 m_triangulation_forward = std::move(other.m_triangulation_forward);
296 m_triangulation_backward = std::move(other.m_triangulation_backward);
297 return *this;
298 }
299 //----------------------------------------------------------------------------
300 template <typename Flowmap>
302 Flowmap &&flowmap, arithmetic auto const t_end,
303 arithmetic auto const tau_step,
304 particle_list_type const &initial_particles,
305 std::atomic_uint64_t &uuid_generator)
307 .template vertex_property<pos_type>(
308 "flowmaps")},
309 // m_flowmap_gradients_forward{
310 // &m_pointset_forward.template vertex_property<gradient_type>(
311 // "flowmap_gradients")},
312
314 &m_pointset_backward.template vertex_property<pos_type>("flowmaps")}
315 //, m_flowmap_gradients_backward{
316 // &m_pointset_backward.template vertex_property<gradient_type>(
317 // "flowmap_gradients")}
318 {
319 static_assert(
320 std::decay_t<Flowmap>::num_dimensions() == NumDimensions,
321 "Number of dimensions of flowmap does not match number of dimensions.");
322 fill(std::forward<Flowmap>(flowmap), initial_particles, t_end, tau_step,
323 uuid_generator);
324 }
325 //----------------------------------------------------------------------------
326 template <typename Flowmap>
328 Flowmap &&flowmap, arithmetic auto const t0, arithmetic auto const tau,
329 arithmetic auto const tau_step,
331 std::uint8_t const max_split_depth =
334 .template vertex_property<pos_type>(
335 "flowmaps")},
336 // m_flowmap_gradients_forward{
337 // &m_pointset_forward.template vertex_property<gradient_type>(
338 // "flowmap_gradients")},
339
341 &m_pointset_backward.template vertex_property<pos_type>("flowmaps")}
342 //, m_flowmap_gradients_backward{
343 // &m_pointset_backward.template vertex_property<gradient_type>(
344 // "flowmap_gradients")}
345 {
346 static_assert(
347 std::decay_t<Flowmap>::num_dimensions() == NumDimensions,
348 "Number of dimensions of flowmap does not match number of dimensions.");
349
350 auto uuid_generator = std::atomic_uint64_t{};
351 fill(std::forward<Flowmap>(flowmap),
353 uuid_generator),
354 t0 + tau, tau_step, uuid_generator);
355 }
356 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
357 template <typename Flowmap>
359 Flowmap &&flowmap, arithmetic auto const t_end,
360 arithmetic auto const tau_step, particle_type const &initial_particle,
361 std::atomic_uint64_t &uuid_generator)
363 .template vertex_property<pos_type>(
364 "flowmaps")},
365 // m_flowmap_gradients_forward{
366 // &m_pointset_forward.template vertex_property<gradient_type>(
367 // "flowmap_gradients")},
368
370 &m_pointset_backward.template vertex_property<pos_type>("flowmaps")}
371 //, m_flowmap_gradients_backward{
372 // &m_pointset_backward.template vertex_property<gradient_type>(
373 // "flowmap_gradients")}
374 {
375 static_assert(
376 std::decay_t<Flowmap>::num_dimensions() == NumDimensions,
377 "Number of dimensions of flowmap does not match number of dimensions.");
378 fill(std::forward<Flowmap>(flowmap), std::vector{initial_particle}, t_end,
379 tau_step, uuid_generator);
380 }
382
383private:
385 copy(other, std::make_index_sequence<NumDimensions>{});
386 }
387 //----------------------------------------------------------------------------
388 template <std::size_t... Seq>
390 std::index_sequence<Seq...> /*seq*/) {
394 &m_pointset_forward.template vertex_property<pos_type>("flowmaps");
396 &m_pointset_backward.template vertex_property<pos_type>("flowmaps");
397
398 using cgal_point_list = std::vector<std::pair<cgal_point, vertex_handle>>;
399 {
400 auto points_forward = cgal_point_list{};
401 points_forward.reserve(size(m_pointset_forward.num_vertices()));
402 for (auto const v : m_pointset_forward.vertices()) {
403 points_forward.emplace_back(cgal_point{m_pointset_forward[v](Seq)...},
404 v);
405 }
406 m_triangulation_forward = std::make_unique<cgal_triangulation_type>(
407 begin(points_forward), end(points_forward));
408 }
409
410 {
411 auto points_backward = cgal_point_list{};
412 points_backward.reserve(size(m_pointset_backward.num_vertices()));
413 for (auto const v : m_pointset_backward.vertices()) {
414 points_backward.emplace_back(cgal_point{m_pointset_backward[v](Seq)...},
415 v);
416 }
417 m_triangulation_backward = std::make_unique<cgal_triangulation_type>(
418 begin(points_backward), end(points_backward));
419 }
420 }
421
422public:
423 //============================================================================
424 auto num_particles() const -> std::size_t {
425 return m_pointset_forward.vertices().size();
426 }
427 //----------------------------------------------------------------------------
428 auto write(filesystem::path const &p) const {
429 auto const filename = p.filename().replace_extension("");
430 auto forward_path = p;
431 auto backward_path = p;
432 forward_path.replace_filename(filename.string() + "_forward.vtp");
433 backward_path.replace_filename(filename.string() + "_backward.vtp");
434
435 m_pointset_forward.write_vtp(forward_path);
436 m_pointset_backward.write_vtp(backward_path);
437 }
438 //----------------------------------------------------------------------------
439 auto read(filesystem::path const &p) {
440 read(p, std::make_index_sequence<NumDimensions>{});
441 }
442 //----------------------------------------------------------------------------
443 template <std::size_t... Seq>
444 auto read(filesystem::path const &p, std::index_sequence<Seq...> /*seq*/) {
445 using cgal_point_list = std::vector<std::pair<cgal_point, vertex_handle>>;
446 auto const filename = p.filename().replace_extension("");
447 {
448 auto forward_path = filename;
449 forward_path.replace_filename(filename.string() + "_forward.vtp");
450 m_pointset_forward.read_vtp(forward_path);
452 &m_pointset_forward.template vertex_property<pos_type>("flowmaps");
453 auto points_forward = cgal_point_list{};
454 points_forward.reserve(m_pointset_forward.num_vertices());
455 for (auto const v : m_pointset_forward.vertices()) {
456 points_forward.emplace_back(cgal_point{m_pointset_forward[v](Seq)...},
457 v);
458 }
459 m_triangulation_forward = std::make_unique<cgal_triangulation_type>(
460 begin(points_forward), end(points_forward));
461 }
462
463 {
464 auto backward_path = filename;
465 backward_path.replace_filename(filename.string() + "_backward.vtp");
466 m_pointset_backward.read_vtp(backward_path);
468 &m_pointset_backward.template vertex_property<pos_type>("flowmaps");
469 auto points_backward = cgal_point_list{};
470 points_backward.reserve(m_pointset_backward.num_vertices());
471 for (auto const v : m_pointset_backward.vertices()) {
472 points_backward.emplace_back(cgal_point{m_pointset_backward[v](Seq)...},
473 v);
474 }
475 m_triangulation_backward = std::make_unique<cgal_triangulation_type>(
476 begin(points_backward), end(points_backward));
477 }
478 }
479 //----------------------------------------------------------------------------
480private:
481 //----------------------------------------------------------------------------
482 template <typename Flowmap>
483 auto fill(Flowmap &&flowmap, range auto const &initial_particles,
484 arithmetic auto const t_end, arithmetic auto const tau_step,
485 std::atomic_uint64_t &uuid_generator) {
486 fill(std::forward<Flowmap>(flowmap), initial_particles, t_end, tau_step,
487 uuid_generator, std::make_index_sequence<NumDimensions>{});
488 }
489 //----------------------------------------------------------------------------
490 template <typename Flowmap, std::size_t... Is>
491 auto fill(Flowmap &&flowmap, range auto const &initial_particles,
492 arithmetic auto const t_end, arithmetic auto const tau_step,
493 std::atomic_uint64_t &uuid_generator,
494 std::index_sequence<Is...> /*seq*/) {
495 auto [advected_particles, simple_particles, edges] =
496 particle_type::template advect<SplitBehavior>(
497 std::forward<Flowmap>(flowmap), tau_step, t_end, initial_particles,
498 uuid_generator);
499 //write_vtp(initial_particles, "initial_particles.vtp");
500 //write_vtp(advected_particles, "advected_particles.vtp");
501 auto advected_t0 =
502 std::vector<geometry::hyper_ellipse<real_type, NumDimensions>>{};
503 std::ranges::copy(advected_particles |
504 std::views::transform([](auto const &p) {
505 return p.initial_ellipse();
506 }),
507 std::back_inserter(advected_t0));
508 //write_vtp(advected_t0, "advected_t0_particles.vtp");
509 auto points_forward = std::vector<std::pair<cgal_point, vertex_handle>>{};
510 points_forward.reserve(size(advected_particles));
511 auto points_backward = std::vector<std::pair<cgal_point, vertex_handle>>{};
512 points_backward.reserve(size(advected_particles));
513 for (auto const &p : advected_particles) {
514 {
515 // forward
516 auto v = m_pointset_forward.insert_vertex(p.x0());
517 flowmaps(forward)[v] = p.x();
518 // flowmap_gradients(forward)[v] = p.nabla_phi();
519 points_forward.emplace_back(cgal_point{m_pointset_forward[v](Is)...},
520 v);
521 }
522 {
523 // backward
524 auto v = m_pointset_backward.insert_vertex(p.x());
525 flowmaps(backward)[v] = p.x0();
526 // flowmap_gradients(backward)[v] = *inv(p.nabla_phi());
527 points_backward.emplace_back(cgal_point{m_pointset_backward[v](Is)...},
528 v);
529 }
530 }
531
532 m_triangulation_forward = std::make_unique<cgal_triangulation_type>(
533 begin(points_forward), end(points_forward));
534 m_triangulation_backward = std::make_unique<cgal_triangulation_type>(
535 begin(points_backward), end(points_backward));
536 }
537 //----------------------------------------------------------------------------
538public:
539 [[nodiscard]] auto
540 sample(pos_type const &q,
541 forward_or_backward_tag auto const direction) const {
542 return sample(q, direction, std::make_index_sequence<NumDimensions>{});
543 }
544 //----------------------------------------------------------------------------
545 template <std::size_t... Is>
546 [[nodiscard]] auto sample(pos_type const &q,
547 forward_or_backward_tag auto const direction,
548 std::index_sequence<Is...> /*seq*/) const {
549 // coordinates computation
550 auto const [result, nnc_per_vertex] = cgal::natural_neighbor_coordinates<
551 NumDimensions, typename cgal_triangulation_type::Geom_traits,
552 typename cgal_triangulation_type::Triangulation_data_structure>(
553 triangulation(direction), cgal_point{q(Is)...});
554 auto const success = result.third;
555 if (!success) {
556 return pos_type::fill(nan<real_type>());
557 }
558 auto const norm = 1 / result.second;
559
560 auto const Z0 = [&] {
561 auto sum = pos_type{};
562 for (auto const &[cgal_handle, coeff] : nnc_per_vertex) {
563 auto const v = cgal_handle->info();
564 auto const lambda_i = coeff * norm;
565 sum += lambda_i * flowmaps(direction)[v];
566 }
567 return sum;
568 }();
569 return Z0;
570
571 // auto xi = [&] {
572 // auto numerator = pos_type{};
573 // auto denominator = real_type{};
574 // for (auto const &[cgal_handle, coeff] : nnc_per_vertex) {
575 // auto const v = cgal_handle->info();
576 // auto const lambda_i = coeff * norm;
577 // auto const &p_i = pointset(direction)[v];
578 // auto const &g_i = flowmap_gradients(direction)[v];
579 // auto const xi_i = [&] {
580 // if constexpr (tensor_rank<pos_type> == 0) {
581 // return flowmaps(direction)[v] + dot(g_i, q - p_i);
582 // } else {
583 // return flowmaps(direction)[v] + transposed(g_i) * (q - p_i);
584 // }
585 // }();
586 // auto const w = lambda_i / euclidean_distance(q, p_i);
587 // numerator += w * xi_i;
588 // denominator += w;
589 // }
590 // return numerator / denominator;
591 // }();
592 //
593 // auto alpha = [&] {
594 // auto numerator = pos_type{};
595 // auto denominator = real_type{};
596 // for (auto const &[cgal_handle, coeff] : nnc_per_vertex) {
597 // auto const v = cgal_handle->info();
598 // auto const lambda_i = coeff * norm;
599 // auto const &p_i = pointset(direction)[v];
600 // auto const w = lambda_i / squared_euclidean_distance(q, p_i);
601 // numerator += lambda_i;
602 // denominator += w;
603 // }
604 // return numerator / denominator;
605 // }();
606 //
607 // auto beta = [&] {
608 // auto sum = real_type{};
609 // for (auto const &[cgal_handle, coeff] : nnc_per_vertex) {
610 // auto const v = cgal_handle->info();
611 // auto const lambda_i = coeff * norm;
612 // auto const &p_i = pointset(direction)[v];
613 // sum += lambda_i * squared_euclidean_distance(q, p_i);
614 // }
615 // return sum;
616 // }();
617 // return (alpha * Z0 + beta * xi) / (alpha + beta);
618 }
619 //----------------------------------------------------------------------------
620 auto operator()(pos_type const &q,
621 forward_or_backward_tag auto direction) const {
622 return sample(q, direction);
623 }
624};
625//==============================================================================
626template <std::size_t NumDimensions,
627 typename SplitBehavior = typename autonomous_particle<
628 real_number, NumDimensions>::split_behaviors::three_splits>
631// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
632// -
633template <typename SplitBehavior = typename autonomous_particle<
634 real_number, 2>::split_behaviors::three_splits>
637// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
638// -
639template <typename SplitBehavior = typename autonomous_particle<
640 real_number, 3>::split_behaviors::three_splits>
643//==============================================================================
644} // namespace tatooine
645//==============================================================================
646
647//==============================================================================
648// Staggered Discretization
650namespace tatooine {
651//==============================================================================
652template <typename Real, std::size_t NumDimensions,
653 typename SplitBehavior = typename autonomous_particle<
654 real_number, NumDimensions>::split_behaviors::three_splits>
657 Real, NumDimensions, SplitBehavior>>;
658// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
659// -
660template <std::size_t NumDimensions,
661 typename SplitBehavior = typename autonomous_particle<
662 real_number, NumDimensions>::split_behaviors::three_splits>
665 real_number, NumDimensions, SplitBehavior>;
666// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
667// -
668template <typename SplitBehavior = typename autonomous_particle<
669 real_number, 2>::split_behaviors::three_splits>
672// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
673// -
674template <typename SplitBehavior = typename autonomous_particle<
675 real_number, 3>::split_behaviors::three_splits>
678//==============================================================================
679} // namespace tatooine
680//==============================================================================
681#endif
Definition: concepts.h:33
Definition: tags.h:44
Definition: concepts.h:84
delaunay_triangulation< NumDimensions, Traits, triangulation_data_structure< NumDimensions, Traits, triangulation_vertex_base_with_info< NumDimensions, Info, Traits >, SimplexBase > > delaunay_triangulation_with_info
Definition: delaunay_triangulation.h:50
CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3< Traits, SimplexBase > delaunay_triangulation_simplex_base_with_circumcenter
Definition: triangulation_simplex_base.h:44
auto natural_neighbor_coordinates(delaunay_triangulation< NumDimensions, Traits, TriangulationDataStructure > const &triangulation, typename delaunay_triangulation< NumDimensions, Traits, TriangulationDataStructure >::Point const &query)
Definition: natural_neighbor_coordinates.h:19
Definition: algorithm.h:6
auto flowmap(vectorfield< V, Real, NumDimensions > const &v, tag::numerical_t)
Definition: numerical_flowmap.h:412
auto begin(Range &&range)
Definition: iterator_facade.h:318
auto end(Range &&range)
Definition: iterator_facade.h:322
constexpr auto norm(base_tensor< Tensor, T, N > const &t, unsigned p=2) -> T
Definition: norm.h:23
detail::rectilinear_grid::creator_t< linspace< Real >, N > uniform_rectilinear_grid
Definition: rectilinear_grid.h:1904
auto size(vec< ValueType, N > const &v)
Definition: vec.h:148
constexpr auto sum(base_tensor< Tensor, T, VecDim > const &v)
sum of all components of a vector
Definition: tensor_operations.h:110
static constexpr backward_tag backward
Definition: tags.h:11
static constexpr forward_tag forward
Definition: tags.h:9
Definition: autonomous_particle_flowmap_discretization.h:16
autonomous_particle_flowmap_discretization(Flowmap &&flowmap, arithmetic auto const t0, arithmetic auto const tau, arithmetic auto const tau_step, uniform_rectilinear_grid< real_type, NumDimensions > const &g, std::uint8_t const max_split_depth=particle_type::default_max_split_depth)
Definition: autonomous_particle_flowmap_discretization.h:327
auto flowmaps(forward_or_backward_tag auto const direction) -> auto &
Definition: autonomous_particle_flowmap_discretization.h:83
auto fill(Flowmap &&flowmap, range auto const &initial_particles, arithmetic auto const t_end, arithmetic auto const tau_step, std::atomic_uint64_t &uuid_generator)
Definition: autonomous_particle_flowmap_discretization.h:483
auto triangulation(forward_or_backward_tag auto const direction) const -> auto const &
Definition: autonomous_particle_flowmap_discretization.h:126
autonomous_particle_flowmap_discretization(filesystem::path const &p)
Definition: autonomous_particle_flowmap_discretization.h:234
cgal_triangulation_ptr_type m_triangulation_backward
Definition: autonomous_particle_flowmap_discretization.h:62
typename pointset_type::template typed_vertex_property_type< pos_type > flowmap_vertex_property_type
Definition: autonomous_particle_flowmap_discretization.h:31
std::unique_ptr< cgal_triangulation_type > cgal_triangulation_ptr_type
Definition: autonomous_particle_flowmap_discretization.h:47
typename pointset_type::template typed_vertex_property_type< gradient_type > flowmap_gradient_vertex_property_type
Definition: autonomous_particle_flowmap_discretization.h:34
typename cgal_triangulation_type::Point cgal_point
Definition: autonomous_particle_flowmap_discretization.h:48
vec< real_type, NumDimensions > vec_type
Definition: autonomous_particle_flowmap_discretization.h:21
auto read(filesystem::path const &p, std::index_sequence< Seq... >)
Definition: autonomous_particle_flowmap_discretization.h:444
static auto from_advected(std::vector< particle_type > const &advected_particles) -> this_type
Definition: autonomous_particle_flowmap_discretization.h:154
flowmap_vertex_property_type * m_flowmaps_forward
Definition: autonomous_particle_flowmap_discretization.h:55
flowmap_gradient_vertex_property_type * m_flowmap_gradients_backward
Definition: autonomous_particle_flowmap_discretization.h:61
auto num_particles() const -> std::size_t
Definition: autonomous_particle_flowmap_discretization.h:424
CGAL::Exact_predicates_inexact_constructions_kernel cgal_kernel
Definition: autonomous_particle_flowmap_discretization.h:36
autonomous_particle_flowmap_discretization(autonomous_particle_flowmap_discretization &&other)
Definition: autonomous_particle_flowmap_discretization.h:258
static auto from_advected(std::vector< particle_type > const &advected_particles, std::index_sequence< Is... >) -> this_type
Definition: autonomous_particle_flowmap_discretization.h:163
flowmap_gradient_vertex_property_type * m_flowmap_gradients_forward
Definition: autonomous_particle_flowmap_discretization.h:56
std::vector< particle_type > particle_list_type
Definition: autonomous_particle_flowmap_discretization.h:25
auto copy(autonomous_particle_flowmap_discretization const &other, std::index_sequence< Seq... >)
Definition: autonomous_particle_flowmap_discretization.h:389
auto copy(autonomous_particle_flowmap_discretization const &other)
Definition: autonomous_particle_flowmap_discretization.h:384
pointset_type m_pointset_backward
Definition: autonomous_particle_flowmap_discretization.h:59
auto operator=(autonomous_particle_flowmap_discretization &&other) -> autonomous_particle_flowmap_discretization &
Definition: autonomous_particle_flowmap_discretization.h:287
~autonomous_particle_flowmap_discretization()
Definition: autonomous_particle_flowmap_discretization.h:381
auto write(filesystem::path const &p) const
Definition: autonomous_particle_flowmap_discretization.h:428
auto sample(pos_type const &q, forward_or_backward_tag auto const direction) const
Definition: autonomous_particle_flowmap_discretization.h:540
auto operator=(autonomous_particle_flowmap_discretization const &other) -> autonomous_particle_flowmap_discretization &
Definition: autonomous_particle_flowmap_discretization.h:271
auto flowmap_gradients(forward_or_backward_tag auto const direction) const -> auto const &
Definition: autonomous_particle_flowmap_discretization.h:109
cgal_triangulation_ptr_type m_triangulation_forward
Definition: autonomous_particle_flowmap_discretization.h:57
auto sample(pos_type const &q, forward_or_backward_tag auto const direction, std::index_sequence< Is... >) const
Definition: autonomous_particle_flowmap_discretization.h:546
Real real_type
Definition: autonomous_particle_flowmap_discretization.h:20
autonomous_particle_flowmap_discretization(Flowmap &&flowmap, arithmetic auto const t_end, arithmetic auto const tau_step, particle_list_type const &initial_particles, std::atomic_uint64_t &uuid_generator)
Definition: autonomous_particle_flowmap_discretization.h:301
auto pointset(forward_or_backward_tag auto const direction) -> auto &
Definition: autonomous_particle_flowmap_discretization.h:66
typename pointset_type::vertex_handle vertex_handle
Definition: autonomous_particle_flowmap_discretization.h:29
autonomous_particle_flowmap_discretization(Flowmap &&flowmap, arithmetic auto const t_end, arithmetic auto const tau_step, particle_type const &initial_particle, std::atomic_uint64_t &uuid_generator)
Definition: autonomous_particle_flowmap_discretization.h:358
auto flowmap_gradients(forward_or_backward_tag auto const direction) -> auto &
Definition: autonomous_particle_flowmap_discretization.h:100
static constexpr auto num_dimensions()
Definition: autonomous_particle_flowmap_discretization.h:50
std::conditional_t< NumDimensions==2, cgal::delaunay_triangulation_with_info< 2, vertex_handle, cgal_kernel >, std::conditional_t< NumDimensions==3, cgal::delaunay_triangulation_with_info< 3, vertex_handle, cgal_kernel, cgal::delaunay_triangulation_simplex_base_with_circumcenter< 3, cgal_kernel > >, void > > cgal_triangulation_type
Definition: autonomous_particle_flowmap_discretization.h:46
autonomous_particle_flowmap_discretization(autonomous_particle_flowmap_discretization const &other)
Definition: autonomous_particle_flowmap_discretization.h:239
auto triangulation(forward_or_backward_tag auto const direction) -> auto &
Definition: autonomous_particle_flowmap_discretization.h:118
auto flowmaps(forward_or_backward_tag auto const direction) const -> auto const &
Definition: autonomous_particle_flowmap_discretization.h:91
auto pointset(forward_or_backward_tag auto const direction) const -> auto const &
Definition: autonomous_particle_flowmap_discretization.h:74
pointset_type m_pointset_forward
Definition: autonomous_particle_flowmap_discretization.h:54
autonomous_particle_flowmap_discretization()
Definition: autonomous_particle_flowmap_discretization.h:136
auto operator()(pos_type const &q, forward_or_backward_tag auto direction) const
Definition: autonomous_particle_flowmap_discretization.h:620
auto fill(Flowmap &&flowmap, range auto const &initial_particles, arithmetic auto const t_end, arithmetic auto const tau_step, std::atomic_uint64_t &uuid_generator, std::index_sequence< Is... >)
Definition: autonomous_particle_flowmap_discretization.h:491
auto read(filesystem::path const &p)
Definition: autonomous_particle_flowmap_discretization.h:439
flowmap_vertex_property_type * m_flowmaps_backward
Definition: autonomous_particle_flowmap_discretization.h:60
Definition: autonomous_particle.h:30
static auto particles_from_grid_filling_gaps(real_type const t0, uniform_rectilinear_grid< Real, NumDimensions > const &g, std::atomic_uint64_t &uuid_generator)
Definition: autonomous_particle.h:581
static constexpr auto default_max_split_depth
Definition: autonomous_particle.h:62
Definition: pointset.h:83
Definition: pointset.h:69
auto write_vtp(filesystem::path const &path) const
Definition: pointset.h:720
auto num_vertices() const
Definition: pointset.h:229
auto insert_vertex(arithmetic auto const ... ts)
Definition: pointset.h:243
auto vertices() const
Definition: pointset.h:226
auto read_vtp(filesystem::path const &path) -> void requires(NumDimensions==2)||(NumDimensions==3)
Definition: pointset.h:957
Definition: staggered_flowmap_discretization.h:9
Definition: tags.h:96
Definition: vec.h:12