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