Arcane  v3.16.2.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-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 = var->_internalApi()->replicaParallelMng();
168 if (!replica_pm)
169 return {};
170 // Appelle la bonne spécialisation pour être certain que le type template possède
171 // la réduction.
172 using ReduceType = typename VariableDataTypeTraitsT<DataType>::HasReduceMinMax;
173 if constexpr(std::is_same<TrueType,ReduceType>::value)
174 return _checkReplica2(replica_pm, var, var_value, compare_args);
175
176 ARCANE_UNUSED(replica_pm);
177 ARCANE_UNUSED(var);
178 ARCANE_UNUSED(var_value);
179 ARCANE_UNUSED(compare_args);
180 throw NotSupportedException(A_FUNCINFO);
181 }
182
183 private:
184
185 VariableComparerResults
186 _checkAsArray(IVariable* var, ConstArrayView<DataType> ref, ConstArrayView<DataType> current,
187 const VariableComparerArgs& compare_args)
188 {
189 const int max_print = compare_args.maxPrint();
190 IParallelMng* pm = var->variableMng()->parallelMng();
191 ITraceMng* msg = pm->traceMng();
192
193 int nb_diff = 0;
194 bool compare_failed = false;
195 Integer ref_size = ref.size();
196 Integer current_size = current.size();
197 eVariableComparerComputeDifferenceMethod diff_method = compare_args.computeDifferenceMethod();
198 // Pas de norme max si le type n'est pas numérique.
199 if (!IsNumeric)
201 NormType local_norm_max = {};
202
203 if constexpr (IsNumeric) {
204 bool is_use_local_norm = compare_args.computeDifferenceMethod() == eVariableComparerComputeDifferenceMethod::LocalNormMax;
205 if (is_use_local_norm) {
206 // Gros copier-coller pour calculer la norme globale
207 for (Integer index = 0; index < current_size; ++index) {
208 if (index >= ref_size) {
209 continue;
210 }
211 else {
212 DataType dref = ref[index];
213 typename VarDataTypeTraits::NormType norm_max = VarDataTypeTraits::normeMax(dref);
214 if (norm_max > local_norm_max) {
215 local_norm_max = norm_max;
216 }
217 }
218 }
219 }
220 }
221 // On calcule les erreurs normalisées
222 for( Integer index=0; index<current_size; ++index ){
223 DataType diff = DataType();
224 if (index>=ref_size){
225 ++nb_diff;
226 compare_failed = true;
227 }
228 else{
229 DataType dref = ref[index];
230 DataType dcurrent = current[index];
231 if (_computeDifference(dref, dcurrent, diff, local_norm_max, diff_method)) {
232 this->m_diffs_info.add(DiffInfo(dcurrent,dref,diff,index,NULL_ITEM_ID));
233 ++nb_diff;
234 }
235 }
236 }
237 if (compare_failed){
238 Int32 sid = pm->commRank();
239 const String& var_name = var->name();
240 msg->pinfo() << "Processor " << sid << " : "
241 << " comparaison impossible car nombre d'éléments différents"
242 << " pour la variable " << var_name << " ref_size=" << ref_size;
243
244 }
245 if (nb_diff!=0)
246 this->_sortAndDump(var,pm,max_print);
247
248 return VariableComparerResults(nb_diff);
249 }
250
251 VariableComparerResults
252 _checkReplica2(IParallelMng* pm, IVariable* var, ConstArrayView<DataType> var_values,
253 const VariableComparerArgs& compare_args)
254 {
255 const int max_print = compare_args.maxPrint();
256 ITraceMng* msg = pm->traceMng();
257 Integer size = var_values.size();
258 // Vérifie que tous les réplica ont le même nombre d'éléments pour la variable.
259 Integer max_size = pm->reduce(Parallel::ReduceMax,size);
260 Integer min_size = pm->reduce(Parallel::ReduceMin,size);
261 msg->info(5) << "CheckReplica2 rep_size=" << pm->commSize() << " rank=" << pm->commRank();
262 if (max_size!=min_size){
263 const String& var_name = var->name();
264 msg->info() << "Can not compare values on replica for variable '" << var_name << "'"
265 << " because the number of elements is not the same on all the replica "
266 << " min=" << min_size << " max="<< max_size;
267 return VariableComparerResults(max_size);
268 }
269 Integer nb_diff = 0;
270 UniqueArray<DataType> min_values(var_values);
271 UniqueArray<DataType> max_values(var_values);
272 pm->reduce(Parallel::ReduceMax,max_values);
273 pm->reduce(Parallel::ReduceMin,min_values);
274
275 for( Integer index=0; index<size; ++index ){
276 DataType diff = DataType();
277 DataType min_val = min_values[index];
278 DataType max_val = max_values[index];
279 if (VarDataTypeTraits::verifDifferent(min_val,max_val,diff,true)){
280 this->m_diffs_info.add(DiffInfo(min_val,max_val,diff,index,NULL_ITEM_ID));
281 ++nb_diff;
282 }
283 }
284 if (nb_diff!=0)
285 this->_sortAndDump(var,pm,max_print);
286
287 return VariableComparerResults(nb_diff);
288 }
289 bool _computeDifference(const DataType& dref, const DataType& dcurrent, DataType& diff,
290 const NormType& local_norm_max,
292 {
293 bool is_diff = false;
294 switch (diff_method) {
296 is_diff = VarDataTypeTraits::verifDifferent(dref, dcurrent, diff, true);
297 break;
299 is_diff = VarDataTypeTraits::verifDifferentNorm(dref, dcurrent, diff, local_norm_max, true);
300 break;
301 }
302 return is_diff;
303 }
304};
305
306/*---------------------------------------------------------------------------*/
307/*---------------------------------------------------------------------------*/
308
309/*---------------------------------------------------------------------------*/
310/*---------------------------------------------------------------------------*/
311
312template<typename T> VariableArrayT<T>::
314: Variable(vb,info)
315, m_value(nullptr)
316{
317 IDataFactoryMng* df = vb.dataFactoryMng();
318 DataStorageBuildInfo storage_build_info(vb.traceMng());
319 String storage_full_type = info.storageTypeInfo().fullName();
320 Ref<IData> data = df->createSimpleDataRef(storage_full_type,storage_build_info);
321 m_value = dynamic_cast<ValueDataType*>(data.get());
322 ARCANE_CHECK_POINTER(m_value);
323 _setData(makeRef(m_value));
324}
325
326/*---------------------------------------------------------------------------*/
327/*---------------------------------------------------------------------------*/
328
329template<typename T> VariableArrayT<T>::
331{
332}
333
334/*---------------------------------------------------------------------------*/
335/*---------------------------------------------------------------------------*/
336
337template<typename T> VariableArrayT<T>* VariableArrayT<T>::
338getReference(const VariableBuildInfo& vb,const VariableInfo& vi)
339{
340 if (vb.isNull())
341 return nullptr;
342 ThatClass* true_ptr = nullptr;
343 IVariableMng* vm = vb.variableMng();
344 IVariable* var = vm->checkVariable(vi);
345 if (var)
346 true_ptr = dynamic_cast<ThatClass*>(var);
347 else{
348 true_ptr = new ThatClass(vb,vi);
349 vm->_internalApi()->addVariable(true_ptr);
350 }
351 ARCANE_CHECK_PTR(true_ptr);
352 return true_ptr;
353}
354
355/*---------------------------------------------------------------------------*/
356/*---------------------------------------------------------------------------*/
357
358template<typename T> VariableArrayT<T>* VariableArrayT<T>::
360{
361 if (!var)
362 throw ArgumentException(A_FUNCINFO,"null variable");
363 auto* true_ptr = dynamic_cast<ThatClass*>(var);
364 if (!true_ptr)
365 ARCANE_FATAL("Can not build a reference from variable {0}",var->name());
366 return true_ptr;
367}
368
369/*---------------------------------------------------------------------------*/
370/*---------------------------------------------------------------------------*/
371
372template<typename T> void VariableArrayT<T>::
373print(std::ostream& o) const
374{
375 ConstArrayView<T> x(m_value->view());
376 Integer size = x.size();
377 o << "(dimension=" << size << ") ";
378 if (size<=150){
379 for( auto& i : x ){
380 o << i << '\n';
381 }
382 }
383}
384
385/*---------------------------------------------------------------------------*/
386/*---------------------------------------------------------------------------*/
387
388template<typename T> void VariableArrayT<T>::
390{
391 if (itemKind()==IK_Unknown)
392 ARCANE_THROW(NotSupportedException,"variable '{0}' is not a mesh variable",fullName());
393 IItemFamily* family = itemGroup().itemFamily();
394 if (!family)
395 ARCANE_FATAL("variable '{0}' without family",fullName());
396 if(isPartial())
397 itemGroup().synchronizer()->synchronize(this);
398 else
399 family->allItemsSynchronizer()->synchronize(this);
400}
401
402/*---------------------------------------------------------------------------*/
403/*---------------------------------------------------------------------------*/
404
405template<typename T> void VariableArrayT<T>::
407{
408 if (itemKind()==IK_Unknown)
409 ARCANE_THROW(NotSupportedException,"variable '{0}' is not a mesh variable",fullName());
410 IItemFamily* family = itemGroup().itemFamily();
411 if (!family)
412 ARCANE_FATAL("variable '{0}' without family",fullName());
413 if(isPartial())
414 itemGroup().synchronizer()->synchronize(this, local_ids);
415 else
416 family->allItemsSynchronizer()->synchronize(this, local_ids);
417}
418
419/*---------------------------------------------------------------------------*/
420/*---------------------------------------------------------------------------*/
421
422template<typename T> Real VariableArrayT<T>::
423allocatedMemory() const
424{
425 Real v1 = (Real)(sizeof(T));
426 Real v2 = (Real)(m_value->view().size());
427 return v1 * v2;
428}
429
430/*---------------------------------------------------------------------------*/
431/*---------------------------------------------------------------------------*/
432// Utilise une fonction Helper afin de spécialiser l'appel dans le
433// cas du type 'Byte' car ArrayVariableDiff::checkReplica() utilise
434// une réduction Min/Max et cela n'existe pas en MPI pour le type Byte.
435namespace
436{
437 template <typename T> VariableComparerResults
438 _checkIfSameOnAllReplicaHelper(IVariable* var, ConstArrayView<T> values,
439 const VariableComparerArgs& compare_args)
440 {
442 return csa.checkReplica(var, values, compare_args);
443 }
444
445 // Spécialisation pour le type 'Byte' qui ne supporte pas les réductions.
446 VariableComparerResults
447 _checkIfSameOnAllReplicaHelper(IVariable* var, ConstArrayView<Byte> values,
448 const VariableComparerArgs& compare_args)
449 {
450 Integer size = values.size();
451 UniqueArray<Integer> int_values(size);
452 for( Integer i=0; i<size; ++i )
453 int_values[i] = values[i];
454 ArrayVariableDiff<Integer> csa;
455 return csa.checkReplica(var, int_values, compare_args);
456 }
457}
458
459/*---------------------------------------------------------------------------*/
460/*---------------------------------------------------------------------------*/
461
463_compareVariable(const VariableComparerArgs& compare_args)
464{
465 switch (compare_args.compareMode()) {
467
468 if (itemKind() == IK_Particle)
469 return {};
470 IDataReader* reader = compare_args.dataReader();
471 ARCANE_CHECK_POINTER(reader);
472
473 ArrayView<T> from_array(valueView());
474
475 Ref<IArrayDataT<T>> ref_data(m_value->cloneTrueEmptyRef());
476 reader->read(this, ref_data.get());
477
479 VariableComparerResults r = csa.check(this, ref_data->view(), from_array, compare_args);
480 return r;
481 }
483 IItemFamily* family = itemGroup().itemFamily();
484 if (!family)
485 return {};
486 ValueType& data_values = m_value->_internal()->_internalDeprecatedValue();
487 UniqueArray<T> ref_array(constValueView());
488 this->synchronize(); // fonctionne pour toutes les variables
490 ConstArrayView<T> from_array(constValueView());
491 VariableComparerResults r = csa.check(this, ref_array, from_array, compare_args);
492 data_values.copy(ref_array);
493 return r;
494 }
496 VariableComparerResults r = _checkIfSameOnAllReplicaHelper(this, constValueView(), compare_args);
497 return r;
498 }
499 }
500 ARCANE_FATAL("Invalid value for compare mode '{0}'", (int)compare_args.compareMode());
501}
502
503/*---------------------------------------------------------------------------*/
504/*---------------------------------------------------------------------------*/
518template<typename T> bool VariableArrayT<T>::
519initialize(const ItemGroup& group,const String& value)
520{
521 //TODO: peut-être vérifier que la variable est utilisée ?
522
523 // Tente de convertir value en une valeur du type de la variable.
524 T v = T();
525 bool is_bad = VariableDataTypeTraitsT<T>::getValue(v,value);
526
527 if (is_bad){
528 error() << String::format("Can not convert the string '{0}' to type '{1}'",
529 value,dataType());
530 return true;
531 }
532
533 bool is_ok = false;
534
535 ArrayView<T> values(m_value->view());
536 if (group.itemFamily()==itemFamily()){
537 is_ok = true;
538 // TRES IMPORTANT
539 //TODO doit utiliser une indirection et une hierarchie entre groupe
540 // Enfin, affecte la valeur \a v à toutes les entités du groupe.
541 //ValueType& var_value = this->value();
542 ENUMERATE_ITEM(i,group){
543 Item elem = *i;
544 values[elem.localId()] = v;
545 }
546 }
547
548 if (is_ok)
549 return false;
550
551 eItemKind group_kind = group.itemKind();
552
553 error() << "The type of elements (" << itemKindName(group_kind)
554 << ") of the group `" << group.name() << "' does not match \n"
555 << "the type of the variable (" << itemKindName(this->itemKind()) << ").";
556 return true;
557}
558
559/*---------------------------------------------------------------------------*/
560/*---------------------------------------------------------------------------*/
561
562template<typename T> void VariableArrayT<T>::
564{
565 ARCANE_ASSERT(source.size()==destination.size(),
566 ("Impossible to copy: source and destination of different sizes !"));
567 ArrayView<T> value = m_value->view();
568 const Integer size = source.size();
569 for(Integer i=0; i<size; ++i )
570 value[destination[i]] = value[source[i]];
572}
573
574/*---------------------------------------------------------------------------*/
575/*---------------------------------------------------------------------------*/
576
577template<typename T> void VariableArrayT<T>::
579 Int32ConstArrayView second_source,
580 Int32ConstArrayView destination)
581{
582 ARCANE_ASSERT((first_source.size()==destination.size()) && (second_source.size()==destination.size()),
583 ("Impossible to copy: source and destination of different sizes !"));
584 ArrayView<T> value = m_value->view();
585 const Integer size = first_source.size();
586 for(Integer i=0; i<size; ++i ) {
587 value[destination[i]] = (T)((value[first_source[i]]+value[second_source[i]])/2);
588 }
590}
591
592/*---------------------------------------------------------------------------*/
593/*---------------------------------------------------------------------------*/
594
597 Int32ConstArrayView second_source,
598 Int32ConstArrayView destination);
599
600/*---------------------------------------------------------------------------*/
601/*---------------------------------------------------------------------------*/
602
603template<typename T> void VariableArrayT<T>::
604compact(Int32ConstArrayView new_to_old_ids)
605{
606 if (isPartial()) {
607 debug(Trace::High) << "Skip compact for partial variable " << name();
608 return;
609 }
610
611 UniqueArray<T> old_value(constValueView());
612 Integer new_size = new_to_old_ids.size();
613 m_value->resize(new_size);
614 ArrayView<T> current_value = m_value->view();
615 if (arcaneIsCheck()){
616 for( Integer i=0; i<new_size; ++i )
617 current_value.setAt(i,old_value.at(new_to_old_ids[i]));
618 }
619 else{
620 for( Integer i=0; i<new_size; ++i )
621 RawCopy<T>::copy(current_value[i], old_value[ new_to_old_ids[i] ]); // current_value[i] = old_value[ new_to_old_ids[i] ];
622 }
624}
625
626/*---------------------------------------------------------------------------*/
627/*---------------------------------------------------------------------------*/
628
629template<typename T> void VariableArrayT<T>::
631{
633}
634
635/*---------------------------------------------------------------------------*/
636/*---------------------------------------------------------------------------*/
637
638template<typename T> void VariableArrayT<T>::
639setIsSynchronized(const ItemGroup& group)
640{
641 ARCANE_UNUSED(group);
642}
643
644/*---------------------------------------------------------------------------*/
645/*---------------------------------------------------------------------------*/
646
647template<typename T> void VariableArrayT<T>::
648_internalResize(const VariableResizeArgs& resize_args)
649{
650 Int32 new_size = resize_args.newSize();
651 Int32 nb_additional_element = resize_args.nbAdditionalCapacity();
652 bool use_no_init = resize_args.isUseNoInit();
653
654 auto* value_internal = m_value->_internal();
655
656 if (nb_additional_element!=0){
657 Integer capacity = value_internal->capacity();
658 if (new_size>capacity)
659 value_internal->reserve(new_size+nb_additional_element);
660 }
662 // Si la nouvelle taille est supérieure à l'ancienne,
663 // initialise les nouveaux éléments suivant
664 // la politique voulue
665 Integer current_size = m_value->view().size();
666 if (!isUsed()){
667 // Si la variable n'est plus utilisée, libérée la mémoire
668 // associée.
669 value_internal->dispose();
670 }
671 if (use_no_init)
672 value_internal->_internalDeprecatedValue().resizeNoInit(new_size);
673 else
674 value_internal->resize(new_size);
675 if (new_size>current_size){
676 if (init_policy==DIP_InitWithDefault){
677 ArrayView<T> values = this->valueView();
678 for(Integer i=current_size; i<new_size; ++i)
679 values[i] = T();
680 }
681 else{
682 bool use_nan = (init_policy==DIP_InitWithNan);
683 bool use_nan2 = (init_policy==DIP_InitInitialWithNanResizeWithDefault) && !_hasValidData();
684 if (use_nan || use_nan2){
685 ArrayView<T> view = this->valueView();
686 DataTypeTraitsT<T>::fillNan(view.subView(current_size,new_size-current_size));
687 }
688 }
689 }
690
691 // Compacte la mémoire si demandé
692 if (_wantShrink()){
693 if (m_value->view().size() < value_internal->capacity()){
694 value_internal->shrink();
695 }
696 }
697
698 // Controle si toutes les modifs après le dispose n'ont pas altéré l'état de l'allocation
699 // Dans le cas d'une variable non utilisée, la capacité max autorisée est
700 // égale à celle d'un vecteur Simd de la plateforme.
701 // (cela ne peut pas être 0 car la classe Array doit allouer au moins un
702 // élément si on utilise un allocateur spécifique ce qui est le cas
703 // pour les variables.
704 Int64 capacity = value_internal->capacity();
705 if ( !((isUsed() || capacity<=AlignedMemoryAllocator::simdAlignment())) )
706 ARCANE_FATAL("Wrong unused data size {0}",capacity);
707}
708
709/*---------------------------------------------------------------------------*/
710/*---------------------------------------------------------------------------*/
711
712template<typename DataType> void VariableArrayT<DataType>::
713resizeWithReserve(Integer n,Integer nb_additional)
714{
715 _resize(VariableResizeArgs(n,nb_additional));
716}
717
718/*---------------------------------------------------------------------------*/
719/*---------------------------------------------------------------------------*/
720
721template<typename DataType> void VariableArrayT<DataType>::
723{
724 m_value->_internal()->shrink();
726}
727
728/*---------------------------------------------------------------------------*/
729/*---------------------------------------------------------------------------*/
730
731template<typename DataType> Integer VariableArrayT<DataType>::
732capacity()
733{
734 return m_value->_internal()->capacity();
735}
736
737/*---------------------------------------------------------------------------*/
738/*---------------------------------------------------------------------------*/
739
740template<typename DataType> void VariableArrayT<DataType>::
741fill(const DataType& value)
742{
743 m_value->view().fill(value);
744}
745
746/*---------------------------------------------------------------------------*/
747/*---------------------------------------------------------------------------*/
748
749template<typename DataType> void VariableArrayT<DataType>::
750fill(const DataType& value,const ItemGroup& group)
751{
752 ARCANE_UNUSED(group);
753 this->fill(value);
754}
755
756/*---------------------------------------------------------------------------*/
757/*---------------------------------------------------------------------------*/
758
759template<typename DataType> void
761swapValues(ThatClass& rhs)
762{
763 _checkSwapIsValid(&rhs);
764 // TODO: regarder s'il faut que les deux variables aient le même nombre
765 // d'éléments mais a priori cela ne semble pas indispensable.
766 m_value->swapValues(rhs.m_value);
767 // Il faut mettre à jour les références pour cette variable et \a rhs.
768 syncReferences();
769 rhs.syncReferences();
770}
771
772/*---------------------------------------------------------------------------*/
773/*---------------------------------------------------------------------------*/
774
775// SDP: Specialisation
778 Int32ConstArrayView second_source,
779 Int32ConstArrayView destination)
780{
781 Integer dsize = destination.size();
782 bool is_ok = (first_source.size()==dsize) && (second_source.size()==dsize);
783 if (!is_ok)
784 ARCANE_FATAL("Unable to copy: source and destination of different sizes !");
785
786 ArrayView<String> value = m_value->view();
787 const Integer size = first_source.size();
788 for(Integer i=0; i<size; ++i )
789 value[destination[i]] = value[first_source[i]];
791}
792
793/*---------------------------------------------------------------------------*/
794/*---------------------------------------------------------------------------*/
795
796template<typename DataType> auto VariableArrayT<DataType>::
797value() -> ValueType&
798{
799 return m_value->_internal()->_internalDeprecatedValue();
800}
801
802/*---------------------------------------------------------------------------*/
803/*---------------------------------------------------------------------------*/
804
805ARCANE_INTERNAL_INSTANTIATE_TEMPLATE_FOR_NUMERIC_DATATYPE(VariableArrayT);
806template class VariableArrayT<String>;
807
808/*---------------------------------------------------------------------------*/
809/*---------------------------------------------------------------------------*/
810
811} // End namespace Arcane
812
813/*---------------------------------------------------------------------------*/
814/*---------------------------------------------------------------------------*/
#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'.
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 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.
Interface d'une variable.
Definition IVariable.h:56
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
Exception lorsqu'une opération n'est pas supportée.
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).
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.
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.
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.
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.