31 std::vector<Tuple> tagged_tuples;
33 if (tags.const_scalar_attribute(t) == tag_value) {
34 tagged_tuples.emplace_back(t);
38 auto run_edge = [&]() {
39 std::map<int64_t, int64_t> parent_to_child_vertex_map;
43 edge_mesh_matrix.resize(tagged_tuples.size(), 2);
45 for (
size_t i = 0; i < tagged_tuples.size(); ++i) {
46 const std::array<int64_t, 2> vs = {
54 for (
int k = 0; k < 2; k++) {
55 size_t size = parent_to_child_vertex_map.size();
56 parent_to_child_vertex_map.try_emplace(vs[k], size);
57 edge_mesh_matrix(i, k) = parent_to_child_vertex_map[vs[k]];
61 std::shared_ptr<EdgeMesh> child_ptr = std::make_shared<EdgeMesh>();
62 auto& child = *child_ptr;
63 child.initialize(edge_mesh_matrix);
67 auto run_face = [&]() {
68 std::map<int64_t, int64_t> parent_to_child_vertex_map;
69 int64_t child_vertex_count = 0;
72 tri_mesh_matrix.resize(tagged_tuples.size(), 3);
73 for (int64_t i = 0; i < tagged_tuples.size(); ++i) {
75 const std::array<int64_t, 3> vs = {
83 {PrimitiveType::Edge, PrimitiveType::Vertex}),
87 for (
int k = 0; k < 3; k++) {
88 size_t size = parent_to_child_vertex_map.size();
89 parent_to_child_vertex_map.try_emplace(vs[k], size);
90 tri_mesh_matrix(i, k) = parent_to_child_vertex_map.at(vs[k]);
93 std::shared_ptr<TriMesh> child_ptr = std::make_shared<TriMesh>();
94 auto& child = *child_ptr;
95 child.initialize(tri_mesh_matrix);
100 auto run_tet = [&]() {
101 std::map<int64_t, int64_t> parent_to_child_vertex_map;
102 int64_t child_vertex_count = 0;
106 tet_mesh_matrix.resize(tagged_tuples.size(), 4);
107 for (int64_t i = 0; i < tagged_tuples.size(); ++i) {
108 const std::array<int64_t, 4> vs = {
116 {PrimitiveType::Triangle, PrimitiveType::Edge, PrimitiveType::Vertex}),
121 {PrimitiveType::Edge, PrimitiveType::Vertex}),
124 for (
int k = 0; k < 4; ++k) {
125 size_t size = parent_to_child_vertex_map.size();
126 parent_to_child_vertex_map.try_emplace(vs[k], size);
127 tet_mesh_matrix(i, k) = parent_to_child_vertex_map[vs[k]];
134 std::shared_ptr<TetMesh> child_ptr = std::make_shared<TetMesh>();
135 auto& child = *child_ptr;
136 child.initialize(tet_mesh_matrix);
141 std::shared_ptr<Mesh> child_mesh_ptr;
147 std::shared_ptr<EdgeMesh> meshptr = std::make_shared<EdgeMesh>();
148 meshptr->initialize_free(tagged_tuples.size());
149 child_mesh_ptr = meshptr;
153 std::shared_ptr<TriMesh> meshptr = std::make_shared<TriMesh>();
154 meshptr->initialize_free(tagged_tuples.size());
155 child_mesh_ptr = meshptr;
159 std::shared_ptr<TetMesh> meshptr = std::make_shared<TetMesh>();
160 meshptr->initialize_free(tagged_tuples.size());
161 child_mesh_ptr = meshptr;
164 default:
throw(
"invalid child mesh type");
171 child_mesh_ptr = run_edge();
175 child_mesh_ptr = run_face();
179 child_mesh_ptr = run_tet();
182 default:
throw(
"invalid child mesh type");
186 assert(
bool(child_mesh_ptr));
187 auto& child = *child_mesh_ptr;
189 std::vector<std::array<Tuple, 2>> child_to_parent_map(tagged_tuples.size());
190 assert(tagged_tuples.size() == child.capacity(pt));
192 const auto child_top_dimension_tuples = child.get_all(pt);
194 for (
size_t i = 0; i < tagged_tuples.size(); ++i) {
195 child_to_parent_map[i] = {{child_top_dimension_tuples[i], tagged_tuples[i]}};
199 return child_mesh_ptr;