Arcane  v3.16.0.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-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* VariableArray.cc (C) 2000-2025 */
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#include "arcane/core/VariableComparer.h"
35
36#include "arcane/core/datatype/DataTracer.h"
37#include "arcane/core/datatype/DataTypeTraits.h"
38#include "arcane/core/datatype/DataStorageBuildInfo.h"
39
40#include "arcane/core/VariableArray.h"
41#include "arcane/core/RawCopy.h"
42
43#include "arcane/core/internal/IDataInternal.h"
44#include "arcane/core/internal/IVariableMngInternal.h"
45#include "arcane/core/internal/IVariableInternal.h"
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
50namespace Arcane
51{
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55
56template<class DataType>
58: public VariableDiff<DataType>
59{
60 using VarDataTypeTraits = VariableDataTypeTraitsT<DataType>;
62 static constexpr bool IsNumeric = std::is_same_v<typename VarDataTypeTraits::IsNumeric, TrueType>;
63 using NormType = typename VarDataTypeTraits::NormType;
65 public:
66
69 const VariableComparerArgs& compare_args)
70 {
71 const int max_print = compare_args.maxPrint();
72 const bool compare_ghost = compare_args.isCompareGhost();
73 if (var->itemKind() == IK_Unknown)
74 return _checkAsArray(var, ref, current, compare_args);
75
76 ItemGroup group = var->itemGroup();
77 if (group.null())
78 return {};
79 IMesh* mesh = group.mesh();
80 if (!mesh)
81 return {};
82 ITraceMng* msg = mesh->traceMng();
83 IParallelMng* pm = mesh->parallelMng();
84
85 GroupIndexTable* group_index_table = (var->isPartial()) ? group.localIdToIndex().get() : nullptr;
86
87 int nb_diff = 0;
88 bool compare_failed = false;
89 eVariableComparerComputeDifferenceMethod diff_method = compare_args.computeDifferenceMethod();
90 // Pas de norme max si le type n'est pas numérique.
91 if (!IsNumeric)
93
94 Integer ref_size = ref.size();
95 NormType local_norm_max = {};
96
97 if constexpr (IsNumeric) {
98 bool is_use_local_norm = diff_method == eVariableComparerComputeDifferenceMethod::LocalNormMax;
99 if (is_use_local_norm) {
100 // Gros copier-coller pour calculer la norme globale
101 ENUMERATE_ITEM (i, group) {
102 Item item = *i;
103 if (!item.isOwn() && !compare_ghost)
104 continue;
105 Integer index = item.localId();
106 if (group_index_table) {
107 index = (*group_index_table)[index];
108 if (index < 0)
109 continue;
110 }
111 if (index >= ref_size) {
112 continue;
113 }
114 else {
115 DataType dref = ref[index];
116 NormType norm_max = VarDataTypeTraits::normeMax(dref);
117 if (norm_max > local_norm_max) {
118 local_norm_max = norm_max;
119 }
120 }
121 }
122 }
123 }
124 // On calcule les erreurs normalisées
125 ENUMERATE_ITEM (i, group) {
126 Item item = *i;
127 if (!item.isOwn() && !compare_ghost)
128 continue;
129 Integer index = item.localId();
130 if (group_index_table) {
131 index = (*group_index_table)[index];
132 if (index < 0)
133 continue;
134 }
135 DataType diff = DataType();
136 if (index >= ref_size) {
137 ++nb_diff;
138 compare_failed = true;
139 }
140 else {
141 DataType dref = ref[index];
142 DataType dcurrent = current[index];
143 bool is_diff = _computeDifference(dref, dcurrent, diff, local_norm_max, diff_method);
144 if (is_diff) {
145 this->m_diffs_info.add(DiffInfo(dcurrent, dref, diff, item, NULL_ITEM_ID));
146 ++nb_diff;
147 }
148 }
149 }
150 if (compare_failed) {
151 Int32 sid = pm->commRank();
152 const String& var_name = var->name();
153 msg->pinfo() << "Processor " << sid << " : "
154 << "comparison impossible because the number of the elements is different "
155 << " for the variable " << var_name << " ref_size=" << ref_size;
156 }
157 if (nb_diff != 0)
158 this->_sortAndDump(var, pm, max_print);
159
160 return VariableComparerResults(nb_diff);
161 }
162
163 VariableComparerResults
164 checkReplica(IVariable* var, ConstArrayView<DataType> var_value,
165 const VariableComparerArgs& compare_args)
166 {
167 IParallelMng* replica_pm = compare_args.replicaParallelMng();
168 ARCANE_CHECK_POINTER(replica_pm);
169 // Appelle la bonne spécialisation pour être certain que le type template possède
170 // la réduction.
171 using ReduceType = typename VariableDataTypeTraitsT<DataType>::HasReduceMinMax;
172 if constexpr(std::is_same<TrueType,ReduceType>::value)
173 return _checkReplica2(replica_pm, var, var_value, compare_args);
174
175 ARCANE_UNUSED(replica_pm);
176 ARCANE_UNUSED(var);
177 ARCANE_UNUSED(var_value);
178 ARCANE_UNUSED(compare_args);
179 throw NotSupportedException(A_FUNCINFO);
180 }
181
182 private:
183
184 VariableComparerResults
185 _checkAsArray(IVariable* var, ConstArrayView<DataType> ref, ConstArrayView<DataType> current,
186 const VariableComparerArgs& compare_args)
187 {
188 const int max_print = compare_args.maxPrint();
189 IParallelMng* pm = var->variableMng()->parallelMng();
190 ITraceMng* msg = pm->traceMng();
191
192 int nb_diff = 0;
193 bool compare_failed = false;
194 Integer ref_size = ref.size();
195 Integer current_size = current.size();
196 eVariableComparerComputeDifferenceMethod diff_method = compare_args.computeDifferenceMethod();
197 // Pas de norme max si le type n'est pas numérique.
198 if (!IsNumeric)
200 NormType local_norm_max = {};
201
202 if constexpr (IsNumeric) {
203 bool is_use_local_norm = compare_args.computeDifferenceMethod() == eVariableComparerComputeDifferenceMethod::LocalNormMax;
204 if (is_use_local_norm) {
205 // Gros copier-coller pour calculer la norme globale
206 for (Integer index = 0; index < current_size; ++index) {
207 if (index >= ref_size) {
208 continue;
209 }
210 else {
211 DataType dref = ref[index];
212 typename VarDataTypeTraits::NormType norm_max = VarDataTypeTraits::normeMax(dref);
213 if (norm_max > local_norm_max) {
214 local_norm_max = norm_max;
215 }
216 }
217 }
218 }
219 }
220 // On calcule les erreurs normalisées
221 for( Integer index=0; index<current_size; ++index ){
222 DataType diff = DataType();
223 if (index>=ref_size){
224 ++nb_diff;
225 compare_failed = true;
226 }
227 else{
228 DataType dref = ref[index];
229 DataType dcurrent = current[index];
230 if (_computeDifference(dref, dcurrent, diff, local_norm_max, diff_method)) {
231 this->m_diffs_info.add(DiffInfo(dcurrent,dref,diff,index,NULL_ITEM_ID));
232 ++nb_diff;
233 }
234 }
235 }
236 if (compare_failed){
237 Int32 sid = pm->commRank();
238 const String& var_name = var->name();
239 msg->pinfo() << "Processor " << sid << " : "
240 << " comparaison impossible car nombre d'éléments différents"
241 << " pour la variable " << var_name << " ref_size=" << ref_size;
242
243 }
244 if (nb_diff!=0)
245 this->_sortAndDump(var,pm,max_print);
246
247 return VariableComparerResults(nb_diff);
248 }
249
250 VariableComparerResults
251 _checkReplica2(IParallelMng* pm, IVariable* var, ConstArrayView<DataType> var_values,
252 const VariableComparerArgs& compare_args)
253 {
254 const int max_print = compare_args.maxPrint();
255 ITraceMng* msg = pm->traceMng();
256 Integer size = var_values.size();
257 // Vérifie que tous les réplica ont le même nombre d'éléments pour la variable.
258 Integer max_size = pm->reduce(Parallel::ReduceMax,size);
259 Integer min_size = pm->reduce(Parallel::ReduceMin,size);
260 msg->info(5) << "CheckReplica2 rep_size=" << pm->commSize() << " rank=" << pm->commRank();
261 if (max_size!=min_size){
262 const String& var_name = var->name();
263 msg->info() << "Can not compare values on replica for variable '" << var_name << "'"
264 << " because the number of elements is not the same on all the replica "
265 << " min=" << min_size << " max="<< max_size;
266 return VariableComparerResults(max_size);
267 }
268 Integer nb_diff = 0;
269 UniqueArray<DataType> min_values(var_values);
270 UniqueArray<DataType> max_values(var_values);
271 pm->reduce(Parallel::ReduceMax,max_values);
272 pm->reduce(Parallel::ReduceMin,min_values);
273
274 for( Integer index=0; index<size; ++index ){
275 DataType diff = DataType();
276 DataType min_val = min_values[index];
277 DataType max_val = max_values[index];
278 if (VarDataTypeTraits::verifDifferent(min_val,max_val,diff,true)){
279 this->m_diffs_info.add(DiffInfo(min_val,max_val,diff,index,NULL_ITEM_ID));
280 ++nb_diff;
281 }
282 }
283 if (nb_diff!=0)
284 this->_sortAndDump(var,pm,max_print);
285
286 return VariableComparerResults(nb_diff);
287 }
288 bool _computeDifference(const DataType& dref, const DataType& dcurrent, DataType& diff,
289 const NormType& local_norm_max,
291 {
292 bool is_diff = false;
293 switch (diff_method) {
295 is_diff = VarDataTypeTraits::verifDifferent(dref, dcurrent, diff, true);
296 break;
298 is_diff = VarDataTypeTraits::verifDifferentNorm(dref, dcurrent, diff, local_norm_max, true);
299 break;
300 }
301 return is_diff;
302 }
303};
304
305/*---------------------------------------------------------------------------*/
306/*---------------------------------------------------------------------------*/
307
308/*---------------------------------------------------------------------------*/
309/*---------------------------------------------------------------------------*/
310
311template<typename T> VariableArrayT<T>::
313: Variable(vb,info)
314, m_value(nullptr)
315{
316 IDataFactoryMng* df = vb.dataFactoryMng();
317 DataStorageBuildInfo storage_build_info(vb.traceMng());
318 String storage_full_type = info.storageTypeInfo().fullName();
319 Ref<IData> data = df->createSimpleDataRef(storage_full_type,storage_build_info);
320 m_value = dynamic_cast<ValueDataType*>(data.get());
321 ARCANE_CHECK_POINTER(m_value);
322 _setData(makeRef(m_value));
323}
324
325/*---------------------------------------------------------------------------*/
326/*---------------------------------------------------------------------------*/
327
328template<typename T> VariableArrayT<T>::
330{
331}
332
333/*---------------------------------------------------------------------------*/
334/*---------------------------------------------------------------------------*/
335
336template<typename T> VariableArrayT<T>* VariableArrayT<T>::
337getReference(const VariableBuildInfo& vb,const VariableInfo& vi)
338{
339 if (vb.isNull())
340 return nullptr;
341 ThatClass* true_ptr = nullptr;
342 IVariableMng* vm = vb.variableMng();
343 IVariable* var = vm->checkVariable(vi);
344 if (var)
345 true_ptr = dynamic_cast<ThatClass*>(var);
346 else{
347 true_ptr = new ThatClass(vb,vi);
348 vm->_internalApi()->addVariable(true_ptr);
349 }
350 ARCANE_CHECK_PTR(true_ptr);
351 return true_ptr;
352}
353
354/*---------------------------------------------------------------------------*/
355/*---------------------------------------------------------------------------*/
356
357template<typename T> VariableArrayT<T>* VariableArrayT<T>::
359{
360 if (!var)
361 throw ArgumentException(A_FUNCINFO,"null variable");
362 auto* true_ptr = dynamic_cast<ThatClass*>(var);
363 if (!true_ptr)
364 ARCANE_FATAL("Can not build a reference from variable {0}",var->name());
365 return true_ptr;
366}
367
368/*---------------------------------------------------------------------------*/
369/*---------------------------------------------------------------------------*/
370
371template<typename T> void VariableArrayT<T>::
372print(std::ostream& o) const
373{
374 ConstArrayView<T> x(m_value->view());
375 Integer size = x.size();
376 o << "(dimension=" << size << ") ";
377 if (size<=150){
378 for( auto& i : x ){
379 o << i << '\n';
380 }
381 }
382}
383
384/*---------------------------------------------------------------------------*/
385/*---------------------------------------------------------------------------*/
386
387template<typename T> void VariableArrayT<T>::
389{
390 if (itemKind()==IK_Unknown)
391 ARCANE_THROW(NotSupportedException,"variable '{0}' is not a mesh variable",fullName());
392 IItemFamily* family = itemGroup().itemFamily();
393 if (!family)
394 ARCANE_FATAL("variable '{0}' without family",fullName());
395 if(isPartial())
396 itemGroup().synchronizer()->synchronize(this);
397 else
398 family->allItemsSynchronizer()->synchronize(this);
399}
400
401/*---------------------------------------------------------------------------*/
402/*---------------------------------------------------------------------------*/
403
404template<typename T> void VariableArrayT<T>::
406{
407 if (itemKind()==IK_Unknown)
408 ARCANE_THROW(NotSupportedException,"variable '{0}' is not a mesh variable",fullName());
409 IItemFamily* family = itemGroup().itemFamily();
410 if (!family)
411 ARCANE_FATAL("variable '{0}' without family",fullName());
412 if(isPartial())
413 itemGroup().synchronizer()->synchronize(this, local_ids);
414 else
415 family->allItemsSynchronizer()->synchronize(this, local_ids);
416}
417
418/*---------------------------------------------------------------------------*/
419/*---------------------------------------------------------------------------*/
420
421template<typename T> Real VariableArrayT<T>::
422allocatedMemory() const
423{
424 Real v1 = (Real)(sizeof(T));
425 Real v2 = (Real)(m_value->view().size());
426 return v1 * v2;
427}
428
429/*---------------------------------------------------------------------------*/
430/*---------------------------------------------------------------------------*/
431// Utilise une fonction Helper afin de spécialiser l'appel dans le
432// cas du type 'Byte' car ArrayVariableDiff::checkReplica() utilise
433// une réduction Min/Max et cela n'existe pas en MPI pour le type Byte.
434namespace
435{
436 template <typename T> VariableComparerResults
437 _checkIfSameOnAllReplicaHelper(IVariable* var, ConstArrayView<T> values,
438 const VariableComparerArgs& compare_args)
439 {
441 return csa.checkReplica(var, values, compare_args);
442 }
443
444 // Spécialisation pour le type 'Byte' qui ne supporte pas les réductions.
445 VariableComparerResults
446 _checkIfSameOnAllReplicaHelper(IVariable* var, ConstArrayView<Byte> values,
447 const VariableComparerArgs& compare_args)
448 {
449 Integer size = values.size();
450 UniqueArray<Integer> int_values(size);
451 for( Integer i=0; i<size; ++i )
452 int_values[i] = values[i];
453 ArrayVariableDiff<Integer> csa;
454 return csa.checkReplica(var, int_values, compare_args);
455 }
456}
457
458/*---------------------------------------------------------------------------*/
459/*---------------------------------------------------------------------------*/
460
462_compareVariable(const VariableComparerArgs& compare_args)
463{
464 switch (compare_args.compareMode()) {
466
467 if (itemKind() == IK_Particle)
468 return {};
469 IDataReader* reader = compare_args.dataReader();
470 ARCANE_CHECK_POINTER(reader);
471
472 ArrayView<T> from_array(valueView());
473
474 Ref<IArrayDataT<T>> ref_data(m_value->cloneTrueEmptyRef());
475 reader->read(this, ref_data.get());
476
478 VariableComparerResults r = csa.check(this, ref_data->view(), from_array, compare_args);
479 return r;
480 }
482 IItemFamily* family = itemGroup().itemFamily();
483 if (!family)
484 return {};
485 ValueType& data_values = m_value->_internal()->_internalDeprecatedValue();
486 UniqueArray<T> ref_array(constValueView());
487 this->synchronize(); // fonctionne pour toutes les variables
489 ConstArrayView<T> from_array(constValueView());
490 VariableComparerResults r = csa.check(this, ref_array, from_array, compare_args);
491 data_values.copy(ref_array);
492 return r;
493 }
495 VariableComparerResults r = _checkIfSameOnAllReplicaHelper(this, constValueView(), compare_args);
496 return r;
497 }
498 }
499 ARCANE_FATAL("Invalid value for compare mode '{0}'", (int)compare_args.compareMode());
500}
501
502/*---------------------------------------------------------------------------*/
503/*---------------------------------------------------------------------------*/
504/*!
505 * \brief Initialise la variable.
506 *
507 Initialise la variable avec la valeur \a value sur le groupe \a group.
508
509 La valeur étant passée sous forme d'une chaine de caractère, vérifie que
510 la conversion en le type de la variable est possible. De même vérifie
511 que le groupe \a group est du type #GroupType. Si l'un de ces deux points
512 n'est pas respecté, l'initialisation échoue.
513
514 \retval true en cas d'erreur,
515 \retval false en cas de succés.
516*/
517template<typename T> bool VariableArrayT<T>::
518initialize(const ItemGroup& group,const String& value)
519{
520 //TODO: peut-être vérifier que la variable est utilisée ?
521
522 // Tente de convertir value en une valeur du type de la variable.
523 T v = T();
524 bool is_bad = VariableDataTypeTraitsT<T>::getValue(v,value);
525
526 if (is_bad){
527 error() << String::format("Can not convert the string '{0}' to type '{1}'",
528 value,dataType());
529 return true;
530 }
531
532 bool is_ok = false;
533
534 ArrayView<T> values(m_value->view());
535 if (group.itemFamily()==itemFamily()){
536 is_ok = true;
537 // TRES IMPORTANT
538 //TODO doit utiliser une indirection et une hierarchie entre groupe
539 // Enfin, affecte la valeur \a v à toutes les entités du groupe.
540 //ValueType& var_value = this->value();
541 ENUMERATE_ITEM(i,group){
542 Item elem = *i;
543 values[elem.localId()] = v;
544 }
545 }
546
547 if (is_ok)
548 return false;
549
550 eItemKind group_kind = group.itemKind();
551
552 error() << "The type of elements (" << itemKindName(group_kind)
553 << ") of the group `" << group.name() << "' does not match \n"
554 << "the type of the variable (" << itemKindName(this->itemKind()) << ").";
555 return true;
556}
557
558/*---------------------------------------------------------------------------*/
559/*---------------------------------------------------------------------------*/
560
561template<typename T> void VariableArrayT<T>::
563{
564 ARCANE_ASSERT(source.size()==destination.size(),
565 ("Impossible to copy: source and destination of different sizes !"));
566 ArrayView<T> value = m_value->view();
567 const Integer size = source.size();
568 for(Integer i=0; i<size; ++i )
569 value[destination[i]] = value[source[i]];
571}
572
573/*---------------------------------------------------------------------------*/
574/*---------------------------------------------------------------------------*/
575
576template<typename T> void VariableArrayT<T>::
578 Int32ConstArrayView second_source,
579 Int32ConstArrayView destination)
580{
581 ARCANE_ASSERT((first_source.size()==destination.size()) && (second_source.size()==destination.size()),
582 ("Impossible to copy: source and destination of different sizes !"));
583 ArrayView<T> value = m_value->view();
584 const Integer size = first_source.size();
585 for(Integer i=0; i<size; ++i ) {
586 value[destination[i]] = (T)((value[first_source[i]]+value[second_source[i]])/2);
587 }
589}
590
591/*---------------------------------------------------------------------------*/
592/*---------------------------------------------------------------------------*/
593
596 Int32ConstArrayView second_source,
597 Int32ConstArrayView destination);
598
599/*---------------------------------------------------------------------------*/
600/*---------------------------------------------------------------------------*/
601
602template<typename T> void VariableArrayT<T>::
603compact(Int32ConstArrayView new_to_old_ids)
604{
605 if (isPartial()) {
606 debug(Trace::High) << "Skip compact for partial variable " << name();
607 return;
608 }
609
610 UniqueArray<T> old_value(constValueView());
611 Integer new_size = new_to_old_ids.size();
612 m_value->resize(new_size);
613 ArrayView<T> current_value = m_value->view();
614 if (arcaneIsCheck()){
615 for( Integer i=0; i<new_size; ++i )
616 current_value.setAt(i,old_value.at(new_to_old_ids[i]));
617 }
618 else{
619 for( Integer i=0; i<new_size; ++i )
620 RawCopy<T>::copy(current_value[i], old_value[ new_to_old_ids[i] ]); // current_value[i] = old_value[ new_to_old_ids[i] ];
621 }
623}
624
625/*---------------------------------------------------------------------------*/
626/*---------------------------------------------------------------------------*/
627
628template<typename T> void VariableArrayT<T>::
630{
632}
633
634/*---------------------------------------------------------------------------*/
635/*---------------------------------------------------------------------------*/
636
637template<typename T> void VariableArrayT<T>::
638setIsSynchronized(const ItemGroup& group)
639{
640 ARCANE_UNUSED(group);
641}
642
643/*---------------------------------------------------------------------------*/
644/*---------------------------------------------------------------------------*/
645
646template<typename T> void VariableArrayT<T>::
647_internalResize(const VariableResizeArgs& resize_args)
648{
649 Int32 new_size = resize_args.newSize();
650 Int32 nb_additional_element = resize_args.nbAdditionalCapacity();
651 bool use_no_init = resize_args.isUseNoInit();
652
653 auto* value_internal = m_value->_internal();
654
655 if (nb_additional_element!=0){
656 Integer capacity = value_internal->capacity();
657 if (new_size>capacity)
658 value_internal->reserve(new_size+nb_additional_element);
659 }
661 // Si la nouvelle taille est supérieure à l'ancienne,
662 // initialise les nouveaux éléments suivant
663 // la politique voulue
664 Integer current_size = m_value->view().size();
665 if (!isUsed()){
666 // Si la variable n'est plus utilisée, libérée la mémoire
667 // associée.
668 value_internal->dispose();
669 }
670 if (use_no_init)
671 value_internal->_internalDeprecatedValue().resizeNoInit(new_size);
672 else
673 value_internal->resize(new_size);
674 if (new_size>current_size){
675 if (init_policy==DIP_InitWithDefault){
676 ArrayView<T> values = this->valueView();
677 for(Integer i=current_size; i<new_size; ++i)
678 values[i] = T();
679 }
680 else{
681 bool use_nan = (init_policy==DIP_InitWithNan);
682 bool use_nan2 = (init_policy==DIP_InitInitialWithNanResizeWithDefault) && !_hasValidData();
683 if (use_nan || use_nan2){
684 ArrayView<T> view = this->valueView();
685 DataTypeTraitsT<T>::fillNan(view.subView(current_size,new_size-current_size));
686 }
687 }
688 }
689
690 // Compacte la mémoire si demandé
691 if (_wantShrink()){
692 if (m_value->view().size() < value_internal->capacity()){
693 value_internal->shrink();
694 }
695 }
696
697 // Controle si toutes les modifs après le dispose n'ont pas altéré l'état de l'allocation
698 // Dans le cas d'une variable non utilisée, la capacité max autorisée est
699 // égale à celle d'un vecteur Simd de la plateforme.
700 // (cela ne peut pas être 0 car la classe Array doit allouer au moins un
701 // élément si on utilise un allocateur spécifique ce qui est le cas
702 // pour les variables.
703 Int64 capacity = value_internal->capacity();
704 if ( !((isUsed() || capacity<=AlignedMemoryAllocator::simdAlignment())) )
705 ARCANE_FATAL("Wrong unused data size {0}",capacity);
706}
707
708/*---------------------------------------------------------------------------*/
709/*---------------------------------------------------------------------------*/
710
711template<typename DataType> void VariableArrayT<DataType>::
712resizeWithReserve(Integer n,Integer nb_additional)
713{
714 _resize(VariableResizeArgs(n,nb_additional));
715}
716
717/*---------------------------------------------------------------------------*/
718/*---------------------------------------------------------------------------*/
719
720template<typename DataType> void VariableArrayT<DataType>::
722{
723 m_value->_internal()->shrink();
725}
726
727/*---------------------------------------------------------------------------*/
728/*---------------------------------------------------------------------------*/
729
730template<typename DataType> Integer VariableArrayT<DataType>::
731capacity()
732{
733 return m_value->_internal()->capacity();
734}
735
736/*---------------------------------------------------------------------------*/
737/*---------------------------------------------------------------------------*/
738
739template<typename DataType> void VariableArrayT<DataType>::
740fill(const DataType& value)
741{
742 m_value->view().fill(value);
743}
744
745/*---------------------------------------------------------------------------*/
746/*---------------------------------------------------------------------------*/
747
748template<typename DataType> void VariableArrayT<DataType>::
749fill(const DataType& value,const ItemGroup& group)
750{
751 ARCANE_UNUSED(group);
752 this->fill(value);
753}
754
755/*---------------------------------------------------------------------------*/
756/*---------------------------------------------------------------------------*/
757
758template<typename DataType> void
760swapValues(ThatClass& rhs)
761{
762 _checkSwapIsValid(&rhs);
763 // TODO: regarder s'il faut que les deux variables aient le même nombre
764 // d'éléments mais a priori cela ne semble pas indispensable.
765 m_value->swapValues(rhs.m_value);
766 // Il faut mettre à jour les références pour cette variable et \a rhs.
767 syncReferences();
768 rhs.syncReferences();
769}
770
771/*---------------------------------------------------------------------------*/
772/*---------------------------------------------------------------------------*/
773
774// SDP: Specialisation
777 Int32ConstArrayView second_source,
778 Int32ConstArrayView destination)
779{
780 Integer dsize = destination.size();
781 bool is_ok = (first_source.size()==dsize) && (second_source.size()==dsize);
782 if (!is_ok)
783 ARCANE_FATAL("Unable to copy: source and destination of different sizes !");
784
785 ArrayView<String> value = m_value->view();
786 const Integer size = first_source.size();
787 for(Integer i=0; i<size; ++i )
788 value[destination[i]] = value[first_source[i]];
790}
791
792/*---------------------------------------------------------------------------*/
793/*---------------------------------------------------------------------------*/
794
795template<typename DataType> auto VariableArrayT<DataType>::
796value() -> ValueType&
797{
798 return m_value->_internal()->_internalDeprecatedValue();
799}
800
801/*---------------------------------------------------------------------------*/
802/*---------------------------------------------------------------------------*/
803
804ARCANE_INTERNAL_INSTANTIATE_TEMPLATE_FOR_NUMERIC_DATATYPE(VariableArrayT);
805template class VariableArrayT<String>;
806
807/*---------------------------------------------------------------------------*/
808/*---------------------------------------------------------------------------*/
809
810} // End namespace Arcane
811
812/*---------------------------------------------------------------------------*/
813/*---------------------------------------------------------------------------*/
#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.
static constexpr Integer simdAlignment()
Alignement pour les structures utilisant la vectorisation.
Exception lorsqu'un argument est invalide.
Vue modifiable d'un tableau d'un type T.
T & at(Int64 i)
Elément d'indice i. Vérifie toujours les débordements.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Informations pour construire une instance de 'IData'.
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'une famille d'entités.
Definition IItemFamily.h:84
virtual IVariableSynchronizer * allItemsSynchronizer()=0
Synchroniseur sur toutes les entités de la famille.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
Interface du gestionnaire de traces.
virtual TraceMessage pinfo()=0
Flot pour un message d'information parallèle.
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.
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:219
bool isOwn() const
true si l'entité est appartient au sous-domaine
Definition Item.h:253
Référence à une instance.
InstanceType * get() const
Instance associée ou nullptr si aucune.
Chaîne de caractères unicode.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage error() const
Flot pour un message d'erreur.
Vecteur 1D de données avec sémantique par valeur (style STL).
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.
VariableComparerResults _compareVariable(const VariableComparerArgs &compare_args) final
Comparaison de valeurs entre variables.
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.
Arguments des méthodes de VariableComparer.
Résultats d'une opération de comparaison.
Infos caractérisant une variable.
IMesh * mesh() const final
Maillage auquel est associé la variable.
Definition Variable.cc:815
Variable(const VariableBuildInfo &v, const VariableInfo &vi)
Créé une variable lié à la référence v.
Definition Variable.cc:335
void _setData(const Ref< IData > &data)
Positionne la donnée.
Definition Variable.cc:889
bool isPartial() const override
Indique si la variable est partielle.
Definition Variable.cc:871
IVariableMng * variableMng() const override
Gestionnaire de variable associé à la variable.
Definition Variable.cc:466
String name() const final
Nom de la variable.
Definition Variable.cc:475
ItemGroup itemGroup() const final
Groupe du maillage associé.
Definition Variable.cc:835
void syncReferences() override
Synchronise les références.
Definition Variable.cc:749
String fullName() const final
Nom complet de la variable (avec le préfixe de la famille)
Definition Variable.cc:484
eItemKind itemKind() const override
Type des entités du maillage sur lequel repose la variable.
Definition Variable.cc:844
IItemFamily * itemFamily() const final
Famille d'entité associée.
Definition Variable.cc:880
eDataType dataType() const override
Type de la donnée gérée par la variable (Real, Integer, ...)
Definition Variable.cc:520
@ ReduceMin
Minimum des valeurs.
@ ReduceMax
Maximum des valeurs.
-*- 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
std::int64_t Int64
Type entier signé sur 64 bits.
eVariableComparerComputeDifferenceMethod
Méthode utilisée pour calculer la différence entre deux valeurs v1 et v2.
@ LocalNormMax
Utilise (v1-v2) / local_norm_max.
eDataInitialisationPolicy getGlobalDataInitialisationPolicy()
Récupère la politique d'initialisation des variables.
Definition DataTypes.cc:162
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569
@ SameReplica
Vérifie que les valeurs de la variable sont les même sur tous les replica.
@ Same
Compare avec une référence.
@ Sync
Vérifie que la variable est bien synchronisée.
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
double Real
Type représentant un réel.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.