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 = var->_internalApi()->replicaParallelMng();
142 using ReduceType =
typename VariableDataTypeTraitsT<DataType>::HasReduceMinMax;
143 if constexpr(std::is_same<TrueType,ReduceType>::value)
144 return _checkReplica2(replica_pm, var, var_values, compare_args);
146 ARCANE_UNUSED(replica_pm);
148 ARCANE_UNUSED(var_values);
149 ARCANE_UNUSED(compare_args);
150 throw NotSupportedException(A_FUNCINFO);
155 VariableComparerResults
156 _checkReplica2(IParallelMng* pm, IVariable* var, ConstArray2View<DataType> var_values,
157 const VariableComparerArgs& compare_args)
159 const int max_print = compare_args.maxPrint();
160 ITraceMng* msg = pm->traceMng();
161 ItemGroup group = var->itemGroup();
165 GroupIndexTable * group_index_table = (var->isPartial())?group.localIdToIndex().get():0;
168 Integer total_nb_element = var_values.totalNbElement();
169 Integer ref_size1 = var_values.dim1Size();
170 Integer ref_size2 = var_values.dim2Size();
173 ArrayView<Integer> min_dims(2,a_min_dims);
175 ArrayView<Integer> max_dims(2,a_max_dims);
176 max_dims[0] = min_dims[0] = ref_size1;
177 max_dims[1] = min_dims[1] = ref_size2;
181 msg->info(4) <<
"Array2Variable::CheckReplica2 rep_size=" << pm->commSize() <<
" rank=" << pm->commRank();
182 if (max_dims[0]!=min_dims[0] || max_dims[1]!=min_dims[1]){
183 const String& var_name = var->name();
184 msg->info() <<
"Can not compare values on replica for variable '" << var_name <<
"'"
185 <<
" because the number of elements is not the same on all the replica "
186 <<
" min=" << min_dims[0] <<
"," << min_dims[1]
187 <<
" max="<< max_dims[0] <<
"," << max_dims[1];
188 return VariableComparerResults(total_nb_element);
190 if (total_nb_element==0)
193 UniqueArray2<DataType> min_values(var_values);
194 UniqueArray2<DataType> max_values(var_values);
200 Integer index = item.localId();
201 if (group_index_table)
202 index = (*group_index_table)[index];
204 if (index>=ref_size1){
206 msg->pinfo() <<
"Processor: " << msg->traceId() <<
" VDIFF: Variable '" << var->name()
207 <<
"wrong number of elements : impossible comparison";
210 ConstArrayView<DataType> lref = min_values[index];
211 ConstArrayView<DataType> lcurrent = max_values[index];
212 for(
Integer z=0; z<ref_size2; ++z ){
213 DataType diff = DataType();
214 DataType dref = lref[z];
215 DataType dcurrent = lcurrent[z];
216 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,
true)){
217 this->m_diffs_info.add(DiffInfo(dcurrent,dref,diff,item,z));
224 this->_sortAndDump(var,pm,max_print);
226 return VariableComparerResults(nb_diff);
244 String storage_full_type =
info.storageTypeInfo().fullName();
245 Ref<IData> data = df->createSimpleDataRef(storage_full_type,storage_build_info);
246 m_data =
dynamic_cast<ValueDataType*
>(
data.get());
258 ThatClass* true_ptr =
nullptr;
262 true_ptr =
dynamic_cast<ThatClass*
>(var);
264 true_ptr =
new ThatClass(vb,vi);
267 ARCANE_CHECK_PTR(true_ptr);
279 ThatClass* true_ptr =
dynamic_cast<ThatClass*
>(var);
281 ARCANE_FATAL(
"Cannot build a reference from variable {0}",var->name());
295 m_data->_internal()->resizeOnlyDim1(s);
311 m_data->_internal()->
resize(dim1_size,dim2_size);
326 Int32 dim1_size = valueView().dim1Size();
329 m_data->_internal()->resize(dim1_size,dim2_size);
330 m_data->setShape(shape);
341 m_data->_internal()->shrink();
349print(std::ostream&)
const
367 itemGroup().synchronizer()->synchronize(
this);
384 itemGroup().synchronizer()->synchronize(
this, local_ids);
395 Real v1 =
static_cast<Real>(
sizeof(T));
396 Real v2 =
static_cast<Real>(m_data->view().totalNbElement());
412 return csa.checkReplica(var, values, compare_args);
416 VariableComparerResults
417 _checkIfSameOnAllReplicaHelper(IVariable* var, ConstArray2View<Byte> values,
418 const VariableComparerArgs& compare_args)
420 Integer dim1_size = values.dim1Size();
421 Integer dim2_size = values.dim2Size();
422 UniqueArray2<Integer> int_values(dim1_size,dim2_size);
423 for(
Integer i=0; i<dim1_size; ++i )
424 for(
Integer j=0; j<dim2_size; ++j )
425 int_values[i][j] = values[i][j];
426 Array2VariableDiff<Integer> csa;
427 return csa.checkReplica(var, int_values, compare_args);
437 switch (compare_args.compareMode()) {
446 reader->
read(
this, ref_data.
get());
457 Integer dim1_size = valueView().dim1Size();
461 ValueType& data_values = m_data->_internal()->_internalDeprecatedValue();
468 data_values.
copy(ref_array);
476 ARCANE_FATAL(
"Invalid value for compare mode '{0}'", (
int)compare_args.compareMode());
485 Int32 new_size = resize_args.newSize();
486 Int32 nb_additional_element = resize_args.nbAdditionalCapacity();
487 bool use_no_init = resize_args.isUseNoInit();
495 ValueType& data_values = m_data->_internal()->_internalDeprecatedValue();
498 Integer dim2_size = data_values.dim2Size();
500 if (nb_additional_element!=0){
501 Integer capacity = data_values.capacity();
502 if (new_size>capacity)
503 data_values.reserve(new_size+nb_additional_element*dim2_size);
510 Integer current_size = data_values.dim1Size();
518 data_values.resizeNoInit(new_size,dim2_size);
520 data_values.resize(new_size,dim2_size);
522 if (new_size>current_size){
525 if (use_nan || use_nan2){
526 for(
Integer i=current_size; i<new_size; ++i )
527 DataTypeTraitsT<T>::fillNan(data_values[i]);
533 if (container_ref.totalNbElement() < container_ref.capacity())
534 container_ref.shrink();
549 ARCANE_ASSERT(source.size()==destination.
size(),
550 (
"Unable to copy: source and destination have different sizes !"));
552 const Integer dim2_size = valueView().dim2Size();
553 const Integer nb_copy = source.size();
556 for(
Integer i=0; i<nb_copy; ++i ){
557 for(
Integer j=0; j<dim2_size; ++j )
558 value[destination[i]][j] = value[source[i]][j];
571 ARCANE_ASSERT((first_source.
size()==destination.
size()) && (second_source.
size()==destination.
size()),
572 (
"Unable to copy: source and destination have different sizes !"));
574 const Integer dim2_size = valueView().dim2Size();
578 for(
Integer i=0; i<nb_copy; ++i ){
579 for(
Integer j=0; j<dim2_size; ++j )
580 value[destination[i]][j] = (T)((value[first_source[i]][j]+value[second_source[i]][j])/2);
596 ValueType& current_value = m_data->_internal()->_internalDeprecatedValue();
597 Integer current_size = current_value.dim1Size();
601 Integer dim2_size = current_value.dim2Size();
609 current_value.
resize(new_size,dim2_size);
615 for(
Integer i=0; i<new_size; ++i ){
616 Integer nto = new_to_old_ids[i];
619 for(
Integer j=0; j<dim2_size; ++j )
624 for(
Integer i=0; i<new_size; ++i ){
625 Integer nto = new_to_old_ids[i];
626 for(
Integer j=0; j<dim2_size; ++j )
627 current_value[i][j] = old_value[nto][j];
653template<
typename DataType>
void
657 _checkSwapIsValid(&rhs);
660 m_data->swapValues(rhs.m_data);
663 rhs.syncReferences();
669template<
typename DataType>
auto
670Array2VariableT<DataType>::
673 return m_data->_internal()->_internalDeprecatedValue();
679template<
typename DataType>
void
686 const Int32 nb_rank = shape_with_item.nbDimension();
688 auto array_view = m_data->view();
689 Int32 dim0_size = array_view.dim1Size();
691 shape_with_item.setDimension(0, dim0_size);
692 Int32 nb_orig_shape = shape.nbDimension();
693 for (
Int32 i = 0; i < nb_orig_shape; ++i) {
694 shape_with_item.setDimension(i + 1, shape.dimension(i));
699 for (
Int32 i = (nb_orig_shape + 1); i < nb_rank; ++i) {
700 shape_with_item.setDimension(i, 1);
710ARCANE_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.
Variable sur un tableau 2D.
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(Integer size)
Redimensionnement de la deuxième dimension du tableau.
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'.
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 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.
virtual void addVariable(IVariable *var)=0
Ajoute une variable.
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.
Interface d'une variable.
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)
Exception lorsqu'une opération n'est pas supportée.
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.
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.
Arguments pour redimensionner 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.
@ SameOnAllReplica
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.