Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Array2Variable.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/* Array2Variable.cc (C) 2000-2025 */
9/* */
10/* Variable tableau 2D. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/Array2Variable.h"
15
16#include "arcane/utils/NotSupportedException.h"
17#include "arcane/utils/ArgumentException.h"
18#include "arcane/utils/FatalErrorException.h"
19#include "arcane/utils/TraceInfo.h"
20#include "arcane/utils/Ref.h"
21#include "arcane/utils/CheckedConvert.h"
22#include "arcane/utils/ArrayShape.h"
23#include "arcane/utils/ITraceMng.h"
24
25#include "arcane/datatype/DataTypeTraits.h"
26#include "arcane/datatype/DataStorageBuildInfo.h"
27
28#include "arcane/core/VariableDiff.h"
29#include "arcane/core/VariableBuildInfo.h"
30#include "arcane/core/VariableInfo.h"
31#include "arcane/core/IApplication.h"
32#include "arcane/core/IVariableMng.h"
33#include "arcane/core/IItemFamily.h"
34#include "arcane/core/IVariableSynchronizer.h"
35#include "arcane/core/IDataReader.h"
36#include "arcane/core/ItemGroup.h"
37#include "arcane/core/IParallelMng.h"
38#include "arcane/core/IDataFactoryMng.h"
39#include "arcane/core/IMesh.h"
40#include "arcane/core/VariableComparer.h"
41
42#include "arcane/core/internal/IDataInternal.h"
43#include "arcane/core/internal/IVariableMngInternal.h"
44#include "arcane/core/internal/IVariableInternal.h"
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
49namespace Arcane
50{
51
52/*---------------------------------------------------------------------------*/
53/*---------------------------------------------------------------------------*/
54
55template<class DataType>
57: public VariableDiff<DataType>
59 typedef VariableDataTypeTraitsT<DataType> VarDataTypeTraits;
61
62 public:
63
66 const VariableComparerArgs& compare_args)
67 {
68 const int max_print = compare_args.maxPrint();
69 const bool compare_ghost = compare_args.isCompareGhost();
70 ItemGroup group = var->itemGroup();
71 if (group.null())
72 return {};
73 IMesh* mesh = group.mesh();
74 if (!mesh)
75 return {};
76 ITraceMng* msg = mesh->traceMng();
77 IParallelMng* pm = mesh->parallelMng();
78
79 GroupIndexTable * group_index_table = (var->isPartial())?group.localIdToIndex().get():0;
80
81 int nb_diff = 0;
82 Int32 sid = pm->commRank();
83 Integer current_total_nb_element = current.totalNbElement();
84 /*if (ref.totalNbElement()!=current_total_nb_element){
85 msg->pinfo() << "Processeur: " << sid << " VDIFF: Variable '" << var->name()
86 << "'different number of elements "
87 << " current: " << current_total_nb_element
88 << " ref: " << ref.totalNbElement();
89 return current_total_nb_element;
90 }*/
91 if (current_total_nb_element==0)
92 return {};
93 Integer ref_size1 = ref.dim1Size();
94 Integer current_size1 = current.dim1Size();
95 Integer ref_size2 = ref.dim2Size();
96 Integer current_size2 = current.dim2Size();
97 if (ref_size2!=current_size2){
98 msg->pinfo() << "Processor: " << sid << " VDIFF: Variable '" << var->name()
99 << " bad dim2 size: ref=" << ref_size2 << " current=" << current_size2;
100 }
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
109 if (index>=ref_size1 || index>=current_size1){
110 ++nb_diff;
111 msg->pinfo() << "Processor: " << sid << " VDIFF: Variable '" << var->name()
112 << "wrong number of elements : impossible comparison";
113 continue;
114 }
115 ConstArrayView<DataType> lref = ref[index];
116 ConstArrayView<DataType> lcurrent = current[index];
117 for( Integer z=0; z<ref_size2; ++z ){
118 DataType diff = DataType();
119 DataType dref = lref[z];
120 DataType dcurrent = lcurrent[z];
121 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,true)){
122 this->m_diffs_info.add(DiffInfo(dcurrent,dref,diff,item,z));
123 ++nb_diff;
124 }
125 }
126 }
127 if (nb_diff!=0)
128 this->_sortAndDump(var,pm,max_print);
129
130 return VariableComparerResults(nb_diff);
131 }
132
133 VariableComparerResults
134 checkReplica(IVariable* var, ConstArray2View<DataType> var_values,
135 const VariableComparerArgs& compare_args)
136 {
137 IParallelMng* replica_pm = compare_args.replicaParallelMng();
138 ARCANE_CHECK_POINTER(replica_pm);
139 // Appelle la bonne spécialisation pour être certain que le type template possède
140 // la réduction.
141 using ReduceType = typename VariableDataTypeTraitsT<DataType>::HasReduceMinMax;
142 if constexpr(std::is_same<TrueType,ReduceType>::value)
143 return _checkReplica2(replica_pm, var, var_values, compare_args);
144
145 ARCANE_UNUSED(replica_pm);
146 ARCANE_UNUSED(var);
147 ARCANE_UNUSED(var_values);
148 ARCANE_UNUSED(compare_args);
149 throw NotSupportedException(A_FUNCINFO);
150 }
151
152 private:
153
154 VariableComparerResults
155 _checkReplica2(IParallelMng* pm, IVariable* var, ConstArray2View<DataType> var_values,
156 const VariableComparerArgs& compare_args)
157 {
158 const int max_print = compare_args.maxPrint();
159 ITraceMng* msg = pm->traceMng();
160 ItemGroup group = var->itemGroup();
161 //TODO: traiter les variables qui ne sont pas sur des éléments du maillage.
162 if (group.null())
163 return {};
164 GroupIndexTable * group_index_table = (var->isPartial())?group.localIdToIndex().get():0;
165 // Vérifie que tous les réplica ont le même nombre d'éléments dans chaque
166 // dimension pour la variable.
167 Integer total_nb_element = var_values.totalNbElement();
168 Integer ref_size1 = var_values.dim1Size();
169 Integer ref_size2 = var_values.dim2Size();
170
171 Integer a_min_dims[2];
172 ArrayView<Integer> min_dims(2,a_min_dims);
173 Integer a_max_dims[2];
174 ArrayView<Integer> max_dims(2,a_max_dims);
175 max_dims[0] = min_dims[0] = ref_size1;
176 max_dims[1] = min_dims[1] = ref_size2;
177
178 pm->reduce(Parallel::ReduceMax,max_dims);
179 pm->reduce(Parallel::ReduceMin,min_dims);
180 msg->info(4) << "Array2Variable::CheckReplica2 rep_size=" << pm->commSize() << " rank=" << pm->commRank();
181 if (max_dims[0]!=min_dims[0] || max_dims[1]!=min_dims[1]){
182 const String& var_name = var->name();
183 msg->info() << "Can not compare values on replica for variable '" << var_name << "'"
184 << " because the number of elements is not the same on all the replica "
185 << " min=" << min_dims[0] << "," << min_dims[1]
186 << " max="<< max_dims[0] << "," << max_dims[1];
187 return VariableComparerResults(total_nb_element);
188 }
189 if (total_nb_element==0)
190 return {};
191 Integer nb_diff = 0;
192 UniqueArray2<DataType> min_values(var_values);
193 UniqueArray2<DataType> max_values(var_values);
194 pm->reduce(Parallel::ReduceMax,max_values.viewAsArray());
195 pm->reduce(Parallel::ReduceMin,min_values.viewAsArray());
196
197 ENUMERATE_ITEM(i,group){
198 Item item = *i;
199 Integer index = item.localId();
200 if (group_index_table)
201 index = (*group_index_table)[index];
202
203 if (index>=ref_size1){
204 ++nb_diff;
205 msg->pinfo() << "Processor: " << msg->traceId() << " VDIFF: Variable '" << var->name()
206 << "wrong number of elements : impossible comparison";
207 continue;
208 }
209 ConstArrayView<DataType> lref = min_values[index];
210 ConstArrayView<DataType> lcurrent = max_values[index];
211 for( Integer z=0; z<ref_size2; ++z ){
212 DataType diff = DataType();
213 DataType dref = lref[z];
214 DataType dcurrent = lcurrent[z];
215 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,true)){
216 this->m_diffs_info.add(DiffInfo(dcurrent,dref,diff,item,z));
217 ++nb_diff;
218 }
219 }
220 }
221
222 if (nb_diff!=0)
223 this->_sortAndDump(var,pm,max_print);
224
225 return VariableComparerResults(nb_diff);
226 }
227
228};
229
230/*---------------------------------------------------------------------------*/
231/*---------------------------------------------------------------------------*/
232
233/*---------------------------------------------------------------------------*/
234/*---------------------------------------------------------------------------*/
235
236template<typename T> Array2VariableT<T>::
238: Variable(vb,info)
239, m_data(nullptr)
240{
241 IDataFactoryMng* df = vb.dataFactoryMng();
242 DataStorageBuildInfo storage_build_info(vb.traceMng());
243 String storage_full_type = info.storageTypeInfo().fullName();
244 Ref<IData> data = df->createSimpleDataRef(storage_full_type,storage_build_info);
245 m_data = dynamic_cast<ValueDataType*>(data.get());
246 _setData(makeRef(m_data));
247}
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
251
252template<typename T> Array2VariableT<T>* Array2VariableT<T>::
254{
255 if (vb.isNull())
256 return nullptr;
257 ThatClass* true_ptr = nullptr;
258 IVariableMng* vm = vb.variableMng();
259 IVariable* var = vm->checkVariable(vi);
260 if (var)
261 true_ptr = dynamic_cast<ThatClass*>(var);
262 else{
263 true_ptr = new ThatClass(vb,vi);
264 vm->_internalApi()->addVariable(true_ptr);
265 }
266 ARCANE_CHECK_PTR(true_ptr);
267 return true_ptr;
268}
269
270/*---------------------------------------------------------------------------*/
271/*---------------------------------------------------------------------------*/
272
273template<typename T> Array2VariableT<T>* Array2VariableT<T>::
275{
276 if (!var)
277 throw ArgumentException(A_FUNCINFO,"null variable");
278 ThatClass* true_ptr = dynamic_cast<ThatClass*>(var);
279 if (!true_ptr)
280 ARCANE_FATAL("Cannot build a reference from variable {0}",var->name());
281 return true_ptr;
282}
283
284/*---------------------------------------------------------------------------*/
285/*---------------------------------------------------------------------------*/
286
287template<typename T> void Array2VariableT<T>::
289{
290 /*info() << "RESIZE(1) " << fullName()
291 << " wanted_dim1_size=" << s
292 << " dim2_size=" << m_data->value().dim2Size()
293 << " total=" << m_data->value().totalNbElement();*/
294 m_data->_internal()->resizeOnlyDim1(s);
295 syncReferences();
296}
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300
301template<typename DataType> void Array2VariableT<DataType>::
302directResize(Integer dim1_size,Integer dim2_size)
303{
304 /*info() << "RESIZE(2) " << fullName()
305 << " wanted_dim1_size=" << dim1_size
306 << " wanted_dim2_size=" << dim2_size
307 << " total=" << m_data->value().totalNbElement()
308 << " dim1_size=" << m_data->value().dim1Size()
309 << " dim2_size=" << m_data->value().dim2Size();*/
310 m_data->_internal()->resize(dim1_size,dim2_size);
311 /*info() << "RESIZE(2) AFTER " << fullName()
312 << " total=" << m_data->value().totalNbElement()
313 << " dim1_size=" << m_data->value().dim1Size()
314 << " dim2_size=" << m_data->value().dim2Size()
315 << " addr=" << m_data->value().view().unguardedBasePointer();*/
316 syncReferences();
317}
318
319/*---------------------------------------------------------------------------*/
320/*---------------------------------------------------------------------------*/
321
322template<typename DataType> void Array2VariableT<DataType>::
324{
325 Int32 dim1_size = valueView().dim1Size();
326 Int32 dim2_size = CheckedConvert::toInt32(shape.totalNbElement());
327
328 m_data->_internal()->resize(dim1_size,dim2_size);
329 m_data->setShape(shape);
330
331 syncReferences();
332}
333
334/*---------------------------------------------------------------------------*/
335/*---------------------------------------------------------------------------*/
336
337template<typename DataType> void Array2VariableT<DataType>::
339{
340 m_data->_internal()->shrink();
342}
343
344/*---------------------------------------------------------------------------*/
345/*---------------------------------------------------------------------------*/
346
347template<typename T> void Array2VariableT<T>::
348print(std::ostream&) const
349{
350 //ConstArray2View<T> x(m_data->value().constView());
351 //arrayDumpValue(o,x);
352}
353
354/*---------------------------------------------------------------------------*/
355/*---------------------------------------------------------------------------*/
356
357template<typename T> void Array2VariableT<T>::
359{
360 if (itemKind()==IK_Unknown)
361 ARCANE_THROW(NotSupportedException,"variable '{0}' is not a mesh variable",fullName());
362 IItemFamily* family = itemGroup().itemFamily();
363 if (!family)
364 ARCANE_FATAL("variable '{0}' without family",fullName());
365 if(isPartial())
366 itemGroup().synchronizer()->synchronize(this);
367 else
368 family->allItemsSynchronizer()->synchronize(this);
369}
370
371/*---------------------------------------------------------------------------*/
372/*---------------------------------------------------------------------------*/
373
374template<typename T> void Array2VariableT<T>::
376{
377 if (itemKind()==IK_Unknown)
378 ARCANE_THROW(NotSupportedException,"variable '{0}' is not a mesh variable",fullName());
379 IItemFamily* family = itemGroup().itemFamily();
380 if (!family)
381 ARCANE_FATAL("variable '{0}' without family",fullName());
382 if(isPartial())
383 itemGroup().synchronizer()->synchronize(this, local_ids);
384 else
385 family->allItemsSynchronizer()->synchronize(this, local_ids);
386}
387
388/*---------------------------------------------------------------------------*/
389/*---------------------------------------------------------------------------*/
390
391template<typename T> Real Array2VariableT<T>::
392allocatedMemory() const
393{
394 Real v1 = static_cast<Real>(sizeof(T));
395 Real v2 = static_cast<Real>(m_data->view().totalNbElement());
396 return v1*v2;
397}
398
399/*---------------------------------------------------------------------------*/
400/*---------------------------------------------------------------------------*/
401// Utilise une fonction Helper afin de spécialiser l'appel dans le
402// cas du type 'Byte' car ArrayVariableDiff::checkReplica() utilise
403// une réduction Min/Max et cela n'existe pas en MPI pour le type Byte.
404namespace
405{
406 template <typename T> VariableComparerResults
407 _checkIfSameOnAllReplicaHelper(IVariable* var, ConstArray2View<T> values,
408 const VariableComparerArgs& compare_args)
409 {
411 return csa.checkReplica(var, values, compare_args);
412 }
413
414 // Spécialisation pour le type 'Byte' qui ne supporte pas les réductions.
415 VariableComparerResults
416 _checkIfSameOnAllReplicaHelper(IVariable* var, ConstArray2View<Byte> values,
417 const VariableComparerArgs& compare_args)
418 {
419 Integer dim1_size = values.dim1Size();
420 Integer dim2_size = values.dim2Size();
421 UniqueArray2<Integer> int_values(dim1_size,dim2_size);
422 for( Integer i=0; i<dim1_size; ++i )
423 for( Integer j=0; j<dim2_size; ++j )
424 int_values[i][j] = values[i][j];
425 Array2VariableDiff<Integer> csa;
426 return csa.checkReplica(var, int_values, compare_args);
427 }
428}
429
430/*---------------------------------------------------------------------------*/
431/*---------------------------------------------------------------------------*/
432
434_compareVariable(const VariableComparerArgs& compare_args)
435{
436 switch (compare_args.compareMode()) {
438 if (itemKind() == IK_Particle)
439 return {};
440 IDataReader* reader = compare_args.dataReader();
441 ARCANE_CHECK_POINTER(reader);
442
443 ConstArray2View<T> from_array(valueView());
444 Ref<IArray2DataT<T>> ref_data(m_data->cloneTrueEmptyRef());
445 reader->read(this, ref_data.get());
446
448 VariableComparerResults r = csa.check(this, ref_data->view(), from_array, compare_args);
449 return r;
450 } break;
452 IItemFamily* family = itemGroup().itemFamily();
453 if (!family)
454 return {};
455
456 Integer dim1_size = valueView().dim1Size();
457 if (dim1_size == 0)
458 return {};
459
460 ValueType& data_values = m_data->_internal()->_internalDeprecatedValue();
461
462 UniqueArray2<T> ref_array(constValueView());
463 this->synchronize(); // fonctionne pour toutes les variables
465 Array2View<T> from_array(valueView());
466 VariableComparerResults results = csa.check(this, ref_array, from_array, compare_args);
467 data_values.copy(ref_array);
468 return results;
469 }
471 VariableComparerResults r = _checkIfSameOnAllReplicaHelper(this, constValueView(), compare_args);
472 return r;
473 }
474 }
475 ARCANE_FATAL("Invalid value for compare mode '{0}'", (int)compare_args.compareMode());
476}
477
478/*---------------------------------------------------------------------------*/
479/*---------------------------------------------------------------------------*/
480
481template<typename T> void Array2VariableT<T>::
482_internalResize(const VariableResizeArgs& resize_args)
483{
484 Int32 new_size = resize_args.newSize();
485 Int32 nb_additional_element = resize_args.nbAdditionalCapacity();
486 bool use_no_init = resize_args.isUseNoInit();
487
488 // Exception deplace de ItemGroupImpl::removeItems.
489 // C'est un probleme d'implementation des variables partielles Arcane et non
490 // du concept de variable partielle (cf ItemGroupMap qui l'implemente).
491 // if (isPartial() && new_size < value().dim1Size())
492 // throw NotSupportedException(A_FUNCINFO,"Cannot remove items to group with partial variables");
493
494 ValueType& data_values = m_data->_internal()->_internalDeprecatedValue();
495 ValueType& container_ref = data_values;
496
497 Integer dim2_size = data_values.dim2Size();
498
499 if (nb_additional_element!=0){
500 Integer capacity = data_values.capacity();
501 if (new_size>capacity)
502 data_values.reserve(new_size+nb_additional_element*dim2_size);
503 }
504
506 // Si la nouvelle taille est supérieure à l'ancienne,
507 // initialise les nouveaux éléments suivant
508 // la politique voulue
509 Integer current_size = data_values.dim1Size();
510
511 /*info() << "RESIZE INTERNAL " << fullName()
512 << " wanted_dim1_size=" << new_size
513 << " dim1_size=" << value().dim1Size()
514 << " dim2size=" << dim2_size
515 << " total=" << value().totalNbElement();*/
516 if (use_no_init || (init_policy!=DIP_InitWithDefault))
517 data_values.resizeNoInit(new_size,dim2_size);
518 else
519 data_values.resize(new_size,dim2_size);
520
521 if (new_size>current_size){
522 bool use_nan = (init_policy==DIP_InitWithNan);
523 bool use_nan2 = (init_policy==DIP_InitInitialWithNanResizeWithDefault) && !_hasValidData();
524 if (use_nan || use_nan2){
525 for( Integer i=current_size; i<new_size; ++i )
526 DataTypeTraitsT<T>::fillNan(data_values[i]);
527 }
528 }
529
530 // Compacte la mémoire si demandé
531 if (_wantShrink()){
532 if (container_ref.totalNbElement() < container_ref.capacity())
533 container_ref.shrink();
534 }
535
536 /*info() << "RESIZE INTERNAL AFTER " << fullName()
537 << " addr=" << m_data->value().view().unguardedBasePointer()
538 << " dim1=" << value().dim1Size()
539 << " dim2=" << value().dim2Size();*/
540}
541
542/*---------------------------------------------------------------------------*/
543/*---------------------------------------------------------------------------*/
544
545template<typename T> void Array2VariableT<T>::
547{
548 ARCANE_ASSERT(source.size()==destination.size(),
549 ("Unable to copy: source and destination have different sizes !"));
550
551 const Integer dim2_size = valueView().dim2Size();
552 const Integer nb_copy = source.size();
553 Array2View<T> value = m_data->view();
554
555 for( Integer i=0; i<nb_copy; ++i ){
556 for( Integer j=0; j<dim2_size; ++j )
557 value[destination[i]][j] = value[source[i]][j];
558 }
560}
561
562/*---------------------------------------------------------------------------*/
563/*---------------------------------------------------------------------------*/
564
565template<typename T> void Array2VariableT<T>::
567 Int32ConstArrayView second_source,
568 Int32ConstArrayView destination)
569{
570 ARCANE_ASSERT((first_source.size()==destination.size()) && (second_source.size()==destination.size()),
571 ("Unable to copy: source and destination have different sizes !"));
572
573 const Integer dim2_size = valueView().dim2Size();
574 const Integer nb_copy = first_source.size();
575 Array2View<T> value = m_data->view();
576
577 for( Integer i=0; i<nb_copy; ++i ){
578 for( Integer j=0; j<dim2_size; ++j )
579 value[destination[i]][j] = (T)((value[first_source[i]][j]+value[second_source[i]][j])/2);
580 }
582}
583
584/*---------------------------------------------------------------------------*/
585/*---------------------------------------------------------------------------*/
586
587template<typename T> void Array2VariableT<T>::
588compact(Int32ConstArrayView new_to_old_ids)
589{
590 if (isPartial()) {
591 debug(Trace::High) << "Skip compact for partial variable " << name();
592 return;
593 }
594
595 ValueType& current_value = m_data->_internal()->_internalDeprecatedValue();
596 Integer current_size = current_value.dim1Size();
597 if (current_size==0)
598 return;
599
600 Integer dim2_size = current_value.dim2Size();
601 if (dim2_size==0)
602 return;
603
604 //TODO: eviter le clone
605 UniqueArray2<T> old_value(current_value);
606
607 Integer new_size = new_to_old_ids.size();
608 current_value.resize(new_size,dim2_size);
609 /*info() << "Variable: " << name() << " Compacte2D: size=" << current_size
610 << " dim2_size=" << dim2_size
611 << " new_size=" << new_size;*/
612
613 if (arcaneIsCheck()){
614 for( Integer i=0; i<new_size; ++i ){
615 Integer nto = new_to_old_ids[i];
616 ArrayView<T> v = current_value.at(i);
617 ArrayView<T> ov = old_value.at(nto);
618 for( Integer j=0; j<dim2_size; ++j )
619 v.setAt(j,ov.at(j));
620 }
621 }
622 else{
623 for( Integer i=0; i<new_size; ++i ){
624 Integer nto = new_to_old_ids[i];
625 for( Integer j=0; j<dim2_size; ++j )
626 current_value[i][j] = old_value[nto][j];
627 }
628 }
629
631}
632
633/*---------------------------------------------------------------------------*/
634/*---------------------------------------------------------------------------*/
635
636template<typename T> void Array2VariableT<T>::
638{
639}
640
641/*---------------------------------------------------------------------------*/
642/*---------------------------------------------------------------------------*/
643
644template<typename T> void Array2VariableT<T>::
646{
647}
648
649/*---------------------------------------------------------------------------*/
650/*---------------------------------------------------------------------------*/
651
652template<typename DataType> void
654swapValues(ThatClass& rhs)
655{
656 _checkSwapIsValid(&rhs);
657 // TODO: regarder s'il faut que les deux variables aient le même nombre
658 // d'éléments mais a priori cela ne semble pas indispensable.
659 m_data->swapValues(rhs.m_data);
660 // Il faut mettre à jour les références pour cette variable et \a rhs.
661 syncReferences();
662 rhs.syncReferences();
663}
664
665/*---------------------------------------------------------------------------*/
666/*---------------------------------------------------------------------------*/
667
668template<typename DataType> auto
669Array2VariableT<DataType>::
670value() -> ValueType&
671{
672 return m_data->_internal()->_internalDeprecatedValue();
673}
674
675/*---------------------------------------------------------------------------*/
676/*---------------------------------------------------------------------------*/
677
678template<typename DataType> void
680fillShape(ArrayShape& shape_with_item)
681{
682 // TODO: Cette méthode est indépendante du type de donnée.
683 // Il faudrait pouvoir en faire une seule version.
684 ArrayShape shape = m_data->shape();
685 const Int32 nb_rank = shape_with_item.nbDimension();
686 //std::cout << "SHAPE=" << shape.dimensions() << " internal_rank=" << nb_rank << "\n";
687 auto array_view = m_data->view();
688 Int32 dim0_size = array_view.dim1Size();
689
690 shape_with_item.setDimension(0, dim0_size);
691 Int32 nb_orig_shape = shape.nbDimension();
692 for (Int32 i = 0; i < nb_orig_shape; ++i) {
693 shape_with_item.setDimension(i + 1, shape.dimension(i));
694 }
695
696 // Si la forme est plus petite que notre rang, remplit les dimensions
697 // supplémentaires par la valeur 1.
698 for (Int32 i = (nb_orig_shape + 1); i < nb_rank; ++i) {
699 shape_with_item.setDimension(i, 1);
700 }
701}
702
703/*---------------------------------------------------------------------------*/
704/*---------------------------------------------------------------------------*/
705
706/*---------------------------------------------------------------------------*/
707/*---------------------------------------------------------------------------*/
708
709ARCANE_INTERNAL_INSTANTIATE_TEMPLATE_FOR_NUMERIC_DATATYPE(Array2VariableT);
710
711/*---------------------------------------------------------------------------*/
712/*---------------------------------------------------------------------------*/
713
714} // End namespace Arcane
715
716/*---------------------------------------------------------------------------*/
717/*---------------------------------------------------------------------------*/
#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.
Exception lorsqu'un argument est invalide.
VariableComparerResults _compareVariable(const VariableComparerArgs &compare_args) final
Comparaison de valeurs entre variables.
void compact(Int32ConstArrayView old_to_new_ids) override
Compacte les valeurs de la variable.
void setIsSynchronized() override
Indique que la variable est synchronisée.
Array2VariableT(const VariableBuildInfo &v, const VariableInfo &vi)
Construit une variable basée sur la référence v.
IData * data() override
Données associées à la variable.
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 copyItemsValues(Int32ConstArrayView source, Int32ConstArrayView destination) override
Copie les valeurs des entités numéros source dans les entités numéro destination.
void synchronize() override
Synchronise la variable.
Real allocatedMemory() const override
Taille mémoire (en Koctet) utilisée par la variable.
void print(std::ostream &o) const override
Imprime les valeurs de la variable sur le flot o.
void shrinkMemory() override
Libère l'éventuelle mémoire supplémentaire allouée pour les données.
Vue modifiable pour un tableau 2D.
void copy(Span2< const DataType > rhs)
Redimensionne l'instance à partir des dimensions de rhs et copie dedans les valeurs de rhs.
void resize(Int64 new_size)
Redimensionne uniquement la première dimension en laissant la deuxième à l'identique.
ConstArrayView< DataType > at(Int64 i) const
Elément d'indice i. Vérifie toujours les débordements.
Forme d'un tableau.
Definition ArrayShape.h:40
Vue modifiable d'un tableau d'un 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.
Interface du gestionnaire de variables.
virtual IVariable * checkVariable(const VariableInfo &infos)=0
Vérifie une variable.
virtual IVariableMngInternal * _internalApi()=0
API interne à Arcane.
virtual void synchronize(IVariable *var)=0
Synchronise la variable var en mode bloquant.
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
SharedPtrT< GroupIndexTable > localIdToIndex() const
Table des local ids vers une position pour toutes les entités du groupe.
Definition ItemGroup.h:292
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
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.
Vecteur de données 2D avec sémantique par valeur (style STL).
Paramètres nécessaires à la construction d'une variable.
Arguments des méthodes de VariableComparer.
Résultats d'une opération de comparaison.
Infos caractérisant une variable.
IMesh * mesh() const final
Maillage auquel est associé la variable.
Definition Variable.cc:815
Variable(const VariableBuildInfo &v, const VariableInfo &vi)
Créé une variable lié à la référence v.
Definition Variable.cc:335
void _setData(const Ref< IData > &data)
Positionne la donnée.
Definition Variable.cc:889
bool isPartial() const override
Indique si la variable est partielle.
Definition Variable.cc:871
String name() const final
Nom de la variable.
Definition Variable.cc:475
ItemGroup itemGroup() const final
Groupe du maillage associé.
Definition Variable.cc:835
void syncReferences() override
Synchronise les références.
Definition Variable.cc:749
String fullName() const final
Nom complet de la variable (avec le préfixe de la famille)
Definition Variable.cc:484
eItemKind itemKind() const override
Type des entités du maillage sur lequel repose la variable.
Definition Variable.cc:844
void resize(Integer n) override
Positionne le nombre d'éléments pour une variable tableau.
Definition Variable.cc:983
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
@ 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
eDataInitialisationPolicy getGlobalDataInitialisationPolicy()
Récupère la politique d'initialisation des variables.
Definition DataTypes.cc:162
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569
@ SameReplica
Vérifie que les valeurs de la variable sont les même sur tous les replica.
@ Same
Compare avec une référence.
@ Sync
Vérifie que la variable est bien synchronisée.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
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.