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"
53template<
class DataType>
63 int max_print,
bool compare_ghost)
78 Integer current_total_nb_element = current.totalNbElement();
86 if (current_total_nb_element==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;
97 const Item& item = *i;
98 if (!item.
isOwn() && !compare_ghost)
100 Integer index = item.
localId();
101 if (group_index_table)
102 index = (*group_index_table)[index];
104 if (index>=ref_size1 || index>=current_size1){
106 msg->
pinfo() <<
"Processor: " << sid <<
" VDIFF: Variable '" << var->
name()
107 <<
"wrong number of elements : impossible comparison";
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));
123 this->_sortAndDump(var,pm,max_print);
134 if constexpr(std::is_same<TrueType,ReduceType>::value)
135 return _checkReplica2(pm,var,var_values,max_print);
139 ARCANE_UNUSED(var_values);
140 ARCANE_UNUSED(max_print);
157 Integer total_nb_element = var_values.totalNbElement();
158 Integer ref_size1 = var_values.dim1Size();
159 Integer ref_size2 = var_values.dim2Size();
161 Integer a_min_dims[2];
163 Integer a_max_dims[2];
165 max_dims[0] = min_dims[0] = ref_size1;
166 max_dims[1] = min_dims[1] = ref_size2;
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]){
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;
179 if (total_nb_element==0)
190 Integer index = item.
localId();
191 if (group_index_table)
192 index = (*group_index_table)[index];
194 if (index>=ref_size1){
196 msg->
pinfo() <<
"Processor: " << msg->
traceId() <<
" VDIFF: Variable '" << var->
name()
197 <<
"wrong number of elements : impossible comparison";
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));
214 this->_sortAndDump(var,pm,max_print);
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());
248 ThatClass* true_ptr =
nullptr;
252 true_ptr =
dynamic_cast<ThatClass*
>(var);
254 true_ptr =
new ThatClass(vb,vi);
257 ARCANE_CHECK_PTR(true_ptr);
264template<
typename T> Array2VariableT<T>* Array2VariableT<T>::
265getReference(IVariable* var)
268 throw ArgumentException(A_FUNCINFO,
"null variable");
269 ThatClass* true_ptr =
dynamic_cast<ThatClass*
>(var);
271 ARCANE_FATAL(
"Cannot build a reference from variable {0}",var->name());
278template<
typename T>
void Array2VariableT<T>::
279directResize(Integer s)
285 m_data->_internal()->resizeOnlyDim1(s);
292template<
typename DataType>
void Array2VariableT<DataType>::
293directResize(Integer dim1_size,Integer dim2_size)
301 m_data->_internal()->resize(dim1_size,dim2_size);
313template<
typename DataType>
void Array2VariableT<DataType>::
314directResizeAndReshape(
const ArrayShape& shape)
316 Int32 dim1_size = valueView().dim1Size();
319 m_data->_internal()->resize(dim1_size,dim2_size);
320 m_data->setShape(shape);
331 m_data->_internal()->shrink();
339print(std::ostream&)
const
355 ARCANE_FATAL(
"variable '{0}' without family",fullName());
357 itemGroup().synchronizer()->synchronize(
this);
372 ARCANE_FATAL(
"variable '{0}' without family",fullName());
374 itemGroup().synchronizer()->synchronize(
this, local_ids);
385 Real v1 =
static_cast<Real
>(
sizeof(T));
386 Real v2 =
static_cast<Real
>(m_data->view().totalNbElement());
396 ValueType& data_values = m_data->_internal()->_internalDeprecatedValue();
398 Integer dim1_size = valueView().dim1Size();
409 Integer nerror = csa.check(
this,ref_array,from_array,max_print,
true);
410 data_values.copy(ref_array);
419template<
typename T>
Integer Array2VariableT<T>::
420checkIfSame(IDataReader* reader,
int max_print,
bool compare_ghost)
424 ConstArray2View<T> from_array(valueView());
426 Ref< IArray2DataT<T> > ref_data(m_data->cloneTrueEmptyRef());
427 reader->read(
this,ref_data.get());
429 Array2VariableDiff<T> csa;
430 return csa.check(
this,ref_data->view(),from_array,max_print,compare_ghost);
441 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
442 ConstArray2View<T> values,Integer max_print)
444 Array2VariableDiff<T> csa;
445 return csa.checkReplica(pm,var,values,max_print);
450 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
451 ConstArray2View<Byte> values,Integer max_print)
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);
467template<
typename T>
Integer Array2VariableT<T>::
468_checkIfSameOnAllReplica(IParallelMng* replica_pm,Integer max_print)
470 return _checkIfSameOnAllReplicaHelper(replica_pm,
this,constValueView(),max_print);
476template<
typename T>
void Array2VariableT<T>::
477_internalResize(Integer new_size,Integer nb_additional_element)
485 ValueType& data_values = m_data->_internal()->_internalDeprecatedValue();
486 ValueType& container_ref = data_values;
488 Integer dim2_size = data_values.dim2Size();
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);
500 Integer current_size = data_values.dim1Size();
508 data_values.resize(new_size,dim2_size);
510 data_values.resizeNoInit(new_size,dim2_size);
512 if (new_size>current_size){
515 if (use_nan || use_nan2){
516 for( Integer i=current_size; i<new_size; ++i )
517 DataTypeTraitsT<T>::fillNan(data_values[i]);
523 if (container_ref.totalNbElement() < container_ref.capacity())
524 container_ref.shrink();
539 ARCANE_ASSERT(source.
size()==destination.
size(),
540 (
"Unable to copy: source and destination have different sizes !"));
542 const Integer dim2_size = valueView().dim2Size();
543 const Integer nb_copy = source.
size();
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];
561 ARCANE_ASSERT((first_source.
size()==destination.
size()) && (second_source.
size()==destination.
size()),
562 (
"Unable to copy: source and destination have different sizes !"));
564 const Integer dim2_size = valueView().dim2Size();
565 const Integer nb_copy = first_source.
size();
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);
582 debug(
Trace::High) <<
"Skip compact for partial variable " << name();
586 ValueType& current_value = m_data->_internal()->_internalDeprecatedValue();
587 Integer current_size = current_value.dim1Size();
591 Integer dim2_size = current_value.dim2Size();
598 Integer new_size = new_to_old_ids.
size();
599 current_value.
resize(new_size,dim2_size);
605 for( Integer i=0; i<new_size; ++i ){
606 Integer nto = new_to_old_ids[i];
609 for( Integer j=0; j<dim2_size; ++j )
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];
643template<
typename DataType>
void
647 _checkSwapIsValid(&rhs);
650 m_data->swapValues(rhs.m_data);
653 rhs.syncReferences();
659template<
typename DataType>
auto
660Array2VariableT<DataType>::
663 return m_data->_internal()->_internalDeprecatedValue();
669template<
typename DataType>
void
670Array2VariableT<DataType>::
671fillShape(ArrayShape& shape_with_item)
675 ArrayShape shape = m_data->shape();
676 const Int32 nb_rank = shape_with_item.nbDimension();
678 auto array_view = m_data->view();
679 Int32 dim0_size = array_view.dim1Size();
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));
689 for (Int32 i = (nb_orig_shape + 1); i < nb_rank; ++i) {
690 shape_with_item.setDimension(i, 1);
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>;
#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.