Arcane  4.2.3.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 VariableRef* createVariableFromType(const String& full_type, const VariableBuildInfo& vbi) override { return m_variable_mng->_createVariableFromType(full_type, vbi); }
143
144 private:
145
146 VariableMng* m_variable_mng = nullptr;
147 };
148
149 public:
150
152
153 public:
154
155 explicit VariableMng(ISubDomain* sd);
156 ~VariableMng() override;
157
158 public:
159
160 void build() override;
161 void initialize() override;
162 void removeAllVariables() override;
163 void detachMeshVariables(IMesh* mesh) override;
164
165 public:
166
167 ISubDomain* subDomain() override { return m_sub_domain; }
168 IParallelMng* parallelMng() const override { return m_parallel_mng; }
170 IVariable* checkVariable(const VariableInfo& infos) override;
171 void addVariableRef(VariableRef* ref) override;
172 void addVariable(IVariable* var) override;
173 void removeVariableRef(VariableRef*) override;
174 void removeVariable(IVariable* var) override;
175 void dumpList(std::ostream&, IModule*) override;
176 void dumpList(std::ostream&) override;
177 void initializeVariables(bool) override;
179 void variables(VariableRefCollection, IModule*) override;
180 VariableCollection variables() override;
182 void notifyUsedVariableChanged() override { m_used_variables_changed = true; }
183 Real exportSize(const VariableCollection& vars) override;
184 IObservable* writeObservable() override { return m_write_observable; }
185 IObservable* readObservable() override { return m_read_observable; }
186 void writeVariables(IDataWriter*, const VariableCollection& vars) override;
188 void writeCheckpoint(ICheckpointWriter*) override;
189 void writePostProcessing(IPostProcessorWriter* writer) override;
190 void readVariables(IDataReader*, IVariableFilter*) override;
191 void readCheckpoint(ICheckpointReader*) override;
192 void readCheckpoint(const CheckpointReadInfo& infos) override;
193 IVariable* findVariable(const String& name) override;
194 IVariable* findMeshVariable(IMesh* mesh, const String& name) override;
195 IVariable* findVariableFullyQualified(const String& name) override;
196
197 void dumpStats(std::ostream& ostr, bool is_verbose) override;
198 void dumpStatsJSON(JSONWriter& writer) override;
199 IVariableUtilities* utilities() const override { return m_utilities; }
200
203 {
204 return m_on_variable_added;
205 }
206
209 {
210 return m_on_variable_removed;
211 }
213 ISubDomain* _internalSubDomain() const override { return m_sub_domain; }
214 IVariableMngInternal* _internalApi() override { return &m_internal_api; }
215
216 public:
217
218 static bool isVariableToSave(IVariable& var);
219
220 private:
221
223 using FullNameVariableMap = std::map<String, IVariable*>;
225 using FullNameVariablePair = FullNameVariableMap::value_type;
226
228 using VariableFactoryMap = std::map<String, IVariableFactory*>;
230 using VariableFactoryPair = VariableFactoryMap::value_type;
231
234 IParallelMng* m_parallel_mng = nullptr;
235 ITimeStats* m_time_stats = nullptr;
236 InternalApi m_internal_api{ this };
238 VariableList m_variables;
239 VariableList m_used_variables;
240 bool m_variables_changed = true;
241 bool m_used_variables_changed = true;
244 VNIMap m_vni_map;
245 IObservable* m_write_observable = nullptr;
246 IObservable* m_read_observable = nullptr;
249 List<IVariableFactory*> m_variable_factories;
252 VariableFactoryMap m_variable_factory_map;
253
255
256 Int64 m_nb_created_variable_reference = 0;
257 Int64 m_nb_created_variable = 0;
258 // Indique dans quel module une variable est créée
259 std::map<IVariable*, IModule*> m_variable_creation_modules;
260
261 IVariableUtilities* m_utilities = nullptr;
262 VariableIOWriterMng* m_variable_io_writer_mng = nullptr;
263 VariableIOReaderMng* m_variable_io_reader_mng = nullptr;
264 VariableSynchronizerMng* m_variable_synchronizer_mng = nullptr;
265
266 Ref<IAcceleratorMng> m_accelerator_mng;
267
268 private:
269
271 void _dumpVariable(const VariableRef& v, std::ostream& o);
272
273 static const char* _msgClassName() { return "Variable"; }
274 VariableRef* _createVariableFromType(const String& full_type,
275 const VariableBuildInfo& vbi);
276
277 void _removeAllShMemVariables();
278};
279
280/*---------------------------------------------------------------------------*/
281/*---------------------------------------------------------------------------*/
285class VariableIOWriterMng
286: public TraceAccessor
287{
288 private:
289
291 : public IVariableFilter
292 {
293 public:
294
295 bool applyFilter(IVariable& var) override
296 {
297 return VariableMng::isVariableToSave(var);
298 }
299 };
300
301 public:
302
303 explicit VariableIOWriterMng(VariableMng* vm);
304
305 public:
306
307 void writeCheckpoint(ICheckpointWriter* service);
308 void writePostProcessing(IPostProcessorWriter* post_processor);
309 void writeVariables(IDataWriter* writer, const VariableCollection& vars, bool use_hash);
310 void writeVariables(IDataWriter* writer, IVariableFilter* filter, bool use_hash);
311
312 private:
313
314 VariableMng* m_variable_mng = nullptr;
315 bool m_use_hash_v2 = false;
316
317 private:
318
319 void _writeVariables(IDataWriter* writer, const VariableCollection& vars, bool use_hash);
320 String _generateMetaData(const VariableCollection& vars, IHashAlgorithm* hash_algo);
321 void _generateVariablesMetaData(JSONWriter& json_writer, XmlNode variables_node,
322 const VariableCollection& vars, IHashAlgorithm* hash_algo);
323 void _generateMeshesMetaData(JSONWriter& json_writer, XmlNode meshes_node);
324 static const char* _msgClassName() { return "Variable"; }
325};
326
327/*---------------------------------------------------------------------------*/
328/*---------------------------------------------------------------------------*/
332class VariableIOReaderMng
333: public TraceAccessor
334{
335 public:
336
337 class IDataReaderWrapper;
339 class DataReaderWrapper;
341
342 public:
343
344 explicit VariableIOReaderMng(VariableMng* vm);
345
346 public:
347
348 void readCheckpoint(ICheckpointReader* service);
349 void readCheckpoint(const CheckpointReadInfo& infos);
350 void readVariables(IDataReader* reader, IVariableFilter* filter);
351
352 private:
353
354 VariableMng* m_variable_mng = nullptr;
355 bool m_is_use_json_metadata = true;
356
357 private:
358
359 void _readVariablesData(VariableReaderMng& var_read_mng, IDataReaderWrapper* reader);
361 void _checkHashFunction(const VariableMetaDataList& vmd_list);
362 void _createVariablesFromMetaData(const VariableMetaDataList& vmd_list);
363 void _readVariablesMetaData(VariableMetaDataList& vmd_list, JSONValue variables_json, const XmlNode& variables_node);
364 void _readMeshesMetaData(JSONValue meshes_json, const XmlNode& meshes_node);
365 void _buildFilteredVariableList(VariableReaderMng& vars_read_mng, IVariableFilter* filter);
366 void _finalizeReadVariables(const VariableList& vars_to_read);
367 static const char* _msgClassName() { return "Variable"; }
368};
369
370/*---------------------------------------------------------------------------*/
371/*---------------------------------------------------------------------------*/
372
373} // namespace Arcane
374
375/*---------------------------------------------------------------------------*/
376/*---------------------------------------------------------------------------*/
377
378#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:77
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.
VariableRef * createVariableFromType(const String &full_type, const VariableBuildInfo &vbi) override
Méthode permettant de créer une variable avec un VariableBuildInfo. Utile pour créer la même variable...
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.