Arcane  v3.14.10.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-2023 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-2024 */
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
41class VariableMetaDataList;
42class VariableReaderMng;
43class XmlNode;
44class VariableIOWriterMng;
45class VariableIOReaderMng;
46class VariableSynchronizerMng;
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;
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
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 detachMeshVariables(IMesh* mesh) override { m_variable_mng->detachMeshVariables(mesh); }
132 void addVariableRef(VariableRef* var) override { m_variable_mng->addVariableRef(var); }
133 void removeVariableRef(VariableRef* var) override { m_variable_mng->removeVariableRef(var); }
134 void addVariable(IVariable* var) override { m_variable_mng->addVariable(var); }
135 void removeVariable(IVariable* var) override { m_variable_mng->removeVariable(var); }
136 void initializeVariables(bool is_continue) override { m_variable_mng->initializeVariables(is_continue); }
137 ISubDomain* internalSubDomain() const override { return m_variable_mng->_internalSubDomain(); }
138 IAcceleratorMng* acceleratorMng() const override { return m_variable_mng->m_accelerator_mng.get(); }
139 void setAcceleratorMng(Ref<IAcceleratorMng> v) override { m_variable_mng->m_accelerator_mng = v; }
140 void addAutoDestroyVariable(VariableRef* var) override { m_variable_mng->m_auto_create_variables.add(var); }
141
142 private:
143
144 VariableMng* m_variable_mng = nullptr;
145 };
146
147 public:
148
150
151 public:
152
153 explicit VariableMng(ISubDomain* sd);
154 ~VariableMng() override;
155
156 public:
157
158 void build() override;
159 void initialize() override;
160 void removeAllVariables() override;
161 void detachMeshVariables(IMesh* mesh) override;
162
163 public:
164
165 ISubDomain* subDomain() override { return m_sub_domain; }
166 IParallelMng* parallelMng() const override { return m_parallel_mng; }
168 IVariable* checkVariable(const VariableInfo& infos) override;
169 void addVariableRef(VariableRef* ref) override;
170 void addVariable(IVariable* var) override;
171 void removeVariableRef(VariableRef*) override;
172 void removeVariable(IVariable* var) override;
173 void dumpList(std::ostream&, IModule*) override;
174 void dumpList(std::ostream&) override;
175 void initializeVariables(bool) override;
177 void variables(VariableRefCollection, IModule*) override;
178 VariableCollection variables() override;
180 void notifyUsedVariableChanged() override { m_used_variables_changed = true; }
181 Real exportSize(const VariableCollection& vars) override;
182 IObservable* writeObservable() override { return m_write_observable; }
183 IObservable* readObservable() override { return m_read_observable; }
184 void writeVariables(IDataWriter*, const VariableCollection& vars) override;
186 void writeCheckpoint(ICheckpointWriter*) override;
188 void readVariables(IDataReader*, IVariableFilter*) override;
189 void readCheckpoint(ICheckpointReader*) override;
190 void readCheckpoint(const CheckpointReadInfo& infos) override;
191 IVariable* findVariable(const String& name) override;
192 IVariable* findMeshVariable(IMesh* mesh, const String& name) override;
193 IVariable* findVariableFullyQualified(const String& name) override;
194
195 void dumpStats(std::ostream& ostr, bool is_verbose) override;
196 void dumpStatsJSON(JSONWriter& writer) override;
197 IVariableUtilities* utilities() const override { return m_utilities; }
198
201 {
202 return m_on_variable_added;
203 }
204
207 {
208 return m_on_variable_removed;
209 }
211 ISubDomain* _internalSubDomain() const override { return m_sub_domain; }
212 IVariableMngInternal* _internalApi() override { return &m_internal_api; }
213
214 public:
215
216 static bool isVariableToSave(IVariable& var);
217
218 private:
219
221 using FullNameVariableMap = std::map<String, IVariable*>;
223 using FullNameVariablePair = FullNameVariableMap::value_type;
224
226 using VariableFactoryMap = std::map<String, IVariableFactory*>;
228 using VariableFactoryPair = VariableFactoryMap::value_type;
229
232 IParallelMng* m_parallel_mng = nullptr;
233 ITimeStats* m_time_stats = nullptr;
234 InternalApi m_internal_api{ this };
236 VariableList m_variables;
237 VariableList m_used_variables;
238 bool m_variables_changed = true;
239 bool m_used_variables_changed = true;
242 VNIMap m_vni_map;
243 IObservable* m_write_observable = nullptr;
244 IObservable* m_read_observable = nullptr;
247 List<IVariableFactory*> m_variable_factories;
250 VariableFactoryMap m_variable_factory_map;
251
252 Integer m_generate_name_id = 0;
253
254 Int64 m_nb_created_variable_reference = 0;
255 Int64 m_nb_created_variable = 0;
256 // Indique dans quel module une variable est créée
257 std::map<IVariable*, IModule*> m_variable_creation_modules;
258
259 IVariableUtilities* m_utilities = nullptr;
260 VariableIOWriterMng* m_variable_io_writer_mng = nullptr;
261 VariableIOReaderMng* m_variable_io_reader_mng = nullptr;
262 VariableSynchronizerMng* m_variable_synchronizer_mng = nullptr;
263
264 Ref<IAcceleratorMng> m_accelerator_mng;
265
266 private:
267
269 void _dumpVariable(const VariableRef& v, std::ostream& o);
270
271 static const char* _msgClassName() { return "Variable"; }
272 VariableRef* _createVariableFromType(const String& full_type,
273 const VariableBuildInfo& vbi);
274};
275
276/*---------------------------------------------------------------------------*/
277/*---------------------------------------------------------------------------*/
282: public TraceAccessor
283{
284 private:
285
287 : public IVariableFilter
288 {
289 public:
290
291 bool applyFilter(IVariable& var) override
292 {
293 return VariableMng::isVariableToSave(var);
294 }
295 };
296
297 public:
298
300
301 public:
302
303 void writeCheckpoint(ICheckpointWriter* service);
304 void writePostProcessing(IPostProcessorWriter* post_processor);
307
308 private:
309
310 VariableMng* m_variable_mng = nullptr;
311 bool m_use_hash_v2 = false;
312
313 private:
314
315 void _writeVariables(IDataWriter* writer, const VariableCollection& vars, bool use_hash);
316 String _generateMetaData(const VariableCollection& vars, IHashAlgorithm* hash_algo);
317 void _generateVariablesMetaData(JSONWriter& json_writer, XmlNode variables_node,
320 static const char* _msgClassName() { return "Variable"; }
321};
322
323/*---------------------------------------------------------------------------*/
324/*---------------------------------------------------------------------------*/
329: public TraceAccessor
330{
331 public:
332
333 class IDataReaderWrapper;
335 class DataReaderWrapper;
337
338 public:
339
341
342 public:
343
344 void readCheckpoint(ICheckpointReader* service);
345 void readCheckpoint(const CheckpointReadInfo& infos);
346 void readVariables(IDataReader* reader, IVariableFilter* filter);
347
348 private:
349
350 VariableMng* m_variable_mng = nullptr;
351 bool m_is_use_json_metadata = true;
352
353 private:
354
355 void _readVariablesData(VariableReaderMng& var_read_mng, IDataReaderWrapper* reader);
358 void _createVariablesFromMetaData(const VariableMetaDataList& vmd_list);
359 void _readVariablesMetaData(VariableMetaDataList& vmd_list, JSONValue variables_json, const XmlNode& variables_node);
360 void _readMeshesMetaData(JSONValue meshes_json, const XmlNode& meshes_node);
361 void _buildFilteredVariableList(VariableReaderMng& vars_read_mng, IVariableFilter* filter);
362 void _finalizeReadVariables(const VariableList& vars_to_read);
363 static const char* _msgClassName() { return "Variable"; }
364};
365
366/*---------------------------------------------------------------------------*/
367/*---------------------------------------------------------------------------*/
368
369} // namespace Arcane
370
371/*---------------------------------------------------------------------------*/
372/*---------------------------------------------------------------------------*/
373
374#endif
Interface du gestionnaire des accélérateurs.
Informations de relecture d'une protection.
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:41
Interface d'écriture des données d'une variable.
Definition IDataWriter.h:49
Interface d'un algorithme de hashage.
Interface d'un module.
Definition IModule.h:39
Interface d'un observable.
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:48
Fonctor 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:54
Représente une valeur JSON.
Definition JSONReader.h:43
Ecrivain au format JSON.
Definition JSONWriter.h:33
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
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 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.
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
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:227
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:304
ITraceMng * traceMng() const
Gestionnaire de trace.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Structure équivalente à la valeur booléenne vrai.