67void CartesianMeshAMRPatchMng::
78 cell_to_refine_internals.
add(cell);
79 if (cell.
level() > max_level)
80 max_level = cell.
level();
83 m_num_mng->prepareLevel(max_level + 1);
93 std::unordered_map<Int64, Int32> node_uid_to_owner;
94 std::unordered_map<Int64, Int32> face_uid_to_owner;
109 std::unordered_map<Int64, Int32> around_parent_cells_uid_to_owner;
110 std::unordered_map<Int64, Int32> around_parent_cells_uid_to_flags;
120 if (m_mesh->dimension() == 2) {
142 constexpr bool mask_node_if_cell_left[] = {
false,
true,
true,
false };
143 constexpr bool mask_node_if_cell_bottom[] = {
false,
false,
true,
true };
145 constexpr bool mask_node_if_cell_right[] = {
true,
false,
false,
true };
146 constexpr bool mask_node_if_cell_top[] = {
true,
true,
false,
false };
148 constexpr bool mask_face_if_cell_left[] = {
true,
true,
true,
false };
149 constexpr bool mask_face_if_cell_bottom[] = {
false,
true,
true,
true };
151 constexpr bool mask_face_if_cell_right[] = {
true,
false,
true,
true };
152 constexpr bool mask_face_if_cell_top[] = {
true,
true,
false,
true };
158 cells_infos.
reserve((cell_to_refine_internals.
size() * 4) * (2 + m_num_mng->nbNodeByCell()));
164 faces_infos.
reserve((cell_to_refine_internals.
size() * 12) * (2 + 2));
168 nodes_infos.
reserve(cell_to_refine_internals.
size() * 9);
174 for (
Cell parent_cell : cell_to_refine_internals) {
175 const Int64 parent_cell_uid = parent_cell.uniqueId();
176 const Int32 parent_cell_level = parent_cell.level();
177 const bool parent_cell_is_own = (parent_cell.owner() == my_rank);
179 const CartCoord parent_coord_x = m_num_mng->cellUniqueIdToCoordX(parent_cell_uid, parent_cell_level);
180 const CartCoord parent_coord_y = m_num_mng->cellUniqueIdToCoordY(parent_cell_uid, parent_cell_level);
182 const CartCoord child_coord_x = m_num_mng->offsetLevelToLevel(parent_coord_x, parent_cell_level, parent_cell_level + 1);
183 const CartCoord child_coord_y = m_num_mng->offsetLevelToLevel(parent_coord_y, parent_cell_level, parent_cell_level + 1);
185 const Int32 pattern = m_num_mng->pattern();
187 m_num_mng->cellUniqueIdsAroundCell(parent_cell, uid_cells_around_parent_cell_1d.
view());
189 for (
Int32 i = 0; i < 9; ++i) {
190 const Int64 uid_cell = uid_cells_around_parent_cell_1d[i];
193 if (uid_cell != -1 && around_parent_cells_uid_to_owner[uid_cell] != -1) {
194 owner_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_owner[uid_cell];
195 flags_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_flags[uid_cell];
198 uid_cells_around_parent_cell_1d[i] = -1;
199 owner_cells_around_parent_cell_1d[i] = -1;
200 flags_cells_around_parent_cell_1d[i] = 0;
205 ConstArray2View uid_cells_around_parent_cell(uid_cells_around_parent_cell_1d.data(), 3, 3);
206 ConstArray2View owner_cells_around_parent_cell(owner_cells_around_parent_cell_1d.data(), 3, 3);
207 ConstArray2View flags_cells_around_parent_cell(flags_cells_around_parent_cell_1d.data(), 3, 3);
277 is_cell_around_parent_cell_present_and_useful[1][2] = ((uid_cells_around_parent_cell(1, 2) != -1) && (flags_cells_around_parent_cell(1, 2) &
ItemFlags::II_Inactive));
279 is_cell_around_parent_cell_present_and_useful[2][0] = ((uid_cells_around_parent_cell(2, 0) != -1) && (flags_cells_around_parent_cell(2, 0) &
ItemFlags::II_Inactive));
280 is_cell_around_parent_cell_present_and_useful[2][1] = ((uid_cells_around_parent_cell(2, 1) != -1) && (flags_cells_around_parent_cell(2, 1) &
ItemFlags::II_Inactive));
281 is_cell_around_parent_cell_present_and_useful[2][2] = ((uid_cells_around_parent_cell(2, 2) != -1) && (flags_cells_around_parent_cell(2, 2) &
ItemFlags::II_Inactive));
285 auto is_cell_around_parent_cell_in_subdomain = [&](
const Integer y,
const Integer x) {
286 return is_cell_around_parent_cell_present_and_useful[y][x] && (flags_cells_around_parent_cell(y, x) &
ItemFlags::II_UserMark1);
290 auto is_cell_around_parent_cell_same_owner = [&](
const Integer y,
const Integer x) {
291 return is_cell_around_parent_cell_present_and_useful[y][x] && (owner_cells_around_parent_cell(y, x) == owner_cells_around_parent_cell(1, 1));
295 auto is_cell_around_parent_cell_different_owner = [&](
const Integer y,
const Integer x) {
296 return is_cell_around_parent_cell_present_and_useful[y][x] && (owner_cells_around_parent_cell(y, x) != owner_cells_around_parent_cell(1, 1));
300 for (
CartCoord j = child_coord_y; j < child_coord_y + pattern; ++j) {
301 for (
CartCoord i = child_coord_x; i < child_coord_x + pattern; ++i) {
302 parent_cells.
add(parent_cell.localId());
305 const Int64 child_cell_uid = m_num_mng->cellUniqueId(
CartCoord2(i, j), parent_cell_level + 1);
308 m_num_mng->cellNodeUniqueIds(
CartCoord2(i, j), parent_cell_level + 1, child_nodes_uids);
309 m_num_mng->cellFaceUniqueIds(
CartCoord2(i, j), parent_cell_level + 1, child_faces_uids);
311 constexpr Integer type_cell = IT_Quad4;
312 constexpr Integer type_face = IT_Line2;
315 cells_infos.
add(type_cell);
316 cells_infos.
add(child_cell_uid);
317 for (
Integer nc = 0; nc < m_num_mng->nbNodeByCell(); nc++) {
318 cells_infos.
add(child_nodes_uids[nc]);
322 for (
Integer l = 0; l < m_num_mng->nbFaceByCell(); ++l) {
324 bool is_new_face =
false;
338 ((i == child_coord_x && !is_cell_around_parent_cell_in_subdomain(1, 0)) || (mask_face_if_cell_left[l])) &&
339 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 2)) || mask_face_if_cell_right[l]) &&
340 ((j == child_coord_y && !is_cell_around_parent_cell_in_subdomain(0, 1)) || (mask_face_if_cell_bottom[l])) &&
341 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(2, 1)) || mask_face_if_cell_top[l])) {
343 faces_infos.
add(type_face);
344 faces_infos.
add(child_faces_uids[l]);
348 for (
Integer nc = l; nc < l + 2; nc++) {
349 faces_infos.
add(child_nodes_uids[nc % m_num_mng->nbNodeByCell()]);
354 child_face_owner = owner_cells_around_parent_cell(1, 1);
365 ((i == child_coord_x && !is_cell_around_parent_cell_same_owner(1, 0)) || (mask_face_if_cell_left[l])) &&
366 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 2)) || mask_face_if_cell_right[l]) &&
367 ((j == child_coord_y && !is_cell_around_parent_cell_same_owner(0, 1)) || (mask_face_if_cell_bottom[l])) &&
368 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_same_owner(2, 1)) || mask_face_if_cell_top[l])) {
387 if (i == child_coord_x && (!mask_face_if_cell_left[l]) && is_cell_around_parent_cell_different_owner(1, 0)) {
388 child_face_owner = owner_cells_around_parent_cell(1, 0);
392 else if (j == child_coord_y && (!mask_face_if_cell_bottom[l]) && is_cell_around_parent_cell_different_owner(0, 1)) {
393 child_face_owner = owner_cells_around_parent_cell(0, 1);
400 child_face_owner = owner_cells_around_parent_cell(1, 1);
405 if (child_face_owner != -1) {
406 face_uid_to_owner[child_faces_uids[l]] = child_face_owner;
411 face_uid_change_owner_only.
add(child_faces_uids[l]);
433 for (
Int32 l = 0; l < m_num_mng->nbNodeByCell(); ++l) {
434 Int32 child_node_owner = -1;
435 bool is_new_node =
false;
449 ((i == child_coord_x && !is_cell_around_parent_cell_in_subdomain(1, 0)) || (mask_node_if_cell_left[l])) &&
450 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 2)) || mask_node_if_cell_right[l]) &&
451 ((j == child_coord_y && !is_cell_around_parent_cell_in_subdomain(0, 1)) || (mask_node_if_cell_bottom[l])) &&
452 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(2, 1)) || mask_node_if_cell_top[l])) {
454 nodes_infos.
add(child_nodes_uids[l]);
458 child_node_owner = owner_cells_around_parent_cell(1, 1);
469 ((i == child_coord_x && !is_cell_around_parent_cell_same_owner(1, 0)) || (mask_node_if_cell_left[l])) &&
470 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 2)) || mask_node_if_cell_right[l]) &&
471 ((j == child_coord_y && !is_cell_around_parent_cell_same_owner(0, 1)) || (mask_node_if_cell_bottom[l])) &&
472 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_same_owner(2, 1)) || mask_node_if_cell_top[l])) {
478 if (i == child_coord_x && (!mask_node_if_cell_left[l])) {
482 if (j == child_coord_y && (!mask_node_if_cell_bottom[l])) {
485 if (is_cell_around_parent_cell_different_owner(0, 0)) {
486 child_node_owner = owner_cells_around_parent_cell(0, 0);
490 else if (is_cell_around_parent_cell_different_owner(0, 1)) {
491 child_node_owner = owner_cells_around_parent_cell(0, 1);
495 else if (is_cell_around_parent_cell_different_owner(1, 0)) {
496 child_node_owner = owner_cells_around_parent_cell(1, 0);
500 child_node_owner = owner_cells_around_parent_cell(1, 1);
506 else if (j == (child_coord_y + pattern - 1) && (!mask_node_if_cell_top[l])) {
509 if (is_cell_around_parent_cell_different_owner(1, 0)) {
510 child_node_owner = owner_cells_around_parent_cell(1, 0);
515 child_node_owner = owner_cells_around_parent_cell(1, 1);
522 if (is_cell_around_parent_cell_different_owner(1, 0)) {
523 child_node_owner = owner_cells_around_parent_cell(1, 0);
528 child_node_owner = owner_cells_around_parent_cell(1, 1);
534 else if (i == (child_coord_x + pattern - 1) && (!mask_node_if_cell_right[l])) {
538 if (j == child_coord_y && (!mask_node_if_cell_bottom[l])) {
541 if (is_cell_around_parent_cell_different_owner(0, 1)) {
542 child_node_owner = owner_cells_around_parent_cell(0, 1);
546 else if (is_cell_around_parent_cell_different_owner(0, 2)) {
547 child_node_owner = owner_cells_around_parent_cell(0, 2);
552 child_node_owner = owner_cells_around_parent_cell(1, 1);
558 else if (j == (child_coord_y + pattern - 1) && (!mask_node_if_cell_top[l])) {
559 child_node_owner = owner_cells_around_parent_cell(1, 1);
564 child_node_owner = owner_cells_around_parent_cell(1, 1);
573 if (j == child_coord_y && (!mask_node_if_cell_bottom[l]) && is_cell_around_parent_cell_different_owner(0, 1)) {
574 child_node_owner = owner_cells_around_parent_cell(0, 1);
579 else if (parent_cell_is_own && j == (child_coord_y + pattern - 1) && (!mask_node_if_cell_top[l]) && is_cell_around_parent_cell_different_owner(2, 1)) {
580 child_node_owner = owner_cells_around_parent_cell(1, 1);
585 child_node_owner = owner_cells_around_parent_cell(1, 1);
591 if (child_node_owner != -1) {
592 node_uid_to_owner[child_nodes_uids[l]] = child_node_owner;
598 node_uid_change_owner_only.
add(child_nodes_uids[l]);
622 else if (m_mesh->dimension() == 3) {
644 constexpr bool mask_node_if_cell_left[] = {
false,
true,
true,
false,
false,
true,
true,
false };
645 constexpr bool mask_node_if_cell_bottom[] = {
false,
false,
true,
true,
false,
false,
true,
true };
646 constexpr bool mask_node_if_cell_rear[] = {
false,
false,
false,
false,
true,
true,
true,
true };
648 constexpr bool mask_node_if_cell_right[] = {
true,
false,
false,
true,
true,
false,
false,
true };
649 constexpr bool mask_node_if_cell_top[] = {
true,
true,
false,
false,
true,
true,
false,
false };
650 constexpr bool mask_node_if_cell_front[] = {
true,
true,
true,
true,
false,
false,
false,
false };
652 constexpr bool mask_face_if_cell_left[] = {
true,
false,
true,
true,
true,
true };
653 constexpr bool mask_face_if_cell_bottom[] = {
true,
true,
false,
true,
true,
true };
654 constexpr bool mask_face_if_cell_rear[] = {
false,
true,
true,
true,
true,
true };
656 constexpr bool mask_face_if_cell_right[] = {
true,
true,
true,
true,
false,
true };
657 constexpr bool mask_face_if_cell_top[] = {
true,
true,
true,
true,
true,
false };
658 constexpr bool mask_face_if_cell_front[] = {
true,
true,
true,
false,
true,
true };
667 constexpr Int32 nodes_in_face_0[] = { 0, 1, 2, 3 };
668 constexpr Int32 nodes_in_face_1[] = { 0, 3, 7, 4 };
669 constexpr Int32 nodes_in_face_2[] = { 0, 1, 5, 4 };
670 constexpr Int32 nodes_in_face_3[] = { 4, 5, 6, 7 };
671 constexpr Int32 nodes_in_face_4[] = { 1, 2, 6, 5 };
672 constexpr Int32 nodes_in_face_5[] = { 3, 2, 6, 7 };
674 constexpr Int32 nb_nodes_in_face = 4;
680 cells_infos.
reserve((cell_to_refine_internals.
size() * 8) * (2 + m_num_mng->nbNodeByCell()));
686 faces_infos.
reserve((cell_to_refine_internals.
size() * 36) * (2 + 4));
690 nodes_infos.
reserve(cell_to_refine_internals.
size() * 27);
696 for (
Cell parent_cell : cell_to_refine_internals) {
697 const Int64 parent_cell_uid = parent_cell.uniqueId();
698 const Int32 parent_cell_level = parent_cell.level();
700 const CartCoord3 parent_coord = m_num_mng->cellUniqueIdToCoord(parent_cell_uid, parent_cell_level);
701 const CartCoord3 child_coord = m_num_mng->offsetLevelToLevel(parent_coord, parent_cell_level, parent_cell_level + 1);
703 const Int32 pattern = m_num_mng->pattern();
705 m_num_mng->cellUniqueIdsAroundCell(parent_cell, uid_cells_around_parent_cell_1d.
view());
707 for (
Integer i = 0; i < 27; ++i) {
708 Int64 uid_cell = uid_cells_around_parent_cell_1d[i];
711 if (uid_cell != -1 && around_parent_cells_uid_to_owner[uid_cell] != -1) {
712 owner_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_owner[uid_cell];
713 flags_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_flags[uid_cell];
716 uid_cells_around_parent_cell_1d[i] = -1;
717 owner_cells_around_parent_cell_1d[i] = -1;
718 flags_cells_around_parent_cell_1d[i] = 0;
723 ConstArray3View uid_cells_around_parent_cell(uid_cells_around_parent_cell_1d.data(), 3, 3, 3);
724 ConstArray3View owner_cells_around_parent_cell(owner_cells_around_parent_cell_1d.data(), 3, 3, 3);
725 ConstArray3View flags_cells_around_parent_cell(flags_cells_around_parent_cell_1d.data(), 3, 3, 3);
814 is_cell_around_parent_cell_present_and_useful[1][1][2] = ((uid_cells_around_parent_cell(1, 1, 2) != -1) && (flags_cells_around_parent_cell(1, 1, 2) &
ItemFlags::II_Inactive));
816 is_cell_around_parent_cell_present_and_useful[1][2][0] = ((uid_cells_around_parent_cell(1, 2, 0) != -1) && (flags_cells_around_parent_cell(1, 2, 0) &
ItemFlags::II_Inactive));
817 is_cell_around_parent_cell_present_and_useful[1][2][1] = ((uid_cells_around_parent_cell(1, 2, 1) != -1) && (flags_cells_around_parent_cell(1, 2, 1) &
ItemFlags::II_Inactive));
818 is_cell_around_parent_cell_present_and_useful[1][2][2] = ((uid_cells_around_parent_cell(1, 2, 2) != -1) && (flags_cells_around_parent_cell(1, 2, 2) &
ItemFlags::II_Inactive));
820 is_cell_around_parent_cell_present_and_useful[2][0][0] = ((uid_cells_around_parent_cell(2, 0, 0) != -1) && (flags_cells_around_parent_cell(2, 0, 0) &
ItemFlags::II_Inactive));
821 is_cell_around_parent_cell_present_and_useful[2][0][1] = ((uid_cells_around_parent_cell(2, 0, 1) != -1) && (flags_cells_around_parent_cell(2, 0, 1) &
ItemFlags::II_Inactive));
822 is_cell_around_parent_cell_present_and_useful[2][0][2] = ((uid_cells_around_parent_cell(2, 0, 2) != -1) && (flags_cells_around_parent_cell(2, 0, 2) &
ItemFlags::II_Inactive));
823 is_cell_around_parent_cell_present_and_useful[2][1][0] = ((uid_cells_around_parent_cell(2, 1, 0) != -1) && (flags_cells_around_parent_cell(2, 1, 0) &
ItemFlags::II_Inactive));
824 is_cell_around_parent_cell_present_and_useful[2][1][1] = ((uid_cells_around_parent_cell(2, 1, 1) != -1) && (flags_cells_around_parent_cell(2, 1, 1) &
ItemFlags::II_Inactive));
825 is_cell_around_parent_cell_present_and_useful[2][1][2] = ((uid_cells_around_parent_cell(2, 1, 2) != -1) && (flags_cells_around_parent_cell(2, 1, 2) &
ItemFlags::II_Inactive));
826 is_cell_around_parent_cell_present_and_useful[2][2][0] = ((uid_cells_around_parent_cell(2, 2, 0) != -1) && (flags_cells_around_parent_cell(2, 2, 0) &
ItemFlags::II_Inactive));
827 is_cell_around_parent_cell_present_and_useful[2][2][1] = ((uid_cells_around_parent_cell(2, 2, 1) != -1) && (flags_cells_around_parent_cell(2, 2, 1) &
ItemFlags::II_Inactive));
828 is_cell_around_parent_cell_present_and_useful[2][2][2] = ((uid_cells_around_parent_cell(2, 2, 2) != -1) && (flags_cells_around_parent_cell(2, 2, 2) &
ItemFlags::II_Inactive));
832 auto is_cell_around_parent_cell_in_subdomain = [&](
const Integer z,
const Integer y,
const Integer x) {
833 return is_cell_around_parent_cell_present_and_useful[z][y][x] && (flags_cells_around_parent_cell(z, y, x) &
ItemFlags::II_UserMark1);
837 auto is_cell_around_parent_cell_same_owner = [&](
const Integer z,
const Integer y,
const Integer x) {
838 return is_cell_around_parent_cell_present_and_useful[z][y][x] && (owner_cells_around_parent_cell(z, y, x) == owner_cells_around_parent_cell(1, 1, 1));
842 auto is_cell_around_parent_cell_different_owner = [&](
const Integer z,
const Integer y,
const Integer x) {
843 return is_cell_around_parent_cell_present_and_useful[z][y][x] && (owner_cells_around_parent_cell(z, y, x) != owner_cells_around_parent_cell(1, 1, 1));
847 for (
CartCoord k = child_coord.z; k < child_coord.z + pattern; ++k) {
848 for (
CartCoord j = child_coord.y; j < child_coord.y + pattern; ++j) {
849 for (
CartCoord i = child_coord.x; i < child_coord.x + pattern; ++i) {
850 parent_cells.
add(parent_cell.localId());
853 const Int64 child_cell_uid = m_num_mng->cellUniqueId(
CartCoord3(i, j, k), parent_cell_level + 1);
856 m_num_mng->cellNodeUniqueIds(
CartCoord3(i, j, k), parent_cell_level + 1, child_nodes_uids);
857 m_num_mng->cellFaceUniqueIds(
CartCoord3(i, j, k), parent_cell_level + 1, child_faces_uids);
859 constexpr Int64 type_cell = IT_Hexaedron8;
860 constexpr Int64 type_face = IT_Quad4;
863 cells_infos.
add(type_cell);
864 cells_infos.
add(child_cell_uid);
865 for (
Int32 nc = 0; nc < m_num_mng->nbNodeByCell(); nc++) {
866 cells_infos.
add(child_nodes_uids[nc]);
870 for (
Int32 l = 0; l < m_num_mng->nbFaceByCell(); ++l) {
871 Int32 child_face_owner = -1;
872 bool is_new_face =
false;
885 ((i == child_coord.x && !is_cell_around_parent_cell_in_subdomain(1, 1, 0)) || mask_face_if_cell_left[l]) &&
886 ((i != (child_coord.x + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 1, 2)) || mask_face_if_cell_right[l]) &&
887 ((j == child_coord.y && !is_cell_around_parent_cell_in_subdomain(1, 0, 1)) || mask_face_if_cell_bottom[l]) &&
888 ((j != (child_coord.y + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 2, 1)) || mask_face_if_cell_top[l]) &&
889 ((k == child_coord.z && !is_cell_around_parent_cell_in_subdomain(0, 1, 1)) || mask_face_if_cell_rear[l]) &&
890 ((k != (child_coord.z + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(2, 1, 1)) || mask_face_if_cell_front[l])) {
892 faces_infos.
add(type_face);
893 faces_infos.
add(child_faces_uids[l]);
919 for (
Integer nc : nodes_in_face_l) {
920 faces_infos.
add(child_nodes_uids[nc]);
925 child_face_owner = owner_cells_around_parent_cell(1, 1, 1);
936 ((i == child_coord.x && !is_cell_around_parent_cell_same_owner(1, 1, 0)) || mask_face_if_cell_left[l]) &&
937 ((i != (child_coord.x + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 1, 2)) || mask_face_if_cell_right[l]) &&
938 ((j == child_coord.y && !is_cell_around_parent_cell_same_owner(1, 0, 1)) || mask_face_if_cell_bottom[l]) &&
939 ((j != (child_coord.y + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 2, 1)) || mask_face_if_cell_top[l]) &&
940 ((k == child_coord.z && !is_cell_around_parent_cell_same_owner(0, 1, 1)) || mask_face_if_cell_rear[l]) &&
941 ((k != (child_coord.z + pattern - 1) || !is_cell_around_parent_cell_same_owner(2, 1, 1)) || mask_face_if_cell_front[l])) {
961 if (i == child_coord.x && (!mask_face_if_cell_left[l]) && is_cell_around_parent_cell_different_owner(1, 1, 0)) {
962 child_face_owner = owner_cells_around_parent_cell(1, 1, 0);
966 else if (j == child_coord.y && (!mask_face_if_cell_bottom[l]) && is_cell_around_parent_cell_different_owner(1, 0, 1)) {
967 child_face_owner = owner_cells_around_parent_cell(1, 0, 1);
971 else if (k == child_coord.z && (!mask_face_if_cell_rear[l]) && is_cell_around_parent_cell_different_owner(0, 1, 1)) {
972 child_face_owner = owner_cells_around_parent_cell(0, 1, 1);
979 child_face_owner = owner_cells_around_parent_cell(1, 1, 1);
984 if (child_face_owner != -1) {
985 face_uid_to_owner[child_faces_uids[l]] = child_face_owner;
991 face_uid_change_owner_only.
add(child_faces_uids[l]);
1015 for (
Int32 l = 0; l < m_num_mng->nbNodeByCell(); ++l) {
1016 Int32 child_node_owner = -1;
1017 bool is_new_node =
false;
1031 ((i == child_coord.x && !is_cell_around_parent_cell_in_subdomain(1, 1, 0)) || mask_node_if_cell_left[l]) &&
1032 ((i != (child_coord.x + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 1, 2)) || mask_node_if_cell_right[l]) &&
1033 ((j == child_coord.y && !is_cell_around_parent_cell_in_subdomain(1, 0, 1)) || mask_node_if_cell_bottom[l]) &&
1034 ((j != (child_coord.y + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 2, 1)) || mask_node_if_cell_top[l]) &&
1035 ((k == child_coord.z && !is_cell_around_parent_cell_in_subdomain(0, 1, 1)) || mask_node_if_cell_rear[l]) &&
1036 ((k != (child_coord.z + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(2, 1, 1)) || mask_node_if_cell_front[l])) {
1038 nodes_infos.
add(child_nodes_uids[l]);
1042 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1053 ((i == child_coord.x && !is_cell_around_parent_cell_same_owner(1, 1, 0)) || mask_node_if_cell_left[l]) &&
1054 ((i != (child_coord.x + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 1, 2)) || mask_node_if_cell_right[l]) &&
1055 ((j == child_coord.y && !is_cell_around_parent_cell_same_owner(1, 0, 1)) || mask_node_if_cell_bottom[l]) &&
1056 ((j != (child_coord.y + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 2, 1)) || mask_node_if_cell_top[l]) &&
1057 ((k == child_coord.z && !is_cell_around_parent_cell_same_owner(0, 1, 1)) || mask_node_if_cell_rear[l]) &&
1058 ((k != (child_coord.z + pattern - 1) || !is_cell_around_parent_cell_same_owner(2, 1, 1)) || mask_node_if_cell_front[l])) {
1064 if (i == child_coord.x && (!mask_node_if_cell_left[l])) {
1068 if (j == child_coord.y && (!mask_node_if_cell_bottom[l])) {
1072 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1075 if (is_cell_around_parent_cell_different_owner(0, 0, 0)) {
1076 child_node_owner = owner_cells_around_parent_cell(0, 0, 0);
1080 else if (is_cell_around_parent_cell_different_owner(0, 0, 1)) {
1081 child_node_owner = owner_cells_around_parent_cell(0, 0, 1);
1085 else if (is_cell_around_parent_cell_different_owner(0, 1, 0)) {
1086 child_node_owner = owner_cells_around_parent_cell(0, 1, 0);
1090 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1091 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1095 else if (is_cell_around_parent_cell_different_owner(1, 0, 0)) {
1096 child_node_owner = owner_cells_around_parent_cell(1, 0, 0);
1100 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1101 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1105 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1106 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1111 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1117 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1120 if (is_cell_around_parent_cell_different_owner(1, 0, 0)) {
1121 child_node_owner = owner_cells_around_parent_cell(1, 0, 0);
1125 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1126 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1130 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1131 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1136 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1144 if (is_cell_around_parent_cell_different_owner(1, 0, 0)) {
1145 child_node_owner = owner_cells_around_parent_cell(1, 0, 0);
1149 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1150 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1154 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1155 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1160 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1167 else if (j == (child_coord.y + pattern - 1) && (!mask_node_if_cell_top[l])) {
1171 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1174 if (is_cell_around_parent_cell_different_owner(0, 1, 0)) {
1175 child_node_owner = owner_cells_around_parent_cell(0, 1, 0);
1179 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1180 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1184 else if (is_cell_around_parent_cell_different_owner(0, 2, 0)) {
1185 child_node_owner = owner_cells_around_parent_cell(0, 2, 0);
1189 else if (is_cell_around_parent_cell_different_owner(0, 2, 1)) {
1190 child_node_owner = owner_cells_around_parent_cell(0, 2, 1);
1194 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1195 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1200 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1206 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1209 if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1210 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1215 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1223 if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1224 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1229 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1238 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1241 if (is_cell_around_parent_cell_different_owner(0, 1, 0)) {
1242 child_node_owner = owner_cells_around_parent_cell(0, 1, 0);
1246 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1247 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1251 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1252 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1257 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1262 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1265 if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1266 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1271 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1279 if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1280 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1285 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1294 else if (i == (child_coord.x + pattern - 1) && (!mask_node_if_cell_right[l])) {
1298 if (j == child_coord.y && (!mask_node_if_cell_bottom[l])) {
1302 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1305 if (is_cell_around_parent_cell_different_owner(0, 0, 1)) {
1306 child_node_owner = owner_cells_around_parent_cell(0, 0, 1);
1310 else if (is_cell_around_parent_cell_different_owner(0, 0, 2)) {
1311 child_node_owner = owner_cells_around_parent_cell(0, 0, 2);
1315 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1316 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1320 else if (is_cell_around_parent_cell_different_owner(0, 1, 2)) {
1321 child_node_owner = owner_cells_around_parent_cell(0, 1, 2);
1325 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1326 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1330 else if (is_cell_around_parent_cell_different_owner(1, 0, 2)) {
1331 child_node_owner = owner_cells_around_parent_cell(1, 0, 2);
1336 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1342 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1345 if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1346 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1350 else if (is_cell_around_parent_cell_different_owner(1, 0, 2)) {
1351 child_node_owner = owner_cells_around_parent_cell(1, 0, 2);
1356 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1364 if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1365 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1369 else if (is_cell_around_parent_cell_different_owner(1, 0, 2)) {
1370 child_node_owner = owner_cells_around_parent_cell(1, 0, 2);
1375 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1382 else if (j == (child_coord.y + pattern - 1) && (!mask_node_if_cell_top[l])) {
1386 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1389 if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1390 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1394 else if (is_cell_around_parent_cell_different_owner(0, 1, 2)) {
1395 child_node_owner = owner_cells_around_parent_cell(0, 1, 2);
1399 else if (is_cell_around_parent_cell_different_owner(0, 2, 1)) {
1400 child_node_owner = owner_cells_around_parent_cell(0, 2, 1);
1404 else if (is_cell_around_parent_cell_different_owner(0, 2, 2)) {
1405 child_node_owner = owner_cells_around_parent_cell(0, 2, 2);
1410 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1416 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1417 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1422 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1429 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1432 if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1433 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1437 else if (is_cell_around_parent_cell_different_owner(0, 1, 2)) {
1438 child_node_owner = owner_cells_around_parent_cell(0, 1, 2);
1443 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1448 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1449 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1454 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1467 if (j == child_coord.y && (!mask_node_if_cell_bottom[l])) {
1471 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1474 if (is_cell_around_parent_cell_different_owner(0, 0, 1)) {
1475 child_node_owner = owner_cells_around_parent_cell(0, 0, 1);
1479 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1480 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1484 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1485 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1490 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1496 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1499 if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1500 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1505 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1513 if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1514 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1519 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1525 else if (j == (child_coord.y + pattern - 1) && (!mask_node_if_cell_top[l])) {
1529 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1532 if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1533 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1537 else if (is_cell_around_parent_cell_different_owner(0, 2, 1)) {
1538 child_node_owner = owner_cells_around_parent_cell(0, 2, 1);
1543 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1549 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1550 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1555 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1563 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1566 if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1567 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1572 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1577 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1578 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1583 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1590 if (child_node_owner != -1) {
1591 node_uid_to_owner[child_nodes_uids[l]] = child_node_owner;
1597 node_uid_change_owner_only.
add(child_nodes_uids[l]);
1628 debug() <<
"Nb new nodes in patch : " << total_nb_nodes;
1630 const Integer nb_node_owner_change = node_uid_change_owner_only.
size();
1637 m_mesh->modifier()->addNodes(nodes_infos, nodes_lid.
subView(0, total_nb_nodes));
1640 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(nodes_lid.
subView(total_nb_nodes, nb_node_owner_change), node_uid_change_owner_only,
true);
1647 ENUMERATE_ (
Node, inode, m_mesh->nodeFamily()->view(nodes_lid)) {
1651 if (node_uid_to_owner[node.
uniqueId()] == my_rank) {
1659 uid_child_nodes[index++] = m_num_mng->parentNodeUniqueIdOfNode(node.
uniqueId(), max_level + 1,
false);
1662 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(lid_child_nodes, uid_child_nodes,
false);
1666 ENUMERATE_ (
Node, inode, m_mesh->nodeFamily()->view(nodes_lid)) {
1667 const Int32 child_lid = lid_child_nodes[index++];
1668 if (child_lid == NULL_ITEM_ID) {
1672 Node parent = nodes[child_lid];
1673 Node child = *inode;
1675 m_mesh->modifier()->addParentNodeToNode(child, parent);
1676 m_mesh->modifier()->addChildNodeToNode(parent, child);
1679 m_mesh->nodeFamily()->notifyItemsOwnerChanged();
1684 debug() <<
"Nb new faces in patch : " << total_nb_faces;
1686 const Integer nb_face_owner_change = face_uid_change_owner_only.
size();
1693 m_mesh->modifier()->addFaces(total_nb_faces, faces_infos, faces_lid.
subView(0, total_nb_faces));
1696 m_mesh->faceFamily()->itemsUniqueIdToLocalId(faces_lid.
subView(total_nb_faces, nb_face_owner_change), face_uid_change_owner_only,
true);
1703 ENUMERATE_ (
Face, iface, m_mesh->faceFamily()->view(faces_lid)) {
1707 if (face_uid_to_owner[face.
uniqueId()] == my_rank) {
1715 uid_parent_faces[index++] = m_num_mng->parentFaceUniqueIdOfFace(face.
uniqueId(), max_level + 1,
false);
1719 m_mesh->faceFamily()->itemsUniqueIdToLocalId(lid_parent_faces, uid_parent_faces,
false);
1723 ENUMERATE_ (
Face, iface, m_mesh->faceFamily()->view(faces_lid)) {
1724 const Int32 child_lid = lid_parent_faces[index++];
1725 if (child_lid == NULL_ITEM_ID) {
1729 Face parent = faces[child_lid];
1730 Face child = *iface;
1732 m_mesh->modifier()->addParentFaceToFace(child, parent);
1733 m_mesh->modifier()->addChildFaceToFace(parent, child);
1736 m_mesh->faceFamily()->notifyItemsOwnerChanged();
1741 debug() <<
"Nb new cells in patch : " << total_nb_cells;
1744 m_mesh->modifier()->addCells(total_nb_cells, cells_infos, cells_lid);
1748 for (
Integer i = 0; i < total_nb_cells; ++i) {
1749 Cell child = cells[cells_lid[i]];
1750 Cell parent = cells[parent_cells[i]];
1756 if (parent.
owner() == my_rank) {
1764 m_mesh->modifier()->addParentCellToCell(child, parent);
1765 m_mesh->modifier()->addChildCellToCell(parent, child);
1769 for (
Cell cell : cell_to_refine_internals) {
1773 m_mesh->cellFamily()->notifyItemsOwnerChanged();
1776 m_mesh->modifier()->endUpdate();
1779 for (
Cell parent_cell : cell_to_refine_internals) {
1780 m_num_mng->setChildNodeCoordinates(parent_cell);
1783 for (
Int32 i = 0; i < parent_cell.nbHChildren(); ++i) {
1801 m_mesh->computeSynchronizeInfos();
1839void CartesianMeshAMRPatchMng::
1849 std::unordered_map<Int64, Int32> around_parent_cells_uid_to_owner;
1850 std::unordered_map<Int64, bool> around_parent_cells_uid_is_in_subdomain;
1851 std::unordered_map<Int64, UniqueArray<Cell>> parent_to_child_cells;
1853 std::unordered_map<Int64, Int32> node_uid_to_owner;
1854 std::unordered_map<Int64, Int32> face_uid_to_owner;
1859 m_num_mng->prepareLevel(-1);
1891 Int64 parent_uid = m_num_mng->parentCellUniqueIdOfCell(cell);
1894 if (!cell_uid_to_create.
contains(parent_uid)) {
1895 cell_uid_to_create.
add(parent_uid);
1898 around_parent_cells_uid_to_owner[parent_uid] = cell.
owner();
1899 around_parent_cells_uid_is_in_subdomain[parent_uid] =
true;
1903 if (around_parent_cells_uid_to_owner[parent_uid] != cell.
owner()) {
1904 ARCANE_FATAL(
"Pb owner -- Two+ children, two+ different owners, same parent\n"
1905 "The ground patch size in x, y (and z if 3D) must be a multiple of four (need partitionner update to support multiple of two)\n"
1906 "CellUID : {0} -- CellOwner : {1} -- OtherChildOwner : {2}",
1907 cell.
uniqueId(), cell.
owner(), around_parent_cells_uid_to_owner[parent_uid]);
1913 parent_to_child_cells[parent_uid].add(cell);
1941 for (
Int64 parent_cell : cell_uid_to_create) {
1942 m_num_mng->cellUniqueIdsAroundCell(parent_cell, -1, cell_uids_around);
1943 for (
Int64 cell_uid : cell_uids_around) {
1949 if (around_parent_cells_uid_to_owner.contains(cell_uid))
1953 if (!uid_of_cells_needed.
contains(cell_uid)) {
1954 uid_of_cells_needed.
add(cell_uid);
1960 around_parent_cells_uid_is_in_subdomain[cell_uid] =
false;
1974 for (
Integer i = 0; i < uid_of_cells_needed_all_procs.
size(); ++i) {
1975 if (around_parent_cells_uid_to_owner.contains(uid_of_cells_needed_all_procs[i])) {
1976 owner_of_cells_needed_all_procs[i] = around_parent_cells_uid_to_owner[uid_of_cells_needed_all_procs[i]];
1980 owner_of_cells_needed_all_procs[i] = -1;
1986 pm->
reduce(Parallel::eReduceType::ReduceMax, owner_of_cells_needed_all_procs);
1990 Integer size_uid_of_cells_needed = uid_of_cells_needed.
size();
1991 Integer my_pos_in_all_procs_arrays = 0;
1994 pm->
allGather(av, size_uid_of_cells_needed_per_proc);
1997 for (
Integer i = 0; i < my_rank; ++i) {
1998 my_pos_in_all_procs_arrays += size_uid_of_cells_needed_per_proc[i];
2002 ArrayView<Int32> owner_of_cells_needed = owner_of_cells_needed_all_procs.
subView(my_pos_in_all_procs_arrays, size_uid_of_cells_needed);
2003 for (
Integer i = 0; i < size_uid_of_cells_needed; ++i) {
2004 around_parent_cells_uid_to_owner[uid_of_cells_needed[i]] = owner_of_cells_needed[i];
2008 if (owner_of_cells_needed[i] == -1) {
2009 ARCANE_FATAL(
"In coarsening, this is normally impossible");
2015 if (m_mesh->dimension() == 2) {
2020 constexpr bool mask_face_if_cell_left[] = {
true,
true,
true,
false };
2021 constexpr bool mask_face_if_cell_bottom[] = {
false,
true,
true,
true };
2024 constexpr bool mask_node_if_cell_left[] = {
false,
true,
true,
false };
2025 constexpr bool mask_node_if_cell_bottom[] = {
false,
false,
true,
true };
2033 for (
Int64 parent_cell_uid : cell_uid_to_create) {
2035 m_num_mng->cellUniqueIdsAroundCell(parent_cell_uid, -1, cells_uid_around.
view());
2037 ConstArray2View owner_cells_around_parent_cell(owner_cells_around_parent_cell_1d.data(), 3, 3);
2039 ConstArray2View is_not_in_subdomain_cells_around_parent_cell(is_not_in_subdomain_cells_around_parent_cell_1d.data(), 3, 3);
2041 for (
Integer i = 0; i < 9; ++i) {
2042 Int64 uid_cell = cells_uid_around[i];
2045 if (uid_cell != -1 && around_parent_cells_uid_to_owner[uid_cell] != -1) {
2046 owner_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_owner[uid_cell];
2047 is_not_in_subdomain_cells_around_parent_cell_1d[i] = !around_parent_cells_uid_is_in_subdomain[uid_cell];
2050 cells_uid_around[i] = -1;
2051 owner_cells_around_parent_cell_1d[i] = -1;
2052 is_not_in_subdomain_cells_around_parent_cell_1d[i] =
true;
2059 auto is_cell_around_parent_cell_different_owner = [&](
const Integer y,
const Integer x) {
2060 return (owner_cells_around_parent_cell(y, x) != owner_cells_around_parent_cell(1, 1));
2063 auto is_cell_around_parent_cell_exist_and_different_owner = [&](
const Integer y,
const Integer x) {
2064 return (owner_cells_around_parent_cell(y, x) != -1 && (owner_cells_around_parent_cell(y, x) != owner_cells_around_parent_cell(1, 1)));
2075 m_num_mng->cellNodeUniqueIds(parent_cell_uid, -1, parent_nodes_uids);
2076 m_num_mng->cellFaceUniqueIds(parent_cell_uid, -1, parent_faces_uids);
2078 constexpr Integer type_cell = IT_Quad4;
2079 constexpr Integer type_face = IT_Line2;
2082 cells_infos.
add(type_cell);
2083 cells_infos.
add(parent_cell_uid);
2084 for (
Integer nc = 0; nc < m_num_mng->nbNodeByCell(); nc++) {
2085 cells_infos.
add(parent_nodes_uids[nc]);
2089 for (
Integer l = 0; l < m_num_mng->nbFaceByCell(); ++l) {
2096 (mask_face_if_cell_left[l] || is_cell_around_parent_cell_different_owner(1, 0) || is_not_in_subdomain_cells_around_parent_cell(1, 0)) &&
2097 (mask_face_if_cell_bottom[l] || is_cell_around_parent_cell_different_owner(0, 1) || is_not_in_subdomain_cells_around_parent_cell(0, 1))) {
2098 Integer parent_face_owner = -1;
2099 faces_infos.
add(type_face);
2100 faces_infos.
add(parent_faces_uids[l]);
2104 for (
Integer nc = l; nc < l + 2; nc++) {
2105 faces_infos.
add(parent_nodes_uids[nc % m_num_mng->nbNodeByCell()]);
2109 if ((!mask_face_if_cell_left[l]) && is_cell_around_parent_cell_exist_and_different_owner(1, 0)) {
2110 parent_face_owner = owner_cells_around_parent_cell(1, 0);
2112 else if ((!mask_face_if_cell_bottom[l]) && is_cell_around_parent_cell_exist_and_different_owner(0, 1)) {
2113 parent_face_owner = owner_cells_around_parent_cell(0, 1);
2116 parent_face_owner = owner_cells_around_parent_cell(1, 1);
2118 face_uid_to_owner[parent_faces_uids[l]] = parent_face_owner;
2130 for (
Integer l = 0; l < m_num_mng->nbNodeByCell(); ++l) {
2132 (mask_node_if_cell_left[l] || is_cell_around_parent_cell_different_owner(1, 0) || is_not_in_subdomain_cells_around_parent_cell(1, 0)) &&
2133 (mask_node_if_cell_bottom[l] || is_cell_around_parent_cell_different_owner(0, 1) || is_not_in_subdomain_cells_around_parent_cell(0, 1))) {
2134 Integer parent_node_owner = -1;
2135 nodes_infos.
add(parent_nodes_uids[l]);
2138 if ((!mask_node_if_cell_left[l])) {
2139 if ((!mask_node_if_cell_bottom[l])) {
2140 if (is_cell_around_parent_cell_exist_and_different_owner(0, 0)) {
2141 parent_node_owner = owner_cells_around_parent_cell(0, 0);
2143 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1)) {
2144 parent_node_owner = owner_cells_around_parent_cell(0, 1);
2146 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0)) {
2147 parent_node_owner = owner_cells_around_parent_cell(1, 0);
2150 parent_node_owner = owner_cells_around_parent_cell(1, 1);
2154 if (is_cell_around_parent_cell_exist_and_different_owner(1, 0)) {
2155 parent_node_owner = owner_cells_around_parent_cell(1, 0);
2158 parent_node_owner = owner_cells_around_parent_cell(1, 1);
2163 if ((!mask_node_if_cell_bottom[l])) {
2164 if (is_cell_around_parent_cell_exist_and_different_owner(0, 1)) {
2165 parent_node_owner = owner_cells_around_parent_cell(0, 1);
2167 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2)) {
2168 parent_node_owner = owner_cells_around_parent_cell(0, 2);
2171 parent_node_owner = owner_cells_around_parent_cell(1, 1);
2175 parent_node_owner = owner_cells_around_parent_cell(1, 1);
2179 node_uid_to_owner[parent_nodes_uids[l]] = parent_node_owner;
2189 else if (m_mesh->dimension() == 3) {
2193 constexpr bool mask_node_if_cell_left[] = {
false,
true,
true,
false,
false,
true,
true,
false };
2194 constexpr bool mask_node_if_cell_bottom[] = {
false,
false,
true,
true,
false,
false,
true,
true };
2195 constexpr bool mask_node_if_cell_rear[] = {
false,
false,
false,
false,
true,
true,
true,
true };
2197 constexpr bool mask_face_if_cell_left[] = {
true,
false,
true,
true,
true,
true };
2198 constexpr bool mask_face_if_cell_bottom[] = {
true,
true,
false,
true,
true,
true };
2199 constexpr bool mask_face_if_cell_rear[] = {
false,
true,
true,
true,
true,
true };
2208 constexpr Integer nodes_in_face_0[] = { 0, 1, 2, 3 };
2209 constexpr Integer nodes_in_face_1[] = { 0, 3, 7, 4 };
2210 constexpr Integer nodes_in_face_2[] = { 0, 1, 5, 4 };
2211 constexpr Integer nodes_in_face_3[] = { 4, 5, 6, 7 };
2212 constexpr Integer nodes_in_face_4[] = { 1, 2, 6, 5 };
2213 constexpr Integer nodes_in_face_5[] = { 3, 2, 6, 7 };
2215 constexpr Integer nb_nodes_in_face = 4;
2222 for (
Int64 parent_cell_uid : cell_uid_to_create) {
2224 m_num_mng->cellUniqueIdsAroundCell(parent_cell_uid, -1, cells_uid_around.
view());
2226 ConstArray3View owner_cells_around_parent_cell(owner_cells_around_parent_cell_1d.data(), 3, 3, 3);
2228 ConstArray3View is_not_in_subdomain_cells_around_parent_cell(is_not_in_subdomain_cells_around_parent_cell_1d.data(), 3, 3, 3);
2230 for (
Integer i = 0; i < 27; ++i) {
2231 Int64 uid_cell = cells_uid_around[i];
2234 if (uid_cell != -1 && around_parent_cells_uid_to_owner[uid_cell] != -1) {
2235 owner_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_owner[uid_cell];
2236 is_not_in_subdomain_cells_around_parent_cell_1d[i] = !around_parent_cells_uid_is_in_subdomain[uid_cell];
2239 cells_uid_around[i] = -1;
2240 owner_cells_around_parent_cell_1d[i] = -1;
2241 is_not_in_subdomain_cells_around_parent_cell_1d[i] =
true;
2248 auto is_cell_around_parent_cell_different_owner = [&](
const Integer z,
const Integer y,
const Integer x) {
2249 return (owner_cells_around_parent_cell(z, y, x) != owner_cells_around_parent_cell(1, 1, 1));
2252 auto is_cell_around_parent_cell_exist_and_different_owner = [&](
const Integer z,
const Integer y,
const Integer x) {
2253 return (owner_cells_around_parent_cell(z, y, x) != -1 && (owner_cells_around_parent_cell(z, y, x) != owner_cells_around_parent_cell(1, 1, 1)));
2265 m_num_mng->cellNodeUniqueIds(parent_cell_uid, -1, parent_nodes_uids);
2266 m_num_mng->cellFaceUniqueIds(parent_cell_uid, -1, parent_faces_uids);
2268 constexpr Integer type_cell = IT_Hexaedron8;
2269 constexpr Integer type_face = IT_Quad4;
2272 cells_infos.
add(type_cell);
2273 cells_infos.
add(parent_cell_uid);
2274 for (
Integer nc = 0; nc < m_num_mng->nbNodeByCell(); nc++) {
2275 cells_infos.
add(parent_nodes_uids[nc]);
2279 for (
Integer l = 0; l < m_num_mng->nbFaceByCell(); ++l) {
2286 (mask_face_if_cell_left[l] || is_cell_around_parent_cell_different_owner(1, 1, 0) || is_not_in_subdomain_cells_around_parent_cell(1, 1, 0)) &&
2287 (mask_face_if_cell_bottom[l] || is_cell_around_parent_cell_different_owner(1, 0, 1) || is_not_in_subdomain_cells_around_parent_cell(1, 0, 1)) &&
2288 (mask_face_if_cell_rear[l] || is_cell_around_parent_cell_different_owner(0, 1, 1) || is_not_in_subdomain_cells_around_parent_cell(0, 1, 1))) {
2289 Integer parent_face_owner = -1;
2290 faces_infos.
add(type_face);
2291 faces_infos.
add(parent_faces_uids[l]);
2317 for (
Integer nc : nodes_in_face_l) {
2318 faces_infos.
add(parent_nodes_uids[nc]);
2322 if ((!mask_face_if_cell_left[l]) && is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2323 parent_face_owner = owner_cells_around_parent_cell(1, 1, 0);
2325 else if ((!mask_face_if_cell_bottom[l]) && is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2326 parent_face_owner = owner_cells_around_parent_cell(1, 0, 1);
2328 else if ((!mask_face_if_cell_rear[l]) && is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2329 parent_face_owner = owner_cells_around_parent_cell(0, 1, 1);
2332 parent_face_owner = owner_cells_around_parent_cell(1, 1, 1);
2334 face_uid_to_owner[parent_faces_uids[l]] = parent_face_owner;
2346 for (
Integer l = 0; l < m_num_mng->nbNodeByCell(); ++l) {
2348 (mask_node_if_cell_left[l] || is_cell_around_parent_cell_different_owner(1, 1, 0) || is_not_in_subdomain_cells_around_parent_cell(1, 1, 0)) &&
2349 (mask_node_if_cell_bottom[l] || is_cell_around_parent_cell_different_owner(1, 0, 1) || is_not_in_subdomain_cells_around_parent_cell(1, 0, 1)) &&
2350 (mask_node_if_cell_rear[l] || is_cell_around_parent_cell_different_owner(0, 1, 1) || is_not_in_subdomain_cells_around_parent_cell(0, 1, 1))) {
2351 Integer parent_node_owner = -1;
2352 nodes_infos.
add(parent_nodes_uids[l]);
2355 if ((!mask_node_if_cell_left[l])) {
2356 if ((!mask_node_if_cell_bottom[l])) {
2357 if ((!mask_node_if_cell_rear[l])) {
2359 if (is_cell_around_parent_cell_exist_and_different_owner(0, 0, 0)) {
2360 parent_node_owner = owner_cells_around_parent_cell(0, 0, 0);
2362 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 0, 1)) {
2363 parent_node_owner = owner_cells_around_parent_cell(0, 0, 1);
2365 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 0)) {
2366 parent_node_owner = owner_cells_around_parent_cell(0, 1, 0);
2368 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2369 parent_node_owner = owner_cells_around_parent_cell(0, 1, 1);
2371 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 0)) {
2372 parent_node_owner = owner_cells_around_parent_cell(1, 0, 0);
2374 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2375 parent_node_owner = owner_cells_around_parent_cell(1, 0, 1);
2377 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2378 parent_node_owner = owner_cells_around_parent_cell(1, 1, 0);
2381 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2385 if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 0)) {
2386 parent_node_owner = owner_cells_around_parent_cell(1, 0, 0);
2388 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2389 parent_node_owner = owner_cells_around_parent_cell(1, 0, 1);
2391 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2392 parent_node_owner = owner_cells_around_parent_cell(1, 1, 0);
2395 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2400 if ((!mask_node_if_cell_rear[l])) {
2401 if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 0)) {
2402 parent_node_owner = owner_cells_around_parent_cell(0, 1, 0);
2404 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2405 parent_node_owner = owner_cells_around_parent_cell(0, 1, 1);
2407 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2, 0)) {
2408 parent_node_owner = owner_cells_around_parent_cell(0, 2, 0);
2410 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2, 1)) {
2411 parent_node_owner = owner_cells_around_parent_cell(0, 2, 1);
2413 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2414 parent_node_owner = owner_cells_around_parent_cell(1, 1, 0);
2417 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2421 if (is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2422 parent_node_owner = owner_cells_around_parent_cell(1, 1, 0);
2425 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2431 if ((!mask_node_if_cell_bottom[l])) {
2432 if ((!mask_node_if_cell_rear[l])) {
2433 if (is_cell_around_parent_cell_exist_and_different_owner(0, 0, 1)) {
2434 parent_node_owner = owner_cells_around_parent_cell(0, 0, 1);
2436 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 0, 2)) {
2437 parent_node_owner = owner_cells_around_parent_cell(0, 0, 2);
2439 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2440 parent_node_owner = owner_cells_around_parent_cell(0, 1, 1);
2442 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 2)) {
2443 parent_node_owner = owner_cells_around_parent_cell(0, 1, 2);
2445 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2446 parent_node_owner = owner_cells_around_parent_cell(1, 0, 1);
2448 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 2)) {
2449 parent_node_owner = owner_cells_around_parent_cell(1, 0, 2);
2452 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2456 if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2457 parent_node_owner = owner_cells_around_parent_cell(1, 0, 1);
2459 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 2)) {
2460 parent_node_owner = owner_cells_around_parent_cell(1, 0, 2);
2463 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2468 if ((!mask_node_if_cell_rear[l])) {
2469 if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2470 parent_node_owner = owner_cells_around_parent_cell(0, 1, 1);
2472 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 2)) {
2473 parent_node_owner = owner_cells_around_parent_cell(0, 1, 2);
2475 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2, 1)) {
2476 parent_node_owner = owner_cells_around_parent_cell(0, 2, 1);
2478 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2, 2)) {
2479 parent_node_owner = owner_cells_around_parent_cell(0, 2, 2);
2482 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2486 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2491 node_uid_to_owner[parent_nodes_uids[l]] = parent_node_owner;
2507 debug() <<
"Nb new nodes in patch : " << total_nb_nodes;
2513 m_mesh->modifier()->addNodes(nodes_infos, nodes_lid);
2520 ENUMERATE_ (
Node, inode, m_mesh->nodeFamily()->view(nodes_lid)) {
2523 ARCANE_ASSERT((node_uid_to_owner.contains(node.
uniqueId())), (
"No owner found for node"));
2524 ARCANE_ASSERT((node_uid_to_owner[node.
uniqueId()] < nb_rank && node_uid_to_owner[node.
uniqueId()] >= 0), (
"Bad owner found for node"));
2528 if (node_uid_to_owner[node.
uniqueId()] == my_rank) {
2532 uid_child_nodes[index++] = m_num_mng->childNodeUniqueIdOfNode(node.
uniqueId(), -1);
2534 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(lid_child_nodes, uid_child_nodes,
false);
2538 ENUMERATE_ (
Node, inode, m_mesh->nodeFamily()->view(nodes_lid)) {
2539 const Int32 child_lid = lid_child_nodes[index++];
2540 if (child_lid == NULL_ITEM_ID) {
2544 Node child = nodes[child_lid];
2545 Node parent = *inode;
2547 m_mesh->modifier()->addParentNodeToNode(child, parent);
2548 m_mesh->modifier()->addChildNodeToNode(parent, child);
2552 m_mesh->nodeFamily()->notifyItemsOwnerChanged();
2557 debug() <<
"Nb new faces in patch : " << total_nb_faces;
2559 Integer nb_child = (m_mesh->dimension() == 2 ? 2 : 4);
2562 m_mesh->modifier()->addFaces(total_nb_faces, faces_infos, faces_lid);
2569 ENUMERATE_ (
Face, iface, m_mesh->faceFamily()->view(faces_lid)) {
2572 ARCANE_ASSERT((face_uid_to_owner.contains(face.
uniqueId())), (
"No owner found for face"));
2573 ARCANE_ASSERT((face_uid_to_owner[face.
uniqueId()] < nb_rank && face_uid_to_owner[face.
uniqueId()] >= 0), (
"Bad owner found for face"));
2577 if (face_uid_to_owner[face.
uniqueId()] == my_rank) {
2581 for (
Integer i = 0; i < nb_child; ++i) {
2582 uid_child_faces[index++] = m_num_mng->childFaceUniqueIdOfFace(face.
uniqueId(), -1, i);
2586 m_mesh->faceFamily()->itemsUniqueIdToLocalId(lid_child_faces, uid_child_faces,
false);
2590 ENUMERATE_ (
Face, iface, m_mesh->faceFamily()->view(faces_lid)) {
2591 for (
Integer i = 0; i < nb_child; ++i) {
2592 const Int32 child_lid = lid_child_faces[index++];
2593 if (child_lid == NULL_ITEM_ID) {
2597 Face child = faces[child_lid];
2598 Face parent = *iface;
2600 m_mesh->modifier()->addParentFaceToFace(child, parent);
2601 m_mesh->modifier()->addChildFaceToFace(parent, child);
2606 m_mesh->faceFamily()->notifyItemsOwnerChanged();
2612 debug() <<
"Nb new cells in patch : " << total_nb_cells;
2614 m_mesh->modifier()->addCells(total_nb_cells, cells_infos, cells_lid);
2618 for (
Integer i = 0; i < total_nb_cells; ++i) {
2619 Cell parent = cells[cells_lid[i]];
2627 if (around_parent_cells_uid_to_owner[parent.
uniqueId()] == my_rank) {
2633 for (
Cell child : parent_to_child_cells[parent.
uniqueId()]) {
2634 m_mesh->modifier()->addParentCellToCell(child, parent);
2635 m_mesh->modifier()->addChildCellToCell(parent, child);
2638 m_mesh->cellFamily()->notifyItemsOwnerChanged();
2641 m_mesh->modifier()->endUpdate();
2642 m_num_mng->updateFirstLevel();
2646 for (
Integer i = 0; i < total_nb_cells; ++i) {
2647 Cell parent_cell = cells[cells_lid[i]];
2648 m_num_mng->setParentNodeCoordinates(parent_cell);
2669 m_mesh->computeSynchronizeInfos();