14#include "arcane/impl/internal/VariableMng.h"
16#include "arcane/utils/Deleter.h"
17#include "arcane/utils/StringBuilder.h"
18#include "arcane/utils/FatalErrorException.h"
19#include "arcane/utils/PlatformUtils.h"
20#include "arcane/utils/JSONWriter.h"
21#include "arcane/utils/OStringStream.h"
23#include "arcane/core/ArcaneException.h"
24#include "arcane/core/VarRefEnumerator.h"
25#include "arcane/core/IModule.h"
26#include "arcane/core/ISubDomain.h"
27#include "arcane/core/IObservable.h"
28#include "arcane/core/VariableInfo.h"
29#include "arcane/core/VariableBuildInfo.h"
30#include "arcane/core/VariableFactoryRegisterer.h"
31#include "arcane/core/IVariableFactory.h"
32#include "arcane/core/ItemGroup.h"
33#include "arcane/core/IMesh.h"
34#include "arcane/core/MeshHandle.h"
35#include "arcane/core/IParallelMng.h"
36#include "arcane/core/ITimeLoopMng.h"
37#include "arcane/core/IEntryPoint.h"
38#include "arcane/core/Properties.h"
39#include "arcane/core/VariableStatusChangedEventArgs.h"
41#include "arcane/impl/VariableUtilities.h"
42#include "arcane/impl/internal/VariableSynchronizerMng.h"
59extern "C++" IVariableMng*
60arcaneCreateVariableMng(ISubDomain* sd)
62 auto vm =
new VariableMng(sd);
79, m_parallel_mng(
sd->parallelMng())
100 delete m_variable_synchronizer_mng;
102 delete m_variable_io_reader_mng;
103 delete m_variable_io_writer_mng;
109 delete m_write_observable;
110 delete m_read_observable;
112 m_variable_factories.each(
Deleter());
121 String s = platform::getEnvironmentVariable(
"ARCANE_TRACE_VARIABLE_CREATION");
123 VariableRef::setTraceCreation(
true);
132 m_time_stats = m_parallel_mng->
timeStats();
139 if (m_variable_factory_map.find(
full_name)!=m_variable_factory_map.end()){
140 ARCANE_FATAL(
"VariableFactoryMap already contains a factory for the same type '{0}'",
144 m_variable_factories.add(
vf);
145 info(5) <<
"Add variable factory kind=" <<
vff->itemKind()
146 <<
" data_type=" <<
vff->dataType()
147 <<
" dim=" <<
vff->dimension()
148 <<
" multi_tag=" <<
vff->multiTag()
151 vff =
vff->nextVariableFactory();
154 m_variable_synchronizer_mng->initialize();
180 pwarning() <<
"The following variables are still referenced: "
182 <<
" (set the environment variable ARCANE_TRACE_VARIABLE_CREATION"
183 <<
" to get the stack trace)";
184 bool has_trace = VariableRef::hasTraceCreation();
189 info() <<
" variable name=" <<
var->name()
190 <<
" stack=" <<
var->assignmentStackTrace();
208 r->unregisterVariable();
227 if (group.
mesh()==mesh){
240 ++m_nb_created_variable_reference;
263 info(5) <<
"Add variable"
264 <<
" name=" <<
var->name()
266 <<
" datatype=" <<
var->dataType()
267 <<
" kind=" <<
var->itemKind();
270 vni.m_local_name =
var->name();
271 vni.m_family_name =
var->itemFamilyName();
272 vni.m_mesh_name =
var->meshName();
276 m_variables_changed =
true;
277 m_used_variables_changed =
true;
278 ++m_nb_created_variable;
282 module = ep->module();
283 m_variable_creation_modules.insert(std::make_pair(
var,module));
285 m_on_variable_added.notify(
eargs);
294 int p =
var->property();
296 debug() <<
"** ** REMOVE " <<
var->name() <<
" " <<
var->nbReference()
303 m_on_variable_removed.notify(
eargs);
313 vni.m_local_name =
var->name();
314 vni.m_family_name =
var->itemFamilyName();
315 vni.m_mesh_name =
var->meshName();
318 m_variables_changed =
true;
319 m_used_variables_changed =
true;
320 m_variable_creation_modules.erase(
var);
461 info() <<
"** GENERATED NAME =" << name;
471 o <<
" ** VariableMng::Variable list\n";
474 if ((*ivar)->module()!=
c)
487 o <<
" ** VariableMng::Variable list\n";
496 mem_used += i.second->allocatedMemory();
497 o <<
" ** VariableMng::Allocated memory : " <<
mem_used;
508 o <<
" ** Variable: " << &
var <<
" : ";
510 o <<
var.name() <<
" = ";
512 o <<
" (Type " <<
var.dataType() <<
")\n";
523 info() <<
"Initialisation des variables";
527 IModule*
module = var_ref->module();
528 if (module && !module->used())
546 if ((*ivar)->module()==
c)
558 if (m_variables_changed){
559 m_variables_changed =
false;
562 m_variables.add(i.second);
574 if (m_used_variables_changed){
575 m_used_variables_changed =
false;
576 m_used_variables.clear();
580 m_used_variables.add(
var);
583 return m_used_variables;
597 IMesh* mesh =
var.meshHandle()._internalMeshOrNull();
598 if (mesh && !mesh->
properties()->getBool(
"dump"))
609 m_variable_io_writer_mng->writeCheckpoint(service);
645 auto i = m_variable_factory_map.find(
full_type);
646 if (i==m_variable_factory_map.end())
650 info(5) <<
"Automatic creation of the variable"
651 <<
" name=" <<
vbi.name()
652 <<
" family=" <<
vbi.itemFamilyName()
671 m_variable_io_reader_mng->readCheckpoint(service);
680 m_variable_io_reader_mng->readCheckpoint(infos);
689 m_variable_io_reader_mng->readVariables(reader,
filter);
705 Real n = (Real)(
var->allocatedMemory());
728 return m_variable_synchronizer_mng;
747 ostr <<
"\nMemory statistics for variables:\n";
748 ostr <<
" Number of created variables: " << m_nb_created_variable <<
'\n';
749 ostr <<
" Number of created variables reference: " << m_nb_created_variable_reference <<
'\n';
755 Integer
nb_var[NB_ITEM_KIND];
764 for( Integer i=0; i<NB_ITEM_KIND; ++i ){
788 if (
var->dimension()==0)
810 if (
var->dimension()==0)
819 Real
mem =
var->allocatedMemory();
843 ostr <<
"Memory repartition by module:\n";
864 IModule*
module = imodvar->first;
867 for( std::set<IVariable*>::const_iterator i =
imodvar->second.begin();
868 i!=
imodvar->second.end(); ++i ){
904 for( Integer i=0; i<NB_ITEM_KIND; ++i ){
906 <<
" Mémoire=" <<
mem_used[i] <<
'\n';
925 ostr <<
"\nBiggest variables (D=Dump, E=Exchange R=Restore):\n";
962 writer.writeKey(
"Variables");
966 if (
var->dimension()==0)
971 Real
mem =
var->allocatedMemory();
974 writer.write(
"Dimension",(Int64)
var->dimension());
975 writer.write(
"NbElement",(Int64)
var->nbElement());
976 writer.write(
"ItemFamily",
var->itemFamilyName());
978 writer.write(
"Group",
var->itemGroupName());
979 writer.write(
"Property",(Int64)
var->property());
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Exception sur un nom de groupe d'items de variable partielle non valide.
Exception sur un genre/type de variable non valide.
Informations de relecture d'une protection.
Integer count() const
Nombre d'éléments de la collection.
Classe utilitaire pour la destruction des objets alloués par new.
Data * lookup(KeyTypeConstRef id)
Recherche la valeur correspondant à la clé id.
void remove(KeyTypeConstRef id)
Supprime la valeur associée à la clé id.
bool add(KeyTypeConstRef id, const ValueType &value)
Ajoute la valeur value correspondant à la clé id.
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.
Interface d'écriture des données d'une variable.
Interface d'un point d'entrée d'un module.
virtual String name() const =0
Nom du maillage.
virtual Properties * properties()=0
Propriétés associées à ce maillage.
Interface d'un observable.
virtual void detachAllObservers()=0
Détache tous les observeurs associés à cette instance.
virtual ITimeStats * timeStats() const =0
Gestionnaire de statistiques associé (peut être nul)
Interface d'un écrivain pour les informations de post-traitement.
Interface du gestionnaire d'un sous-domaine.
virtual void checkId(const String &where, const String &id)=0
Vérifie qu'un identifiant est valide.
virtual IMesh * defaultMesh()=0
Maillage par défaut.
virtual ITimeLoopMng * timeLoopMng()=0
Retourne le gestionnaire de la boucle en temps.
Interface d'une fabrique de variables.
Fonctor d'un filtre applicable sur des variables.
Interface du gestionnaire de synchronisation des variables.
Interface d'une variable.
virtual Real allocatedMemory() const =0
Taille mémoire (en Koctet) utilisée par la variable.
virtual void setUsed(bool v)=0
Positionne l'état d'utilisation de la variable.
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
virtual Integer nbReference() const =0
Nombre de références sur cette variable.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
@ PNoExchange
Indique que la variable ne doit pas être échangée.
@ PTemporary
Indique que la variable est temporaire.
@ PNoRestore
Indique que la variable ne doit pas être restaurée.
@ PNoDump
Indique que la variable ne doit pas être sauvegardée.
Groupe d'entités de maillage.
bool null() const
true is le groupe est le groupe nul
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul)
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Function each(Function f)
Applique le fonctor f à tous les éléments du tableau.
Flot de sortie lié à une String.
Paramètres nécessaires à la construction d'une variable.
Enregistreur d'une fabrique de variables.
Gestion de la lecture pour les variables.
Gestion de l'écriture pour les variables.
void writeVariables(IDataWriter *writer, const VariableCollection &vars, bool use_hash)
Infos caractérisant une variable.
bool isPartial() const
Indique si la variable est partielle.
const String & itemFamilyName() const
Nom de la famille d'entité à laquelle la variable est associée.
const String & localName() const
Nom de la variable.
eItemKind itemKind() const
Type d'entité de maillage.
const String & itemGroupName() const
Nom du groupe d'entité à laquelle la variable est associée.
Integer dimension() const
Dimension.
eDataType dataType() const
Type des éléments.
const String & meshName() const
Nom du maillage auquel la variable est associée.
const String & fullName() const
Nom complet de la variable (associé à la famille)
IVariable * checkVariable(const VariableInfo &infos) override
Vérifie une variable.
Real exportSize(const VariableCollection &vars) override
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.
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.
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.
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.
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 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.
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.
void writePostProcessing(IPostProcessorWriter *writer) override
Ecrit les variables pour un post-traitement.
IVariableSynchronizerMng * synchronizerMng() const override
Interface du gestionnaire de synchronisation des variables.
~VariableMng() override
Détruit le gestionnaire.
VariableCollection variables() override
Liste des variables.
void initializeVariables(bool) override
Initialise les variables.
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.
Référence à une variable.
Trieur de variable suivant leur taille mémoire utilisée.
Arguments de l'évènement notifiant un changement de l'état d'une variable.
@ Removed
Variable supprimée.
Gestionnaire des synchroniseurs de variables.
Fonctions utilitaires sur les variables.
Constructeur de chaîne de caractère unicode.
String toString() const
Retourne la chaîne de caractères construite.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Classe d'accès aux traces.
TraceMessage pwarning() const
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
Formattage du flot en longueur.
ARCCORE_HOST_DEVICE Real2 min(Real2 a, Real2 b)
Retourne le minimum de deux Real2.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool arcaneIsCheck()
Vrai si on est en mode vérification.
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
@ IK_Face
Entité de maillage de genre face.
@ IK_DoF
Entité de maillage de genre degre de liberte.
@ IK_Edge
Entité de maillage de genre arête.
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
const char * dataTypeName(eDataType type)
Nom du type de donnée.