45 for (
const auto& parent_data : parent_incident_datas) {
50 if (child_ptr->is_free()) {
53 if (child_ptr->top_cell_dimension() != 1) {
57 const auto& child_mmmanager = child_ptr->m_multi_mesh_manager;
58 int64_t child_id = child_mmmanager.child_id();
59 auto child_to_parent_handle = child_mmmanager.map_to_parent_handle;
60 auto parent_to_child_handle = parent_mmmanager.children().at(child_id).map_handle;
61 auto child_to_parent_accessor = child_ptr->create_accessor(child_to_parent_handle);
62 auto parent_to_child_accessor = m.
create_accessor(parent_to_child_handle);
65 std::vector<std::pair<Tuple, Tuple>> update_pairs;
67 for (
int ear_index = 0; ear_index < 2; ++ear_index) {
68 const int64_t parent_ear_eid_old = parent_data.ears[ear_index].eid;
69 const int64_t parent_merged_eid = parent_data.new_edge_id;
70 const int64_t parent_new_fid = parent_data.merged_edge_fid;
73 assert(parent_merged_eid != -1);
74 assert(parent_new_fid != -1);
77 .const_vector_attribute(parent_ear_eid_old);
79 Tuple parent_tuple, child_tuple;
80 std::tie(parent_tuple, child_tuple) =
90 const bool child_tuple_exists = child_cell_flag_accessor.is_active(child_tuple);
91 if (!child_tuple_exists) {
95 const int64_t parent_old_vid =
99 int64_t parent_new_vid = -1;
101 if (parent_ear_eid_old != parent_merged_eid) {
103 if (parent_old_vid == parent_incident_vids[0]) {
104 parent_new_vid = parent_incident_vids[1];
106 parent_new_vid = parent_old_vid;
110 parent_new_vid = parent_old_vid;
113 assert(parent_new_vid != -1);
115 Tuple new_parent_tuple =
118 update_pairs.push_back(std::make_pair(new_parent_tuple, child_tuple));
121 for (
const auto& pair : update_pairs) {
123 parent_to_child_accessor,
124 child_to_parent_accessor,
140 for (
const auto& parent_data : parent_incident_tet_datas) {
143 if (child_ptr->is_free()) {
146 if (child_ptr->top_cell_dimension() == 2) {
149 const auto& child_mmmanager = child_ptr->m_multi_mesh_manager;
150 const int64_t child_id = child_mmmanager.
child_id();
151 const auto child_to_parent_handle = child_mmmanager.map_to_parent_handle;
152 const auto parent_to_child_handle =
153 parent_mmmanager.children().at(child_id).map_handle;
154 auto child_to_parent_accessor = child_ptr->create_accessor(child_to_parent_handle);
155 auto parent_to_child_accessor = m.
create_accessor(parent_to_child_handle);
156 auto child_cell_flag_accessor =
159 std::vector<std::pair<Tuple, Tuple>> update_pairs;
161 for (
int ear_index = 0; ear_index < 2; ++ear_index) {
162 const int64_t parent_ear_fid_old = parent_data.ears[ear_index].fid;
163 const int64_t parent_merged_fid = parent_data.new_face_id;
164 const int64_t parent_new_tid =
165 parent_data.merged_face_tid;
167 assert(parent_merged_fid != -1);
168 assert(parent_new_tid != -1);
171 .const_vector_attribute(parent_ear_fid_old);
174 Tuple parent_tuple, child_tuple;
175 std::tie(parent_tuple, child_tuple) =
184 bool child_tuple_exists = child_cell_flag_accessor.is_active(child_tuple);
185 if (!child_tuple_exists) {
189 const int64_t parent_old_eid =
191 const int64_t parent_old_vid =
196 int64_t parent_new_eid = -1;
197 int64_t parent_new_vid = -1;
199 if (parent_ear_fid_old != parent_merged_fid) {
201 if (parent_old_eid == parent_data.e02) {
202 parent_new_eid = parent_data.e12;
203 }
else if (parent_old_eid == parent_data.e03) {
204 parent_new_eid = parent_data.e13;
205 }
else if (parent_old_eid == parent_data.e23) {
206 parent_new_eid = parent_data.e23;
209 if (parent_old_vid == parent_data.v0) {
210 parent_new_vid = parent_data.v1;
211 }
else if (parent_old_vid == parent_data.v2) {
212 parent_new_vid = parent_data.v2;
213 }
else if (parent_old_vid == parent_data.v3) {
214 parent_new_vid = parent_data.v3;
218 parent_new_eid = parent_old_eid;
219 parent_new_vid = parent_old_vid;
222 assert(parent_new_eid != -1);
223 assert(parent_new_vid != -1);
231 update_pairs.push_back(std::make_pair(new_parent_tuple, child_tuple));
234 for (
const auto& pair : update_pairs) {
236 parent_to_child_accessor,
237 child_to_parent_accessor,
242 }
else if (child_ptr->top_cell_dimension() == 1) {
246 const auto& child_mmmanager = child_ptr->m_multi_mesh_manager;
247 int64_t child_id = child_mmmanager.child_id();
248 auto child_to_parent_handle = child_mmmanager.map_to_parent_handle;
249 auto parent_to_child_handle = parent_mmmanager.children().at(child_id).map_handle;
250 auto child_to_parent_accessor = child_ptr->create_accessor(child_to_parent_handle);
251 auto parent_to_child_accessor = m.
create_accessor(parent_to_child_handle);
252 auto child_cell_flag_accessor =
255 std::vector<std::pair<Tuple, Tuple>> update_pairs;
257 for (
int ear_index = 0; ear_index < 2; ++ear_index) {
258 const int64_t parent_ear_fid_old = parent_data.ears[ear_index].fid;
259 const int64_t parent_merged_fid = parent_data.new_face_id;
260 const int64_t parent_new_tid = parent_data.merged_face_tid;
263 std::array<int64_t, 3> parent_old_eids;
264 std::array<int64_t, 3> parent_new_eids = {
265 {parent_data.e12, parent_data.e13, parent_data.e23}};
267 if (parent_ear_fid_old != parent_merged_fid) {
268 parent_old_eids = {{parent_data.e02, parent_data.e03, parent_data.e23}};
270 parent_old_eids = {{parent_data.e12, parent_data.e13, parent_data.e23}};
274 assert(parent_merged_fid != -1);
275 assert(parent_new_tid != -1);
277 for (
int i = 0; i < 3; ++i) {
279 .const_vector_attribute(parent_old_eids[i]);
282 Tuple parent_tuple, child_tuple;
283 std::tie(parent_tuple, child_tuple) =
292 bool child_tuple_exists = child_cell_flag_accessor.is_active(child_tuple);
293 if (!child_tuple_exists) {
297 const int64_t parent_old_vid =
300 int64_t parent_new_vid = -1;
301 if (parent_ear_fid_old != parent_merged_fid) {
303 if (parent_old_vid == parent_data.v0) {
304 parent_new_vid = parent_data.v1;
305 }
else if (parent_old_vid == parent_data.v2) {
306 parent_new_vid = parent_data.v2;
307 }
else if (parent_old_vid == parent_data.v3) {
308 parent_new_vid = parent_data.v3;
312 parent_new_vid = parent_old_vid;
315 assert(parent_new_vid != -1);
323 update_pairs.push_back(std::make_pair(new_parent_tuple, child_tuple));
326 for (
const auto& pair : update_pairs) {
328 parent_to_child_accessor,
329 child_to_parent_accessor,
367 int64_t child_id = child_mmmanager.child_id();
368 auto parent_to_child_handle = parent_mmmanager.children().at(child_id).map_handle;
369 auto child_to_parent_accessor = child_mesh.
create_accessor(child_to_parent_handle);
370 auto parent_to_child_accessor = parent_mesh.
create_accessor(parent_to_child_handle);
374 for (int64_t index = 0; index < 2; ++index) {
376 int64_t f_parent = parent_incident_datas[0].split_f[index];
378 const int64_t e_child = child_emoe.
m_split_e[index];
381 if (f_parent == -1 || e_child == -1 || e_parent == -1) {
386 const int64_t v_parent = parent_spine_v[index];
391 assert(parent_mesh.
is_valid(parent_tuple));
392 assert(child_mesh.
is_valid(child_tuple));
395 parent_to_child_accessor,
396 child_to_parent_accessor,
422 int64_t child_id = child_mmmanager.child_id();
423 auto parent_to_child_handle = parent_mmmanager.children().at(child_id).map_handle;
424 auto child_to_parent_accessor = child_mesh.
create_accessor(child_to_parent_handle);
425 auto parent_to_child_accessor = parent_mesh.
create_accessor(parent_to_child_handle);
432 for (
const auto& child_data : child_incident_datas) {
433 int64_t target_parent_fid =
parent_global_cid(child_to_parent_accessor, child_data.fid);
442 for (
const auto& parent_data : parent_incident_datas) {
448 if (parent_data.fid == target_parent_fid) {
450 const auto& child_split_f = child_data.split_f;
451 const auto& parent_split_f = parent_data.split_f;
454 for (int64_t index = 0; index < 2; ++index) {
455 int64_t f_child = child_split_f[index];
456 int64_t f_parent = parent_split_f[index];
457 if (f_child == -1 || f_parent == -1) {
461 int64_t e_child = child_data.ears[index].eid;
462 int64_t e_parent = parent_data.ears[index].eid;
464 int64_t v_child = child_spine_v[index];
465 int64_t v_parent = parent_spine_v[index];
467 const Tuple parent_tuple =
469 const Tuple child_tuple =
472 assert(parent_mesh.
is_valid(parent_tuple));
473 assert(child_mesh.
is_valid(child_tuple));
476 parent_to_child_accessor,
477 child_to_parent_accessor,
523 int64_t child_id = child_mmmanager.child_id();
524 auto parent_to_child_handle = parent_mmmanager.children().at(child_id).map_handle;
525 auto child_to_parent_accessor = child_mesh.
create_accessor(child_to_parent_handle);
526 auto parent_to_child_accessor = parent_mesh.
create_accessor(parent_to_child_handle);
528 int64_t target_parent_tid =
530 int64_t target_parent_local_fid =
532 for (
const auto& parent_data : parent_incident_tet_datas) {
533 if (parent_data.tid != target_parent_tid)
continue;
535 int64_t face_index = -1;
536 for (
int i = 0; i < 2; ++i) {
537 if (parent_data.incident_face_local_fid[i] == target_parent_local_fid) {
543 assert(face_index != -1);
545 for (
int index = 0; index < 2; ++index) {
546 const int64_t t_parent = parent_data.split_t[index];
547 const int64_t f_parent =
548 parent_incident_face_datas[parent_data.incident_face_data_idx[face_index]]
552 const int64_t e_child = child_emoe.
m_split_e[index];
554 if (t_parent == -1 || f_parent == -1 || e_child == -1 || e_parent == -1) {
559 const int64_t v_child =
563 const Tuple parent_tuple =
567 assert(parent_mesh.
is_valid(parent_tuple));
568 assert(child_mesh.
is_valid(child_tuple));
571 parent_to_child_accessor,
572 child_to_parent_accessor,
601 int64_t child_id = child_mmmanager.child_id();
602 auto parent_to_child_handle = parent_mmmanager.children().at(child_id).map_handle;
603 auto child_to_parent_accessor = child_mesh.
create_accessor(child_to_parent_handle);
604 auto parent_to_child_accessor = parent_mesh.
create_accessor(parent_to_child_handle);
606 for (
const auto& child_data : child_incident_face_datas) {
607 int64_t target_parent_tid =
parent_global_cid(child_to_parent_accessor, child_data.fid);
610 int64_t target_parent_local_fid =
613 for (
const auto& parent_data : parent_incident_tet_datas) {
614 if (parent_data.tid != target_parent_tid)
continue;
615 int64_t face_index = -1;
616 for (
int i = 0; i < 2; ++i) {
617 if (parent_data.incident_face_local_fid[i] == target_parent_local_fid) {
623 assert(face_index != -1);
625 for (
int index = 0; index < 2; ++index) {
627 int64_t t_parent = parent_data.split_t[index];
629 int64_t f_child = child_data.split_f[index];
631 parent_incident_face_datas[parent_data.incident_face_data_idx[face_index]]
634 if (t_parent == -1 || f_child == -1 || f_parent == -1) {
638 int64_t e_child = child_data.ears[index].eid;
640 parent_incident_face_datas[parent_data.incident_face_data_idx[face_index]]
643 int64_t v_child = child_spine_v[index];
644 int64_t v_parent = parent_spine_v[index];
646 const Tuple parent_tuple =
648 const Tuple child_tuple =
651 assert(parent_mesh.
is_valid(parent_tuple));
652 assert(child_mesh.
is_valid(child_tuple));
655 parent_to_child_accessor,
656 child_to_parent_accessor,
687 int64_t child_id = child_mmmanager.child_id();
688 auto parent_to_child_handle = parent_mmmanager.children().at(child_id).map_handle;
689 auto child_to_parent_accessor = child_mesh.
create_accessor(child_to_parent_handle);
690 auto parent_to_child_accessor = parent_mesh.
create_accessor(parent_to_child_handle);
692 for (
const auto& child_data : child_incident_tet_datas) {
693 int64_t target_parent_tid =
parent_global_cid(child_to_parent_accessor, child_data.tid);
695 for (
const auto& parent_data : parent_incident_tet_datas) {
696 if (parent_data.tid != target_parent_tid)
continue;
697 const auto& child_split_t = child_data.split_t;
698 const auto& parent_split_t = parent_data.split_t;
700 for (int64_t index = 0; index < 2; ++index) {
701 int64_t t_child = child_split_t[index];
702 int64_t t_parent = parent_split_t[index];
704 if (t_child == -1 || t_parent == -1) {
708 int64_t f_child = child_data.ears[index].fid;
709 int64_t f_parent = parent_data.ears[index].fid;
712 child_incident_face_datas[child_data.incident_face_data_idx[1]].ear_eids[index];
713 int64_t e_parent = parent_incident_face_datas[parent_data.incident_face_data_idx[1]]
716 int64_t v_child = child_spine_v[index];
717 int64_t v_parent = parent_spine_v[index];
720 const Tuple parent_tuple =
722 const Tuple child_tuple =
725 assert(parent_mesh.
is_valid(parent_tuple));
726 assert(child_mesh.
is_valid(child_tuple));
729 parent_to_child_accessor,
730 child_to_parent_accessor,