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