159void CartesianMeshAMRPatchMng::
170 cell_to_refine_internals.
add(cell);
171 if (cell.
level() > max_level)
172 max_level = cell.
level();
175 m_num_mng->prepareLevel(max_level + 1);
185 std::unordered_map<Int64, Int32> node_uid_to_owner;
186 std::unordered_map<Int64, Int32> face_uid_to_owner;
201 std::unordered_map<Int64, Integer> around_parent_cells_uid_to_owner;
202 std::unordered_map<Int64, Int32> around_parent_cells_uid_to_flags;
209 _shareInfosOfCellsAroundPatch(cell_to_refine_internals, around_parent_cells_uid_to_owner, around_parent_cells_uid_to_flags, useful_flags);
212 if (m_mesh->dimension() == 2) {
234 constexpr bool mask_node_if_cell_left[] = {
false,
true,
true,
false };
235 constexpr bool mask_node_if_cell_bottom[] = {
false,
false,
true,
true };
237 constexpr bool mask_node_if_cell_right[] = {
true,
false,
false,
true };
238 constexpr bool mask_node_if_cell_top[] = {
true,
true,
false,
false };
240 constexpr bool mask_face_if_cell_left[] = {
true,
true,
true,
false };
241 constexpr bool mask_face_if_cell_bottom[] = {
false,
true,
true,
true };
243 constexpr bool mask_face_if_cell_right[] = {
true,
false,
true,
true };
244 constexpr bool mask_face_if_cell_top[] = {
true,
true,
false,
true };
250 cells_infos.
reserve((cell_to_refine_internals.
size() * 4) * (2 + m_num_mng->nbNodeByCell()));
256 faces_infos.
reserve((cell_to_refine_internals.
size() * 12) * (2 + 2));
260 nodes_infos.
reserve(cell_to_refine_internals.
size() * 9);
266 for (
Cell parent_cell : cell_to_refine_internals) {
267 const Int64 parent_cell_uid = parent_cell.uniqueId();
268 const Int32 parent_cell_level = parent_cell.level();
269 const bool parent_cell_is_own = (parent_cell.owner() == my_rank);
271 const Int64 parent_coord_x = m_num_mng->cellUniqueIdToCoordX(parent_cell_uid, parent_cell_level);
272 const Int64 parent_coord_y = m_num_mng->cellUniqueIdToCoordY(parent_cell_uid, parent_cell_level);
274 const Int64 child_coord_x = m_num_mng->offsetLevelToLevel(parent_coord_x, parent_cell_level, parent_cell_level + 1);
275 const Int64 child_coord_y = m_num_mng->offsetLevelToLevel(parent_coord_y, parent_cell_level, parent_cell_level + 1);
277 const Integer pattern = m_num_mng->pattern();
279 m_num_mng->cellUniqueIdsAroundCell(uid_cells_around_parent_cell_1d.
view(), parent_cell);
281 for (
Integer i = 0; i < 9; ++i) {
282 Int64 uid_cell = uid_cells_around_parent_cell_1d[i];
285 if (uid_cell != -1 && around_parent_cells_uid_to_owner[uid_cell] != -1) {
286 owner_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_owner[uid_cell];
287 flags_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_flags[uid_cell];
290 uid_cells_around_parent_cell_1d[i] = -1;
291 owner_cells_around_parent_cell_1d[i] = -1;
292 flags_cells_around_parent_cell_1d[i] = 0;
297 ConstArray2View uid_cells_around_parent_cell(uid_cells_around_parent_cell_1d.data(), 3, 3);
298 ConstArray2View owner_cells_around_parent_cell(owner_cells_around_parent_cell_1d.data(), 3, 3);
299 ConstArray2View flags_cells_around_parent_cell(flags_cells_around_parent_cell_1d.data(), 3, 3);
370 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));
372 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));
373 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));
374 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));
378 auto is_cell_around_parent_cell_in_subdomain = [&](
const Integer y,
const Integer x) {
379 return is_cell_around_parent_cell_present_and_useful[y][x] && (flags_cells_around_parent_cell(y, x) &
ItemFlags::II_UserMark1);
383 auto is_cell_around_parent_cell_same_owner = [&](
const Integer y,
const Integer x) {
384 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));
388 auto is_cell_around_parent_cell_different_owner = [&](
const Integer y,
const Integer x) {
389 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));
393 for (
Int64 j = child_coord_y; j < child_coord_y + pattern; ++j) {
394 for (
Int64 i = child_coord_x; i < child_coord_x + pattern; ++i) {
395 parent_cells.
add(parent_cell);
398 const Int64 child_cell_uid = m_num_mng->cellUniqueId(parent_cell_level + 1, Int64x2(i, j));
401 m_num_mng->cellNodeUniqueIds(child_nodes_uids, parent_cell_level + 1, Int64x2(i, j));
402 m_num_mng->cellFaceUniqueIds(child_faces_uids, parent_cell_level + 1, Int64x2(i, j));
404 constexpr Integer type_cell = IT_Quad4;
405 constexpr Integer type_face = IT_Line2;
408 cells_infos.
add(type_cell);
409 cells_infos.
add(child_cell_uid);
410 for (
Integer nc = 0; nc < m_num_mng->nbNodeByCell(); nc++) {
411 cells_infos.
add(child_nodes_uids[nc]);
415 for (
Integer l = 0; l < m_num_mng->nbFaceByCell(); ++l) {
417 bool is_new_face =
false;
431 ((i == child_coord_x && !is_cell_around_parent_cell_in_subdomain(1, 0)) || (mask_face_if_cell_left[l])) &&
432 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 2)) || mask_face_if_cell_right[l]) &&
433 ((j == child_coord_y && !is_cell_around_parent_cell_in_subdomain(0, 1)) || (mask_face_if_cell_bottom[l])) &&
434 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(2, 1)) || mask_face_if_cell_top[l])) {
436 faces_infos.
add(type_face);
437 faces_infos.
add(child_faces_uids[l]);
441 for (
Integer nc = l; nc < l + 2; nc++) {
442 faces_infos.
add(child_nodes_uids[nc % m_num_mng->nbNodeByCell()]);
447 child_face_owner = owner_cells_around_parent_cell(1, 1);
458 ((i == child_coord_x && !is_cell_around_parent_cell_same_owner(1, 0)) || (mask_face_if_cell_left[l])) &&
459 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 2)) || mask_face_if_cell_right[l]) &&
460 ((j == child_coord_y && !is_cell_around_parent_cell_same_owner(0, 1)) || (mask_face_if_cell_bottom[l])) &&
461 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_same_owner(2, 1)) || mask_face_if_cell_top[l])) {
481 if (i == child_coord_x && (!mask_face_if_cell_left[l]) && is_cell_around_parent_cell_different_owner(1, 0)) {
482 child_face_owner = owner_cells_around_parent_cell(1, 0);
486 else if (j == child_coord_y && (!mask_face_if_cell_bottom[l]) && is_cell_around_parent_cell_different_owner(0, 1)) {
487 child_face_owner = owner_cells_around_parent_cell(0, 1);
494 child_face_owner = owner_cells_around_parent_cell(1, 1);
499 if (child_face_owner != -1) {
500 face_uid_to_owner[child_faces_uids[l]] = child_face_owner;
506 face_uid_change_owner_only.
add(child_faces_uids[l]);
528 for (
Integer l = 0; l < m_num_mng->nbNodeByCell(); ++l) {
530 bool is_new_node =
false;
544 ((i == child_coord_x && !is_cell_around_parent_cell_in_subdomain(1, 0)) || (mask_node_if_cell_left[l])) &&
545 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 2)) || mask_node_if_cell_right[l]) &&
546 ((j == child_coord_y && !is_cell_around_parent_cell_in_subdomain(0, 1)) || (mask_node_if_cell_bottom[l])) &&
547 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(2, 1)) || mask_node_if_cell_top[l])) {
549 nodes_infos.
add(child_nodes_uids[l]);
553 child_node_owner = owner_cells_around_parent_cell(1, 1);
564 ((i == child_coord_x && !is_cell_around_parent_cell_same_owner(1, 0)) || (mask_node_if_cell_left[l])) &&
565 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 2)) || mask_node_if_cell_right[l]) &&
566 ((j == child_coord_y && !is_cell_around_parent_cell_same_owner(0, 1)) || (mask_node_if_cell_bottom[l])) &&
567 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_same_owner(2, 1)) || mask_node_if_cell_top[l])) {
573 if (i == child_coord_x && (!mask_node_if_cell_left[l])) {
577 if (j == child_coord_y && (!mask_node_if_cell_bottom[l])) {
580 if (is_cell_around_parent_cell_different_owner(0, 0)) {
581 child_node_owner = owner_cells_around_parent_cell(0, 0);
585 else if (is_cell_around_parent_cell_different_owner(0, 1)) {
586 child_node_owner = owner_cells_around_parent_cell(0, 1);
590 else if (is_cell_around_parent_cell_different_owner(1, 0)) {
591 child_node_owner = owner_cells_around_parent_cell(1, 0);
595 child_node_owner = owner_cells_around_parent_cell(1, 1);
601 else if (j == (child_coord_y + pattern - 1) && (!mask_node_if_cell_top[l])) {
604 if (is_cell_around_parent_cell_different_owner(1, 0)) {
605 child_node_owner = owner_cells_around_parent_cell(1, 0);
610 child_node_owner = owner_cells_around_parent_cell(1, 1);
617 if (is_cell_around_parent_cell_different_owner(1, 0)) {
618 child_node_owner = owner_cells_around_parent_cell(1, 0);
623 child_node_owner = owner_cells_around_parent_cell(1, 1);
629 else if (i == (child_coord_x + pattern - 1) && (!mask_node_if_cell_right[l])) {
633 if (j == child_coord_y && (!mask_node_if_cell_bottom[l])) {
636 if (is_cell_around_parent_cell_different_owner(0, 1)) {
637 child_node_owner = owner_cells_around_parent_cell(0, 1);
641 else if (is_cell_around_parent_cell_different_owner(0, 2)) {
642 child_node_owner = owner_cells_around_parent_cell(0, 2);
647 child_node_owner = owner_cells_around_parent_cell(1, 1);
653 else if (j == (child_coord_y + pattern - 1) && (!mask_node_if_cell_top[l])) {
654 child_node_owner = owner_cells_around_parent_cell(1, 1);
659 child_node_owner = owner_cells_around_parent_cell(1, 1);
668 if (j == child_coord_y && (!mask_node_if_cell_bottom[l]) && is_cell_around_parent_cell_different_owner(0, 1)) {
669 child_node_owner = owner_cells_around_parent_cell(0, 1);
674 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)) {
675 child_node_owner = owner_cells_around_parent_cell(1, 1);
680 child_node_owner = owner_cells_around_parent_cell(1, 1);
686 if (child_node_owner != -1) {
687 node_uid_to_owner[child_nodes_uids[l]] = child_node_owner;
693 node_uid_change_owner_only.
add(child_nodes_uids[l]);
717 else if (m_mesh->dimension() == 3) {
739 constexpr bool mask_node_if_cell_left[] = {
false,
true,
true,
false,
false,
true,
true,
false };
740 constexpr bool mask_node_if_cell_bottom[] = {
false,
false,
true,
true,
false,
false,
true,
true };
741 constexpr bool mask_node_if_cell_rear[] = {
false,
false,
false,
false,
true,
true,
true,
true };
743 constexpr bool mask_node_if_cell_right[] = {
true,
false,
false,
true,
true,
false,
false,
true };
744 constexpr bool mask_node_if_cell_top[] = {
true,
true,
false,
false,
true,
true,
false,
false };
745 constexpr bool mask_node_if_cell_front[] = {
true,
true,
true,
true,
false,
false,
false,
false };
747 constexpr bool mask_face_if_cell_left[] = {
true,
false,
true,
true,
true,
true };
748 constexpr bool mask_face_if_cell_bottom[] = {
true,
true,
false,
true,
true,
true };
749 constexpr bool mask_face_if_cell_rear[] = {
false,
true,
true,
true,
true,
true };
751 constexpr bool mask_face_if_cell_right[] = {
true,
true,
true,
true,
false,
true };
752 constexpr bool mask_face_if_cell_top[] = {
true,
true,
true,
true,
true,
false };
753 constexpr bool mask_face_if_cell_front[] = {
true,
true,
true,
false,
true,
true };
762 constexpr Integer nodes_in_face_0[] = { 0, 1, 2, 3 };
763 constexpr Integer nodes_in_face_1[] = { 0, 3, 7, 4 };
764 constexpr Integer nodes_in_face_2[] = { 0, 1, 5, 4 };
765 constexpr Integer nodes_in_face_3[] = { 4, 5, 6, 7 };
766 constexpr Integer nodes_in_face_4[] = { 1, 2, 6, 5 };
767 constexpr Integer nodes_in_face_5[] = { 3, 2, 6, 7 };
769 constexpr Integer nb_nodes_in_face = 4;
775 cells_infos.
reserve((cell_to_refine_internals.
size() * 8) * (2 + m_num_mng->nbNodeByCell()));
781 faces_infos.
reserve((cell_to_refine_internals.
size() * 36) * (2 + 4));
785 nodes_infos.
reserve(cell_to_refine_internals.
size() * 27);
791 for (
Cell parent_cell : cell_to_refine_internals) {
792 const Int64 parent_cell_uid = parent_cell.uniqueId();
793 const Int32 parent_cell_level = parent_cell.level();
795 const Int64 parent_coord_x = m_num_mng->cellUniqueIdToCoordX(parent_cell_uid, parent_cell_level);
796 const Int64 parent_coord_y = m_num_mng->cellUniqueIdToCoordY(parent_cell_uid, parent_cell_level);
797 const Int64 parent_coord_z = m_num_mng->cellUniqueIdToCoordZ(parent_cell_uid, parent_cell_level);
799 const Int64 child_coord_x = m_num_mng->offsetLevelToLevel(parent_coord_x, parent_cell_level, parent_cell_level + 1);
800 const Int64 child_coord_y = m_num_mng->offsetLevelToLevel(parent_coord_y, parent_cell_level, parent_cell_level + 1);
801 const Int64 child_coord_z = m_num_mng->offsetLevelToLevel(parent_coord_z, parent_cell_level, parent_cell_level + 1);
803 const Integer pattern = m_num_mng->pattern();
805 m_num_mng->cellUniqueIdsAroundCell(uid_cells_around_parent_cell_1d.
view(), parent_cell);
807 for (
Integer i = 0; i < 27; ++i) {
808 Int64 uid_cell = uid_cells_around_parent_cell_1d[i];
811 if (uid_cell != -1 && around_parent_cells_uid_to_owner[uid_cell] != -1) {
812 owner_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_owner[uid_cell];
813 flags_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_flags[uid_cell];
816 uid_cells_around_parent_cell_1d[i] = -1;
817 owner_cells_around_parent_cell_1d[i] = -1;
818 flags_cells_around_parent_cell_1d[i] = 0;
823 ConstArray3View uid_cells_around_parent_cell(uid_cells_around_parent_cell_1d.data(), 3, 3, 3);
824 ConstArray3View owner_cells_around_parent_cell(owner_cells_around_parent_cell_1d.data(), 3, 3, 3);
825 ConstArray3View flags_cells_around_parent_cell(flags_cells_around_parent_cell_1d.data(), 3, 3, 3);
914 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));
916 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));
917 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));
918 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));
920 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));
921 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));
922 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));
923 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));
924 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));
925 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));
926 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));
927 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));
928 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));
932 auto is_cell_around_parent_cell_in_subdomain = [&](
const Integer z,
const Integer y,
const Integer x) {
933 return is_cell_around_parent_cell_present_and_useful[z][y][x] && (flags_cells_around_parent_cell(z, y, x) &
ItemFlags::II_UserMark1);
937 auto is_cell_around_parent_cell_same_owner = [&](
const Integer z,
const Integer y,
const Integer x) {
938 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));
942 auto is_cell_around_parent_cell_different_owner = [&](
const Integer z,
const Integer y,
const Integer x) {
943 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));
947 for (
Int64 k = child_coord_z; k < child_coord_z + pattern; ++k) {
948 for (
Int64 j = child_coord_y; j < child_coord_y + pattern; ++j) {
949 for (
Int64 i = child_coord_x; i < child_coord_x + pattern; ++i) {
950 parent_cells.
add(parent_cell);
953 const Int64 child_cell_uid = m_num_mng->cellUniqueId(parent_cell_level + 1, Int64x3(i, j, k));
956 m_num_mng->cellNodeUniqueIds(child_nodes_uids, parent_cell_level + 1, Int64x3(i, j, k));
957 m_num_mng->cellFaceUniqueIds(child_faces_uids, parent_cell_level + 1, Int64x3(i, j, k));
959 constexpr Integer type_cell = IT_Hexaedron8;
960 constexpr Integer type_face = IT_Quad4;
963 cells_infos.
add(type_cell);
964 cells_infos.
add(child_cell_uid);
965 for (
Integer nc = 0; nc < m_num_mng->nbNodeByCell(); nc++) {
966 cells_infos.
add(child_nodes_uids[nc]);
970 for (
Integer l = 0; l < m_num_mng->nbFaceByCell(); ++l) {
972 bool is_new_face =
false;
986 ((i == child_coord_x && !is_cell_around_parent_cell_in_subdomain(1, 1, 0)) || mask_face_if_cell_left[l]) &&
987 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 1, 2)) || mask_face_if_cell_right[l]) &&
988 ((j == child_coord_y && !is_cell_around_parent_cell_in_subdomain(1, 0, 1)) || mask_face_if_cell_bottom[l]) &&
989 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 2, 1)) || mask_face_if_cell_top[l]) &&
990 ((k == child_coord_z && !is_cell_around_parent_cell_in_subdomain(0, 1, 1)) || mask_face_if_cell_rear[l]) &&
991 ((k != (child_coord_z + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(2, 1, 1)) || mask_face_if_cell_front[l])) {
993 faces_infos.
add(type_face);
994 faces_infos.
add(child_faces_uids[l]);
1020 for (
Integer nc : nodes_in_face_l) {
1021 faces_infos.
add(child_nodes_uids[nc]);
1026 child_face_owner = owner_cells_around_parent_cell(1, 1, 1);
1037 ((i == child_coord_x && !is_cell_around_parent_cell_same_owner(1, 1, 0)) || mask_face_if_cell_left[l]) &&
1038 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 1, 2)) || mask_face_if_cell_right[l]) &&
1039 ((j == child_coord_y && !is_cell_around_parent_cell_same_owner(1, 0, 1)) || mask_face_if_cell_bottom[l]) &&
1040 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 2, 1)) || mask_face_if_cell_top[l]) &&
1041 ((k == child_coord_z && !is_cell_around_parent_cell_same_owner(0, 1, 1)) || mask_face_if_cell_rear[l]) &&
1042 ((k != (child_coord_z + pattern - 1) || !is_cell_around_parent_cell_same_owner(2, 1, 1)) || mask_face_if_cell_front[l])) {
1062 if (i == child_coord_x && (!mask_face_if_cell_left[l]) && is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1063 child_face_owner = owner_cells_around_parent_cell(1, 1, 0);
1067 else if (j == child_coord_y && (!mask_face_if_cell_bottom[l]) && is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1068 child_face_owner = owner_cells_around_parent_cell(1, 0, 1);
1072 else if (k == child_coord_z && (!mask_face_if_cell_rear[l]) && is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1073 child_face_owner = owner_cells_around_parent_cell(0, 1, 1);
1080 child_face_owner = owner_cells_around_parent_cell(1, 1, 1);
1085 if (child_face_owner != -1) {
1086 face_uid_to_owner[child_faces_uids[l]] = child_face_owner;
1092 face_uid_change_owner_only.
add(child_faces_uids[l]);
1116 for (
Integer l = 0; l < m_num_mng->nbNodeByCell(); ++l) {
1117 Integer child_node_owner = -1;
1118 bool is_new_node =
false;
1133 ((i == child_coord_x && !is_cell_around_parent_cell_in_subdomain(1, 1, 0)) || mask_node_if_cell_left[l]) &&
1134 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 1, 2)) || mask_node_if_cell_right[l]) &&
1135 ((j == child_coord_y && !is_cell_around_parent_cell_in_subdomain(1, 0, 1)) || mask_node_if_cell_bottom[l]) &&
1136 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(1, 2, 1)) || mask_node_if_cell_top[l]) &&
1137 ((k == child_coord_z && !is_cell_around_parent_cell_in_subdomain(0, 1, 1)) || mask_node_if_cell_rear[l]) &&
1138 ((k != (child_coord_z + pattern - 1) || !is_cell_around_parent_cell_in_subdomain(2, 1, 1)) || mask_node_if_cell_front[l])) {
1140 nodes_infos.
add(child_nodes_uids[l]);
1144 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1155 ((i == child_coord_x && !is_cell_around_parent_cell_same_owner(1, 1, 0)) || mask_node_if_cell_left[l]) &&
1156 ((i != (child_coord_x + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 1, 2)) || mask_node_if_cell_right[l]) &&
1157 ((j == child_coord_y && !is_cell_around_parent_cell_same_owner(1, 0, 1)) || mask_node_if_cell_bottom[l]) &&
1158 ((j != (child_coord_y + pattern - 1) || !is_cell_around_parent_cell_same_owner(1, 2, 1)) || mask_node_if_cell_top[l]) &&
1159 ((k == child_coord_z && !is_cell_around_parent_cell_same_owner(0, 1, 1)) || mask_node_if_cell_rear[l]) &&
1160 ((k != (child_coord_z + pattern - 1) || !is_cell_around_parent_cell_same_owner(2, 1, 1)) || mask_node_if_cell_front[l])) {
1166 if (i == child_coord_x && (!mask_node_if_cell_left[l])) {
1170 if (j == child_coord_y && (!mask_node_if_cell_bottom[l])) {
1174 if (k == child_coord_z && (!mask_node_if_cell_rear[l])) {
1177 if (is_cell_around_parent_cell_different_owner(0, 0, 0)) {
1178 child_node_owner = owner_cells_around_parent_cell(0, 0, 0);
1182 else if (is_cell_around_parent_cell_different_owner(0, 0, 1)) {
1183 child_node_owner = owner_cells_around_parent_cell(0, 0, 1);
1187 else if (is_cell_around_parent_cell_different_owner(0, 1, 0)) {
1188 child_node_owner = owner_cells_around_parent_cell(0, 1, 0);
1192 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1193 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1197 else if (is_cell_around_parent_cell_different_owner(1, 0, 0)) {
1198 child_node_owner = owner_cells_around_parent_cell(1, 0, 0);
1202 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1203 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1207 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1208 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1213 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1219 else if (k == (child_coord_z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1222 if (is_cell_around_parent_cell_different_owner(1, 0, 0)) {
1223 child_node_owner = owner_cells_around_parent_cell(1, 0, 0);
1227 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1228 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1232 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1233 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1238 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1246 if (is_cell_around_parent_cell_different_owner(1, 0, 0)) {
1247 child_node_owner = owner_cells_around_parent_cell(1, 0, 0);
1251 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1252 child_node_owner = owner_cells_around_parent_cell(1, 0, 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);
1269 else if (j == (child_coord_y + pattern - 1) && (!mask_node_if_cell_top[l])) {
1273 if (k == child_coord_z && (!mask_node_if_cell_rear[l])) {
1276 if (is_cell_around_parent_cell_different_owner(0, 1, 0)) {
1277 child_node_owner = owner_cells_around_parent_cell(0, 1, 0);
1281 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1282 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1286 else if (is_cell_around_parent_cell_different_owner(0, 2, 0)) {
1287 child_node_owner = owner_cells_around_parent_cell(0, 2, 0);
1291 else if (is_cell_around_parent_cell_different_owner(0, 2, 1)) {
1292 child_node_owner = owner_cells_around_parent_cell(0, 2, 1);
1296 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1297 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1302 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1308 else if (k == (child_coord_z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1311 if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1312 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1317 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1325 if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1326 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1331 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1340 if (k == child_coord_z && (!mask_node_if_cell_rear[l])) {
1343 if (is_cell_around_parent_cell_different_owner(0, 1, 0)) {
1344 child_node_owner = owner_cells_around_parent_cell(0, 1, 0);
1348 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1349 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1353 else if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1354 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1359 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1364 else if (k == (child_coord_z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1367 if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1368 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1373 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1381 if (is_cell_around_parent_cell_different_owner(1, 1, 0)) {
1382 child_node_owner = owner_cells_around_parent_cell(1, 1, 0);
1387 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1396 else if (i == (child_coord_x + pattern - 1) && (!mask_node_if_cell_right[l])) {
1400 if (j == child_coord_y && (!mask_node_if_cell_bottom[l])) {
1404 if (k == child_coord_z && (!mask_node_if_cell_rear[l])) {
1407 if (is_cell_around_parent_cell_different_owner(0, 0, 1)) {
1408 child_node_owner = owner_cells_around_parent_cell(0, 0, 1);
1412 else if (is_cell_around_parent_cell_different_owner(0, 0, 2)) {
1413 child_node_owner = owner_cells_around_parent_cell(0, 0, 2);
1417 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1418 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1422 else if (is_cell_around_parent_cell_different_owner(0, 1, 2)) {
1423 child_node_owner = owner_cells_around_parent_cell(0, 1, 2);
1427 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1428 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1432 else if (is_cell_around_parent_cell_different_owner(1, 0, 2)) {
1433 child_node_owner = owner_cells_around_parent_cell(1, 0, 2);
1438 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1444 else if (k == (child_coord_z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1447 if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1448 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1452 else if (is_cell_around_parent_cell_different_owner(1, 0, 2)) {
1453 child_node_owner = owner_cells_around_parent_cell(1, 0, 2);
1458 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1466 if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1467 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1471 else if (is_cell_around_parent_cell_different_owner(1, 0, 2)) {
1472 child_node_owner = owner_cells_around_parent_cell(1, 0, 2);
1477 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1484 else if (j == (child_coord_y + pattern - 1) && (!mask_node_if_cell_top[l])) {
1488 if (k == child_coord_z && (!mask_node_if_cell_rear[l])) {
1491 if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1492 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1496 else if (is_cell_around_parent_cell_different_owner(0, 1, 2)) {
1497 child_node_owner = owner_cells_around_parent_cell(0, 1, 2);
1501 else if (is_cell_around_parent_cell_different_owner(0, 2, 1)) {
1502 child_node_owner = owner_cells_around_parent_cell(0, 2, 1);
1506 else if (is_cell_around_parent_cell_different_owner(0, 2, 2)) {
1507 child_node_owner = owner_cells_around_parent_cell(0, 2, 2);
1512 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1518 else if (k == (child_coord_z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1519 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1524 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1531 if (k == child_coord_z && (!mask_node_if_cell_rear[l])) {
1534 if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1535 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1539 else if (is_cell_around_parent_cell_different_owner(0, 1, 2)) {
1540 child_node_owner = owner_cells_around_parent_cell(0, 1, 2);
1545 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1550 else if (k == (child_coord_z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1551 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1556 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1569 if (j == child_coord_y && (!mask_node_if_cell_bottom[l])) {
1573 if (k == child_coord_z && (!mask_node_if_cell_rear[l])) {
1576 if (is_cell_around_parent_cell_different_owner(0, 0, 1)) {
1577 child_node_owner = owner_cells_around_parent_cell(0, 0, 1);
1581 else if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1582 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1586 else if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1587 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1592 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1598 else if (k == (child_coord_z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1601 if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1602 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1607 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1615 if (is_cell_around_parent_cell_different_owner(1, 0, 1)) {
1616 child_node_owner = owner_cells_around_parent_cell(1, 0, 1);
1621 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1627 else if (j == (child_coord_y + pattern - 1) && (!mask_node_if_cell_top[l])) {
1631 if (k == child_coord_z && (!mask_node_if_cell_rear[l])) {
1634 if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1635 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1639 else if (is_cell_around_parent_cell_different_owner(0, 2, 1)) {
1640 child_node_owner = owner_cells_around_parent_cell(0, 2, 1);
1645 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1651 else if (k == (child_coord_z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1652 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1657 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1665 if (k == child_coord_z && (!mask_node_if_cell_rear[l])) {
1668 if (is_cell_around_parent_cell_different_owner(0, 1, 1)) {
1669 child_node_owner = owner_cells_around_parent_cell(0, 1, 1);
1674 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1679 else if (k == (child_coord_z + pattern - 1) && (!mask_node_if_cell_front[l])) {
1680 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1685 child_node_owner = owner_cells_around_parent_cell(1, 1, 1);
1692 if (child_node_owner != -1) {
1693 node_uid_to_owner[child_nodes_uids[l]] = child_node_owner;
1699 node_uid_change_owner_only.
add(child_nodes_uids[l]);
1730 debug() <<
"Nb new nodes in patch : " << total_nb_nodes;
1732 const Integer nb_node_owner_change = node_uid_change_owner_only.
size();
1739 m_mesh->modifier()->addNodes(nodes_infos, nodes_lid.
subView(0, total_nb_nodes));
1742 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(nodes_lid.
subView(total_nb_nodes, nb_node_owner_change), node_uid_change_owner_only,
true);
1749 ENUMERATE_ (
Node, inode, m_mesh->nodeFamily()->view(nodes_lid)) {
1753 if (node_uid_to_owner[node.
uniqueId()] == my_rank) {
1761 uid_child_nodes[index++] = m_num_mng->parentNodeUniqueIdOfNode(node.
uniqueId(), max_level + 1,
false);
1764 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(lid_child_nodes, uid_child_nodes,
false);
1768 ENUMERATE_ (
Node, inode, m_mesh->nodeFamily()->view(nodes_lid)) {
1769 const Int32 child_lid = lid_child_nodes[index++];
1770 if (child_lid == NULL_ITEM_ID) {
1774 Node parent = nodes[child_lid];
1775 Node child = *inode;
1777 m_mesh->modifier()->addParentNodeToNode(child, parent);
1778 m_mesh->modifier()->addChildNodeToNode(parent, child);
1781 m_mesh->nodeFamily()->notifyItemsOwnerChanged();
1786 debug() <<
"Nb new faces in patch : " << total_nb_faces;
1788 const Integer nb_face_owner_change = face_uid_change_owner_only.
size();
1795 m_mesh->modifier()->addFaces(total_nb_faces, faces_infos, faces_lid.
subView(0, total_nb_faces));
1798 m_mesh->faceFamily()->itemsUniqueIdToLocalId(faces_lid.
subView(total_nb_faces, nb_face_owner_change), face_uid_change_owner_only,
true);
1805 ENUMERATE_ (
Face, iface, m_mesh->faceFamily()->view(faces_lid)) {
1809 if (face_uid_to_owner[face.
uniqueId()] == my_rank) {
1817 uid_parent_faces[index++] = m_num_mng->parentFaceUniqueIdOfFace(face.
uniqueId(), max_level + 1,
false);
1821 m_mesh->faceFamily()->itemsUniqueIdToLocalId(lid_parent_faces, uid_parent_faces,
false);
1825 ENUMERATE_ (
Face, iface, m_mesh->faceFamily()->view(faces_lid)) {
1826 const Int32 child_lid = lid_parent_faces[index++];
1827 if (child_lid == NULL_ITEM_ID) {
1831 Face parent = faces[child_lid];
1832 Face child = *iface;
1834 m_mesh->modifier()->addParentFaceToFace(child, parent);
1835 m_mesh->modifier()->addChildFaceToFace(parent, child);
1838 m_mesh->faceFamily()->notifyItemsOwnerChanged();
1843 debug() <<
"Nb new cells in patch : " << total_nb_cells;
1846 m_mesh->modifier()->addCells(total_nb_cells, cells_infos, cells_lid);
1850 for (
Integer i = 0; i < total_nb_cells; ++i) {
1851 Cell child = cells[cells_lid[i]];
1857 if (parent_cells[i].owner() == my_rank) {
1865 m_mesh->modifier()->addParentCellToCell(child, parent_cells[i]);
1866 m_mesh->modifier()->addChildCellToCell(parent_cells[i], child);
1870 for (
Cell cell : cell_to_refine_internals) {
1874 m_mesh->cellFamily()->notifyItemsOwnerChanged();
1877 m_mesh->modifier()->endUpdate();
1880 for (
Cell parent_cell : cell_to_refine_internals) {
1881 m_num_mng->setChildNodeCoordinates(parent_cell);
1884 for (
Integer i = 0; i < parent_cell.nbHChildren(); ++i) {
1902 m_mesh->computeSynchronizeInfos();
1940void CartesianMeshAMRPatchMng::
1950 std::unordered_map<Int64, Int32> around_parent_cells_uid_to_owner;
1951 std::unordered_map<Int64, bool> around_parent_cells_uid_is_in_subdomain;
1952 std::unordered_map<Int64, UniqueArray<Cell>> parent_to_child_cells;
1954 std::unordered_map<Int64, Int32> node_uid_to_owner;
1955 std::unordered_map<Int64, Int32> face_uid_to_owner;
1960 m_num_mng->prepareLevel(-1);
1992 Int64 parent_uid = m_num_mng->parentCellUniqueIdOfCell(cell);
1995 if (!cell_uid_to_create.
contains(parent_uid)) {
1996 cell_uid_to_create.
add(parent_uid);
1999 around_parent_cells_uid_to_owner[parent_uid] = cell.
owner();
2000 around_parent_cells_uid_is_in_subdomain[parent_uid] =
true;
2004 if (around_parent_cells_uid_to_owner[parent_uid] != cell.
owner()) {
2011 parent_to_child_cells[parent_uid].add(cell);
2039 for (
Int64 parent_cell : cell_uid_to_create) {
2040 m_num_mng->cellUniqueIdsAroundCell(cell_uids_around, parent_cell, -1);
2041 for (
Int64 cell_uid : cell_uids_around) {
2048 if (around_parent_cells_uid_to_owner.find(cell_uid) != around_parent_cells_uid_to_owner.end())
2052 if (!uid_of_cells_needed.
contains(cell_uid)) {
2053 uid_of_cells_needed.
add(cell_uid);
2059 around_parent_cells_uid_is_in_subdomain[cell_uid] =
false;
2073 for (
Integer i = 0; i < uid_of_cells_needed_all_procs.
size(); ++i) {
2074 if (around_parent_cells_uid_to_owner.find(uid_of_cells_needed_all_procs[i]) != around_parent_cells_uid_to_owner.end()) {
2075 owner_of_cells_needed_all_procs[i] = around_parent_cells_uid_to_owner[uid_of_cells_needed_all_procs[i]];
2079 owner_of_cells_needed_all_procs[i] = -1;
2085 pm->
reduce(Parallel::eReduceType::ReduceMax, owner_of_cells_needed_all_procs);
2089 Integer size_uid_of_cells_needed = uid_of_cells_needed.
size();
2090 Integer my_pos_in_all_procs_arrays = 0;
2093 pm->
allGather(av, size_uid_of_cells_needed_per_proc);
2096 for (
Integer i = 0; i < my_rank; ++i) {
2097 my_pos_in_all_procs_arrays += size_uid_of_cells_needed_per_proc[i];
2101 ArrayView<Int32> owner_of_cells_needed = owner_of_cells_needed_all_procs.
subView(my_pos_in_all_procs_arrays, size_uid_of_cells_needed);
2102 for (
Integer i = 0; i < size_uid_of_cells_needed; ++i) {
2103 around_parent_cells_uid_to_owner[uid_of_cells_needed[i]] = owner_of_cells_needed[i];
2107 if (owner_of_cells_needed[i] == -1) {
2108 ARCANE_FATAL(
"En déraffinement, c'est normalement impossible");
2114 if (m_mesh->dimension() == 2) {
2119 constexpr bool mask_face_if_cell_left[] = {
true,
true,
true,
false };
2120 constexpr bool mask_face_if_cell_bottom[] = {
false,
true,
true,
true };
2123 constexpr bool mask_node_if_cell_left[] = {
false,
true,
true,
false };
2124 constexpr bool mask_node_if_cell_bottom[] = {
false,
false,
true,
true };
2132 for (
Int64 parent_cell_uid : cell_uid_to_create) {
2134 m_num_mng->cellUniqueIdsAroundCell(cells_uid_around.
view(), parent_cell_uid, -1);
2136 ConstArray2View owner_cells_around_parent_cell(owner_cells_around_parent_cell_1d.data(), 3, 3);
2138 ConstArray2View is_not_in_subdomain_cells_around_parent_cell(is_not_in_subdomain_cells_around_parent_cell_1d.data(), 3, 3);
2140 for (
Integer i = 0; i < 9; ++i) {
2141 Int64 uid_cell = cells_uid_around[i];
2144 if (uid_cell != -1 && around_parent_cells_uid_to_owner[uid_cell] != -1) {
2145 owner_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_owner[uid_cell];
2146 is_not_in_subdomain_cells_around_parent_cell_1d[i] = !around_parent_cells_uid_is_in_subdomain[uid_cell];
2149 cells_uid_around[i] = -1;
2150 owner_cells_around_parent_cell_1d[i] = -1;
2151 is_not_in_subdomain_cells_around_parent_cell_1d[i] =
true;
2158 auto is_cell_around_parent_cell_different_owner = [&](
const Integer y,
const Integer x) {
2159 return (owner_cells_around_parent_cell(y, x) != owner_cells_around_parent_cell(1, 1));
2162 auto is_cell_around_parent_cell_exist_and_different_owner = [&](
const Integer y,
const Integer x) {
2163 return (owner_cells_around_parent_cell(y, x) != -1 && (owner_cells_around_parent_cell(y, x) != owner_cells_around_parent_cell(1, 1)));
2174 m_num_mng->cellNodeUniqueIds(parent_nodes_uids, -1, parent_cell_uid);
2175 m_num_mng->cellFaceUniqueIds(parent_faces_uids, -1, parent_cell_uid);
2177 constexpr Integer type_cell = IT_Quad4;
2178 constexpr Integer type_face = IT_Line2;
2181 cells_infos.
add(type_cell);
2182 cells_infos.
add(parent_cell_uid);
2183 for (
Integer nc = 0; nc < m_num_mng->nbNodeByCell(); nc++) {
2184 cells_infos.
add(parent_nodes_uids[nc]);
2188 for (
Integer l = 0; l < m_num_mng->nbFaceByCell(); ++l) {
2195 (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)) &&
2196 (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))) {
2197 Integer parent_face_owner = -1;
2198 faces_infos.
add(type_face);
2199 faces_infos.
add(parent_faces_uids[l]);
2203 for (
Integer nc = l; nc < l + 2; nc++) {
2204 faces_infos.
add(parent_nodes_uids[nc % m_num_mng->nbNodeByCell()]);
2208 if ((!mask_face_if_cell_left[l]) && is_cell_around_parent_cell_exist_and_different_owner(1, 0)) {
2209 parent_face_owner = owner_cells_around_parent_cell(1, 0);
2211 else if ((!mask_face_if_cell_bottom[l]) && is_cell_around_parent_cell_exist_and_different_owner(0, 1)) {
2212 parent_face_owner = owner_cells_around_parent_cell(0, 1);
2215 parent_face_owner = owner_cells_around_parent_cell(1, 1);
2217 face_uid_to_owner[parent_faces_uids[l]] = parent_face_owner;
2229 for (
Integer l = 0; l < m_num_mng->nbNodeByCell(); ++l) {
2231 (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)) &&
2232 (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))) {
2233 Integer parent_node_owner = -1;
2234 nodes_infos.
add(parent_nodes_uids[l]);
2237 if ((!mask_node_if_cell_left[l])) {
2238 if ((!mask_node_if_cell_bottom[l])) {
2239 if (is_cell_around_parent_cell_exist_and_different_owner(0, 0)) {
2240 parent_node_owner = owner_cells_around_parent_cell(0, 0);
2242 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1)) {
2243 parent_node_owner = owner_cells_around_parent_cell(0, 1);
2245 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0)) {
2246 parent_node_owner = owner_cells_around_parent_cell(1, 0);
2249 parent_node_owner = owner_cells_around_parent_cell(1, 1);
2253 if (is_cell_around_parent_cell_exist_and_different_owner(1, 0)) {
2254 parent_node_owner = owner_cells_around_parent_cell(1, 0);
2257 parent_node_owner = owner_cells_around_parent_cell(1, 1);
2262 if ((!mask_node_if_cell_bottom[l])) {
2263 if (is_cell_around_parent_cell_exist_and_different_owner(0, 1)) {
2264 parent_node_owner = owner_cells_around_parent_cell(0, 1);
2266 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2)) {
2267 parent_node_owner = owner_cells_around_parent_cell(0, 2);
2270 parent_node_owner = owner_cells_around_parent_cell(1, 1);
2274 parent_node_owner = owner_cells_around_parent_cell(1, 1);
2278 node_uid_to_owner[parent_nodes_uids[l]] = parent_node_owner;
2288 else if (m_mesh->dimension() == 3) {
2292 constexpr bool mask_node_if_cell_left[] = {
false,
true,
true,
false,
false,
true,
true,
false };
2293 constexpr bool mask_node_if_cell_bottom[] = {
false,
false,
true,
true,
false,
false,
true,
true };
2294 constexpr bool mask_node_if_cell_rear[] = {
false,
false,
false,
false,
true,
true,
true,
true };
2296 constexpr bool mask_face_if_cell_left[] = {
true,
false,
true,
true,
true,
true };
2297 constexpr bool mask_face_if_cell_bottom[] = {
true,
true,
false,
true,
true,
true };
2298 constexpr bool mask_face_if_cell_rear[] = {
false,
true,
true,
true,
true,
true };
2307 constexpr Integer nodes_in_face_0[] = { 0, 1, 2, 3 };
2308 constexpr Integer nodes_in_face_1[] = { 0, 3, 7, 4 };
2309 constexpr Integer nodes_in_face_2[] = { 0, 1, 5, 4 };
2310 constexpr Integer nodes_in_face_3[] = { 4, 5, 6, 7 };
2311 constexpr Integer nodes_in_face_4[] = { 1, 2, 6, 5 };
2312 constexpr Integer nodes_in_face_5[] = { 3, 2, 6, 7 };
2314 constexpr Integer nb_nodes_in_face = 4;
2321 for (
Int64 parent_cell_uid : cell_uid_to_create) {
2323 m_num_mng->cellUniqueIdsAroundCell(cells_uid_around.
view(), parent_cell_uid, -1);
2325 ConstArray3View owner_cells_around_parent_cell(owner_cells_around_parent_cell_1d.data(), 3, 3, 3);
2327 ConstArray3View is_not_in_subdomain_cells_around_parent_cell(is_not_in_subdomain_cells_around_parent_cell_1d.data(), 3, 3, 3);
2329 for (
Integer i = 0; i < 27; ++i) {
2330 Int64 uid_cell = cells_uid_around[i];
2333 if (uid_cell != -1 && around_parent_cells_uid_to_owner[uid_cell] != -1) {
2334 owner_cells_around_parent_cell_1d[i] = around_parent_cells_uid_to_owner[uid_cell];
2335 is_not_in_subdomain_cells_around_parent_cell_1d[i] = !around_parent_cells_uid_is_in_subdomain[uid_cell];
2338 cells_uid_around[i] = -1;
2339 owner_cells_around_parent_cell_1d[i] = -1;
2340 is_not_in_subdomain_cells_around_parent_cell_1d[i] =
true;
2347 auto is_cell_around_parent_cell_different_owner = [&](
const Integer z,
const Integer y,
const Integer x) {
2348 return (owner_cells_around_parent_cell(z, y, x) != owner_cells_around_parent_cell(1, 1, 1));
2351 auto is_cell_around_parent_cell_exist_and_different_owner = [&](
const Integer z,
const Integer y,
const Integer x) {
2352 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)));
2364 m_num_mng->cellNodeUniqueIds(parent_nodes_uids, -1, parent_cell_uid);
2365 m_num_mng->cellFaceUniqueIds(parent_faces_uids, -1, parent_cell_uid);
2367 constexpr Integer type_cell = IT_Hexaedron8;
2368 constexpr Integer type_face = IT_Quad4;
2371 cells_infos.
add(type_cell);
2372 cells_infos.
add(parent_cell_uid);
2373 for (
Integer nc = 0; nc < m_num_mng->nbNodeByCell(); nc++) {
2374 cells_infos.
add(parent_nodes_uids[nc]);
2378 for (
Integer l = 0; l < m_num_mng->nbFaceByCell(); ++l) {
2385 (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)) &&
2386 (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)) &&
2387 (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))) {
2388 Integer parent_face_owner = -1;
2389 faces_infos.
add(type_face);
2390 faces_infos.
add(parent_faces_uids[l]);
2416 for (
Integer nc : nodes_in_face_l) {
2417 faces_infos.
add(parent_nodes_uids[nc]);
2421 if ((!mask_face_if_cell_left[l]) && is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2422 parent_face_owner = owner_cells_around_parent_cell(1, 1, 0);
2424 else if ((!mask_face_if_cell_bottom[l]) && is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2425 parent_face_owner = owner_cells_around_parent_cell(1, 0, 1);
2427 else if ((!mask_face_if_cell_rear[l]) && is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2428 parent_face_owner = owner_cells_around_parent_cell(0, 1, 1);
2431 parent_face_owner = owner_cells_around_parent_cell(1, 1, 1);
2433 face_uid_to_owner[parent_faces_uids[l]] = parent_face_owner;
2445 for (
Integer l = 0; l < m_num_mng->nbNodeByCell(); ++l) {
2447 (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)) &&
2448 (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)) &&
2449 (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))) {
2450 Integer parent_node_owner = -1;
2451 nodes_infos.
add(parent_nodes_uids[l]);
2454 if ((!mask_node_if_cell_left[l])) {
2455 if ((!mask_node_if_cell_bottom[l])) {
2456 if ((!mask_node_if_cell_rear[l])) {
2458 if (is_cell_around_parent_cell_exist_and_different_owner(0, 0, 0)) {
2459 parent_node_owner = owner_cells_around_parent_cell(0, 0, 0);
2461 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 0, 1)) {
2462 parent_node_owner = owner_cells_around_parent_cell(0, 0, 1);
2464 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 0)) {
2465 parent_node_owner = owner_cells_around_parent_cell(0, 1, 0);
2467 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2468 parent_node_owner = owner_cells_around_parent_cell(0, 1, 1);
2470 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 0)) {
2471 parent_node_owner = owner_cells_around_parent_cell(1, 0, 0);
2473 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2474 parent_node_owner = owner_cells_around_parent_cell(1, 0, 1);
2476 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2477 parent_node_owner = owner_cells_around_parent_cell(1, 1, 0);
2480 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2484 if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 0)) {
2485 parent_node_owner = owner_cells_around_parent_cell(1, 0, 0);
2487 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2488 parent_node_owner = owner_cells_around_parent_cell(1, 0, 1);
2490 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2491 parent_node_owner = owner_cells_around_parent_cell(1, 1, 0);
2494 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2499 if ((!mask_node_if_cell_rear[l])) {
2500 if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 0)) {
2501 parent_node_owner = owner_cells_around_parent_cell(0, 1, 0);
2503 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2504 parent_node_owner = owner_cells_around_parent_cell(0, 1, 1);
2506 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2, 0)) {
2507 parent_node_owner = owner_cells_around_parent_cell(0, 2, 0);
2509 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2, 1)) {
2510 parent_node_owner = owner_cells_around_parent_cell(0, 2, 1);
2512 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2513 parent_node_owner = owner_cells_around_parent_cell(1, 1, 0);
2516 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2520 if (is_cell_around_parent_cell_exist_and_different_owner(1, 1, 0)) {
2521 parent_node_owner = owner_cells_around_parent_cell(1, 1, 0);
2524 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2530 if ((!mask_node_if_cell_bottom[l])) {
2531 if ((!mask_node_if_cell_rear[l])) {
2532 if (is_cell_around_parent_cell_exist_and_different_owner(0, 0, 1)) {
2533 parent_node_owner = owner_cells_around_parent_cell(0, 0, 1);
2535 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 0, 2)) {
2536 parent_node_owner = owner_cells_around_parent_cell(0, 0, 2);
2538 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2539 parent_node_owner = owner_cells_around_parent_cell(0, 1, 1);
2541 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 2)) {
2542 parent_node_owner = owner_cells_around_parent_cell(0, 1, 2);
2544 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2545 parent_node_owner = owner_cells_around_parent_cell(1, 0, 1);
2547 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 2)) {
2548 parent_node_owner = owner_cells_around_parent_cell(1, 0, 2);
2551 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2555 if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 1)) {
2556 parent_node_owner = owner_cells_around_parent_cell(1, 0, 1);
2558 else if (is_cell_around_parent_cell_exist_and_different_owner(1, 0, 2)) {
2559 parent_node_owner = owner_cells_around_parent_cell(1, 0, 2);
2562 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2567 if ((!mask_node_if_cell_rear[l])) {
2568 if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 1)) {
2569 parent_node_owner = owner_cells_around_parent_cell(0, 1, 1);
2571 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 1, 2)) {
2572 parent_node_owner = owner_cells_around_parent_cell(0, 1, 2);
2574 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2, 1)) {
2575 parent_node_owner = owner_cells_around_parent_cell(0, 2, 1);
2577 else if (is_cell_around_parent_cell_exist_and_different_owner(0, 2, 2)) {
2578 parent_node_owner = owner_cells_around_parent_cell(0, 2, 2);
2581 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2585 parent_node_owner = owner_cells_around_parent_cell(1, 1, 1);
2590 node_uid_to_owner[parent_nodes_uids[l]] = parent_node_owner;
2606 debug() <<
"Nb new nodes in patch : " << total_nb_nodes;
2612 m_mesh->modifier()->addNodes(nodes_infos, nodes_lid);
2619 ENUMERATE_ (
Node, inode, m_mesh->nodeFamily()->view(nodes_lid)) {
2622 ARCANE_ASSERT((node_uid_to_owner.find(node.
uniqueId()) != node_uid_to_owner.end()), (
"No owner found for node"));
2623 ARCANE_ASSERT((node_uid_to_owner[node.
uniqueId()] < nb_rank && node_uid_to_owner[node.
uniqueId()] >= 0), (
"Bad owner found for node"));
2627 if (node_uid_to_owner[node.
uniqueId()] == my_rank) {
2631 uid_child_nodes[index++] = m_num_mng->childNodeUniqueIdOfNode(node.
uniqueId(), -1);
2633 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(lid_child_nodes, uid_child_nodes,
false);
2637 ENUMERATE_ (
Node, inode, m_mesh->nodeFamily()->view(nodes_lid)) {
2638 const Int32 child_lid = lid_child_nodes[index++];
2639 if (child_lid == NULL_ITEM_ID) {
2643 Node child = nodes[child_lid];
2644 Node parent = *inode;
2646 m_mesh->modifier()->addParentNodeToNode(child, parent);
2647 m_mesh->modifier()->addChildNodeToNode(parent, child);
2651 m_mesh->nodeFamily()->notifyItemsOwnerChanged();
2656 debug() <<
"Nb new faces in patch : " << total_nb_faces;
2658 Integer nb_child = (m_mesh->dimension() == 2 ? 2 : 4);
2661 m_mesh->modifier()->addFaces(total_nb_faces, faces_infos, faces_lid);
2668 ENUMERATE_ (
Face, iface, m_mesh->faceFamily()->view(faces_lid)) {
2671 ARCANE_ASSERT((face_uid_to_owner.find(face.
uniqueId()) != face_uid_to_owner.end()), (
"No owner found for face"));
2672 ARCANE_ASSERT((face_uid_to_owner[face.
uniqueId()] < nb_rank && face_uid_to_owner[face.
uniqueId()] >= 0), (
"Bad owner found for face"));
2676 if (face_uid_to_owner[face.
uniqueId()] == my_rank) {
2680 for (
Integer i = 0; i < nb_child; ++i) {
2681 uid_child_faces[index++] = m_num_mng->childFaceUniqueIdOfFace(face.
uniqueId(), -1, i);
2685 m_mesh->faceFamily()->itemsUniqueIdToLocalId(lid_child_faces, uid_child_faces,
false);
2689 ENUMERATE_ (
Face, iface, m_mesh->faceFamily()->view(faces_lid)) {
2690 for (
Integer i = 0; i < nb_child; ++i) {
2691 const Int32 child_lid = lid_child_faces[index++];
2692 if (child_lid == NULL_ITEM_ID) {
2696 Face child = faces[child_lid];
2697 Face parent = *iface;
2699 m_mesh->modifier()->addParentFaceToFace(child, parent);
2700 m_mesh->modifier()->addChildFaceToFace(parent, child);
2705 m_mesh->faceFamily()->notifyItemsOwnerChanged();
2711 debug() <<
"Nb new cells in patch : " << total_nb_cells;
2713 m_mesh->modifier()->addCells(total_nb_cells, cells_infos, cells_lid);
2717 for (
Integer i = 0; i < total_nb_cells; ++i) {
2718 Cell parent = cells[cells_lid[i]];
2726 if (around_parent_cells_uid_to_owner[parent.
uniqueId()] == my_rank) {
2732 for (
Cell child : parent_to_child_cells[parent.
uniqueId()]) {
2733 m_mesh->modifier()->addParentCellToCell(child, parent);
2734 m_mesh->modifier()->addChildCellToCell(parent, child);
2737 m_mesh->cellFamily()->notifyItemsOwnerChanged();
2740 m_mesh->modifier()->endUpdate();
2741 m_num_mng->updateFirstLevel();
2745 for (
Integer i = 0; i < total_nb_cells; ++i) {
2746 Cell parent_cell = cells[cells_lid[i]];
2747 m_num_mng->setParentNodeCoordinates(parent_cell);
2766 CellGroup parent_cells = m_mesh->allLevelCells(0);
2767 m_cmesh->_internalApi()->addPatchFromExistingChildren(parent_cells.
view().
localIds());
2774 m_mesh->computeSynchronizeInfos();
2778 m_cmesh->computeDirections();