14#include "arcane/core/Array2Variable.h"
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"
25#include "arcane/datatype/DataTypeTraits.h"
26#include "arcane/datatype/DataStorageBuildInfo.h"
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"
41#include "arcane/core/internal/IDataInternal.h"
42#include "arcane/core/internal/IVariableMngInternal.h"
43#include "arcane/core/internal/IVariableInternal.h"
54template<
class DataType>
64 int max_print,
bool compare_ghost)
79 Integer current_total_nb_element = current.totalNbElement();
87 if (current_total_nb_element==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();
93 if (ref_size2!=current_size2){
94 msg->
pinfo() <<
"Processor: " << sid <<
" VDIFF: Variable '" << var->
name()
95 <<
" bad dim2 size: ref=" << ref_size2 <<
" current=" << current_size2;
98 const Item& item = *i;
99 if (!item.
isOwn() && !compare_ghost)
101 Integer index = item.
localId();
102 if (group_index_table)
103 index = (*group_index_table)[index];
105 if (index>=ref_size1 || index>=current_size1){
107 msg->
pinfo() <<
"Processor: " << sid <<
" VDIFF: Variable '" << var->
name()
108 <<
"wrong number of elements : impossible comparison";
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));
124 this->_sortAndDump(var,pm,max_print);
135 if constexpr(std::is_same<TrueType,ReduceType>::value)
136 return _checkReplica2(pm,var,var_values,max_print);
140 ARCANE_UNUSED(var_values);
141 ARCANE_UNUSED(max_print);
158 Integer total_nb_element = var_values.totalNbElement();
159 Integer ref_size1 = var_values.dim1Size();
160 Integer ref_size2 = var_values.dim2Size();
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;
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]){
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;
180 if (total_nb_element==0)
191 Integer index = item.
localId();
192 if (group_index_table)
193 index = (*group_index_table)[index];
195 if (index>=ref_size1){
197 msg->
pinfo() <<
"Processor: " << msg->
traceId() <<
" VDIFF: Variable '" << var->
name()
198 <<
"wrong number of elements : impossible comparison";
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));
215 this->_sortAndDump(var,pm,max_print);
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());
249 ThatClass* true_ptr =
nullptr;
253 true_ptr =
dynamic_cast<ThatClass*
>(var);
255 true_ptr =
new ThatClass(vb,vi);
258 ARCANE_CHECK_PTR(true_ptr);
265template<
typename T> Array2VariableT<T>* Array2VariableT<T>::
266getReference(IVariable* var)
269 throw ArgumentException(A_FUNCINFO,
"null variable");
270 ThatClass* true_ptr =
dynamic_cast<ThatClass*
>(var);
272 ARCANE_FATAL(
"Cannot build a reference from variable {0}",var->name());
279template<
typename T>
void Array2VariableT<T>::
280directResize(Integer s)
286 m_data->_internal()->resizeOnlyDim1(s);
293template<
typename DataType>
void Array2VariableT<DataType>::
294directResize(Integer dim1_size,Integer dim2_size)
302 m_data->_internal()->resize(dim1_size,dim2_size);
314template<
typename DataType>
void Array2VariableT<DataType>::
315directResizeAndReshape(
const ArrayShape& shape)
317 Int32 dim1_size = valueView().dim1Size();
320 m_data->_internal()->resize(dim1_size,dim2_size);
321 m_data->setShape(shape);
332 m_data->_internal()->shrink();
340print(std::ostream&)
const
356 ARCANE_FATAL(
"variable '{0}' without family",fullName());
358 itemGroup().synchronizer()->synchronize(
this);
373 ARCANE_FATAL(
"variable '{0}' without family",fullName());
375 itemGroup().synchronizer()->synchronize(
this, local_ids);
386 Real v1 =
static_cast<Real
>(
sizeof(T));
387 Real v2 =
static_cast<Real
>(m_data->view().totalNbElement());
397 ValueType& data_values = m_data->_internal()->_internalDeprecatedValue();
399 Integer dim1_size = valueView().dim1Size();
410 Integer nerror = csa.check(
this,ref_array,from_array,max_print,
true);
411 data_values.copy(ref_array);
420template<
typename T>
Integer Array2VariableT<T>::
421checkIfSame(IDataReader* reader,
int max_print,
bool compare_ghost)
425 ConstArray2View<T> from_array(valueView());
427 Ref< IArray2DataT<T> > ref_data(m_data->cloneTrueEmptyRef());
428 reader->read(
this,ref_data.get());
430 Array2VariableDiff<T> csa;
431 return csa.check(
this,ref_data->view(),from_array,max_print,compare_ghost);
442 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
443 ConstArray2View<T> values,Integer max_print)
445 Array2VariableDiff<T> csa;
446 return csa.checkReplica(pm,var,values,max_print);
451 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
452 ConstArray2View<Byte> values,Integer max_print)
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);
468template<
typename T>
Integer Array2VariableT<T>::
469_checkIfSameOnAllReplica(IParallelMng* replica_pm,Integer max_print)
471 return _checkIfSameOnAllReplicaHelper(replica_pm,
this,constValueView(),max_print);
477template<
typename T>
void Array2VariableT<T>::
478_internalResize(
const VariableResizeArgs& resize_args)
480 Int32 new_size = resize_args.newSize();
481 Int32 nb_additional_element = resize_args.nbAdditionalCapacity();
482 bool use_no_init = resize_args.isUseNoInit();
490 ValueType& data_values = m_data->_internal()->_internalDeprecatedValue();
491 ValueType& container_ref = data_values;
493 Integer dim2_size = data_values.dim2Size();
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);
505 Integer current_size = data_values.dim1Size();
513 data_values.resizeNoInit(new_size,dim2_size);
515 data_values.resize(new_size,dim2_size);
517 if (new_size>current_size){
520 if (use_nan || use_nan2){
521 for( Integer i=current_size; i<new_size; ++i )
522 DataTypeTraitsT<T>::fillNan(data_values[i]);
528 if (container_ref.totalNbElement() < container_ref.capacity())
529 container_ref.shrink();
544 ARCANE_ASSERT(source.
size()==destination.
size(),
545 (
"Unable to copy: source and destination have different sizes !"));
547 const Integer dim2_size = valueView().dim2Size();
548 const Integer nb_copy = source.
size();
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];
566 ARCANE_ASSERT((first_source.
size()==destination.
size()) && (second_source.
size()==destination.
size()),
567 (
"Unable to copy: source and destination have different sizes !"));
569 const Integer dim2_size = valueView().dim2Size();
570 const Integer nb_copy = first_source.
size();
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);
587 debug(
Trace::High) <<
"Skip compact for partial variable " << name();
591 ValueType& current_value = m_data->_internal()->_internalDeprecatedValue();
592 Integer current_size = current_value.dim1Size();
596 Integer dim2_size = current_value.dim2Size();
603 Integer new_size = new_to_old_ids.
size();
604 current_value.
resize(new_size,dim2_size);
610 for( Integer i=0; i<new_size; ++i ){
611 Integer nto = new_to_old_ids[i];
614 for( Integer j=0; j<dim2_size; ++j )
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];
648template<
typename DataType>
void
652 _checkSwapIsValid(&rhs);
655 m_data->swapValues(rhs.m_data);
658 rhs.syncReferences();
664template<
typename DataType>
auto
665Array2VariableT<DataType>::
668 return m_data->_internal()->_internalDeprecatedValue();
674template<
typename DataType>
void
675Array2VariableT<DataType>::
676fillShape(ArrayShape& shape_with_item)
680 ArrayShape shape = m_data->shape();
681 const Int32 nb_rank = shape_with_item.nbDimension();
683 auto array_view = m_data->view();
684 Int32 dim0_size = array_view.dim1Size();
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));
694 for (Int32 i = (nb_orig_shape + 1); i < nb_rank; ++i) {
695 shape_with_item.setDimension(i, 1);
705ARCANE_INTERNAL_INSTANTIATE_TEMPLATE_FOR_NUMERIC_DATATYPE(Array2VariableT);
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
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.
SharedPtrT< GroupIndexTable > localIdToIndex() const
Table des local ids vers une position pour toutes les entités du groupe.
bool null() const
true is le groupe est le groupe nul
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul)
Classe de base d'un élément de maillage.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
bool isOwn() const
true si l'entité est appartient au sous-domaine
Paramètres nécessaires à la construction d'une variable.
Infos caractérisant une variable.
void _setData(const Ref< IData > &data)
Positionne la donnée.
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 pour un tableau 2D constant.
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.
eDataInitialisationPolicy
Type de politique d'initialisation possible pour une donnée.
@ DIP_InitInitialWithNanResizeWithDefault
Initialisation avec des NaN pour à la création et le constructeur par défaut ensuite.
@ DIP_InitWithNan
Initialisation avec des NaN (Not a Number)
@ DIP_InitWithDefault
Initialisation avec le constructeur par défaut.
eDataInitialisationPolicy getGlobalDataInitialisationPolicy()
Récupère la politique d'initialisation des variables.
@ 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.