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