Arcane  v4.1.7.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Variable.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* Variable.cc (C) 2000-2026 */
9/* */
10/* Classe gérant une variable. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13#ifndef ARCANE_VARIABLE_CC
14#define ARCANE_VARIABLE_CC
15/*---------------------------------------------------------------------------*/
16/*---------------------------------------------------------------------------*/
17
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"
32
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"
62#include "arcane/core/internal/IParallelMngInternal.h"
63
64#include <map>
65#include <set>
66#include <atomic>
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70
71namespace Arcane
72{
73
74/*---------------------------------------------------------------------------*/
75/*---------------------------------------------------------------------------*/
76
77const char* IVariable::TAG_POST_PROCESSING = "PostProcessing";
78const char* IVariable::TAG_POST_PROCESSING_AT_THIS_ITERATION = "PostProcessingAtThisIteration";
79
80/*---------------------------------------------------------------------------*/
81/*---------------------------------------------------------------------------*/
82/*
83 * \brief Partie privée d'une variable.
84 */
85class VariablePrivate
86: public IVariableInternal
87{
88 public:
89
90 VariablePrivate(const VariableBuildInfo& v, const VariableInfo& vi, Variable* var);
91
92 public:
93
94 static std::atomic<Int64> modified_time_global_value;
95
96 public:
97
98 ISubDomain* m_sub_domain = nullptr;
99 IDataFactoryMng* m_data_factory_mng = nullptr;
100 MeshHandle m_mesh_handle; //!< Maillage (peut être nul)
101 Ref<IData> m_data; //!< Données de la variable
102 ItemGroup m_item_group; //!< Groupe d'entité sur lequel est associé la variable
103 IItemFamily* m_item_family = nullptr; //!< Familly d'entité (peut être nul)
104 VariableInfo m_infos; //!< Infos caractéristiques de la variable
105 int m_property = 0; //!< Propriétés de la variable
106 bool m_is_partial = false; //!< Vrai si la variable est partielle
107 bool m_need_property_update = false;
108 bool m_is_used = false; //!< Etat d'utilisation de la variable
109 bool m_has_valid_data = false; //!< Vrai si les données sont valide
110 Real m_last_update_time = 0.0; //!< Temps physique de la dernière mise à jour
111 VariableRef* m_first_reference = nullptr; //! Première référence sur la variable
113 UniqueArray<VariableDependInfo> m_depends; //!< Liste des dépendances de cette variable
114 Int64 m_modified_time = 0; //!< Tag de la dernière modification
116 AutoDetachObservable m_write_observable; //!< Observable en écriture
117 AutoDetachObservable m_read_observable; //!< Observable en lecture
118 AutoDetachObservable m_on_size_changed_observable; //!< Observable en redimensionnement
119 std::map<String, String> m_tags; //!< Liste des tags
120 bool m_has_recursive_depend = true; //!< Vrai si les dépendances sont récursives
121 bool m_want_shrink = false;
122 Variable* m_variable = nullptr; //!< Variable associée
123
124 public:
125
126 /*!
127 * \brief Sérialise le `hashid`.
128 *
129 * Lors de la désérialisation, vérifie que le `hashid` est correctement
130 * et si ce n'est pas le cas renvoie une exception.
131 */
133 {
134 switch (sbuf->mode()) {
135 case ISerializer::ModeReserve:
136 sbuf->reserveSpan(eBasicDataType::Byte, HASHID_SIZE);
137 break;
139 sbuf->putSpan(Span<const Byte>(m_hash_id, HASHID_SIZE));
140 break;
142 Byte read_hash_id_buf[HASHID_SIZE];
143 Span<Byte> read_span(read_hash_id_buf, HASHID_SIZE);
144 sbuf->getSpan(read_span);
145 Span<const Byte> ref_span(m_hash_id, HASHID_SIZE);
146 if (ref_span != Span<const Byte>(read_span))
147 ARCANE_FATAL("Bad hashid for variable name='{0}'\n"
148 " expected_hash_id='{1}'\n"
149 " hash_id ='{2}'\n"
150 " This may be due to incoherence in variable list (order) between ranks"
151 " during serialization",
152 m_infos.fullName(), String(ref_span), String(read_span));
153 } break;
154 }
155 }
156
157 public:
158
159 //!@{ \name Implémentation de IVariableInternal
160 String computeComparisonHashCollective(IHashAlgorithm* hash_algo, IData* sorted_data) override;
161 void changeAllocator(const MemoryAllocationOptions& alloc_info) override;
162 void resize(const VariableResizeArgs& resize_args) override;
163 VariableComparerResults compareVariable(const VariableComparerArgs& compare_args) override;
164 IParallelMng* replicaParallelMng() const;
165 //!@}
166
167 private:
168
169 static const int HASHID_SIZE = 64;
170 /*!
171 * \brief hash de la variable pour vérifier la cohérence de la sérialisation.
172 *
173 * Les 16 premiers octets sont le hash du nom au format hexadécimal (issu d'un Int64)
174 * et les suivants sont le nom complet (fullName()), éventuellement tronqué, de la variable.
175 * Les éventuels caractères restants sont des '~'.
176 */
177 Byte m_hash_id[HASHID_SIZE];
178
179 void _setHashId()
180 {
181 constexpr Int64 hashid_hexa_length = 16;
182 constexpr Int64 name_length = HASHID_SIZE - hashid_hexa_length;
183 Span<Byte> hash_id(m_hash_id, HASHID_SIZE);
184 hash_id.fill('~');
185 const String& full_name = m_infos.fullName();
186 Int64 hash_value = IntegerHashFunctionT<StringView>::hashfunc(full_name.view());
187 Convert::toHexaString(hash_value, hash_id);
188 Span<const Byte> bytes = full_name.bytes();
189 if (bytes.size() > name_length)
190 bytes = bytes.subspan(0, name_length);
191 auto hash_id2 = hash_id.subspan(hashid_hexa_length, name_length);
192 hash_id2.copy(bytes);
193 }
194};
195
196/*---------------------------------------------------------------------------*/
197/*---------------------------------------------------------------------------*/
198
199std::atomic<Int64> VariablePrivate::modified_time_global_value = 1;
200
201/*---------------------------------------------------------------------------*/
202/*---------------------------------------------------------------------------*/
203
206{
207 Int64 v = VariablePrivate::modified_time_global_value;
208 ++VariablePrivate::modified_time_global_value;
209 return v;
210}
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
215VariablePrivate::
216VariablePrivate(const VariableBuildInfo& v, const VariableInfo& vi, Variable* var)
217: m_sub_domain(v._subDomain())
218, m_data_factory_mng(v.dataFactoryMng())
219, m_mesh_handle(v.meshHandle())
220, m_infos(vi)
221, m_property(v.property())
222, m_is_partial(vi.isPartial())
223, m_variable(var)
224{
225 _setHashId();
226 m_infos.setDefaultItemGroupName();
227
228 // Pour test uniquement
229 if (!platform::getEnvironmentVariable("ARCANE_NO_RECURSIVE_DEPEND").null())
230 m_has_recursive_depend = false;
231
232 // Pour teste de libération mémoire.
233 {
234 String str = platform::getEnvironmentVariable("ARCANE_VARIABLE_SHRINK_MEMORY");
235 if (str == "1")
236 m_want_shrink = true;
237 }
238}
239
240/*---------------------------------------------------------------------------*/
241/*---------------------------------------------------------------------------*/
242
243//! Observer des évènements sur ItemGroup sous-jacent.
244class ItemGroupPartialVariableObserver
245: public IItemGroupObserver
246{
247 public:
248
249 explicit ItemGroupPartialVariableObserver(IVariable* var)
250 : m_var(var)
251 {
252 ARCANE_ASSERT((m_var), ("Variable pointer null"));
253
254 if (var->itemGroup().isAllItems())
255 ARCANE_FATAL("No observer should be attached on all items group");
256 }
257
258 void executeExtend(const Int32ConstArrayView* info) override
259 {
260 const Int32ConstArrayView& new_ids = *info;
261 if (new_ids.empty())
262 return;
263 ItemGroup group = m_var->itemGroup();
264 SharedPtrT<GroupIndexTable> id_to_index = group.localIdToIndex();
265
266 const Integer old_size = id_to_index->size();
267 const Integer group_size = group.size();
268 if (group_size != (old_size + new_ids.size()))
269 ARCANE_FATAL("Inconsitent extended size");
270 m_var->resizeFromGroup();
271 //id_to_index->update();
272 }
273
274 void executeReduce(const Int32ConstArrayView* info) override
275 {
276 // contient la liste des localids des items supprimés dans l'ancien groupe
277 const Int32ConstArrayView& removed_lids = *info;
278 if (removed_lids.empty())
279 return;
280 ItemGroup group = m_var->itemGroup();
281 SharedPtrT<GroupIndexTable> id_to_index = group.localIdToIndex();
282
283 const Integer old_size = id_to_index->size();
284 const Integer group_size = group.size();
285
286 if (group_size != (old_size - removed_lids.size()))
287 ARCANE_FATAL("Inconsitent reduced size {0} vs {1}", group_size, old_size);
288 [[maybe_unused]] ItemVectorView view = group.view();
289 Int32UniqueArray source;
290 Int32UniqueArray destination;
291 source.reserve(group_size);
292 destination.reserve(group_size);
293 for (Integer i = 0, index = 0, removed_index = 0; i < old_size; ++i) {
294 if (removed_index < removed_lids.size() &&
295 id_to_index->keyLocalId(i) == removed_lids[removed_index]) {
296 ++removed_index;
297 }
298 else {
299 ARCANE_ASSERT((id_to_index->keyLocalId(i) == view[index].localId()),
300 ("Inconsistent key (pos=%d,key=%d) vs (pos=%d,key=%d)",
301 i, id_to_index->keyLocalId(i), index, view[index].localId()));
302 if (i != index) {
303 destination.add(index);
304 source.add(i);
305 }
306 ++index;
307 }
308 }
309 m_var->copyItemsValues(source, destination);
310 m_var->resizeFromGroup();
311 }
312
313 void executeCompact(const Int32ConstArrayView* info) override
314 {
315 const Int32ConstArrayView& ids = *info;
316 if (ids.empty())
317 return;
318 ItemGroup group = m_var->itemGroup();
319 SharedPtrT<GroupIndexTable> id_to_index = group.localIdToIndex();
320 m_var->compact(*info);
321 //id_to_index->compact(info);
322 }
323
324 void executeInvalidate() override
325 {
326 ItemGroup group = m_var->itemGroup();
327 SharedPtrT<GroupIndexTable> id_to_index = group.localIdToIndex();
328 m_var->resizeFromGroup();
329 //id_to_index->update();
330 }
331
332 bool needInfo() const override { return true; }
333
334 private:
335
336 IVariable* m_var = nullptr;
337};
338
339/*---------------------------------------------------------------------------*/
340/*---------------------------------------------------------------------------*/
341
343Variable(const VariableBuildInfo& v, const VariableInfo& vi)
345, m_p(new VariablePrivate(v, vi, this))
346{
347}
348
349/*---------------------------------------------------------------------------*/
350/*---------------------------------------------------------------------------*/
351
353~Variable()
354{
355 //NOTE: si la variable possède un groupe, c'est le IVariableMng
356 // qui supprime la référence de cette variable sur le groupe
357 delete m_p;
358}
359
360/*---------------------------------------------------------------------------*/
361/*---------------------------------------------------------------------------*/
362
363bool Variable::
364_hasReference() const
365{
366 return m_p->m_first_reference;
367}
368
369/*---------------------------------------------------------------------------*/
370/*---------------------------------------------------------------------------*/
371
374{
375 _checkSetProperty(ref);
376 ++m_p->m_nb_reference;
377 ref->setNextReference(m_p->m_first_reference);
378 if (m_p->m_first_reference) {
379 VariableRef* _list = m_p->m_first_reference;
380 if (_list->previousReference())
381 _list->previousReference()->setNextReference(ref);
382 _list->setPreviousReference(ref);
383 }
384 else {
385 ref->setPreviousReference(0);
386 }
387 m_p->m_first_reference = ref;
388}
389
390/*---------------------------------------------------------------------------*/
391/*---------------------------------------------------------------------------*/
392
395{
396 {
397 VariableRef* tmp = ref;
398 if (tmp->previousReference())
399 tmp->previousReference()->setNextReference(tmp->nextReference());
400 if (tmp->nextReference())
401 tmp->nextReference()->setPreviousReference(tmp->previousReference());
402 if (m_p->m_first_reference == tmp)
403 m_p->m_first_reference = m_p->m_first_reference->nextReference();
404 }
405 // La référence peut être utilisée par la suite donc il ne faut pas oublier
406 // de supprimer le précédent et le suivant.
407 ref->setNextReference(0);
408 ref->setPreviousReference(0);
409
410 --m_p->m_nb_reference;
411 _checkSetProperty(ref);
412
413 // Lorsqu'il n'y a plus de références sur cette variable, le signale au
414 // gestionnaire de variable, sauf s'il s'agit d'une variable persistante
415 if (!_hasReference()) {
416 bool is_persistant = property() & IVariable::PPersistant;
417 if (!is_persistant) {
418 //m_p->m_trace->info() << " REF PROPERTY name=" << name() << " " << ref->referenceProperty();
419 _removeMeshReference();
420 ISubDomain* sd = m_p->m_sub_domain;
421 IVariableMng* vm = sd->variableMng();
422 vm->_internalApi()->removeVariable(this);
423 }
424 }
425}
426
427/*---------------------------------------------------------------------------*/
428/*---------------------------------------------------------------------------*/
429
431firstReference() const
432{
433 return m_p->m_first_reference;
434}
435
436/*---------------------------------------------------------------------------*/
437/*---------------------------------------------------------------------------*/
438
439void Variable::
440_checkSetProperty(VariableRef* ref)
441{
442 // Garantie que la propriété est correctement mise à jour avec la valeur
443 // de la seule référence.
444 if (!_hasReference()) {
445 m_p->m_property = ref->referenceProperty();
446 m_p->m_need_property_update = false;
447 }
448 else
449 m_p->m_need_property_update = true;
450}
451
452/*---------------------------------------------------------------------------*/
453/*---------------------------------------------------------------------------*/
454
456nbReference() const
457{
458 return m_p->m_nb_reference;
459}
460
461/*---------------------------------------------------------------------------*/
462/*---------------------------------------------------------------------------*/
463
465subDomain()
466{
467 return m_p->m_sub_domain;
468}
469
470/*---------------------------------------------------------------------------*/
471/*---------------------------------------------------------------------------*/
472
474variableMng() const
475{
476 return m_p->m_sub_domain->variableMng();
477}
478
479/*---------------------------------------------------------------------------*/
480/*---------------------------------------------------------------------------*/
481
483name() const
484{
485 return m_p->m_infos.localName();
486}
487
488/*---------------------------------------------------------------------------*/
489/*---------------------------------------------------------------------------*/
490
492fullName() const
493{
494 return m_p->m_infos.fullName();
495}
496
497/*---------------------------------------------------------------------------*/
498/*---------------------------------------------------------------------------*/
499
501itemFamilyName() const
502{
503 return m_p->m_infos.itemFamilyName();
504}
505
506/*---------------------------------------------------------------------------*/
507/*---------------------------------------------------------------------------*/
508
510itemGroupName() const
511{
512 return m_p->m_infos.itemGroupName();
513}
514
515/*---------------------------------------------------------------------------*/
516/*---------------------------------------------------------------------------*/
517
519meshName() const
520{
521 return m_p->m_infos.meshName();
522}
523
524/*---------------------------------------------------------------------------*/
525/*---------------------------------------------------------------------------*/
526
528dataType() const
529{
530 return m_p->m_infos.dataType();
531}
532
533/*---------------------------------------------------------------------------*/
534/*---------------------------------------------------------------------------*/
535/*!
536 * \todo traiter le cas PSubDomainPrivate.
537 */
539property() const
540{
541 if (!m_p->m_need_property_update)
542 return m_p->m_property;
543
544 // Les propriétés de la variable dépendent de ce que chaque
545 // référence souhaite et il faut les remettre à jour lorsque ces
546 // dernières changent.
547 // Par exemple, si toutes les références sont PNoDump et qu'une seule
548 // ne l'est pas, la variable ne doit pas l'être.
549 m_p->m_need_property_update = false;
550
551 bool want_dump = false;
552 bool want_sync = false;
553 bool want_replica_sync = false;
554 bool sub_domain_depend = false;
555 bool execution_depend = false;
556 bool want_private = false;
557 bool want_restore = false;
558 bool want_notemporary = false;
559 bool want_exchange = false;
560 bool want_persistant = false;
561 bool want_shmem = false;
562 bool want_dumpnull = false;
563
564 int property = 0;
565 for (VarRefEnumerator i(this); i.hasNext(); ++i) {
566 VariableRef* vref = *i;
567 int p = vref->referenceProperty();
568 if (!(p & IVariable::PNoDump))
569 want_dump = true;
570 if (!(p & IVariable::PNoNeedSync))
571 want_sync = true;
572 if (!(p & IVariable::PNoReplicaSync))
573 want_replica_sync = true;
575 sub_domain_depend = true;
577 execution_depend = true;
578 if ((p & IVariable::PPersistant))
579 want_persistant = true;
580 if ((p & IVariable::PPrivate))
581 want_private = true;
582 if (!(p & IVariable::PNoRestore))
583 want_restore = true;
584 if (!(p & IVariable::PNoExchange))
585 want_exchange = true;
586 if (!(p & IVariable::PTemporary))
587 want_notemporary = true;
588 if ((p & IVariable::PInShMem))
589 want_shmem = true;
590 if ((p & IVariable::PDumpNull))
591 want_dumpnull = true;
592 }
593
594 if (!want_dump)
595 property |= IVariable::PNoDump;
596 if (!want_sync)
597 property |= IVariable::PNoNeedSync;
598 if (!want_replica_sync)
599 property |= IVariable::PNoReplicaSync;
600 if (sub_domain_depend)
601 property |= IVariable::PSubDomainDepend;
602 if (execution_depend)
603 property |= IVariable::PExecutionDepend;
604 if (want_private)
605 property |= IVariable::PPrivate;
606 if (want_persistant)
607 property |= IVariable::PPersistant;
608 if (!want_restore)
609 property |= IVariable::PNoRestore;
610 if (!want_exchange)
611 property |= IVariable::PNoExchange;
612 if (!want_notemporary)
613 property |= IVariable::PTemporary;
614 if (want_shmem)
615 property |= IVariable::PInShMem;
616 if (want_dumpnull)
617 property |= IVariable::PDumpNull;
618
619 m_p->m_property = property;
620 return m_p->m_property;
621}
622
623/*---------------------------------------------------------------------------*/
624/*---------------------------------------------------------------------------*/
625
628{
629 m_p->m_need_property_update = true;
630}
631
632/*---------------------------------------------------------------------------*/
633/*---------------------------------------------------------------------------*/
634
636setUsed(bool is_used)
637{
638 if (m_p->m_is_used == is_used)
639 return;
640
641 m_p->m_is_used = is_used;
642
643 eItemKind ik = itemKind();
644
645 if (m_p->m_is_used) {
646 if (m_p->m_property & IVariable::PInShMem) {
647 if (m_p->m_property & IVariable::PSubDomainPrivate) {
648 ARCANE_FATAL("Variable with PInShMem property must be in all sub-domains (PSubDomainPrivate property cannot be set with PInShMem)");
649 }
650 if (m_p->m_data->_commonInternal()->numericData() == nullptr) {
651 ARCANE_FATAL("Variable without NumericData cannot change allocator");
652 }
653 // TODO : Même si changeAllocator() avec le même allocateur déjà en
654 // place fait simplement un return, ça reste moche...
655 IParallelMng* pm{};
656 if (m_p->m_mesh_handle.hasMesh()) {
657 pm = m_p->m_mesh_handle.mesh()->parallelMng();
658 }
659 else {
660 pm = subDomain()->parallelMng();
661 }
662 m_p->changeAllocator(pm->_internalApi()->machineShMemWinMemoryAllocator());
663 }
664
665 if (m_p->m_item_group.null() && ik != IK_Unknown) {
666 _checkSetItemFamily();
667 _checkSetItemGroup();
668 // Attention à ne pas reinitialiser les valeurs lorsque ces dernières
669 // sont valides, ce qui est le cas par exemple après une protection.
670 if (!m_p->m_has_valid_data) {
672 // Historiquement on remplissait dans tous les cas la variable avec le
673 // constructeur par défaut
674 // de la donnée en appelant systématiquement fillDefautt(). Cependant,
675 // ce n'était pas le comportement souhaité qui doit être celui défini par
676 // getGlobalDataInitialisationPolicy() (dans DataTypes.h).
677 // On ne le fait maintenant que si le mode d'initialisation est égal
678 // à DIP_Legacy. Ce mode doit à terme disparaître.
680 m_p->m_data->fillDefault();
681 m_p->m_has_valid_data = true;
682 }
683 }
684 }
685 else {
686 _removeMeshReference();
687 if (ik == IK_Unknown)
688 resize(0);
689 else
691 // Indique que les valeurs ne sont plus valides
692 m_p->m_has_valid_data = false;
693 }
694
695 for (VarRefEnumerator i(this); i.hasNext(); ++i) {
696 VariableRef* ref = *i;
697 ref->internalSetUsed(m_p->m_is_used);
698 }
699}
700
701/*---------------------------------------------------------------------------*/
702/*---------------------------------------------------------------------------*/
703
704void Variable::
705_removeMeshReference()
706{
707 IItemFamily* family = m_p->m_item_family;
708 if (family)
709 family->_internalApi()->removeVariable(this);
710
711 if (isPartial())
712 m_p->m_item_group.internal()->detachObserver(this);
713
714 m_p->m_item_group = ItemGroup();
715 m_p->m_item_family = 0;
716}
717
718/*---------------------------------------------------------------------------*/
719/*---------------------------------------------------------------------------*/
720
722isUsed() const
723{
724 return m_p->m_is_used;
725}
726
727/*---------------------------------------------------------------------------*/
728/*---------------------------------------------------------------------------*/
729
730namespace
731{
732
733 String _buildVariableFullType(const IVariable* var)
734 {
735 StringBuilder full_type_b;
736 full_type_b = dataTypeName(var->dataType());
737 full_type_b += ".";
738 full_type_b += itemKindName(var->itemKind());
739 full_type_b += ".";
740 full_type_b += var->dimension();
741 full_type_b += ".";
742 full_type_b += var->multiTag();
743 if (var->isPartial())
744 full_type_b += ".Partial";
745 return full_type_b.toString();
746 }
747
748}
749
750/*---------------------------------------------------------------------------*/
751/*---------------------------------------------------------------------------*/
752
753VariableMetaData* Variable::
754_createMetaData() const
755{
756 auto vmd = new VariableMetaData(name(), meshName(), itemFamilyName(),
758 vmd->setFullType(_buildVariableFullType(this));
759 vmd->setMultiTag(String::fromNumber(multiTag()));
760 vmd->setProperty(property());
761 return vmd;
762}
763
764/*---------------------------------------------------------------------------*/
765/*---------------------------------------------------------------------------*/
766
768createMetaData() const
769{
770 return _createMetaData();
771}
772
773/*---------------------------------------------------------------------------*/
774/*---------------------------------------------------------------------------*/
775
777createMetaDataRef() const
778{
779 return makeRef(_createMetaData());
780}
781
782/*---------------------------------------------------------------------------*/
783/*---------------------------------------------------------------------------*/
784
787{
788 //cout << "** SYNC REFERENCE N=" << m_p->m_nb_reference << " F=" << m_p->m_first_reference << '\n';
789 for (VarRefEnumerator i(this); i.hasNext(); ++i) {
790 VariableRef* ref = *i;
791 //cout << "** SYNC REFERENCE V=" << ref << '\n';
792 ref->updateFromInternal();
793 }
794 // Il faut le faire après la mise à jour des références
795 // car les observateurs peuvent lire les valeurs via une référence
797}
798
799/*---------------------------------------------------------------------------*/
800/*---------------------------------------------------------------------------*/
801
803checkIfSync(int max_print)
804{
805 VariableComparerArgs compare_args;
806 compare_args.setCompareMode(eVariableComparerCompareMode::Sync);
807 compare_args.setMaxPrint(max_print);
808 compare_args.setCompareGhost(true);
809 VariableComparerResults results = _compareVariable(compare_args);
810 return results.nbDifference();
811}
812
813/*---------------------------------------------------------------------------*/
814/*---------------------------------------------------------------------------*/
815
818{
819 VariableComparerArgs compare_args;
820 compare_args.setCompareMode(eVariableComparerCompareMode::SameOnAllReplica);
821 compare_args.setMaxPrint(max_print);
823 return r.nbDifference();
824}
825
826/*---------------------------------------------------------------------------*/
827/*---------------------------------------------------------------------------*/
828
830checkIfSame(IDataReader* reader, Integer max_print, bool compare_ghost)
831{
832 VariableComparerArgs compare_args;
833 compare_args.setMaxPrint(max_print);
834 compare_args.setCompareGhost(compare_ghost);
835 compare_args.setDataReader(reader);
837 return r.nbDifference();
838}
839
840/*---------------------------------------------------------------------------*/
841/*---------------------------------------------------------------------------*/
842
844mesh() const
845{
846 if (m_p->m_mesh_handle.hasMesh())
847 return m_p->m_mesh_handle.mesh();
848 return nullptr;
849}
850
851/*---------------------------------------------------------------------------*/
852/*---------------------------------------------------------------------------*/
853
855meshHandle() const
856{
857 return m_p->m_mesh_handle;
858}
859
860/*---------------------------------------------------------------------------*/
861/*---------------------------------------------------------------------------*/
862
864itemGroup() const
865{
866 return m_p->m_item_group;
867}
868
869/*---------------------------------------------------------------------------*/
870/*---------------------------------------------------------------------------*/
871
873itemKind() const
874{
875 return m_p->m_infos.itemKind();
876}
877
878/*---------------------------------------------------------------------------*/
879/*---------------------------------------------------------------------------*/
880
882dimension() const
883{
884 return m_p->m_infos.dimension();
885}
886
887/*---------------------------------------------------------------------------*/
888/*---------------------------------------------------------------------------*/
889
891multiTag() const
892{
893 return m_p->m_infos.multiTag();
894}
895
896/*---------------------------------------------------------------------------*/
897/*---------------------------------------------------------------------------*/
898
900isPartial() const
901{
902 return m_p->m_is_partial;
903}
904
905/*---------------------------------------------------------------------------*/
906/*---------------------------------------------------------------------------*/
907
909itemFamily() const
910{
911 return m_p->m_item_family;
912}
913
914/*---------------------------------------------------------------------------*/
915/*---------------------------------------------------------------------------*/
916
919{
920 m_p->m_data = data;
921 if (!data.get()) {
922 ARCANE_FATAL("Invalid data: name={0} datatype={1} dimension={2} multitag={3}",
923 m_p->m_infos.fullName(), m_p->m_infos.dataType(),
924 m_p->m_infos.dimension(), m_p->m_infos.multiTag());
925 }
926 data->setName(m_p->m_infos.fullName());
927}
928
929/*---------------------------------------------------------------------------*/
930/*---------------------------------------------------------------------------*/
931
933_setValidData(bool valid_data)
934{
935 m_p->m_has_valid_data = valid_data;
936}
937
938/*---------------------------------------------------------------------------*/
939/*---------------------------------------------------------------------------*/
940
942_hasValidData() const
943{
944 return m_p->m_has_valid_data;
945}
946
947/*---------------------------------------------------------------------------*/
948/*---------------------------------------------------------------------------*/
949
950void Variable::
951_setProperty(int property)
952{
953 m_p->m_property |= property;
954}
955
956/*---------------------------------------------------------------------------*/
957/*---------------------------------------------------------------------------*/
958
960dataFactoryMng() const
961{
962 return m_p->m_data_factory_mng;
963}
964
965/*---------------------------------------------------------------------------*/
966/*---------------------------------------------------------------------------*/
967
970{
971 debug(Trace::High) << "Serialize (partial) variable name=" << fullName();
972 m_p->serializeHashId(sbuffer);
973 m_p->m_data->serialize(sbuffer, ids, operation);
974 // En mode lecture, les données sont modifiées
975 if (sbuffer->mode() == ISerializer::ModeGet)
977}
978
979/*---------------------------------------------------------------------------*/
980/*---------------------------------------------------------------------------*/
981
983serialize(ISerializer* sbuffer, IDataOperation* operation)
984{
985 debug(Trace::High) << "Serialize (full) variable name=" << fullName();
986
987 m_p->serializeHashId(sbuffer);
988 m_p->m_data->serialize(sbuffer, operation);
989 // En mode lecture, les données sont modifiées
990 if (sbuffer->mode() == ISerializer::ModeGet)
992}
993
994/*---------------------------------------------------------------------------*/
995/*---------------------------------------------------------------------------*/
996
997void Variable::
998_resize(const VariableResizeArgs& resize_args)
999{
1000 eItemKind ik = itemKind();
1001 if (ik != IK_Unknown) {
1002 ARCANE_FATAL("This call is invalid for item variable. Use resizeFromGroup() instead");
1003 }
1004 _internalResize(resize_args);
1006}
1007
1008/*---------------------------------------------------------------------------*/
1009/*---------------------------------------------------------------------------*/
1010
1012resize(Integer new_size)
1013{
1014 _resize(VariableResizeArgs(new_size));
1015}
1016
1017/*---------------------------------------------------------------------------*/
1018/*---------------------------------------------------------------------------*/
1019
1022{
1023 eItemKind ik = itemKind();
1024 if (ik == IK_Unknown)
1025 return;
1026 Integer new_size = 0;
1027 IItemFamily* family = m_p->m_item_family;
1028 if (family) {
1029 if (m_p->m_item_group.isAllItems())
1030 new_size = m_p->m_item_family->maxLocalId();
1031 else
1032 new_size = m_p->m_item_group.size();
1033 }
1034 else {
1035 ItemGroup group = m_p->m_item_group;
1036 if (!group.null()) {
1037 ARCANE_FATAL("Variable '{0}' has group but no family", fullName());
1038 }
1039 }
1040 debug(Trace::High) << "Variable::resizeFromGroup() var='" << fullName()
1041 << "' with " << new_size << " items "
1042 << " this=" << this;
1043 _internalResize(VariableResizeArgs(new_size, new_size / 20));
1045}
1046
1047/*---------------------------------------------------------------------------*/
1048/*---------------------------------------------------------------------------*/
1049
1050void Variable::
1051_checkSetItemFamily()
1052{
1053 if (m_p->m_item_family || !m_p->m_item_group.null())
1054 return;
1055
1056 if (m_p->m_mesh_handle.isNull())
1057 m_p->m_mesh_handle = m_p->m_sub_domain->meshMng()->findMeshHandle(m_p->m_infos.meshName());
1058
1059 IMesh* mesh = m_p->m_mesh_handle.mesh();
1060 if (!mesh)
1061 ARCANE_FATAL("No mesh named '{0}' exists for variable '{1}'", m_p->m_infos.meshName(), name());
1062
1063 eItemKind ik = itemKind();
1064
1065 IItemFamily* family = 0;
1066 const String& family_name = m_p->m_infos.itemFamilyName();
1067 if (ik == IK_Particle || ik == IK_DoF) {
1068 if (family_name.null()) {
1069 ARCANE_FATAL("family name not specified for variable {0}", name());
1070 }
1071 family = mesh->findItemFamily(ik, family_name, true);
1072 }
1073 else {
1074 family = mesh->itemFamily(ik);
1075 }
1076
1077 if (family && family->itemKind() != itemKind())
1078 ARCANE_FATAL("Bad family kind '{0}' '{1}'", family->itemKind(), itemKind());
1079
1080 if (family && family->name() != itemFamilyName())
1081 ARCANE_FATAL("Incoherent family name. var={0} from_type={1} given={2}",
1082 name(), family->name(), itemFamilyName());
1083
1084 if (!family)
1085 ARCANE_FATAL("Family not found");
1086
1087 if (isPartial() && !family->hasUniqueIdMap())
1088 ARCANE_FATAL("Cannot have partial variable for a family without unique id map");
1089
1090 m_p->m_item_family = family;
1091 debug(Trace::High) << "Variable::setItemFamily() name=" << name()
1092 << " family=" << family
1093 << " familyname='" << family_name << "'";
1094 family->_internalApi()->addVariable(this);
1095}
1096
1097/*---------------------------------------------------------------------------*/
1098/*---------------------------------------------------------------------------*/
1099
1100void Variable::
1101_checkSetItemGroup()
1102{
1103 if (!m_p->m_item_group.null())
1104 return;
1105 const String& group_name = m_p->m_infos.itemGroupName();
1106 //info() << " CHECK SET GROUP var=" << name() << " group=" << group_name;
1107 if (group_name.null()) {
1108 m_p->m_item_group = m_p->m_item_family->allItems();
1109 }
1110 else
1111 m_p->m_item_group = m_p->m_item_family->findGroup(group_name, true);
1112
1113 ItemGroupImpl* internal = m_p->m_item_group.internal();
1114 // (HP) TODO: faut il garder ce controle hérité de l'ancienne implémentation de addVariable
1115 if (internal->parent() && (mesh()->parallelMng()->isParallel() && internal->isOwn()))
1116 ARCANE_FATAL("Cannot add variable ({0}) on a own group (name={1})",
1117 fullName(), internal->name());
1118 if (isPartial()) {
1119 if (group_name.empty())
1120 ARCANE_FATAL("Cannot create a partial variable with an empty item_group_name");
1121 debug(Trace::High) << "Attach ItemGroupPartialVariableObserver from " << fullName()
1122 << " to " << m_p->m_item_group.name();
1123 internal->attachObserver(this, new ItemGroupPartialVariableObserver(this));
1124 }
1125}
1126
1127/*---------------------------------------------------------------------------*/
1128/*---------------------------------------------------------------------------*/
1129
1132{
1133 return &(m_p->m_write_observable);
1134}
1135
1136/*---------------------------------------------------------------------------*/
1137/*---------------------------------------------------------------------------*/
1138
1141{
1142 return &(m_p->m_read_observable);
1143}
1144
1145/*---------------------------------------------------------------------------*/
1146/*---------------------------------------------------------------------------*/
1147
1150{
1151 return &(m_p->m_on_size_changed_observable);
1152}
1153
1154/*---------------------------------------------------------------------------*/
1155/*---------------------------------------------------------------------------*/
1156
1157/*---------------------------------------------------------------------------*/
1158/*---------------------------------------------------------------------------*/
1159
1161update()
1162{
1163 update(DPT_PreviousTime);
1164}
1165
1166/*---------------------------------------------------------------------------*/
1167/*---------------------------------------------------------------------------*/
1168
1169void Variable::
1170update(Real wanted_time)
1171{
1172 if (m_p->m_last_update_time < wanted_time) {
1173 for (Integer k = 0, n = m_p->m_depends.size(); k < n; ++k) {
1174 VariableDependInfo& vdi = m_p->m_depends[k];
1175 if (vdi.dependType() == DPT_PreviousTime)
1176 vdi.variable()->update(wanted_time);
1177 }
1178 }
1179
1180 if (m_p->m_has_recursive_depend) {
1181 for (Integer k = 0, n = m_p->m_depends.size(); k < n; ++k) {
1182 VariableDependInfo& vdi = m_p->m_depends[k];
1183 if (vdi.dependType() == DPT_CurrentTime)
1184 vdi.variable()->update(m_p->m_last_update_time);
1185 }
1186 }
1187
1188 bool need_update = false;
1189 Int64 modified_time = m_p->m_modified_time;
1190 for (Integer k = 0, n = m_p->m_depends.size(); k < n; ++k) {
1191 VariableDependInfo& vdi = m_p->m_depends[k];
1192 Int64 mt = vdi.variable()->modifiedTime();
1193 if (mt > modified_time) {
1194 need_update = true;
1195 break;
1196 }
1197 }
1198 if (need_update) {
1199 IVariableComputeFunction* cf = m_p->m_compute_function.get();
1200 //msg->info() << "Need Compute For Variable <" << name() << "> " << cf;
1201 if (cf) {
1202 //msg->info() << "Compute For Variable <" << name() << ">";
1203 cf->execute();
1204 }
1205 else {
1206 ARCANE_FATAL("No compute function for variable '{0}'", fullName());
1207 }
1208 }
1209}
1210
1211/*---------------------------------------------------------------------------*/
1212/*---------------------------------------------------------------------------*/
1213
1216{
1217 m_p->m_last_update_time = subDomain()->commonVariables().globalTime();
1218 m_p->m_modified_time = IVariable::incrementModifiedTime();
1219}
1220
1221/*---------------------------------------------------------------------------*/
1222/*---------------------------------------------------------------------------*/
1223
1226{
1227 return m_p->m_modified_time;
1228}
1229
1230/*---------------------------------------------------------------------------*/
1231/*---------------------------------------------------------------------------*/
1232
1235{
1236 m_p->m_depends.add(VariableDependInfo(var, dt, TraceInfo()));
1237}
1238
1239/*---------------------------------------------------------------------------*/
1240/*---------------------------------------------------------------------------*/
1241
1243addDepend(IVariable* var, eDependType dt, const TraceInfo& tinfo)
1244{
1245 m_p->m_depends.add(VariableDependInfo(var, dt, tinfo));
1246}
1247
1248/*---------------------------------------------------------------------------*/
1249/*---------------------------------------------------------------------------*/
1250
1253{
1254 ARCANE_UNUSED(var);
1255 throw NotImplementedException(A_FUNCINFO);
1256}
1257
1258/*---------------------------------------------------------------------------*/
1259/*---------------------------------------------------------------------------*/
1260
1263{
1264 m_p->m_compute_function = v;
1265}
1266
1267/*---------------------------------------------------------------------------*/
1268/*---------------------------------------------------------------------------*/
1269
1272{
1273 return m_p->m_compute_function.get();
1274}
1275
1276/*---------------------------------------------------------------------------*/
1277/*---------------------------------------------------------------------------*/
1278
1281{
1282 for (Integer k = 0, n = m_p->m_depends.size(); k < n; ++k) {
1283 VariableDependInfo& vdi = m_p->m_depends[k];
1284 infos.add(vdi);
1285 }
1286}
1287
1288/*---------------------------------------------------------------------------*/
1289/*---------------------------------------------------------------------------*/
1290
1291/*---------------------------------------------------------------------------*/
1292/*---------------------------------------------------------------------------*/
1293
1295addTag(const String& tagname, const String& tagvalue)
1296{
1297 m_p->m_tags[tagname] = tagvalue;
1298}
1299
1300/*---------------------------------------------------------------------------*/
1301/*---------------------------------------------------------------------------*/
1302
1304removeTag(const String& tagname)
1305{
1306 m_p->m_tags.erase(tagname);
1307}
1308
1309/*---------------------------------------------------------------------------*/
1310/*---------------------------------------------------------------------------*/
1311
1313hasTag(const String& tagname)
1314{
1315 return m_p->m_tags.find(tagname) != m_p->m_tags.end();
1316}
1317
1318/*---------------------------------------------------------------------------*/
1319/*---------------------------------------------------------------------------*/
1320
1322tagValue(const String& tagname)
1323{
1324 std::map<String, String>::const_iterator i = m_p->m_tags.find(tagname);
1325 if (i == m_p->m_tags.end())
1326 return String();
1327 return i->second;
1328}
1329
1330/*---------------------------------------------------------------------------*/
1331/*---------------------------------------------------------------------------*/
1332
1335{
1336 setUpToDate();
1339 _setValidData(true);
1340}
1341
1342/*---------------------------------------------------------------------------*/
1343/*---------------------------------------------------------------------------*/
1344
1350
1351/*---------------------------------------------------------------------------*/
1352/*---------------------------------------------------------------------------*/
1353
1355read(IDataReader* reader)
1356{
1357 reader->read(this, data());
1358 notifyEndRead();
1359}
1360
1361/*---------------------------------------------------------------------------*/
1362/*---------------------------------------------------------------------------*/
1363
1365write(IDataWriter* writer)
1366{
1368 writer->write(this, data());
1369}
1370
1371/*---------------------------------------------------------------------------*/
1372/*---------------------------------------------------------------------------*/
1373
1375changeGroupIds(Int32ConstArrayView old_to_new_ids)
1376{
1377 ARCANE_UNUSED(old_to_new_ids);
1378 // pH: default implementation since this method is not yet official
1379}
1380
1381/*---------------------------------------------------------------------------*/
1382/*---------------------------------------------------------------------------*/
1383/*!
1384 * \brief Vérifie qu'il est possible d'échanger les valeurs de l'instance
1385 * avec celle de \a rhs.
1386 *
1387 * Cette méthode étant appelée par une classe dérivée, on est sur que \a rhs
1388 * est du même type C++ que l'instance et donc il n'y a pas besoin de
1389 * vérifier par exemple que les dimensions ou le type des données sont les
1390 * mêmes. Pour que l'échange soit valide, il faut que le maillage, la famille
1391 * et le groupe soit les mêmes. Pour cela, il suffit de vérifier que le
1392 * groupe est le même.
1393 */
1396{
1397 if (!m_p->m_is_used)
1398 ARCANE_FATAL("Can not swap variable values for unused variable (instance)");
1399 if (!rhs->m_p->m_is_used)
1400 ARCANE_FATAL("Can not swap variable values for unused variable (argument)");
1401 if (isPartial() || rhs->isPartial())
1402 ARCANE_FATAL("Can not swap variable values for partial variables");
1403 if (itemGroup() != rhs->itemGroup())
1404 ARCANE_FATAL("Can not swap variable values for variables from different groups");
1405}
1406
1407/*---------------------------------------------------------------------------*/
1408/*---------------------------------------------------------------------------*/
1409
1410bool Variable::
1411_wantShrink() const
1412{
1413 return m_p->m_want_shrink;
1414}
1415
1416/*---------------------------------------------------------------------------*/
1417/*---------------------------------------------------------------------------*/
1418
1421{
1422 data()->setAllocationInfo(v);
1423 // Il est possible que le changement d'allocation modifie les données
1424 // allouées. Il faut donc synchroniser les références.
1426}
1427
1428/*---------------------------------------------------------------------------*/
1429/*---------------------------------------------------------------------------*/
1430
1432allocationInfo() const
1433{
1434 return data()->allocationInfo();
1435}
1436
1437/*---------------------------------------------------------------------------*/
1438/*---------------------------------------------------------------------------*/
1439
1440IVariableInternal* Variable::
1442{
1443 return m_p;
1444}
1445
1446/*---------------------------------------------------------------------------*/
1447/*---------------------------------------------------------------------------*/
1448
1449/*---------------------------------------------------------------------------*/
1450/*---------------------------------------------------------------------------*/
1451
1452String VariablePrivate::
1453computeComparisonHashCollective(IHashAlgorithm* hash_algo,
1454 IData* sorted_data)
1455{
1456 ARCANE_CHECK_POINTER(hash_algo);
1457 ARCANE_CHECK_POINTER(sorted_data);
1458
1459 INumericDataInternal* num_data = sorted_data->_commonInternal()->numericData();
1460 if (!num_data)
1461 return {};
1462 if (!m_item_family)
1463 return {};
1464
1465 IParallelMng* pm = m_item_family->parallelMng();
1466 Int32 my_rank = pm->commRank();
1467 Int32 master_rank = pm->masterIORank();
1468 ConstMemoryView memory_view = num_data->memoryView();
1469
1470 UniqueArray<Byte> bytes;
1471
1472 pm->gatherVariable(Arccore::asSpan<Byte>(memory_view.bytes()).smallView(), bytes, master_rank);
1473
1474 String hash_string;
1475 if (my_rank == master_rank) {
1476 HashAlgorithmValue hash_value;
1477 hash_algo->computeHash(asBytes(bytes), hash_value);
1478 hash_string = Convert::toHexaString(asBytes(hash_value.bytes()));
1479 }
1480 return hash_string;
1481}
1482
1483/*---------------------------------------------------------------------------*/
1484/*---------------------------------------------------------------------------*/
1485
1486void VariablePrivate::
1487changeAllocator(const MemoryAllocationOptions& mem_options)
1488{
1489 INumericDataInternal* dx = m_data->_commonInternal()->numericData();
1490 if (dx) {
1491 dx->changeAllocator(mem_options);
1492 m_variable->syncReferences();
1493 }
1494}
1495
1496/*---------------------------------------------------------------------------*/
1497/*---------------------------------------------------------------------------*/
1498
1499void VariablePrivate::
1500resize(const VariableResizeArgs& resize_args)
1501{
1502 return m_variable->_resize(resize_args);
1503}
1504
1505/*---------------------------------------------------------------------------*/
1506/*---------------------------------------------------------------------------*/
1507
1508VariableComparerResults VariablePrivate::
1509compareVariable(const VariableComparerArgs& compare_args)
1510{
1511 return m_variable->_compareVariable(compare_args);
1512}
1513
1514/*---------------------------------------------------------------------------*/
1515/*---------------------------------------------------------------------------*/
1516
1517IParallelMng* VariablePrivate::
1518replicaParallelMng() const
1519{
1520 //TODO: regarder si la variable est utilisée.
1521 IMesh* mesh = m_variable->mesh();
1522 // TODO: faut-il prendre le sous-domaine dans ce cas ?
1523 IParallelMng* pm = (mesh) ? mesh->parallelMng() : m_variable->subDomain()->parallelMng();
1524 IParallelReplication* pr = pm->replication();
1525 if (!pr->hasReplication())
1526 return nullptr;
1527 return pr->replicaParallelMng();
1528}
1529
1530/*---------------------------------------------------------------------------*/
1531/*---------------------------------------------------------------------------*/
1532
1533} // End namespace Arcane
1534
1535/*---------------------------------------------------------------------------*/
1536/*---------------------------------------------------------------------------*/
1537
1538#endif
#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.
Definition IDataReader.h:34
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.
Definition IDataWriter.h:44
virtual void write(IVariable *var, IData *data)=0
Ecrit les données data de la variable var.
Interface d'une donnée.
Definition IData.h:33
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.
Definition IItemFamily.h:84
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.
virtual void notifyAllObservers()=0
Notifie tous les observateurs.
Interface du gestionnaire de parallélisme pour un sous-domaine.
@ ModePut
Le sérialiseur attend des reserve()
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.
Definition ISubDomain.h:74
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 functor de re-calcul d'une variable.
Interface du gestionnaire de variables.
virtual IVariableMngInternal * _internalApi()=0
API interne à Arcane.
Interface d'une variable.
Definition IVariable.h:39
virtual eDataType dataType() const =0
Type de la donnée gérée par la variable (Real, Integer, ...)
eDependType
Type des dépendances.
Definition IVariable.h:44
@ PSubDomainDepend
Indique que la valeur de la variable est dépendante du sous-domaine.
Definition IVariable.h:81
@ PNoExchange
Indique que la variable ne doit pas être échangée.
Definition IVariable.h:133
@ PNoReplicaSync
Indique que la variable n'a pas forcément la même valeur entre les réplicas.
Definition IVariable.h:149
@ PTemporary
Indique que la variable est temporaire.
Definition IVariable.h:116
@ PInShMem
Indique que la variable doit être alloué en mémoire partagée.
Definition IVariable.h:158
@ PExecutionDepend
Indique que la valeur de la variable est dépendante de l'exécution.
Definition IVariable.h:96
@ PPrivate
Indique que la variable est privée.
Definition IVariable.h:104
@ PPersistant
Indique que la variable est persistante.
Definition IVariable.h:140
@ PNoRestore
Indique que la variable ne doit pas être restaurée.
Definition IVariable.h:123
@ PSubDomainPrivate
Indique que la variable est privée au sous-domaine.
Definition IVariable.h:89
@ PNoNeedSync
Indique que la variable n'est pas nécessairement synchronisée.
Definition IVariable.h:70
@ PNoDump
Indique que la variable ne doit pas être sauvegardée.
Definition IVariable.h:62
@ PDumpNull
Indique que la sauvegarde sera nulle pour cette variable et pour ce sous-domaine.
Definition IVariable.h:169
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.
Definition Variable.cc:205
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.
Definition IVariable.h:175
static const char * TAG_POST_PROCESSING_AT_THIS_ITERATION
Tag utilisé pour indiquer si une variable sera post-traitée à cette itération.
Definition IVariable.h:178
void detachObserver(const void *ref)
Détache un observer.
void executeExtend(const Int32ConstArrayView *info) override
Execute l'action associée à l'extension.
Definition Variable.cc:258
void executeReduce(const Int32ConstArrayView *info) override
Execute l'action associée à l'extension.
Definition Variable.cc:274
void executeInvalidate() override
Execute l'action associée à l'invalidation.
Definition Variable.cc:324
void executeCompact(const Int32ConstArrayView *info) override
Éxecute l'action associée au compactage.
Definition Variable.cc:313
bool needInfo() const override
Indique si l'observer aura besoin d'information de transition.
Definition Variable.cc:332
Groupe d'entités de maillage.
Definition ItemGroup.h:49
SharedPtrT< GroupIndexTable > localIdToIndex() const
Table des local ids vers une position pour toutes les entités du groupe.
Definition ItemGroup.h:307
ItemVectorView view() const
Vue sur les entités du groupe.
Definition ItemGroup.cc:583
Integer size() const
Nombre d'éléments du groupe.
Definition ItemGroup.h:88
bool isAllItems() const
Indique si le groupe est celui de toutes les entités.
Definition ItemGroup.cc:610
bool null() const
true is le groupe est le groupe nul
Definition ItemGroup.h:70
Vue sur un vecteur d'entités.
Handle sur un maillage.
Definition MeshHandle.h:47
bool isNull() const
Indique si le handle est nul (il ne référence aucun maillage existant ou non)
Definition MeshHandle.h:162
IMesh * mesh() const
Maillage associé.
Référence à une instance.
Encapsulation d'un pointeur qui se détruit automatiquement.
Definition ScopedPtr.h:44
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:325
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
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.
Definition Span.h:721
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.
Definition String.cc:305
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:292
StringView view() const
Retourne une vue sur la chaîne actuelle.
Definition String.cc:368
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.
Meta-données sur une variable.
bool m_has_recursive_depend
Vrai si les dépendances sont récursives.
Definition Variable.cc:120
VariableInfo m_infos
Infos caractéristiques de la variable.
Definition Variable.cc:104
IItemFamily * m_item_family
Familly d'entité (peut être nul)
Definition Variable.cc:103
Integer m_nb_reference
Première référence sur la variable.
Definition Variable.cc:112
UniqueArray< VariableDependInfo > m_depends
Liste des dépendances de cette variable.
Definition Variable.cc:113
int m_property
Propriétés de la variable.
Definition Variable.cc:105
AutoDetachObservable m_on_size_changed_observable
Observable en redimensionnement.
Definition Variable.cc:118
Real m_last_update_time
Temps physique de la dernière mise à jour.
Definition Variable.cc:110
Int64 m_modified_time
Tag de la dernière modification.
Definition Variable.cc:114
MeshHandle m_mesh_handle
Maillage (peut être nul)
Definition Variable.cc:100
std::map< String, String > m_tags
Liste des tags.
Definition Variable.cc:119
ItemGroup m_item_group
Groupe d'entité sur lequel est associé la variable.
Definition Variable.cc:102
bool m_is_used
Etat d'utilisation de la variable.
Definition Variable.cc:108
void serializeHashId(ISerializer *sbuf)
Sérialise le hashid.
Definition Variable.cc:132
ScopedPtrT< IVariableComputeFunction > m_compute_function
Fonction de calcul.
Definition Variable.cc:115
AutoDetachObservable m_read_observable
Observable en lecture.
Definition Variable.cc:117
AutoDetachObservable m_write_observable
Observable en écriture.
Definition Variable.cc:116
bool m_has_valid_data
Vrai si les données sont valide.
Definition Variable.cc:109
bool m_is_partial
Vrai si la variable est partielle.
Definition Variable.cc:106
Variable * m_variable
Variable associée.
Definition Variable.cc:122
Ref< IData > m_data
Données de la variable.
Definition Variable.cc:101
Référence à une variable.
Definition VariableRef.h:56
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.
Definition Variable.cc:1021
String itemGroupName() const final
Nom du groupe d'entité associée.
Definition Variable.cc:510
IMesh * mesh() const final
Maillage auquel est associé la variable.
Definition Variable.cc:844
void notifyBeginWrite() override
Notifie du début d'écriture de data().
Definition Variable.cc:1346
Integer nbReference() const override
Nombre de références sur cette variable.
Definition Variable.cc:456
void removeVariableRef(VariableRef *ref) override
Supprime une référence à cette variable.
Definition Variable.cc:394
void _checkSwapIsValid(Variable *rhs)
Vérifie qu'il est possible d'échanger les valeurs de l'instance avec celle de rhs.
Definition Variable.cc:1395
bool isUsed() const override
Etat d'utilisation de la variable.
Definition Variable.cc:722
Variable(const VariableBuildInfo &v, const VariableInfo &vi)
Créé une variable lié à la référence v.
Definition Variable.cc:343
void _setData(const Ref< IData > &data)
Positionne la donnée.
Definition Variable.cc:918
void _setValidData(bool valid_data)
Indique si les données de la variable sont valides.
Definition Variable.cc:933
VariableMetaData * createMetaData() const override
Créé une instance contenant les meta-données de la variable.
Definition Variable.cc:768
IVariableComputeFunction * computeFunction() override
Fonction utilisée pour mettre à jour la variable.
Definition Variable.cc:1271
Ref< VariableMetaData > createMetaDataRef() const override
Créé une instance contenant les meta-données de la variable.
Definition Variable.cc:777
bool isPartial() const override
Indique si la variable est partielle.
Definition Variable.cc:900
String tagValue(const String &tagname) override
Valeur du tag tagname. La chaîne est nulle si le tag n'existe pas.
Definition Variable.cc:1322
void notifyReferencePropertyChanged() override
Indique que les propriétés d'une des références à cette variable ont changé (interne)
Definition Variable.cc:627
IVariableMng * variableMng() const override
Gestionnaire de variable associé à la variable.
Definition Variable.cc:474
void removeTag(const String &tagname) override
Supprime le tag tagname.
Definition Variable.cc:1304
void addDepend(IVariable *var, eDependType dt) override
Ajoute var à la liste des dépendances.
Definition Variable.cc:1234
String name() const final
Nom de la variable.
Definition Variable.cc:483
IObservable * readObservable() override
Observable en lecture.
Definition Variable.cc:1140
virtual VariableComparerResults _compareVariable(const VariableComparerArgs &compare_args)=0
Comparaison de valeurs entre variables.
void serialize(ISerializer *sbuffer, IDataOperation *operation) override
Definition Variable.cc:983
ItemGroup itemGroup() const final
Groupe du maillage associé.
Definition Variable.cc:864
IObservable * onSizeChangedObservable() override
Observable en redimensionnement.
Definition Variable.cc:1149
void notifyEndRead() override
Notifie de la modification externe de data().
Definition Variable.cc:1334
void read(IDataReader *d) override
Definition Variable.cc:1355
void syncReferences() override
Synchronise les références.
Definition Variable.cc:786
void setUsed(bool v) override
Positionne l'état d'utilisation de la variable.
Definition Variable.cc:636
VariableRef * firstReference() const override
Première réference (ou null) sur cette variable.
Definition Variable.cc:431
String fullName() const final
Nom complet de la variable (avec le préfixe de la famille)
Definition Variable.cc:492
eItemKind itemKind() const override
Genre des entités du maillage sur lequel repose la variable.
Definition Variable.cc:873
ISubDomain * subDomain() override
Sous-domaine associé à la variable (TODO rendre obsolète fin 2023)
Definition Variable.cc:465
void update() override
Recalcule la variable si nécessaire.
Definition Variable.cc:1161
Integer dimension() const override
Dimension de la variable.
Definition Variable.cc:882
Int64 modifiedTime() override
Temps auquel la variable a été mise à jour.
Definition Variable.cc:1225
void setUpToDate() override
Indique que la variable vient d'être mise à jour.
Definition Variable.cc:1215
void addTag(const String &tagname, const String &tagvalue) override
Ajoute le tag tagname avev la valeur tagvalue.
Definition Variable.cc:1295
Int32 checkIfSame(IDataReader *reader, Integer max_print, bool compare_ghost) final
Vérifie que la variable est identique à une valeur de référence.
Definition Variable.cc:830
~Variable() override
Libère les ressources.
Definition Variable.cc:353
bool _hasValidData() const
Indique si les données de la variable sont valides.
Definition Variable.cc:942
IObservable * writeObservable() override
Observable en écriture.
Definition Variable.cc:1131
void addVariableRef(VariableRef *ref) override
Ajoute une référence à cette variable.
Definition Variable.cc:373
Integer multiTag() const override
Indique si la variable est un tableau à taille multiple.
Definition Variable.cc:891
void setComputeFunction(IVariableComputeFunction *v) override
Positionne la fonction de recalcul de la variable.
Definition Variable.cc:1262
void resize(Integer n) override
Positionne le nombre d'éléments pour une variable tableau.
Definition Variable.cc:1012
IVariableInternal * _internalApi() override
API interne à Arcane.
Definition Variable.cc:1441
IItemFamily * itemFamily() const final
Famille d'entité associée.
Definition Variable.cc:909
eDataType dataType() const override
Type de la donnée gérée par la variable (Real, Integer, ...)
Definition Variable.cc:528
void write(IDataWriter *d) override
Sauve la variable.
Definition Variable.cc:1365
IDataFactoryMng * dataFactoryMng() const final
Fabrique de données associées à la variable.
Definition Variable.cc:960
void changeGroupIds(Int32ConstArrayView old_to_new_ids) override
pH : EXPERIMENTAL
Definition Variable.cc:1375
void removeDepend(IVariable *var) override
Supprime var de la liste des dépendances.
Definition Variable.cc:1252
String itemFamilyName() const final
Nom de la famille associée (nul si aucune).
Definition Variable.cc:501
Int32 checkIfSync(Integer max_print) final
Vérifie si la variable est bien synchronisée.
Definition Variable.cc:803
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
Definition Variable.cc:1432
int property() const override
Definition Variable.cc:539
Int32 checkIfSameOnAllReplica(Integer max_print) final
Vérifie si la variable a les mêmes valeurs sur tous les réplicas.
Definition Variable.cc:817
void dependInfos(Array< VariableDependInfo > &infos) override
Infos de dépendances.
Definition Variable.cc:1280
bool hasTag(const String &tagname) override
true si la variable possède le tag tagname
Definition Variable.cc:1313
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
Definition Variable.cc:1420
MeshHandle meshHandle() const final
Maillage auquel est associé la variable.
Definition Variable.cc:855
String meshName() const final
Nom du maillage associé (nul si aucun).
Definition Variable.cc:519
String toHexaString(ByteConstArrayView input)
Converti un tableau d'octet en sa représentation hexadécimale.
String getEnvironmentVariable(const String &name)
Variable d'environnement du nom name.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ DIP_Legacy
Initialisation en mode historique.
Definition DataTypes.h:161
std::int64_t Int64
Type entier signé sur 64 bits.
eDataInitialisationPolicy getGlobalDataInitialisationPolicy()
Récupère la politique d'initialisation des variables.
Definition DataTypes.cc:162
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:482
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:341
@ 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.
Definition Span.h:1022
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:43
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
eDataType
Type d'une donnée.
Definition DataTypes.h:39
const char * dataTypeName(eDataType type)
Nom du type de donnée.
Definition DataTypes.cc:70
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>.
Definition Span.h:1114