Skip to content

Commit 42b1e48

Browse files
Merge pull request #2005 from arcaneframework/dev/vp-basic-mesh-subdivider-service
Improve the Basic Mesh Subdivider. Fixed collisions during refinement by modifying the unique id generation function. Added tests for 2D.
2 parents dddaeae + fb115a4 commit 42b1e48

10 files changed

+98
-21
lines changed

arcane/src/arcane/core/MeshUtils.cc

+2-6
Original file line numberDiff line numberDiff line change
@@ -1931,9 +1931,7 @@ fillUniqueIds(ItemVectorView items,Array<Int64>& uids)
19311931
Int64 MeshUtils::
19321932
generateHashUniqueId(SmallSpan<const Int64> nodes_unique_id)
19331933
{
1934-
// Prend les 30 premiers bits du premier nœud pour former
1935-
// les 30 premiers bits de la fonction de hash.
1936-
// Les 32 bits suivants sont formées avec la fonction de hash.
1934+
// Tout les bits sont formées avec la fonction de hash.
19371935
// Le uniqueId() généré doit toujours être positif
19381936
// sauf pour l'entité nulle.
19391937
Int32 nb_node = nodes_unique_id.size();
@@ -1946,9 +1944,7 @@ generateHashUniqueId(SmallSpan<const Int64> nodes_unique_id)
19461944
Int64 next_hash = Hasher::hashfunc(nodes_unique_id[i]);
19471945
hash ^= next_hash + 0x9e3779b9 + (hash << 6) + (hash >> 2);
19481946
}
1949-
Int64 truncated_uid0 = uid0 & ((1 << 30) - 1);
1950-
Int64 truncated_hash = hash & ((1LL << 31) - 1);
1951-
Int64 new_uid = truncated_uid0 + (truncated_hash << 31);
1947+
Int64 new_uid = abs(hash);
19521948
ARCANE_ASSERT(new_uid >= 0, ("UniqueId is not >= 0"));
19531949
return new_uid;
19541950
}

arcane/src/arcane/impl/ArcaneBasicMeshSubdividerService.axl

+13-2
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,21 @@
1313
>
1414
<userclass>User</userclass>
1515
<description>
16-
Nom de subdivision à effectuer.
16+
Nombre de subdivision à effectuer.
17+
</description>
18+
</simple>
19+
20+
<simple name="different-element-type-output"
21+
type="int32"
22+
default="0"
23+
>
24+
<userclass>User</userclass>
25+
<description>
26+
Permet de définir un autre type de cellule après la subdivision. Ne fonctionne que pour les triangles, quadrangles, tétraèdres, hexaèdres.
27+
Par exemple, considérons un maillage initial avec des éléments quadrangulaire, si cette option est différente de zéro les nouvelle mailles seront des triangles.
1728
</description>
1829
</simple>
1930

2031
</options>
2132

22-
</service>
33+
</service>

arcane/src/arcane/impl/ArcaneBasicMeshSubdividerService.cc

+21-6
Original file line numberDiff line numberDiff line change
@@ -1119,8 +1119,8 @@ void ArcaneBasicMeshSubdividerService::_refineOnce(IPrimaryMesh* mesh, std::unor
11191119
nodes_to_add_coords[node_in_cell[i + index_27]] = middle_coord;
11201120
// Insertion dans Uarray uid
11211121
nodes_to_add.add(uid);
1122-
info() << node_pattern[i];
1123-
debug() << i << " " << uid << " sizenic " << tmp << middle_coord;
1122+
//info() << node_pattern[i];
1123+
//debug() << i << " " << uid << " sizenic " << tmp << middle_coord;
11241124
}
11251125
}
11261126
// Est-ce qu'on doit ajouter les anciens noeuds ? Normalement non
@@ -1408,7 +1408,7 @@ void ArcaneBasicMeshSubdividerService::_refineOnce(IPrimaryMesh* mesh, std::unor
14081408

14091409
// Quelques sur le nombres d'entités insérés
14101410
// ARCANE_ASSERT((mesh->nbCell() == nb_cell_init*8 ),("Wrong number of cell added"));
1411-
debug() << "nbface " << mesh->nbFace() << " " << nb_face_to_add << " Attendu " << nb_face_init * 4 + 12 * nb_cell_init;
1411+
debug() << "nbface " << mesh->nbFace() << " " << nb_face_to_add << " expected " << nb_face_init * 4 + 12 * nb_cell_init;
14121412
// ARCANE_ASSERT((mesh->nbFace() <= nb_face_init*4 + 12 * nb_cell_init ),("Wrong number of face added"));
14131413
// A ajouter pour vérifier le nombre de noeud si les arêtes sont crées
14141414
// ARCANE_ASSERT((mesh->nbNode() == nb_edge_init + nb_face_init + nb_cell_init ),("Wrong number of node added"))
@@ -1470,7 +1470,7 @@ void ArcaneBasicMeshSubdividerService::_refineWithArcaneFaces(IPrimaryMesh* mesh
14701470
<< icell->type() << ", nb nodes=" << icell->nbNode();
14711471

14721472
for (Face face : cell.faces()) {
1473-
info() << "Face " << face.uniqueId() << " Noeuds ";
1473+
info() << "Face " << face.uniqueId() << " nodes ";
14741474
for (Node node : face.nodes()) {
14751475
info() << node.uniqueId() << " ";
14761476
}
@@ -1951,13 +1951,28 @@ subdivideMesh([[maybe_unused]] IPrimaryMesh* mesh)
19511951
pattern_manager[IT_Hexaedron8] = PatternBuilder::hextohex();
19521952
pattern_manager[IT_Tetraedron4] = PatternBuilder::tettotet();
19531953

1954+
if(options()->differentElementTypeOutput()){
1955+
pattern_manager[IT_Quad4] = PatternBuilder::quadtotri();
1956+
pattern_manager[IT_Triangle3] = PatternBuilder::tritoquad();
1957+
pattern_manager[IT_Hexaedron8] = PatternBuilder::hextotet24();
1958+
pattern_manager[IT_Tetraedron4] = PatternBuilder::tettohex();
1959+
info() << "The refinement patterns have changed for meshes of the following types: Quad4, Triangle3, Hexaedron8, Tetraedron4." ;
1960+
info() << "The output element types will be:\nQuad4->Triangle3\nTriangle3->Quad4\nHexaedron8->Tetraedron4\nTetraedron4->Hexaedron8" ;
1961+
}
1962+
19541963
for (Integer i = 0; i < options()->nbSubdivision; i++) {
19551964
_refineOnce(mesh, pattern_manager);
19561965
debug() << i << "refine done";
19571966
}
1958-
/*
1967+
19591968
// Debug After
1960-
mesh->utilities()->writeToFile("subdivider_after_" + std::to_string(options()->nbSubdivision) + "refine.vtk", "VtkLegacyMeshWriter");
1969+
1970+
//mesh->utilities()->writeToFile("subdivider_output_"+std::to_string(mesh->parallelMng()->commRank())+".vtk", "VtkLegacyMeshWriter");
1971+
1972+
1973+
//mesh->utilities()->writeToFile("subdivider_after_" + std::to_string(options()->nbSubdivision) + "refine.vtk", "VtkLegacyMeshWriter");
1974+
//debug() << "write file with name:" << "subdivider_after_";
1975+
/*
19611976
mesh->utilities()->writeToFile("subdivider_output.vtk", "VtkLegacyMeshWriter");
19621977
*/
19631978
}

arcane/src/arcane/tests/CMakeLists.txt

+10-3
Original file line numberDiff line numberDiff line change
@@ -810,10 +810,17 @@ arcane_add_test_script(continue_hydro3_cartesian_small continue_hydro3_cartesian
810810
arcane_add_test_parallel(hydro3_cartesian_8proc testHydro-3-cartesian.arc 8 "-m 50")
811811

812812
arcane_add_test(meshservice-subdivide1-hydro testHydro-3-meshservice-subdivide1.arc )
813-
arcane_add_test(arcanebasicmeshsubdividerservice1-subdivide1 testArcaneBasicMeshSubdividerService1-subdivide1.arc -m 1)
814-
arcane_add_test_parallel_thread(arcanebasicmeshsubdividerservice1-subdivide1 testArcaneBasicMeshSubdividerService1-subdivide1.arc 4 -m 1)
813+
arcane_add_test(basicmeshsubdividerservice1-subdivide1 testArcaneBasicMeshSubdividerService1-subdivide1.arc -m 1)
814+
arcane_add_test_parallel_thread(basicmeshsubdividerservice1-subdivide1 testArcaneBasicMeshSubdividerService1-subdivide1.arc 4 -m 1)
815+
816+
arcane_add_test_sequential(basicmeshsubdividerservidetriangle-subdivide-1 testArcaneBasicMeshSubdividerServiceTriangle.arc -m 1 "-A,//meshes/mesh/subdivider/different-element-type-output=1")
817+
818+
arcane_add_test(basicmeshsubdividerservidetriangle-subdivide testArcaneBasicMeshSubdividerServiceTriangle.arc -m 1)
819+
arcane_add_test(basicmeshsubdividerservidequadrilateral-subdivide testArcaneBasicMeshSubdividerServiceQuadrilateral.arc -m 1)
820+
821+
815822
if( Parmetis_FOUND )
816-
arcane_add_test_parallel_thread(arcanebasicmeshsubdividerservice1-subdivide1-parmetis testArcaneBasicMeshSubdividerService1-subdivide1-parmetis.arc 4 -m 1)
823+
arcane_add_test_parallel_thread(basicmeshsubdividerservice1-subdivide1-parmetis testArcaneBasicMeshSubdividerService1-subdivide1-parmetis.arc 4 -m 1)
817824
endif()
818825

819826
arcane_add_test_parallel_all(hydro3_checkpoint_meshservice testHydro-3-checkpoint-meshservice.arc 3 4 -c 3 -m 10)

arcane/tests/testArcaneBasicMeshSubdividerService1-subdivide1.arc

+3-1
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,10 @@
6060
</meshes>
6161
<unit-test-module>
6262
<test name="MeshUnitTest">
63-
<test-adjency>1</test-adjency>
63+
<test-adjency>1</test-adjency>
64+
<write-mesh>false</write-mesh>
6465
</test>
66+
6567
</unit-test-module>
6668

6769
</case>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0"?>
2+
<case codename="ArcaneTest" codeversion="1.0" xml:lang="en">
3+
<arcane>
4+
<title>Test subdivision d'un maillage 2D quadrangulaire</title>
5+
<description>Subdivision d'un maillage 2D uniquement quadrangulaire avec le partitionneur par défaut</description>
6+
<timeloop>UnitTest</timeloop>
7+
</arcane>
8+
<meshes>
9+
<mesh>
10+
<filename>planar_unstructured_quad1.msh</filename>
11+
<partitioner>MeshPartitionerTester</partitioner>
12+
<subdivider>
13+
<nb-subdivision>1</nb-subdivision>
14+
</subdivider>
15+
</mesh>
16+
</meshes>
17+
<unit-test-module>
18+
<test name="MeshUnitTest">
19+
<test-adjency>1</test-adjency>
20+
<write-mesh>false</write-mesh>
21+
</test>
22+
</unit-test-module>
23+
</case>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0"?>
2+
<case codename="ArcaneTest" codeversion="1.0" xml:lang="en">
3+
<arcane>
4+
<title>Test subdivision d'un maillage 2D triangulaire</title>
5+
<description>Subdivision d'un maillage 2D uniquement triangulaire avec le partitionneur par défaut</description>
6+
<timeloop>UnitTest</timeloop>
7+
</arcane>
8+
<meshes>
9+
<mesh>
10+
<filename>plancher.msh</filename>
11+
<partitioner>MeshPartitionerTester</partitioner>
12+
<subdivider>
13+
<nb-subdivision>1</nb-subdivision>
14+
</subdivider>
15+
</mesh>
16+
</meshes>
17+
<unit-test-module>
18+
<test name="MeshUnitTest">
19+
<test-adjency>1</test-adjency>
20+
<write-mesh>false</write-mesh>
21+
</test>
22+
</unit-test-module>
23+
</case>

arcane/tests/testHydro-3-meshservice-subdivide1.arc

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
<filename internal-partition="true">sod.vtk</filename>
4040
<subdivider>
4141
<nb-subdivision>1</nb-subdivision>
42-
42+
4343
</subdivider>
4444
<partitioner>MeshPartitionerTester</partitioner>
4545
<initialization>

arcane/tests/testMesh-2-env-generate-edge-face-uid.arc

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<test name="MeshUnitTest">
1515
<maillage-additionnel>sod.vtk</maillage-additionnel>
1616
<create-edges>true</create-edges>
17-
<connectivity-file-checksum>67f28f6bbcc1741687bcf913688dc9067fadc22369dbb1a78f70ba45b30c0dfa</connectivity-file-checksum>
17+
<connectivity-file-checksum>131147c126dd36a7257eabb8c50318b89d46ff1cda7be3e091c7a056192d2e10</connectivity-file-checksum>
1818
<!-- The values in parallel are not always the same in the CI. So we disable them -->
1919
<!-- <connectivity-file-checksum-parallel>a58676121852d7c0a8e4494fa4679e3c04b349174c1663611987b09c5ccbb393</connectivity-file-checksum-parallel>
2020
<connectivity-file-checksum-parallel>e3a0b58c733bfc6ae1886a7e884d480e6ad1237d9b65352f6569a626ac64f42c</connectivity-file-checksum-parallel>

arcane/tests/testMesh-2-generate-edge-face-uid.arc

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<maillage-additionnel>sod.vtk</maillage-additionnel>
1616
<create-edges>true</create-edges>
1717
<generate-uid-from-nodes-uid>true</generate-uid-from-nodes-uid>
18-
<connectivity-file-checksum>67f28f6bbcc1741687bcf913688dc9067fadc22369dbb1a78f70ba45b30c0dfa</connectivity-file-checksum>
18+
<connectivity-file-checksum>131147c126dd36a7257eabb8c50318b89d46ff1cda7be3e091c7a056192d2e10</connectivity-file-checksum>
1919
<!-- The values in parallel are not always the same in the CI. So we disable them -->
2020
<!-- <connectivity-file-checksum-parallel>a58676121852d7c0a8e4494fa4679e3c04b349174c1663611987b09c5ccbb393</connectivity-file-checksum-parallel>
2121
<connectivity-file-checksum-parallel>e3a0b58c733bfc6ae1886a7e884d480e6ad1237d9b65352f6569a626ac64f42c</connectivity-file-checksum-parallel>

0 commit comments

Comments
 (0)