Arcane  4.2.1.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-2026 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-2026 */
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#include "arccore/common/AlignedMemoryAllocator.h"
22
23#include "arcane/core/VariableDiff.h"
24#include "arcane/core/VariableBuildInfo.h"
25#include "arcane/core/VariableInfo.h"
26#include "arcane/core/IApplication.h"
27#include "arcane/core/IVariableMng.h"
28#include "arcane/core/IItemFamily.h"
29#include "arcane/core/IVariableSynchronizer.h"
30#include "arcane/core/IDataReader.h"
31#include "arcane/core/ItemGroup.h"
32#include "arcane/core/IDataFactoryMng.h"
33#include "arcane/core/IParallelMng.h"
34#include "arcane/core/IMesh.h"
35#include "arcane/core/VariableComparer.h"
36
37#include "arcane/core/datatype/DataTracer.h"
38#include "arcane/core/datatype/DataTypeTraits.h"
39#include "arcane/core/datatype/DataStorageBuildInfo.h"
40
41#include "arcane/core/VariableArray.h"
42#include "arcane/core/RawCopy.h"
43
44#include "arcane/core/internal/IDataInternal.h"
45#include "arcane/core/internal/IVariableMngInternal.h"
46#include "arcane/core/internal/IVariableInternal.h"
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
50
51namespace Arcane
52{
53
54/*---------------------------------------------------------------------------*/
55/*---------------------------------------------------------------------------*/
56
57template <class DataType>
59: public VariableDiff<DataType>
60{
61 using VarDataTypeTraits = VariableDataTypeTraitsT<DataType>;
62 using DiffInfo = typename VariableDiff<DataType>::DiffInfo;
63 static constexpr bool IsNumeric = std::is_same_v<typename VarDataTypeTraits::IsNumeric, TrueType>;
64 using NormType = typename VarDataTypeTraits::NormType;
65
66 public:
67
70 const VariableComparerArgs& compare_args)
71 {
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, compare_args);
159
160 return VariableComparerResults(nb_diff);
161 }
162
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
186 _checkAsArray(IVariable* var, ConstArrayView<DataType> ref, ConstArrayView<DataType> current,
187 const VariableComparerArgs& compare_args)
188 {
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, compare_args);
246
247 return VariableComparerResults(nb_diff);
248 }
249
251 _checkReplica2(IParallelMng* pm, IVariable* var, ConstArrayView<DataType> var_values,
252 const VariableComparerArgs& compare_args)
253 {
254 ITraceMng* msg = pm->traceMng();
255 Integer size = var_values.size();
256 // Vérifie que tous les réplica ont le même nombre d'éléments pour la variable.
257 Integer max_size = pm->reduce(Parallel::ReduceMax, size);
258 Integer min_size = pm->reduce(Parallel::ReduceMin, size);
259 msg->info(5) << "CheckReplica2 rep_size=" << pm->commSize() << " rank=" << pm->commRank();
260 if (max_size != min_size) {
261 const String& var_name = var->name();
262 msg->info() << "Can not compare values on replica for variable '" << var_name << "'"
263 << " because the number of elements is not the same on all the replica "
264 << " min=" << min_size << " max=" << max_size;
265 return VariableComparerResults(max_size);
266 }
267 Integer nb_diff = 0;
268 UniqueArray<DataType> min_values(var_values);
269 UniqueArray<DataType> max_values(var_values);
270 pm->reduce(Parallel::ReduceMax, max_values);
271 pm->reduce(Parallel::ReduceMin, min_values);
272
273 for (Integer index = 0; index < size; ++index) {
274 DataType diff = DataType();
275 DataType min_val = min_values[index];
276 DataType max_val = max_values[index];
277 if (VarDataTypeTraits::verifDifferent(min_val, max_val, diff, true)) {
278 this->m_diffs_info.add(DiffInfo(min_val, max_val, diff, index, NULL_ITEM_ID));
279 ++nb_diff;
280 }
281 }
282 if (nb_diff != 0)
283 this->_sortAndDump(var, pm, compare_args);
284
285 return VariableComparerResults(nb_diff);
286 }
287 bool _computeDifference(const DataType& dref, const DataType& dcurrent, DataType& diff,
288 const NormType& local_norm_max,
290 {
291 bool is_diff = false;
292 switch (diff_method) {
294 is_diff = VarDataTypeTraits::verifDifferent(dref, dcurrent, diff, true);
295 break;
297 is_diff = VarDataTypeTraits::verifDifferentNorm(dref, dcurrent, diff, local_norm_max, true);
298 break;
299 }
300 return is_diff;
301 }
302};
303
304/*---------------------------------------------------------------------------*/
305/*---------------------------------------------------------------------------*/
306
307/*---------------------------------------------------------------------------*/
308/*---------------------------------------------------------------------------*/
309
310template <typename T> VariableArrayT<T>::
312: Variable(vb, info)
313, m_value(nullptr)
314{
315 IDataFactoryMng* df = vb.dataFactoryMng();
316 DataStorageBuildInfo storage_build_info(vb.traceMng());
317 String storage_full_type = info.storageTypeInfo().fullName();
318 Ref<IData> data = df->createSimpleDataRef(storage_full_type, storage_build_info);
319 m_value = dynamic_cast<ValueDataType*>(data.get());
320 ARCANE_CHECK_POINTER(m_value);
321 _setData(makeRef(m_value));
322}
323
324/*---------------------------------------------------------------------------*/
325/*---------------------------------------------------------------------------*/
326
327template <typename T> VariableArrayT<T>::
329{
330}
331
332/*---------------------------------------------------------------------------*/
333/*---------------------------------------------------------------------------*/
334
335template <typename T> VariableArrayT<T>* VariableArrayT<T>::
336getReference(const VariableBuildInfo& vb, const VariableInfo& vi)
337{
338 if (vb.isNull())
339 return nullptr;
340 ThatClass* true_ptr = nullptr;
341 IVariableMng* vm = vb.variableMng();
342 IVariable* var = vm->checkVariable(vi);
343 if (var)
344 true_ptr = dynamic_cast<ThatClass*>(var);
345 else {
346 true_ptr = new ThatClass(vb, vi);
347 vm->_internalApi()->addVariable(true_ptr);
348 }
349 ARCANE_CHECK_PTR(true_ptr);
350 return true_ptr;
351}
352
353/*---------------------------------------------------------------------------*/
354/*---------------------------------------------------------------------------*/
355
356template <typename T> VariableArrayT<T>* VariableArrayT<T>::
358{
359 if (!var)
360 throw ArgumentException(A_FUNCINFO, "null variable");
361 auto* true_ptr = dynamic_cast<ThatClass*>(var);
362 if (!true_ptr)
363 ARCANE_FATAL("Can not build a reference from variable {0}", var->name());
364 return true_ptr;
365}
366
367/*---------------------------------------------------------------------------*/
368/*---------------------------------------------------------------------------*/
369
370template <typename T> void VariableArrayT<T>::
371print(std::ostream& o) const
372{
373 ConstArrayView<T> x(m_value->view());
374 Integer size = x.size();
375 o << "(dimension=" << size << ") ";
376 if (size <= 150) {
377 for (auto& i : x) {
378 o << i << '\n';
379 }
380 }
381}
382
383/*---------------------------------------------------------------------------*/
384/*---------------------------------------------------------------------------*/
385
386template <typename T> void VariableArrayT<T>::
388{
389 if (itemKind() == IK_Unknown)
390 ARCANE_THROW(NotSupportedException, "variable '{0}' is not a mesh variable", fullName());
391 IItemFamily* family = itemGroup().itemFamily();
392 if (!family)
393 ARCANE_FATAL("variable '{0}' without family", fullName());
394 if (isPartial())
395 itemGroup().synchronizer()->synchronize(this);
396 else
397 family->allItemsSynchronizer()->synchronize(this);
398}
399
400/*---------------------------------------------------------------------------*/
401/*---------------------------------------------------------------------------*/
402
403template <typename T> void VariableArrayT<T>::
405{
406 if (itemKind() == IK_Unknown)
407 ARCANE_THROW(NotSupportedException, "variable '{0}' is not a mesh variable", fullName());
408 IItemFamily* family = itemGroup().itemFamily();
409 if (!family)
410 ARCANE_FATAL("variable '{0}' without family", fullName());
411 if (isPartial())
412 itemGroup().synchronizer()->synchronize(this, local_ids);
413 else
414 family->allItemsSynchronizer()->synchronize(this, local_ids);
415}
416
417/*---------------------------------------------------------------------------*/
418/*---------------------------------------------------------------------------*/
419
420template <typename T> Real VariableArrayT<T>::
421allocatedMemory() const
422{
423 Real v1 = (Real)(sizeof(T));
424 Real v2 = (Real)(m_value->view().size());
425 return v1 * v2;
426}
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} // namespace
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
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 "
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 de copier : les tailles de la source et de la destination sont différentes !"));
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 de copier : les tailles de la source et de la destination sont différentes !"));
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) << "Ignorer la compaction pour la variable partielle " << 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 //const bool is_collective_allocator = value_internal->memoryAllocator().isCollectiveAllocator();
657 const bool is_collective_allocator = value_internal->_internalDeprecatedValue().allocator()->isCollective();
658 if (is_collective_allocator) {
659 value_internal->reserve(new_size + nb_additional_element);
660 }
661 else if (nb_additional_element != 0) {
662 Integer capacity = value_internal->capacity();
663 if (new_size > capacity)
664 value_internal->reserve(new_size + nb_additional_element);
665 }
667 // Si la nouvelle taille est supérieure à l'ancienne,
668 // initialise les nouveaux éléments suivant
669 // la politique voulue
670 Integer current_size = m_value->view().size();
671 if (!isUsed()) {
672 // Si la variable n'est plus utilisée, libérée la mémoire
673 // associée.
674 value_internal->dispose();
675 }
676 if (use_no_init)
677 value_internal->_internalDeprecatedValue().resizeNoInit(new_size);
678 else
679 value_internal->resize(new_size);
680 if (new_size > current_size) {
681 if (init_policy == DIP_InitWithDefault) {
682 ArrayView<T> values = this->valueView();
683 for (Integer i = current_size; i < new_size; ++i)
684 values[i] = T();
685 }
686 else {
687 bool use_nan = (init_policy == DIP_InitWithNan);
688 bool use_nan2 = (init_policy == DIP_InitInitialWithNanResizeWithDefault) && !_hasValidData();
689 if (use_nan || use_nan2) {
690 ArrayView<T> view = this->valueView();
691 DataTypeTraitsT<T>::fillNan(view.subView(current_size, new_size - current_size));
692 }
693 }
694 }
695
696 // Compacte la mémoire si demandé
697 if (_wantShrink()) {
698 if (m_value->view().size() < value_internal->capacity()) {
699 value_internal->shrink();
700 }
701 }
702
703 // Controle si toutes les modifs après le dispose n'ont pas altéré l'état de l'allocation
704 // Dans le cas d'une variable non utilisée, la capacité max autorisée est
705 // égale à celle d'un vecteur Simd de la plateforme.
706 // (cela ne peut pas être 0 car la classe Array doit allouer au moins un
707 // élément si on utilise un allocateur spécifique ce qui est le cas
708 // pour les variables.
709 Int64 capacity = value_internal->capacity();
710 if (!((isUsed() || capacity <= AlignedMemoryAllocator::simdAlignment())))
711 ARCANE_FATAL("Wrong unused data size {0}", capacity);
712}
713
714/*---------------------------------------------------------------------------*/
715/*---------------------------------------------------------------------------*/
716
717template <typename DataType> void VariableArrayT<DataType>::
718resizeWithReserve(Integer n, Integer nb_additional)
719{
720 _resize(VariableResizeArgs(n, nb_additional));
721}
722
723/*---------------------------------------------------------------------------*/
724/*---------------------------------------------------------------------------*/
725
726template <typename DataType> void VariableArrayT<DataType>::
728{
729 m_value->_internal()->shrink();
731}
732
733/*---------------------------------------------------------------------------*/
734/*---------------------------------------------------------------------------*/
735
736template <typename DataType> Integer VariableArrayT<DataType>::
737capacity()
738{
739 return m_value->_internal()->capacity();
740}
741
742/*---------------------------------------------------------------------------*/
743/*---------------------------------------------------------------------------*/
744
745template <typename DataType> void VariableArrayT<DataType>::
746fill(const DataType& value)
747{
748 m_value->view().fill(value);
749}
750
751/*---------------------------------------------------------------------------*/
752/*---------------------------------------------------------------------------*/
753
754template <typename DataType> void VariableArrayT<DataType>::
755fill(const DataType& value, const ItemGroup& group)
756{
757 ARCANE_UNUSED(group);
758 this->fill(value);
759}
760
761/*---------------------------------------------------------------------------*/
762/*---------------------------------------------------------------------------*/
763
764template <typename DataType> void
766swapValues(ThatClass& rhs)
767{
768 _checkSwapIsValid(&rhs);
769 // TODO: regarder s'il faut que les deux variables aient le même nombre
770 // d'éléments mais a priori cela ne semble pas indispensable.
771 m_value->swapValues(rhs.m_value);
772 // Il faut mettre à jour les références pour cette variable et \a rhs.
773 syncReferences();
774 rhs.syncReferences();
775}
776
777/*---------------------------------------------------------------------------*/
778/*---------------------------------------------------------------------------*/
779
780// SDP: Specialisation
783 Int32ConstArrayView second_source,
784 Int32ConstArrayView destination)
785{
786 Integer dsize = destination.size();
787 bool is_ok = (first_source.size() == dsize) && (second_source.size() == dsize);
788 if (!is_ok)
789 ARCANE_FATAL("Unable to copy: source and destination of different sizes !");
790
791 ArrayView<String> value = m_value->view();
792 const Integer size = first_source.size();
793 for (Integer i = 0; i < size; ++i)
794 value[destination[i]] = value[first_source[i]];
796}
797
798/*---------------------------------------------------------------------------*/
799/*---------------------------------------------------------------------------*/
800
801template <typename DataType> auto VariableArrayT<DataType>::
802value() -> ValueType&
803{
804 return m_value->_internal()->_internalDeprecatedValue();
805}
806
807/*---------------------------------------------------------------------------*/
808/*---------------------------------------------------------------------------*/
809
810ARCANE_INTERNAL_INSTANTIATE_TEMPLATE_FOR_NUMERIC_DATATYPE(VariableArrayT);
811template class VariableArrayT<String>;
812
813/*---------------------------------------------------------------------------*/
814/*---------------------------------------------------------------------------*/
815
816} // End namespace Arcane
817
818/*---------------------------------------------------------------------------*/
819/*---------------------------------------------------------------------------*/
#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:34
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 ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface du gestionnaire de traces.
virtual TraceMessage pinfo()=0
Flot pour un message d'information parallèle.
virtual TraceMessage info()=0
Flot pour un message d'information.
virtual IParallelMng * replicaParallelMng() const =0
Retourne le IParallelMng du replica du maillage associé à la variable.
virtual IParallelMng * parallelMng() const =0
Gestionnaire de parallélisme associé
virtual IVariable * checkVariable(const VariableInfo &infos)=0
Vérifie une variable.
virtual void synchronize(IVariable *var)=0
Synchronise la variable var en mode bloquant.
Interface d'une variable.
Definition IVariable.h:39
virtual eItemKind itemKind() const =0
Genre des entités du maillage sur lequel repose la variable.
virtual bool isPartial() const =0
Indique si la variable est partielle.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual String name() const =0
Nom de la variable.
virtual IVariableInternal * _internalApi()=0
API interne à Arcane.
virtual IVariableMng * variableMng() const =0
Gestionnaire de variable associé à la variable.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
const String & name() const
Nom du groupe.
Definition ItemGroup.h:76
SharedPtrT< GroupIndexTable > localIdToIndex() const
Table des local ids vers une position pour toutes les entités du groupe.
Definition ItemGroup.h: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
constexpr 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.
InstanceType * get() const
Instance associée ou nullptr si aucune.
Référence à une instance.
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.
Variable(const VariableBuildInfo &v, const VariableInfo &vi)
Créé une variable lié à la référence v.
Definition Variable.cc:345
void _setData(const Ref< IData > &data)
Positionne la donnée.
Definition Variable.cc:921
bool isPartial() const override
Indique si la variable est partielle.
Definition Variable.cc:903
IVariableMng * variableMng() const override
Gestionnaire de variable associé à la variable.
Definition Variable.cc:476
String name() const final
Nom de la variable.
Definition Variable.cc:485
ItemGroup itemGroup() const final
Groupe du maillage associé.
Definition Variable.cc:867
void syncReferences() override
Synchronise les références.
Definition Variable.cc:789
String fullName() const final
Nom complet de la variable (avec le préfixe de la famille).
Definition Variable.cc:494
eItemKind itemKind() const override
Genre des entités du maillage sur lequel repose la variable.
Definition Variable.cc:876
IItemFamily * itemFamily() const final
Famille d'entité associée.
Definition Variable.cc:912
eDataType dataType() const override
Type de la donnée gérée par la variable (Real, Integer, ...).
Definition Variable.cc:530
void fill(MutableMemoryView destination, ConstMemoryView source, const RunQueue *run_queue=nullptr)
Remplit une zone mémoire avec une valeur.
@ 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:480
@ 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.