Arcane  v3.14.10.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/MeshEventsImpl.h"
27
28#include "arcane/core/ItemAllocationInfo.h"
30#include "arcane/utils/Collection.h"
31#include "arcane/utils/String.h"
32#include "arcane/utils/List.h"
33#include "arcane/core/IMeshInitialAllocator.h"
34#include "arcane/core/IParallelMng.h"
35#include "arcane/core/MeshKind.h"
36
37#include <memory>
38
39#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
40#include <vector>
41#include <array>
42
43#include "arcane/core/IVariableMng.h"
44#include "DynamicMeshChecker.h"
45#endif
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
50namespace Arcane
51{
52class ISubDomain;
53}
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
57
58namespace Arcane::mesh
59{
60
61class PolyhedralMeshImpl;
62class PolyhedralFamily;
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65
67: public EmptyMesh
69{
70
71 friend class PolyhedralFamily;
72
73 private:
74
75 String m_name;
76 ISubDomain* m_subdomain;
77 MeshItemInternalList m_mesh_item_internal_list;
78 inline static const String m_mesh_handle_name = "polyhedral_mesh_handle";
79 MeshHandle m_mesh_handle;
80 std::unique_ptr<Properties> m_properties;
81 std::unique_ptr<PolyhedralMeshImpl> m_mesh; // using pimpl to limit dependency to neo lib to cc file
82 IParallelMng* m_parallel_mng;
83 MeshPartInfo m_mesh_part_info;
84 bool m_is_allocated = false;
85 ItemTypeMng* m_item_type_mng = nullptr;
86 MeshKind m_mesh_kind;
87 MeshEventsImpl m_mesh_events;
88
89 public:
90
91 // IPolyhedralMeshInitialAllocator interface
92 void allocateItems(const Arcane::ItemAllocationInfo& item_allocation_info) override;
93
94 public:
95
97 ~PolyhedralMesh(); // for pimpl idiom
98
99 public:
100
101 static String handleName() { return m_mesh_handle_name; }
102
103 void read(String const& filename);
104
105 void endUpdate();
106
107 const MeshKind meshKind() const override { return m_mesh_kind; }
108
110 {
111 return m_mesh_events.eventObservable(type);
112 }
113
114#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
115
116 class InitialAllocator : public IMeshInitialAllocator
117 {
118 PolyhedralMesh& m_mesh;
119
120 public:
121
122 explicit InitialAllocator(PolyhedralMesh& mesh)
123 : m_mesh(mesh)
124 {}
125 IPolyhedralMeshInitialAllocator* polyhedralMeshAllocator() override { return &m_mesh; }
126 };
127
128 class InternalApi;
129 class PolyhedralMeshModifier;
130 class NoCompactionMeshCompacter;
131 class NoCompactionMeshCompactMng;
132
133 private:
134
135 std::vector<std::unique_ptr<PolyhedralFamily>> m_arcane_families;
136 std::array<std::unique_ptr<PolyhedralFamily>, NB_ITEM_KIND> m_empty_arcane_families;
137 std::array<PolyhedralFamily*, NB_ITEM_KIND> m_default_arcane_families;
138 std::vector<std::unique_ptr<VariableItemReal3>> m_arcane_item_coords;
139 std::unique_ptr<VariableNodeReal3> m_arcane_node_coords = nullptr;
140 ItemGroupList m_all_groups;
141 InitialAllocator m_initial_allocator;
142 IVariableMng* m_variable_mng = nullptr;
143 DynamicMeshChecker m_mesh_checker;
144 List<IItemFamily*> m_item_family_collection;
145 std::unique_ptr<InternalApi> m_internal_api;
146 std::unique_ptr<IMeshCompactMng> m_compact_mng;
147
148 // IPrimaryMeshBase interface
149 IMeshInitialAllocator* initialAllocator() override { return &m_initial_allocator; }
150
151 // IMeshBase interface
152 public:
153
154 MeshHandle handle() const override;
155
156 public:
157
158 void build() override {}
159
160 String name() const override;
161
162 Integer nbNode() override;
163
164 Integer nbEdge() override;
165
166 Integer nbFace() override;
167
168 Integer nbCell() override;
169
170 Integer nbItem(eItemKind ik) override;
171
172 ITraceMng* traceMng() override;
173
174 Integer dimension() override;
175
176 NodeGroup allNodes() override;
177
178 EdgeGroup allEdges() override;
179
180 FaceGroup allFaces() override;
181
182 CellGroup allCells() override;
183
184 NodeGroup ownNodes() override;
185
186 EdgeGroup ownEdges() override;
187
188 FaceGroup ownFaces() override;
189
190 CellGroup ownCells() override;
191
192 FaceGroup outerFaces() override;
193
194 IItemFamily* createItemFamily(eItemKind ik, const String& name) override;
195
196 ISubDomain* subDomain() override { return m_subdomain; }
197 MeshItemInternalList* meshItemInternalList() override { return &m_mesh_item_internal_list; }
198
199 Properties* properties() override { return m_properties.get(); }
200
201 const MeshPartInfo& meshPartInfo() const override { return m_mesh_part_info; };
202
203 IItemFamily* nodeFamily() override;
204 IItemFamily* edgeFamily() override;
205 IItemFamily* faceFamily() override;
206 IItemFamily* cellFamily() override;
207
209
210 IParallelMng* parallelMng() override { return m_subdomain->parallelMng(); }
211
212 bool isAllocated() override { return m_is_allocated; }
213
214 bool isAmrActivated() const override { return false; }
215
216 IItemFamily* itemFamily(eItemKind ik) override;
217
218 ItemTypeMng* itemTypeMng() const override;
219
220 IItemFamily* findItemFamily(eItemKind ik, const String& name, bool create_if_needed, bool register_modifier_if_created) override;
221
222 IMesh* parentMesh() const override { return nullptr; }
223
224 PolyhedralFamily* arcaneDefaultFamily(eItemKind ik);
225
227
228 ItemGroup findGroup(const String& name) override;
229
230 ItemGroupCollection groups() override;
231
232 void destroyGroups() override;
233
234 IGhostLayerMng* ghostLayerMng() const override { return nullptr; }
235
236 void checkValidMesh() override
237 {
238 if (!m_is_allocated)
239 return;
240 m_mesh_checker.checkValidMesh();
241 }
242
243 IVariableMng* variableMng() const override { return m_variable_mng; }
244
245 IItemFamilyCollection itemFamilies() override;
246
247 String factoryName() const override;
248
249 IMeshInternal* _internalApi() override;
250
251 IMeshCompactMng* _compactMng() override;
252
253 // For now, use _internalAPI()->polyhedralMeshModifier instead of IMeshModifier not implemented yet
254 IMeshModifier* modifier() override {return nullptr;}
255
256 // AMR is not activated with Polyhedral mesh. All items are thus active.
257 CellGroup allActiveCells() override;
258 CellGroup ownActiveCells() override;
259 CellGroup allLevelCells(const Integer& level) override;
260 CellGroup ownLevelCells(const Integer& level) override;
261 FaceGroup allActiveFaces() override;
262 FaceGroup ownActiveFaces() override;
263 FaceGroup innerActiveFaces() override;
264 FaceGroup outerActiveFaces() override;
265
266 private:
267
268 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, eItemKind ik, const String& family_name);
269 void removeItems(Int32ConstArrayView local_ids, eItemKind ik, const String& family_name);
270
271 PolyhedralFamily* _createItemFamily(eItemKind ik, const String& name);
272 PolyhedralFamily* _itemFamily(eItemKind ik);
273 PolyhedralFamily* _findItemFamily(eItemKind ik, const String& name, bool create_if_needed = false);
274
275#endif // ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
276
277 private:
278
279 [[noreturn]] void _errorEmptyMesh() const;
280
281 void _createUnitMesh();
282 void _updateMeshInternalList(eItemKind kind);
283};
284
285/*---------------------------------------------------------------------------*/
286/*---------------------------------------------------------------------------*/
287
288} // End namespace Arcane::mesh
289
290/*---------------------------------------------------------------------------*/
291/*---------------------------------------------------------------------------*/
292
293#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:120
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:59
Informations un maillage partitionné.
bool get(const String &name, bool &value) const
Valeur de la propriété de nom name.
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
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
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
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
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
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
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
IItemFamily * nodeFamily() override
Retourne la famille des noeuds.
Definition EmptyMesh.h:223
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
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
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.
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.
-*- 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:640
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:638
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:611
Int32 Integer
Type représentant un entier.