Arcane  v4.1.4.0
Documentation développeur
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;
105 int m_property = 0;
106 bool m_is_partial = false;
107 bool m_need_property_update = false;
108 bool m_is_used = false;
109 bool m_has_valid_data = false;
111 VariableRef* m_first_reference = nullptr;
119 std::map<String, String> m_tags;
121 bool m_want_shrink = false;
122 Variable* m_variable = nullptr;
123
124 public:
125
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
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;
166
167 private:
168
169 static const int HASHID_SIZE = 64;
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
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())
400 if (tmp->nextReference())
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()) {
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/*---------------------------------------------------------------------------*/
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
563 int property = 0;
564 for (VarRefEnumerator i(this); i.hasNext(); ++i) {
565 VariableRef* vref = *i;
566 int p = vref->referenceProperty();
567 if (!(p & IVariable::PNoDump))
568 want_dump = true;
569 if (!(p & IVariable::PNoNeedSync))
570 want_sync = true;
571 if (!(p & IVariable::PNoReplicaSync))
572 want_replica_sync = true;
574 sub_domain_depend = true;
576 execution_depend = true;
577 if ((p & IVariable::PPersistant))
578 want_persistant = true;
579 if ((p & IVariable::PPrivate))
580 want_private = true;
581 if (!(p & IVariable::PNoRestore))
582 want_restore = true;
583 if (!(p & IVariable::PNoExchange))
584 want_exchange = true;
585 if (!(p & IVariable::PTemporary))
586 want_notemporary = true;
587 if (!(p & IVariable::PInShMem))
588 want_shmem = true;
589 }
590
591 if (!want_dump)
592 property |= IVariable::PNoDump;
593 if (!want_sync)
594 property |= IVariable::PNoNeedSync;
595 if (!want_replica_sync)
596 property |= IVariable::PNoReplicaSync;
597 if (sub_domain_depend)
598 property |= IVariable::PSubDomainDepend;
599 if (execution_depend)
600 property |= IVariable::PExecutionDepend;
601 if (want_private)
602 property |= IVariable::PPrivate;
603 if (want_persistant)
604 property |= IVariable::PPersistant;
605 if (!want_restore)
606 property |= IVariable::PNoRestore;
607 if (!want_exchange)
608 property |= IVariable::PNoExchange;
609 if (!want_notemporary)
610 property |= IVariable::PTemporary;
611 if (!want_shmem)
612 property |= IVariable::PInShMem;
613
614 m_p->m_property = property;
615 return m_p->m_property;
616}
617
618/*---------------------------------------------------------------------------*/
619/*---------------------------------------------------------------------------*/
620
623{
624 m_p->m_need_property_update = true;
625}
626
627/*---------------------------------------------------------------------------*/
628/*---------------------------------------------------------------------------*/
629
631setUsed(bool is_used)
632{
633 if (m_p->m_is_used == is_used)
634 return;
635
636 m_p->m_is_used = is_used;
637
638 eItemKind ik = itemKind();
639
640 if (m_p->m_is_used) {
641 if (m_p->m_property & IVariable::PInShMem) {
642 IParallelMng* pm{};
643 if (m_p->m_mesh_handle.hasMesh()) {
644 pm = m_p->m_mesh_handle.mesh()->parallelMng();
645 }
646 else {
647 pm = subDomain()->parallelMng();
648 }
649 m_p->changeAllocator(MemoryAllocationOptions(pm->_internalApi()->dynamicMachineMemoryWindowMemoryAllocator()));
650 }
651
652 if (m_p->m_item_group.null() && ik != IK_Unknown) {
653 _checkSetItemFamily();
654 _checkSetItemGroup();
655 // Attention à ne pas reinitialiser les valeurs lorsque ces dernières
656 // sont valides, ce qui est le cas par exemple après une protection.
657 if (!m_p->m_has_valid_data) {
659 // Historiquement on remplissait dans tous les cas la variable avec le
660 // constructeur par défaut
661 // de la donnée en appelant systématiquement fillDefautt(). Cependant,
662 // ce n'était pas le comportement souhaité qui doit être celui défini par
663 // getGlobalDataInitialisationPolicy() (dans DataTypes.h).
664 // On ne le fait maintenant que si le mode d'initialisation est égal
665 // à DIP_Legacy. Ce mode doit à terme disparaître.
667 m_p->m_data->fillDefault();
668 m_p->m_has_valid_data = true;
669 }
670 }
671 }
672 else {
673 _removeMeshReference();
674 if (ik == IK_Unknown)
675 resize(0);
676 else
678 // Indique que les valeurs ne sont plus valides
679 m_p->m_has_valid_data = false;
680 }
681
682 for (VarRefEnumerator i(this); i.hasNext(); ++i) {
683 VariableRef* ref = *i;
684 ref->internalSetUsed(m_p->m_is_used);
685 }
686}
687
688/*---------------------------------------------------------------------------*/
689/*---------------------------------------------------------------------------*/
690
691void Variable::
692_removeMeshReference()
693{
694 IItemFamily* family = m_p->m_item_family;
695 if (family)
696 family->_internalApi()->removeVariable(this);
697
698 if (isPartial())
700
702 m_p->m_item_family = 0;
703}
704
705/*---------------------------------------------------------------------------*/
706/*---------------------------------------------------------------------------*/
707
709isUsed() const
710{
711 return m_p->m_is_used;
712}
713
714/*---------------------------------------------------------------------------*/
715/*---------------------------------------------------------------------------*/
716
717namespace
718{
719
720 String _buildVariableFullType(const IVariable* var)
721 {
722 StringBuilder full_type_b;
723 full_type_b = dataTypeName(var->dataType());
724 full_type_b += ".";
725 full_type_b += itemKindName(var->itemKind());
726 full_type_b += ".";
727 full_type_b += var->dimension();
728 full_type_b += ".";
729 full_type_b += var->multiTag();
730 if (var->isPartial())
731 full_type_b += ".Partial";
732 return full_type_b.toString();
733 }
734
735}
736
737/*---------------------------------------------------------------------------*/
738/*---------------------------------------------------------------------------*/
739
740VariableMetaData* Variable::
741_createMetaData() const
742{
743 auto vmd = new VariableMetaData(name(), meshName(), itemFamilyName(),
745 vmd->setFullType(_buildVariableFullType(this));
746 vmd->setMultiTag(String::fromNumber(multiTag()));
747 vmd->setProperty(property());
748 return vmd;
749}
750
751/*---------------------------------------------------------------------------*/
752/*---------------------------------------------------------------------------*/
753
755createMetaData() const
756{
757 return _createMetaData();
758}
759
760/*---------------------------------------------------------------------------*/
761/*---------------------------------------------------------------------------*/
762
764createMetaDataRef() const
765{
766 return makeRef(_createMetaData());
767}
768
769/*---------------------------------------------------------------------------*/
770/*---------------------------------------------------------------------------*/
771
774{
775 //cout << "** SYNC REFERENCE N=" << m_p->m_nb_reference << " F=" << m_p->m_first_reference << '\n';
776 for (VarRefEnumerator i(this); i.hasNext(); ++i) {
777 VariableRef* ref = *i;
778 //cout << "** SYNC REFERENCE V=" << ref << '\n';
779 ref->updateFromInternal();
780 }
781 // Il faut le faire après la mise à jour des références
782 // car les observateurs peuvent lire les valeurs via une référence
784}
785
786/*---------------------------------------------------------------------------*/
787/*---------------------------------------------------------------------------*/
788
790checkIfSync(int max_print)
791{
792 VariableComparerArgs compare_args;
793 compare_args.setCompareMode(eVariableComparerCompareMode::Sync);
794 compare_args.setMaxPrint(max_print);
795 compare_args.setCompareGhost(true);
796 VariableComparerResults results = _compareVariable(compare_args);
797 return results.nbDifference();
798}
799
800/*---------------------------------------------------------------------------*/
801/*---------------------------------------------------------------------------*/
802
805{
806 VariableComparerArgs compare_args;
807 compare_args.setCompareMode(eVariableComparerCompareMode::SameOnAllReplica);
808 compare_args.setMaxPrint(max_print);
810 return r.nbDifference();
811}
812
813/*---------------------------------------------------------------------------*/
814/*---------------------------------------------------------------------------*/
815
817checkIfSame(IDataReader* reader, Integer max_print, bool compare_ghost)
818{
819 VariableComparerArgs compare_args;
820 compare_args.setMaxPrint(max_print);
821 compare_args.setCompareGhost(compare_ghost);
822 compare_args.setDataReader(reader);
824 return r.nbDifference();
825}
826
827/*---------------------------------------------------------------------------*/
828/*---------------------------------------------------------------------------*/
829
831mesh() const
832{
833 if (m_p->m_mesh_handle.hasMesh())
834 return m_p->m_mesh_handle.mesh();
835 return nullptr;
836}
837
838/*---------------------------------------------------------------------------*/
839/*---------------------------------------------------------------------------*/
840
842meshHandle() const
843{
844 return m_p->m_mesh_handle;
845}
846
847/*---------------------------------------------------------------------------*/
848/*---------------------------------------------------------------------------*/
849
851itemGroup() const
852{
853 return m_p->m_item_group;
854}
855
856/*---------------------------------------------------------------------------*/
857/*---------------------------------------------------------------------------*/
858
860itemKind() const
861{
862 return m_p->m_infos.itemKind();
863}
864
865/*---------------------------------------------------------------------------*/
866/*---------------------------------------------------------------------------*/
867
869dimension() const
870{
871 return m_p->m_infos.dimension();
872}
873
874/*---------------------------------------------------------------------------*/
875/*---------------------------------------------------------------------------*/
876
878multiTag() const
879{
880 return m_p->m_infos.multiTag();
881}
882
883/*---------------------------------------------------------------------------*/
884/*---------------------------------------------------------------------------*/
885
887isPartial() const
888{
889 return m_p->m_is_partial;
890}
891
892/*---------------------------------------------------------------------------*/
893/*---------------------------------------------------------------------------*/
894
896itemFamily() const
897{
898 return m_p->m_item_family;
899}
900
901/*---------------------------------------------------------------------------*/
902/*---------------------------------------------------------------------------*/
903
906{
907 m_p->m_data = data;
908 if (!data.get()) {
909 ARCANE_FATAL("Invalid data: name={0} datatype={1} dimension={2} multitag={3}",
910 m_p->m_infos.fullName(), m_p->m_infos.dataType(),
911 m_p->m_infos.dimension(), m_p->m_infos.multiTag());
912 }
913 data->setName(m_p->m_infos.fullName());
914}
915
916/*---------------------------------------------------------------------------*/
917/*---------------------------------------------------------------------------*/
918
920_setValidData(bool valid_data)
921{
922 m_p->m_has_valid_data = valid_data;
923}
924
925/*---------------------------------------------------------------------------*/
926/*---------------------------------------------------------------------------*/
927
929_hasValidData() const
930{
931 return m_p->m_has_valid_data;
932}
933
934/*---------------------------------------------------------------------------*/
935/*---------------------------------------------------------------------------*/
936
937void Variable::
938_setProperty(int property)
939{
941}
942
943/*---------------------------------------------------------------------------*/
944/*---------------------------------------------------------------------------*/
945
947dataFactoryMng() const
948{
949 return m_p->m_data_factory_mng;
950}
951
952/*---------------------------------------------------------------------------*/
953/*---------------------------------------------------------------------------*/
954
957{
958 debug(Trace::High) << "Serialize (partial) variable name=" << fullName();
959 m_p->serializeHashId(sbuffer);
960 m_p->m_data->serialize(sbuffer, ids, operation);
961 // En mode lecture, les données sont modifiées
962 if (sbuffer->mode() == ISerializer::ModeGet)
964}
965
966/*---------------------------------------------------------------------------*/
967/*---------------------------------------------------------------------------*/
968
970serialize(ISerializer* sbuffer, IDataOperation* operation)
971{
972 debug(Trace::High) << "Serialize (full) variable name=" << fullName();
973
974 m_p->serializeHashId(sbuffer);
975 m_p->m_data->serialize(sbuffer, operation);
976 // En mode lecture, les données sont modifiées
977 if (sbuffer->mode() == ISerializer::ModeGet)
979}
980
981/*---------------------------------------------------------------------------*/
982/*---------------------------------------------------------------------------*/
983
984void Variable::
985_resize(const VariableResizeArgs& resize_args)
986{
987 eItemKind ik = itemKind();
988 if (ik != IK_Unknown) {
989 ARCANE_FATAL("This call is invalid for item variable. Use resizeFromGroup() instead");
990 }
991 _internalResize(resize_args);
993}
994
995/*---------------------------------------------------------------------------*/
996/*---------------------------------------------------------------------------*/
997
999resize(Integer new_size)
1000{
1001 _resize(VariableResizeArgs(new_size));
1002}
1003
1004/*---------------------------------------------------------------------------*/
1005/*---------------------------------------------------------------------------*/
1006
1009{
1010 eItemKind ik = itemKind();
1011 if (ik == IK_Unknown)
1012 return;
1013 Integer new_size = 0;
1014 IItemFamily* family = m_p->m_item_family;
1015 if (family) {
1016 if (m_p->m_item_group.isAllItems())
1017 new_size = m_p->m_item_family->maxLocalId();
1018 else
1019 new_size = m_p->m_item_group.size();
1020 }
1021 else {
1022 ItemGroup group = m_p->m_item_group;
1023 if (!group.null()) {
1024 ARCANE_FATAL("Variable '{0}' has group but no family", fullName());
1025 }
1026 }
1027 debug(Trace::High) << "Variable::resizeFromGroup() var='" << fullName()
1028 << "' with " << new_size << " items "
1029 << " this=" << this;
1030 _internalResize(VariableResizeArgs(new_size, new_size / 20));
1032}
1033
1034/*---------------------------------------------------------------------------*/
1035/*---------------------------------------------------------------------------*/
1036
1037void Variable::
1038_checkSetItemFamily()
1039{
1041 return;
1042
1043 if (m_p->m_mesh_handle.isNull())
1044 m_p->m_mesh_handle = m_p->m_sub_domain->meshMng()->findMeshHandle(m_p->m_infos.meshName());
1045
1047 if (!mesh)
1048 ARCANE_FATAL("No mesh named '{0}' exists for variable '{1}'", m_p->m_infos.meshName(), name());
1049
1050 eItemKind ik = itemKind();
1051
1052 IItemFamily* family = 0;
1053 const String& family_name = m_p->m_infos.itemFamilyName();
1054 if (ik == IK_Particle || ik == IK_DoF) {
1055 if (family_name.null()) {
1056 ARCANE_FATAL("family name not specified for variable {0}", name());
1057 }
1058 family = mesh->findItemFamily(ik, family_name, true);
1059 }
1060 else {
1061 family = mesh->itemFamily(ik);
1062 }
1063
1064 if (family && family->itemKind() != itemKind())
1065 ARCANE_FATAL("Bad family kind '{0}' '{1}'", family->itemKind(), itemKind());
1066
1067 if (family && family->name() != itemFamilyName())
1068 ARCANE_FATAL("Incoherent family name. var={0} from_type={1} given={2}",
1069 name(), family->name(), itemFamilyName());
1070
1071 if (!family)
1072 ARCANE_FATAL("Family not found");
1073
1074 if (isPartial() && !family->hasUniqueIdMap())
1075 ARCANE_FATAL("Cannot have partial variable for a family without unique id map");
1076
1077 m_p->m_item_family = family;
1078 debug(Trace::High) << "Variable::setItemFamily() name=" << name()
1079 << " family=" << family
1080 << " familyname='" << family_name << "'";
1081 family->_internalApi()->addVariable(this);
1082}
1083
1084/*---------------------------------------------------------------------------*/
1085/*---------------------------------------------------------------------------*/
1086
1087void Variable::
1088_checkSetItemGroup()
1089{
1090 if (!m_p->m_item_group.null())
1091 return;
1092 const String& group_name = m_p->m_infos.itemGroupName();
1093 //info() << " CHECK SET GROUP var=" << name() << " group=" << group_name;
1094 if (group_name.null()) {
1095 m_p->m_item_group = m_p->m_item_family->allItems();
1096 }
1097 else
1098 m_p->m_item_group = m_p->m_item_family->findGroup(group_name, true);
1099
1100 ItemGroupImpl* internal = m_p->m_item_group.internal();
1101 // (HP) TODO: faut il garder ce controle hérité de l'ancienne implémentation de addVariable
1102 if (internal->parent() && (mesh()->parallelMng()->isParallel() && internal->isOwn()))
1103 ARCANE_FATAL("Cannot add variable ({0}) on a own group (name={1})",
1104 fullName(), internal->name());
1105 if (isPartial()) {
1106 if (group_name.empty())
1107 ARCANE_FATAL("Cannot create a partial variable with an empty item_group_name");
1108 debug(Trace::High) << "Attach ItemGroupPartialVariableObserver from " << fullName()
1109 << " to " << m_p->m_item_group.name();
1110 internal->attachObserver(this, new ItemGroupPartialVariableObserver(this));
1111 }
1112}
1113
1114/*---------------------------------------------------------------------------*/
1115/*---------------------------------------------------------------------------*/
1116
1119{
1120 return &(m_p->m_write_observable);
1121}
1122
1123/*---------------------------------------------------------------------------*/
1124/*---------------------------------------------------------------------------*/
1125
1128{
1129 return &(m_p->m_read_observable);
1130}
1131
1132/*---------------------------------------------------------------------------*/
1133/*---------------------------------------------------------------------------*/
1134
1137{
1138 return &(m_p->m_on_size_changed_observable);
1139}
1140
1141/*---------------------------------------------------------------------------*/
1142/*---------------------------------------------------------------------------*/
1143
1144/*---------------------------------------------------------------------------*/
1145/*---------------------------------------------------------------------------*/
1146
1148update()
1149{
1150 update(DPT_PreviousTime);
1151}
1152
1153/*---------------------------------------------------------------------------*/
1154/*---------------------------------------------------------------------------*/
1155
1156void Variable::
1157update(Real wanted_time)
1158{
1159 if (m_p->m_last_update_time < wanted_time) {
1160 for (Integer k = 0, n = m_p->m_depends.size(); k < n; ++k) {
1161 VariableDependInfo& vdi = m_p->m_depends[k];
1162 if (vdi.dependType() == DPT_PreviousTime)
1163 vdi.variable()->update(wanted_time);
1164 }
1165 }
1166
1167 if (m_p->m_has_recursive_depend) {
1168 for (Integer k = 0, n = m_p->m_depends.size(); k < n; ++k) {
1169 VariableDependInfo& vdi = m_p->m_depends[k];
1170 if (vdi.dependType() == DPT_CurrentTime)
1171 vdi.variable()->update(m_p->m_last_update_time);
1172 }
1173 }
1174
1175 bool need_update = false;
1176 Int64 modified_time = m_p->m_modified_time;
1177 for (Integer k = 0, n = m_p->m_depends.size(); k < n; ++k) {
1178 VariableDependInfo& vdi = m_p->m_depends[k];
1179 Int64 mt = vdi.variable()->modifiedTime();
1180 if (mt > modified_time) {
1181 need_update = true;
1182 break;
1183 }
1184 }
1185 if (need_update) {
1186 IVariableComputeFunction* cf = m_p->m_compute_function.get();
1187 //msg->info() << "Need Compute For Variable <" << name() << "> " << cf;
1188 if (cf) {
1189 //msg->info() << "Compute For Variable <" << name() << ">";
1190 cf->execute();
1191 }
1192 else {
1193 ARCANE_FATAL("No compute function for variable '{0}'", fullName());
1194 }
1195 }
1196}
1197
1198/*---------------------------------------------------------------------------*/
1199/*---------------------------------------------------------------------------*/
1200
1203{
1204 m_p->m_last_update_time = subDomain()->commonVariables().globalTime();
1205 m_p->m_modified_time = IVariable::incrementModifiedTime();
1206}
1207
1208/*---------------------------------------------------------------------------*/
1209/*---------------------------------------------------------------------------*/
1210
1213{
1214 return m_p->m_modified_time;
1215}
1216
1217/*---------------------------------------------------------------------------*/
1218/*---------------------------------------------------------------------------*/
1219
1222{
1223 m_p->m_depends.add(VariableDependInfo(var, dt, TraceInfo()));
1224}
1225
1226/*---------------------------------------------------------------------------*/
1227/*---------------------------------------------------------------------------*/
1228
1230addDepend(IVariable* var, eDependType dt, const TraceInfo& tinfo)
1231{
1232 m_p->m_depends.add(VariableDependInfo(var, dt, tinfo));
1233}
1234
1235/*---------------------------------------------------------------------------*/
1236/*---------------------------------------------------------------------------*/
1237
1240{
1241 ARCANE_UNUSED(var);
1242 throw NotImplementedException(A_FUNCINFO);
1243}
1244
1245/*---------------------------------------------------------------------------*/
1246/*---------------------------------------------------------------------------*/
1247
1250{
1251 m_p->m_compute_function = v;
1252}
1253
1254/*---------------------------------------------------------------------------*/
1255/*---------------------------------------------------------------------------*/
1256
1259{
1260 return m_p->m_compute_function.get();
1261}
1262
1263/*---------------------------------------------------------------------------*/
1264/*---------------------------------------------------------------------------*/
1265
1268{
1269 for (Integer k = 0, n = m_p->m_depends.size(); k < n; ++k) {
1270 VariableDependInfo& vdi = m_p->m_depends[k];
1271 infos.add(vdi);
1272 }
1273}
1274
1275/*---------------------------------------------------------------------------*/
1276/*---------------------------------------------------------------------------*/
1277
1278/*---------------------------------------------------------------------------*/
1279/*---------------------------------------------------------------------------*/
1280
1282addTag(const String& tagname, const String& tagvalue)
1283{
1284 m_p->m_tags[tagname] = tagvalue;
1285}
1286
1287/*---------------------------------------------------------------------------*/
1288/*---------------------------------------------------------------------------*/
1289
1291removeTag(const String& tagname)
1292{
1293 m_p->m_tags.erase(tagname);
1294}
1295
1296/*---------------------------------------------------------------------------*/
1297/*---------------------------------------------------------------------------*/
1298
1300hasTag(const String& tagname)
1301{
1302 return m_p->m_tags.find(tagname) != m_p->m_tags.end();
1303}
1304
1305/*---------------------------------------------------------------------------*/
1306/*---------------------------------------------------------------------------*/
1307
1309tagValue(const String& tagname)
1310{
1311 std::map<String, String>::const_iterator i = m_p->m_tags.find(tagname);
1312 if (i == m_p->m_tags.end())
1313 return String();
1314 return i->second;
1315}
1316
1317/*---------------------------------------------------------------------------*/
1318/*---------------------------------------------------------------------------*/
1319
1322{
1323 setUpToDate();
1326 _setValidData(true);
1327}
1328
1329/*---------------------------------------------------------------------------*/
1330/*---------------------------------------------------------------------------*/
1331
1337
1338/*---------------------------------------------------------------------------*/
1339/*---------------------------------------------------------------------------*/
1340
1342read(IDataReader* reader)
1343{
1344 reader->read(this, data());
1345 notifyEndRead();
1346}
1347
1348/*---------------------------------------------------------------------------*/
1349/*---------------------------------------------------------------------------*/
1350
1352write(IDataWriter* writer)
1353{
1355 writer->write(this, data());
1356}
1357
1358/*---------------------------------------------------------------------------*/
1359/*---------------------------------------------------------------------------*/
1360
1362changeGroupIds(Int32ConstArrayView old_to_new_ids)
1363{
1364 ARCANE_UNUSED(old_to_new_ids);
1365 // pH: default implementation since this method is not yet official
1366}
1367
1368/*---------------------------------------------------------------------------*/
1369/*---------------------------------------------------------------------------*/
1383{
1384 if (!m_p->m_is_used)
1385 ARCANE_FATAL("Can not swap variable values for unused variable (instance)");
1386 if (!rhs->m_p->m_is_used)
1387 ARCANE_FATAL("Can not swap variable values for unused variable (argument)");
1388 if (isPartial() || rhs->isPartial())
1389 ARCANE_FATAL("Can not swap variable values for partial variables");
1390 if (itemGroup() != rhs->itemGroup())
1391 ARCANE_FATAL("Can not swap variable values for variables from different groups");
1392}
1393
1394/*---------------------------------------------------------------------------*/
1395/*---------------------------------------------------------------------------*/
1396
1397bool Variable::
1398_wantShrink() const
1399{
1400 return m_p->m_want_shrink;
1401}
1402
1403/*---------------------------------------------------------------------------*/
1404/*---------------------------------------------------------------------------*/
1405
1408{
1409 data()->setAllocationInfo(v);
1410 // Il est possible que le changement d'allocation modifie les données
1411 // allouées. Il faut donc synchroniser les références.
1413}
1414
1415/*---------------------------------------------------------------------------*/
1416/*---------------------------------------------------------------------------*/
1417
1419allocationInfo() const
1420{
1421 return data()->allocationInfo();
1422}
1423
1424/*---------------------------------------------------------------------------*/
1425/*---------------------------------------------------------------------------*/
1426
1429{
1430 return m_p;
1431}
1432
1433/*---------------------------------------------------------------------------*/
1434/*---------------------------------------------------------------------------*/
1435
1436/*---------------------------------------------------------------------------*/
1437/*---------------------------------------------------------------------------*/
1438
1441 IData* sorted_data)
1442{
1443 ARCANE_CHECK_POINTER(hash_algo);
1444 ARCANE_CHECK_POINTER(sorted_data);
1445
1446 INumericDataInternal* num_data = sorted_data->_commonInternal()->numericData();
1447 if (!num_data)
1448 return {};
1449 if (!m_item_family)
1450 return {};
1451
1452 IParallelMng* pm = m_item_family->parallelMng();
1453 Int32 my_rank = pm->commRank();
1454 Int32 master_rank = pm->masterIORank();
1455 ConstMemoryView memory_view = num_data->memoryView();
1456
1457 UniqueArray<Byte> bytes;
1458
1459 pm->gatherVariable(Arccore::asSpan<Byte>(memory_view.bytes()).smallView(), bytes, master_rank);
1460
1461 String hash_string;
1462 if (my_rank == master_rank) {
1463 HashAlgorithmValue hash_value;
1464 hash_algo->computeHash(asBytes(bytes), hash_value);
1465 hash_string = Convert::toHexaString(asBytes(hash_value.bytes()));
1466 }
1467 return hash_string;
1468}
1469
1470/*---------------------------------------------------------------------------*/
1471/*---------------------------------------------------------------------------*/
1472
1474changeAllocator(const MemoryAllocationOptions& mem_options)
1475{
1476 INumericDataInternal* dx = m_data->_commonInternal()->numericData();
1477 if (dx) {
1478 dx->changeAllocator(mem_options);
1479 m_variable->syncReferences();
1480 }
1481}
1482
1483/*---------------------------------------------------------------------------*/
1484/*---------------------------------------------------------------------------*/
1485
1487resize(const VariableResizeArgs& resize_args)
1488{
1489 return m_variable->_resize(resize_args);
1490}
1491
1492/*---------------------------------------------------------------------------*/
1493/*---------------------------------------------------------------------------*/
1494
1496compareVariable(const VariableComparerArgs& compare_args)
1497{
1498 return m_variable->_compareVariable(compare_args);
1499}
1500
1501/*---------------------------------------------------------------------------*/
1502/*---------------------------------------------------------------------------*/
1503
1505replicaParallelMng() const
1506{
1507 //TODO: regarder si la variable est utilisée.
1508 IMesh* mesh = m_variable->mesh();
1509 // TODO: faut-il prendre le sous-domaine dans ce cas ?
1510 IParallelMng* pm = (mesh) ? mesh->parallelMng() : m_variable->subDomain()->parallelMng();
1512 if (!pr->hasReplication())
1513 return nullptr;
1514 return pr->replicaParallelMng();
1515}
1516
1517/*---------------------------------------------------------------------------*/
1518/*---------------------------------------------------------------------------*/
1519
1520} // End namespace Arcane
1521
1522/*---------------------------------------------------------------------------*/
1523/*---------------------------------------------------------------------------*/
1524
1525#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.
Tableau d'items de types quelconques.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
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)
Vue constante sur une zone mémoire contigue contenant des éléments de taille fixe.
constexpr SpanType bytes() const
Vue sous forme d'octets.
Informations sur l'allocation d'une donnée.
Valeur retournée par un algorithme de hashage.
Interface du gestionnaire de fabrique d'une donnée.
virtual INumericDataInternal * numericData()
Interface générique pour les données numériques (nullptr si la donnée n'est pas numérique)
Interface d'une opération sur 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 IDataInternal * _commonInternal()=0
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.
virtual void addVariable(IVariable *var)=0
Ajoute une variable à cette famille.
virtual void removeVariable(IVariable *var)=0
Supprime une variable à cette famille.
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 MeshHandle * findMeshHandle(const String &name, bool throw_exception)=0
Recherche le maillage de nom name.
Interface pour un 'IData' d'un type numérique.
virtual void changeAllocator(const MemoryAllocationOptions &alloc_info)=0
Change l'allocateur de la variable.
virtual MutableMemoryView memoryView()=0
Vue mémoire sur la donnée.
virtual void notifyAllObservers()=0
Notifie tous les observateurs.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual void gatherVariable(ConstArrayView< char > send_buf, Array< char > &recv_buf, Int32 rank)=0
Effectue un regroupement sur tous les processeurs.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual IParallelReplication * replication() const =0
Informations sur la réplication.
virtual Integer masterIORank() const =0
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
Informations sur la réplication des sous-domaines en parallèle.
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 functor de re-calcul d'une variable.
Partie interne de Ivariable.
virtual void removeVariable(IVariable *var)=0
Supprime 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:76
@ PNoExchange
Indique que la variable ne doit pas être échangée.
Definition IVariable.h:128
@ PNoReplicaSync
Indique que la variable n'a pas forcément la même valeur entre les réplicas.
Definition IVariable.h:144
@ PTemporary
Indique que la variable est temporaire.
Definition IVariable.h:111
@ PInShMem
Indique que la variable doit être alloué en mémoire partagée.
Definition IVariable.h:153
@ PExecutionDepend
Indique que la valeur de la variable est dépendante de l'exécution.
Definition IVariable.h:91
@ PPrivate
Indique que la variable est privée.
Definition IVariable.h:99
@ PPersistant
Indique que la variable est persistante.
Definition IVariable.h:135
@ PNoRestore
Indique que la variable ne doit pas être restaurée.
Definition IVariable.h:118
@ PNoNeedSync
Indique que la variable n'est pas nécessairement synchronisée.
Definition IVariable.h:65
@ PNoDump
Indique que la variable ne doit pas être sauvegardée.
Definition IVariable.h:57
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:159
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:162
Fonctor pour une fonction de hachage.
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
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
Definition ItemGroup.h:120
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é.
Exception lorsqu'une fonction n'est pas implémentée.
Référence à une instance.
Encapsulation d'un pointeur qui se détruit automatiquement.
Definition ScopedPtr.h:44
__host__ __device__ void fill(T o)
Remplit le tableau avec la valeur o.
Definition Span.h:381
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.
Meta-données sur une variable.
void resize(const VariableResizeArgs &resize_args) override
Redimensionne la variable en ajoutant une capacité additionnelle.
Definition Variable.cc:1487
void changeAllocator(const MemoryAllocationOptions &alloc_info) override
Change l'allocateur de la variable.
Definition Variable.cc:1474
VariableComparerResults compareVariable(const VariableComparerArgs &compare_args) override
Applique la méthode de comparaison spécifiée par compare_args.
Definition Variable.cc:1496
bool m_has_recursive_depend
Vrai si les dépendances sont récursives.
Definition Variable.cc:120
IParallelMng * replicaParallelMng() const
Retourne le IParallelMng du replica du maillage associé à la variable.
Definition Variable.cc:1505
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
Byte m_hash_id[HASHID_SIZE]
hash de la variable pour vérifier la cohérence de la sérialisation.
Definition Variable.cc:177
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
String computeComparisonHashCollective(IHashAlgorithm *hash_algo, IData *sorted_data) override
Calcule de Hash de comparaison pour la variable.
Definition Variable.cc:1440
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.
void setPreviousReference(VariableRef *v)
Positionne la référence précédente.
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)
void setNextReference(VariableRef *v)
Positionne la référence suivante.
VariableRef * nextReference()
Référence suivante (ou null) sur variable()
Arguments pour redimensionner une variable.
Instance d'une variable.
Definition Variable.h:79
void resizeFromGroup() override
Positionne le nombre d'éléments pour une variable du maillage.
Definition Variable.cc:1008
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:831
void notifyBeginWrite() override
Notifie du début d'écriture de data().
Definition Variable.cc:1333
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:1382
bool isUsed() const override
Etat d'utilisation de la variable.
Definition Variable.cc:709
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:905
void _setValidData(bool valid_data)
Indique si les données de la variable sont valides.
Definition Variable.cc:920
VariableMetaData * createMetaData() const override
Créé une instance contenant les meta-données de la variable.
Definition Variable.cc:755
IVariableComputeFunction * computeFunction() override
Fonction utilisée pour mettre à jour la variable.
Definition Variable.cc:1258
Ref< VariableMetaData > createMetaDataRef() const override
Créé une instance contenant les meta-données de la variable.
Definition Variable.cc:764
bool isPartial() const override
Indique si la variable est partielle.
Definition Variable.cc:887
String tagValue(const String &tagname) override
Valeur du tag tagname. La chaîne est nulle si le tag n'existe pas.
Definition Variable.cc:1309
void notifyReferencePropertyChanged() override
Indique que les propriétés d'une des références à cette variable ont changé (interne)
Definition Variable.cc:622
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:1291
void addDepend(IVariable *var, eDependType dt) override
Ajoute var à la liste des dépendances.
Definition Variable.cc:1221
String name() const final
Nom de la variable.
Definition Variable.cc:483
IObservable * readObservable() override
Observable en lecture.
Definition Variable.cc:1127
virtual VariableComparerResults _compareVariable(const VariableComparerArgs &compare_args)=0
Comparaison de valeurs entre variables.
void serialize(ISerializer *sbuffer, IDataOperation *operation) override
Definition Variable.cc:970
ItemGroup itemGroup() const final
Groupe du maillage associé.
Definition Variable.cc:851
IObservable * onSizeChangedObservable() override
Observable en redimensionnement.
Definition Variable.cc:1136
void notifyEndRead() override
Notifie de la modification externe de data().
Definition Variable.cc:1321
void read(IDataReader *d) override
Definition Variable.cc:1342
void syncReferences() override
Synchronise les références.
Definition Variable.cc:773
void setUsed(bool v) override
Positionne l'état d'utilisation de la variable.
Definition Variable.cc:631
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:860
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:1148
Integer dimension() const override
Dimension de la variable.
Definition Variable.cc:869
Int64 modifiedTime() override
Temps auquel la variable a été mise à jour.
Definition Variable.cc:1212
void setUpToDate() override
Indique que la variable vient d'être mise à jour.
Definition Variable.cc:1202
void addTag(const String &tagname, const String &tagvalue) override
Ajoute le tag tagname avev la valeur tagvalue.
Definition Variable.cc:1282
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:817
~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:929
IObservable * writeObservable() override
Observable en écriture.
Definition Variable.cc:1118
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:878
void setComputeFunction(IVariableComputeFunction *v) override
Positionne la fonction de recalcul de la variable.
Definition Variable.cc:1249
void resize(Integer n) override
Positionne le nombre d'éléments pour une variable tableau.
Definition Variable.cc:999
IVariableInternal * _internalApi() override
API interne à Arcane.
Definition Variable.cc:1428
IItemFamily * itemFamily() const final
Famille d'entité associée.
Definition Variable.cc:896
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:1352
IDataFactoryMng * dataFactoryMng() const final
Fabrique de données associées à la variable.
Definition Variable.cc:947
void changeGroupIds(Int32ConstArrayView old_to_new_ids) override
pH : EXPERIMENTAL
Definition Variable.cc:1362
void removeDepend(IVariable *var) override
Supprime var de la liste des dépendances.
Definition Variable.cc:1239
VariablePrivate * m_p
Implémentation.
Definition Variable.h:238
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:790
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
Definition Variable.cc:1419
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:804
void dependInfos(Array< VariableDependInfo > &infos) override
Infos de dépendances.
Definition Variable.cc:1267
bool hasTag(const String &tagname) override
true si la variable possède le tag tagname
Definition Variable.cc:1300
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
Definition Variable.cc:1407
MeshHandle meshHandle() const final
Maillage auquel est associé la variable.
Definition Variable.cc:842
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.
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: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