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"
22#include "arcane/utils/Math.h"
24#include "arcane/core/ArcaneException.h"
25#include "arcane/core/VarRefEnumerator.h"
26#include "arcane/core/IModule.h"
27#include "arcane/core/ISubDomain.h"
28#include "arcane/core/IObservable.h"
29#include "arcane/core/VariableInfo.h"
30#include "arcane/core/VariableBuildInfo.h"
31#include "arcane/core/VariableFactoryRegisterer.h"
32#include "arcane/core/IVariableFactory.h"
33#include "arcane/core/ItemGroup.h"
34#include "arcane/core/IMesh.h"
35#include "arcane/core/MeshHandle.h"
36#include "arcane/core/IParallelMng.h"
37#include "arcane/core/ITimeLoopMng.h"
38#include "arcane/core/IEntryPoint.h"
39#include "arcane/core/Properties.h"
40#include "arcane/core/VariableStatusChangedEventArgs.h"
42#include "arcane/impl/VariableUtilities.h"
43#include "arcane/impl/internal/VariableSynchronizerMng.h"
85, m_variable_io_writer_mng(new VariableIOWriterMng(this))
86, m_variable_io_reader_mng(new VariableIOReaderMng(this))
101 delete m_variable_synchronizer_mng;
103 delete m_variable_io_reader_mng;
104 delete m_variable_io_writer_mng;
107 m_write_observable->detachAllObservers();
108 m_read_observable->detachAllObservers();
110 delete m_write_observable;
111 delete m_read_observable;
113 m_variable_factories.each(
Deleter());
124 VariableRef::setTraceCreation(
true);
133 m_time_stats = m_parallel_mng->timeStats();
140 if (m_variable_factory_map.find(full_name)!=m_variable_factory_map.end()){
141 ARCANE_FATAL(
"VariableFactoryMap already contains a factory for the same type '{0}'",
145 m_variable_factories.add(vf);
146 info(5) <<
"Add variable factory kind=" << vff->
itemKind()
150 <<
" full_name=" << full_name
155 m_variable_synchronizer_mng->initialize();
174 remaining_vars.
add(v);
179 const bool has_remaining_vars = !remaining_vars.
empty();
180 if (has_remaining_vars && is_check)
181 pwarning() <<
"The following variables are still referenced: "
183 <<
" (set the environment variable ARCANE_TRACE_VARIABLE_CREATION"
184 <<
" to get the stack trace)";
185 bool has_trace = VariableRef::hasTraceCreation();
187 for(
const auto& i : remaining_vars ){
190 info() <<
" variable name=" << var->
name()
200 if (has_remaining_vars){
205 for(
const auto& i : remaining_vars )
207 remaining_refs.
add(*ivar);
209 r->unregisterVariable();
241 ++m_nb_created_variable_reference;
264 info(5) <<
"Add variable"
265 <<
" name=" << var->
name()
266 <<
" full_name=" << full_name
271 vni.m_local_name = var->
name();
274 m_vni_map.add(vni,var);
277 m_variables_changed =
true;
278 m_used_variables_changed =
true;
279 ++m_nb_created_variable;
283 module = ep->module();
284 m_variable_creation_modules.insert(std::make_pair(var,module));
286 m_on_variable_added.notify(eargs);
304 m_on_variable_removed.notify(eargs);
308 if (!var_group.
null())
314 vni.m_local_name = var->
name();
317 m_vni_map.remove(vni);
319 m_variables_changed =
true;
320 m_used_variables_changed =
true;
321 m_variable_creation_modules.erase(var);
346 ARCANE_FATAL(
"Mesh variable has the same name that a global variable (name={0})",check_name);
353 ARCANE_FATAL(
"Global variable has the same name that a mesh variable (name={0})",check_name);
362 VNIMap::Data* var_data = m_vni_map.lookup(vni);
367 var = var_data->value();
415 mesh_name = mesh_name +
"_";
462 info() <<
"** GENERATED NAME =" << name;
472 o <<
" ** VariableMng::Variable list\n";
475 if ((*ivar)->module()!=c)
488 o <<
" ** VariableMng::Variable list\n";
497 mem_used += i.second->allocatedMemory();
498 o <<
" ** VariableMng::Allocated memory : " << mem_used;
509 o <<
" ** Variable: " << &var <<
" : ";
511 o << var.
name() <<
" = ";
513 o <<
" (Type " << var.
dataType() <<
")\n";
522 ARCANE_UNUSED(is_continue);
524 info() <<
"Initialisation des variables";
529 if (module && !module->
used())
534 var_ref->setUsed(
true);
547 if ((*ivar)->module()==c)
559 if (m_variables_changed){
560 m_variables_changed =
false;
563 m_variables.add(i.second);
575 if (m_used_variables_changed){
576 m_used_variables_changed =
false;
577 m_used_variables.clear();
581 m_used_variables.add(var);
584 return m_used_variables;
599 if (
mesh && !
mesh->properties()->getBool(
"dump"))
610 m_variable_io_writer_mng->writeCheckpoint(service);
619 m_variable_io_writer_mng->writePostProcessing(post_processor);
628 m_variable_io_writer_mng->writeVariables(writer,vars,
false);
637 m_variable_io_writer_mng->writeVariables(writer,filter,
false);
646 auto i = m_variable_factory_map.find(full_type);
647 if (i==m_variable_factory_map.end())
648 ARCANE_FATAL(
"No factory to create variable name={0} type={1}",vbi.name(),full_type);
651 info(5) <<
"Automatic creation of the variable"
652 <<
" name=" << vbi.name()
653 <<
" family=" << vbi.itemFamilyName()
654 <<
" type=" << full_type
672 m_variable_io_reader_mng->readCheckpoint(service);
681 m_variable_io_reader_mng->readCheckpoint(infos);
690 m_variable_io_reader_mng->readVariables(reader,filter);
712 for( VariableCollection::Enumerator i(vars); ++i; ){
729 return m_variable_synchronizer_mng;
745dumpStats(std::ostream& ostr,
bool is_verbose)
748 ostr <<
"\nMemory statistics for variables:\n";
749 ostr <<
" Number of created variables: " << m_nb_created_variable <<
'\n';
750 ostr <<
" Number of created variables reference: " << m_nb_created_variable_reference <<
'\n';
752 ostr <<
" Number of currently reference: " <<
m_variables_ref.count() <<
'\n';
757 Real mem_used[NB_ITEM_KIND];
758 Real mem_used_array = 0.;
759 Real mem_used_particle = 0.;
760 Real mem_used_link = 0.;
761 Real total_mem_used = 0.;
765 for(
Integer i=0; i<NB_ITEM_KIND; ++i ){
778 typedef std::map<IModule*,std::set<IVariable*> > ModuleVariableMap;
779 std::set<IVariable*> variables_with_module;
782 ModuleVariableMap modules_variables;
797 var_module = m_variable_creation_modules[var];
799 variables_with_module.insert(var);
800 modules_variables[var_module].insert(var);
813 memory_sorted_variables.
add(var);
816 if (variables_with_module.find(var)==variables_with_module.end())
817 modules_variables[0].insert(var);
821 total_mem_used += mem;
823 ostr <<
"Var: <" << var->
name() <<
"> Kind=" <<
itemKindName(ik) <<
" Mem=" << mem <<
'\n';
834 mem_used_particle += mem;
838 mem_used_array += mem;
844 ostr <<
"Memory repartition by module:\n";
863 for( ModuleVariableMap::const_iterator imodvar = modules_variables.begin();
864 imodvar!=modules_variables.end(); ++imodvar ){
865 IModule* module = imodvar->first;
866 Real private_mem_used = 0.0;
867 Real shared_mem_used = 0.0;
868 for( std::set<IVariable*>::const_iterator i = imodvar->second.begin();
869 i!=imodvar->second.end(); ++i ){
874 private_mem_used += mem_used2;
876 shared_mem_used += mem_used2;
879 <<
" Mem=" << mem_used <<
" private?=" << is_private <<
'\n';
881 String module_name =
"None";
883 module_name =
module->name();
884 Real module_mem_used = private_mem_used + shared_mem_used;
887 <<
Trace::Width(12) << String::fromNumber(private_mem_used / 1e6,3)
888 <<
Trace::Width(12) << String::fromNumber(shared_mem_used / 1e6,3)
889 <<
Trace::Width(12) << String::fromNumber(module_mem_used / 1e6,3)
890 <<
Trace::Width(7) << String::fromNumber(100.0 * module_mem_used / total_mem_used,1) <<
"%"
891 <<
Trace::Width(12) << String::fromNumber(module_mem_used / ((
Real)nb_cell * 1000.0) ,2)
899 <<
Trace::Width(12) << String::fromNumber(total_mem_used/ 1e6,3)
901 <<
Trace::Width(13) << String::fromNumber(total_mem_used / ((
Real)nb_cell * 1000.0) ,2)
905 for(
Integer i=0; i<NB_ITEM_KIND; ++i ){
907 <<
" Mémoire=" << mem_used[i] <<
'\n';
909 ostr <<
"Variable Particle N=" << nb_var_particle
910 <<
" Mémoire=" << mem_used_particle <<
'\n';
911 ostr <<
"Variable Link N=" << nb_var_link
912 <<
" Mémoire=" << mem_used_link <<
'\n';
913 ostr <<
"Variable Array N=" << nb_var_array
914 <<
" Mémoire=" << mem_used_array <<
'\n';
915 ostr <<
"Variable Total N=" << total_nb_var
916 <<
" Mémoire=" << total_mem_used <<
'\n';
919 std::sort(std::begin(memory_sorted_variables),std::end(memory_sorted_variables),
923 Integer nb_var_to_display = memory_sorted_variables.
size();
925 nb_var_to_display =
math::min(nb_var_to_display,15);
926 ostr <<
"\nBiggest variables (D=Dump, E=Exchange R=Restore):\n";
933 for(
Integer i=0; i<nb_var_to_display; ++i ){
934 IVariable* var = memory_sorted_variables[i];
944 is_no_exchange =
true;
946 properties += (is_no_exchange) ? pr_false : pr_true;
950 <<
Trace::Width(14) << String::fromNumber(mem_used2 / 1e3,3)
963 writer.writeKey(
"Variables");
971 writer.write(
"Used",var->
isUsed());
973 writer.write(
"Name",var->
name());
978 writer.write(
"Mesh",var->
meshName());
981 writer.write(
"AllocatedMemory",mem);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer size() const
Nombre d'éléments du vecteur.
bool empty() const
Capacité (nombre d'éléments alloués) du vecteur.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
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.
Classe utilitaire pour la destruction des objets alloués par new.
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 CellGroup allCells()=0
Groupe de toutes les mailles.
virtual bool used() const =0
true si le module est utilisé.
Interface d'un observable.
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.
virtual IEntryPoint * currentEntryPoint()=0
Retourne le point d'entrée en cours d'exécution ou 0 s'il n'y en a pas.
Interface d'une fabrique de variables.
virtual const String & fullTypeName() const =0
Nom complet du type de la variable.
Fonctor d'un filtre applicable sur des variables.
Interface du gestionnaire de 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 eDataType dataType() const =0
Type de la donnée gérée par la variable (Real, Integer, ...)
virtual String meshName() const =0
Nom du maillage associé (nul si aucun).
virtual void setUsed(bool v)=0
Positionne l'état d'utilisation de la variable.
virtual String itemFamilyName() const =0
Nom de la famille associée (nul si aucune).
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
@ 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.
virtual int property() const =0
Retourne les propriétés de la variable.
virtual eItemKind itemKind() const =0
Type des entités du maillage sur lequel repose la variable.
virtual Integer nbReference() const =0
Nombre de références sur cette variable.
virtual Integer dimension() const =0
Dimension de la variable.
virtual bool isUsed() const =0
Etat d'utilisation de la variable.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual Integer nbElement() const =0
Nombre d'éléments de la variable.
virtual String itemGroupName() const =0
Nom du groupe d'entité associée.
virtual MeshHandle meshHandle() const =0
Maillage auquel est associé la variable.
virtual String name() const =0
Nom de la variable.
void detachObserver(const void *ref)
Détache un observer.
Groupe d'entités de maillage.
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
Integer size() const
Nombre d'éléments du groupe.
bool null() const
true is le groupe est le groupe nul
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul)
IMesh * _internalMeshOrNull() const
Flot de sortie lié à une String.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage pwarning() const
Formattage du flot en longueur.
Vecteur 1D de données avec sémantique par valeur (style STL).
Paramètres nécessaires à la construction d'une variable.
Enregistreur d'une fabrique de variables.
Integer dimension() const
Dimension de la variable créée par cette fabrique.
IVariableFactory * createFactory()
Créé une fabrique pour ce type de variable.
Integer multiTag() const
Tag indiquant le type multiple (0 si non multiple, 1 si multiple, 2 si multiple deprecated)
eDataType dataType() const
Type de données de la variable créée par cette fabrique.
eItemKind itemKind() const
Genre des variables de données de la variable créée par cette fabrique.
VariableFactoryRegisterer * nextVariableFactory() const
VariableFactory suivant (0 si le dernier)
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)
Gestionnaire de variables.
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.
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.
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.
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.
~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.
virtual eDataType dataType() const
Type de la variable (Real, Integer, ...)
virtual void print(std::ostream &o) const
Affiche la valeur de la variable.
virtual IModule * module() const
Module associé à la variable (ou nullptr, s'il n'y en a pas)
IVariable * variable() const
Variable associée.
String name() const
Nom de la variable.
const String & assignmentStackTrace() const
Pile d'appel au moment de l'assignation de cette instance.
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.
__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.
Collection< VariableRef * > VariableRefCollection
Collection de variables.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
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é.
double Real
Type représentant un réel.
const char * dataTypeName(eDataType type)
Nom du type de donnée.