1#ifndef TATOOINE_UNSTRUCTURED_SIMPLICIAL_GRID_H
2#define TATOOINE_UNSTRUCTURED_SIMPLICIAL_GRID_H
4#if TATOOINE_CDT_AVAILABLE
7#if TATOOINE_CGAL_AVAILABLE
11#include <tatooine/available_libraries.h>
24#include <boost/range/adaptor/transformed.hpp>
25#include <boost/range/algorithm/copy.hpp>
31template <floating_point Real, std::size_t NumDimensions,
32 std::size_t SimplexDim>
33struct simplex_container;
35template <floating_point Real, std::size_t NumDimensions,
36 std::size_t SimplexDim,
typename T>
37struct vertex_property_sampler;
39template <
typename Mesh, floating_point Real, std::size_t NumDimensions,
40 std::size_t SimplexDim>
47template <floating_point Real, std::size_t NumDimensions,
48 std::size_t SimplexDim = NumDimensions>
51 unstructured_simplicial_grid<Real, NumDimensions, SimplexDim>, Real,
52 NumDimensions, SimplexDim> {
58 NumDimensions, SimplexDim>;
62 Real, NumDimensions, SimplexDim, T>;
64 this_type, Real, NumDimensions, SimplexDim>;
69 using parent_type::operator[];
93 Real, NumDimensions, SimplexDim>;
95 Real, NumDimensions, SimplexDim>;
100 std::map<std::string, std::unique_ptr<vector_property<simplex_handle>>>;
138 for (
auto const& [key, prop] : other.simplex_properties()) {
163 template <
typename... TypesToCheck>
164 auto copy_prop(
auto const& other_grid, std::string
const& name,
165 auto const& other_prop) {
167 if (other_prop->type() ==
typeid(TypesToCheck)) {
168 auto& this_prop = this->
template vertex_property<TypesToCheck>(name);
169 auto const& other_typed_prop =
170 other_grid.template vertex_property<TypesToCheck>(name);
172 other_grid.vertices().iterate_indices([&](
auto const... is) {
173 this_prop[vi++] = other_typed_prop.at(is...);
181 template <
floating_po
int_range DimX,
floating_po
int_range DimY>
182 requires(NumDimensions == 2) && (SimplexDim == 2)
184 auto const s0 = g.size(0);
185 auto const s1 = g.size(1);
187 [&](
auto const i,
auto const j) {
insert_vertex(g.vertex_at(i, j)); });
189 for (
auto const& [name, prop] : g.vertex_properties()) {
192 std::int16_t, std::uint16_t, std::int32_t, std::uint32_t,
193 std::int64_t, std::uint64_t>(g, name, prop);
196 constexpr auto turned = [](std::size_t
const ix,
197 std::size_t
const iy) ->
bool {
198 bool const xodd = ix % 2 == 0;
199 bool const yodd = iy % 2 == 0;
208 [&](
auto const ix,
auto const iy) {
213 if (turned(ix, iy)) {
226 requires(NumDimensions == 3) && (SimplexDim == 3)
229 constexpr auto turned = [](std::size_t
const ix, std::size_t
const iy,
230 std::size_t
const iz) ->
bool {
231 bool const xodd = ix % 2 == 0;
232 bool const yodd = iy % 2 == 0;
233 bool const zodd = iz % 2 == 0;
245 auto const gv = g.vertices();
249 auto const s0 = g.size(0);
250 auto const s1 = g.size(1);
251 auto const s0s1 = s0 * s1;
252 auto it = [&](
auto const ix,
auto const iy,
auto const iz) {
253 auto const le_bo_fr =
vertex_handle{ix + iy * s0 + iz * s0s1};
254 auto const ri_bo_fr =
vertex_handle{(ix + 1) + iy * s0 + iz * s0s1};
255 auto const le_to_fr =
vertex_handle{ix + (iy + 1) * s0 + iz * s0s1};
256 auto const ri_to_fr =
vertex_handle{(ix + 1) + (iy + 1) * s0 + iz * s0s1};
257 auto const le_bo_ba =
vertex_handle{ix + iy * s0 + (iz + 1) * s0s1};
258 auto const ri_bo_ba =
vertex_handle{(ix + 1) + iy * s0 + (iz + 1) * s0s1};
259 auto const le_to_ba =
vertex_handle{ix + (iy + 1) * s0 + (iz + 1) * s0s1};
260 auto const ri_to_ba =
262 if (turned(ix, iy, iz)) {
287 for (
auto const& [name, prop] : g.vertex_properties()) {
290 std::int16_t, std::uint16_t, std::int32_t, std::uint32_t,
291 std::int64_t, std::uint64_t>(g, name, prop);
308 template <std::size_t... Seq>
313 template <std::size_t... Seq>
320 template <std::size_t... Seq>
322 std::index_sequence<Seq...> )
const
326 template <std::size_t... Seq>
327 auto simplex_at(std::size_t
const i, std::index_sequence<Seq...> )
334 requires(
sizeof...(comps) == NumDimensions)
366 using namespace std::ranges;
368 auto simplex_contains_vertex = [
this, vh](
auto const ch) {
373 simplex_contains_vertex);
381 Real
const eps = Real{}) {
382 auto m = std::mutex{};
384#pragma omp parallel for
385 for (
auto v1 =
next(v0); v1 !=
vertices().cend(); ++v1) {
396 auto l = std::lock_guard{m};
404 Real
const eps = Real{}) {
407 for (
auto v1 =
next(v0); v1 !=
vertices().cend(); ++v1) {
426 template <
typename... Handles>
428 requires(is_same<Handles, vertex_handle> && ...)
431 "wrong number of vertices for simplex");
440 template <std::size_t... Seq>
442 std::index_sequence<Seq...> )
const {
445 b(NumDimensions) = 1;
449 for (std::size_t i = 0; i < NumDimensions; ++i) {
450 A(i, v.index()) = v(i);
452 }(std::get<Seq>(
at(s))),
460 requires(NumDimensions == SimplexDim)
462 if constexpr (NumDimensions == 2) {
463 auto const [v0, v1, v2] =
at(s);
464 auto const p0 =
at(v0) - q;
465 auto const p1 =
at(v1) - q;
466 auto const p2 =
at(v2) - q;
467 return vec{p1.
x() * p2.y() - p2.x() * p1.y(),
468 p2.x() * p0.y() - p0.x() * p2.y(),
469 p0.x() * p1.y() - p1.x() * p0.y()} /
470 ((p1.x() - p0.x()) * p2.y() + (p0.x() - p2.x()) * p1.y() +
471 (p2.x() - p1.x()) * p0.y());
474 s, q, std::make_index_sequence<NumDimensions + 1>{});
481 auto inc = [](
auto i) {
return ++i; };
484 auto i =
begin(offsets) + v.index();
485 std::ranges::transform(i,
end(offsets), i, inc);
488 i -= offsets[i.index()];
496 auto correction = std::size_t{};
503 prop->erase(c.index());
521 auto indices = std::vector<vertex_handle>{};
526 if (*invalid_it == i) {
535 auto constexpr inc = [](
auto i) {
return ++i; };
538 auto i =
begin(offsets) + v.index();
539 std::ranges::transform(i,
end(offsets), i, inc);
541 for (
auto& i : indices) {
542 i -= offsets[i.index()];
549 template <std::size_t... Is>
551 std::index_sequence<Is...> )
const {
552 auto simplices_vertices =
at(ch);
553 return ((std::get<Is>(simplices_vertices) == vh) || ...);
562#if TATOOINE_CGAL_AVAILABLE
564 requires(NumDimensions == 2) || (NumDimensions == 3)
570 template <std::size_t... Seq>
572 requires(NumDimensions == 2) || (NumDimensions == 3)
575 using kernel_type = CGAL::Exact_predicates_inexact_constructions_kernel;
576 using triangulation_type =
579 using point_type =
typename triangulation_type::Point;
580 auto points = std::vector<std::pair<point_type, vertex_handle>>{};
583 points.emplace_back(point_type{
at(v)(Seq)...}, v);
586 auto triangulation = triangulation_type{
begin(points),
end(points)};
587 if constexpr (NumDimensions == 2) {
588 for (
auto it = triangulation.finite_faces_begin();
589 it != triangulation.finite_faces_end(); ++it) {
593 }
else if constexpr (NumDimensions == 3) {
594 for (
auto it = triangulation.finite_cells_begin();
595 it != triangulation.finite_cells_end(); ++it) {
604 requires(NumDimensions == 2) || (NumDimensions == 3)
607 std::make_index_sequence<NumDimensions>{});
611 template <std::size_t... Seq>
613 std::index_sequence<Seq...> ) ->
void
614 requires(NumDimensions == 2) || (NumDimensions == 3)
617 using kernel_type = CGAL::Exact_predicates_inexact_constructions_kernel;
618 using triangulation_type =
621 using point_type =
typename triangulation_type::Point;
622 auto points = std::vector<std::pair<point_type, vertex_handle>>{};
625 points.emplace_back(point_type{
at(v)(Seq)...}, v);
628 auto triangulation = triangulation_type{
begin(points),
end(points)};
629 if constexpr (NumDimensions == 2) {
630 for (
auto it = triangulation.finite_faces_begin();
631 it != triangulation.finite_faces_end(); ++it) {
635 }
else if constexpr (NumDimensions == 3) {
636 for (
auto it = triangulation.finite_cells_begin();
637 it != triangulation.finite_cells_end(); ++it) {
645#if TATOOINE_CDT_AVAILABLE
648 std::vector<std::pair<vertex_handle, vertex_handle>>
const& constraints)
650 requires(NumDimensions == 2) || (NumDimensions == 3)
656 template <std::size_t... Seq>
657 requires(NumDimensions == 2)
659 std::vector<std::pair<vertex_handle, vertex_handle>>
const& constraints,
660 std::index_sequence<Seq...> ) ->
void {
662 std::vector<CDT::Edge> edges;
663 edges.reserve(
size(constraints));
664 boost::transform(constraints, std::back_inserter(edges),
665 [](
auto const& c) -> CDT::Edge {
666 return {c.first.index(), c.second.index()};
669 CDT::Triangulation<Real>{CDT::FindingClosestPoint::BoostRTree};
671 triangulation.insertVertices(
673 [
this](
auto const& v) {
return this->
vertex_at(v)(0); },
674 [
this](
auto const& v) {
return this->
vertex_at(v)(1); });
675 auto const duplicates_info = CDT::RemoveDuplicatesAndRemapEdges<Real>(
676 triangulation.vertices, edges,
677 [
this](
auto const& v) { return v.pos.x; },
678 [
this](
auto const& v) { return v.pos.y; });
680 triangulation.insertEdges(edges);
681 triangulation.eraseSuperTriangle();
683 for (
auto const& tri : triangulation.triangles) {
692 template <
typename T>
696 return insert_simplex_property<T>(name);
698 if (
typeid(T) != it->second->type()) {
699 throw std::runtime_error{
700 "type of property \"" + name +
"\"(" +
701 boost::core::demangle(it->second->type().name()) +
702 ") does not match specified type " + type_name<T>() +
"."};
708 template <
typename T>
712 throw std::runtime_error{
"property \"" + name +
"\" not found"};
714 if (
typeid(T) != it->second->type()) {
715 throw std::runtime_error{
716 "type of property \"" + name +
"\"(" +
717 boost::core::demangle(it->second->type().name()) +
718 ") does not match specified type " + type_name<T>() +
"."};
725 return simplex_property<tatooine::real_number>(name);
729 return simplex_property<tatooine::real_number>(name);
733 return simplex_property<vec2>(name);
737 return simplex_property<vec2>(name);
741 return simplex_property<vec3>(name);
745 return simplex_property<vec3>(name);
749 return simplex_property<vec4>(name);
753 return simplex_property<vec4>(name);
757 return simplex_property<mat2>(name);
761 return simplex_property<mat2>(name);
765 return simplex_property<mat3>(name);
769 return simplex_property<mat3>(name);
773 return simplex_property<mat4>(name);
777 return simplex_property<mat4>(name);
780 template <
typename T>
784 std::pair{name, std::make_unique<simplex_property_type<T>>(value)});
785 auto prop =
dynamic_cast<simplex_property_type<T>*
>(it->second.get());
790 auto write(filesystem::path
const& path)
const {
791 auto const ext = path.extension();
793 if constexpr ((NumDimensions == 2 || NumDimensions == 3) &&
798 throw std::runtime_error{
799 ".vtk is not supported with this simplicial grid."};
801 }
else if (ext ==
".vtp") {
802 if constexpr ((NumDimensions == 2 || NumDimensions == 3) &&
803 (SimplexDim == 1 || SimplexDim == 2)) {
807 throw std::runtime_error{
808 ".vtp is not supported with this simplicial grid."};
810 }
else if (ext ==
".vtu") {
811 if constexpr ((NumDimensions == 2 || NumDimensions == 3) &&
812 (SimplexDim == 2 || SimplexDim == 3)) {
816 throw std::runtime_error{
817 ".vtu is not supported with this simplicial grid."};
820 throw std::runtime_error(
821 "Could not write unstructured_simplicial_grid. Unknown file extension: "
823 ext.string() +
"\".");
827 std::string
const& title =
"tatooine grid")
const {
828 if constexpr (SimplexDim == 2) {
835 requires((NumDimensions == 2 || NumDimensions == 3) &&
836 (SimplexDim == 1 || SimplexDim == 2))
838 if constexpr (SimplexDim == 1) {
840 }
else if constexpr (SimplexDim == 2) {
846 requires((NumDimensions == 2 || NumDimensions == 3) &&
847 (SimplexDim == 2 || SimplexDim == 3))
849 if constexpr (SimplexDim == 2) {
851 }
else if constexpr (SimplexDim == 3) {
857 integral ConnectivityInt = std::int64_t,
860 requires((NumDimensions == 2 || NumDimensions == 3) && SimplexDim == 1)
863 this_type, HeaderType, ConnectivityInt, OffsetInt>{*
this}
868 integral ConnectivityInt = std::int64_t,
871 requires((NumDimensions == 2 || NumDimensions == 3) && SimplexDim == 2)
874 this_type, HeaderType, ConnectivityInt, OffsetInt>{*
this}
879 integral ConnectivityInt = std::int64_t,
883 requires((NumDimensions == 2 || NumDimensions == 3) && SimplexDim == 2)
886 this_type, HeaderType, ConnectivityInt, OffsetInt, CellTypesInt>{*
this}
891 integral ConnectivityInt = std::int64_t,
895 requires((NumDimensions == 2 || NumDimensions == 3) && SimplexDim == 3)
898 this_type, HeaderType, ConnectivityInt, OffsetInt, CellTypesInt>{*
this}
903 std::string
const& title)
const
905 requires(SimplexDim == 2)
907 using namespace std::ranges;
910 if (writer.is_open()) {
911 writer.set_title(title);
912 writer.write_header();
913 if constexpr (NumDimensions == 2) {
917 auto v3s = std::vector<vec<Real, 3>>(
vertices().size());
918 auto three_dimensional = views::transform(three_dims);
920 writer.write_points(v3s);
922 }
else if constexpr (NumDimensions == 3) {
926 auto vertices_per_simplex = std::vector<std::vector<std::size_t>>{};
927 vertices_per_simplex.reserve(
simplices().size());
928 auto cell_types = std::vector<vtk::cell_type>(
simplices().
size(),
931 auto const [v0, v1, v2] =
at(c);
932 vertices_per_simplex.push_back(
933 std::vector{v0.index(), v1.index(), v2.index()});
935 writer.write_cells(vertices_per_simplex);
936 writer.write_cell_types(cell_types);
942 auto const& casted_prop =
945 writer.write_scalars(name, casted_prop.internal_container());
947 auto const& casted_prop =
950 writer.write_scalars(name, casted_prop.internal_container());
952 auto const& casted_prop =
955 writer.write_scalars(name, casted_prop.internal_container());
956 }
else if (prop->type() ==
typeid(Real)) {
957 auto const& casted_prop =
960 writer.write_scalars(name, casted_prop.internal_container());
971 std::filesystem::path
const& path, std::string
const& title)
const ->
bool
972 requires(SimplexDim == 2)
975 using boost::adaptors::transformed;
982 auto vertices_per_simplex = std::vector<std::vector<std::size_t>>{};
984 auto cell_types = std::vector<vtk::cell_type>(
simplices().
size(),
987 auto const [v0, v1, v2, v3] =
at(t);
988 vertices_per_simplex.push_back(
989 std::vector{v0.index(), v1.index(), v2.index(), v3.index()});
1000 auto const& casted_prop =
1003 writer.
write_scalars(name, casted_prop.internal_container());
1004 }
else if (prop->type() ==
typeid(Real)) {
1005 auto const& casted_prop =
1008 writer.
write_scalars(name, casted_prop.internal_container());
1019 auto read(std::filesystem::path
const& path) {
1020 auto ext = path.extension();
1021 if constexpr (NumDimensions == 2 || NumDimensions == 3) {
1022 if (ext ==
".vtk") {
1029 requires(NumDimensions == 2 || NumDimensions == 3)
1033 std::vector<int> simplices;
1037 auto add_simplices(std::vector<int>
const& simplices) ->
void {
1039 while (i <
size(simplices)) {
1040 auto const num_vertices = simplices[i++];
1041 if (num_vertices != num_vertices_per_simplex()) {
1042 throw std::runtime_error{
1043 "Number of vertices in file does not match number of vertices "
1046 for (std::size_t j = 0; j < static_cast<std::size_t>(num_vertices);
1050 for (
auto& [key, prop] :
grid.simplex_properties()) {
1055 void on_cells(std::vector<int>
const& simplices)
override {
1056 add_simplices(simplices);
1059 if (t != vtk::dataset_type::unstructured_grid &&
1060 t != vtk::dataset_type::polydata) {
1061 throw std::runtime_error{
1062 "[unstructured_simplicial_grid] need polydata or "
1063 "unstructured_grid "
1064 "when reading vtk legacy"};
1068 void on_points(std::vector<std::array<float, 3>>
const& ps)
override {
1069 for (
const auto& p : ps) {
1070 if constexpr (NumDimensions == 2) {
1071 grid.insert_vertex(
static_cast<Real
>(p[0]),
1072 static_cast<Real
>(p[1]));
1074 if constexpr (NumDimensions == 3) {
1075 grid.insert_vertex(
static_cast<Real
>(p[0]),
static_cast<Real
>(p[1]),
1076 static_cast<Real
>(p[2]));
1080 void on_points(std::vector<std::array<double, 3>>
const& ps)
override {
1081 for (
const auto& p : ps) {
1082 if constexpr (NumDimensions == 2) {
1083 grid.insert_vertex(
static_cast<Real
>(p[0]),
1084 static_cast<Real
>(p[1]));
1086 if constexpr (NumDimensions == 3) {
1087 grid.insert_vertex(
static_cast<Real
>(p[0]),
static_cast<Real
>(p[1]),
1088 static_cast<Real
>(p[2]));
1092 void on_polygons(std::vector<int>
const& ps)
override {
1095 void on_scalars(std::string
const& data_name,
1096 std::string
const& ,
1097 std::size_t num_comps, std::vector<double>
const& scalars,
1099 if (data == vtk::reader_data::point_data) {
1100 if (num_comps == 1) {
1102 grid.template insert_vertex_property<double>(data_name);
1105 prop[v] = scalars[v.index()];
1107 }
else if (num_comps == 2) {
1109 grid.template insert_vertex_property<vec<double, 2>>(data_name);
1113 for (std::size_t j = 0; j < num_comps; ++j) {
1114 prop[v][j] = scalars[v.index() * num_comps + j];
1117 }
else if (num_comps == 3) {
1119 grid.template insert_vertex_property<vec<double, 3>>(data_name);
1122 for (std::size_t j = 0; j < num_comps; ++j) {
1123 prop[v][j] = scalars[v.index() * num_comps + j];
1126 }
else if (num_comps == 4) {
1128 grid.template insert_vertex_property<vec<double, 4>>(data_name);
1131 for (std::size_t j = 0; j < num_comps; ++j) {
1132 prop[v][j] = scalars[v.index() * num_comps + j];
1136 }
else if (data == vtk::reader_data::cell_data) {
1137 if (num_comps == 1) {
1139 grid.template insert_simplex_property<double>(data_name);
1142 prop[c] = scalars[c.index()];
1144 }
else if (num_comps == 2) {
1145 auto& prop =
grid.template insert_simplex_property<vec<double, 2>>(
1150 for (std::size_t j = 0; j < num_comps; ++j) {
1151 prop[c][j] = scalars[c.index() * num_comps + j];
1154 }
else if (num_comps == 3) {
1155 auto& prop =
grid.template insert_simplex_property<vec<double, 3>>(
1159 for (std::size_t j = 0; j < num_comps; ++j) {
1160 prop[c][j] = scalars[c.index() * num_comps + j];
1163 }
else if (num_comps == 4) {
1164 auto& prop =
grid.template insert_simplex_property<vec<double, 4>>(
1168 for (std::size_t j = 0; j < num_comps; ++j) {
1169 prop[c][j] = scalars[c.index() * num_comps + j];
1189 if constexpr (is_uniform_tree_hierarchy<hierarchy_type>()) {
1194 h.insert_simplex(c);
1204 m_hierarchy = std::make_unique<hierarchy_type>(bb.min(), bb.max(), *
this);
1209 template <
typename T>
1217 template <
typename T>
1219 return sampler<T>(this->
template vertex_property<T>(name));
1222 template <
typename F>
1231 template <
typename F>
1246 template <invocable<vertex_handle> F>
1250 using T = std::invoke_result_t<F, vertex_handle>;
1251 auto& prop = this->
template vertex_property<T>(name);
1255 }
catch (std::exception&) {
1256 if constexpr (tensor_num_components<T> == 1) {
1257 prop[v] = T{0.0 / 0.0};
1259 prop[v] = T::fill(0.0 / 0.0);
1266 template <invocable<pos_type> F>
1270 using T = std::invoke_result_t<F, pos_type>;
1271 auto& prop = this->
template vertex_property<T>(name);
1275 }
catch (std::exception&) {
1276 if constexpr (tensor_num_components<T> == 1) {
1277 prop[v] = T{0.0 / 0.0};
1279 prop[v] = T::fill(0.0 / 0.0);
1298template <
typename... Dims>
1352 std::size_t
const NumDimensions) ->
bool {
1353 if (NumDimensions == 2) {
1354 return cdt_available();
void clear()
Definition: cache.h:145
auto & operator=(const cache &other)
Definition: cache.h:48
auto is_valid() const -> bool
Definition: grid_edge.h:207
Definition: grid_edge.h:16
void remove(vertex v)
Definition: mesh.h:252
void tidy_up()
tidies up invalid vertices, edges and faces
Definition: mesh.h:338
Definition: rectilinear_grid.h:38
Definition: vtk_legacy.h:448
auto write_point_data(std::size_t i) -> void
auto set_title(std::string const &title) -> void
Definition: vtk_legacy.h:632
auto write_scalars(std::string const &name, std::vector< Data > const &data, std::string const &lookup_table_name="default") -> void
Definition: vtk_legacy.h:760
auto write_points(std::vector< std::array< Real, 2 > > const &points) -> void
Definition: vtk_legacy.h:637
auto write_cell_types(std::vector< cell_type > const &cell_types) -> void
auto write_cells(std::vector< std::vector< std::size_t > > const &cells) -> void
auto write_header() -> void
Definition: vtk_legacy.h:184
auto add_listener(legacy_file_listener &listener) -> void
Definition: concepts.h:33
Definition: concepts.h:94
Definition: concepts.h:21
Definition: invocable_with_n_types.h:37
Definition: concepts.h:121
Definition: concepts.h:27
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
Definition: edge_vtp_writer.h:12
static constexpr sequential_t sequential
Definition: tags.h:63
static constexpr parallel_t parallel
Definition: tags.h:60
reader_data
Definition: vtk_legacy.h:42
dataset_type
Definition: vtk_legacy.h:44
Definition: algorithm.h:6
VecF< 3 > vec3f
Definition: vec_typedefs.h:40
auto begin(Range &&range)
Definition: iterator_facade.h:318
static constexpr auto constrained_delaunay_available(std::size_t const NumDimensions) -> bool
Definition: unstructured_simplicial_grid.h:1351
mat44f mat4f
Definition: mat_typedefs.h:299
auto end(Range &&range)
Definition: iterator_facade.h:322
VecD< 3 > vec3d
Definition: vec_typedefs.h:51
mat22d mat2d
Definition: mat_typedefs.h:370
mat33d mat3d
Definition: mat_typedefs.h:371
auto for_loop_unpacked(Iteration &&iteration, execution_policy_tag auto policy, std::array< Int, N > const &sizes)
Definition: for_loop.h:480
mat33f mat3f
Definition: mat_typedefs.h:298
auto solve(polynomial< Real, 1 > const &p) -> std::vector< Real >
solve a + b*x
Definition: polynomial.h:187
VecD< 2 > vec2d
Definition: vec_typedefs.h:50
VecF< 4 > vec4f
Definition: vec_typedefs.h:41
VecD< 4 > vec4d
Definition: vec_typedefs.h:52
auto size(vec< ValueType, N > const &v)
Definition: vec.h:148
auto next(Iter iter)
Definition: iterator_facade.h:325
constexpr auto squared_euclidean_distance(base_tensor< Tensor0, T0, N > const &lhs, base_tensor< Tensor1, T1, N > const &rhs)
Definition: distance.h:11
constexpr auto for_loop(Iteration &&iteration, execution_policy::sequential_t, Ranges(&&... ranges)[2]) -> void
Use this function for creating a sequential nested loop.
Definition: for_loop.h:336
mat22f mat2f
Definition: mat_typedefs.h:297
mat44d mat4d
Definition: mat_typedefs.h:372
VecF< 2 > vec2f
Definition: vec_typedefs.h:39
Definition: axis_aligned_bounding_box.h:103
vec_type pos_type
Definition: axis_aligned_bounding_box.h:109
Definition: vertex_handle.h:10
Definition: edge_vtp_writer.h:18
detail::unstructured_simplicial_grid::simplex_at_return_type< vertex_handle const &, SimplexDim+1 > const_simplex_at_return_type
Definition: parent.h:19
detail::unstructured_simplicial_grid::simplex_at_return_type< vertex_handle &, SimplexDim+1 > simplex_at_return_type
Definition: parent.h:22
hierarchy< Mesh, Real, NumDimensions, SimplexDim > hierarchy_type
Definition: parent.h:16
Definition: simplex_container.h:10
Definition: tetrahedral_vtu_writer.h:20
Definition: triangular_vtp_writer.h:18
Definition: triangular_vtu_writer.h:20
Definition: vertex_property_sampler.h:12
constexpr handle()
Definition: handle.h:24
auto num_dimensions() const -> std::size_t
Definition: hdf5.h:764
auto vertex_properties() const -> auto const &
Definition: line.h:450
static auto constexpr ones()
Definition: mat.h:38
Definition: pointset.h:83
auto insert_vertex(arithmetic auto const ... ts)
Definition: pointset.h:243
auto vertex_position_data() const -> auto const &
Definition: pointset.h:235
static constexpr auto num_dimensions() -> std::size_t
Definition: pointset.h:72
auto invalid_vertices() const -> auto const &
Definition: pointset.h:239
auto vertices() const
Definition: pointset.h:226
auto vertex_at(vertex_handle const v) -> auto &
Definition: pointset.h:205
auto vertex_properties() const -> auto const &
Definition: pointset.h:191
type_list_at< this_type, I > at
Definition: type_list.h:269
Definition: property.h:66
Definition: unstructured_simplicial_grid.h:87
Definition: unstructured_simplicial_grid.h:52
auto read_vtk(std::filesystem::path const &path)
Definition: unstructured_simplicial_grid.h:1028
auto simplices() const
Definition: unstructured_simplicial_grid.h:515
auto scalar_simplex_property(std::string const &name) const -> auto const &
Definition: unstructured_simplicial_grid.h:724
auto write_vtp_edges(filesystem::path const &path) const
Definition: unstructured_simplicial_grid.h:859
auto simplex_at(std::size_t const i)
Definition: unstructured_simplicial_grid.h:314
auto at(simplex_handle t) -> auto
Definition: unstructured_simplicial_grid.h:301
auto build_delaunay_mesh(std::vector< std::pair< vertex_handle, vertex_handle > > const &constraints) -> void requires(NumDimensions==2)||(NumDimensions==3)
Definition: unstructured_simplicial_grid.h:647
auto simplex_at(std::size_t const i, std::index_sequence< Seq... >) -> simplex_at_return_type
Definition: unstructured_simplicial_grid.h:327
auto write_vtu(filesystem::path const &path) const
Definition: unstructured_simplicial_grid.h:845
auto remove_duplicate_vertices(execution_policy::parallel_t, Real const eps=Real{})
Definition: unstructured_simplicial_grid.h:380
auto write_vtp(filesystem::path const &path) const
Definition: unstructured_simplicial_grid.h:834
static constexpr auto simplex_dimension()
Definition: unstructured_simplicial_grid.h:85
auto clean_simplex_index_list() const
Definition: unstructured_simplicial_grid.h:517
unstructured_simplicial_grid< Real, NumDimensions, SimplexDim > this_type
Definition: unstructured_simplicial_grid.h:54
auto simplex_properties() const -> auto const &
Definition: unstructured_simplicial_grid.h:116
auto write_vtu_triangular(filesystem::path const &path) const
Definition: unstructured_simplicial_grid.h:882
auto simplex_at(simplex_handle t) const -> auto
Definition: unstructured_simplicial_grid.h:303
auto vertex_property_sampler(std::string const &name) const
Definition: unstructured_simplicial_grid.h:1218
auto vec4_simplex_property(std::string const &name) const -> auto const &
Definition: unstructured_simplicial_grid.h:748
unstructured_simplicial_grid(std::filesystem::path const &path)
Definition: unstructured_simplicial_grid.h:147
auto sample_to_vertex_property_pos(F &&f, std::string const &name, execution_policy_tag auto) -> auto &
Definition: unstructured_simplicial_grid.h:1267
unstructured_simplicial_grid(unstructured_simplicial_grid &&other) noexcept=default
std::unique_ptr< hierarchy_type > m_hierarchy
Definition: unstructured_simplicial_grid.h:106
auto build_hierarchy() const
Definition: unstructured_simplicial_grid.h:1186
auto operator[](simplex_handle t) const -> auto
Definition: unstructured_simplicial_grid.h:295
std::map< std::string, std::unique_ptr< vector_property< simplex_handle > > > simplex_property_container_type
Definition: unstructured_simplicial_grid.h:100
auto mat4_simplex_property(std::string const &name) const -> auto const &
Definition: unstructured_simplicial_grid.h:772
auto scalar_simplex_property(std::string const &name) -> auto &
Definition: unstructured_simplicial_grid.h:728
auto sample_to_vertex_property_vertex_handle(F &&f, std::string const &name, execution_policy_tag auto) -> auto &
Definition: unstructured_simplicial_grid.h:1247
auto mat2_simplex_property(std::string const &name) -> auto &
Definition: unstructured_simplicial_grid.h:760
auto simplex_at(std::size_t const i) const
Definition: unstructured_simplicial_grid.h:309
auto barycentric_coordinate(simplex_handle const &s, pos_type const &, std::index_sequence< Seq... >) const
Definition: unstructured_simplicial_grid.h:441
detail::unstructured_simplicial_grid::simplex_at_return_type< vertex_handle const &, SimplexDim+1 > const_simplex_at_return_type
Definition: parent.h:19
simplex_property_container_type m_simplex_properties
Definition: unstructured_simplicial_grid.h:105
auto write_vtp_triangles(filesystem::path const &path) const
Definition: unstructured_simplicial_grid.h:870
auto write_unstructured_tetrahedral_grid_vtk(std::filesystem::path const &path, std::string const &title) const -> bool requires(SimplexDim==2)
Definition: unstructured_simplicial_grid.h:970
auto simplex_at(std::size_t const i, std::index_sequence< Seq... >) const -> const_simplex_at_return_type
Definition: unstructured_simplicial_grid.h:321
auto clear()
Definition: unstructured_simplicial_grid.h:510
auto simplex_property(std::string const &name) -> auto &
Definition: unstructured_simplicial_grid.h:693
constexpr auto is_valid(simplex_handle t) const
Definition: unstructured_simplicial_grid.h:1181
auto hierarchy() const -> auto &
Definition: unstructured_simplicial_grid.h:1201
auto mat3_simplex_property(std::string const &name) const -> auto const &
Definition: unstructured_simplicial_grid.h:764
unstructured_simplicial_grid(std::vector< vec< Real, NumDimensions > > const &positions)
Definition: unstructured_simplicial_grid.h:154
static constexpr auto num_vertices_per_simplex()
Definition: unstructured_simplicial_grid.h:84
detail::unstructured_simplicial_grid::simplex_at_return_type< vertex_handle &, SimplexDim+1 > simplex_at_return_type
Definition: parent.h:22
auto operator=(unstructured_simplicial_grid const &other) -> unstructured_simplicial_grid &
Definition: unstructured_simplicial_grid.h:133
auto contains(simplex_handle const ch, vertex_handle const vh) const
Definition: unstructured_simplicial_grid.h:557
auto build_delaunay_mesh()
Definition: unstructured_simplicial_grid.h:563
auto barycentric_coordinate(simplex_handle const &s, pos_type const &q) const
Definition: unstructured_simplicial_grid.h:459
auto write_vtk(std::filesystem::path const &path, std::string const &title="tatooine grid") const
Definition: unstructured_simplicial_grid.h:826
unstructured_simplicial_grid(std::initializer_list< pos_type > &&vertices)
Definition: unstructured_simplicial_grid.h:151
auto read(std::filesystem::path const &path)
Definition: unstructured_simplicial_grid.h:1019
typename parent_type::template typed_vertex_property_type< T > typed_vertex_property_type
Definition: unstructured_simplicial_grid.h:82
auto simplex_index_data() const -> auto const &
Definition: unstructured_simplicial_grid.h:112
auto reindex_simplices_vertex_handles()
tidies up invalid vertices
Definition: unstructured_simplicial_grid.h:480
auto build_delaunay_mesh(std::vector< std::pair< vertex_handle, vertex_handle > > const &constraints, std::index_sequence< Seq... >) -> void
Definition: unstructured_simplicial_grid.h:658
auto write_unstructured_triangular_grid_vtk(std::filesystem::path const &path, std::string const &title) const -> bool requires(SimplexDim==2)
Definition: unstructured_simplicial_grid.h:902
auto remove(simplex_handle const ch)
Definition: unstructured_simplicial_grid.h:424
auto insert_vertex(arithmetic auto const ... comps)
Definition: unstructured_simplicial_grid.h:333
auto remove(vertex_handle const vh)
Definition: unstructured_simplicial_grid.h:365
auto insert_vertex(pos_type &&v)
Definition: unstructured_simplicial_grid.h:355
auto vec3_simplex_property(std::string const &name) -> auto &
Definition: unstructured_simplicial_grid.h:744
auto insert_simplex(Handles const ... handles)
Definition: unstructured_simplicial_grid.h:427
auto simplex_at(simplex_handle t) -> auto
Definition: unstructured_simplicial_grid.h:306
auto copy_prop(auto const &other_grid, std::string const &name, auto const &other_prop)
Definition: unstructured_simplicial_grid.h:164
auto insert_simplex_property(std::string const &name, T const &value=T{}) -> auto &
Definition: unstructured_simplicial_grid.h:781
auto insert_vertex(pos_type const &v)
Definition: unstructured_simplicial_grid.h:345
auto build_sub_delaunay_mesh(std::vector< vertex_handle > const &vertices)
Definition: unstructured_simplicial_grid.h:603
auto contains(simplex_handle const ch, vertex_handle const vh, std::index_sequence< Is... >) const
Definition: unstructured_simplicial_grid.h:550
typename parent_type::hierarchy_type hierarchy_type
Definition: unstructured_simplicial_grid.h:83
auto operator=(unstructured_simplicial_grid &&other) noexcept -> unstructured_simplicial_grid &=default
auto sampler(typed_vertex_property_type< T > const &prop) const
Definition: unstructured_simplicial_grid.h:1210
auto sample_to_vertex_property(F &&f, std::string const &name) -> auto &
Definition: unstructured_simplicial_grid.h:1225
auto vec2_simplex_property(std::string const &name) -> auto &
Definition: unstructured_simplicial_grid.h:736
auto operator[](simplex_handle t) -> auto
Definition: unstructured_simplicial_grid.h:298
auto mat4_simplex_property(std::string const &name) -> auto &
Definition: unstructured_simplicial_grid.h:776
auto write_vtu_tetrahedral(filesystem::path const &path) const
Definition: unstructured_simplicial_grid.h:894
auto at(simplex_handle t) const -> auto
Definition: unstructured_simplicial_grid.h:300
auto tidy_up()
Definition: unstructured_simplicial_grid.h:493
auto vec2_simplex_property(std::string const &name) const -> auto const &
Definition: unstructured_simplicial_grid.h:732
constexpr unstructured_simplicial_grid()=default
std::set< simplex_handle > m_invalid_simplices
Definition: unstructured_simplicial_grid.h:104
auto remove_duplicate_vertices(Real const eps=Real{})
Definition: unstructured_simplicial_grid.h:376
auto invalid_simplices() const -> auto const &
Definition: unstructured_simplicial_grid.h:115
std::vector< vertex_handle > m_simplex_index_data
Definition: unstructured_simplicial_grid.h:103
auto build_delaunay_mesh(std::index_sequence< Seq... >) -> void requires(NumDimensions==2)||(NumDimensions==3)
Definition: unstructured_simplicial_grid.h:571
auto write(filesystem::path const &path) const
Definition: unstructured_simplicial_grid.h:790
auto mat3_simplex_property(std::string const &name) -> auto &
Definition: unstructured_simplicial_grid.h:768
auto remove_duplicate_vertices(execution_policy::sequential_t, Real const eps=Real{})
Definition: unstructured_simplicial_grid.h:403
auto build_sub_delaunay_mesh(std::vector< vertex_handle > const &vertices, std::index_sequence< Seq... >) -> void requires(NumDimensions==2)||(NumDimensions==3)
Definition: unstructured_simplicial_grid.h:612
auto simplex_property(std::string const &name) const -> const auto &
Definition: unstructured_simplicial_grid.h:709
unstructured_simplicial_grid(unstructured_simplicial_grid const &other)
Definition: unstructured_simplicial_grid.h:123
auto vec3_simplex_property(std::string const &name) const -> auto const &
Definition: unstructured_simplicial_grid.h:740
auto clear_hierarchy() const
Definition: unstructured_simplicial_grid.h:1199
auto mat2_simplex_property(std::string const &name) const -> auto const &
Definition: unstructured_simplicial_grid.h:756
auto vec4_simplex_property(std::string const &name) -> auto &
Definition: unstructured_simplicial_grid.h:752
Real real_type
Definition: unstructured_simplicial_grid.h:55
constexpr auto bounding_box() const
Definition: unstructured_simplicial_grid.h:1286
auto sample_to_vertex_property(F &&f, std::string const &name, execution_policy_tag auto tag) -> auto &
Definition: unstructured_simplicial_grid.h:1234
unstructured_simplicial_grid(std::vector< vec< Real, NumDimensions > > &&positions)
Definition: unstructured_simplicial_grid.h:158
auto constexpr x() const -> auto const &requires(N >=1)
Definition: vec.h:102
static auto constexpr zeros()
Definition: vec.h:26
Definition: vtk_legacy.h:92
std::map< std::string, data_array > vertices
Definition: piece.h:26