Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
VariableArray.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/* VariableArray.cc (C) 2000-2024 */
9/* */
10/* Variable tableau 1D. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/NotSupportedException.h"
15#include "arcane/utils/ArgumentException.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/TraceInfo.h"
18#include "arcane/utils/Ref.h"
19#include "arcane/utils/MemoryAccessInfo.h"
20#include "arcane/utils/MemoryAllocator.h"
21
22#include "arcane/core/VariableDiff.h"
23#include "arcane/core/VariableBuildInfo.h"
24#include "arcane/core/VariableInfo.h"
25#include "arcane/core/IApplication.h"
26#include "arcane/core/IVariableMng.h"
27#include "arcane/core/IItemFamily.h"
28#include "arcane/core/IVariableSynchronizer.h"
29#include "arcane/core/IDataReader.h"
30#include "arcane/core/ItemGroup.h"
31#include "arcane/core/IDataFactoryMng.h"
32#include "arcane/core/IParallelMng.h"
33#include "arcane/core/IMesh.h"
34
35#include "arcane/datatype/DataTracer.h"
36#include "arcane/datatype/DataTypeTraits.h"
37#include "arcane/datatype/DataStorageBuildInfo.h"
38
39#include "arcane/VariableArray.h"
40#include "arcane/RawCopy.h"
41
42#include "arcane/core/internal/IDataInternal.h"
43#include "arcane/core/internal/IVariableMngInternal.h"
44
45/*---------------------------------------------------------------------------*/
46/*---------------------------------------------------------------------------*/
47
48namespace Arcane
49{
50
51/*---------------------------------------------------------------------------*/
52/*---------------------------------------------------------------------------*/
53
54template<class DataType>
56: public VariableDiff<DataType>
57{
58 typedef VariableDataTypeTraitsT<DataType> VarDataTypeTraits;
60
61 public:
62
63 Integer
65 int max_print,bool compare_ghost)
66 {
67 if (var->itemKind()==IK_Unknown)
68 return _checkAsArray(var,ref,current,max_print);
69
70 ItemGroup group = var->itemGroup();
71 if (group.null())
72 return 0;
73 IMesh* mesh = group.mesh();
74 if (!mesh)
75 return 0;
76 ITraceMng* msg = mesh->traceMng();
77 IParallelMng* pm = mesh->parallelMng();
78
79 GroupIndexTable * group_index_table = (var->isPartial())?group.localIdToIndex().get():0;
80
81 int nb_diff = 0;
82 bool compare_failed = false;
83 Integer ref_size = ref.size();
84 ENUMERATE_ITEM(i,group){
85 Item item = *i;
86 if (!item.isOwn() && !compare_ghost)
87 continue;
88 Integer index = item.localId();
89 if (group_index_table){
90 index = (*group_index_table)[index];
91 if (index<0)
92 continue;
93 }
94 DataType diff = DataType();
95 if (index>=ref_size){
96 ++nb_diff;
97 compare_failed = true;
98 }
99 else{
100 DataType dref = ref[index];
101 DataType dcurrent = current[index];
102 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,true)){
103 this->m_diffs_info.add(DiffInfo(dcurrent,dref,diff,item,NULL_ITEM_ID));
104 ++nb_diff;
105 }
106 }
107 }
108 if (compare_failed){
109 Int32 sid = pm->commRank();
110 const String& var_name = var->name();
111 msg->pinfo() << "Processor " << sid << " : "
112 << "comparison impossible because the number of the elements is different "
113 << " for the variable " << var_name << " ref_size=" << ref_size;
114
115 }
116 if (nb_diff!=0)
117 this->_sortAndDump(var,pm,max_print);
118
119 return nb_diff;
120 }
121
122 Integer checkReplica(IParallelMng* pm,IVariable* var,ConstArrayView<DataType> var_value,
123 Integer max_print)
124 {
125 // Appelle la bonne spécialisation pour être sur que le type template possède
126 // la réduction.
127 using ReduceType = typename VariableDataTypeTraitsT<DataType>::HasReduceMinMax;
128 if constexpr(std::is_same<TrueType,ReduceType>::value)
129 return _checkReplica2(pm,var,var_value,max_print);
130
131 ARCANE_UNUSED(pm);
132 ARCANE_UNUSED(var);
133 ARCANE_UNUSED(var_value);
134 ARCANE_UNUSED(max_print);
135 throw NotSupportedException(A_FUNCINFO);
136 }
137
138 private:
139
140 Integer _checkAsArray(IVariable* var,ConstArrayView<DataType> ref,
141 ConstArrayView<DataType> current,int max_print)
142 {
143 IParallelMng* pm = var->variableMng()->parallelMng();
144 ITraceMng* msg = pm->traceMng();
145
146 int nb_diff = 0;
147 bool compare_failed = false;
148 Integer ref_size = ref.size();
149 Integer current_size = current.size();
150 for( Integer index=0; index<current_size; ++index ){
151 DataType diff = DataType();
152 if (index>=ref_size){
153 ++nb_diff;
154 compare_failed = true;
155 }
156 else{
157 DataType dref = ref[index];
158 DataType dcurrent = current[index];
159 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,true)){
160 this->m_diffs_info.add(DiffInfo(dcurrent,dref,diff,index,NULL_ITEM_ID));
161 ++nb_diff;
162 }
163 }
164 }
165 if (compare_failed){
166 Int32 sid = pm->commRank();
167 const String& var_name = var->name();
168 msg->pinfo() << "Processor " << sid << " : "
169 << " comparaison impossible car nombre d'éléments différents"
170 << " pour la variable " << var_name << " ref_size=" << ref_size;
171
172 }
173 if (nb_diff!=0)
174 this->_sortAndDump(var,pm,max_print);
175
176 return nb_diff;
177 }
178
179 Integer _checkReplica2(IParallelMng* pm,IVariable* var,ConstArrayView<DataType> var_values,
180 Integer max_print)
181 {
182 ITraceMng* msg = pm->traceMng();
183 Integer size = var_values.size();
184 // Vérifie que tout les réplica ont le même nombre d'éléments pour la variable.
185 Integer max_size = pm->reduce(Parallel::ReduceMax,size);
186 Integer min_size = pm->reduce(Parallel::ReduceMin,size);
187 msg->info(5) << "CheckReplica2 rep_size=" << pm->commSize() << " rank=" << pm->commRank();
188 if (max_size!=min_size){
189 const String& var_name = var->name();
190 msg->info() << "Can not compare values on replica for variable '" << var_name << "'"
191 << " because the number of elements is not the same on all the replica "
192 << " min=" << min_size << " max="<< max_size;
193 return max_size;
194 }
195 Integer nb_diff = 0;
196 UniqueArray<DataType> min_values(var_values);
197 UniqueArray<DataType> max_values(var_values);
198 pm->reduce(Parallel::ReduceMax,max_values);
199 pm->reduce(Parallel::ReduceMin,min_values);
200
201 for( Integer index=0; index<size; ++index ){
202 DataType diff = DataType();
203 DataType min_val = min_values[index];
204 DataType max_val = max_values[index];
205 if (VarDataTypeTraits::verifDifferent(min_val,max_val,diff,true)){
206 this->m_diffs_info.add(DiffInfo(min_val,max_val,diff,index,NULL_ITEM_ID));
207 ++nb_diff;
208 }
209 }
210 if (nb_diff!=0)
211 this->_sortAndDump(var,pm,max_print);
212
213 return nb_diff;
214 }
215};
216
217/*---------------------------------------------------------------------------*/
218/*---------------------------------------------------------------------------*/
219
220/*---------------------------------------------------------------------------*/
221/*---------------------------------------------------------------------------*/
222
223template<typename T> VariableArrayT<T>::
224VariableArrayT(const VariableBuildInfo& vb,const VariableInfo& info)
225: Variable(vb,info)
226, m_value(nullptr)
227{
228 IDataFactoryMng* df = vb.dataFactoryMng();
229 DataStorageBuildInfo storage_build_info(vb.traceMng());
230 String storage_full_type = info.storageTypeInfo().fullName();
231 Ref<IData> data = df->createSimpleDataRef(storage_full_type,storage_build_info);
232 m_value = dynamic_cast<ValueDataType*>(data.get());
233 ARCANE_CHECK_POINTER(m_value);
234 _setData(makeRef(m_value));
235}
236
237/*---------------------------------------------------------------------------*/
238/*---------------------------------------------------------------------------*/
239
240template<typename T> VariableArrayT<T>::
242{
243}
244
245/*---------------------------------------------------------------------------*/
246/*---------------------------------------------------------------------------*/
247
248template<typename T> VariableArrayT<T>* VariableArrayT<T>::
249getReference(const VariableBuildInfo& vb,const VariableInfo& vi)
250{
251 if (vb.isNull())
252 return nullptr;
253 ThatClass* true_ptr = nullptr;
254 IVariableMng* vm = vb.variableMng();
255 IVariable* var = vm->checkVariable(vi);
256 if (var)
257 true_ptr = dynamic_cast<ThatClass*>(var);
258 else{
259 true_ptr = new ThatClass(vb,vi);
260 vm->_internalApi()->addVariable(true_ptr);
261 }
262 ARCANE_CHECK_PTR(true_ptr);
263 return true_ptr;
264}
265
266/*---------------------------------------------------------------------------*/
267/*---------------------------------------------------------------------------*/
268
269template<typename T> VariableArrayT<T>* VariableArrayT<T>::
270getReference(IVariable* var)
271{
272 if (!var)
273 throw ArgumentException(A_FUNCINFO,"null variable");
274 auto* true_ptr = dynamic_cast<ThatClass*>(var);
275 if (!true_ptr)
276 ARCANE_FATAL("Can not build a reference from variable {0}",var->name());
277 return true_ptr;
278}
279
280/*---------------------------------------------------------------------------*/
281/*---------------------------------------------------------------------------*/
282
283template<typename T> void VariableArrayT<T>::
284print(std::ostream& o) const
285{
286 ConstArrayView<T> x(m_value->view());
287 Integer size = x.size();
288 o << "(dimension=" << size << ") ";
289 if (size<=150){
290 for( auto& i : x ){
291 o << i << '\n';
292 }
293 }
294}
295
296/*---------------------------------------------------------------------------*/
297/*---------------------------------------------------------------------------*/
298
299template<typename T> void VariableArrayT<T>::
301{
302 if (itemKind()==IK_Unknown)
303 ARCANE_THROW(NotSupportedException,"variable '{0}' is not a mesh variable",fullName());
304 IItemFamily* family = itemGroup().itemFamily();
305 if (!family)
306 ARCANE_FATAL("variable '{0}' without family",fullName());
307 if(isPartial())
308 itemGroup().synchronizer()->synchronize(this);
309 else
310 family->allItemsSynchronizer()->synchronize(this);
311}
312
313/*---------------------------------------------------------------------------*/
314/*---------------------------------------------------------------------------*/
315
316template<typename T> void VariableArrayT<T>::
318{
319 if (itemKind()==IK_Unknown)
320 ARCANE_THROW(NotSupportedException,"variable '{0}' is not a mesh variable",fullName());
321 IItemFamily* family = itemGroup().itemFamily();
322 if (!family)
323 ARCANE_FATAL("variable '{0}' without family",fullName());
324 if(isPartial())
325 itemGroup().synchronizer()->synchronize(this, local_ids);
326 else
327 family->allItemsSynchronizer()->synchronize(this, local_ids);
328}
329
330/*---------------------------------------------------------------------------*/
331/*---------------------------------------------------------------------------*/
332
333template<typename T> Real VariableArrayT<T>::
334allocatedMemory() const
335{
336 Real v1 = (Real)(sizeof(T));
337 Real v2 = (Real)(m_value->view().size());
338 return v1 * v2;
339}
340
341/*---------------------------------------------------------------------------*/
342/*---------------------------------------------------------------------------*/
343
344template<typename T> Integer VariableArrayT<T>::
345checkIfSync(int max_print)
346{
347 IItemFamily* family = itemGroup().itemFamily();
348 if (family){
349 ValueType& data_values = m_value->_internal()->_internalDeprecatedValue();
350 UniqueArray<T> ref_array(constValueView());
351 this->synchronize(); // fonctionne pour toutes les variables
353 ConstArrayView<T> from_array(constValueView());
354 Integer nerror = csa.check(this,ref_array,from_array,max_print,true);
355 data_values.copy(ref_array);
356 return nerror;
357 }
358 return 0;
359}
360
361/*---------------------------------------------------------------------------*/
362/*---------------------------------------------------------------------------*/
363
364template<typename T> Integer VariableArrayT<T>::
365checkIfSame(IDataReader* reader,Integer max_print,bool compare_ghost)
366{
367 if (itemKind()==IK_Particle)
368 return 0;
369 ArrayView<T> from_array(valueView());
370
371 Ref< IArrayDataT<T> > ref_data(m_value->cloneTrueEmptyRef());
372 reader->read(this,ref_data.get());
373
374 ArrayVariableDiff<T> csa;
375 return csa.check(this,ref_data->view(),from_array,max_print,compare_ghost);
376}
377
378/*---------------------------------------------------------------------------*/
379/*---------------------------------------------------------------------------*/
380// Utilise une fonction Helper afin de spécialiser l'appel dans le
381// cas du type 'Byte' car ArrayVariableDiff::checkReplica() utilise
382// une réduction Min/Max et cela n'existe pas en MPI pour le type Byte.
383namespace
384{
385 template<typename T> Integer
386 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
387 ConstArrayView<T> values,Integer max_print)
388 {
389 ArrayVariableDiff<T> csa;
390 return csa.checkReplica(pm,var,values,max_print);
391 }
392
393 // Spécialisation pour le type 'Byte' qui ne supporte pas les réductions.
394 Integer
395 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
396 ConstArrayView<Byte> values,Integer max_print)
397 {
398 Integer size = values.size();
399 UniqueArray<Integer> int_values(size);
400 for( Integer i=0; i<size; ++i )
401 int_values[i] = values[i];
402 ArrayVariableDiff<Integer> csa;
403 return csa.checkReplica(pm,var,int_values,max_print);
404 }
405}
406
407template<typename T> Integer VariableArrayT<T>::
408_checkIfSameOnAllReplica(IParallelMng* replica_pm,Integer max_print)
409{
410 return _checkIfSameOnAllReplicaHelper(replica_pm,this,constValueView(),max_print);
411}
412
413/*---------------------------------------------------------------------------*/
414/*---------------------------------------------------------------------------*/
415/*!
416 * \brief Initialise la variable.
417 *
418 Initialise la variable avec la valeur \a value sur le groupe \a group.
419
420 La valeur étant passée sous forme d'une chaine de caractère, vérifie que
421 la conversion en le type de la variable est possible. De même vérifie
422 que le groupe \a group est du type #GroupType. Si l'un de ces deux points
423 n'est pas respecté, l'initialisation échoue.
424
425 \retval true en cas d'erreur,
426 \retval false en cas de succés.
427*/
428template<typename T> bool VariableArrayT<T>::
429initialize(const ItemGroup& group,const String& value)
430{
431 //TODO: peut-être vérifier que la variable est utilisée ?
432
433 // Tente de convertir value en une valeur du type de la variable.
434 T v = T();
435 bool is_bad = VariableDataTypeTraitsT<T>::getValue(v,value);
436
437 if (is_bad){
438 error() << String::format("Can not convert the string '{0}' to type '{1}'",
439 value,dataType());
440 return true;
441 }
442
443 bool is_ok = false;
444
445 ArrayView<T> values(m_value->view());
446 if (group.itemFamily()==itemFamily()){
447 is_ok = true;
448 // TRES IMPORTANT
449 //TODO doit utiliser une indirection et une hierarchie entre groupe
450 // Enfin, affecte la valeur \a v à toutes les entités du groupe.
451 //ValueType& var_value = this->value();
452 ENUMERATE_ITEM(i,group){
453 Item elem = *i;
454 values[elem.localId()] = v;
455 }
456 }
457
458 if (is_ok)
459 return false;
460
461 eItemKind group_kind = group.itemKind();
462
463 error() << "The type of elements (" << itemKindName(group_kind)
464 << ") of the group `" << group.name() << "' does not match \n"
465 << "the type of the variable (" << itemKindName(this->itemKind()) << ").";
466 return true;
467}
468
469/*---------------------------------------------------------------------------*/
470/*---------------------------------------------------------------------------*/
471
472template<typename T> void VariableArrayT<T>::
474{
475 ARCANE_ASSERT(source.size()==destination.size(),
476 ("Impossible to copy: source and destination of different sizes !"));
477 ArrayView<T> value = m_value->view();
478 const Integer size = source.size();
479 for(Integer i=0; i<size; ++i )
480 value[destination[i]] = value[source[i]];
481 syncReferences();
482}
483
484/*---------------------------------------------------------------------------*/
485/*---------------------------------------------------------------------------*/
486
487template<typename T> void VariableArrayT<T>::
489 Int32ConstArrayView second_source,
490 Int32ConstArrayView destination)
491{
492 ARCANE_ASSERT((first_source.size()==destination.size()) && (second_source.size()==destination.size()),
493 ("Impossible to copy: source and destination of different sizes !"));
494 ArrayView<T> value = m_value->view();
495 const Integer size = first_source.size();
496 for(Integer i=0; i<size; ++i ) {
497 value[destination[i]] = (T)((value[first_source[i]]+value[second_source[i]])/2);
498 }
499 syncReferences();
500}
501
502/*---------------------------------------------------------------------------*/
503/*---------------------------------------------------------------------------*/
504
507 Int32ConstArrayView second_source,
508 Int32ConstArrayView destination);
509
510/*---------------------------------------------------------------------------*/
511/*---------------------------------------------------------------------------*/
512
513template<typename T> void VariableArrayT<T>::
514compact(Int32ConstArrayView new_to_old_ids)
515{
516 if (isPartial()) {
517 debug(Trace::High) << "Skip compact for partial variable " << name();
518 return;
519 }
520
521 UniqueArray<T> old_value(constValueView());
522 Integer new_size = new_to_old_ids.size();
523 m_value->resize(new_size);
524 ArrayView<T> current_value = m_value->view();
525 if (arcaneIsCheck()){
526 for( Integer i=0; i<new_size; ++i )
527 current_value.setAt(i,old_value.at(new_to_old_ids[i]));
528 }
529 else{
530 for( Integer i=0; i<new_size; ++i )
531 RawCopy<T>::copy(current_value[i], old_value[ new_to_old_ids[i] ]); // current_value[i] = old_value[ new_to_old_ids[i] ];
532 }
533 syncReferences();
534}
535
536/*---------------------------------------------------------------------------*/
537/*---------------------------------------------------------------------------*/
538
539template<typename T> void VariableArrayT<T>::
541{
542 setIsSynchronized(itemGroup());
543}
544
545/*---------------------------------------------------------------------------*/
546/*---------------------------------------------------------------------------*/
547
548template<typename T> void VariableArrayT<T>::
549setIsSynchronized(const ItemGroup& group)
550{
551 ARCANE_UNUSED(group);
552}
553
554/*---------------------------------------------------------------------------*/
555/*---------------------------------------------------------------------------*/
556
557template<typename T> void VariableArrayT<T>::
558_internalResize(Integer new_size,Integer nb_additional_element)
559{
560 auto* value_internal = m_value->_internal();
561
562 if (nb_additional_element!=0){
563 Integer capacity = value_internal->capacity();
564 if (new_size>capacity)
565 value_internal->reserve(new_size+nb_additional_element);
566 }
568 // Si la nouvelle taille est supérieure à l'ancienne,
569 // initialise les nouveaux éléments suivant
570 // la politique voulue
571 Integer current_size = m_value->view().size();
572 if (!isUsed()){
573 // Si la variable n'est plus utilisée, libérée la mémoire
574 // associée.
575 value_internal->dispose();
576 }
577 value_internal->resize(new_size);
578 if (new_size>current_size){
579 if (init_policy==DIP_InitWithDefault){
580 ArrayView<T> values = this->valueView();
581 for(Integer i=current_size; i<new_size; ++i)
582 values[i] = T();
583 }
584 else{
585 bool use_nan = (init_policy==DIP_InitWithNan);
586 bool use_nan2 = (init_policy==DIP_InitInitialWithNanResizeWithDefault) && !_hasValidData();
587 if (use_nan || use_nan2){
588 ArrayView<T> view = this->valueView();
589 DataTypeTraitsT<T>::fillNan(view.subView(current_size,new_size-current_size));
590 }
591 }
592 }
593
594 // Compacte la mémoire si demandé
595 if (_wantShrink()){
596 if (m_value->view().size() < value_internal->capacity()){
597 value_internal->shrink();
598 }
599 }
600
601 // Controle si toutes les modifs après le dispose n'ont pas altéré l'état de l'allocation
602 // Dans le cas d'une variable non utilisée, la capacité max autorisée est
603 // égale à celle d'un vecteur Simd de la plateforme.
604 // (cela ne peut pas être 0 car la classe Array doit allouer au moins un
605 // élément si on utilise un allocateur spécifique ce qui est le cas
606 // pour les variables.
607 Int64 capacity = value_internal->capacity();
608 if ( !((isUsed() || capacity<=AlignedMemoryAllocator::simdAlignment())) )
609 ARCANE_FATAL("Wrong unused data size {0}",capacity);
610}
611
612/*---------------------------------------------------------------------------*/
613/*---------------------------------------------------------------------------*/
614
615template<typename DataType> void VariableArrayT<DataType>::
616resizeWithReserve(Integer n,Integer nb_additional)
617{
618 _resizeWithReserve(n,nb_additional);
619}
620
621/*---------------------------------------------------------------------------*/
622/*---------------------------------------------------------------------------*/
623
624template<typename DataType> void VariableArrayT<DataType>::
626{
627 m_value->_internal()->shrink();
628 syncReferences();
629}
630
631/*---------------------------------------------------------------------------*/
632/*---------------------------------------------------------------------------*/
633
634template<typename DataType> Integer VariableArrayT<DataType>::
635capacity()
636{
637 return m_value->_internal()->capacity();
638}
639
640/*---------------------------------------------------------------------------*/
641/*---------------------------------------------------------------------------*/
642
643template<typename DataType> void VariableArrayT<DataType>::
644fill(const DataType& value)
645{
646 m_value->view().fill(value);
647}
648
649/*---------------------------------------------------------------------------*/
650/*---------------------------------------------------------------------------*/
651
652template<typename DataType> void VariableArrayT<DataType>::
653fill(const DataType& value,const ItemGroup& group)
654{
655 ARCANE_UNUSED(group);
656 this->fill(value);
657}
658
659/*---------------------------------------------------------------------------*/
660/*---------------------------------------------------------------------------*/
661
662template<typename DataType> void
663VariableArrayT<DataType>::
664swapValues(ThatClass& rhs)
665{
666 _checkSwapIsValid(&rhs);
667 // TODO: regarder s'il faut que les deux variables aient le même nombre
668 // d'éléments mais a priori cela ne semble pas indispensable.
669 m_value->swapValues(rhs.m_value);
670 // Il faut mettre à jour les références pour cette variable et \a rhs.
671 syncReferences();
672 rhs.syncReferences();
673}
674
675/*---------------------------------------------------------------------------*/
676/*---------------------------------------------------------------------------*/
677
678// SDP: Specialisation
681 Int32ConstArrayView second_source,
682 Int32ConstArrayView destination)
683{
684 Integer dsize = destination.size();
685 bool is_ok = (first_source.size()==dsize) && (second_source.size()==dsize);
686 if (!is_ok)
687 ARCANE_FATAL("Unable to copy: source and destination of different sizes !");
688
689 ArrayView<String> value = m_value->view();
690 const Integer size = first_source.size();
691 for(Integer i=0; i<size; ++i )
692 value[destination[i]] = value[first_source[i]];
693 syncReferences();
694}
695
696/*---------------------------------------------------------------------------*/
697/*---------------------------------------------------------------------------*/
698
699template<typename DataType> auto VariableArrayT<DataType>::
700value() -> ValueType&
701{
702 return m_value->_internal()->_internalDeprecatedValue();
703}
704
705/*---------------------------------------------------------------------------*/
706/*---------------------------------------------------------------------------*/
707
708template class VariableArrayT<Byte>;
709template class VariableArrayT<Real>;
710template class VariableArrayT<Int16>;
711template class VariableArrayT<Int32>;
712template class VariableArrayT<Int64>;
713template class VariableArrayT<Real2>;
714template class VariableArrayT<Real2x2>;
715template class VariableArrayT<Real3>;
716template class VariableArrayT<Real3x3>;
717template class VariableArrayT<String>;
718
719/*---------------------------------------------------------------------------*/
720/*---------------------------------------------------------------------------*/
721
722} // End namespace Arcane
723
724/*---------------------------------------------------------------------------*/
725/*---------------------------------------------------------------------------*/
#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_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
Informations pour construire une instance de 'IData'.
Interface d'une famille d'entités.
virtual IVariableSynchronizer * allItemsSynchronizer()=0
Synchroniseur sur toutes les entités de la famille.
virtual ITraceMng * traceMng()=0
Gestionnaire de message associé
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
virtual IParallelMng * parallelMng() const =0
Gestionnaire de parallélisme associé
virtual IVariable * checkVariable(const VariableInfo &infos)=0
Vérifie une variable.
virtual void synchronize(IVariable *var)=0
Synchronise la variable var en mode bloquant.
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 ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual String name() const =0
Nom de la variable.
virtual IVariableMng * variableMng() const =0
Gestionnaire de variable associé à la variable.
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
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:123
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
Definition ItemGroup.h:109
bool null() const
true is le groupe est le groupe nul
Definition ItemGroup.h:70
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:126
Classe de base d'un élément de maillage.
Definition Item.h:83
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:210
bool isOwn() const
true si l'entité est appartient au sous-domaine
Definition Item.h:244
VariableArrayT(const VariableBuildInfo &v, const VariableInfo &vi)
Construit une variable basée sur la référence v.
void copyItemsMeanValues(Int32ConstArrayView first_source, Int32ConstArrayView second_source, Int32ConstArrayView destination) override
Copie les moyennes des valeurs des entités numéros first_source et second_source dans les entités num...
void shrinkMemory() override
Libère l'éventuelle mémoire supplémentaire allouée pour les données.
void compact(Int32ConstArrayView old_to_new_ids) override
Compacte les valeurs de la variable.
bool initialize(const ItemGroup &group, const String &value) override
Initialise la variable.
void copyItemsValues(Int32ConstArrayView source, Int32ConstArrayView destination) override
Copie les valeurs des entités numéros source dans les entités numéro destination.
IData * data() override
Données associées à la variable.
void print(std::ostream &o) const override
Imprime les valeurs de la variable sur le flot o.
void setIsSynchronized() override
Indique que la variable est synchronisée.
Real allocatedMemory() const override
Taille mémoire (en Koctet) utilisée par la variable.
void synchronize() override
Synchronise la variable.
Paramètres nécessaires à la construction d'une variable.
Infos caractérisant une variable.
void _setData(const Ref< IData > &data)
Positionne la donnée.
Definition Variable.cc:863
IVariableMng * variableMng() const override
Gestionnaire de variable associé à la variable.
Definition Variable.cc:464
static constexpr Integer simdAlignment()
Alignement pour les structures utilisant la vectorisation.
Vue modifiable d'un tableau d'un type T.
ConstReferenceType at(Int64 i) const
Elément d'indice i. Vérifie toujours les débordements.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface du gestionnaire de traces.
virtual TraceMessage pinfo()=0
Flot pour un message d'information parallèle.
virtual TraceMessage info()=0
Flot pour un message d'information.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:151
eDataInitialisationPolicy
Type de politique d'initialisation possible pour une donnée.
Definition DataTypes.h:127
@ DIP_InitInitialWithNanResizeWithDefault
Initialisation avec des NaN pour à la création et le constructeur par défaut ensuite.
Definition DataTypes.h:166
@ DIP_InitWithNan
Initialisation avec des NaN (Not a Number)
Definition DataTypes.h:144
@ DIP_InitWithDefault
Initialisation avec le constructeur par défaut.
Definition DataTypes.h:136
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é
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
Int32 Integer
Type représentant un entier.