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/VariableComparer.h" 
   57#include "arcane/core/datatype/DataAllocationInfo.h" 
   58#include "arcane/core/internal/IItemFamilyInternal.h" 
   59#include "arcane/core/internal/IVariableMngInternal.h" 
   60#include "arcane/core/internal/IVariableInternal.h" 
   61#include "arcane/core/internal/IDataInternal.h" 
   85: 
public IVariableInternal
 
   93  static std::atomic<Int64> modified_time_global_value;
 
  106  bool m_need_property_update = 
false;
 
  120  bool m_want_shrink = 
false;
 
  133    switch (sbuf->
mode()) {
 
  134    case ISerializer::ModeReserve:
 
  141      Byte read_hash_id_buf[HASHID_SIZE];
 
  142      Span<Byte> read_span(read_hash_id_buf, HASHID_SIZE);
 
  147                     "  expected_hash_id='{1}'\n" 
  149                     " This may be due to incoherence in variable list (order) between ranks" 
  150                     " during serialization",
 
 
  161  void resize(
const VariableResizeArgs& resize_args) 
override;
 
  168  static const int HASHID_SIZE = 64;
 
  176  Byte m_hash_id[HASHID_SIZE];
 
  180    constexpr Int64 hashid_hexa_length = 16;
 
  181    constexpr Int64 name_length = HASHID_SIZE - hashid_hexa_length;
 
  188    if (bytes.
size() > name_length)
 
  189      bytes = bytes.
subspan(0, name_length);
 
  190    auto hash_id2 = hash_id.subspan(hashid_hexa_length, name_length);
 
  191    hash_id2.copy(bytes);
 
 
  198std::atomic<Int64> VariablePrivate::modified_time_global_value = 1;
 
  206  Int64 v = VariablePrivate::modified_time_global_value;
 
  207  ++VariablePrivate::modified_time_global_value;
 
 
  216: m_sub_domain(v._subDomain())
 
  217, m_data_factory_mng(v.dataFactoryMng())
 
  218, m_mesh_handle(v.meshHandle())
 
  220, m_property(v.property())
 
  221, m_is_partial(vi.isPartial())
 
  229    m_has_recursive_depend = 
false;
 
  235      m_want_shrink = 
true;
 
  243class ItemGroupPartialVariableObserver
 
  248  explicit ItemGroupPartialVariableObserver(
IVariable* var)
 
  251    ARCANE_ASSERT((m_var), (
"Variable pointer null"));
 
  254      ARCANE_FATAL(
"No observer should be attached on all items group");
 
  265    const Integer old_size = id_to_index->size();
 
  267    if (group_size != (old_size + new_ids.
size()))
 
  269    m_var->resizeFromGroup();
 
 
  277    if (removed_lids.
empty())
 
  282    const Integer old_size = id_to_index->size();
 
  285    if (group_size != (old_size - removed_lids.
size()))
 
  286      ARCANE_FATAL(
"Inconsitent reduced size {0} vs {1}", group_size, old_size);
 
  291    destination.
reserve(group_size);
 
  292    for (
Integer i = 0, index = 0, removed_index = 0; i < old_size; ++i) {
 
  293      if (removed_index < removed_lids.
size() &&
 
  294          id_to_index->keyLocalId(i) == removed_lids[removed_index]) {
 
  298        ARCANE_ASSERT((id_to_index->keyLocalId(i) == view[index].localId()),
 
  299                      (
"Inconsistent key (pos=%d,key=%d) vs (pos=%d,key=%d)",
 
  300                       i, id_to_index->keyLocalId(i), index, view[index].localId()));
 
  302          destination.
add(index);
 
  308    m_var->copyItemsValues(source, destination);
 
  309    m_var->resizeFromGroup();
 
 
  319    m_var->compact(*info);
 
 
  327    m_var->resizeFromGroup();
 
 
 
  344, m_p(new VariablePrivate(v, vi, this))
 
 
  365  return m_p->m_first_reference;
 
  374  _checkSetProperty(ref);
 
  375  ++m_p->m_nb_reference;
 
  376  ref->setNextReference(m_p->m_first_reference);
 
  377  if (m_p->m_first_reference) {
 
  381    _list->setPreviousReference(ref);
 
  384    ref->setPreviousReference(0);
 
  386  m_p->m_first_reference = ref;
 
 
  401    if (m_p->m_first_reference == tmp)
 
  402      m_p->m_first_reference = m_p->m_first_reference->nextReference();
 
  406  ref->setNextReference(0);
 
  407  ref->setPreviousReference(0);
 
  409  --m_p->m_nb_reference;
 
  410  _checkSetProperty(ref);
 
  414  if (!_hasReference()) {
 
  416    if (!is_persistant) {
 
  418      _removeMeshReference();
 
 
  432  return m_p->m_first_reference;
 
 
  443  if (!_hasReference()) {
 
  445    m_p->m_need_property_update = 
false;
 
  448    m_p->m_need_property_update = 
true;
 
  457  return m_p->m_nb_reference;
 
 
  466  return m_p->m_sub_domain;
 
 
  475  return m_p->m_sub_domain->variableMng();
 
 
  484  return m_p->m_infos.localName();
 
 
  493  return m_p->m_infos.fullName();
 
 
  502  return m_p->m_infos.itemFamilyName();
 
 
  511  return m_p->m_infos.itemGroupName();
 
 
  520  return m_p->m_infos.meshName();
 
 
  529  return m_p->m_infos.dataType();
 
 
  540  if (!m_p->m_need_property_update)
 
  541    return m_p->m_property;
 
  548  m_p->m_need_property_update = 
false;
 
  550  bool want_dump = 
false;
 
  551  bool want_sync = 
false;
 
  552  bool want_replica_sync = 
false;
 
  553  bool sub_domain_depend = 
false;
 
  554  bool execution_depend = 
false;
 
  555  bool want_private = 
false;
 
  556  bool want_restore = 
false;
 
  557  bool want_notemporary = 
false;
 
  558  bool want_exchange = 
false;
 
  559  bool want_persistant = 
false;
 
  570      want_replica_sync = 
true;
 
  572      sub_domain_depend = 
true;
 
  574      execution_depend = 
true;
 
  576      want_persistant = 
true;
 
  582      want_exchange = 
true;
 
  584      want_notemporary = 
true;
 
  591  if (!want_replica_sync)
 
  593  if (sub_domain_depend)
 
  595  if (execution_depend)
 
  605  if (!want_notemporary)
 
  609  return m_p->m_property;
 
 
  618  m_p->m_need_property_update = 
true;
 
 
  627  if (m_p->m_is_used == is_used)
 
  630  m_p->m_is_used = is_used;
 
  634  if (m_p->m_is_used) {
 
  635    if (m_p->m_item_group.null() && ik != 
IK_Unknown) {
 
  636      _checkSetItemFamily();
 
  637      _checkSetItemGroup();
 
  640      if (!m_p->m_has_valid_data) {
 
  650          m_p->m_data->fillDefault();
 
  651        m_p->m_has_valid_data = 
true;
 
  656    _removeMeshReference();
 
  662    m_p->m_has_valid_data = 
false;
 
  667    ref->internalSetUsed(m_p->m_is_used);
 
 
  675_removeMeshReference()
 
  694  return m_p->m_is_used;
 
 
  714      full_type_b += 
".Partial";
 
  724_createMetaData()
 const 
  728  vmd->setFullType(_buildVariableFullType(
this));
 
  729  vmd->setMultiTag(String::fromNumber(
multiTag()));
 
  740  return _createMetaData();
 
 
  749  return makeRef(_createMetaData());
 
 
  780  return results.nbDifference();
 
 
  793  return r.nbDifference();
 
 
  805  compare_args.setDataReader(reader);
 
  807  return r.nbDifference();
 
 
  816  if (m_p->m_mesh_handle.hasMesh())
 
  817    return m_p->m_mesh_handle.mesh();
 
 
  827  return m_p->m_mesh_handle;
 
 
  836  return m_p->m_item_group;
 
 
  845  return m_p->m_infos.itemKind();
 
 
  854  return m_p->m_infos.dimension();
 
 
  863  return m_p->m_infos.multiTag();
 
 
  872  return m_p->m_is_partial;
 
 
  881  return m_p->m_item_family;
 
 
  892    ARCANE_FATAL(
"Invalid data: name={0} datatype={1} dimension={2} multitag={3}",
 
  893                 m_p->m_infos.fullName(), m_p->m_infos.dataType(),
 
  894                 m_p->m_infos.dimension(), m_p->m_infos.multiTag());
 
  896  data->setName(m_p->m_infos.fullName());
 
 
  905  m_p->m_has_valid_data = valid_data;
 
 
  914  return m_p->m_has_valid_data;
 
 
  921_setProperty(
int property)
 
  932  return m_p->m_data_factory_mng;
 
 
  942  m_p->serializeHashId(sbuffer);
 
  943  m_p->m_data->serialize(sbuffer, ids, operation);
 
 
  957  m_p->serializeHashId(sbuffer);
 
  958  m_p->m_data->serialize(sbuffer, operation);
 
 
  968_resize(
const VariableResizeArgs& resize_args)
 
  972    ARCANE_FATAL(
"This call is invalid for item variable. Use resizeFromGroup() instead");
 
  974  _internalResize(resize_args);
 
  984  _resize(VariableResizeArgs(new_size));
 
 
  999    if (m_p->m_item_group.isAllItems())
 
 1000      new_size = m_p->m_item_family->maxLocalId();
 
 1002      new_size = m_p->m_item_group.size();
 
 1006    if (!group.
null()) {
 
 1011                     << 
"' with " << new_size << 
" items " 
 1012                     << 
" this=" << 
this;
 
 1013  _internalResize(VariableResizeArgs(new_size, new_size / 20));
 
 
 1021_checkSetItemFamily()
 
 1038    if (family_name.
null()) {
 
 1044    family = 
mesh->itemFamily(ik);
 
 1051    ARCANE_FATAL(
"Incoherent family name. var={0} from_type={1} given={2}",
 
 1058    ARCANE_FATAL(
"Cannot have partial variable for a family without unique id map");
 
 1060  m_p->m_item_family = family;
 
 1062                     << 
" family=" << family
 
 1063                     << 
" familyname='" << family_name << 
"'";
 
 1073  if (!m_p->m_item_group.null())
 
 1075  const String& group_name = m_p->m_infos.itemGroupName();
 
 1077  if (group_name.null()) {
 
 1078    m_p->m_item_group = m_p->m_item_family->allItems();
 
 1081    m_p->m_item_group = m_p->m_item_family->findGroup(group_name, 
true);
 
 1083  ItemGroupImpl* internal = m_p->m_item_group.internal();
 
 1085  if (internal->parent() && (
mesh()->parallelMng()->isParallel() && internal->isOwn()))
 
 1086    ARCANE_FATAL(
"Cannot add variable ({0}) on a own group (name={1})",
 
 1089    if (group_name.empty())
 
 1090      ARCANE_FATAL(
"Cannot create a partial variable with an empty item_group_name");
 
 1092                       << 
" to " << m_p->m_item_group.name();
 
 1093    internal->attachObserver(
this, 
new ItemGroupPartialVariableObserver(
this));
 
 1103  return &(m_p->m_write_observable);
 
 
 1112  return &(m_p->m_read_observable);
 
 
 1121  return &(m_p->m_on_size_changed_observable);
 
 
 1133  update(DPT_PreviousTime);
 
 
 1150  if (m_p->m_has_recursive_depend) {
 
 1151    for (
Integer k = 0, n = m_p->m_depends.size(); k < n; ++k) {
 
 1152      VariableDependInfo& vdi = m_p->m_depends[k];
 
 1153      if (vdi.dependType() == DPT_CurrentTime)
 
 1158  bool need_update = 
false;
 
 1159  Int64 modified_time = m_p->m_modified_time;
 
 1160  for (
Integer k = 0, n = m_p->m_depends.size(); k < n; ++k) {
 
 1161    VariableDependInfo& vdi = m_p->m_depends[k];
 
 1162    Int64 mt = vdi.variable()->modifiedTime();
 
 1163    if (mt > modified_time) {
 
 1169    IVariableComputeFunction* cf = m_p->m_compute_function.get();
 
 1197  return m_p->m_modified_time;
 
 
 1234  m_p->m_compute_function = v;
 
 
 1243  return m_p->m_compute_function.get();
 
 
 1252  for (
Integer k = 0, n = m_p->m_depends.size(); k < n; ++k) {
 
 
 1267  m_p->m_tags[tagname] = tagvalue;
 
 
 1276  m_p->m_tags.erase(tagname);
 
 
 1285  return m_p->m_tags.find(tagname) != m_p->m_tags.end();
 
 
 1294  std::map<String, String>::const_iterator i = m_p->m_tags.find(tagname);
 
 1295  if (i == m_p->m_tags.end())
 
 
 1347  ARCANE_UNUSED(old_to_new_ids);
 
 
 1367  if (!m_p->m_is_used)
 
 1368    ARCANE_FATAL(
"Can not swap variable values for unused variable (instance)");
 
 1370    ARCANE_FATAL(
"Can not swap variable values for unused variable (argument)");
 
 1372    ARCANE_FATAL(
"Can not swap variable values for partial variables");
 
 1374    ARCANE_FATAL(
"Can not swap variable values for variables from different groups");
 
 
 1383  return m_p->m_want_shrink;
 
 1429  INumericDataInternal* num_data = sorted_data->_commonInternal()->numericData();
 
 1436  Int32 my_rank = pm->commRank();
 
 1437  Int32 master_rank = pm->masterIORank();
 
 1438  ConstMemoryView memory_view = num_data->memoryView();
 
 1440  UniqueArray<Byte> bytes;
 
 1445  if (my_rank == master_rank) {
 
 1446    HashAlgorithmValue hash_value;
 
 1456void VariablePrivate::
 
 1459  INumericDataInternal* dx = 
m_data->_commonInternal()->numericData();
 
 1461    dx->changeAllocator(mem_options);
 
 1469void VariablePrivate::
 
 1470resize(
const VariableResizeArgs& resize_args)
 
 1481  return m_variable->_compareVariable(compare_args);
 
 1488replicaParallelMng()
 const 
 1493  IParallelMng* pm = (mesh) ? mesh->parallelMng() : 
m_variable->subDomain()->parallelMng();
 
 1494  IParallelReplication* pr = pm->replication();
 
 1495  if (!pr->hasReplication())
 
 1497  return pr->replicaParallelMng();
 
#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.
Classe de base des vecteurs 1D de données.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
Observable qui appelle automatiquement IObservable::detachAllObservers() dans le destructeur.
Real globalTime() const
Temps courant.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
constexpr bool empty() const noexcept
true si le tableau est vide (size()==0)
Informations sur l'allocation d'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.
virtual void write(IVariable *var, IData *data)=0
Ecrit les données data de la variable var.
virtual DataAllocationInfo allocationInfo() const =0
Informations sur l'allocation.
virtual void setAllocationInfo(const DataAllocationInfo &v)=0
Positionne les informations sur l'allocation.
Interface d'un algorithme de hashage.
virtual void computeHash(Span< const std::byte > input, HashAlgorithmValue &value)
Calcule la valeur du hash pour le tableau input.
Interface d'une famille d'entités.
virtual bool hasUniqueIdMap() const =0
Indique si la famille possède une table de conversion uniqueId vers localId.
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 * 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 MeshHandle * findMeshHandle(const String &name, bool throw_exception)=0
Recherche le maillage de nom name.
Interface d'un observable.
virtual void notifyAllObservers()=0
Notifie tous les observateurs.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Interface d'un sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual eMode mode() const =0
Mode de fonctionnement actuel.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual void reserveSpan(eBasicDataType dt, Int64 n)=0
Réserve de la mémoire pour n valeurs de dt.
Interface du gestionnaire d'un sous-domaine.
virtual const CommonVariables & commonVariables() const =0
Informations sur les variables standards.
virtual IMeshMng * meshMng() const =0
Retourne le gestionnaire de maillage.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
Interface de la classe functor de re-calcul d'une variable.
Interface du gestionnaire de variables.
virtual IVariableMngInternal * _internalApi()=0
API interne à Arcane.
Interface d'une variable.
virtual eDataType dataType() const =0
Type de la donnée gérée par la variable (Real, Integer, ...)
eDependType
Type des dépendances.
@ 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 eItemKind itemKind() const =0
Genre des entités du maillage sur lequel repose la variable.
virtual bool isPartial() const =0
Indique si la variable est partielle.
virtual Integer dimension() const =0
Dimension de la variable.
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 Integer multiTag() const =0
Indique si la variable est un tableau à taille multiple.
virtual void update()=0
Recalcule la variable si nécessaire.
static const char * TAG_POST_PROCESSING
Tag utilisé pour indiquer si une variable sera post-traitée.
static const char * TAG_POST_PROCESSING_AT_THIS_ITERATION
Tag utilisé pour indiquer si une variable sera post-traitée à cette itération.
void detachObserver(const void *ref)
Détache un observer.
void executeExtend(const Int32ConstArrayView *info) override
Execute l'action associée à l'extension.
void executeReduce(const Int32ConstArrayView *info) override
Execute l'action associée à l'extension.
void executeInvalidate() override
Execute l'action associée à l'invalidation.
void executeCompact(const Int32ConstArrayView *info) override
Éxecute l'action associée au compactage.
bool needInfo() const override
Indique si l'observer aura besoin d'information de transition.
Groupe d'entités de maillage.
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.
Options pour configurer les allocations.
bool isNull() const
Indique si le handle est nul (il ne référence aucun maillage existant ou non)
IMesh * mesh() const
Maillage associé.
Référence à une instance.
Encapsulation d'un pointeur qui se détruit automatiquement.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Vue d'un tableau d'éléments de type T.
constexpr __host__ __device__ Span< T, DynExtent > subspan(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
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.
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
StringView view() const
Retourne une vue sur la chaîne actuelle.
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.
ITraceMng * traceMng() const
Gestionnaire de trace.
Vecteur 1D de données avec sémantique par valeur (style STL).
Paramètres nécessaires à la construction d'une variable.
Arguments des méthodes de VariableComparer.
void setMaxPrint(Int32 v)
Positionne le nombre d'erreurs à afficher dans le listing.
void setCompareGhost(bool v)
Indique sur quelles entités on fait la comparaison.
Résultats d'une opération de comparaison.
Informations sur une dépendance de variable.
IVariable::eDependType dependType() const
Type de dépendance.
IVariable * variable() const
Variable.
Infos caractérisant une variable.
const String & itemFamilyName() const
Nom de la famille d'entité à laquelle la variable est associée.
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 setDefaultItemGroupName()
Si null, change itemGroupName() en le nom du groupe de toutes les entités de la famille.
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.
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)
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 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.
virtual void updateFromInternal()
Mise à jour à partir de la partie interne.
VariableRef * previousReference()
Référence précédente (ou null) sur variable()
virtual int referenceProperty() const
Propriétés de la référence (interne)
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.
virtual VariableComparerResults _compareVariable(const VariableComparerArgs &compare_args)=0
Comparaison de valeurs entre variables.
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.
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
Genre 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.
Int32 checkIfSame(IDataReader *reader, Integer max_print, bool compare_ghost) final
Vérifie que la variable est identique à une valeur de référence.
~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.
String itemFamilyName() const final
Nom de la famille associée (nul si aucune).
Int32 checkIfSync(Integer max_print) final
Vérifie si la variable est bien synchronisée.
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
int property() const override
Int32 checkIfSameOnAllReplica(Integer max_print) final
Vérifie si la variable a les mêmes valeurs sur tous les réplicas.
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).
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.
std::int64_t Int64
Type entier signé sur 64 bits.
eDataInitialisationPolicy getGlobalDataInitialisationPolicy()
Récupère la politique d'initialisation des variables.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
@ Byte
Donnée de type octet.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
@ SameOnAllReplica
Vérifie que les valeurs de la variable sont les même sur tous les replica.
@ Sync
Vérifie que la variable est bien synchronisée.
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é.
double Real
Type représentant un réel.
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets non modifiables.
unsigned char Byte
Type d'un octet.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
eDataType
Type d'une donnée.
const char * dataTypeName(eDataType type)
Nom du type de donnée.
std::int32_t Int32
Type entier signé sur 32 bits.
Span< DataType > asSpan(Span< std::byte, Extent > bytes)
Converti un Span<std::byte> en un Span<DataType>.