Arcane  v3.14.10.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-2024 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-2024 */
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/datatype/DataAllocationInfo.h"
57#include "arcane/core/internal/IItemFamilyInternal.h"
58#include "arcane/core/internal/IVariableMngInternal.h"
59#include "arcane/core/internal/IVariableInternal.h"
60#include "arcane/core/internal/IDataInternal.h"
61
62#include <map>
63#include <set>
64#include <atomic>
65
66/*---------------------------------------------------------------------------*/
67/*---------------------------------------------------------------------------*/
68
69namespace Arcane
70{
71
72/*---------------------------------------------------------------------------*/
73/*---------------------------------------------------------------------------*/
74/*
75 * \brief Partie privée d'une variable.
76 */
78: public IVariableInternal
79{
80 public:
81
82 VariablePrivate(const VariableBuildInfo& v, const VariableInfo& vi, Variable* var);
83
84 public:
85
86 static std::atomic<Int64> modified_time_global_value;
87
88 public:
89
90 ISubDomain* m_sub_domain = nullptr;
91 IDataFactoryMng* m_data_factory_mng = nullptr;
92 MeshHandle m_mesh_handle; //!< Maillage (peut être nul)
93 Ref<IData> m_data; //!< Données de la variable
94 ItemGroup m_item_group; //!< Groupe d'entité sur lequel est associé la variable
95 IItemFamily* m_item_family = nullptr; //!< Familly d'entité (peut être nul)
96 VariableInfo m_infos; //!< Infos caractéristiques de la variable
97 int m_property = 0; //!< Propriétés de la variable
98 bool m_is_partial = false; //!< Vrai si la variable est partielle
99 bool m_need_property_update = false;
100 bool m_is_used = false; //!< Etat d'utilisation de la variable
101 bool m_has_valid_data = false; //!< Vrai si les données sont valide
102 Real m_last_update_time = 0.0; //!< Temps physique de la dernière mise à jour
103 VariableRef* m_first_reference = nullptr; //! Première référence sur la variable
104 Integer m_nb_reference = 0;
105 UniqueArray<VariableDependInfo> m_depends; //!< Liste des dépendances de cette variable
106 Int64 m_modified_time = 0; //!< Tag de la dernière modification
108 AutoDetachObservable m_write_observable; //!< Observable en écriture
109 AutoDetachObservable m_read_observable; //!< Observable en lecture
110 AutoDetachObservable m_on_size_changed_observable; //!< Observable en redimensionnement
111 std::map<String,String> m_tags; //!< Liste des tags
112 bool m_has_recursive_depend = true; //!< Vrai si les dépendances sont récursives
113 bool m_want_shrink = false;
114 Variable* m_variable = nullptr; //!< Variable associée
115
116 public:
117
118 /*!
119 * \brief Sérialise le `hashid`.
120 *
121 * Lors de la désérialisation, vérifie que le `hashid` est correctement
122 * et si ce n'est pas le cas renvoie une exception.
123 */
125 {
126 switch(sbuf->mode()){
127 case ISerializer::ModeReserve:
128 sbuf->reserveSpan(DT_Byte,HASHID_SIZE);
129 break;
131 sbuf->putSpan(Span<const Byte>(m_hash_id,HASHID_SIZE));
132 break;
134 {
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 }
147 break;
148 }
149 }
150
151 public:
152
153 //!@{ \name Implémentation de IVariableInternal
154 String computeComparisonHashCollective(IHashAlgorithm* hash_algo, IData* sorted_data) override;
155 void changeAllocator(const MemoryAllocationOptions& alloc_info) override;
156 void resizeWithReserve(Int32 new_size,Int32 additional_capacity) 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.
237: public IItemGroupObserver
238{
239public:
241 : m_var(var)
242 {
243 ARCANE_ASSERT((m_var),("Variable pointer null"));
244
245 if(var->itemGroup().isAllItems())
246 ARCANE_FATAL("No observer should be attached on all items group");
247 }
248
250
252 {
253 const Int32ConstArrayView & new_ids = *info;
254 if (new_ids.empty())
255 return;
256 ItemGroup group = m_var->itemGroup();
257 SharedPtrT<GroupIndexTable> id_to_index = group.localIdToIndex();
258
259 const Integer old_size = id_to_index->size();
260 const Integer group_size = group.size();
261 if (group_size != (old_size+new_ids.size()))
262 ARCANE_FATAL("Inconsitent extended size");
263 m_var->resizeFromGroup();
264 //id_to_index->update();
265 }
266
268 {
269 // contient la liste des localids des items supprimés dans l'ancien groupe
270 const Int32ConstArrayView & removed_lids = *info;
271 if (removed_lids.empty())
272 return;
273 ItemGroup group = m_var->itemGroup();
274 SharedPtrT<GroupIndexTable> id_to_index = group.localIdToIndex();
275
276 const Integer old_size = id_to_index->size();
277 const Integer group_size = group.size();
278
279 if (group_size != (old_size-removed_lids.size()))
280 ARCANE_FATAL("Inconsitent reduced size {0} vs {1}",group_size,old_size);
281 [[maybe_unused]] ItemVectorView view = group.view();
282 Int32UniqueArray source;
283 Int32UniqueArray destination;
284 source.reserve(group_size);
285 destination.reserve(group_size);
286 for(Integer i=0,index=0,removed_index=0; i<old_size ;++i) {
287 if (removed_index < removed_lids.size() &&
288 id_to_index->keyLocalId(i) == removed_lids[removed_index]) {
289 ++removed_index;
290 }
291 else {
292 ARCANE_ASSERT((id_to_index->keyLocalId(i) == view[index].localId()),
293 ("Inconsistent key (pos=%d,key=%d) vs (pos=%d,key=%d)",
294 i,id_to_index->keyLocalId(i),index,view[index].localId()));
295 if (i != index) {
296 destination.add(index);
297 source.add(i);
298 }
299 ++index;
300 }
301 }
302 m_var->copyItemsValues(source,destination);
303 m_var->resizeFromGroup();
304 }
305
307 const Int32ConstArrayView & ids = *info;
308 if (ids.empty()) return;
309 ItemGroup group = m_var->itemGroup();
310 SharedPtrT<GroupIndexTable> id_to_index = group.localIdToIndex();
311 m_var->compact(*info);
312 //id_to_index->compact(info);
313 }
314
316 ItemGroup group = m_var->itemGroup();
317 SharedPtrT<GroupIndexTable> id_to_index = group.localIdToIndex();
318 m_var->resizeFromGroup();
319 //id_to_index->update();
320 }
321
322 bool needInfo() const { return true; }
323
324private:
325 IVariable* m_var;
326};
327
328/*---------------------------------------------------------------------------*/
329/*---------------------------------------------------------------------------*/
330
332Variable(const VariableBuildInfo& v,const VariableInfo& vi)
333: TraceAccessor(v.traceMng())
334, m_p(new VariablePrivate(v, vi, this))
335{
336}
337
338/*---------------------------------------------------------------------------*/
339/*---------------------------------------------------------------------------*/
340
342~Variable()
343{
344 //NOTE: si la variable possède un groupe, c'est le IVariableMng
345 // qui supprime la référence de cette variable sur le groupe
346 delete m_p;
347}
348
349/*---------------------------------------------------------------------------*/
350/*---------------------------------------------------------------------------*/
351
352bool Variable::
353_hasReference() const
354{
355 return m_p->m_first_reference;
356}
357
358/*---------------------------------------------------------------------------*/
359/*---------------------------------------------------------------------------*/
360
363{
364 _checkSetProperty(ref);
365 ++m_p->m_nb_reference;
366 ref->setNextReference(m_p->m_first_reference);
367 if (m_p->m_first_reference){
368 VariableRef* _list = m_p->m_first_reference;
369 if (_list->previousReference())
370 _list->previousReference()->setNextReference(ref);
371 _list->setPreviousReference(ref);
372 }
373 else{
374 ref->setPreviousReference(0);
375 }
376 m_p->m_first_reference = ref;
377}
378
379/*---------------------------------------------------------------------------*/
380/*---------------------------------------------------------------------------*/
381
384{
385 {
386 VariableRef* tmp = ref;
387 if (tmp->previousReference())
388 tmp->previousReference()->setNextReference(tmp->nextReference());
389 if (tmp->nextReference())
390 tmp->nextReference()->setPreviousReference(tmp->previousReference());
391 if (m_p->m_first_reference==tmp)
392 m_p->m_first_reference = m_p->m_first_reference->nextReference();
393 }
394 // La référence peut être utilisée par la suite donc il ne faut pas oublier
395 // de supprimer le précédent et le suivant.
396 ref->setNextReference(0);
397 ref->setPreviousReference(0);
398
399 --m_p->m_nb_reference;
400 _checkSetProperty(ref);
401
402 // Lorsqu'il n'y a plus de références sur cette variable, le signale au
403 // gestionnaire de variable, sauf s'il s'agit d'une variable persistante
404 if (!_hasReference()){
405 bool is_persistant = property() & IVariable::PPersistant;
406 if (!is_persistant){
407 //m_p->m_trace->info() << " REF PROPERTY name=" << name() << " " << ref->referenceProperty();
408 _removeMeshReference();
409 ISubDomain* sd = m_p->m_sub_domain;
410 IVariableMng* vm = sd->variableMng();
411 vm->_internalApi()->removeVariable(this);
412 }
413 }
414}
415
416/*---------------------------------------------------------------------------*/
417/*---------------------------------------------------------------------------*/
418
420firstReference() const
421{
422 return m_p->m_first_reference;
423}
424
425/*---------------------------------------------------------------------------*/
426/*---------------------------------------------------------------------------*/
427
428void Variable::
429_checkSetProperty(VariableRef* ref)
430{
431 // Garantie que la propriété est correctement mise à jour avec la valeur
432 // de la seule référence.
433 if (!_hasReference()){
434 m_p->m_property = ref->referenceProperty();
435 m_p->m_need_property_update = false;
436 }
437 else
438 m_p->m_need_property_update = true;
439}
440
441/*---------------------------------------------------------------------------*/
442/*---------------------------------------------------------------------------*/
443
445nbReference() const
446{
447 return m_p->m_nb_reference;
448}
449
450/*---------------------------------------------------------------------------*/
451/*---------------------------------------------------------------------------*/
452
454subDomain()
455{
456 return m_p->m_sub_domain;
457}
458
459
460/*---------------------------------------------------------------------------*/
461/*---------------------------------------------------------------------------*/
462
464variableMng() const
465{
466 return m_p->m_sub_domain->variableMng();
467}
468
469/*---------------------------------------------------------------------------*/
470/*---------------------------------------------------------------------------*/
471
473name() const
474{
475 return m_p->m_infos.localName();
476}
477
478/*---------------------------------------------------------------------------*/
479/*---------------------------------------------------------------------------*/
480
482fullName() const
483{
484 return m_p->m_infos.fullName();
485}
486
487/*---------------------------------------------------------------------------*/
488/*---------------------------------------------------------------------------*/
489
491itemFamilyName() const
492{
493 return m_p->m_infos.itemFamilyName();
494}
495
496/*---------------------------------------------------------------------------*/
497/*---------------------------------------------------------------------------*/
498
500itemGroupName() const
501{
502 return m_p->m_infos.itemGroupName();
503}
504
505/*---------------------------------------------------------------------------*/
506/*---------------------------------------------------------------------------*/
507
509meshName() const
510{
511 return m_p->m_infos.meshName();
512}
513
514/*---------------------------------------------------------------------------*/
515/*---------------------------------------------------------------------------*/
516
518dataType() const
519{
520 return m_p->m_infos.dataType();
521}
522
523/*---------------------------------------------------------------------------*/
524/*---------------------------------------------------------------------------*/
525/*!
526 * \todo traiter le cas PSubDomainPrivate.
527 */
529property() const
530{
531 if (!m_p->m_need_property_update)
532 return m_p->m_property;
533
534 // Les propriétés de la variable dépendent de ce que chaque
535 // référence souhaite et il faut les remettre à jour lorsque ces
536 // dernières changent.
537 // Par exemple, si toutes les références sont PNoDump et qu'une seule
538 // ne l'est pas, la variable ne doit pas l'être.
539 m_p->m_need_property_update = false;
540
541 bool want_dump = false;
542 bool want_sync = false;
543 bool want_replica_sync = false;
544 bool sub_domain_depend = false;
545 bool execution_depend = false;
546 bool want_private = false;
547 bool want_restore = false;
548 bool want_notemporary = false;
549 bool want_exchange = false;
550 bool want_persistant = false;
551
552 int property = 0;
553 for( VarRefEnumerator i(this); i.hasNext(); ++i ){
554 VariableRef* vref = *i;
555 int p = vref->referenceProperty();
556 if ( ! (p & IVariable::PNoDump) )
557 want_dump = true;
558 if ( ! (p & IVariable::PNoNeedSync) )
559 want_sync = true;
560 if ( ! (p & IVariable::PNoReplicaSync) )
561 want_replica_sync = true;
562 if ( (p & IVariable::PSubDomainDepend) )
563 sub_domain_depend = true;
564 if ( (p & IVariable::PExecutionDepend) )
565 execution_depend = true;
566 if ( (p & IVariable::PPersistant) )
567 want_persistant = true;
568 if ( (p & IVariable::PPrivate) )
569 want_private = true;
570 if ( ! (p & IVariable::PNoRestore) )
571 want_restore = true;
572 if ( ! (p & IVariable::PNoExchange) )
573 want_exchange = true;
574 if ( ! (p & IVariable::PTemporary) )
575 want_notemporary = true;
576 }
577
578 if (!want_dump)
579 property |= IVariable::PNoDump;
580 if (!want_sync)
581 property |= IVariable::PNoNeedSync;
582 if (!want_replica_sync)
583 property |= IVariable::PNoReplicaSync;
584 if (sub_domain_depend)
585 property |= IVariable::PSubDomainDepend;
586 if (execution_depend)
587 property |= IVariable::PExecutionDepend;
588 if (want_private)
589 property |= IVariable::PPrivate;
590 if (want_persistant)
591 property |= IVariable::PPersistant;
592 if (!want_restore)
593 property |= IVariable::PNoRestore;
594 if (!want_exchange)
595 property |= IVariable::PNoExchange;
596 if (!want_notemporary)
597 property |= IVariable::PTemporary;
598
599 m_p->m_property = property;
600 return m_p->m_property;
601}
602
603/*---------------------------------------------------------------------------*/
604/*---------------------------------------------------------------------------*/
605
608{
609 m_p->m_need_property_update = true;
610}
611
612/*---------------------------------------------------------------------------*/
613/*---------------------------------------------------------------------------*/
614
616setUsed(bool is_used)
617{
618 if (m_p->m_is_used==is_used)
619 return;
620
621 m_p->m_is_used = is_used;
622
623 eItemKind ik = itemKind();
624
625 if (m_p->m_is_used){
626 if (m_p->m_item_group.null() && ik!=IK_Unknown){
627 _checkSetItemFamily();
628 _checkSetItemGroup();
629 // Attention à ne pas reinitialiser les valeurs lorsque ces dernières
630 // sont valides, ce qui est le cas par exemple après une protection.
631 if (!m_p->m_has_valid_data){
633 // Historiquement on remplissait dans tous les cas la variable avec le
634 // constructeur par défaut
635 // de la donnée en appelant systématiquement fillDefautt(). Cependant,
636 // ce n'était pas le comportement souhaité qui doit être celui défini par
637 // getGlobalDataInitialisationPolicy() (dans DataTypes.h).
638 // On ne le fait maintenant que si le mode d'initialisation est égal
639 // à DIP_Legacy. Ce mode doit à terme disparaître.
641 m_p->m_data->fillDefault();
642 m_p->m_has_valid_data = true;
643 }
644 }
645 }
646 else{
647 _removeMeshReference();
648 if (ik==IK_Unknown)
649 resize(0);
650 else
652 // Indique que les valeurs ne sont plus valides
653 m_p->m_has_valid_data = false;
654 }
655
656 for( VarRefEnumerator i(this); i.hasNext(); ++i ){
657 VariableRef* ref = *i;
658 ref->internalSetUsed(m_p->m_is_used);
659 }
660}
661
662/*---------------------------------------------------------------------------*/
663/*---------------------------------------------------------------------------*/
664
665void Variable::
666_removeMeshReference()
667{
668 IItemFamily* family = m_p->m_item_family;
669 if (family)
670 family->_internalApi()->removeVariable(this);
671
672 if (isPartial())
673 m_p->m_item_group.internal()->detachObserver(this);
674
675 m_p->m_item_group = ItemGroup();
676 m_p->m_item_family = 0;
677}
678
679/*---------------------------------------------------------------------------*/
680/*---------------------------------------------------------------------------*/
681
683isUsed() const
684{
685 return m_p->m_is_used;
686}
687
688/*---------------------------------------------------------------------------*/
689/*---------------------------------------------------------------------------*/
690
691namespace
692{
693
694String _buildVariableFullType(const IVariable* var)
695{
696 StringBuilder full_type_b;
697 full_type_b = dataTypeName(var->dataType());
698 full_type_b += ".";
699 full_type_b += itemKindName(var->itemKind());
700 full_type_b += ".";
701 full_type_b += var->dimension();
702 full_type_b += ".";
703 full_type_b += var->multiTag();
704 if (var->isPartial())
705 full_type_b += ".Partial";
706 return full_type_b.toString();
707}
708
709}
710
711/*---------------------------------------------------------------------------*/
712/*---------------------------------------------------------------------------*/
713
714VariableMetaData* Variable::
715_createMetaData() const
716{
717 auto vmd = new VariableMetaData(name(),meshName(),itemFamilyName(),
719 vmd->setFullType(_buildVariableFullType(this));
720 vmd->setMultiTag(String::fromNumber(multiTag()));
721 vmd->setProperty(property());
722 return vmd;
723}
724
725/*---------------------------------------------------------------------------*/
726/*---------------------------------------------------------------------------*/
727
729createMetaData() const
730{
731 return _createMetaData();
732}
733
734/*---------------------------------------------------------------------------*/
735/*---------------------------------------------------------------------------*/
736
737Ref<VariableMetaData> Variable::
738createMetaDataRef() const
739{
740 return makeRef(_createMetaData());
741}
742
743/*---------------------------------------------------------------------------*/
744/*---------------------------------------------------------------------------*/
745
748{
749 //cout << "** SYNC REFERENCE N=" << m_p->m_nb_reference << " F=" << m_p->m_first_reference << '\n';
750 for( VarRefEnumerator i(this); i.hasNext(); ++i ){
751 VariableRef* ref = *i;
752 //cout << "** SYNC REFERENCE V=" << ref << '\n';
753 ref->updateFromInternal();
754 }
755 // Il faut le faire après la mise à jour des références
756 // car les observateurs peuvent lire les valeurs via une référence
758}
759
760/*---------------------------------------------------------------------------*/
761/*---------------------------------------------------------------------------*/
762
764checkIfSync(int max_print)
765{
766 ARCANE_UNUSED(max_print);
767 return 0;
768}
769
770/*---------------------------------------------------------------------------*/
771/*---------------------------------------------------------------------------*/
772
774checkIfSameOnAllReplica(Integer max_print)
775{
776 //TODO: regarder si la variable est utilisée.
777 IMesh* mesh = this->mesh();
780 if (!pr->hasReplication())
781 return 0;
782 return _checkIfSameOnAllReplica(pr->replicaParallelMng(),max_print);
783}
784
785/*---------------------------------------------------------------------------*/
786/*---------------------------------------------------------------------------*/
787
789mesh() const
790{
791 if (m_p->m_mesh_handle.hasMesh())
792 return m_p->m_mesh_handle.mesh();
793 return nullptr;
794}
795
796/*---------------------------------------------------------------------------*/
797/*---------------------------------------------------------------------------*/
798
800meshHandle() const
801{
802 return m_p->m_mesh_handle;
803}
804
805/*---------------------------------------------------------------------------*/
806/*---------------------------------------------------------------------------*/
807
809itemGroup() const
810{
811 return m_p->m_item_group;
812}
813
814/*---------------------------------------------------------------------------*/
815/*---------------------------------------------------------------------------*/
816
818itemKind() const
819{
820 return m_p->m_infos.itemKind();
821}
822
823/*---------------------------------------------------------------------------*/
824/*---------------------------------------------------------------------------*/
825
827dimension() const
828{
829 return m_p->m_infos.dimension();
830}
831
832/*---------------------------------------------------------------------------*/
833/*---------------------------------------------------------------------------*/
834
836multiTag() const
837{
838 return m_p->m_infos.multiTag();
839}
840
841/*---------------------------------------------------------------------------*/
842/*---------------------------------------------------------------------------*/
843
845isPartial() const
846{
847 return m_p->m_is_partial;
848}
849
850/*---------------------------------------------------------------------------*/
851/*---------------------------------------------------------------------------*/
852
854itemFamily() const
855{
856 return m_p->m_item_family;
857}
858
859/*---------------------------------------------------------------------------*/
860/*---------------------------------------------------------------------------*/
861
863_setData(const Ref<IData>& data)
864{
865 m_p->m_data = data;
866 if (!data.get()){
867 ARCANE_FATAL("Invalid data: name={0} datatype={1} dimension={2} multitag={3}",
868 m_p->m_infos.fullName(),m_p->m_infos.dataType(),
869 m_p->m_infos.dimension(),m_p->m_infos.multiTag());
870 }
871 data->setName(m_p->m_infos.fullName());
872}
873
874/*---------------------------------------------------------------------------*/
875/*---------------------------------------------------------------------------*/
876
878_setValidData(bool valid_data)
879{
880 m_p->m_has_valid_data = valid_data;
881}
882
883/*---------------------------------------------------------------------------*/
884/*---------------------------------------------------------------------------*/
885
887_hasValidData() const
888{
889 return m_p->m_has_valid_data;
890}
891
892/*---------------------------------------------------------------------------*/
893/*---------------------------------------------------------------------------*/
894
895void Variable::
896_setProperty(int property)
897{
898 m_p->m_property |= property;
899}
900
901/*---------------------------------------------------------------------------*/
902/*---------------------------------------------------------------------------*/
903
905dataFactoryMng() const
906{
907 return m_p->m_data_factory_mng;
908}
909
910/*---------------------------------------------------------------------------*/
911/*---------------------------------------------------------------------------*/
912
915{
916 debug(Trace::High) << "Serialize (partial) variable name=" << fullName();
917 m_p->serializeHashId(sbuffer);
918 m_p->m_data->serialize(sbuffer,ids,operation);
919 // En mode lecture, les données sont modifiées
920 if (sbuffer->mode()==ISerializer::ModeGet)
922}
923
924/*---------------------------------------------------------------------------*/
925/*---------------------------------------------------------------------------*/
926
928serialize(ISerializer* sbuffer,IDataOperation* operation)
929{
930 debug(Trace::High) << "Serialize (full) variable name=" << fullName();
931
932 m_p->serializeHashId(sbuffer);
933 m_p->m_data->serialize(sbuffer,operation);
934 // En mode lecture, les données sont modifiées
935 if (sbuffer->mode()==ISerializer::ModeGet)
937}
938
939/*---------------------------------------------------------------------------*/
940/*---------------------------------------------------------------------------*/
941
942void Variable::
943_resizeWithReserve(Int32 new_size,Int32 additional_capacity)
944{
945 eItemKind ik = itemKind();
946 if (ik!=IK_Unknown){
947 ARCANE_FATAL("This call is invalid for item variable. Use resizeFromGroup() instead");
948 }
949 _internalResize(new_size, additional_capacity);
951}
952
953/*---------------------------------------------------------------------------*/
954/*---------------------------------------------------------------------------*/
955
957resize(Integer new_size)
958{
959 _resizeWithReserve(new_size,0);
960}
961
962/*---------------------------------------------------------------------------*/
963/*---------------------------------------------------------------------------*/
964
967{
968 eItemKind ik = itemKind();
969 if (ik==IK_Unknown)
970 return;
971 Integer new_size = 0;
972 IItemFamily* family = m_p->m_item_family;
973 if (family){
974 if (m_p->m_item_group.isAllItems())
975 new_size = m_p->m_item_family->maxLocalId();
976 else
977 new_size = m_p->m_item_group.size();
978 }
979 else{
980 ItemGroup group = m_p->m_item_group;
981 if (!group.null()){
982 ARCANE_FATAL("Variable '{0}' has group but no family",fullName());
983 }
984 }
985 debug(Trace::High) << "Variable::resizeFromGroup() var='" << fullName()
986 << "' with " << new_size << " items "
987 << " this=" << this;
988 _internalResize(new_size,new_size/20);
990}
991
992/*---------------------------------------------------------------------------*/
993/*---------------------------------------------------------------------------*/
994
995void Variable::
996_checkSetItemFamily()
997{
998 if (m_p->m_item_family || !m_p->m_item_group.null())
999 return;
1000
1001 if (m_p->m_mesh_handle.isNull())
1002 m_p->m_mesh_handle = m_p->m_sub_domain->meshMng()->findMeshHandle(m_p->m_infos.meshName());
1003
1004 IMesh* mesh = m_p->m_mesh_handle.mesh();
1005 if (!mesh)
1006 ARCANE_FATAL("No mesh named '{0}' exists for variable '{1}'",m_p->m_infos.meshName(),name());
1007
1008 eItemKind ik = itemKind();
1009
1010 IItemFamily* family = 0;
1011 const String& family_name = m_p->m_infos.itemFamilyName();
1012 if (ik==IK_Particle || ik==IK_DoF){
1013 if (family_name.null()){
1014 ARCANE_FATAL("family name not specified for variable {0}",name());
1015 }
1016 family = mesh->findItemFamily(ik,family_name,true);
1017 }
1018 else{
1019 family = mesh->itemFamily(ik);
1020 }
1021
1022 if (family && family->itemKind()!=itemKind())
1023 ARCANE_FATAL("Bad family kind '{0}' '{1}'",family->itemKind(),itemKind());
1024
1025 if (family && family->name()!=itemFamilyName())
1026 ARCANE_FATAL("Incoherent family name. var={0} from_type={1} given={2}",
1027 name(),family->name(),itemFamilyName());
1028
1029 if (!family)
1030 ARCANE_FATAL("Family not found");
1031
1032 if (isPartial() && !family->hasUniqueIdMap())
1033 ARCANE_FATAL("Cannot have partial variable for a family without unique id map");
1034
1035 m_p->m_item_family = family;
1036 debug(Trace::High) << "Variable::setItemFamily() name=" << name()
1037 << " family=" << family
1038 << " familyname='" << family_name << "'";
1039 family->_internalApi()->addVariable(this);
1040}
1041
1042/*---------------------------------------------------------------------------*/
1043/*---------------------------------------------------------------------------*/
1044
1045void Variable::
1046_checkSetItemGroup()
1047{
1048 if (!m_p->m_item_group.null())
1049 return;
1050 const String& group_name = m_p->m_infos.itemGroupName();
1051 //info() << " CHECK SET GROUP var=" << name() << " group=" << group_name;
1052 if (group_name.null()){
1053 m_p->m_item_group = m_p->m_item_family->allItems();
1054 }
1055 else
1056 m_p->m_item_group = m_p->m_item_family->findGroup(group_name,true);
1057
1058 ItemGroupImpl * internal = m_p->m_item_group.internal();
1059 // (HP) TODO: faut il garder ce controle hérité de l'ancienne implémentation de addVariable
1060 if (internal->parent() && (mesh()->parallelMng()->isParallel() && internal->isOwn()))
1061 ARCANE_FATAL("Cannot add variable ({0}) on a own group (name={1})",
1062 fullName(),internal->name());
1063 if (isPartial()) {
1064 if (group_name.empty())
1065 ARCANE_FATAL("Cannot create a partial variable with an empty item_group_name");
1066 debug(Trace::High) << "Attach ItemGroupPartialVariableObserver from " << fullName()
1067 << " to " << m_p->m_item_group.name();
1068 internal->attachObserver(this,new ItemGroupPartialVariableObserver(this));
1069 }
1070}
1071
1072/*---------------------------------------------------------------------------*/
1073/*---------------------------------------------------------------------------*/
1074
1077{
1078 return &(m_p->m_write_observable);
1079}
1080
1081/*---------------------------------------------------------------------------*/
1082/*---------------------------------------------------------------------------*/
1083
1086{
1087 return &(m_p->m_read_observable);
1088}
1089
1090/*---------------------------------------------------------------------------*/
1091/*---------------------------------------------------------------------------*/
1092
1098
1099/*---------------------------------------------------------------------------*/
1100/*---------------------------------------------------------------------------*/
1101
1102/*---------------------------------------------------------------------------*/
1103/*---------------------------------------------------------------------------*/
1104
1106update()
1107{
1108 update(DPT_PreviousTime);
1109}
1110
1111/*---------------------------------------------------------------------------*/
1112/*---------------------------------------------------------------------------*/
1113
1114void Variable::
1115update(Real wanted_time)
1116{
1117 if (m_p->m_last_update_time<wanted_time){
1118 for( Integer k=0,n=m_p->m_depends.size(); k<n; ++k ){
1119 VariableDependInfo& vdi = m_p->m_depends[k];
1120 if (vdi.dependType()==DPT_PreviousTime)
1121 vdi.variable()->update(wanted_time);
1122 }
1123 }
1124
1125 if (m_p->m_has_recursive_depend){
1126 for( Integer k=0,n=m_p->m_depends.size(); k<n; ++k ){
1127 VariableDependInfo& vdi = m_p->m_depends[k];
1128 if (vdi.dependType()==DPT_CurrentTime)
1129 vdi.variable()->update(m_p->m_last_update_time);
1130 }
1131 }
1132
1133 bool need_update = false;
1134 Int64 modified_time = m_p->m_modified_time;
1135 for( Integer k=0,n=m_p->m_depends.size(); k<n; ++k ){
1136 VariableDependInfo& vdi = m_p->m_depends[k];
1137 Int64 mt = vdi.variable()->modifiedTime();
1138 if (mt>modified_time){
1139 need_update = true;
1140 break;
1141 }
1142 }
1143 if (need_update){
1144 IVariableComputeFunction* cf = m_p->m_compute_function.get();
1145 //msg->info() << "Need Compute For Variable <" << name() << "> " << cf;
1146 if (cf){
1147 //msg->info() << "Compute For Variable <" << name() << ">";
1148 cf->execute();
1149 }
1150 else{
1151 ARCANE_FATAL("No compute function for variable '{0}'",fullName());
1152 }
1153 }
1154}
1155
1156/*---------------------------------------------------------------------------*/
1157/*---------------------------------------------------------------------------*/
1158
1165
1166/*---------------------------------------------------------------------------*/
1167/*---------------------------------------------------------------------------*/
1168
1171{
1172 return m_p->m_modified_time;
1173}
1174
1175/*---------------------------------------------------------------------------*/
1176/*---------------------------------------------------------------------------*/
1177
1180{
1181 m_p->m_depends.add(VariableDependInfo(var,dt,TraceInfo()));
1182}
1183
1184/*---------------------------------------------------------------------------*/
1185/*---------------------------------------------------------------------------*/
1186
1188addDepend(IVariable* var,eDependType dt,const TraceInfo& tinfo)
1189{
1190 m_p->m_depends.add(VariableDependInfo(var,dt,tinfo));
1191}
1192
1193/*---------------------------------------------------------------------------*/
1194/*---------------------------------------------------------------------------*/
1195
1198{
1199 ARCANE_UNUSED(var);
1200 throw NotImplementedException(A_FUNCINFO);
1201}
1202
1203/*---------------------------------------------------------------------------*/
1204/*---------------------------------------------------------------------------*/
1205
1211
1212/*---------------------------------------------------------------------------*/
1213/*---------------------------------------------------------------------------*/
1214
1220
1221/*---------------------------------------------------------------------------*/
1222/*---------------------------------------------------------------------------*/
1223
1226{
1227 for( Integer k=0,n=m_p->m_depends.size(); k<n; ++k ){
1228 VariableDependInfo& vdi = m_p->m_depends[k];
1229 infos.add(vdi);
1230 }
1231}
1232
1233/*---------------------------------------------------------------------------*/
1234/*---------------------------------------------------------------------------*/
1235
1236/*---------------------------------------------------------------------------*/
1237/*---------------------------------------------------------------------------*/
1238
1240addTag(const String& tagname,const String& tagvalue)
1241{
1242 m_p->m_tags[tagname] = tagvalue;
1243}
1244
1245/*---------------------------------------------------------------------------*/
1246/*---------------------------------------------------------------------------*/
1247
1249removeTag(const String& tagname)
1250{
1251 m_p->m_tags.erase(tagname);
1252}
1253
1254/*---------------------------------------------------------------------------*/
1255/*---------------------------------------------------------------------------*/
1256
1258hasTag(const String& tagname)
1259{
1260 return m_p->m_tags.find(tagname)!=m_p->m_tags.end();
1261}
1262
1263/*---------------------------------------------------------------------------*/
1264/*---------------------------------------------------------------------------*/
1265
1267tagValue(const String& tagname)
1268{
1269 std::map<String,String>::const_iterator i = m_p->m_tags.find(tagname);
1270 if (i==m_p->m_tags.end())
1271 return String();
1272 return i->second;
1273}
1274
1275/*---------------------------------------------------------------------------*/
1276/*---------------------------------------------------------------------------*/
1277
1280{
1281 setUpToDate();
1284 _setValidData(true);
1285}
1286
1287/*---------------------------------------------------------------------------*/
1288/*---------------------------------------------------------------------------*/
1289
1295
1296/*---------------------------------------------------------------------------*/
1297/*---------------------------------------------------------------------------*/
1298
1300read(IDataReader* reader)
1301{
1302 reader->read(this,data());
1303 notifyEndRead();
1304}
1305
1306/*---------------------------------------------------------------------------*/
1307/*---------------------------------------------------------------------------*/
1308
1310write(IDataWriter* writer)
1311{
1313 writer->write(this,data());
1314}
1315
1316/*---------------------------------------------------------------------------*/
1317/*---------------------------------------------------------------------------*/
1318
1320changeGroupIds(Int32ConstArrayView old_to_new_ids)
1321{
1322 ARCANE_UNUSED(old_to_new_ids);
1323 // pH: default implementation since this method is not yet official
1324}
1325
1326/*---------------------------------------------------------------------------*/
1327/*---------------------------------------------------------------------------*/
1328/*!
1329 * \brief Vérifie qu'il est possible d'échanger les valeurs de l'instance
1330 * avec celle de \a rhs.
1331 *
1332 * Cette méthode étant appelée par une classe dérivée, on est sur que \a rhs
1333 * est du même type C++ que l'instance et donc il n'y a pas besoin de
1334 * vérifier par exemple que les dimensions ou le type des données sont les
1335 * mêmes. Pour que l'échange soit valide, il faut que le maillage, la famille
1336 * et le groupe soit les mêmes. Pour cela, il suffit de vérifier que le
1337 * groupe est le même.
1338 */
1341{
1342 if (!m_p->m_is_used)
1343 ARCANE_FATAL("Can not swap variable values for unused variable (instance)");
1344 if (!rhs->m_p->m_is_used)
1345 ARCANE_FATAL("Can not swap variable values for unused variable (argument)");
1346 if (isPartial() || rhs->isPartial())
1347 ARCANE_FATAL("Can not swap variable values for partial variables");
1348 if (itemGroup()!=rhs->itemGroup())
1349 ARCANE_FATAL("Can not swap variable values for variables from different groups");
1350}
1351
1352/*---------------------------------------------------------------------------*/
1353/*---------------------------------------------------------------------------*/
1354
1355bool Variable::
1356_wantShrink() const
1357{
1358 return m_p->m_want_shrink;
1359}
1360
1361/*---------------------------------------------------------------------------*/
1362/*---------------------------------------------------------------------------*/
1363
1366{
1367 data()->setAllocationInfo(v);
1368 // Il est possible que le changement d'allocation modifie les données
1369 // allouées. Il faut donc synchroniser les références.
1371}
1372
1373/*---------------------------------------------------------------------------*/
1374/*---------------------------------------------------------------------------*/
1375
1377allocationInfo() const
1378{
1379 return data()->allocationInfo();
1380}
1381
1382/*---------------------------------------------------------------------------*/
1383/*---------------------------------------------------------------------------*/
1384
1385IVariableInternal* Variable::
1387{
1388 return m_p;
1389}
1390
1391/*---------------------------------------------------------------------------*/
1392/*---------------------------------------------------------------------------*/
1393
1394/*---------------------------------------------------------------------------*/
1395/*---------------------------------------------------------------------------*/
1396
1397String VariablePrivate::
1398computeComparisonHashCollective(IHashAlgorithm* hash_algo,
1399 IData* sorted_data)
1400{
1401 ARCANE_CHECK_POINTER(hash_algo);
1402 ARCANE_CHECK_POINTER(sorted_data);
1403
1404 INumericDataInternal* num_data = sorted_data->_commonInternal()->numericData();
1405 if (!num_data)
1406 return {};
1407 if (!m_item_family)
1408 return {};
1409
1410 IParallelMng* pm = m_item_family->parallelMng();
1411 Int32 my_rank = pm->commRank();
1412 Int32 master_rank = pm->masterIORank();
1413 ConstMemoryView memory_view = num_data->memoryView();
1414
1415 UniqueArray<Byte> bytes;
1416
1417 pm->gatherVariable(Arccore::asSpan<Byte>(memory_view.bytes()).smallView(), bytes, master_rank);
1418
1419 String hash_string;
1420 if (my_rank == master_rank) {
1421 HashAlgorithmValue hash_value;
1422 hash_algo->computeHash(asBytes(bytes), hash_value);
1423 hash_string = Convert::toHexaString(asBytes(hash_value.bytes()));
1424 }
1425 return hash_string;
1426}
1427
1428/*---------------------------------------------------------------------------*/
1429/*---------------------------------------------------------------------------*/
1430
1431void VariablePrivate::
1432changeAllocator(const MemoryAllocationOptions& mem_options)
1433{
1434 INumericDataInternal* dx = m_data->_commonInternal()->numericData();
1435 if (dx) {
1436 dx->changeAllocator(mem_options);
1438 }
1439}
1440
1441/*---------------------------------------------------------------------------*/
1442/*---------------------------------------------------------------------------*/
1443
1444void VariablePrivate::
1445resizeWithReserve(Int32 new_size,Int32 additional_capacity)
1446{
1447 return m_variable->_resizeWithReserve(new_size,additional_capacity);
1448}
1449
1450/*---------------------------------------------------------------------------*/
1451/*---------------------------------------------------------------------------*/
1452
1453} // End namespace Arcane
1454
1455/*---------------------------------------------------------------------------*/
1456/*---------------------------------------------------------------------------*/
1457
1458#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.
Observable qui appelle automatiquement IObservable::detachAllObservers() dans le destructeur.
Real globalTime() const
Temps courant.
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 setName(const String &name)=0
Positionne le nom de la donnée (interne)
virtual void setAllocationInfo(const DataAllocationInfo &v)=0
Positionne les informations sur l'allocation.
Interface d'un algorithme de hashage.
virtual void computeHash(Span< const std::byte > input, HashAlgorithmValue &value)
Calcule la valeur du hash pour le tableau input.
Interface d'une famille d'entités.
virtual ItemGroup findGroup(const String &name) const =0
Recherche un groupe.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
virtual Int32 maxLocalId() const =0
virtual bool hasUniqueIdMap() const =0
Indique si la famille possède une table de conversion uniqueId vers localId.
virtual IParallelMng * parallelMng() const =0
Gestionnaire de parallélisme associé
virtual String name() const =0
Nom de la famille.
virtual eItemKind itemKind() const =0
Genre des entités.
virtual IItemFamilyInternal * _internalApi()=0
API interne à Arcane.
virtual IItemFamily * itemFamily(eItemKind ik)=0
Retourne la famille d'entité de type ik.
virtual IItemFamily * findItemFamily(eItemKind ik, const String &name, bool create_if_needed=false, bool register_modifier_if_created=false)=0
Retourne la famille de nom name.
virtual MeshHandle * findMeshHandle(const String &name, bool throw_exception)=0
Recherche le maillage de nom name.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
Interface d'un observable.
virtual void notifyAllObservers()=0
Notifie tous les observateurs.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
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.
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:59
@ PSubDomainDepend
Indique que la valeur de la variable est dépendante du sous-domaine.
Definition IVariable.h:91
@ PNoExchange
Indique que la variable ne doit pas être échangée.
Definition IVariable.h:143
@ PNoReplicaSync
Indique que la variable n'a pas forcément la même valeur entre les réplicas.
Definition IVariable.h:159
@ PTemporary
Indique que la variable est temporaire.
Definition IVariable.h:126
@ PExecutionDepend
Indique que la valeur de la variable est dépendante de l'exécution.
Definition IVariable.h:106
@ PPrivate
Indique que la variable est privée.
Definition IVariable.h:114
@ PPersistant
Indique que la variable est persistante.
Definition IVariable.h:150
@ PNoRestore
Indique que la variable ne doit pas être restaurée.
Definition IVariable.h:133
@ PNoNeedSync
Indique que la variable n'est pas nécessairement synchronisée.
Definition IVariable.h:80
@ PNoDump
Indique que la variable ne doit pas être sauvegardée.
Definition IVariable.h:72
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 void resizeFromGroup()=0
Positionne le nombre d'éléments pour une variable du maillage.
virtual IData * data()=0
Données associées à la variable.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
static Int64 incrementModifiedTime()
Incrémente le compteur de modification et retourne sa valeur avant modification.
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.
virtual void compact(Int32ConstArrayView new_to_old_ids)=0
Compacte les valeurs de la variable.
virtual void copyItemsValues(Int32ConstArrayView source, Int32ConstArrayView destination)=0
Copie les valeurs des entités numéros source dans les entités numéro destination.
void detachObserver(const void *ref)
Détache un observer.
Observer des évènements sur ItemGroup sous-jacent.
Definition Variable.cc:238
void executeCompact(const Int32ConstArrayView *info)
Execute l'action associée au compactage.
Definition Variable.cc:306
bool needInfo() const
Indique si l'observer aura besoin d'information de transition.
Definition Variable.cc:322
void executeReduce(const Int32ConstArrayView *info)
Execute l'action associée à l'extension.
Definition Variable.cc:267
void executeInvalidate()
Execute l'action associée à l'invalidation.
Definition Variable.cc:315
void executeExtend(const Int32ConstArrayView *info)
Execute l'action associée à l'extension.
Definition Variable.cc:251
Groupe d'entités de maillage.
Definition ItemGroup.h:49
const String & name() const
Nom du groupe.
Definition ItemGroup.h:76
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.
Handle sur un maillage.
Definition MeshHandle.h:47
bool hasMesh() const
Indique si le maillage associé a déjà été créé (i.e: mesh() est valide)
bool isNull() const
Indique si le handle est nul (il ne référence aucun maillage existant ou non)
Definition MeshHandle.h:162
IMesh * mesh() const
Maillage associé.
Encapsulation d'un pointeur qui se détruit automatiquement.
Definition ScopedPtr.h:44
Paramètres nécessaires à la construction d'une variable.
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 & localName() const
Nom de la variable.
Integer multiTag() const
Multi-tag.
eItemKind itemKind() const
Type d'entité de maillage.
const String & itemGroupName() const
Nom du groupe d'entité à laquelle la variable est associée.
Integer dimension() const
Dimension.
eDataType dataType() const
Type des éléments.
const String & meshName() const
Nom du maillage auquel la variable est associée.
const String & fullName() const
Nom complet de la variable (associé à la famille)
void 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:112
VariableInfo m_infos
Infos caractéristiques de la variable.
Definition Variable.cc:96
IItemFamily * m_item_family
Familly d'entité (peut être nul)
Definition Variable.cc:95
Integer m_nb_reference
Première référence sur la variable.
Definition Variable.cc:104
UniqueArray< VariableDependInfo > m_depends
Liste des dépendances de cette variable.
Definition Variable.cc:105
int m_property
Propriétés de la variable.
Definition Variable.cc:97
AutoDetachObservable m_on_size_changed_observable
Observable en redimensionnement.
Definition Variable.cc:110
Real m_last_update_time
Temps physique de la dernière mise à jour.
Definition Variable.cc:102
Int64 m_modified_time
Tag de la dernière modification.
Definition Variable.cc:106
MeshHandle m_mesh_handle
Maillage (peut être nul)
Definition Variable.cc:92
std::map< String, String > m_tags
Liste des tags.
Definition Variable.cc:111
ItemGroup m_item_group
Groupe d'entité sur lequel est associé la variable.
Definition Variable.cc:94
bool m_is_used
Etat d'utilisation de la variable.
Definition Variable.cc:100
void serializeHashId(ISerializer *sbuf)
Sérialise le hashid.
Definition Variable.cc:124
ScopedPtrT< IVariableComputeFunction > m_compute_function
Fonction de calcul.
Definition Variable.cc:107
AutoDetachObservable m_read_observable
Observable en lecture.
Definition Variable.cc:109
AutoDetachObservable m_write_observable
Observable en écriture.
Definition Variable.cc:108
bool m_has_valid_data
Vrai si les données sont valide.
Definition Variable.cc:101
bool m_is_partial
Vrai si la variable est partielle.
Definition Variable.cc:98
Variable * m_variable
Variable associée.
Definition Variable.cc:114
Ref< IData > m_data
Données de la variable.
Definition Variable.cc:93
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:966
String itemGroupName() const final
Nom du groupe d'entité associée.
Definition Variable.cc:500
IMesh * mesh() const final
Maillage auquel est associé la variable.
Definition Variable.cc:789
void notifyBeginWrite() override
Notifie du début d'écriture de data().
Definition Variable.cc:1291
Integer nbReference() const override
Nombre de références sur cette variable.
Definition Variable.cc:445
void removeVariableRef(VariableRef *ref) override
Supprime une référence à cette variable.
Definition Variable.cc:383
void _checkSwapIsValid(Variable *rhs)
Vérifie qu'il est possible d'échanger les valeurs de l'instance avec celle de rhs.
Definition Variable.cc:1340
bool isUsed() const override
Etat d'utilisation de la variable.
Definition Variable.cc:683
Variable(const VariableBuildInfo &v, const VariableInfo &vi)
Créé une variable lié à la référence v.
Definition Variable.cc:332
void _setData(const Ref< IData > &data)
Positionne la donnée.
Definition Variable.cc:863
void _setValidData(bool valid_data)
Indique si les données de la variable sont valides.
Definition Variable.cc:878
VariableMetaData * createMetaData() const override
Créé une instance contenant les meta-données de la variable.
Definition Variable.cc:729
IVariableComputeFunction * computeFunction() override
Fonction utilisée pour mettre à jour la variable.
Definition Variable.cc:1216
Ref< VariableMetaData > createMetaDataRef() const override
Créé une instance contenant les meta-données de la variable.
Definition Variable.cc:738
bool isPartial() const override
Indique si la variable est partielle.
Definition Variable.cc:845
String tagValue(const String &tagname) override
Valeur du tag tagname. La chaîne est nulle si le tag n'existe pas.
Definition Variable.cc:1267
void notifyReferencePropertyChanged() override
Indique que les propriétés d'une des références à cette variable ont changé (interne)
Definition Variable.cc:607
IVariableMng * variableMng() const override
Gestionnaire de variable associé à la variable.
Definition Variable.cc:464
void removeTag(const String &tagname) override
Supprime le tag tagname.
Definition Variable.cc:1249
void addDepend(IVariable *var, eDependType dt) override
Ajoute var à la liste des dépendances.
Definition Variable.cc:1179
String name() const final
Nom de la variable.
Definition Variable.cc:473
IObservable * readObservable() override
Observable en lecture.
Definition Variable.cc:1085
void serialize(ISerializer *sbuffer, IDataOperation *operation) override
Definition Variable.cc:928
ItemGroup itemGroup() const final
Groupe du maillage associé.
Definition Variable.cc:809
IObservable * onSizeChangedObservable() override
Observable en redimensionnement.
Definition Variable.cc:1094
void notifyEndRead() override
Notifie de la modification externe de data().
Definition Variable.cc:1279
void read(IDataReader *d) override
Definition Variable.cc:1300
void syncReferences() override
Synchronise les références.
Definition Variable.cc:747
Integer checkIfSync(Integer max_print) override
Vérifie si la variable est bien synchronisée.
Definition Variable.cc:764
void setUsed(bool v) override
Positionne l'état d'utilisation de la variable.
Definition Variable.cc:616
VariableRef * firstReference() const override
Première réference (ou null) sur cette variable.
Definition Variable.cc:420
String fullName() const final
Nom complet de la variable (avec le préfixe de la famille)
Definition Variable.cc:482
eItemKind itemKind() const override
Type des entités du maillage sur lequel repose la variable.
Definition Variable.cc:818
ISubDomain * subDomain() override
Sous-domaine associé à la variable (TODO rendre obsolète fin 2023)
Definition Variable.cc:454
void update() override
Recalcule la variable si nécessaire.
Definition Variable.cc:1106
Integer dimension() const override
Dimension de la variable.
Definition Variable.cc:827
Int64 modifiedTime() override
Temps auquel la variable a été mise à jour.
Definition Variable.cc:1170
void setUpToDate() override
Indique que la variable vient d'être mise à jour.
Definition Variable.cc:1160
void addTag(const String &tagname, const String &tagvalue) override
Ajoute le tag tagname avev la valeur tagvalue.
Definition Variable.cc:1240
~Variable() override
Libère les ressources.
Definition Variable.cc:342
bool _hasValidData() const
Indique si les données de la variable sont valides.
Definition Variable.cc:887
IObservable * writeObservable() override
Observable en écriture.
Definition Variable.cc:1076
void addVariableRef(VariableRef *ref) override
Ajoute une référence à cette variable.
Definition Variable.cc:362
Integer multiTag() const override
Indique si la variable est un tableau à taille multiple.
Definition Variable.cc:836
void setComputeFunction(IVariableComputeFunction *v) override
Positionne la fonction de recalcul de la variable.
Definition Variable.cc:1207
void resize(Integer n) override
Positionne le nombre d'éléments pour une variable tableau.
Definition Variable.cc:957
IVariableInternal * _internalApi() override
API interne à Arcane.
Definition Variable.cc:1386
IItemFamily * itemFamily() const final
Famille d'entité associée.
Definition Variable.cc:854
eDataType dataType() const override
Type de la donnée gérée par la variable (Real, Integer, ...)
Definition Variable.cc:518
void write(IDataWriter *d) override
Sauve la variable.
Definition Variable.cc:1310
IDataFactoryMng * dataFactoryMng() const final
Fabrique de données associées à la variable.
Definition Variable.cc:905
void changeGroupIds(Int32ConstArrayView old_to_new_ids) override
pH : EXPERIMENTAL
Definition Variable.cc:1320
void removeDepend(IVariable *var) override
Supprime var de la liste des dépendances.
Definition Variable.cc:1197
Integer checkIfSameOnAllReplica(Integer max_print) override
Vérifie si la variable a les mêmes valeurs sur tous les réplicas.
Definition Variable.cc:774
String itemFamilyName() const final
Nom de la famille associée (nul si aucune).
Definition Variable.cc:491
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
Definition Variable.cc:1377
int property() const override
Definition Variable.cc:529
void dependInfos(Array< VariableDependInfo > &infos) override
Infos de dépendances.
Definition Variable.cc:1225
bool hasTag(const String &tagname) override
true si la variable possède le tag tagname
Definition Variable.cc:1258
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
Definition Variable.cc:1365
MeshHandle meshHandle() const final
Maillage auquel est associé la variable.
Definition Variable.cc:800
String meshName() const final
Nom du maillage associé (nul si aucun).
Definition Variable.cc:509
Classe de base des vecteurs 1D de données.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
constexpr bool empty() const noexcept
true si le tableau est vide (size()==0)
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
virtual void reserveSpan(eDataType dt, Int64 n)=0
Réserve de la mémoire pour n valeurs de dt.
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual eMode mode() const =0
Mode de fonctionnement actuel.
Options pour configurer les allocations.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:209
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
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:590
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.
StringView view() const
Retourne une vue sur la chaîne actuelle.
Definition String.cc:367
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:291
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:304
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
Vecteur 1D de données avec sémantique par valeur (style STL).
String toHexaString(ByteConstArrayView input)
Converti un tableau d'octet en sa représentation hexadécimale.
Definition Convert.cc:388
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ DIP_Legacy
Initialisation en mode historique.
Definition DataTypes.h:157
eDataInitialisationPolicy getGlobalDataInitialisationPolicy()
Récupère la politique d'initialisation des variables.
Definition DataTypes.cc:162
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é.
unsigned char Byte
Type d'un octet.
Definition UtilsTypes.h:142
eDataType
Type d'une donnée.
Definition DataTypes.h:39
@ DT_Byte
Donnée de type octet.
Definition DataTypes.h:40
const char * dataTypeName(eDataType type)
Nom du type de donnée.
Definition DataTypes.cc:70
detail::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:881