1#ifndef TATOOINE_AUTONOMOUS_PARTICLE_FLOWMAP_DISCRETIZATION_H
2#define TATOOINE_AUTONOMOUS_PARTICLE_FLOWMAP_DISCRETIZATION_H
8#include <boost/range/adaptor/transformed.hpp>
9#include <boost/range/algorithm/copy.hpp>
13template <floating_point Real, std::size_t NumDimensions,
14 typename SplitBehavior =
typename autonomous_particle<
15 Real, NumDimensions>::split_behaviors::three_splits>
31 typename pointset_type::template typed_vertex_property_type<pos_type>;
33 typename pointset_type::template typed_vertex_property_type<
36 using cgal_kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
48 using cgal_point =
typename cgal_triangulation_type::Point;
67 if constexpr (
is_forward<
decltype(direction)>) {
76 if constexpr (
is_forward<
decltype(direction)>) {
84 if constexpr (
is_forward<
decltype(direction)>) {
93 if constexpr (
is_forward<
decltype(direction)>) {
102 if constexpr (
is_forward<
decltype(direction)>) {
111 if constexpr (
is_forward<
decltype(direction)>) {
119 if constexpr (
is_forward<
decltype(direction)>) {
128 if constexpr (
is_forward<
decltype(direction)>) {
138 .template vertex_property<
pos_type>(
161 template <std::size_t... Is>
164 std::index_sequence<Is...> ) ->
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) {
176 disc.flowmaps(
forward)[v] = p.x();
178 points_forward.emplace_back(
179 cgal_point{disc.m_pointset_forward[v](Is)...}, v);
183 auto v = disc.m_pointset_backward.insert_vertex(p.x());
184 disc.flowmaps(
backward)[v] = p.x0();
186 points_backward.emplace_back(
187 cgal_point{disc.m_pointset_backward[v](Is)...}, v);
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(
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(
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(
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(
242 .template vertex_property<
pos_type>(
291 std::exchange(other.m_flowmap_gradients_forward,
nullptr);
294 std::exchange(other.m_flowmap_gradients_backward,
nullptr);
300 template <
typename Flowmap>
305 std::atomic_uint64_t &uuid_generator)
307 .template vertex_property<
pos_type>(
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,
326 template <
typename Flowmap>
331 std::uint8_t
const max_split_depth =
334 .template vertex_property<
pos_type>(
347 std::decay_t<Flowmap>::num_dimensions() == NumDimensions,
348 "Number of dimensions of flowmap does not match number of dimensions.");
350 auto uuid_generator = std::atomic_uint64_t{};
354 t0 + tau, tau_step, uuid_generator);
357 template <
typename Flowmap>
361 std::atomic_uint64_t &uuid_generator)
363 .template vertex_property<
pos_type>(
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);
385 copy(other, std::make_index_sequence<NumDimensions>{});
388 template <std::size_t... Seq>
390 std::index_sequence<Seq...> ) {
398 using cgal_point_list = std::vector<std::pair<cgal_point, vertex_handle>>;
400 auto points_forward = cgal_point_list{};
407 begin(points_forward),
end(points_forward));
411 auto points_backward = cgal_point_list{};
418 begin(points_backward),
end(points_backward));
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");
439 auto read(filesystem::path
const &p) {
440 read(p, std::make_index_sequence<NumDimensions>{});
443 template <std::size_t... Seq>
444 auto read(filesystem::path
const &p, std::index_sequence<Seq...> ) {
445 using cgal_point_list = std::vector<std::pair<cgal_point, vertex_handle>>;
446 auto const filename = p.filename().replace_extension(
"");
448 auto forward_path = filename;
449 forward_path.replace_filename(filename.string() +
"_forward.vtp");
453 auto points_forward = cgal_point_list{};
460 begin(points_forward),
end(points_forward));
464 auto backward_path = filename;
465 backward_path.replace_filename(filename.string() +
"_backward.vtp");
469 auto points_backward = cgal_point_list{};
476 begin(points_backward),
end(points_backward));
482 template <
typename Flowmap>
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>{});
490 template <
typename Flowmap, std::size_t... Is>
493 std::atomic_uint64_t &uuid_generator,
494 std::index_sequence<Is...> ) {
495 auto [advected_particles, simple_particles, edges] =
496 particle_type::template advect<SplitBehavior>(
497 std::forward<Flowmap>(
flowmap), tau_step, t_end, initial_particles,
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();
507 std::back_inserter(advected_t0));
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) {
533 begin(points_forward),
end(points_forward));
535 begin(points_backward),
end(points_backward));
542 return sample(q, direction, std::make_index_sequence<NumDimensions>{});
545 template <std::size_t... Is>
548 std::index_sequence<Is...> )
const {
551 NumDimensions,
typename cgal_triangulation_type::Geom_traits,
552 typename cgal_triangulation_type::Triangulation_data_structure>(
554 auto const success = result.third;
558 auto const norm = 1 / result.second;
560 auto const Z0 = [&] {
562 for (
auto const &[cgal_handle, coeff] : nnc_per_vertex) {
563 auto const v = cgal_handle->info();
564 auto const lambda_i = coeff *
norm;
622 return sample(q, direction);
626template <std::size_t NumDimensions,
627 typename SplitBehavior =
typename autonomous_particle<
628 real_number, NumDimensions>::split_behaviors::three_splits>
634 real_number, 2>::split_behaviors::three_splits>
640 real_number, 3>::split_behaviors::three_splits>
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>>;
660template <std::size_t NumDimensions,
662 real_number, NumDimensions>::split_behaviors::three_splits>
665 real_number, NumDimensions, SplitBehavior>;
669 real_number, 2>::split_behaviors::three_splits>
675 real_number, 3>::split_behaviors::three_splits>
Definition: concepts.h:33
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