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 CartCoordType parent_coord_x = m_num_mng->cellUniqueIdToCoordX(parent_cell_uid, parent_cell_level);
180 const CartCoordType parent_coord_y = m_num_mng->cellUniqueIdToCoordY(parent_cell_uid, parent_cell_level);
182 const CartCoordType child_coord_x = m_num_mng->offsetLevelToLevel(parent_coord_x, parent_cell_level, parent_cell_level + 1);
183 const CartCoordType 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);
278 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));
280 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));
281 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));
282 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));
286 auto is_cell_around_parent_cell_in_subdomain = [&](
const Integer y,
const Integer x) {
287 return is_cell_around_parent_cell_present_and_useful[y][x] && (flags_cells_around_parent_cell(y, x) &
ItemFlags::II_UserMark1);
291 auto is_cell_around_parent_cell_same_owner = [&](
const Integer y,
const Integer x) {
292 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));
296 auto is_cell_around_parent_cell_different_owner = [&](
const Integer y,
const Integer x) {
297 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));
301 for (CartCoordType j = child_coord_y; j < child_coord_y + pattern; ++j) {
302 for (CartCoordType i = child_coord_x; i < child_coord_x + pattern; ++i) {
303 parent_cells.
add(parent_cell.localId());
306 const Int64 child_cell_uid = m_num_mng->cellUniqueId(CartCoord2Type(i, j), parent_cell_level + 1);
309 m_num_mng->cellNodeUniqueIds(CartCoord2Type(i, j), parent_cell_level + 1, child_nodes_uids);
310 m_num_mng->cellFaceUniqueIds(CartCoord2Type(i, j), parent_cell_level + 1, child_faces_uids);
312 constexpr Integer type_cell = IT_Quad4;
313 constexpr Integer type_face = IT_Line2;
316 cells_infos.
add(type_cell);
317 cells_infos.
add(child_cell_uid);
318 for (
Integer nc = 0; nc < m_num_mng->nbNodeByCell(); nc++) {
319 cells_infos.
add(child_nodes_uids[nc]);
323 for (
Integer l = 0; l < m_num_mng->nbFaceByCell(); ++l) {
325 bool is_new_face =
false;
339 ((i == child_coord_x && !is_cell_around_parent_cell_in_subdomain(1, 0)) || (mask_face_if_cell_left[l])) &&
340 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 2)) || mask_face_if_cell_right[l]) &&
341 ((j == child_coord_y && !is_cell_around_parent_cell_in_subdomain(0, 1)) || (mask_face_if_cell_bottom[l])) &&
342 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(2, 1)) || mask_face_if_cell_top[l])) {
344 faces_infos.
add(type_face);
345 faces_infos.
add(child_faces_uids[l]);
349 for (
Integer nc = l; nc < l + 2; nc++) {
350 faces_infos.
add(child_nodes_uids[nc % m_num_mng->nbNodeByCell()]);
355 child_face_owner = owner_cells_around_parent_cell(1, 1);
366 ((i == child_coord_x && !is_cell_around_parent_cell_same_owner(1, 0)) || (mask_face_if_cell_left[l])) &&
367 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 2)) || mask_face_if_cell_right[l]) &&
368 ((j == child_coord_y && !is_cell_around_parent_cell_same_owner(0, 1)) || (mask_face_if_cell_bottom[l])) &&
369 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_same_owner(2, 1)) || mask_face_if_cell_top[l])) {
389 if (i == child_coord_x && (!mask_face_if_cell_left[l]) && is_cell_around_parent_cell_different_owner(1, 0)) {
390 child_face_owner = owner_cells_around_parent_cell(1, 0);
394 else if (j == child_coord_y && (!mask_face_if_cell_bottom[l]) && is_cell_around_parent_cell_different_owner(0, 1)) {
395 child_face_owner = owner_cells_around_parent_cell(0, 1);
402 child_face_owner = owner_cells_around_parent_cell(1, 1);
407 if (child_face_owner != -1) {
408 face_uid_to_owner[child_faces_uids[l]] = child_face_owner;
414 face_uid_change_owner_only.
add(child_faces_uids[l]);
436 for (
Int32 l = 0; l < m_num_mng->nbNodeByCell(); ++l) {
437 Int32 child_node_owner = -1;
438 bool is_new_node =
false;
452 ((i == child_coord_x && !is_cell_around_parent_cell_in_subdomain(1, 0)) || (mask_node_if_cell_left[l])) &&
453 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 2)) || mask_node_if_cell_right[l]) &&
454 ((j == child_coord_y && !is_cell_around_parent_cell_in_subdomain(0, 1)) || (mask_node_if_cell_bottom[l])) &&
455 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(2, 1)) || mask_node_if_cell_top[l])) {
457 nodes_infos.
add(child_nodes_uids[l]);
461 child_node_owner = owner_cells_around_parent_cell(1, 1);
472 ((i == child_coord_x && !is_cell_around_parent_cell_same_owner(1, 0)) || (mask_node_if_cell_left[l])) &&
473 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 2)) || mask_node_if_cell_right[l]) &&
474 ((j == child_coord_y && !is_cell_around_parent_cell_same_owner(0, 1)) || (mask_node_if_cell_bottom[l])) &&
475 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_same_owner(2, 1)) || mask_node_if_cell_top[l])) {
481 if (i == child_coord_x && (!mask_node_if_cell_left[l])) {
485 if (j == child_coord_y && (!mask_node_if_cell_bottom[l])) {
488 if (is_cell_around_parent_cell_different_owner(0, 0)) {
489 child_node_owner = owner_cells_around_parent_cell(0, 0);
493 else if (is_cell_around_parent_cell_different_owner(0, 1)) {
494 child_node_owner = owner_cells_around_parent_cell(0, 1);
498 else if (is_cell_around_parent_cell_different_owner(1, 0)) {
499 child_node_owner = owner_cells_around_parent_cell(1, 0);
503 child_node_owner = owner_cells_around_parent_cell(1, 1);
509 else if (j == (child_coord_y + pattern - 1) && (!mask_node_if_cell_top[l])) {
512 if (is_cell_around_parent_cell_different_owner(1, 0)) {
513 child_node_owner = owner_cells_around_parent_cell(1, 0);
518 child_node_owner = owner_cells_around_parent_cell(1, 1);
525 if (is_cell_around_parent_cell_different_owner(1, 0)) {
526 child_node_owner = owner_cells_around_parent_cell(1, 0);
531 child_node_owner = owner_cells_around_parent_cell(1, 1);
537 else if (i == (child_coord_x + pattern - 1) && (!mask_node_if_cell_right[l])) {
541 if (j == child_coord_y && (!mask_node_if_cell_bottom[l])) {
544 if (is_cell_around_parent_cell_different_owner(0, 1)) {
545 child_node_owner = owner_cells_around_parent_cell(0, 1);
549 else if (is_cell_around_parent_cell_different_owner(0, 2)) {
550 child_node_owner = owner_cells_around_parent_cell(0, 2);
555 child_node_owner = owner_cells_around_parent_cell(1, 1);
561 else if (j == (child_coord_y + pattern - 1) && (!mask_node_if_cell_top[l])) {
562 child_node_owner = owner_cells_around_parent_cell(1, 1);
567 child_node_owner = owner_cells_around_parent_cell(1, 1);
576 if (j == child_coord_y && (!mask_node_if_cell_bottom[l]) && is_cell_around_parent_cell_different_owner(0, 1)) {
577 child_node_owner = owner_cells_around_parent_cell(0, 1);
582 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)) {
583 child_node_owner = owner_cells_around_parent_cell(1, 1);
588 child_node_owner = owner_cells_around_parent_cell(1, 1);
594 if (child_node_owner != -1) {
595 node_uid_to_owner[child_nodes_uids[l]] = child_node_owner;
601 node_uid_change_owner_only.
add(child_nodes_uids[l]);
625 else if (m_mesh->dimension() == 3) {
647 constexpr bool mask_node_if_cell_left[] = {
false,
true,
true,
false,
false,
true,
true,
false };
648 constexpr bool mask_node_if_cell_bottom[] = {
false,
false,
true,
true,
false,
false,
true,
true };
649 constexpr bool mask_node_if_cell_rear[] = {
false,
false,
false,
false,
true,
true,
true,
true };
651 constexpr bool mask_node_if_cell_right[] = {
true,
false,
false,
true,
true,
false,
false,
true };
652 constexpr bool mask_node_if_cell_top[] = {
true,
true,
false,
false,
true,
true,
false,
false };
653 constexpr bool mask_node_if_cell_front[] = {
true,
true,
true,
true,
false,
false,
false,
false };
655 constexpr bool mask_face_if_cell_left[] = {
true,
false,
true,
true,
true,
true };
656 constexpr bool mask_face_if_cell_bottom[] = {
true,
true,
false,
true,
true,
true };
657 constexpr bool mask_face_if_cell_rear[] = {
false,
true,
true,
true,
true,
true };
659 constexpr bool mask_face_if_cell_right[] = {
true,
true,
true,
true,
false,
true };
660 constexpr bool mask_face_if_cell_top[] = {
true,
true,
true,
true,
true,
false };
661 constexpr bool mask_face_if_cell_front[] = {
true,
true,
true,
false,
true,
true };
670 constexpr Int32 nodes_in_face_0[] = { 0, 1, 2, 3 };
671 constexpr Int32 nodes_in_face_1[] = { 0, 3, 7, 4 };
672 constexpr Int32 nodes_in_face_2[] = { 0, 1, 5, 4 };
673 constexpr Int32 nodes_in_face_3[] = { 4, 5, 6, 7 };
674 constexpr Int32 nodes_in_face_4[] = { 1, 2, 6, 5 };
675 constexpr Int32 nodes_in_face_5[] = { 3, 2, 6, 7 };
677 constexpr Int32 nb_nodes_in_face = 4;
683 cells_infos.
reserve((cell_to_refine_internals.
size() * 8) * (2 + m_num_mng->nbNodeByCell()));
689 faces_infos.
reserve((cell_to_refine_internals.
size() * 36) * (2 + 4));
693 nodes_infos.
reserve(cell_to_refine_internals.
size() * 27);
699 for (
Cell parent_cell : cell_to_refine_internals) {
700 const Int64 parent_cell_uid = parent_cell.uniqueId();
701 const Int32 parent_cell_level = parent_cell.level();
703 const CartCoord3Type parent_coord = m_num_mng->cellUniqueIdToCoord(parent_cell_uid, parent_cell_level);
704 const CartCoord3Type child_coord = m_num_mng->offsetLevelToLevel(parent_coord, parent_cell_level, parent_cell_level + 1);
706 const Int32 pattern = m_num_mng->pattern();
708 m_num_mng->cellUniqueIdsAroundCell(parent_cell, uid_cells_around_parent_cell_1d.
view());
710 for (
Integer i = 0; i < 27; ++i) {
711 Int64 uid_cell = uid_cells_around_parent_cell_1d[i];
714 if (uid_cell != -1 && around_parent_cells_uid_to_owner[uid_cell] != -1) {
715 owner_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_owner[uid_cell];
716 flags_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_flags[uid_cell];
719 uid_cells_around_parent_cell_1d[i] = -1;
720 owner_cells_around_parent_cell_1d[i] = -1;
721 flags_cells_around_parent_cell_1d[i] = 0;
726 ConstArray3View uid_cells_around_parent_cell(uid_cells_around_parent_cell_1d.data(), 3, 3, 3);
727 ConstArray3View owner_cells_around_parent_cell(owner_cells_around_parent_cell_1d.data(), 3, 3, 3);
728 ConstArray3View flags_cells_around_parent_cell(flags_cells_around_parent_cell_1d.data(), 3, 3, 3);
817 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));
819 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));
820 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));
821 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));
823 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));
824 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));
825 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));
826 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));
827 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));
828 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));
829 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));
830 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));
831 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));
835 auto is_cell_around_parent_cell_in_subdomain = [&](
const Integer z,
const Integer y,
const Integer x) {
836 return is_cell_around_parent_cell_present_and_useful[z][y][x] && (flags_cells_around_parent_cell(z, y, x) &
ItemFlags::II_UserMark1);
840 auto is_cell_around_parent_cell_same_owner = [&](
const Integer z,
const Integer y,
const Integer x) {
841 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));
845 auto is_cell_around_parent_cell_different_owner = [&](
const Integer z,
const Integer y,
const Integer x) {
846 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));
850 for (CartCoordType k = child_coord.z; k < child_coord.z + pattern; ++k) {
851 for (CartCoordType j = child_coord.y; j < child_coord.y + pattern; ++j) {
852 for (CartCoordType i = child_coord.x; i < child_coord.x + pattern; ++i) {
853 parent_cells.
add(parent_cell.localId());
856 const Int64 child_cell_uid = m_num_mng->cellUniqueId(CartCoord3Type(i, j, k), parent_cell_level + 1);
859 m_num_mng->cellNodeUniqueIds(CartCoord3Type(i, j, k), parent_cell_level + 1, child_nodes_uids);
860 m_num_mng->cellFaceUniqueIds(CartCoord3Type(i, j, k), parent_cell_level + 1, child_faces_uids);
862 constexpr Int64 type_cell = IT_Hexaedron8;
863 constexpr Int64 type_face = IT_Quad4;
866 cells_infos.
add(type_cell);
867 cells_infos.
add(child_cell_uid);
868 for (
Int32 nc = 0; nc < m_num_mng->nbNodeByCell(); nc++) {
869 cells_infos.
add(child_nodes_uids[nc]);
873 for (
Int32 l = 0; l < m_num_mng->nbFaceByCell(); ++l) {
874 Int32 child_face_owner = -1;
875 bool is_new_face =
false;
889 ((i == child_coord.x && !is_cell_around_parent_cell_in_subdomain(1, 1, 0)) || mask_face_if_cell_left[l]) &&
890 ((i != (child_coord.x + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 1, 2)) || mask_face_if_cell_right[l]) &&
891 ((j == child_coord.y && !is_cell_around_parent_cell_in_subdomain(1, 0, 1)) || mask_face_if_cell_bottom[l]) &&
892 ((j != (child_coord.y + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 2, 1)) || mask_face_if_cell_top[l]) &&
893 ((k == child_coord.z && !is_cell_around_parent_cell_in_subdomain(0, 1, 1)) || mask_face_if_cell_rear[l]) &&
894 ((k != (child_coord.z + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(2, 1, 1)) || mask_face_if_cell_front[l])) {
896 faces_infos.
add(type_face);
897 faces_infos.
add(child_faces_uids[l]);
923 for (
Integer nc : nodes_in_face_l) {
924 faces_infos.
add(child_nodes_uids[nc]);
929 child_face_owner = owner_cells_around_parent_cell(1, 1, 1);
940 ((i == child_coord.x && !is_cell_around_parent_cell_same_owner(1, 1, 0)) || mask_face_if_cell_left[l]) &&
941 ((i != (child_coord.x + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 1, 2)) || mask_face_if_cell_right[l]) &&
942 ((j == child_coord.y && !is_cell_around_parent_cell_same_owner(1, 0, 1)) || mask_face_if_cell_bottom[l]) &&
943 ((j != (child_coord.y + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 2, 1)) || mask_face_if_cell_top[l]) &&
944 ((k == child_coord.z && !is_cell_around_parent_cell_same_owner(0, 1, 1)) || mask_face_if_cell_rear[l]) &&
945 ((k != (child_coord.z + pattern - 1) || !is_cell_around_parent_cell_same_owner(2, 1, 1)) || mask_face_if_cell_front[l])) {
965 if (i == child_coord.x && (!mask_face_if_cell_left[l]) && is_cell_around_parent_cell_different_owner(1, 1, 0)) {
966 child_face_owner = owner_cells_around_parent_cell(1, 1, 0);
970 else if (j == child_coord.y && (!mask_face_if_cell_bottom[l]) && is_cell_around_parent_cell_different_owner(1, 0, 1)) {
971 child_face_owner = owner_cells_around_parent_cell(1, 0, 1);
975 else if (k == child_coord.z && (!mask_face_if_cell_rear[l]) && is_cell_around_parent_cell_different_owner(0, 1, 1)) {
976 child_face_owner = owner_cells_around_parent_cell(0, 1, 1);
983 child_face_owner = owner_cells_around_parent_cell(1, 1, 1);
988 if (child_face_owner != -1) {
989 face_uid_to_owner[child_faces_uids[l]] = child_face_owner;
995 face_uid_change_owner_only.
add(child_faces_uids[l]);
1019 for (
Int32 l = 0; l < m_num_mng->nbNodeByCell(); ++l) {
1020 Int32 child_node_owner = -1;
1021 bool is_new_node =
false;
1036 ((i == child_coord.x && !is_cell_around_parent_cell_in_subdomain(1, 1, 0)) || mask_node_if_cell_left[l]) &&
1037 ((i != (child_coord.x + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 1, 2)) || mask_node_if_cell_right[l]) &&
1038 ((j == child_coord.y && !is_cell_around_parent_cell_in_subdomain(1, 0, 1)) || mask_node_if_cell_bottom[l]) &&
1039 ((j != (child_coord.y + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 2, 1)) || mask_node_if_cell_top[l]) &&
1040 ((k == child_coord.z && !is_cell_around_parent_cell_in_subdomain(0, 1, 1)) || mask_node_if_cell_rear[l]) &&
1041 ((k != (child_coord.z + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(2, 1, 1)) || mask_node_if_cell_front[l])) {
1043 nodes_infos.
add(child_nodes_uids[l]);
1047 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1058 ((i == child_coord.x && !is_cell_around_parent_cell_same_owner(1, 1, 0)) || mask_node_if_cell_left[l]) &&
1059 ((i != (child_coord.x + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 1, 2)) || mask_node_if_cell_right[l]) &&
1060 ((j == child_coord.y && !is_cell_around_parent_cell_same_owner(1, 0, 1)) || mask_node_if_cell_bottom[l]) &&
1061 ((j != (child_coord.y + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 2, 1)) || mask_node_if_cell_top[l]) &&
1062 ((k == child_coord.z && !is_cell_around_parent_cell_same_owner(0, 1, 1)) || mask_node_if_cell_rear[l]) &&
1063 ((k != (child_coord.z + pattern - 1) || !is_cell_around_parent_cell_same_owner(2, 1, 1)) || mask_node_if_cell_front[l])) {
1069 if (i == child_coord.x && (!mask_node_if_cell_left[l])) {
1073 if (j == child_coord.y && (!mask_node_if_cell_bottom[l])) {
1077 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1080 if (is_cell_around_parent_cell_different_owner(0, 0, 0)) {
1081 child_node_owner = owner_cells_around_parent_cell(0, 0, 0);
1085 else if (is_cell_around_parent_cell_different_owner(0, 0, 1)) {
1086 child_node_owner = owner_cells_around_parent_cell(0, 0, 1);
1090 else if (is_cell_around_parent_cell_different_owner(0, 1, 0)) {
1091 child_node_owner = owner_cells_around_parent_cell(0, 1, 0);
1095 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1096 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1100 else if (is_cell_around_parent_cell_different_owner(1, 0, 0)) {
1101 child_node_owner = owner_cells_around_parent_cell(1, 0, 0);
1105 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1106 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1110 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1111 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1116 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1122 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1125 if (is_cell_around_parent_cell_different_owner(1, 0, 0)) {
1126 child_node_owner = owner_cells_around_parent_cell(1, 0, 0);
1130 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1131 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1135 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1136 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1141 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1149 if (is_cell_around_parent_cell_different_owner(1, 0, 0)) {
1150 child_node_owner = owner_cells_around_parent_cell(1, 0, 0);
1154 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1155 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1159 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1160 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1165 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1172 else if (j == (child_coord.y + pattern - 1) && (!mask_node_if_cell_top[l])) {
1176 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1179 if (is_cell_around_parent_cell_different_owner(0, 1, 0)) {
1180 child_node_owner = owner_cells_around_parent_cell(0, 1, 0);
1184 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1185 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1189 else if (is_cell_around_parent_cell_different_owner(0, 2, 0)) {
1190 child_node_owner = owner_cells_around_parent_cell(0, 2, 0);
1194 else if (is_cell_around_parent_cell_different_owner(0, 2, 1)) {
1195 child_node_owner = owner_cells_around_parent_cell(0, 2, 1);
1199 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1200 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1205 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1211 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1214 if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1215 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1220 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1228 if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1229 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1234 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1243 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1246 if (is_cell_around_parent_cell_different_owner(0, 1, 0)) {
1247 child_node_owner = owner_cells_around_parent_cell(0, 1, 0);
1251 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1252 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1256 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1257 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1262 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1267 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1270 if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1271 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1276 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1284 if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1285 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1290 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1299 else if (i == (child_coord.x + pattern - 1) && (!mask_node_if_cell_right[l])) {
1303 if (j == child_coord.y && (!mask_node_if_cell_bottom[l])) {
1307 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1310 if (is_cell_around_parent_cell_different_owner(0, 0, 1)) {
1311 child_node_owner = owner_cells_around_parent_cell(0, 0, 1);
1315 else if (is_cell_around_parent_cell_different_owner(0, 0, 2)) {
1316 child_node_owner = owner_cells_around_parent_cell(0, 0, 2);
1320 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1321 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1325 else if (is_cell_around_parent_cell_different_owner(0, 1, 2)) {
1326 child_node_owner = owner_cells_around_parent_cell(0, 1, 2);
1330 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1331 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1335 else if (is_cell_around_parent_cell_different_owner(1, 0, 2)) {
1336 child_node_owner = owner_cells_around_parent_cell(1, 0, 2);
1341 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1347 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1350 if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1351 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1355 else if (is_cell_around_parent_cell_different_owner(1, 0, 2)) {
1356 child_node_owner = owner_cells_around_parent_cell(1, 0, 2);
1361 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1369 if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1370 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1374 else if (is_cell_around_parent_cell_different_owner(1, 0, 2)) {
1375 child_node_owner = owner_cells_around_parent_cell(1, 0, 2);
1380 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1387 else if (j == (child_coord.y + pattern - 1) && (!mask_node_if_cell_top[l])) {
1391 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1394 if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1395 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1399 else if (is_cell_around_parent_cell_different_owner(0, 1, 2)) {
1400 child_node_owner = owner_cells_around_parent_cell(0, 1, 2);
1404 else if (is_cell_around_parent_cell_different_owner(0, 2, 1)) {
1405 child_node_owner = owner_cells_around_parent_cell(0, 2, 1);
1409 else if (is_cell_around_parent_cell_different_owner(0, 2, 2)) {
1410 child_node_owner = owner_cells_around_parent_cell(0, 2, 2);
1415 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1421 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1422 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1427 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1434 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1437 if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1438 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1442 else if (is_cell_around_parent_cell_different_owner(0, 1, 2)) {
1443 child_node_owner = owner_cells_around_parent_cell(0, 1, 2);
1448 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1453 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1454 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1459 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1472 if (j == child_coord.y && (!mask_node_if_cell_bottom[l])) {
1476 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1479 if (is_cell_around_parent_cell_different_owner(0, 0, 1)) {
1480 child_node_owner = owner_cells_around_parent_cell(0, 0, 1);
1484 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1485 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1489 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1490 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1495 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1501 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1504 if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1505 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1510 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1518 if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1519 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1524 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1530 else if (j == (child_coord.y + pattern - 1) && (!mask_node_if_cell_top[l])) {
1534 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1537 if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1538 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1542 else if (is_cell_around_parent_cell_different_owner(0, 2, 1)) {
1543 child_node_owner = owner_cells_around_parent_cell(0, 2, 1);
1548 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1554 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1555 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1560 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1568 if (k == child_coord.z && (!mask_node_if_cell_rear[l])) {
1571 if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1572 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1577 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1582 else if (k == (child_coord.z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1583 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1588 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1595 if (child_node_owner != -1) {
1596 node_uid_to_owner[child_nodes_uids[l]] = child_node_owner;
1602 node_uid_change_owner_only.
add(child_nodes_uids[l]);
1633 debug() <<
"Nb new nodes in patch : " << total_nb_nodes;
1635 const Integer nb_node_owner_change = node_uid_change_owner_only.
size();
1642 m_mesh->modifier()->addNodes(nodes_infos, nodes_lid.
subView(0, total_nb_nodes));
1645 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(nodes_lid.
subView(total_nb_nodes, nb_node_owner_change), node_uid_change_owner_only,
true);
1652 ENUMERATE_ (
Node, inode, m_mesh->nodeFamily()->view(nodes_lid)) {
1656 if (node_uid_to_owner[node.
uniqueId()] == my_rank) {
1664 uid_child_nodes[index++] = m_num_mng->parentNodeUniqueIdOfNode(node.
uniqueId(), max_level + 1,
false);
1667 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(lid_child_nodes, uid_child_nodes,
false);
1671 ENUMERATE_ (
Node, inode, m_mesh->nodeFamily()->view(nodes_lid)) {
1672 const Int32 child_lid = lid_child_nodes[index++];
1673 if (child_lid == NULL_ITEM_ID) {
1677 Node parent = nodes[child_lid];
1678 Node child = *inode;
1680 m_mesh->modifier()->addParentNodeToNode(child, parent);
1681 m_mesh->modifier()->addChildNodeToNode(parent, child);
1684 m_mesh->nodeFamily()->notifyItemsOwnerChanged();
1689 debug() <<
"Nb new faces in patch : " << total_nb_faces;
1691 const Integer nb_face_owner_change = face_uid_change_owner_only.
size();
1698 m_mesh->modifier()->addFaces(total_nb_faces, faces_infos, faces_lid.
subView(0, total_nb_faces));
1701 m_mesh->faceFamily()->itemsUniqueIdToLocalId(faces_lid.
subView(total_nb_faces, nb_face_owner_change), face_uid_change_owner_only,
true);
1708 ENUMERATE_ (
Face, iface, m_mesh->faceFamily()->view(faces_lid)) {
1712 if (face_uid_to_owner[face.
uniqueId()] == my_rank) {
1720 uid_parent_faces[index++] = m_num_mng->parentFaceUniqueIdOfFace(face.
uniqueId(), max_level + 1,
false);
1724 m_mesh->faceFamily()->itemsUniqueIdToLocalId(lid_parent_faces, uid_parent_faces,
false);
1728 ENUMERATE_ (
Face, iface, m_mesh->faceFamily()->view(faces_lid)) {
1729 const Int32 child_lid = lid_parent_faces[index++];
1730 if (child_lid == NULL_ITEM_ID) {
1734 Face parent = faces[child_lid];
1735 Face child = *iface;
1737 m_mesh->modifier()->addParentFaceToFace(child, parent);
1738 m_mesh->modifier()->addChildFaceToFace(parent, child);
1741 m_mesh->faceFamily()->notifyItemsOwnerChanged();
1746 debug() <<
"Nb new cells in patch : " << total_nb_cells;
1749 m_mesh->modifier()->addCells(total_nb_cells, cells_infos, cells_lid);
1753 for (
Integer i = 0; i < total_nb_cells; ++i) {
1754 Cell child = cells[cells_lid[i]];
1755 Cell parent = cells[parent_cells[i]];
1761 if (parent.
owner() == my_rank) {
1769 m_mesh->modifier()->addParentCellToCell(child, parent);
1770 m_mesh->modifier()->addChildCellToCell(parent, child);
1774 for (
Cell cell : cell_to_refine_internals) {
1778 m_mesh->cellFamily()->notifyItemsOwnerChanged();
1781 m_mesh->modifier()->endUpdate();
1784 for (
Cell parent_cell : cell_to_refine_internals) {
1785 m_num_mng->setChildNodeCoordinates(parent_cell);
1788 for (
Int32 i = 0; i < parent_cell.nbHChildren(); ++i) {
1806 m_mesh->computeSynchronizeInfos();
1844void CartesianMeshAMRPatchMng::
1854 std::unordered_map<Int64, Int32> around_parent_cells_uid_to_owner;
1855 std::unordered_map<Int64, bool> around_parent_cells_uid_is_in_subdomain;
1856 std::unordered_map<Int64, UniqueArray<Cell>> parent_to_child_cells;
1858 std::unordered_map<Int64, Int32> node_uid_to_owner;
1859 std::unordered_map<Int64, Int32> face_uid_to_owner;
1864 m_num_mng->prepareLevel(-1);
1896 Int64 parent_uid = m_num_mng->parentCellUniqueIdOfCell(cell);
1899 if (!cell_uid_to_create.
contains(parent_uid)) {
1900 cell_uid_to_create.
add(parent_uid);
1903 around_parent_cells_uid_to_owner[parent_uid] = cell.
owner();
1904 around_parent_cells_uid_is_in_subdomain[parent_uid] =
true;
1908 if (around_parent_cells_uid_to_owner[parent_uid] != cell.
owner()) {
1909 ARCANE_FATAL(
"Pb owner -- Two+ children, two+ different owners, same parent\n"
1910 "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"
1911 "CellUID : {0} -- CellOwner : {1} -- OtherChildOwner : {2}",
1912 cell.
uniqueId(), cell.
owner(), around_parent_cells_uid_to_owner[parent_uid]);
1918 parent_to_child_cells[parent_uid].add(cell);
1946 for (
Int64 parent_cell : cell_uid_to_create) {
1947 m_num_mng->cellUniqueIdsAroundCell(parent_cell, -1, cell_uids_around);
1948 for (
Int64 cell_uid : cell_uids_around) {
1954 if (around_parent_cells_uid_to_owner.contains(cell_uid))
1958 if (!uid_of_cells_needed.
contains(cell_uid)) {
1959 uid_of_cells_needed.
add(cell_uid);
1965 around_parent_cells_uid_is_in_subdomain[cell_uid] =
false;
1979 for (
Integer i = 0; i < uid_of_cells_needed_all_procs.
size(); ++i) {
1980 if (around_parent_cells_uid_to_owner.contains(uid_of_cells_needed_all_procs[i])) {
1981 owner_of_cells_needed_all_procs[i] = around_parent_cells_uid_to_owner[uid_of_cells_needed_all_procs[i]];
1985 owner_of_cells_needed_all_procs[i] = -1;
1991 pm->
reduce(Parallel::eReduceType::ReduceMax, owner_of_cells_needed_all_procs);
1995 Integer size_uid_of_cells_needed = uid_of_cells_needed.
size();
1996 Integer my_pos_in_all_procs_arrays = 0;
1999 pm->
allGather(av, size_uid_of_cells_needed_per_proc);
2002 for (
Integer i = 0; i < my_rank; ++i) {
2003 my_pos_in_all_procs_arrays += size_uid_of_cells_needed_per_proc[i];
2007 ArrayView<Int32> owner_of_cells_needed = owner_of_cells_needed_all_procs.
subView(my_pos_in_all_procs_arrays, size_uid_of_cells_needed);
2008 for (
Integer i = 0; i < size_uid_of_cells_needed; ++i) {
2009 around_parent_cells_uid_to_owner[uid_of_cells_needed[i]] = owner_of_cells_needed[i];
2013 if (owner_of_cells_needed[i] == -1) {
2014 ARCANE_FATAL(
"En déraffinement, c'est normalement impossible");
2020 if (m_mesh->dimension() == 2) {
2025 constexpr bool mask_face_if_cell_left[] = {
true,
true,
true,
false };
2026 constexpr bool mask_face_if_cell_bottom[] = {
false,
true,
true,
true };
2029 constexpr bool mask_node_if_cell_left[] = {
false,
true,
true,
false };
2030 constexpr bool mask_node_if_cell_bottom[] = {
false,
false,
true,
true };
2038 for (
Int64 parent_cell_uid : cell_uid_to_create) {
2040 m_num_mng->cellUniqueIdsAroundCell(parent_cell_uid, -1, cells_uid_around.
view());
2042 ConstArray2View owner_cells_around_parent_cell(owner_cells_around_parent_cell_1d.data(), 3, 3);
2044 ConstArray2View is_not_in_subdomain_cells_around_parent_cell(is_not_in_subdomain_cells_around_parent_cell_1d.data(), 3, 3);
2046 for (
Integer i = 0; i < 9; ++i) {
2047 Int64 uid_cell = cells_uid_around[i];
2050 if (uid_cell != -1 && around_parent_cells_uid_to_owner[uid_cell] != -1) {
2051 owner_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_owner[uid_cell];
2052 is_not_in_subdomain_cells_around_parent_cell_1d[i] = !around_parent_cells_uid_is_in_subdomain[uid_cell];
2055 cells_uid_around[i] = -1;
2056 owner_cells_around_parent_cell_1d[i] = -1;
2057 is_not_in_subdomain_cells_around_parent_cell_1d[i] =
true;
2064 auto is_cell_around_parent_cell_different_owner = [&](
const Integer y,
const Integer x) {
2065 return (owner_cells_around_parent_cell(y, x) != owner_cells_around_parent_cell(1, 1));
2068 auto is_cell_around_parent_cell_exist_and_different_owner = [&](
const Integer y,
const Integer x) {
2069 return (owner_cells_around_parent_cell(y, x) != -1 && (owner_cells_around_parent_cell(y, x) != owner_cells_around_parent_cell(1, 1)));
2080 m_num_mng->cellNodeUniqueIds(parent_cell_uid, -1, parent_nodes_uids);
2081 m_num_mng->cellFaceUniqueIds(parent_cell_uid, -1, parent_faces_uids);
2083 constexpr Integer type_cell = IT_Quad4;
2084 constexpr Integer type_face = IT_Line2;
2087 cells_infos.
add(type_cell);
2088 cells_infos.
add(parent_cell_uid);
2089 for (
Integer nc = 0; nc < m_num_mng->nbNodeByCell(); nc++) {
2090 cells_infos.
add(parent_nodes_uids[nc]);
2094 for (
Integer l = 0; l < m_num_mng->nbFaceByCell(); ++l) {
2101 (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)) &&
2102 (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))) {
2103 Integer parent_face_owner = -1;
2104 faces_infos.
add(type_face);
2105 faces_infos.
add(parent_faces_uids[l]);
2109 for (
Integer nc = l; nc < l + 2; nc++) {
2110 faces_infos.
add(parent_nodes_uids[nc % m_num_mng->nbNodeByCell()]);
2114 if ((!mask_face_if_cell_left[l]) && is_cell_around_parent_cell_exist_and_different_owner(1, 0)) {
2115 parent_face_owner = owner_cells_around_parent_cell(1, 0);
2117 else if ((!mask_face_if_cell_bottom[l]) && is_cell_around_parent_cell_exist_and_different_owner(0, 1)) {
2118 parent_face_owner = owner_cells_around_parent_cell(0, 1);
2121 parent_face_owner = owner_cells_around_parent_cell(1, 1);
2123 face_uid_to_owner[parent_faces_uids[l]] = parent_face_owner;
2135 for (
Integer l = 0; l < m_num_mng->nbNodeByCell(); ++l) {
2137 (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)) &&
2138 (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))) {
2139 Integer parent_node_owner = -1;
2140 nodes_infos.
add(parent_nodes_uids[l]);
2143 if ((!mask_node_if_cell_left[l])) {
2144 if ((!mask_node_if_cell_bottom[l])) {
2145 if (is_cell_around_parent_cell_exist_and_different_owner(0, 0)) {
2146 parent_node_owner = owner_cells_around_parent_cell(0, 0);
2148 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1)) {
2149 parent_node_owner = owner_cells_around_parent_cell(0, 1);
2151 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0)) {
2152 parent_node_owner = owner_cells_around_parent_cell(1, 0);
2155 parent_node_owner = owner_cells_around_parent_cell(1, 1);
2159 if (is_cell_around_parent_cell_exist_and_different_owner(1, 0)) {
2160 parent_node_owner = owner_cells_around_parent_cell(1, 0);
2163 parent_node_owner = owner_cells_around_parent_cell(1, 1);
2168 if ((!mask_node_if_cell_bottom[l])) {
2169 if (is_cell_around_parent_cell_exist_and_different_owner(0, 1)) {
2170 parent_node_owner = owner_cells_around_parent_cell(0, 1);
2172 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2)) {
2173 parent_node_owner = owner_cells_around_parent_cell(0, 2);
2176 parent_node_owner = owner_cells_around_parent_cell(1, 1);
2180 parent_node_owner = owner_cells_around_parent_cell(1, 1);
2184 node_uid_to_owner[parent_nodes_uids[l]] = parent_node_owner;
2194 else if (m_mesh->dimension() == 3) {
2198 constexpr bool mask_node_if_cell_left[] = {
false,
true,
true,
false,
false,
true,
true,
false };
2199 constexpr bool mask_node_if_cell_bottom[] = {
false,
false,
true,
true,
false,
false,
true,
true };
2200 constexpr bool mask_node_if_cell_rear[] = {
false,
false,
false,
false,
true,
true,
true,
true };
2202 constexpr bool mask_face_if_cell_left[] = {
true,
false,
true,
true,
true,
true };
2203 constexpr bool mask_face_if_cell_bottom[] = {
true,
true,
false,
true,
true,
true };
2204 constexpr bool mask_face_if_cell_rear[] = {
false,
true,
true,
true,
true,
true };
2213 constexpr Integer nodes_in_face_0[] = { 0, 1, 2, 3 };
2214 constexpr Integer nodes_in_face_1[] = { 0, 3, 7, 4 };
2215 constexpr Integer nodes_in_face_2[] = { 0, 1, 5, 4 };
2216 constexpr Integer nodes_in_face_3[] = { 4, 5, 6, 7 };
2217 constexpr Integer nodes_in_face_4[] = { 1, 2, 6, 5 };
2218 constexpr Integer nodes_in_face_5[] = { 3, 2, 6, 7 };
2220 constexpr Integer nb_nodes_in_face = 4;
2227 for (
Int64 parent_cell_uid : cell_uid_to_create) {
2229 m_num_mng->cellUniqueIdsAroundCell(parent_cell_uid, -1, cells_uid_around.
view());
2231 ConstArray3View owner_cells_around_parent_cell(owner_cells_around_parent_cell_1d.data(), 3, 3, 3);
2233 ConstArray3View is_not_in_subdomain_cells_around_parent_cell(is_not_in_subdomain_cells_around_parent_cell_1d.data(), 3, 3, 3);
2235 for (
Integer i = 0; i < 27; ++i) {
2236 Int64 uid_cell = cells_uid_around[i];
2239 if (uid_cell != -1 && around_parent_cells_uid_to_owner[uid_cell] != -1) {
2240 owner_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_owner[uid_cell];
2241 is_not_in_subdomain_cells_around_parent_cell_1d[i] = !around_parent_cells_uid_is_in_subdomain[uid_cell];
2244 cells_uid_around[i] = -1;
2245 owner_cells_around_parent_cell_1d[i] = -1;
2246 is_not_in_subdomain_cells_around_parent_cell_1d[i] =
true;
2253 auto is_cell_around_parent_cell_different_owner = [&](
const Integer z,
const Integer y,
const Integer x) {
2254 return (owner_cells_around_parent_cell(z, y, x) != owner_cells_around_parent_cell(1, 1, 1));
2257 auto is_cell_around_parent_cell_exist_and_different_owner = [&](
const Integer z,
const Integer y,
const Integer x) {
2258 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)));
2270 m_num_mng->cellNodeUniqueIds(parent_cell_uid, -1, parent_nodes_uids);
2271 m_num_mng->cellFaceUniqueIds(parent_cell_uid, -1, parent_faces_uids);
2273 constexpr Integer type_cell = IT_Hexaedron8;
2274 constexpr Integer type_face = IT_Quad4;
2277 cells_infos.
add(type_cell);
2278 cells_infos.
add(parent_cell_uid);
2279 for (
Integer nc = 0; nc < m_num_mng->nbNodeByCell(); nc++) {
2280 cells_infos.
add(parent_nodes_uids[nc]);
2284 for (
Integer l = 0; l < m_num_mng->nbFaceByCell(); ++l) {
2291 (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)) &&
2292 (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)) &&
2293 (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))) {
2294 Integer parent_face_owner = -1;
2295 faces_infos.
add(type_face);
2296 faces_infos.
add(parent_faces_uids[l]);
2322 for (
Integer nc : nodes_in_face_l) {
2323 faces_infos.
add(parent_nodes_uids[nc]);
2327 if ((!mask_face_if_cell_left[l]) && is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2328 parent_face_owner = owner_cells_around_parent_cell(1, 1, 0);
2330 else if ((!mask_face_if_cell_bottom[l]) && is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2331 parent_face_owner = owner_cells_around_parent_cell(1, 0, 1);
2333 else if ((!mask_face_if_cell_rear[l]) && is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2334 parent_face_owner = owner_cells_around_parent_cell(0, 1, 1);
2337 parent_face_owner = owner_cells_around_parent_cell(1, 1, 1);
2339 face_uid_to_owner[parent_faces_uids[l]] = parent_face_owner;
2351 for (
Integer l = 0; l < m_num_mng->nbNodeByCell(); ++l) {
2353 (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)) &&
2354 (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)) &&
2355 (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))) {
2356 Integer parent_node_owner = -1;
2357 nodes_infos.
add(parent_nodes_uids[l]);
2360 if ((!mask_node_if_cell_left[l])) {
2361 if ((!mask_node_if_cell_bottom[l])) {
2362 if ((!mask_node_if_cell_rear[l])) {
2364 if (is_cell_around_parent_cell_exist_and_different_owner(0, 0, 0)) {
2365 parent_node_owner = owner_cells_around_parent_cell(0, 0, 0);
2367 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 0, 1)) {
2368 parent_node_owner = owner_cells_around_parent_cell(0, 0, 1);
2370 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 0)) {
2371 parent_node_owner = owner_cells_around_parent_cell(0, 1, 0);
2373 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2374 parent_node_owner = owner_cells_around_parent_cell(0, 1, 1);
2376 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 0)) {
2377 parent_node_owner = owner_cells_around_parent_cell(1, 0, 0);
2379 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2380 parent_node_owner = owner_cells_around_parent_cell(1, 0, 1);
2382 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2383 parent_node_owner = owner_cells_around_parent_cell(1, 1, 0);
2386 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2390 if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 0)) {
2391 parent_node_owner = owner_cells_around_parent_cell(1, 0, 0);
2393 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2394 parent_node_owner = owner_cells_around_parent_cell(1, 0, 1);
2396 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2397 parent_node_owner = owner_cells_around_parent_cell(1, 1, 0);
2400 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2405 if ((!mask_node_if_cell_rear[l])) {
2406 if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 0)) {
2407 parent_node_owner = owner_cells_around_parent_cell(0, 1, 0);
2409 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2410 parent_node_owner = owner_cells_around_parent_cell(0, 1, 1);
2412 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2, 0)) {
2413 parent_node_owner = owner_cells_around_parent_cell(0, 2, 0);
2415 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2, 1)) {
2416 parent_node_owner = owner_cells_around_parent_cell(0, 2, 1);
2418 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2419 parent_node_owner = owner_cells_around_parent_cell(1, 1, 0);
2422 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2426 if (is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2427 parent_node_owner = owner_cells_around_parent_cell(1, 1, 0);
2430 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2436 if ((!mask_node_if_cell_bottom[l])) {
2437 if ((!mask_node_if_cell_rear[l])) {
2438 if (is_cell_around_parent_cell_exist_and_different_owner(0, 0, 1)) {
2439 parent_node_owner = owner_cells_around_parent_cell(0, 0, 1);
2441 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 0, 2)) {
2442 parent_node_owner = owner_cells_around_parent_cell(0, 0, 2);
2444 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2445 parent_node_owner = owner_cells_around_parent_cell(0, 1, 1);
2447 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 2)) {
2448 parent_node_owner = owner_cells_around_parent_cell(0, 1, 2);
2450 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2451 parent_node_owner = owner_cells_around_parent_cell(1, 0, 1);
2453 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 2)) {
2454 parent_node_owner = owner_cells_around_parent_cell(1, 0, 2);
2457 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2461 if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2462 parent_node_owner = owner_cells_around_parent_cell(1, 0, 1);
2464 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 2)) {
2465 parent_node_owner = owner_cells_around_parent_cell(1, 0, 2);
2468 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2473 if ((!mask_node_if_cell_rear[l])) {
2474 if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2475 parent_node_owner = owner_cells_around_parent_cell(0, 1, 1);
2477 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 2)) {
2478 parent_node_owner = owner_cells_around_parent_cell(0, 1, 2);
2480 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2, 1)) {
2481 parent_node_owner = owner_cells_around_parent_cell(0, 2, 1);
2483 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2, 2)) {
2484 parent_node_owner = owner_cells_around_parent_cell(0, 2, 2);
2487 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2491 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2496 node_uid_to_owner[parent_nodes_uids[l]] = parent_node_owner;
2512 debug() <<
"Nb new nodes in patch : " << total_nb_nodes;
2518 m_mesh->modifier()->addNodes(nodes_infos, nodes_lid);
2525 ENUMERATE_ (
Node, inode, m_mesh->nodeFamily()->view(nodes_lid)) {
2528 ARCANE_ASSERT((node_uid_to_owner.contains(node.
uniqueId())), (
"No owner found for node"));
2529 ARCANE_ASSERT((node_uid_to_owner[node.
uniqueId()] < nb_rank && node_uid_to_owner[node.
uniqueId()] >= 0), (
"Bad owner found for node"));
2533 if (node_uid_to_owner[node.
uniqueId()] == my_rank) {
2537 uid_child_nodes[index++] = m_num_mng->childNodeUniqueIdOfNode(node.
uniqueId(), -1);
2539 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(lid_child_nodes, uid_child_nodes,
false);
2543 ENUMERATE_ (
Node, inode, m_mesh->nodeFamily()->view(nodes_lid)) {
2544 const Int32 child_lid = lid_child_nodes[index++];
2545 if (child_lid == NULL_ITEM_ID) {
2549 Node child = nodes[child_lid];
2550 Node parent = *inode;
2552 m_mesh->modifier()->addParentNodeToNode(child, parent);
2553 m_mesh->modifier()->addChildNodeToNode(parent, child);
2557 m_mesh->nodeFamily()->notifyItemsOwnerChanged();
2562 debug() <<
"Nb new faces in patch : " << total_nb_faces;
2564 Integer nb_child = (m_mesh->dimension() == 2 ? 2 : 4);
2567 m_mesh->modifier()->addFaces(total_nb_faces, faces_infos, faces_lid);
2574 ENUMERATE_ (
Face, iface, m_mesh->faceFamily()->view(faces_lid)) {
2577 ARCANE_ASSERT((face_uid_to_owner.contains(face.
uniqueId())), (
"No owner found for face"));
2578 ARCANE_ASSERT((face_uid_to_owner[face.
uniqueId()] < nb_rank && face_uid_to_owner[face.
uniqueId()] >= 0), (
"Bad owner found for face"));
2582 if (face_uid_to_owner[face.
uniqueId()] == my_rank) {
2586 for (
Integer i = 0; i < nb_child; ++i) {
2587 uid_child_faces[index++] = m_num_mng->childFaceUniqueIdOfFace(face.
uniqueId(), -1, i);
2591 m_mesh->faceFamily()->itemsUniqueIdToLocalId(lid_child_faces, uid_child_faces,
false);
2595 ENUMERATE_ (
Face, iface, m_mesh->faceFamily()->view(faces_lid)) {
2596 for (
Integer i = 0; i < nb_child; ++i) {
2597 const Int32 child_lid = lid_child_faces[index++];
2598 if (child_lid == NULL_ITEM_ID) {
2602 Face child = faces[child_lid];
2603 Face parent = *iface;
2605 m_mesh->modifier()->addParentFaceToFace(child, parent);
2606 m_mesh->modifier()->addChildFaceToFace(parent, child);
2611 m_mesh->faceFamily()->notifyItemsOwnerChanged();
2617 debug() <<
"Nb new cells in patch : " << total_nb_cells;
2619 m_mesh->modifier()->addCells(total_nb_cells, cells_infos, cells_lid);
2623 for (
Integer i = 0; i < total_nb_cells; ++i) {
2624 Cell parent = cells[cells_lid[i]];
2632 if (around_parent_cells_uid_to_owner[parent.
uniqueId()] == my_rank) {
2638 for (
Cell child : parent_to_child_cells[parent.
uniqueId()]) {
2639 m_mesh->modifier()->addParentCellToCell(child, parent);
2640 m_mesh->modifier()->addChildCellToCell(parent, child);
2643 m_mesh->cellFamily()->notifyItemsOwnerChanged();
2646 m_mesh->modifier()->endUpdate();
2647 m_num_mng->updateFirstLevel();
2651 for (
Integer i = 0; i < total_nb_cells; ++i) {
2652 Cell parent_cell = cells[cells_lid[i]];
2653 m_num_mng->setParentNodeCoordinates(parent_cell);
2671 m_cmesh->_internalApi()->cartesianPatchGroup().updateLevelsAndAddGroundPatch();
2677 m_mesh->computeSynchronizeInfos();
2681 m_cmesh->computeDirections();