Arcane  4.2.3.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MeshHandle.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* MeshHandle.cc (C) 2000-2026 */
9/* */
10/* Handle sur un maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/MeshHandle.h"
15
16#include "IParallelMng.h"
17#include "arcane/utils/UserDataList.h"
18#include "arcane/utils/FatalErrorException.h"
19#include "arcane/utils/Observable.h"
20#include "arcane/utils/ValueConvert.h"
21
22#include "arcane/core/ISubDomain.h"
23#include "arcane/core/IMesh.h"
24#include "arcane/core/IMeshBase.h"
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane
30{
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
36{
37 public:
38
39 MeshHandleRef()
40 : m_is_null(true)
41 {}
42 MeshHandleRef(ISubDomain* sd, const String& name);
43 ~MeshHandleRef();
44
45 public:
46
47 const String& meshName() const { return m_mesh_name; }
48 bool isNull() const { return m_is_null; }
49 IMesh* mesh() const { return m_mesh_ptr; }
50 IMeshBase* meshBase() const { return m_mesh_base_ptr; }
51 ISubDomain* subDomain() const { return m_sub_domain; }
52 IMeshMng* meshMng() const { return m_mesh_mng; }
53 ITraceMng* traceMng() const { return m_trace_mng; }
54 IVariableMng* variableMng() const { return m_variable_mng; }
55 IUserDataList* userDataList() const { return m_user_data_list; }
56 Observable* onDestroyObservable() const { return m_on_destroy_observable; }
57 bool isDoFatalInMeshMethod() const { return m_do_fatal_in_mesh_method; }
58
59 public:
60
61 void _destroyMesh();
62 void _setMesh(IMesh* mesh);
63
64 public:
65
66 void addRef()
67 {
68 ++m_nb_ref;
69 }
70 void removeRef()
71 {
72 Int32 v = std::atomic_fetch_add(&m_nb_ref, -1);
73 if (v == 1)
74 delete this;
75 }
76
77 private:
78
79 String m_mesh_name;
80 IMesh* m_mesh_ptr = nullptr;
81 IMeshBase* m_mesh_base_ptr = nullptr;
82 Ref<IParallelMng> m_parallel_mng_ref;
83 // Pour l'instant on en a besoin, mais cela devrait être supprimé
84 ISubDomain* m_sub_domain = nullptr;
85 IUserDataList* m_user_data_list = nullptr;
86 IMeshMng* m_mesh_mng = nullptr;
87 ITraceMng* m_trace_mng = nullptr;
88 IVariableMng* m_variable_mng = nullptr;
89 Observable* m_on_destroy_observable = nullptr;
90 bool m_is_null = true;
91 bool m_do_fatal_in_mesh_method = false;
92 std::atomic<Int32> m_nb_ref = 0;
93};
94
95/*---------------------------------------------------------------------------*/
96/*---------------------------------------------------------------------------*/
97
98// TODO rendre ce constructeur privé à IMeshMng pour éviter d'avoir des
99// doublons possibles pour les MeshHandle associés au même nom de maillage.
100MeshHandle::MeshHandleRef::
101MeshHandleRef(ISubDomain* sd,const String& name)
102: m_mesh_name(name)
103, m_sub_domain(sd)
104, m_is_null(name.null())
105{
106 if (!m_is_null)
107 m_user_data_list = new UserDataList();
109 m_trace_mng = sd->traceMng();
110 m_mesh_mng = sd->meshMng();
111 m_variable_mng = sd->variableMng();
112 m_on_destroy_observable = new Observable();
113 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_DO_FATAL_IN_MESHHANDLE",true))
114 m_do_fatal_in_mesh_method = v.value()!=0;
115}
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
119
120MeshHandle::MeshHandleRef::
121~MeshHandleRef()
122{
123 delete m_user_data_list;
124 delete m_on_destroy_observable;
125}
126
127/*---------------------------------------------------------------------------*/
128/*---------------------------------------------------------------------------*/
129
130void MeshHandle::MeshHandleRef::
131_setMesh(IMesh* mesh)
132{
133 m_mesh_ptr = mesh;
134 if (mesh)
135 // Il faut conserver une référence sur le parallel mng car il peut avoir
136 // été créé pendant la construction du maillage et ne plus avoir de référence ensuite.
137 m_parallel_mng_ref = makeRef(mesh->parallelMng());
138 else
139 m_parallel_mng_ref.reset();
140}
141
142/*---------------------------------------------------------------------------*/
143/*---------------------------------------------------------------------------*/
144
145void MeshHandle::MeshHandleRef::
146_destroyMesh()
147{
148 // TODO: protéger les appels multiples
149 IMesh* mesh = m_mesh_ptr;
150 if (!mesh)
151 return;
152 m_on_destroy_observable->notifyAllObservers();
153 m_user_data_list->clear();
154 // Attention à ne mettre à nul que à la fin de cette routine car les
155 // utilisateurs de \a m_user_data peuvent avoir besoin de ce MeshHandle.
156 m_mesh_ptr = nullptr;
157 delete mesh;
158}
159
160/*---------------------------------------------------------------------------*/
161/*---------------------------------------------------------------------------*/
162
163/*---------------------------------------------------------------------------*/
164/*---------------------------------------------------------------------------*/
165
166MeshHandle::
167MeshHandle(ISubDomain* sd,const String& name)
168: m_ref(new MeshHandleRef(sd,name))
169{
170}
171
172/*---------------------------------------------------------------------------*/
173/*---------------------------------------------------------------------------*/
174
175MeshHandle::
176MeshHandle()
177: m_ref(new MeshHandleRef())
178{
179}
180
181MeshHandle::
182MeshHandle(const MeshHandle& x)
183: m_ref(x.m_ref)
184{
185}
186
187MeshHandle::
188MeshHandle(MeshHandle&& x) noexcept
189: m_ref(std::move(x.m_ref))
190{
191}
192
193MeshHandle& MeshHandle::
194operator=(const MeshHandle& x)
195{
196 if (&x != this)
197 m_ref = x.m_ref;
198 return (*this);
199}
200
201MeshHandle& MeshHandle::
202operator=(MeshHandle&& x) noexcept
203{
204 m_ref = std::move(x.m_ref);
205 return (*this);
206}
207
208MeshHandle::
209~MeshHandle()
210{
211 // Le destructeur doit être ici car MeshHandleRef n'est pas connu
212 // dans la définition de la classe.
213}
214
215/*---------------------------------------------------------------------------*/
216/*---------------------------------------------------------------------------*/
217
218/*---------------------------------------------------------------------------*/
219/*---------------------------------------------------------------------------*/
220
222meshMng() const
223{
224 return m_ref->meshMng();
225}
226
227/*---------------------------------------------------------------------------*/
228/*---------------------------------------------------------------------------*/
229
231hasMesh() const
232{
233 IMesh* m = m_ref->mesh();
234 return m;
235}
236
237/*---------------------------------------------------------------------------*/
238/*---------------------------------------------------------------------------*/
239
241mesh() const
242{
243 IMesh* m = m_ref->mesh();
244 if (m)
245 return m;
246 // A terme, faire un fatal si le maillage est nul. Pour des raisons de
247 // compatibilité avec l'existant, on retourne 'nullptr'.
248 bool do_fatal = m_ref->isDoFatalInMeshMethod();
249 if (do_fatal)
250 ARCANE_FATAL("Invalid call for null mesh. Call MeshHandle::hasMesh() before to make sure mesh is valid");
251 return nullptr;
252}
253
254/*---------------------------------------------------------------------------*/
255/*---------------------------------------------------------------------------*/
256
258meshOrNull() const
259{
260 return m_ref->mesh();
261}
262
263/*---------------------------------------------------------------------------*/
264/*---------------------------------------------------------------------------*/
265
267traceMng() const
268{
269 return m_ref->traceMng();
270}
271
272/*---------------------------------------------------------------------------*/
273/*---------------------------------------------------------------------------*/
274
276variableMng() const
277{
278 return m_ref->variableMng();
279}
280
281/*---------------------------------------------------------------------------*/
282/*---------------------------------------------------------------------------*/
283
285application() const
286{
287 return m_ref->subDomain()->application();
288}
289
290/*---------------------------------------------------------------------------*/
291/*---------------------------------------------------------------------------*/
292
295{
296 return m_ref->onDestroyObservable();
297}
298
300{
301 return m_ref->userDataList();
302}
303
304String MeshHandle::meshName() const
305{
306 return m_ref->meshName();
307}
308
309//! Indique si le handle est nul (ne référence pas ou non un maillage existant)
311{
312 return m_ref->isNull();
313}
314
315//! \internal
316void MeshHandle::
317_setMesh(IMesh* mesh)
318{
319 m_ref->_setMesh(mesh);
320}
321
322//! \internal
323void MeshHandle::
324_destroyMesh()
325{
326 m_ref->_destroyMesh();
327}
328
329//! \internal
330IMesh* MeshHandle::
331_internalMeshOrNull() const
332{
333 return m_ref->mesh();
334}
335
337subDomain() const
338{
339 return m_ref->subDomain();
340}
341
342/*---------------------------------------------------------------------------*/
343/*---------------------------------------------------------------------------*/
344
345/*---------------------------------------------------------------------------*/
346/*---------------------------------------------------------------------------*/
347
351
352/*---------------------------------------------------------------------------*/
353/*---------------------------------------------------------------------------*/
354
357{
358 if (mesh)
359 m_handle = mesh->handle();
360}
361
362/*---------------------------------------------------------------------------*/
363/*---------------------------------------------------------------------------*/
364
365} // End namespace Arcane
366
367/*---------------------------------------------------------------------------*/
368/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Classe template pour convertir un type.
Interface de l'application.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface du gestionnaire des maillages.
Definition IMeshMng.h:40
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:77
virtual IMeshMng * meshMng() const =0
Retourne le gestionnaire de maillage.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
Interface du gestionnaire de traces.
Interface d'une liste qui gère des données utilisateurs.
Interface du gestionnaire de variables.
IMesh * mesh() const
Maillage associé. Peut être nul si le maillage n'a pas encore été créé
Definition MeshHandle.h:176
const MeshHandle & handle() const
handle associé.
Definition MeshHandle.h:182
MeshHandleOrMesh(const MeshHandle &handle)
Construit une instance à partir d'un MeshHandle.
Handle sur un maillage.
Definition MeshHandle.h:48
ITraceMng * traceMng() const
Gestionnaire de trace associé. nullptr si isNull() est vrai.
ISubDomain * subDomain() const
Sous-domaine associé. Null si isNull() est vrai.
bool hasMesh() const
Indique si le maillage associé a déjà été créé (i.e: mesh() est valide).
IMesh * meshOrNull() const
Retourne le maillage associé à cette instance.
bool isNull() const
Indique si le handle est nul (il ne référence aucun maillage existant ou non).
IMesh * mesh() const
Maillage associé.
IApplication * application() const
Application associée. nullptr si isNull() est vrai.
IUserDataList * meshUserDataList() const
Données utilisateurs associées.
IVariableMng * variableMng() const
Gestionnaire de variable associé. nullptr si isNull() est vrai.
IMeshMng * meshMng() const
Gestionnaire de maillage associé. nullptr si isNull() est vrai.
IObservable * onDestroyObservable() const
Observable pour être notifié de la destruction.
Classe de base d'un observable.
Référence à une instance.
Implémentation thread-safe d'un compteur de référence.
Chaîne de caractères unicode.
Gère une liste de données utilisateurs.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.