Skip to content

Commit 2c18a2a

Browse files
Merge pull request #1923 from arcaneframework/dev/gg-add-option-to-generate-uid-from-nodes-uid
Add function to activate the generation of uniqueId of edges and faces using uniqueId of nodes
2 parents 7ba526e + 0840f19 commit 2c18a2a

11 files changed

+134
-31
lines changed

arcane/src/arcane/core/IMeshUniqueIdMng.h

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* IMeshUniqueIdMng.h (C) 2000-2022 */
8+
/* IMeshUniqueIdMng.h (C) 2000-2025 */
99
/* */
1010
/* Interface du gestionnaire de numérotation des uniqueId() d'un maillage. */
1111
/*---------------------------------------------------------------------------*/
@@ -14,7 +14,7 @@
1414
/*---------------------------------------------------------------------------*/
1515
/*---------------------------------------------------------------------------*/
1616

17-
#include "arcane/ArcaneTypes.h"
17+
#include "arcane/core/ArcaneTypes.h"
1818

1919
/*---------------------------------------------------------------------------*/
2020
/*---------------------------------------------------------------------------*/
@@ -38,7 +38,7 @@ class ARCANE_CORE_EXPORT IMeshUniqueIdMng
3838
public:
3939

4040
//! Libère les ressources
41-
virtual ~IMeshUniqueIdMng() =default;
41+
virtual ~IMeshUniqueIdMng() = default;
4242

4343
public:
4444

@@ -49,11 +49,11 @@ class ARCANE_CORE_EXPORT IMeshUniqueIdMng
4949
* Si la version vaut 0 alors il n'y a pas de renumérotation. En parallèle,
5050
* il faut alors que les uniqueId() des faces soient cohérents entre
5151
* les sous-domaines.
52-
*/
53-
virtual void setFaceBuilderVersion(Integer n) =0;
52+
*/
53+
virtual void setFaceBuilderVersion(Integer n) = 0;
5454

5555
//! Version de la numérotation des faces.
56-
virtual Integer faceBuilderVersion() const =0;
56+
virtual Integer faceBuilderVersion() const = 0;
5757

5858
/*!
5959
* \brief Positionne la version de la numérotation des arêtes.
@@ -66,11 +66,33 @@ class ARCANE_CORE_EXPORT IMeshUniqueIdMng
6666
* Si la version vaut 0 alors il n'y a pas de renumérotation. En parallèle,
6767
* il faut alors que les uniqueId() des faces soient cohérents entre
6868
* les sous-domaines.
69-
*/
70-
virtual void setEdgeBuilderVersion(Integer n) =0;
69+
*/
70+
virtual void setEdgeBuilderVersion(Integer n) = 0;
7171

7272
//! Version de la numérotation des arêtes
73-
virtual Integer edgeBuilderVersion() const =0;
73+
virtual Integer edgeBuilderVersion() const = 0;
74+
75+
/*!
76+
* \brief Indique si on détermine les uniqueId() des arêtes et des faces en
77+
* fonction des uniqueId() des noeuds qui les constituent.
78+
*
79+
* Cette méthode doit être appelée avant de positionner la dimension
80+
* du maillage (IPrimaryMesh::setDimension()).
81+
*
82+
* Si actif, lors de la création à la volée d'une arête ou d'une face
83+
* on utilise MeshUtils::generateHashUniqueId() pour générer le uniqueId()
84+
* de l'entité. Cela permet en parallèle de créer automatiquement
85+
* les arêtes ou les faces.
86+
*
87+
* \warning Si ce mécanisme est utilisé, il ne faut pas le mélanger
88+
* avec la création manuelle des arêtes ou des faces (via IMeshModifier)
89+
* ou alors il faut utiliser MeshUtils::generateHashUniqueId() pour générer
90+
* le même identifiant que celui créé à la volée.
91+
*/
92+
virtual void setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(bool v) = 0;
93+
94+
//! Indique le mécanisme utilisé pour numéroter les arêtes ou les faces
95+
virtual bool isUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId() const = 0;
7496
};
7597

7698
/*---------------------------------------------------------------------------*/

arcane/src/arcane/mesh/DynamicMesh.cc

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* DynamicMesh.cc (C) 2000-2024 */
8+
/* DynamicMesh.cc (C) 2000-2025 */
99
/* */
1010
/* Classe de gestion d'un maillage non structuré évolutif. */
1111
/*---------------------------------------------------------------------------*/
@@ -67,6 +67,7 @@
6767
#include "arcane/mesh/MeshPartitionConstraintMng.h"
6868
#include "arcane/mesh/ItemGroupsSynchronize.h"
6969
#include "arcane/mesh/DynamicMeshIncrementalBuilder.h"
70+
#include "arcane/mesh/OneMeshItemAdder.h"
7071
#include "arcane/mesh/DynamicMeshChecker.h"
7172
#include "arcane/mesh/GhostLayerMng.h"
7273
#include "arcane/mesh/MeshUniqueIdMng.h"
@@ -340,6 +341,12 @@ DynamicMesh(ISubDomain* sub_domain,const MeshBuildInfo& mbi, bool is_submesh)
340341
// de Arcane (juin 2023). A supprimer avant fin 2023.
341342
if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_NO_SAVE_NEED_COMPACT", true))
342343
m_do_not_save_need_compact = v.value();
344+
345+
// Surcharge la valeur par défaut pour le mécanisme de numérotation
346+
// des uniqueId() des arêtes et des faces.
347+
if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_GENERATE_UNIQUE_ID_FROM_NODES", true)){
348+
m_mesh_unique_id_mng->setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(v.value() != 0);
349+
}
343350
}
344351

345352
/*---------------------------------------------------------------------------*/
@@ -2977,6 +2984,12 @@ _setDimension(Integer dim)
29772984
ARCANE_FATAL("DynamicMesh::setDimension(): mesh is already allocated");
29782985
info() << "Mesh name=" << name() << " set dimension = " << dim;
29792986
m_mesh_dimension = dim;
2987+
bool v = m_mesh_unique_id_mng->isUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId();
2988+
if (m_mesh_builder){
2989+
auto* adder = m_mesh_builder->oneMeshItemAdder();
2990+
if (adder)
2991+
adder->setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(v);
2992+
}
29802993
}
29812994

29822995
/*---------------------------------------------------------------------------*/

arcane/src/arcane/mesh/MeshUniqueIdMng.cc

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* MeshUniqueIdMng.cc (C) 2000-2022 */
8+
/* MeshUniqueIdMng.cc (C) 2000-2025 */
99
/* */
1010
/* Gestionnaire de couche fantômes d'un maillage. */
1111
/*---------------------------------------------------------------------------*/
@@ -18,7 +18,7 @@
1818
#include "arcane/utils/FatalErrorException.h"
1919
#include "arcane/utils/ValueConvert.h"
2020

21-
#include "arcane/IMeshUniqueIdMng.h"
21+
#include "arcane/core/IMeshUniqueIdMng.h"
2222

2323
/*---------------------------------------------------------------------------*/
2424
/*---------------------------------------------------------------------------*/
@@ -32,8 +32,6 @@ namespace Arcane::mesh
3232
MeshUniqueIdMng::
3333
MeshUniqueIdMng(ITraceMng* tm)
3434
: TraceAccessor(tm)
35-
, m_face_builder_version(1)
36-
, m_edge_builder_version(1)
3735
{
3836
_initFaceVersion();
3937
_initEdgeVersion();
@@ -112,6 +110,15 @@ _initEdgeVersion()
112110
/*---------------------------------------------------------------------------*/
113111
/*---------------------------------------------------------------------------*/
114112

113+
void MeshUniqueIdMng::
114+
setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(bool v)
115+
{
116+
m_use_node_uid_to_generate_edge_and_face_uid = v;
117+
}
118+
119+
/*---------------------------------------------------------------------------*/
120+
/*---------------------------------------------------------------------------*/
121+
115122
} // End namespace Arcane::mesh
116123

117124
/*---------------------------------------------------------------------------*/

arcane/src/arcane/mesh/MeshUniqueIdMng.h

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* MeshUniqueIdMng.h (C) 2000-2022 */
8+
/* MeshUniqueIdMng.h (C) 2000-2025 */
99
/* */
1010
/* Gestionnaire de numérotation des uniqueId() d'un maillage. */
1111
/*---------------------------------------------------------------------------*/
@@ -15,7 +15,9 @@
1515
/*---------------------------------------------------------------------------*/
1616

1717
#include "arcane/utils/TraceAccessor.h"
18-
#include "arcane/IMeshUniqueIdMng.h"
18+
19+
#include "arcane/core/IMeshUniqueIdMng.h"
20+
1921
#include "arcane/mesh/MeshGlobal.h"
2022

2123
/*---------------------------------------------------------------------------*/
@@ -45,10 +47,17 @@ class ARCANE_MESH_EXPORT MeshUniqueIdMng
4547
void setEdgeBuilderVersion(Int32 n) override;
4648
Int32 edgeBuilderVersion() const override { return m_edge_builder_version; }
4749

50+
void setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(bool v) override;
51+
bool isUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId() const override
52+
{
53+
return m_use_node_uid_to_generate_edge_and_face_uid;
54+
}
55+
4856
private:
4957

50-
Int32 m_face_builder_version;
51-
Int32 m_edge_builder_version;
58+
Int32 m_face_builder_version = 1;
59+
Int32 m_edge_builder_version = 1;
60+
bool m_use_node_uid_to_generate_edge_and_face_uid = false;
5261

5362
private:
5463

arcane/src/arcane/mesh/OneMeshItemAdder.cc

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,7 @@ OneMeshItemAdder(DynamicMeshIncrementalBuilder* mesh_builder)
9191
, m_mesh_info(m_mesh->meshPartInfo().partRank())
9292
{
9393
m_work_face_sorted_nodes.reserve(100);
94-
m_work_face_orig_nodes_uid.reserve(100);
95-
96-
if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_GENERATE_UNIQUE_ID_FROM_NODES", true)){
97-
m_use_hash_for_edge_and_face_unique_id = (v.value()!=0);
98-
info() << "Is generate Edge and Face uniqueId() from Nodes=" << m_use_hash_for_edge_and_face_unique_id;
99-
}
94+
m_work_face_orig_nodes_uid.reserve(100);
10095
}
10196

10297
/*---------------------------------------------------------------------------*/
@@ -1085,6 +1080,18 @@ resetAfterDeallocate()
10851080
/*---------------------------------------------------------------------------*/
10861081
/*---------------------------------------------------------------------------*/
10871082

1083+
void OneMeshItemAdder::
1084+
setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(bool v)
1085+
{
1086+
if (m_next_face_uid!=0 || m_next_edge_uid!=0)
1087+
ARCANE_FATAL("Can not call this method when edge or face are already created");
1088+
m_use_hash_for_edge_and_face_unique_id = v;
1089+
info() << "Is Generate Edge and Face uniqueId() from Nodes=" << m_use_hash_for_edge_and_face_unique_id;
1090+
}
1091+
1092+
/*---------------------------------------------------------------------------*/
1093+
/*---------------------------------------------------------------------------*/
1094+
10881095
} // End namespace Arcane::mesh
10891096

10901097
/*---------------------------------------------------------------------------*/

arcane/src/arcane/mesh/OneMeshItemAdder.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,13 @@ class OneMeshItemAdder
119119
//! Remise à zéro des structures pour pouvoir faire à nouveau une allocation
120120
void resetAfterDeallocate();
121121

122+
/*!
123+
* \brief Positionne le mécanisme de numérotation des uniqueId().
124+
*
125+
* \warning Cette méthode doit être appelée avant toute création d'entité.
126+
*/
127+
void setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(bool v);
128+
122129
private:
123130

124131
template<typename CellInfo>

arcane/src/arcane/tests/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,8 @@ arcane_add_test(mesh2 testMesh-2.arc "-We,ARCANE_METIS_INPUT_OUTPUT_DIGEST,1")
559559
if (Parmetis_FOUND)
560560
arcane_add_test_parallel_thread(mesh2_face_unique_id_v5 testMesh-2-face-unique-id-v5.arc 4)
561561
endif()
562-
arcane_add_test(mesh2_generate_edge_face_uid testMesh-2-generate-edge-face-uid.arc "-We,ARCANE_GENERATE_UNIQUE_ID_FROM_NODES,1")
562+
arcane_add_test(mesh2_generate_edge_face_uid testMesh-2-generate-edge-face-uid.arc)
563+
arcane_add_test_sequential(mesh2_generate_edge_face_uid_env testMesh-2-env-generate-edge-face-uid.arc "-We,ARCANE_GENERATE_UNIQUE_ID_FROM_NODES,1")
563564
arcane_add_test_sequential(mesh2_sort_faces testMesh-2-sorted-faces.arc)
564565
arcane_add_test_sequential(mesh2_init_nan testMesh-2.arc "-We,ARCANE_DATA_INIT_POLICY,NAN")
565566
arcane_add_test_sequential(mesh2_init_default testMesh-2.arc "-We,ARCANE_DATA_INIT_POLICY,DEFAULT" "-We,ARCANE_ITEMFAMILY_SHRINK_AFTER_ALLOCATE,1")

arcane/src/arcane/tests/MeshUnitTest.axl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,12 @@ Teste la désallocation du maillage
154154
</description>
155155
</simple>
156156

157+
<simple name = "generate-uid-from-nodes-uid" type = "bool" default = "false">
158+
<description>
159+
Si vrai, génère les uniqueId des arêtes et des faces à partir de ceux des noeuds.
160+
</description>
161+
</simple>
162+
157163
<simple name = "check-read-property" type = "string" minOccurs="0" maxOccurs="unbounded">
158164
<description>
159165
Indique que l'on veut vérifier si la variable dont le nom est donnée a bien été créée et conservée.

arcane/src/arcane/tests/MeshUnitTest.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* MeshUnitTest.cc (C) 2000-2024 */
8+
/* MeshUnitTest.cc (C) 2000-2025 */
99
/* */
1010
/* Service de test du maillage. */
1111
/*---------------------------------------------------------------------------*/
@@ -64,6 +64,7 @@
6464
#include "arcane/core/MeshEvents.h"
6565
#include "arcane/core/BlockIndexList.h"
6666
#include "arcane/core/Connectivity.h"
67+
#include "arcane/core/IMeshUniqueIdMng.h"
6768

6869
#include "arcane/tests/MeshUnitTest_axl.h"
6970

@@ -234,6 +235,9 @@ buildInitializeTest()
234235
p->setBool("compact",false);
235236
p->setBool("compact-after-allocate",false);
236237
}
238+
if (options()->generateUidFromNodesUid()) {
239+
mesh()->meshUniqueIdMng()->setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(true);
240+
}
237241
}
238242

239243
/*---------------------------------------------------------------------------*/
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?xml version="1.0" ?>
2+
<cas codename="ArcaneTest" xml:lang="fr" codeversion="1.0">
3+
<arcane>
4+
<titre>Test Maillage 1</titre>
5+
<description>Test Maillage 1</description>
6+
<boucle-en-temps>UnitTest</boucle-en-temps>
7+
</arcane>
8+
9+
<maillage>
10+
<fichier internal-partition="true">sod.vtk</fichier>
11+
</maillage>
12+
13+
<module-test-unitaire>
14+
<test name="MeshUnitTest">
15+
<maillage-additionnel>sod.vtk</maillage-additionnel>
16+
<create-edges>true</create-edges>
17+
<connectivity-file-checksum>67f28f6bbcc1741687bcf913688dc9067fadc22369dbb1a78f70ba45b30c0dfa</connectivity-file-checksum>
18+
<!-- The values in parallel are not always the same in the CI. So we disable them -->
19+
<!-- <connectivity-file-checksum-parallel>a58676121852d7c0a8e4494fa4679e3c04b349174c1663611987b09c5ccbb393</connectivity-file-checksum-parallel>
20+
<connectivity-file-checksum-parallel>e3a0b58c733bfc6ae1886a7e884d480e6ad1237d9b65352f6569a626ac64f42c</connectivity-file-checksum-parallel>
21+
<connectivity-file-checksum-parallel>e0503600a6ea913b3a35f45859913b41c541da65fca5e7f9be47b11766b45231</connectivity-file-checksum-parallel>
22+
<connectivity-file-checksum-parallel>63a5ccbdba612d210ea996821cdd4fe617686bb507383de14408a7a6629ab248</connectivity-file-checksum-parallel> -->
23+
</test>
24+
</module-test-unitaire>
25+
26+
</cas>

0 commit comments

Comments
 (0)