Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 35 additions & 24 deletions arcane/src/arcane/mesh/ItemsOwnerBuilder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<Int32> 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<Int32> nodes_to_add;

// Ensemble pour déterminer si un noeud a déjà été ajouté à \a nodes_to_add.
std::unordered_set<Int32> done_nodes;

const bool is_mono_dimension = m_mesh->meshKind().isMonoDimension();

FaceInfoListView faces(m_mesh->faceFamily());
UniqueArray<Int32> 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]);
Expand Down
1 change: 1 addition & 0 deletions arcane/src/arcane/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
26 changes: 26 additions & 0 deletions arcane/tests/testMesh-2-compute-owners-direct-non-manifold.arc
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?xml version="1.0" ?>
<cas codename="ArcaneTest" xml:lang="fr" codeversion="1.0">
<arcane>
<titre>Test Maillage 1</titre>
<description>Test Maillage 1</description>
<boucle-en-temps>UnitTest</boucle-en-temps>
</arcane>

<meshes>
<mesh>
<!-- <maillage nb-ghostlayer='0' ghostlayer-builder-version="3"> -->
<filename>mesh_with_loose_items.msh</filename>
<nb-ghost-layer>0</nb-ghost-layer>
<cell-dimension-kind>non-manifold</cell-dimension-kind>
</mesh>
</meshes>

<module-test-unitaire>
<test name="MeshUnitTest">
<compute-owners-direct>true</compute-owners-direct>
<test-adjacence>false</test-adjacence>
<ecrire-maillage>false</ecrire-maillage>
</test>
</module-test-unitaire>

</cas>
Loading