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"
40#include "arcane/core/VariableComparer.h"
42#include "arcane/core/internal/IDataInternal.h"
43#include "arcane/core/internal/IVariableMngInternal.h"
44#include "arcane/core/internal/IVariableInternal.h"
55template<
class DataType>
68 const int max_print = compare_args.maxPrint();
69 const bool compare_ghost = compare_args.isCompareGhost();
83 Integer current_total_nb_element = current.totalNbElement();
91 if (current_total_nb_element==0)
93 Integer ref_size1 = ref.dim1Size();
94 Integer current_size1 = current.dim1Size();
95 Integer ref_size2 = ref.dim2Size();
96 Integer current_size2 = current.dim2Size();
97 if (ref_size2!=current_size2){
98 msg->
pinfo() <<
"Processor: " << sid <<
" VDIFF: Variable '" << var->
name()
99 <<
" bad dim2 size: ref=" << ref_size2 <<
" current=" << current_size2;
103 if (!item.isOwn() && !compare_ghost)
105 Integer index = item.localId();
106 if (group_index_table)
107 index = (*group_index_table)[index];
109 if (index>=ref_size1 || index>=current_size1){
111 msg->
pinfo() <<
"Processor: " << sid <<
" VDIFF: Variable '" << var->
name()
112 <<
"wrong number of elements : impossible comparison";
115 ConstArrayView<DataType> lref = ref[index];
116 ConstArrayView<DataType> lcurrent = current[index];
117 for(
Integer z=0; z<ref_size2; ++z ){
118 DataType diff = DataType();
119 DataType dref = lref[z];
120 DataType dcurrent = lcurrent[z];
121 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,
true)){
122 this->m_diffs_info.add(DiffInfo(dcurrent,dref,diff,item,z));
128 this->_sortAndDump(var,pm,max_print);
130 return VariableComparerResults(nb_diff);
133 VariableComparerResults
134 checkReplica(IVariable* var, ConstArray2View<DataType> var_values,
135 const VariableComparerArgs& compare_args)
137 IParallelMng* replica_pm = compare_args.replicaParallelMng();
141 using ReduceType =
typename VariableDataTypeTraitsT<DataType>::HasReduceMinMax;
142 if constexpr(std::is_same<TrueType,ReduceType>::value)
143 return _checkReplica2(replica_pm, var, var_values, compare_args);
145 ARCANE_UNUSED(replica_pm);
147 ARCANE_UNUSED(var_values);
148 ARCANE_UNUSED(compare_args);
149 throw NotSupportedException(A_FUNCINFO);
154 VariableComparerResults
155 _checkReplica2(IParallelMng* pm, IVariable* var, ConstArray2View<DataType> var_values,
156 const VariableComparerArgs& compare_args)
158 const int max_print = compare_args.maxPrint();
159 ITraceMng* msg = pm->traceMng();
160 ItemGroup group = var->itemGroup();
164 GroupIndexTable * group_index_table = (var->isPartial())?group.localIdToIndex().get():0;
167 Integer total_nb_element = var_values.totalNbElement();
168 Integer ref_size1 = var_values.dim1Size();
169 Integer ref_size2 = var_values.dim2Size();
172 ArrayView<Integer> min_dims(2,a_min_dims);
174 ArrayView<Integer> max_dims(2,a_max_dims);
175 max_dims[0] = min_dims[0] = ref_size1;
176 max_dims[1] = min_dims[1] = ref_size2;
180 msg->info(4) <<
"Array2Variable::CheckReplica2 rep_size=" << pm->commSize() <<
" rank=" << pm->commRank();
181 if (max_dims[0]!=min_dims[0] || max_dims[1]!=min_dims[1]){
182 const String& var_name = var->name();
183 msg->info() <<
"Can not compare values on replica for variable '" << var_name <<
"'"
184 <<
" because the number of elements is not the same on all the replica "
185 <<
" min=" << min_dims[0] <<
"," << min_dims[1]
186 <<
" max="<< max_dims[0] <<
"," << max_dims[1];
187 return VariableComparerResults(total_nb_element);
189 if (total_nb_element==0)
192 UniqueArray2<DataType> min_values(var_values);
193 UniqueArray2<DataType> max_values(var_values);
199 Integer index = item.localId();
200 if (group_index_table)
201 index = (*group_index_table)[index];
203 if (index>=ref_size1){
205 msg->pinfo() <<
"Processor: " << msg->traceId() <<
" VDIFF: Variable '" << var->name()
206 <<
"wrong number of elements : impossible comparison";
209 ConstArrayView<DataType> lref = min_values[index];
210 ConstArrayView<DataType> lcurrent = max_values[index];
211 for(
Integer z=0; z<ref_size2; ++z ){
212 DataType diff = DataType();
213 DataType dref = lref[z];
214 DataType dcurrent = lcurrent[z];
215 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,
true)){
216 this->m_diffs_info.add(DiffInfo(dcurrent,dref,diff,item,z));
223 this->_sortAndDump(var,pm,max_print);
225 return VariableComparerResults(nb_diff);
243 String storage_full_type =
info.storageTypeInfo().fullName();
244 Ref<IData> data = df->createSimpleDataRef(storage_full_type,storage_build_info);
245 m_data =
dynamic_cast<ValueDataType*
>(
data.get());
257 ThatClass* true_ptr =
nullptr;
261 true_ptr =
dynamic_cast<ThatClass*
>(var);
263 true_ptr =
new ThatClass(vb,vi);
266 ARCANE_CHECK_PTR(true_ptr);
278 ThatClass* true_ptr =
dynamic_cast<ThatClass*
>(var);
280 ARCANE_FATAL(
"Cannot build a reference from variable {0}",var->name());
294 m_data->_internal()->resizeOnlyDim1(s);
310 m_data->_internal()->
resize(dim1_size,dim2_size);
325 Int32 dim1_size = valueView().dim1Size();
328 m_data->_internal()->resize(dim1_size,dim2_size);
329 m_data->setShape(shape);
340 m_data->_internal()->shrink();
348print(std::ostream&)
const
366 itemGroup().synchronizer()->synchronize(
this);
383 itemGroup().synchronizer()->synchronize(
this, local_ids);
394 Real v1 =
static_cast<Real>(
sizeof(T));
395 Real v2 =
static_cast<Real>(m_data->view().totalNbElement());
411 return csa.checkReplica(var, values, compare_args);
415 VariableComparerResults
416 _checkIfSameOnAllReplicaHelper(IVariable* var, ConstArray2View<Byte> values,
417 const VariableComparerArgs& compare_args)
419 Integer dim1_size = values.dim1Size();
420 Integer dim2_size = values.dim2Size();
421 UniqueArray2<Integer> int_values(dim1_size,dim2_size);
422 for(
Integer i=0; i<dim1_size; ++i )
423 for(
Integer j=0; j<dim2_size; ++j )
424 int_values[i][j] = values[i][j];
425 Array2VariableDiff<Integer> csa;
426 return csa.checkReplica(var, int_values, compare_args);
436 switch (compare_args.compareMode()) {
445 reader->
read(
this, ref_data.
get());
456 Integer dim1_size = valueView().dim1Size();
460 ValueType& data_values = m_data->_internal()->_internalDeprecatedValue();
467 data_values.
copy(ref_array);
475 ARCANE_FATAL(
"Invalid value for compare mode '{0}'", (
int)compare_args.compareMode());
484 Int32 new_size = resize_args.newSize();
485 Int32 nb_additional_element = resize_args.nbAdditionalCapacity();
486 bool use_no_init = resize_args.isUseNoInit();
494 ValueType& data_values = m_data->_internal()->_internalDeprecatedValue();
497 Integer dim2_size = data_values.dim2Size();
499 if (nb_additional_element!=0){
500 Integer capacity = data_values.capacity();
501 if (new_size>capacity)
502 data_values.reserve(new_size+nb_additional_element*dim2_size);
509 Integer current_size = data_values.dim1Size();
517 data_values.resizeNoInit(new_size,dim2_size);
519 data_values.resize(new_size,dim2_size);
521 if (new_size>current_size){
524 if (use_nan || use_nan2){
525 for(
Integer i=current_size; i<new_size; ++i )
526 DataTypeTraitsT<T>::fillNan(data_values[i]);
532 if (container_ref.totalNbElement() < container_ref.capacity())
533 container_ref.shrink();
548 ARCANE_ASSERT(source.
size()==destination.
size(),
549 (
"Unable to copy: source and destination have different sizes !"));
551 const Integer dim2_size = valueView().dim2Size();
555 for(
Integer i=0; i<nb_copy; ++i ){
556 for(
Integer j=0; j<dim2_size; ++j )
557 value[destination[i]][j] = value[source[i]][j];
570 ARCANE_ASSERT((first_source.
size()==destination.
size()) && (second_source.
size()==destination.
size()),
571 (
"Unable to copy: source and destination have different sizes !"));
573 const Integer dim2_size = valueView().dim2Size();
577 for(
Integer i=0; i<nb_copy; ++i ){
578 for(
Integer j=0; j<dim2_size; ++j )
579 value[destination[i]][j] = (T)((value[first_source[i]][j]+value[second_source[i]][j])/2);
595 ValueType& current_value = m_data->_internal()->_internalDeprecatedValue();
596 Integer current_size = current_value.dim1Size();
600 Integer dim2_size = current_value.dim2Size();
608 current_value.
resize(new_size,dim2_size);
614 for(
Integer i=0; i<new_size; ++i ){
615 Integer nto = new_to_old_ids[i];
618 for(
Integer j=0; j<dim2_size; ++j )
623 for(
Integer i=0; i<new_size; ++i ){
624 Integer nto = new_to_old_ids[i];
625 for(
Integer j=0; j<dim2_size; ++j )
626 current_value[i][j] = old_value[nto][j];
652template<
typename DataType>
void
656 _checkSwapIsValid(&rhs);
659 m_data->swapValues(rhs.m_data);
662 rhs.syncReferences();
668template<
typename DataType>
auto
669Array2VariableT<DataType>::
672 return m_data->_internal()->_internalDeprecatedValue();
678template<
typename DataType>
void
685 const Int32 nb_rank = shape_with_item.nbDimension();
687 auto array_view = m_data->view();
688 Int32 dim0_size = array_view.dim1Size();
690 shape_with_item.setDimension(0, dim0_size);
691 Int32 nb_orig_shape = shape.nbDimension();
692 for (
Int32 i = 0; i < nb_orig_shape; ++i) {
693 shape_with_item.setDimension(i + 1, shape.dimension(i));
698 for (
Int32 i = (nb_orig_shape + 1); i < nb_rank; ++i) {
699 shape_with_item.setDimension(i, 1);
709ARCANE_INTERNAL_INSTANTIATE_TEMPLATE_FOR_NUMERIC_DATATYPE(
Array2VariableT);
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Exception lorsqu'un argument est invalide.
VariableComparerResults _compareVariable(const VariableComparerArgs &compare_args) final
Comparaison de valeurs entre variables.
void compact(Int32ConstArrayView old_to_new_ids) override
Compacte les valeurs de la variable.
void setIsSynchronized() override
Indique que la variable est synchronisée.
Array2VariableT(const VariableBuildInfo &v, const VariableInfo &vi)
Construit une variable basée sur la référence v.
IData * data() override
Données associées à la variable.
void copyItemsMeanValues(Int32ConstArrayView first_source, Int32ConstArrayView second_source, Int32ConstArrayView destination) override
Copie les moyennes des valeurs des entités numéros first_source et second_source dans les entités num...
void copyItemsValues(Int32ConstArrayView source, Int32ConstArrayView destination) override
Copie les valeurs des entités numéros source dans les entités numéro destination.
void synchronize() override
Synchronise la variable.
Real allocatedMemory() const override
Taille mémoire (en Koctet) utilisée par la variable.
void print(std::ostream &o) const override
Imprime les valeurs de la variable sur le flot o.
void shrinkMemory() override
Libère l'éventuelle mémoire supplémentaire allouée pour les données.
Vue modifiable pour un tableau 2D.
void copy(Span2< const DataType > rhs)
Redimensionne l'instance à partir des dimensions de rhs et copie dedans les valeurs de rhs.
void resize(Int64 new_size)
Redimensionne uniquement la première dimension en laissant la deuxième à l'identique.
ConstArrayView< DataType > at(Int64 i) const
Elément d'indice i. Vérifie toujours les débordements.
Vue modifiable d'un tableau d'un type T.
Vue pour un tableau 2D constant.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Informations pour construire une instance de 'IData'.
Interface de lecture des données d'une variable.
virtual void read(IVariable *var, IData *data)=0
Lit les données data de la variable var.
Interface d'une famille d'entités.
virtual IVariableSynchronizer * allItemsSynchronizer()=0
Synchroniseur sur toutes les entités de la famille.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
Interface du gestionnaire de traces.
virtual TraceMessage pinfo()=0
Flot pour un message d'information parallèle.
Interface du gestionnaire de variables.
virtual IVariable * checkVariable(const VariableInfo &infos)=0
Vérifie une variable.
virtual IVariableMngInternal * _internalApi()=0
API interne à Arcane.
virtual void synchronize(IVariable *var)=0
Synchronise la variable var en mode bloquant.
virtual bool isPartial() const =0
Indique si la variable est partielle.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual String name() const =0
Nom de la variable.
Groupe d'entités de maillage.
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)
Référence à une instance.
InstanceType * get() const
Instance associée ou nullptr si aucune.
Chaîne de caractères unicode.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
Vecteur de données 2D avec sémantique par valeur (style STL).
Paramètres nécessaires à la construction d'une variable.
Arguments des méthodes de VariableComparer.
Résultats d'une opération de comparaison.
Infos caractérisant une variable.
IMesh * mesh() const final
Maillage auquel est associé la variable.
Variable(const VariableBuildInfo &v, const VariableInfo &vi)
Créé une variable lié à la référence v.
void _setData(const Ref< IData > &data)
Positionne la donnée.
bool isPartial() const override
Indique si la variable est partielle.
String name() const final
Nom de la variable.
ItemGroup itemGroup() const final
Groupe du maillage associé.
void syncReferences() override
Synchronise les références.
String fullName() const final
Nom complet de la variable (avec le préfixe de la famille)
eItemKind itemKind() const override
Type des entités du maillage sur lequel repose la variable.
void resize(Integer n) override
Positionne le nombre d'éléments pour une variable tableau.
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
@ ReduceMin
Minimum des valeurs.
@ ReduceMax
Maximum des valeurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool arcaneIsCheck()
Vrai si on est en mode vérification.
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.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
@ SameReplica
Vérifie que les valeurs de la variable sont les même sur tous les replica.
@ Same
Compare avec une référence.
@ Sync
Vérifie que la variable est bien synchronisée.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
double Real
Type représentant un réel.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.