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