13#ifndef ARCANE_VARIABLE_CC
14#define ARCANE_VARIABLE_CC
18#include "arcane/utils/List.h"
19#include "arcane/utils/FatalErrorException.h"
20#include "arcane/utils/OStringStream.h"
21#include "arcane/utils/Iterator.h"
22#include "arcane/utils/Iostream.h"
23#include "arcane/utils/String.h"
24#include "arcane/utils/ITraceMng.h"
25#include "arcane/utils/PlatformUtils.h"
26#include "arcane/utils/IStackTraceService.h"
27#include "arcane/utils/MemoryAccessInfo.h"
28#include "arcane/utils/NotImplementedException.h"
29#include "arcane/utils/ScopedPtr.h"
30#include "arcane/utils/StringBuilder.h"
31#include "arcane/utils/MemoryView.h"
33#include "arcane/core/ItemGroupObserver.h"
34#include "arcane/core/Variable.h"
35#include "arcane/core/VarRefEnumerator.h"
36#include "arcane/core/IVariableAccessor.h"
37#include "arcane/core/ItemGroup.h"
38#include "arcane/core/IMesh.h"
39#include "arcane/core/IItemFamily.h"
40#include "arcane/core/ISubDomain.h"
41#include "arcane/core/VariableInfo.h"
42#include "arcane/core/ISerializer.h"
43#include "arcane/core/VariableBuildInfo.h"
44#include "arcane/core/VariableComputeFunction.h"
45#include "arcane/core/CommonVariables.h"
46#include "arcane/core/Observable.h"
47#include "arcane/core/IVariableMng.h"
48#include "arcane/core/IDataReader.h"
49#include "arcane/core/IDataWriter.h"
50#include "arcane/core/IParallelMng.h"
51#include "arcane/core/VariableDependInfo.h"
52#include "arcane/core/IParallelReplication.h"
53#include "arcane/core/VariableMetaData.h"
54#include "arcane/core/IMeshMng.h"
55#include "arcane/core/MeshHandle.h"
56#include "arcane/core/datatype/DataAllocationInfo.h"
57#include "arcane/core/internal/IItemFamilyInternal.h"
58#include "arcane/core/internal/IVariableMngInternal.h"
59#include "arcane/core/internal/IVariableInternal.h"
60#include "arcane/core/internal/IDataInternal.h"
86 static std::atomic<Int64> modified_time_global_value;
99 bool m_need_property_update =
false;
113 bool m_want_shrink =
false;
126 switch(
sbuf->mode()){
127 case ISerializer::ModeReserve:
141 " expected_hash_id='{1}'\n"
143 " This may be due to incoherence in variable list (order) between ranks"
144 " during serialization",
161 static const int HASHID_SIZE = 64;
191std::atomic<Int64> VariablePrivate::modified_time_global_value = 1;
199 Int64 v = VariablePrivate::modified_time_global_value;
200 ++VariablePrivate::modified_time_global_value;
209: m_sub_domain(v._subDomain())
210, m_data_factory_mng(v.dataFactoryMng())
211, m_mesh_handle(v.meshHandle())
213, m_property(v.property())
214, m_is_partial(
vi.isPartial())
218 m_infos.setDefaultItemGroupName();
221 if (!platform::getEnvironmentVariable(
"ARCANE_NO_RECURSIVE_DEPEND").null())
222 m_has_recursive_depend =
false;
226 String str = platform::getEnvironmentVariable(
"ARCANE_VARIABLE_SHRINK_MEMORY");
228 m_want_shrink =
true;
243 ARCANE_ASSERT((m_var),(
"Variable pointer null"));
245 if(
var->itemGroup().isAllItems())
246 ARCANE_FATAL(
"No observer should be attached on all items group");
292 ARCANE_ASSERT((
id_to_index->keyLocalId(i) == view[index].localId()),
293 (
"Inconsistent key (pos=%d,key=%d) vs (pos=%d,key=%d)",
294 i,
id_to_index->keyLocalId(i),index,view[index].localId()));
296 destination.
add(index);
308 if (ids.empty())
return;
355 return m_p->m_first_reference;
364 _checkSetProperty(
ref);
366 ref->setNextReference(
m_p->m_first_reference);
367 if (
m_p->m_first_reference){
369 if (
_list->previousReference())
370 _list->previousReference()->setNextReference(
ref);
374 ref->setPreviousReference(0);
376 m_p->m_first_reference =
ref;
387 if (
tmp->previousReference())
388 tmp->previousReference()->setNextReference(
tmp->nextReference());
389 if (
tmp->nextReference())
390 tmp->nextReference()->setPreviousReference(
tmp->previousReference());
391 if (
m_p->m_first_reference==
tmp)
396 ref->setNextReference(0);
397 ref->setPreviousReference(0);
400 _checkSetProperty(
ref);
404 if (!_hasReference()){
408 _removeMeshReference();
411 vm->_internalApi()->removeVariable(
this);
422 return m_p->m_first_reference;
433 if (!_hasReference()){
435 m_p->m_need_property_update =
false;
438 m_p->m_need_property_update =
true;
456 return m_p->m_sub_domain;
531 if (!
m_p->m_need_property_update)
539 m_p->m_need_property_update =
false;
555 int p =
vref->referenceProperty();
609 m_p->m_need_property_update =
true;
627 _checkSetItemFamily();
628 _checkSetItemGroup();
647 _removeMeshReference();
666_removeMeshReference()
704 if (
var->isPartial())
714VariableMetaData* Variable::
715_createMetaData()
const
719 vmd->setFullType(_buildVariableFullType(
this));
720 vmd->setMultiTag(String::fromNumber(
multiTag()));
731 return _createMetaData();
740 return makeRef(_createMetaData());
753 ref->updateFromInternal();
780 if (!
pr->hasReplication())
782 return _checkIfSameOnAllReplica(
pr->replicaParallelMng(),
max_print);
867 ARCANE_FATAL(
"Invalid data: name={0} datatype={1} dimension={2} multitag={3}",
896_setProperty(
int property)
907 return m_p->m_data_factory_mng;
947 ARCANE_FATAL(
"This call is invalid for item variable. Use resizeFromGroup() instead");
949 _internalResize(new_size, additional_capacity);
986 <<
"' with " <<
new_size <<
" items "
1026 ARCANE_FATAL(
"Incoherent family name. var={0} from_type={1} given={2}",
1033 ARCANE_FATAL(
"Cannot have partial variable for a family without unique id map");
1037 <<
" family=" << family
1038 <<
" familyname='" << family_name <<
"'";
1052 if (group_name.null()){
1060 if (internal->parent() && (
mesh()->parallelMng()->isParallel() && internal->isOwn()))
1061 ARCANE_FATAL(
"Cannot add variable ({0}) on a own group (name={1})",
1064 if (group_name.empty())
1065 ARCANE_FATAL(
"Cannot create a partial variable with an empty item_group_name");
1068 internal->attachObserver(
this,
new ItemGroupPartialVariableObserver(
this));
1108 update(DPT_PreviousTime);
1120 if (
vdi.dependType()==DPT_PreviousTime)
1128 if (vdi.dependType()==DPT_CurrentTime)
1133 bool need_update =
false;
1137 Int64 mt = vdi.variable()->modifiedTime();
1138 if (mt>modified_time){
1343 ARCANE_FATAL(
"Can not swap variable values for unused variable (instance)");
1344 if (!
rhs->m_p->m_is_used)
1345 ARCANE_FATAL(
"Can not swap variable values for unused variable (argument)");
1347 ARCANE_FATAL(
"Can not swap variable values for partial variables");
1349 ARCANE_FATAL(
"Can not swap variable values for variables from different groups");
1358 return m_p->m_want_shrink;
1367 data()->setAllocationInfo(v);
1379 return data()->allocationInfo();
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Observable qui appelle automatiquement IObservable::detachAllObservers() dans le destructeur.
Informations sur l'allocation d'une donnée.
Valeur retournée par un algorithme de hashage.
Interface du gestionnaire de fabrique d'une donnée.
Interface d'une opération sur une donnée.
Interface de lecture des données d'une variable.
virtual void read(IVariable *var, IData *data)=0
Lit les données data de la variable var.
Interface d'écriture des données d'une variable.
Interface d'un algorithme de hashage.
Interface d'une famille d'entités.
virtual ItemGroup findGroup(const String &name) const =0
Recherche un groupe.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
virtual Int32 maxLocalId() const =0
virtual bool hasUniqueIdMap() const =0
Indique si la famille possède une table de conversion uniqueId vers localId.
virtual IParallelMng * parallelMng() const =0
Gestionnaire de parallélisme associé
virtual String name() const =0
Nom de la famille.
virtual eItemKind itemKind() const =0
Genre des entités.
virtual IItemFamilyInternal * _internalApi()=0
API interne à Arcane.
virtual IItemFamily * itemFamily(eItemKind ik)=0
Retourne la famille d'entité de type ik.
virtual IItemFamily * findItemFamily(eItemKind ik, const String &name, bool create_if_needed=false, bool register_modifier_if_created=false)=0
Retourne la famille de nom name.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
Interface pour un 'IData' d'un type numérique.
Interface d'un observable.
virtual void notifyAllObservers()=0
Notifie tous les observateurs.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual void gatherVariable(ConstArrayView< char > send_buf, Array< char > &recv_buf, Int32 rank)=0
Effectue un regroupement sur tous les processeurs.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual IParallelReplication * replication() const =0
Informations sur la réplication.
virtual Integer masterIORank() const =0
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
Informations sur la réplication des sous-domaines en parallèle.
Interface du gestionnaire d'un sous-domaine.
virtual const CommonVariables & commonVariables() const =0
Informations sur les variables standards.
virtual IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
virtual IMeshMng * meshMng() const =0
Retourne le gestionnaire de maillage.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
Interface de la classe fonctor de recalcul d'une variable.
Partie interne de Ivariable.
Interface du gestionnaire de variables.
Interface d'une variable.
eDependType
Type des dépendances.
virtual void resizeFromGroup()=0
Positionne le nombre d'éléments pour une variable du maillage.
virtual IData * data()=0
Données associées à la variable.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
static Int64 incrementModifiedTime()
Incrémente le compteur de modification et retourne sa valeur avant modification.
virtual void compact(Int32ConstArrayView new_to_old_ids)=0
Compacte les valeurs de la variable.
@ PSubDomainDepend
Indique que la valeur de la variable est dépendante du sous-domaine.
@ PNoExchange
Indique que la variable ne doit pas être échangée.
@ PNoReplicaSync
Indique que la variable n'a pas forcément la même valeur entre les réplicas.
@ PTemporary
Indique que la variable est temporaire.
@ PExecutionDepend
Indique que la valeur de la variable est dépendante de l'exécution.
@ PPrivate
Indique que la variable est privée.
@ PPersistant
Indique que la variable est persistante.
@ PNoRestore
Indique que la variable ne doit pas être restaurée.
@ PNoNeedSync
Indique que la variable n'est pas nécessairement synchronisée.
@ PNoDump
Indique que la variable ne doit pas être sauvegardée.
virtual void copyItemsValues(Int32ConstArrayView source, Int32ConstArrayView destination)=0
Copie les valeurs des entités numéros source dans les entités numéro destination.
Fonctor pour une fonction de hachage.
void detachObserver(const void *ref)
Détache un observer.
Observer des évènements sur ItemGroup sous-jacent.
void executeCompact(const Int32ConstArrayView *info)
Execute l'action associée au compactage.
bool needInfo() const
Indique si l'observer aura besoin d'information de transition.
void executeReduce(const Int32ConstArrayView *info)
Execute l'action associée à l'extension.
void executeInvalidate()
Execute l'action associée à l'invalidation.
void executeExtend(const Int32ConstArrayView *info)
Execute l'action associée à l'extension.
Groupe d'entités de maillage.
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
const String & name() const
Nom du groupe.
SharedPtrT< GroupIndexTable > localIdToIndex() const
Table des local ids vers une position pour toutes les entités du groupe.
ItemVectorView view() const
Vue sur les entités du groupe.
Integer size() const
Nombre d'éléments du groupe.
bool isAllItems() const
Indique si le groupe est celui de toutes les entités.
bool null() const
true is le groupe est le groupe nul
Vue sur un vecteur d'entités.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
bool hasMesh() const
Indique si le maillage associé a déjà été créé (i.e: mesh() est valide)
bool isNull() const
Indique si le handle est nul (il ne référence aucun maillage existant ou non)
IMesh * mesh() const
Maillage associé.
Paramètres nécessaires à la construction d'une variable.
Informations sur une dépendance de variable.
Infos caractérisant une variable.
const String & itemFamilyName() const
Nom de la famille d'entité à laquelle la variable est associée.
const String & localName() const
Nom de la variable.
Integer multiTag() const
Multi-tag.
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)
void changeAllocator(const MemoryAllocationOptions &alloc_info) override
Change l'allocateur de la variable.
bool m_has_recursive_depend
Vrai si les dépendances sont récursives.
VariableInfo m_infos
Infos caractéristiques de la variable.
IItemFamily * m_item_family
Familly d'entité (peut être nul)
Integer m_nb_reference
Première référence sur la variable.
UniqueArray< VariableDependInfo > m_depends
Liste des dépendances de cette variable.
int m_property
Propriétés de la variable.
AutoDetachObservable m_on_size_changed_observable
Observable en redimensionnement.
Byte m_hash_id[HASHID_SIZE]
hash de la variable pour vérifier la cohérence de la sérialisation.
Real m_last_update_time
Temps physique de la dernière mise à jour.
Int64 m_modified_time
Tag de la dernière modification.
MeshHandle m_mesh_handle
Maillage (peut être nul)
String computeComparisonHashCollective(IHashAlgorithm *hash_algo, IData *sorted_data) override
Calcule de Hash de comparaison pour la variable.
std::map< String, String > m_tags
Liste des tags.
ItemGroup m_item_group
Groupe d'entité sur lequel est associé la variable.
bool m_is_used
Etat d'utilisation de la variable.
void resizeWithReserve(Int32 new_size, Int32 additional_capacity) override
Redimensionne la variable en ajoutant une capacité additionnelle.
void serializeHashId(ISerializer *sbuf)
Sérialise le hashid.
ScopedPtrT< IVariableComputeFunction > m_compute_function
Fonction de calcul.
AutoDetachObservable m_read_observable
Observable en lecture.
AutoDetachObservable m_write_observable
Observable en écriture.
bool m_has_valid_data
Vrai si les données sont valide.
bool m_is_partial
Vrai si la variable est partielle.
Variable * m_variable
Variable associée.
Ref< IData > m_data
Données de la variable.
Référence à une variable.
VariableRef * nextReference()
Référence suivante (ou null) sur variable()
void resizeFromGroup() override
Positionne le nombre d'éléments pour une variable du maillage.
String itemGroupName() const final
Nom du groupe d'entité associée.
IMesh * mesh() const final
Maillage auquel est associé la variable.
void notifyBeginWrite() override
Notifie du début d'écriture de data().
Integer nbReference() const override
Nombre de références sur cette variable.
void removeVariableRef(VariableRef *ref) override
Supprime une référence à cette variable.
void _checkSwapIsValid(Variable *rhs)
Vérifie qu'il est possible d'échanger les valeurs de l'instance avec celle de rhs.
bool isUsed() const override
Etat d'utilisation de la variable.
Variable(const VariableBuildInfo &v, const VariableInfo &vi)
Créé une variable lié à la référence v.
void _setData(const Ref< IData > &data)
Positionne la donnée.
void _setValidData(bool valid_data)
Indique si les données de la variable sont valides.
VariableMetaData * createMetaData() const override
Créé une instance contenant les meta-données de la variable.
IVariableComputeFunction * computeFunction() override
Fonction utilisée pour mettre à jour la variable.
Ref< VariableMetaData > createMetaDataRef() const override
Créé une instance contenant les meta-données de la variable.
bool isPartial() const override
Indique si la variable est partielle.
String tagValue(const String &tagname) override
Valeur du tag tagname. La chaîne est nulle si le tag n'existe pas.
void notifyReferencePropertyChanged() override
Indique que les propriétés d'une des références à cette variable ont changé (interne)
IVariableMng * variableMng() const override
Gestionnaire de variable associé à la variable.
void removeTag(const String &tagname) override
Supprime le tag tagname.
void addDepend(IVariable *var, eDependType dt) override
Ajoute var à la liste des dépendances.
String name() const final
Nom de la variable.
IObservable * readObservable() override
Observable en lecture.
void serialize(ISerializer *sbuffer, IDataOperation *operation) override
ItemGroup itemGroup() const final
Groupe du maillage associé.
IObservable * onSizeChangedObservable() override
Observable en redimensionnement.
void notifyEndRead() override
Notifie de la modification externe de data().
void read(IDataReader *d) override
void syncReferences() override
Synchronise les références.
Integer checkIfSync(Integer max_print) override
Vérifie si la variable est bien synchronisée.
void setUsed(bool v) override
Positionne l'état d'utilisation de la variable.
VariableRef * firstReference() const override
Première réference (ou null) sur cette variable.
String fullName() const final
Nom complet de la variable (avec le préfixe de la famille)
eItemKind itemKind() const override
Type des entités du maillage sur lequel repose la variable.
ISubDomain * subDomain() override
Sous-domaine associé à la variable (TODO rendre obsolète fin 2023)
void update() override
Recalcule la variable si nécessaire.
Integer dimension() const override
Dimension de la variable.
Int64 modifiedTime() override
Temps auquel la variable a été mise à jour.
void setUpToDate() override
Indique que la variable vient d'être mise à jour.
void addTag(const String &tagname, const String &tagvalue) override
Ajoute le tag tagname avev la valeur tagvalue.
~Variable() override
Libère les ressources.
bool _hasValidData() const
Indique si les données de la variable sont valides.
IObservable * writeObservable() override
Observable en écriture.
void addVariableRef(VariableRef *ref) override
Ajoute une référence à cette variable.
Integer multiTag() const override
Indique si la variable est un tableau à taille multiple.
void setComputeFunction(IVariableComputeFunction *v) override
Positionne la fonction de recalcul de la variable.
void resize(Integer n) override
Positionne le nombre d'éléments pour une variable tableau.
IVariableInternal * _internalApi() override
API interne à Arcane.
IItemFamily * itemFamily() const final
Famille d'entité associée.
eDataType dataType() const override
Type de la donnée gérée par la variable (Real, Integer, ...)
void write(IDataWriter *d) override
Sauve la variable.
IDataFactoryMng * dataFactoryMng() const final
Fabrique de données associées à la variable.
void changeGroupIds(Int32ConstArrayView old_to_new_ids) override
pH : EXPERIMENTAL
void removeDepend(IVariable *var) override
Supprime var de la liste des dépendances.
Integer checkIfSameOnAllReplica(Integer max_print) override
Vérifie si la variable a les mêmes valeurs sur tous les réplicas.
VariablePrivate * m_p
Implémentation.
String itemFamilyName() const final
Nom de la famille associée (nul si aucune).
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
int property() const override
void dependInfos(Array< VariableDependInfo > &infos) override
Infos de dépendances.
bool hasTag(const String &tagname) override
true si la variable possède le tag tagname
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
MeshHandle meshHandle() const final
Maillage auquel est associé la variable.
String meshName() const final
Nom du maillage associé (nul si aucun).
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
Interface d'un sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
Options pour configurer les allocations.
Exception lorsqu'une fonction n'est pas implémentée.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
Classe d'accès aux traces.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
Vecteur 1D de données avec sémantique par valeur (style STL).
String toHexaString(ByteConstArrayView input)
Converti un tableau d'octet en sa représentation hexadécimale.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ DIP_Legacy
Initialisation en mode historique.
eDataInitialisationPolicy getGlobalDataInitialisationPolicy()
Récupère la politique d'initialisation des variables.
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
@ IK_DoF
Entité de maillage de genre degre de liberte.
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
eDataType
Type d'une donnée.
@ DT_Byte
Donnée de type octet.
const char * dataTypeName(eDataType type)
Nom du type de donnée.