Arcane  v3.16.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
PolyhedralMesh.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* PolyhedralMesh.h (C) 2000-2025 */
9/* */
10/* Polyhedral mesh impl using Neo data structure */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13#ifndef ARCANE_POLYHEDRALMESH_H
14#define ARCANE_POLYHEDRALMESH_H
15/*---------------------------------------------------------------------------*/
16/*---------------------------------------------------------------------------*/
17
18#include "arcane/core/MeshHandle.h"
19#include "arcane/core/ItemGroup.h"
20#include "arcane/core/MeshItemInternalList.h"
21#include "arcane/core/ISubDomain.h"
22#include "arcane/core/Properties.h"
24
25#include "arcane/mesh/EmptyMesh.h"
26#include "arcane/mesh/EmptyMeshModifier.h"
27#include "arcane/mesh/MeshEventsImpl.h"
28
29#include "arcane/core/ItemAllocationInfo.h"
31#include "arcane/utils/Collection.h"
32#include "arcane/utils/String.h"
33#include "arcane/utils/List.h"
34#include "arcane/core/IMeshInitialAllocator.h"
35#include "arcane/core/IParallelMng.h"
36#include "arcane/core/MeshKind.h"
37
38#include <memory>
39
40#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
41#include <vector>
42#include <array>
43
44#include "arcane/core/IVariableMng.h"
45#include "DynamicMeshChecker.h"
46#endif
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
50
51namespace Arcane
52{
53class ISubDomain;
55class IGhostLayerMng;
57}
58
59/*---------------------------------------------------------------------------*/
60/*---------------------------------------------------------------------------*/
61
62namespace Arcane::mesh
63{
64
67/*---------------------------------------------------------------------------*/
68/*---------------------------------------------------------------------------*/
69
70class PolyhedralMesh
71: public EmptyMesh
72, public EmptyMeshModifier
74{
75
76 friend class PolyhedralFamily;
77
78 private:
79
80 String m_name;
81 ISubDomain* m_subdomain;
82 MeshItemInternalList m_mesh_item_internal_list;
83 inline static const String m_mesh_handle_name = "polyhedral_mesh_handle";
84 MeshHandle m_mesh_handle;
85 std::unique_ptr<Properties> m_properties;
86 std::unique_ptr<PolyhedralMeshImpl> m_mesh; // using pimpl to limit dependency to neo lib to cc file
87 IParallelMng* m_parallel_mng;
88 MeshPartInfo m_mesh_part_info;
89 bool m_is_allocated = false;
90 ItemTypeMng* m_item_type_mng = nullptr;
91 MeshKind m_mesh_kind;
92 MeshEventsImpl m_mesh_events;
93
94 public:
95
96 // IPolyhedralMeshInitialAllocator interface
97 void allocateItems(const Arcane::ItemAllocationInfo& item_allocation_info) override;
98
99 public:
100
101 PolyhedralMesh(ISubDomain* subDomain, const MeshBuildInfo& mbi);
102 ~PolyhedralMesh(); // for pimpl idiom
103
104 public:
105
106 static String handleName() { return m_mesh_handle_name; }
107
108 void read(String const& filename);
109
110 void endUpdate();
111
112 const MeshKind meshKind() const override { return m_mesh_kind; }
113
115 {
116 return m_mesh_events.eventObservable(type);
117 }
118
119#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
120
121 class InitialAllocator : public IMeshInitialAllocator
122 {
123 PolyhedralMesh& m_mesh;
124
125 public:
126
127 explicit InitialAllocator(PolyhedralMesh& mesh)
128 : m_mesh(mesh)
129 {}
130 IPolyhedralMeshInitialAllocator* polyhedralMeshAllocator() override { return &m_mesh; }
131 };
132
133 class InternalApi;
134 class PolyhedralMeshModifier;
135 class NoCompactionMeshCompacter;
136 class NoCompactionMeshCompactMng;
137
138 private:
139
140 std::vector<std::unique_ptr<PolyhedralFamily>> m_arcane_families;
141 std::array<std::unique_ptr<PolyhedralFamily>, NB_ITEM_KIND> m_empty_arcane_families;
142 std::array<PolyhedralFamily*, NB_ITEM_KIND> m_default_arcane_families;
143 std::vector<std::unique_ptr<VariableItemReal3>> m_arcane_item_coords;
144 std::unique_ptr<VariableNodeReal3> m_arcane_node_coords = nullptr;
145 ItemGroupList m_all_groups;
146 InitialAllocator m_initial_allocator;
147 IVariableMng* m_variable_mng = nullptr;
148 DynamicMeshChecker m_mesh_checker;
149 List<IItemFamily*> m_item_family_collection;
150 std::unique_ptr<InternalApi> m_internal_api;
151 std::unique_ptr<IMeshCompactMng> m_compact_mng;
152 std::unique_ptr<IMeshUtilities> m_mesh_utilities;
153 std::unique_ptr<IMeshExchangeMng> m_mesh_exchange_mng;
154 std::unique_ptr<IItemFamilyNetwork> m_item_family_network;
155 std::unique_ptr<IGhostLayerMng> m_ghost_layer_mng;
156 bool m_is_dynamic = false;
157
158 // IPrimaryMeshBase interface
159 IMeshInitialAllocator* initialAllocator() override { return &m_initial_allocator; }
160
161 // IMeshBase interface
162 public:
163
164 MeshHandle handle() const override;
165
166 public:
167
168 void build() override {}
169
170 String name() const override;
171
172 Integer nbNode() override;
173
174 Integer nbEdge() override;
175
176 Integer nbFace() override;
177
178 Integer nbCell() override;
179
180 Integer nbItem(eItemKind ik) override;
181
182 ITraceMng* traceMng() override;
183
184 Integer dimension() override;
185
186 NodeGroup allNodes() override;
187
188 EdgeGroup allEdges() override;
189
190 FaceGroup allFaces() override;
191
192 CellGroup allCells() override;
193
194 NodeGroup ownNodes() override;
195
196 EdgeGroup ownEdges() override;
197
198 FaceGroup ownFaces() override;
199
200 CellGroup ownCells() override;
201
202 FaceGroup outerFaces() override;
203
204 IItemFamily* createItemFamily(eItemKind ik, const String& name) override;
205
206 ISubDomain* subDomain() override { return m_subdomain; }
207 MeshItemInternalList* meshItemInternalList() override { return &m_mesh_item_internal_list; }
208
209 Properties* properties() override { return m_properties.get(); }
210
211 const MeshPartInfo& meshPartInfo() const override { return m_mesh_part_info; };
212
213 IItemFamily* nodeFamily() override;
214 IItemFamily* edgeFamily() override;
215 IItemFamily* faceFamily() override;
216 IItemFamily* cellFamily() override;
217
219
220 IParallelMng* parallelMng() override { return m_subdomain->parallelMng(); }
221
222 bool isAllocated() override { return m_is_allocated; }
223
224 bool isAmrActivated() const override { return false; }
225
226 IItemFamily* itemFamily(eItemKind ik) override;
227
228 ItemTypeMng* itemTypeMng() const override;
229
230 IItemFamily* findItemFamily(eItemKind ik, const String& name, bool create_if_needed, bool register_modifier_if_created) override;
231
232 IMesh* parentMesh() const override { return nullptr; }
233
234 PolyhedralFamily* arcaneDefaultFamily(eItemKind ik);
235
237
238 ItemGroup findGroup(const String& name) override;
239
240 ItemGroupCollection groups() override;
241
242 void destroyGroups() override;
243
244 IGhostLayerMng* ghostLayerMng() const override;
245
246 void checkValidMesh() override
247 {
248 if (!m_is_allocated)
249 return;
250 m_mesh_checker.checkValidMesh();
251 }
252
253 IVariableMng* variableMng() const override { return m_variable_mng; }
254
255 IItemFamilyCollection itemFamilies() override;
256
257 String factoryName() const override;
258
259 IMeshInternal* _internalApi() override;
260
261 IMeshCompactMng* _compactMng() override;
262
263 void exchangeItems() override;
264
265 // For now, use _internalAPI()->polyhedralMeshModifier instead of IMeshModifier not implemented yet
266 IMeshModifier* modifier() override {return this;}
267 bool isDynamic() const override {return m_is_dynamic;}
268 void setDynamic(bool is_dynamic) override { m_is_dynamic = is_dynamic;}
269 void addExtraGhostCellsBuilder(IExtraGhostCellsBuilder*) override
270 {
271 // not yet implemented : must exit in parallel
272 if (m_subdomain->parallelMng()->isParallel()) {
273 ARCANE_NOT_YET_IMPLEMENTED("Parallel for polyhedral mesh is WIP");
274 }
275 }
276 void removeExtraGhostCellsBuilder(IExtraGhostCellsBuilder*) override
277 {
278 // not yet implemented : must exit in parallel
279 if (m_subdomain->parallelMng()->isParallel()) {
280 ARCANE_NOT_YET_IMPLEMENTED("Parallel for polyhedral mesh is WIP");
281 }
282 }
283 void endUpdate(bool update_ghost_layer, bool remove_old_ghost) override
284 {
285 // not yet implemented : must exit in parallel
286 if (m_subdomain->parallelMng()->isParallel()) {
287 ARCANE_NOT_YET_IMPLEMENTED("Parallel for polyhedral mesh is WIP");
288 }
289 }
290
291 IMeshUtilities* utilities() override;
292
293 void addNodes(Int64ConstArrayView nodes_uid, Int32ArrayView nodes_lid) override; // wip: add IMeshModifierAPI
294
295 // AMR is not activated with Polyhedral mesh. All items are thus active.
296 CellGroup allActiveCells() override;
297 CellGroup ownActiveCells() override;
298 CellGroup allLevelCells(const Integer& level) override;
299 CellGroup ownLevelCells(const Integer& level) override;
300 FaceGroup allActiveFaces() override;
301 FaceGroup ownActiveFaces() override;
302 FaceGroup innerActiveFaces() override;
303 FaceGroup outerActiveFaces() override;
304
305 IMeshPartitionConstraintMng* partitionConstraintMng() override { return nullptr; }
306
308
309 IItemFamilyNetwork* itemFamilyNetwork() override;
310
311 Integer checkLevel() const override;
312
313 IUserDataList* userDataList() override { return m_mesh_handle.meshUserDataList(); }
314 const IUserDataList* userDataList() const override { return m_mesh_handle.meshUserDataList(); }
315
316 void prepareForDump() override;
317
318 bool useMeshItemFamilyDependencies() const override {return true;}
319
320 IMeshModifierInternal* _modifierInternalApi() override;
321
322 private:
323
324 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, eItemKind ik, const String& family_name);
325 void removeItems(Int32ConstArrayView local_ids, eItemKind ik, const String& family_name);
326
327 PolyhedralFamily* _createItemFamily(eItemKind ik, const String& name);
328 PolyhedralFamily* _itemFamily(eItemKind ik);
329 PolyhedralFamily* _findItemFamily(eItemKind ik, const String& name, bool create_if_needed = false);
330 const char* _className() const { return "PolyhedralMesh"; }
331
332 void _exchangeItems();
333
334#endif // ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
335
336 private:
337
338 [[noreturn]] void _errorEmptyMesh() const;
339
340 void _createUnitMesh();
341 void _updateMeshInternalList(eItemKind kind);
342};
343
344/*---------------------------------------------------------------------------*/
345/*---------------------------------------------------------------------------*/
346
347} // End namespace Arcane::mesh
348
349/*---------------------------------------------------------------------------*/
350/*---------------------------------------------------------------------------*/
351
352#endif //ARCANE_POLYHEDRALMESH_H
Fichier de configuration d'Arcane.
Déclarations des types généraux de Arcane.
Classe de base d'un handler d'évènement.
Definition Event.h:193
virtual String name() const =0
Nom du maillage.
Interface du gestionnaire des échanges de maillages entre sous-domaines.
Interface d'allocation des entités du maillage.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Allocateur pour les maillages polyédriques.
virtual IMeshInitialAllocator * initialAllocator()
Allocateur initial spécifique.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Gestionnaire des types d'entités de maillage.
Definition ItemTypeMng.h:66
Paramètres nécessaires à la construction d'un maillage.
Handle sur un maillage.
Definition MeshHandle.h:47
Tableaux d'indirection sur les entités d'un maillage.
Caractéristiques d'un maillage.
Definition MeshKind.h:64
Informations un maillage partitionné.
bool get(const String &name, bool &value) const
Valeur de la propriété de nom name.
Chaîne de caractères unicode.
void addNodes(Int64ConstArrayView, Int32ArrayView) override
Ajoute des noeuds.
IMeshModifierInternal * _modifierInternalApi() override
API interne à Arcane.
void setDynamic(bool) override
Positionne la propriété indiquant si le maillage peut évoluer.
void addExtraGhostCellsBuilder(IExtraGhostCellsBuilder *) override
ajout du algorithme d'ajout de mailles fantômes "extraordinaires".
void removeExtraGhostCellsBuilder(IExtraGhostCellsBuilder *) override
Supprime l'association à l'instance builder.
CellGroup ownLevelCells(const Integer &) override
Groupe de toutes les mailles propres de niveau level.
Definition EmptyMesh.h:323
void destroyGroups() override
Détruit tous les groupes de toutes les familles.
Definition EmptyMesh.h:361
Integer nbNode() override
Nombre de noeuds du maillage.
Definition EmptyMesh.h:115
ITraceMng * traceMng() override
Gestionnaire de message associé
Definition EmptyMesh.h:140
FaceGroup ownFaces() override
Groupe de toutes les faces propres au domaine.
Definition EmptyMesh.h:180
IItemFamily * createItemFamily(eItemKind, const String &) override
Créé une famille de particule de nom name.
Definition EmptyMesh.h:198
IUserDataList * userDataList() override
Gestionnnaire de données utilisateurs associé
Definition EmptyMesh.h:465
IItemFamily * itemFamily(eItemKind) override
Retourne la famille d'entité de type ik.
Definition EmptyMesh.h:218
IItemFamily * faceFamily() override
Retourne la famille des faces.
Definition EmptyMesh.h:233
VariableItemInt32 & itemsNewOwner(eItemKind) override
Variable contenant l'identifiant du sous-domaine propriétaire.
Definition EmptyMesh.h:97
ItemTypeMng * itemTypeMng() const override
Gestionnaire de types d'entités associé
Definition EmptyMesh.h:540
VariableNodeReal3 & nodesCoordinates() override
Coordonnées des noeuds.
Definition EmptyMesh.h:86
IMeshPartitionConstraintMng * partitionConstraintMng() override
Gestionnaire des contraintes de partitionnement associées à ce maillage.
Definition EmptyMesh.h:407
FaceGroup outerFaces() override
Groupe de toutes les faces sur la frontière.
Definition EmptyMesh.h:190
Integer dimension() override
Dimension du maillage (1D, 2D ou 3D).
Definition EmptyMesh.h:145
IGhostLayerMng * ghostLayerMng() const override
Gestionnare de couche fantômes associé
Definition EmptyMesh.h:478
bool useMeshItemFamilyDependencies() const override
check if the network itemFamily dependencies is activated
Definition EmptyMesh.h:499
IMeshModifier * modifier() override
Interface de modification associée.
Definition EmptyMesh.h:428
IMeshCompactMng * _compactMng() override
Definition EmptyMesh.h:517
Integer nbCell() override
Nombre de mailles du maillage.
Definition EmptyMesh.h:130
IParallelMng * parallelMng() override
Gestionnaire de parallèlisme.
Definition EmptyMesh.h:294
void exchangeItems() override
Change les sous-domaines propriétaires des entités.
Definition EmptyMesh.h:103
IItemFamily * edgeFamily() override
Retourne la famille des arêtes.
Definition EmptyMesh.h:228
InternalConnectivityPolicy _connectivityPolicy() const override
Politique d'utilisation des connectivitées.
Definition EmptyMesh.h:522
FaceGroup allActiveFaces() override
Groupe de toutes les faces actives.
Definition EmptyMesh.h:328
void checkValidMesh() override
Vérification de la validité des structues internes de maillage (interne)
Definition EmptyMesh.h:267
void prepareForDump() override
Prépare l'instance en vue d'une protection.
Definition EmptyMesh.h:375
ItemGroupCollection groups() override
Liste des groupes.
Definition EmptyMesh.h:351
CellGroup allActiveCells() override
Definition EmptyMesh.h:308
Properties * properties() override
Propriétés associées à ce maillage.
Definition EmptyMesh.h:420
Integer nbEdge() override
Nombre d'arêtes du maillage.
Definition EmptyMesh.h:120
FaceGroup innerActiveFaces() override
Groupe de toutes les faces actives.
Definition EmptyMesh.h:338
IItemFamily * cellFamily() override
Retourne la famille des mailles.
Definition EmptyMesh.h:238
CellGroup ownActiveCells() override
Groupe de toutes les mailles actives et propres au domaine.
Definition EmptyMesh.h:313
FaceGroup allFaces() override
Groupe de toutes les faces.
Definition EmptyMesh.h:160
const MeshPartInfo & meshPartInfo() const override
Informations sur les parties du maillage.
Definition EmptyMesh.h:493
IVariableMng * variableMng() const override
Gestionnaire de variable associé
Definition EmptyMesh.h:535
MeshHandle handle() const override
Handle sur ce maillage.
Definition EmptyMesh.h:77
ItemGroup findGroup(const String &) override
Retourne le groupe de nom name ou le groupe nul s'il n'y en a pas.
Definition EmptyMesh.h:356
IMeshUtilities * utilities() override
Interface des fonctions utilitaires associée.
Definition EmptyMesh.h:415
IItemFamily * nodeFamily() override
Retourne la famille des noeuds.
Definition EmptyMesh.h:223
Integer checkLevel() const override
Niveau actuel de vérification.
Definition EmptyMesh.h:378
Integer nbFace() override
Nombre de faces du maillage.
Definition EmptyMesh.h:125
EdgeGroup allEdges() override
Groupe de toutes les arêtes.
Definition EmptyMesh.h:155
IItemFamily * findItemFamily(eItemKind, const String &, bool, bool) override
Retourne la famille de nom name.
Definition EmptyMesh.h:203
IItemFamilyNetwork * itemFamilyNetwork() override
Interface du réseau de familles (familles connectées)
Definition EmptyMesh.h:504
CellGroup ownCells() override
Groupe de toutes les mailles propres au domaine.
Definition EmptyMesh.h:185
CellGroup allLevelCells(const Integer &) override
Groupe de toutes les mailles de niveau level.
Definition EmptyMesh.h:318
NodeGroup ownNodes() override
Groupe de tous les noeuds propres au domaine.
Definition EmptyMesh.h:170
IMeshInternal * _internalApi() override
API interne à Arcane.
Definition EmptyMesh.h:551
NodeGroup allNodes() override
Groupe de tous les noeuds.
Definition EmptyMesh.h:150
FaceGroup ownActiveFaces() override
Groupe de toutes les faces actives propres au domaine.
Definition EmptyMesh.h:333
bool isDynamic() const override
Indique si le maillage est dynamique (peut évoluer)
Definition EmptyMesh.h:383
String name() const override
Nom du maillage.
Definition EmptyMesh.h:110
bool isAllocated() override
Vrai si le maillage est allouée.
Definition EmptyMesh.h:273
FaceGroup outerActiveFaces() override
Groupe de toutes les faces actives sur la frontière.
Definition EmptyMesh.h:343
IMesh * parentMesh() const override
Accès au maillage parent.
Definition EmptyMesh.h:437
CellGroup allCells() override
Groupe de toutes les mailles.
Definition EmptyMesh.h:165
String factoryName() const override
Nom de la fabrique utilisée pour créer le maillage.
Definition EmptyMesh.h:252
EdgeGroup ownEdges() override
Groupe de toutes les arêtes propres au domaine.
Definition EmptyMesh.h:175
Integer nbItem(eItemKind) override
Nombre d'éléments du genre ik.
Definition EmptyMesh.h:135
Implémentation des évènements sur le maillage.
EventObservable< const MeshEventArgs & > & eventObservable(eMeshEventType type) override
Observable pour un évènement.
void endUpdate()
Notifie l'instance de la fin de la modification du maillage.
const MeshKind meshKind() const override
Caractéristiques du maillage.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
Definition ItemTypes.h:183
ItemGroupT< Face > FaceGroup
Groupe de faces.
Definition ItemTypes.h:178
ItemGroupT< Edge > EdgeGroup
Groupe d'arêtes.
Definition ItemTypes.h:173
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
Definition ItemTypes.h:167
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Collection< ItemGroup > ItemGroupCollection
Collection de groupes d'éléments du maillage.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569
List< ItemGroup > ItemGroupList
Tableau de groupes d'éléments du maillage.
Collection< IItemFamily * > IItemFamilyCollection
Collection de familles d'entités.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:567
eMeshEventType
Evènements générés par IMesh.
Definition MeshEvents.h:30
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:540
eItemKind
Genre d'entité de maillage.
InternalConnectivityPolicy
Politique d'utilisation des connectivités.
Definition ItemTypes.h:516
@ NewOnly
Alloue uniquement les nouvelles connectivités.
Definition ItemTypes.h:554