Arcane  v4.1.9.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
VariableMng.h
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/* VariableMng.h (C) 2000-2026 */
9/* */
10/* Classe gérant la liste des maillages. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_IMPL_INTERNAL_VARIABLEMNG_H
13#define ARCANE_IMPL_INTERNAL_VARIABLEMNG_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/TraceAccessor.h"
18#include "arcane/utils/String.h"
19#include "arcane/utils/HashTableMap.h"
20#include "arcane/utils/List.h"
21#include "arcane/utils/Ref.h"
22
23#include "arcane/core/IVariableMng.h"
24#include "arcane/core/IVariableFilter.h"
25#include "arcane/core/VariableCollection.h"
26#include "arcane/core/internal/IVariableMngInternal.h"
27
28#include "arcane/accelerator/core/IAcceleratorMng.h"
29
30#include <map>
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35namespace Arcane
36{
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
40
43class XmlNode;
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
54: public TraceAccessor
55, public IVariableMng
56{
57 friend class VariableIOWriterMng;
58 friend class VariableIOReaderMng;
59
61 {
62 public:
63
64 String m_local_name;
65 String m_family_name;
66 String m_mesh_name;
67 bool operator==(const VariableNameInfo& vni) const
68 {
69 return m_local_name == vni.m_local_name && m_family_name == vni.m_family_name && m_mesh_name == vni.m_mesh_name;
70 }
71
72 public:
73
74 Int32 hash() const
75 {
76 Int32 h = 0;
77 if (!m_mesh_name.null()) {
78 h = hash(h, m_mesh_name.localstr());
79 h = hash(h, "_");
80 }
81 if (!m_family_name.null()) {
82 h = hash(h, m_family_name.localstr());
83 h = hash(h, "_");
84 }
85 h = hash(h, m_local_name.localstr());
86 return h;
87 }
88
89 public:
90
91 static Int32 hash(Int32 h, const char* p)
92 {
93 if (!p)
94 return h;
95 for (; *p != '\0'; ++p)
96 h = (h << 5) - h + *p;
97 return h;
98 }
99 };
100
102 {
103 public:
104
105 typedef const VariableNameInfo& KeyTypeConstRef;
106 typedef VariableNameInfo& KeyTypeRef;
107 typedef VariableNameInfo KeyTypeValue;
108 typedef FalseType Printable;
109 typedef Int32 HashValueType;
110 static Int32 hashFunction(const VariableNameInfo& key)
111 {
112 // garantie que la valeur est positive
113 return key.hash() & 0x7fffffff;
114 }
115 };
116
117 class InternalApi
118 : public IVariableMngInternal
119 {
120 public:
121
122 explicit InternalApi(VariableMng* v)
123 : m_variable_mng(v)
124 {}
125
126 public:
127
128 void build() override { m_variable_mng->build(); }
129 void initialize() override { m_variable_mng->initialize(); }
130 void removeAllVariables() override { m_variable_mng->removeAllVariables(); }
131 void removeAllShMemVariables() override { m_variable_mng->_removeAllShMemVariables(); }
132 void detachMeshVariables(IMesh* mesh) override { m_variable_mng->detachMeshVariables(mesh); }
133 void addVariableRef(VariableRef* var) override { m_variable_mng->addVariableRef(var); }
134 void removeVariableRef(VariableRef* var) override { m_variable_mng->removeVariableRef(var); }
135 void addVariable(IVariable* var) override { m_variable_mng->addVariable(var); }
136 void removeVariable(IVariable* var) override { m_variable_mng->removeVariable(var); }
137 void initializeVariables(bool is_continue) override { m_variable_mng->initializeVariables(is_continue); }
138 ISubDomain* internalSubDomain() const override { return m_variable_mng->_internalSubDomain(); }
139 IAcceleratorMng* acceleratorMng() const override { return m_variable_mng->m_accelerator_mng.get(); }
140 void setAcceleratorMng(Ref<IAcceleratorMng> v) override { m_variable_mng->m_accelerator_mng = v; }
141 void addAutoDestroyVariable(VariableRef* var) override { m_variable_mng->m_auto_create_variables.add(var); }
142
143 private:
144
145 VariableMng* m_variable_mng = nullptr;
146 };
147
148 public:
149
151
152 public:
153
154 explicit VariableMng(ISubDomain* sd);
155 ~VariableMng() override;
156
157 public:
158
159 void build() override;
160 void initialize() override;
161 void removeAllVariables() override;
162 void detachMeshVariables(IMesh* mesh) override;
163
164 public:
165
166 ISubDomain* subDomain() override { return m_sub_domain; }
167 IParallelMng* parallelMng() const override { return m_parallel_mng; }
169 IVariable* checkVariable(const VariableInfo& infos) override;
170 void addVariableRef(VariableRef* ref) override;
171 void addVariable(IVariable* var) override;
172 void removeVariableRef(VariableRef*) override;
173 void removeVariable(IVariable* var) override;
174 void dumpList(std::ostream&, IModule*) override;
175 void dumpList(std::ostream&) override;
176 void initializeVariables(bool) override;
178 void variables(VariableRefCollection, IModule*) override;
179 VariableCollection variables() override;
181 void notifyUsedVariableChanged() override { m_used_variables_changed = true; }
182 Real exportSize(const VariableCollection& vars) override;
183 IObservable* writeObservable() override { return m_write_observable; }
184 IObservable* readObservable() override { return m_read_observable; }
185 void writeVariables(IDataWriter*, const VariableCollection& vars) override;
187 void writeCheckpoint(ICheckpointWriter*) override;
188 void writePostProcessing(IPostProcessorWriter* writer) override;
189 void readVariables(IDataReader*, IVariableFilter*) override;
190 void readCheckpoint(ICheckpointReader*) override;
191 void readCheckpoint(const CheckpointReadInfo& infos) override;
192 IVariable* findVariable(const String& name) override;
193 IVariable* findMeshVariable(IMesh* mesh, const String& name) override;
194 IVariable* findVariableFullyQualified(const String& name) override;
195
196 void dumpStats(std::ostream& ostr, bool is_verbose) override;
197 void dumpStatsJSON(JSONWriter& writer) override;
198 IVariableUtilities* utilities() const override { return m_utilities; }
199
202 {
203 return m_on_variable_added;
204 }
205
208 {
209 return m_on_variable_removed;
210 }
212 ISubDomain* _internalSubDomain() const override { return m_sub_domain; }
213 IVariableMngInternal* _internalApi() override { return &m_internal_api; }
214
215 public:
216
217 static bool isVariableToSave(IVariable& var);
218
219 private:
220
222 using FullNameVariableMap = std::map<String, IVariable*>;
224 using FullNameVariablePair = FullNameVariableMap::value_type;
225
227 using VariableFactoryMap = std::map<String, IVariableFactory*>;
229 using VariableFactoryPair = VariableFactoryMap::value_type;
230
233 IParallelMng* m_parallel_mng = nullptr;
234 ITimeStats* m_time_stats = nullptr;
235 InternalApi m_internal_api{ this };
237 VariableList m_variables;
238 VariableList m_used_variables;
239 bool m_variables_changed = true;
240 bool m_used_variables_changed = true;
243 VNIMap m_vni_map;
244 IObservable* m_write_observable = nullptr;
245 IObservable* m_read_observable = nullptr;
248 List<IVariableFactory*> m_variable_factories;
251 VariableFactoryMap m_variable_factory_map;
252
254
255 Int64 m_nb_created_variable_reference = 0;
256 Int64 m_nb_created_variable = 0;
257 // Indique dans quel module une variable est créée
258 std::map<IVariable*, IModule*> m_variable_creation_modules;
259
260 IVariableUtilities* m_utilities = nullptr;
261 VariableIOWriterMng* m_variable_io_writer_mng = nullptr;
262 VariableIOReaderMng* m_variable_io_reader_mng = nullptr;
263 VariableSynchronizerMng* m_variable_synchronizer_mng = nullptr;
264
265 Ref<IAcceleratorMng> m_accelerator_mng;
266
267 private:
268
270 void _dumpVariable(const VariableRef& v, std::ostream& o);
271
272 static const char* _msgClassName() { return "Variable"; }
273 VariableRef* _createVariableFromType(const String& full_type,
274 const VariableBuildInfo& vbi);
275
276 void _removeAllShMemVariables();
277};
278
279/*---------------------------------------------------------------------------*/
280/*---------------------------------------------------------------------------*/
284class VariableIOWriterMng
285: public TraceAccessor
286{
287 private:
288
290 : public IVariableFilter
291 {
292 public:
293
294 bool applyFilter(IVariable& var) override
295 {
296 return VariableMng::isVariableToSave(var);
297 }
298 };
299
300 public:
301
302 explicit VariableIOWriterMng(VariableMng* vm);
303
304 public:
305
306 void writeCheckpoint(ICheckpointWriter* service);
307 void writePostProcessing(IPostProcessorWriter* post_processor);
308 void writeVariables(IDataWriter* writer, const VariableCollection& vars, bool use_hash);
309 void writeVariables(IDataWriter* writer, IVariableFilter* filter, bool use_hash);
310
311 private:
312
313 VariableMng* m_variable_mng = nullptr;
314 bool m_use_hash_v2 = false;
315
316 private:
317
318 void _writeVariables(IDataWriter* writer, const VariableCollection& vars, bool use_hash);
319 String _generateMetaData(const VariableCollection& vars, IHashAlgorithm* hash_algo);
320 void _generateVariablesMetaData(JSONWriter& json_writer, XmlNode variables_node,
321 const VariableCollection& vars, IHashAlgorithm* hash_algo);
322 void _generateMeshesMetaData(JSONWriter& json_writer, XmlNode meshes_node);
323 static const char* _msgClassName() { return "Variable"; }
324};
325
326/*---------------------------------------------------------------------------*/
327/*---------------------------------------------------------------------------*/
331class VariableIOReaderMng
332: public TraceAccessor
333{
334 public:
335
336 class IDataReaderWrapper;
338 class DataReaderWrapper;
340
341 public:
342
343 explicit VariableIOReaderMng(VariableMng* vm);
344
345 public:
346
347 void readCheckpoint(ICheckpointReader* service);
348 void readCheckpoint(const CheckpointReadInfo& infos);
349 void readVariables(IDataReader* reader, IVariableFilter* filter);
350
351 private:
352
353 VariableMng* m_variable_mng = nullptr;
354 bool m_is_use_json_metadata = true;
355
356 private:
357
358 void _readVariablesData(VariableReaderMng& var_read_mng, IDataReaderWrapper* reader);
360 void _checkHashFunction(const VariableMetaDataList& vmd_list);
361 void _createVariablesFromMetaData(const VariableMetaDataList& vmd_list);
362 void _readVariablesMetaData(VariableMetaDataList& vmd_list, JSONValue variables_json, const XmlNode& variables_node);
363 void _readMeshesMetaData(JSONValue meshes_json, const XmlNode& meshes_node);
364 void _buildFilteredVariableList(VariableReaderMng& vars_read_mng, IVariableFilter* filter);
365 void _finalizeReadVariables(const VariableList& vars_to_read);
366 static const char* _msgClassName() { return "Variable"; }
367};
368
369/*---------------------------------------------------------------------------*/
370/*---------------------------------------------------------------------------*/
371
372} // namespace Arcane
373
374/*---------------------------------------------------------------------------*/
375/*---------------------------------------------------------------------------*/
376
377#endif
Informations de relecture d'une protection.
Classe de base d'un handler d'évènement.
Table de hachage pour tableaux associatifs.
Interface du service de lecture d'une protection/reprise.
Interface du service d'écriture d'une protection/reprise.
Interface de lecture des données d'une variable.
Definition IDataReader.h:34
Interface d'écriture des données d'une variable.
Definition IDataWriter.h:44
Interface d'un algorithme de hashage.
Interface d'un module.
Definition IModule.h:39
Interface du gestionnaire de parallélisme pour un sous-domaine.
Interface d'un écrivain pour les informations de post-traitement.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Interface gérant les statistiques sur les temps d'exécution.
Definition ITimeStats.h:43
Interface du gestionnaire de traces.
Functor d'un filtre applicable sur des variables.
Interface du gestionnaire de variables.
Interface du gestionnaire de variables.
Interface du gestionnaire de synchronisation des variables.
Interface proposant des fonctions utilitaires sur les variables.
Interface d'une variable.
Definition IVariable.h:39
Implémentation d'une collection d'éléments sous forme de vecteur.
Référence à une instance.
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
Chaîne de caractères unicode.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
ITraceMng * traceMng() const
Gestionnaire de trace.
Paramètres nécessaires à la construction d'une variable.
Collection de variables.
Interface pour utiliser IDataReader ou IDataReader2.
Gestion de la lecture pour les variables.
void _readMetaData(VariableMetaDataList &vmd_list, Span< const Byte > bytes)
Lecture des méta-données.
void _checkHashFunction(const VariableMetaDataList &vmd_list)
Vérifie les valeurs des fonctions de hashage.
bool applyFilter(IVariable &var) override
Applique le filtre sur la variable var.
Gestion de l'écriture pour les variables.
void _generateMeshesMetaData(JSONWriter &json_writer, XmlNode meshes_node)
void writeVariables(IDataWriter *writer, const VariableCollection &vars, bool use_hash)
Infos caractérisant une variable.
void build() override
Construit les membres de l'instance.
void initializeVariables(bool is_continue) override
Initialise les variables.
void addVariable(IVariable *var) override
Ajoute une variable.
void setAcceleratorMng(Ref< IAcceleratorMng > v) override
Positionne le gestionnaire des accélérateurs.
void removeVariableRef(VariableRef *var) override
Supprime une référence à une variable.
void removeAllShMemVariables() override
void addAutoDestroyVariable(VariableRef *var) override
Ajoute la variable à la liste des variables qui sont conservées jusqu'à la fin de l'exécution.
IAcceleratorMng * acceleratorMng() const override
Gestionnaire pour les accélérateurs.
void detachMeshVariables(IMesh *mesh) override
Détache les variables associées au maillage mesh.
void initialize() override
Initialise l'instance. L'instance n'est pas utilisable tant que cette méthode n'a pas été appelée.
void removeVariable(IVariable *var) override
Supprime une variable.
void addVariableRef(VariableRef *var) override
Ajoute une référence à une variable.
void removeAllVariables() override
Supprime et détruit les variables gérées par ce gestionnaire.
ISubDomain * internalSubDomain() const override
Fonction interne temporaire pour récupérer le sous-domaine.
Gestionnaire de variables.
Definition VariableMng.h:56
IVariable * checkVariable(const VariableInfo &infos) override
Vérifie une variable.
Real exportSize(const VariableCollection &vars) override
IObservable * writeObservable() override
Observable pour les variables en écriture.
IVariable * findVariableFullyQualified(const String &name) override
Retourne la variable de nom complet name ou 0 si aucune de se nom existe.
void dumpList(std::ostream &, IModule *) override
Affiche la liste des variables du gestionnaire lié à un module.
std::map< String, IVariableFactory * > VariableFactoryMap
Type de la liste des fabriques de variables par nom complet.
IVariableMngInternal * _internalApi() override
API interne à Arcane.
IObservable * readObservable() override
Observable pour les variables en lecture.
IVariableUtilities * utilities() const override
Interface des fonctions utilitaires associées.
void _dumpVariable(const VariableRef &v, std::ostream &o)
Ecrit la valeur de la variable v sur le flot o.
void addVariable(IVariable *var) override
Ajoute une variable.
ISubDomain * m_sub_domain
Gestionnaire de sous-domaine.
void dumpStatsJSON(JSONWriter &writer) override
Ecrit les statistiques avec l'écrivain writer.
Integer m_generate_name_id
Numéro utilisé pour générer un nom de variable.
List< VariableRef * > m_auto_create_variables
Liste des variables créées automatiquement lors d'une reprise.
FullNameVariableMap m_full_name_variable_map
Liste des variables par nom complet.
void readVariables(IDataReader *, IVariableFilter *) override
Relit toutes les variables.
void writeVariables(IDataWriter *, const VariableCollection &vars) override
Exporte les variables.
void detachMeshVariables(IMesh *mesh) override
Détache les variables associées au maillage mesh.
ITraceMng * traceMng() override
Gestionnaire de messages.
String generateTemporaryVariableName() override
Génère un nom pour une variable temporaire.
void removeVariableRef(VariableRef *) override
Supprime une référence à une variable.
ISubDomain * subDomain() override
Gestionnaire du sous-domaine.
IVariable * findVariable(const String &name) override
Retourne la variable de nom name ou 0 si aucune de se nom existe.
VariableFactoryMap::value_type VariableFactoryPair
Paire de la liste des variables par nom complet.
EventObservable< const VariableStatusChangedEventArgs & > & onVariableAdded() override
Evènement envoyé lorsqu'une variable est créée.
VariableCollection usedVariables() override
Liste des variables utilisées.
void removeVariable(IVariable *var) override
Supprime une variable.
void build() override
Construit les membres de l'instance.
void notifyUsedVariableChanged() override
Notifie au gestionnaire que l'état d'une variable a changé
void addVariableRef(VariableRef *ref) override
Ajoute une référence à une variable.
IVariable * findMeshVariable(IMesh *mesh, const String &name) override
Retourne la variable du maillage de nom name ou 0 si aucune de se nom existe.
void initialize() override
Initialise l'instance. L'instance n'est pas utilisable tant que cette méthode n'a pas été appelée.
ISubDomain * _internalSubDomain() const override
void removeAllVariables() override
Supprime et détruit les variables gérées par ce gestionnaire.
VariableRefList m_variables_ref
Liste des variables.
FullNameVariableMap::value_type FullNameVariablePair
Paire de la liste des variables par nom complet.
void writeCheckpoint(ICheckpointWriter *) override
Ecrit les variables pour une protection.
IParallelMng * parallelMng() const override
Gestionnaire de parallélisme associé
void writePostProcessing(IPostProcessorWriter *writer) override
Ecrit les variables pour un post-traitement.
IVariableSynchronizerMng * synchronizerMng() const override
Interface du gestionnaire de synchronisation des variables.
std::map< String, IVariable * > FullNameVariableMap
Type de la liste des variables par nom complet.
~VariableMng() override
Détruit le gestionnaire.
VariableCollection variables() override
Liste des variables.
void initializeVariables(bool) override
Initialise les variables.
EventObservable< const VariableStatusChangedEventArgs & > & onVariableRemoved() override
Evènement envoyé lorsqu'une variable est détruite.
void dumpStats(std::ostream &ostr, bool is_verbose) override
Ecrit les statistiques sur les variables sur le flot ostr.
VariableMng(ISubDomain *sd)
Construit un gestionnaire de variable pour le cas pn.
void readCheckpoint(ICheckpointReader *) override
Relit toutes les variables d'une protection.
Gestion de la lecture des variables.
Référence à une variable.
Definition VariableRef.h:56
Gestionnaire des synchroniseurs de variables.
Noeud d'un arbre DOM.
Definition XmlNode.h:51
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Collection< VariableRef * > VariableRefCollection
Collection de variables.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
double Real
Type représentant un réel.
List< VariableRef * > VariableRefList
Tableau de références de variables.
std::int32_t Int32
Type entier signé sur 32 bits.
Structure équivalente à la valeur booléenne vrai.