Arcane  v3.15.0.0
Documentation développeur
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/core/datatype/DataTracer.h"
36#include "arcane/core/datatype/DataTypeTraits.h"
37#include "arcane/core/datatype/DataStorageBuildInfo.h"
38
39#include "arcane/core/VariableArray.h"
40#include "arcane/core/RawCopy.h"
41
42#include "arcane/core/internal/IDataInternal.h"
43#include "arcane/core/internal/IVariableMngInternal.h"
44#include "arcane/core/internal/IVariableInternal.h"
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
49namespace Arcane
50{
51
52/*---------------------------------------------------------------------------*/
53/*---------------------------------------------------------------------------*/
54
55template<class DataType>
57: public VariableDiff<DataType>
58{
61
62 public:
63
64 Integer
66 int max_print,bool compare_ghost)
67 {
68 if (var->itemKind()==IK_Unknown)
69 return _checkAsArray(var,ref,current,max_print);
70
71 ItemGroup group = var->itemGroup();
72 if (group.null())
73 return 0;
74 IMesh* mesh = group.mesh();
75 if (!mesh)
76 return 0;
77 ITraceMng* msg = mesh->traceMng();
78 IParallelMng* pm = mesh->parallelMng();
79
80 GroupIndexTable * group_index_table = (var->isPartial())?group.localIdToIndex().get():0;
81
82 int nb_diff = 0;
83 bool compare_failed = false;
84 Integer ref_size = ref.size();
85 ENUMERATE_ITEM(i,group){
86 Item item = *i;
87 if (!item.isOwn() && !compare_ghost)
88 continue;
89 Integer index = item.localId();
91 index = (*group_index_table)[index];
92 if (index<0)
93 continue;
94 }
95 DataType diff = DataType();
96 if (index>=ref_size){
97 ++nb_diff;
98 compare_failed = true;
99 }
100 else{
101 DataType dref = ref[index];
102 DataType dcurrent = current[index];
103 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,true)){
104 this->m_diffs_info.add(DiffInfo(dcurrent,dref,diff,item,NULL_ITEM_ID));
105 ++nb_diff;
106 }
107 }
108 }
109 if (compare_failed){
110 Int32 sid = pm->commRank();
111 const String& var_name = var->name();
112 msg->pinfo() << "Processor " << sid << " : "
113 << "comparison impossible because the number of the elements is different "
114 << " for the variable " << var_name << " ref_size=" << ref_size;
115
116 }
117 if (nb_diff!=0)
118 this->_sortAndDump(var,pm,max_print);
119
120 return nb_diff;
121 }
122
124 Integer max_print)
125 {
126 // Appelle la bonne spécialisation pour être sur que le type template possède
127 // la réduction.
129 if constexpr(std::is_same<TrueType,ReduceType>::value)
130 return _checkReplica2(pm,var,var_value,max_print);
131
132 ARCANE_UNUSED(pm);
133 ARCANE_UNUSED(var);
134 ARCANE_UNUSED(var_value);
135 ARCANE_UNUSED(max_print);
136 throw NotSupportedException(A_FUNCINFO);
137 }
138
139 private:
140
141 Integer _checkAsArray(IVariable* var,ConstArrayView<DataType> ref,
143 {
144 IParallelMng* pm = var->variableMng()->parallelMng();
145 ITraceMng* msg = pm->traceMng();
146
147 int nb_diff = 0;
148 bool compare_failed = false;
149 Integer ref_size = ref.size();
150 Integer current_size = current.size();
151 for( Integer index=0; index<current_size; ++index ){
152 DataType diff = DataType();
153 if (index>=ref_size){
154 ++nb_diff;
155 compare_failed = true;
156 }
157 else{
158 DataType dref = ref[index];
159 DataType dcurrent = current[index];
160 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,true)){
161 this->m_diffs_info.add(DiffInfo(dcurrent,dref,diff,index,NULL_ITEM_ID));
162 ++nb_diff;
163 }
164 }
165 }
166 if (compare_failed){
167 Int32 sid = pm->commRank();
168 const String& var_name = var->name();
169 msg->pinfo() << "Processor " << sid << " : "
170 << " comparaison impossible car nombre d'éléments différents"
171 << " pour la variable " << var_name << " ref_size=" << ref_size;
172
173 }
174 if (nb_diff!=0)
175 this->_sortAndDump(var,pm,max_print);
176
177 return nb_diff;
178 }
179
181 Integer max_print)
182 {
183 ITraceMng* msg = pm->traceMng();
184 Integer size = var_values.size();
185 // Vérifie que tout les réplica ont le même nombre d'éléments pour la variable.
186 Integer max_size = pm->reduce(Parallel::ReduceMax,size);
187 Integer min_size = pm->reduce(Parallel::ReduceMin,size);
188 msg->info(5) << "CheckReplica2 rep_size=" << pm->commSize() << " rank=" << pm->commRank();
189 if (max_size!=min_size){
190 const String& var_name = var->name();
191 msg->info() << "Can not compare values on replica for variable '" << var_name << "'"
192 << " because the number of elements is not the same on all the replica "
193 << " min=" << min_size << " max="<< max_size;
194 return max_size;
195 }
196 Integer nb_diff = 0;
199 pm->reduce(Parallel::ReduceMax,max_values);
200 pm->reduce(Parallel::ReduceMin,min_values);
201
202 for( Integer index=0; index<size; ++index ){
203 DataType diff = DataType();
204 DataType min_val = min_values[index];
205 DataType max_val = max_values[index];
206 if (VarDataTypeTraits::verifDifferent(min_val,max_val,diff,true)){
207 this->m_diffs_info.add(DiffInfo(min_val,max_val,diff,index,NULL_ITEM_ID));
208 ++nb_diff;
209 }
210 }
211 if (nb_diff!=0)
212 this->_sortAndDump(var,pm,max_print);
213
214 return nb_diff;
215 }
216};
217
218/*---------------------------------------------------------------------------*/
219/*---------------------------------------------------------------------------*/
220
221/*---------------------------------------------------------------------------*/
222/*---------------------------------------------------------------------------*/
223
224template<typename T> VariableArrayT<T>::
226: Variable(vb,info)
227, m_value(nullptr)
228{
229 IDataFactoryMng* df = vb.dataFactoryMng();
231 String storage_full_type = info.storageTypeInfo().fullName();
232 Ref<IData> data = df->createSimpleDataRef(storage_full_type,storage_build_info);
233 m_value = dynamic_cast<ValueDataType*>(data.get());
234 ARCANE_CHECK_POINTER(m_value);
235 _setData(makeRef(m_value));
236}
237
238/*---------------------------------------------------------------------------*/
239/*---------------------------------------------------------------------------*/
240
241template<typename T> VariableArrayT<T>::
243{
244}
245
246/*---------------------------------------------------------------------------*/
247/*---------------------------------------------------------------------------*/
248
249template<typename T> VariableArrayT<T>* VariableArrayT<T>::
250getReference(const VariableBuildInfo& vb,const VariableInfo& vi)
251{
252 if (vb.isNull())
253 return nullptr;
254 ThatClass* true_ptr = nullptr;
255 IVariableMng* vm = vb.variableMng();
256 IVariable* var = vm->checkVariable(vi);
257 if (var)
258 true_ptr = dynamic_cast<ThatClass*>(var);
259 else{
260 true_ptr = new ThatClass(vb,vi);
261 vm->_internalApi()->addVariable(true_ptr);
262 }
263 ARCANE_CHECK_PTR(true_ptr);
264 return true_ptr;
265}
266
267/*---------------------------------------------------------------------------*/
268/*---------------------------------------------------------------------------*/
269
270template<typename T> VariableArrayT<T>* VariableArrayT<T>::
271getReference(IVariable* var)
272{
273 if (!var)
274 throw ArgumentException(A_FUNCINFO,"null variable");
275 auto* true_ptr = dynamic_cast<ThatClass*>(var);
276 if (!true_ptr)
277 ARCANE_FATAL("Can not build a reference from variable {0}",var->name());
278 return true_ptr;
279}
280
281/*---------------------------------------------------------------------------*/
282/*---------------------------------------------------------------------------*/
283
284template<typename T> void VariableArrayT<T>::
285print(std::ostream& o) const
286{
287 ConstArrayView<T> x(m_value->view());
288 Integer size = x.size();
289 o << "(dimension=" << size << ") ";
290 if (size<=150){
291 for( auto& i : x ){
292 o << i << '\n';
293 }
294 }
295}
296
297/*---------------------------------------------------------------------------*/
298/*---------------------------------------------------------------------------*/
299
300template<typename T> void VariableArrayT<T>::
302{
303 if (itemKind()==IK_Unknown)
304 ARCANE_THROW(NotSupportedException,"variable '{0}' is not a mesh variable",fullName());
305 IItemFamily* family = itemGroup().itemFamily();
306 if (!family)
307 ARCANE_FATAL("variable '{0}' without family",fullName());
308 if(isPartial())
309 itemGroup().synchronizer()->synchronize(this);
310 else
311 family->allItemsSynchronizer()->synchronize(this);
312}
313
314/*---------------------------------------------------------------------------*/
315/*---------------------------------------------------------------------------*/
316
317template<typename T> void VariableArrayT<T>::
319{
320 if (itemKind()==IK_Unknown)
321 ARCANE_THROW(NotSupportedException,"variable '{0}' is not a mesh variable",fullName());
322 IItemFamily* family = itemGroup().itemFamily();
323 if (!family)
324 ARCANE_FATAL("variable '{0}' without family",fullName());
325 if(isPartial())
326 itemGroup().synchronizer()->synchronize(this, local_ids);
327 else
328 family->allItemsSynchronizer()->synchronize(this, local_ids);
329}
330
331/*---------------------------------------------------------------------------*/
332/*---------------------------------------------------------------------------*/
333
334template<typename T> Real VariableArrayT<T>::
335allocatedMemory() const
336{
337 Real v1 = (Real)(sizeof(T));
338 Real v2 = (Real)(m_value->view().size());
339 return v1 * v2;
340}
341
342/*---------------------------------------------------------------------------*/
343/*---------------------------------------------------------------------------*/
344
345template<typename T> Integer VariableArrayT<T>::
347{
348 IItemFamily* family = itemGroup().itemFamily();
349 if (family){
350 ValueType& data_values = m_value->_internal()->_internalDeprecatedValue();
351 UniqueArray<T> ref_array(constValueView());
352 this->synchronize(); // fonctionne pour toutes les variables
354 ConstArrayView<T> from_array(constValueView());
355 Integer nerror = csa.check(this,ref_array,from_array,max_print,true);
357 return nerror;
358 }
359 return 0;
360}
361
362/*---------------------------------------------------------------------------*/
363/*---------------------------------------------------------------------------*/
364
365template<typename T> Integer VariableArrayT<T>::
366checkIfSame(IDataReader* reader,Integer max_print,bool compare_ghost)
367{
368 if (itemKind()==IK_Particle)
369 return 0;
370 ArrayView<T> from_array(valueView());
371
372 Ref< IArrayDataT<T> > ref_data(m_value->cloneTrueEmptyRef());
373 reader->read(this,ref_data.get());
374
375 ArrayVariableDiff<T> csa;
376 return csa.check(this,ref_data->view(),from_array,max_print,compare_ghost);
377}
378
379/*---------------------------------------------------------------------------*/
380/*---------------------------------------------------------------------------*/
381// Utilise une fonction Helper afin de spécialiser l'appel dans le
382// cas du type 'Byte' car ArrayVariableDiff::checkReplica() utilise
383// une réduction Min/Max et cela n'existe pas en MPI pour le type Byte.
384namespace
385{
386 template<typename T> Integer
387 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
388 ConstArrayView<T> values,Integer max_print)
389 {
390 ArrayVariableDiff<T> csa;
391 return csa.checkReplica(pm,var,values,max_print);
392 }
393
394 // Spécialisation pour le type 'Byte' qui ne supporte pas les réductions.
395 Integer
396 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
397 ConstArrayView<Byte> values,Integer max_print)
398 {
399 Integer size = values.size();
400 UniqueArray<Integer> int_values(size);
401 for( Integer i=0; i<size; ++i )
402 int_values[i] = values[i];
403 ArrayVariableDiff<Integer> csa;
404 return csa.checkReplica(pm,var,int_values,max_print);
405 }
406}
407
408template<typename T> Integer VariableArrayT<T>::
409_checkIfSameOnAllReplica(IParallelMng* replica_pm,Integer max_print)
410{
411 return _checkIfSameOnAllReplicaHelper(replica_pm,this,constValueView(),max_print);
412}
413
414/*---------------------------------------------------------------------------*/
415/*---------------------------------------------------------------------------*/
429template<typename T> bool VariableArrayT<T>::
430initialize(const ItemGroup& group,const String& value)
431{
432 //TODO: peut-être vérifier que la variable est utilisée ?
433
434 // Tente de convertir value en une valeur du type de la variable.
435 T v = T();
437
438 if (is_bad){
439 error() << String::format("Can not convert the string '{0}' to type '{1}'",
440 value,dataType());
441 return true;
442 }
443
444 bool is_ok = false;
445
446 ArrayView<T> values(m_value->view());
447 if (group.itemFamily()==itemFamily()){
448 is_ok = true;
449 // TRES IMPORTANT
450 //TODO doit utiliser une indirection et une hierarchie entre groupe
451 // Enfin, affecte la valeur \a v à toutes les entités du groupe.
452 //ValueType& var_value = this->value();
453 ENUMERATE_ITEM(i,group){
454 Item elem = *i;
455 values[elem.localId()] = v;
456 }
457 }
458
459 if (is_ok)
460 return false;
461
462 eItemKind group_kind = group.itemKind();
463
464 error() << "The type of elements (" << itemKindName(group_kind)
465 << ") of the group `" << group.name() << "' does not match \n"
466 << "the type of the variable (" << itemKindName(this->itemKind()) << ").";
467 return true;
468}
469
470/*---------------------------------------------------------------------------*/
471/*---------------------------------------------------------------------------*/
472
473template<typename T> void VariableArrayT<T>::
475{
476 ARCANE_ASSERT(source.size()==destination.size(),
477 ("Impossible to copy: source and destination of different sizes !"));
478 ArrayView<T> value = m_value->view();
479 const Integer size = source.size();
480 for(Integer i=0; i<size; ++i )
481 value[destination[i]] = value[source[i]];
482 syncReferences();
483}
484
485/*---------------------------------------------------------------------------*/
486/*---------------------------------------------------------------------------*/
487
488template<typename T> void VariableArrayT<T>::
491 Int32ConstArrayView destination)
492{
493 ARCANE_ASSERT((first_source.size()==destination.size()) && (second_source.size()==destination.size()),
494 ("Impossible to copy: source and destination of different sizes !"));
495 ArrayView<T> value = m_value->view();
496 const Integer size = first_source.size();
497 for(Integer i=0; i<size; ++i ) {
498 value[destination[i]] = (T)((value[first_source[i]]+value[second_source[i]])/2);
499 }
500 syncReferences();
501}
502
503/*---------------------------------------------------------------------------*/
504/*---------------------------------------------------------------------------*/
505
509 Int32ConstArrayView destination);
510
511/*---------------------------------------------------------------------------*/
512/*---------------------------------------------------------------------------*/
513
514template<typename T> void VariableArrayT<T>::
516{
517 if (isPartial()) {
518 debug(Trace::High) << "Skip compact for partial variable " << name();
519 return;
520 }
521
522 UniqueArray<T> old_value(constValueView());
523 Integer new_size = new_to_old_ids.size();
524 m_value->resize(new_size);
525 ArrayView<T> current_value = m_value->view();
526 if (arcaneIsCheck()){
527 for( Integer i=0; i<new_size; ++i )
528 current_value.setAt(i,old_value.at(new_to_old_ids[i]));
529 }
530 else{
531 for( Integer i=0; i<new_size; ++i )
532 RawCopy<T>::copy(current_value[i], old_value[ new_to_old_ids[i] ]); // current_value[i] = old_value[ new_to_old_ids[i] ];
533 }
534 syncReferences();
535}
536
537/*---------------------------------------------------------------------------*/
538/*---------------------------------------------------------------------------*/
539
540template<typename T> void VariableArrayT<T>::
542{
543 setIsSynchronized(itemGroup());
544}
545
546/*---------------------------------------------------------------------------*/
547/*---------------------------------------------------------------------------*/
548
549template<typename T> void VariableArrayT<T>::
550setIsSynchronized(const ItemGroup& group)
551{
552 ARCANE_UNUSED(group);
553}
554
555/*---------------------------------------------------------------------------*/
556/*---------------------------------------------------------------------------*/
557
558template<typename T> void VariableArrayT<T>::
560{
561 Int32 new_size = resize_args.newSize();
562 Int32 nb_additional_element = resize_args.nbAdditionalCapacity();
563 bool use_no_init = resize_args.isUseNoInit();
564
565 auto* value_internal = m_value->_internal();
566
567 if (nb_additional_element!=0){
568 Integer capacity = value_internal->capacity();
569 if (new_size>capacity)
571 }
573 // Si la nouvelle taille est supérieure à l'ancienne,
574 // initialise les nouveaux éléments suivant
575 // la politique voulue
576 Integer current_size = m_value->view().size();
577 if (!isUsed()){
578 // Si la variable n'est plus utilisée, libérée la mémoire
579 // associée.
580 value_internal->dispose();
581 }
582 if (use_no_init)
583 value_internal->_internalDeprecatedValue().resizeNoInit(new_size);
584 else
585 value_internal->resize(new_size);
586 if (new_size>current_size){
587 if (init_policy==DIP_InitWithDefault){
588 ArrayView<T> values = this->valueView();
589 for(Integer i=current_size; i<new_size; ++i)
590 values[i] = T();
591 }
592 else{
593 bool use_nan = (init_policy==DIP_InitWithNan);
594 bool use_nan2 = (init_policy==DIP_InitInitialWithNanResizeWithDefault) && !_hasValidData();
595 if (use_nan || use_nan2){
596 ArrayView<T> view = this->valueView();
597 DataTypeTraitsT<T>::fillNan(view.subView(current_size,new_size-current_size));
598 }
599 }
600 }
601
602 // Compacte la mémoire si demandé
603 if (_wantShrink()){
604 if (m_value->view().size() < value_internal->capacity()){
605 value_internal->shrink();
606 }
607 }
608
609 // Controle si toutes les modifs après le dispose n'ont pas altéré l'état de l'allocation
610 // Dans le cas d'une variable non utilisée, la capacité max autorisée est
611 // égale à celle d'un vecteur Simd de la plateforme.
612 // (cela ne peut pas être 0 car la classe Array doit allouer au moins un
613 // élément si on utilise un allocateur spécifique ce qui est le cas
614 // pour les variables.
615 Int64 capacity = value_internal->capacity();
616 if ( !((isUsed() || capacity<=AlignedMemoryAllocator::simdAlignment())) )
617 ARCANE_FATAL("Wrong unused data size {0}",capacity);
618}
619
620/*---------------------------------------------------------------------------*/
621/*---------------------------------------------------------------------------*/
622
623template<typename DataType> void VariableArrayT<DataType>::
624resizeWithReserve(Integer n,Integer nb_additional)
625{
626 _resize(VariableResizeArgs(n,nb_additional));
627}
628
629/*---------------------------------------------------------------------------*/
630/*---------------------------------------------------------------------------*/
631
632template<typename DataType> void VariableArrayT<DataType>::
634{
635 m_value->_internal()->shrink();
636 syncReferences();
637}
638
639/*---------------------------------------------------------------------------*/
640/*---------------------------------------------------------------------------*/
641
642template<typename DataType> Integer VariableArrayT<DataType>::
643capacity()
644{
645 return m_value->_internal()->capacity();
646}
647
648/*---------------------------------------------------------------------------*/
649/*---------------------------------------------------------------------------*/
650
651template<typename DataType> void VariableArrayT<DataType>::
652fill(const DataType& value)
653{
654 m_value->view().fill(value);
655}
656
657/*---------------------------------------------------------------------------*/
658/*---------------------------------------------------------------------------*/
659
660template<typename DataType> void VariableArrayT<DataType>::
661fill(const DataType& value,const ItemGroup& group)
662{
663 ARCANE_UNUSED(group);
664 this->fill(value);
665}
666
667/*---------------------------------------------------------------------------*/
668/*---------------------------------------------------------------------------*/
669
670template<typename DataType> void
671VariableArrayT<DataType>::
672swapValues(ThatClass& rhs)
673{
674 _checkSwapIsValid(&rhs);
675 // TODO: regarder s'il faut que les deux variables aient le même nombre
676 // d'éléments mais a priori cela ne semble pas indispensable.
677 m_value->swapValues(rhs.m_value);
678 // Il faut mettre à jour les références pour cette variable et \a rhs.
679 syncReferences();
680 rhs.syncReferences();
681}
682
683/*---------------------------------------------------------------------------*/
684/*---------------------------------------------------------------------------*/
685
686// SDP: Specialisation
690 Int32ConstArrayView destination)
691{
692 Integer dsize = destination.size();
693 bool is_ok = (first_source.size()==dsize) && (second_source.size()==dsize);
694 if (!is_ok)
695 ARCANE_FATAL("Unable to copy: source and destination of different sizes !");
696
697 ArrayView<String> value = m_value->view();
698 const Integer size = first_source.size();
699 for(Integer i=0; i<size; ++i )
700 value[destination[i]] = value[first_source[i]];
701 syncReferences();
702}
703
704/*---------------------------------------------------------------------------*/
705/*---------------------------------------------------------------------------*/
706
707template<typename DataType> auto VariableArrayT<DataType>::
708value() -> ValueType&
709{
710 return m_value->_internal()->_internalDeprecatedValue();
711}
712
713/*---------------------------------------------------------------------------*/
714/*---------------------------------------------------------------------------*/
715
716ARCANE_INTERNAL_INSTANTIATE_TEMPLATE_FOR_NUMERIC_DATATYPE(VariableArrayT);
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'.
Classe de base d'une table de hachage entre les items d'un groupe et leurs positions dans la table.
Interface du gestionnaire de fabrique d'une donnée.
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 IVariable * checkVariable(const VariableInfo &infos)=0
Vérifie une variable.
Interface d'une variable.
Definition IVariable.h:54
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
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Implémentation d'une variable sur un tableau 1D.
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.
Classe template d'informations sur un type d'une variable.
Classe de base pour les comparaisons de valeurs entre deux variables.
Infos caractérisant une variable.
Arguments pour redimensionner une variable.
Instance d'une variable.
Definition Variable.h:80
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 constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface du gestionnaire de traces.
Exception lorsqu'une opération n'est pas supportée.
Chaîne de caractères unicode.
TraceMessage pinfo() const
Flot pour un message d'information en parallèle.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage error() const
Flot pour un message d'erreur.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
-*- 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:68
eDataInitialisationPolicy
Type de politique d'initialisation possible pour une donnée.
Definition DataTypes.h:131
@ DIP_InitInitialWithNanResizeWithDefault
Initialisation avec des NaN pour à la création et le constructeur par défaut ensuite.
Definition DataTypes.h:170
@ DIP_InitWithNan
Initialisation avec des NaN (Not a Number)
Definition DataTypes.h:148
@ DIP_InitWithDefault
Initialisation avec le constructeur par défaut.
Definition DataTypes.h:140
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.