diff --git a/arcane/src/arcane/mesh/ItemsOwnerBuilder.cc b/arcane/src/arcane/mesh/ItemsOwnerBuilder.cc index 84b247479..dda8c1572 100644 --- a/arcane/src/arcane/mesh/ItemsOwnerBuilder.cc +++ b/arcane/src/arcane/mesh/ItemsOwnerBuilder.cc @@ -378,38 +378,49 @@ computeNodesOwner() node.mutableItemBase().setOwner(my_rank, my_rank); }); - // Parcours toutes les faces. - // Ne garde que celles qui sont frontières ou dont les propriétaires des - // deux mailles de part et d'autre sont différents de notre sous-domaine. - //UniqueArray faces_to_add; - //faces_map.eachItem([&](Face face) { - //Int32 nb_cell = face.nbCell(); - // if (nb_cell == 1) - // faces_to_add.add(face.localId()); - //}); - //info() << "ItemsOwnerBuilder: NB_FACE_TO_ADD=" << faces_to_add.size(); + // Parcours toutes les faces frontières et ajoute leurs noeuds + // à la liste des noeuds à traiter (nodes_to_add). Les faces frontières sont + // celles qui ne sont connectées qu'à une seule maille. + // qui connectées à une seule maille. const Int32 verbose_level = m_verbose_level; - // Ajoute tous les noeuds des faces frontières. + // Liste des noeuds à traiter + UniqueArray nodes_to_add; + + // Ensemble pour déterminer si un noeud a déjà été ajouté à \a nodes_to_add. std::unordered_set done_nodes; + const bool is_mono_dimension = m_mesh->meshKind().isMonoDimension(); + FaceInfoListView faces(m_mesh->faceFamily()); - UniqueArray nodes_to_add; - faces_map.eachItem([&](Face face) { - Int32 face_nb_cell = face.nbCell(); - if (face_nb_cell == 2) - return; - for (Node node : face.nodes()) { - Int32 node_id = node.localId(); - if (done_nodes.find(node_id) == done_nodes.end()) { - nodes_to_add.add(node_id); - done_nodes.insert(node_id); - node.mutableItemBase().setOwner(A_NULL_RANK, my_rank); + if (is_mono_dimension) { + faces_map.eachItem([&](Face face) { + Int32 face_nb_cell = face.nbCell(); + if (face_nb_cell == 2) + return; + for (Node node : face.nodes()) { + Int32 node_id = node.localId(); + if (done_nodes.find(node_id) == done_nodes.end()) { + nodes_to_add.add(node_id); + done_nodes.insert(node_id); + node.mutableItemBase().setOwner(A_NULL_RANK, my_rank); + } } + }); + } + else { + // Dans le cas de maillage multi-dimension, il n'y a pas actuellement + // de moyen simple de détecter les noeuds frontières. On traite donc tous + // les noeuds même si cela n'est pas optimal. + // NOTE: La détection n'est difficile que pour les noeuds connectés à des mailles + // de dimension 1 ou 2. Pour les mailles 3D, on pourrait n'ajouter que + // les noeuds connectées à une face n'ayant qu'une maille. + ENUMERATE_ (Node, inode, m_mesh->allNodes()) { + nodes_to_add.add(inode.itemLocalId()); } - }); + } - info() << "ItemsOwnerBuilder: NB_NODE_TO_ADD=" << nodes_to_add.size(); + info() << "ItemsOwnerBuilder: NB_NODE_TO_ADD=" << nodes_to_add.size() << " is_mono_dim=" << is_mono_dimension; NodeInfoListView nodes(&node_family); for (Int32 lid : nodes_to_add) { Node node(nodes[lid]); diff --git a/arcane/src/arcane/tests/CMakeLists.txt b/arcane/src/arcane/tests/CMakeLists.txt index ba05d5c3e..b3a8425a3 100644 --- a/arcane/src/arcane/tests/CMakeLists.txt +++ b/arcane/src/arcane/tests/CMakeLists.txt @@ -711,6 +711,7 @@ endif() arcane_add_test(mesh2_generate_edge_face_uid_env testMesh-2-env-generate-edge-face-uid.arc "-We,ARCANE_GENERATE_UNIQUE_ID_FROM_NODES,1" "-We,ARCANE_EDGE_UNIQUE_ID_BUILDER_VERSION,0") arcane_add_test_sequential(mesh2_sort_faces testMesh-2-sorted-faces.arc) arcane_add_test(mesh2_compute_owners_direct testMesh-2-compute-owners-direct.arc) +arcane_add_test(mesh2_compute_owners_direct_non_manifold testMesh-2-compute-owners-direct-non-manifold.arc) arcane_add_test_sequential(mesh2_init_nan testMesh-2.arc "-We,ARCANE_DATA_INIT_POLICY,NAN") arcane_add_test_sequential(mesh2_init_default testMesh-2.arc "-We,ARCANE_DATA_INIT_POLICY,DEFAULT" "-We,ARCANE_ITEMFAMILY_SHRINK_AFTER_ALLOCATE,1") arcane_add_test_sequential(mesh2_init_nan_and_default testMesh-2.arc "-We,ARCANE_DATA_INIT_POLICY,NAN_AND_DEFAULT") diff --git a/arcane/tests/testMesh-2-compute-owners-direct-non-manifold.arc b/arcane/tests/testMesh-2-compute-owners-direct-non-manifold.arc new file mode 100644 index 000000000..8df9d4cf7 --- /dev/null +++ b/arcane/tests/testMesh-2-compute-owners-direct-non-manifold.arc @@ -0,0 +1,26 @@ + + + + Test Maillage 1 + Test Maillage 1 + UnitTest + + + + + + mesh_with_loose_items.msh + 0 + non-manifold + + + + + + true + false + false + + + +