Arcane  v3.15.3.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-2024 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-2024 */
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;
54class IItemFamilyNetwork;
55class IGhostLayerMng;
56class IMeshExchangeMng;
57}
58
59/*---------------------------------------------------------------------------*/
60/*---------------------------------------------------------------------------*/
61
62namespace Arcane::mesh
63{
64
65class PolyhedralMeshImpl;
66class PolyhedralFamily;
67/*---------------------------------------------------------------------------*/
68/*---------------------------------------------------------------------------*/
69
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
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
270 IMeshUtilities* utilities() override;
271
272 void addNodes(Int64ConstArrayView nodes_uid, Int32ArrayView nodes_lid) override; // wip: add IMeshModifierAPI
273
274 // AMR is not activated with Polyhedral mesh. All items are thus active.
275 CellGroup allActiveCells() override;
276 CellGroup ownActiveCells() override;
277 CellGroup allLevelCells(const Integer& level) override;
278 CellGroup ownLevelCells(const Integer& level) override;
279 FaceGroup allActiveFaces() override;
280 FaceGroup ownActiveFaces() override;
281 FaceGroup innerActiveFaces() override;
282 FaceGroup outerActiveFaces() override;
283
284 IMeshPartitionConstraintMng* partitionConstraintMng() override { return nullptr; }
285
287
288 IItemFamilyNetwork* itemFamilyNetwork() override;
289
290 Integer checkLevel() const override;
291
292 IUserDataList* userDataList() override { return m_mesh_handle.meshUserDataList(); }
293 const IUserDataList* userDataList() const override { return m_mesh_handle.meshUserDataList(); }
294
295 void prepareForDump() override;
296
297 bool useMeshItemFamilyDependencies() const override {return true;}
298
299 IMeshModifierInternal* _modifierInternalApi() override;
300
301 private:
302
303 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, eItemKind ik, const String& family_name);
304 void removeItems(Int32ConstArrayView local_ids, eItemKind ik, const String& family_name);
305
306 PolyhedralFamily* _createItemFamily(eItemKind ik, const String& name);
307 PolyhedralFamily* _itemFamily(eItemKind ik);
308 PolyhedralFamily* _findItemFamily(eItemKind ik, const String& name, bool create_if_needed = false);
309 const char* _className() const { return "PolyhedralMesh"; }
310
311 void _exchangeItems();
312
313#endif // ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
314
315 private:
316
317 [[noreturn]] void _errorEmptyMesh() const;
318
319 void _createUnitMesh();
320 void _updateMeshInternalList(eItemKind kind);
321};
322
323/*---------------------------------------------------------------------------*/
324/*---------------------------------------------------------------------------*/
325
326} // End namespace Arcane::mesh
327
328/*---------------------------------------------------------------------------*/
329/*---------------------------------------------------------------------------*/
330
331#endif //ARCANE_POLYHEDRALMESH_H
Fichier de configuration d'Arcane.
Déclarations des types généraux de Arcane.
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
virtual IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
Gestionnaire des types d'entités de maillage.
Definition ItemTypeMng.h:66
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Paramètres nécessaires à la construction d'un maillage.
Handle sur un maillage.
Definition MeshHandle.h:47
IUserDataList * meshUserDataList() const
Données utilisateurs associées.
Definition MeshHandle.h:157
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.
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.
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
ISubDomain * subDomain() override
Sous-domaine associé
Definition EmptyMesh.h:286
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.
Chaîne de caractères unicode.
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.
List< ItemGroup > ItemGroupList
Tableau de groupes d'éléments du maillage.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:572
Collection< IItemFamily * > IItemFamilyCollection
Collection de familles d'entités.
eMeshEventType
Evènements générés par IMesh.
Definition MeshEvents.h:30
eItemKind
Genre d'entité de maillage.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:570
InternalConnectivityPolicy
Politique d'utilisation des connectivités.
Definition ItemTypes.h:516
@ NewOnly
Alloue uniquement les nouvelles connectivités.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:543
Int32 Integer
Type représentant un entier.