14#include "arcane/utils/NotSupportedException.h"
15#include "arcane/utils/ArgumentException.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/TraceInfo.h"
18#include "arcane/utils/Ref.h"
19#include "arcane/utils/MemoryAccessInfo.h"
20#include "arcane/utils/MemoryAllocator.h"
22#include "arcane/core/VariableDiff.h"
23#include "arcane/core/VariableBuildInfo.h"
24#include "arcane/core/VariableInfo.h"
25#include "arcane/core/IApplication.h"
26#include "arcane/core/IVariableMng.h"
27#include "arcane/core/IItemFamily.h"
28#include "arcane/core/IVariableSynchronizer.h"
29#include "arcane/core/IDataReader.h"
30#include "arcane/core/ItemGroup.h"
31#include "arcane/core/IDataFactoryMng.h"
32#include "arcane/core/IParallelMng.h"
33#include "arcane/core/IMesh.h"
35#include "arcane/core/datatype/DataTracer.h"
36#include "arcane/core/datatype/DataTypeTraits.h"
37#include "arcane/core/datatype/DataStorageBuildInfo.h"
39#include "arcane/core/VariableArray.h"
40#include "arcane/core/RawCopy.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>
66 int max_print,
bool compare_ghost)
69 return _checkAsArray(var,ref,current,max_print);
83 bool compare_failed =
false;
87 if (!item.
isOwn() && !compare_ghost)
90 if (group_index_table){
91 index = (*group_index_table)[index];
95 DataType diff = DataType();
98 compare_failed =
true;
101 DataType dref = ref[index];
102 DataType dcurrent = current[index];
103 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,
true)){
104 this->m_diffs_info.add(
DiffInfo(dcurrent,dref,diff,item,NULL_ITEM_ID));
112 msg->
pinfo() <<
"Processor " << sid <<
" : "
113 <<
"comparison impossible because the number of the elements is different "
114 <<
" for the variable " << var_name <<
" ref_size=" << ref_size;
118 this->_sortAndDump(var,pm,max_print);
123 Integer checkReplica(IParallelMng* pm,IVariable* var,ConstArrayView<DataType> var_value,
128 using ReduceType =
typename VariableDataTypeTraitsT<DataType>::HasReduceMinMax;
129 if constexpr(std::is_same<TrueType,ReduceType>::value)
130 return _checkReplica2(pm,var,var_value,max_print);
134 ARCANE_UNUSED(var_value);
135 ARCANE_UNUSED(max_print);
136 throw NotSupportedException(A_FUNCINFO);
141 Integer _checkAsArray(IVariable* var,ConstArrayView<DataType> ref,
142 ConstArrayView<DataType> current,
int max_print)
144 IParallelMng* pm = var->variableMng()->parallelMng();
145 ITraceMng* msg = pm->traceMng();
148 bool compare_failed =
false;
150 Integer current_size = current.size();
151 for(
Integer index=0; index<current_size; ++index ){
152 DataType diff = DataType();
153 if (index>=ref_size){
155 compare_failed =
true;
158 DataType dref = ref[index];
159 DataType dcurrent = current[index];
160 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,
true)){
161 this->m_diffs_info.add(DiffInfo(dcurrent,dref,diff,index,NULL_ITEM_ID));
167 Int32 sid = pm->commRank();
168 const String& var_name = var->name();
169 msg->pinfo() <<
"Processor " << sid <<
" : "
170 <<
" comparaison impossible car nombre d'éléments différents"
171 <<
" pour la variable " << var_name <<
" ref_size=" << ref_size;
175 this->_sortAndDump(var,pm,max_print);
180 Integer _checkReplica2(IParallelMng* pm,IVariable* var,ConstArrayView<DataType> var_values,
183 ITraceMng* msg = pm->traceMng();
184 Integer size = var_values.size();
188 msg->info(5) <<
"CheckReplica2 rep_size=" << pm->commSize() <<
" rank=" << pm->commRank();
189 if (max_size!=min_size){
190 const String& var_name = var->name();
191 msg->info() <<
"Can not compare values on replica for variable '" << var_name <<
"'"
192 <<
" because the number of elements is not the same on all the replica "
193 <<
" min=" << min_size <<
" max="<< max_size;
197 UniqueArray<DataType> min_values(var_values);
198 UniqueArray<DataType> max_values(var_values);
202 for(
Integer index=0; index<size; ++index ){
203 DataType diff = DataType();
204 DataType min_val = min_values[index];
205 DataType max_val = max_values[index];
206 if (VarDataTypeTraits::verifDifferent(min_val,max_val,diff,
true)){
207 this->m_diffs_info.add(DiffInfo(min_val,max_val,diff,index,NULL_ITEM_ID));
212 this->_sortAndDump(var,pm,max_print);
231 String storage_full_type =
info.storageTypeInfo().fullName();
232 Ref<IData> data = df->createSimpleDataRef(storage_full_type,storage_build_info);
233 m_value =
dynamic_cast<ValueDataType*
>(
data.get());
249template<
typename T> VariableArrayT<T>* VariableArrayT<T>::
250getReference(
const VariableBuildInfo& vb,
const VariableInfo& vi)
254 ThatClass* true_ptr =
nullptr;
258 true_ptr =
dynamic_cast<ThatClass*
>(var);
260 true_ptr =
new ThatClass(vb,vi);
261 vm->_internalApi()->addVariable(true_ptr);
263 ARCANE_CHECK_PTR(true_ptr);
275 auto* true_ptr =
dynamic_cast<ThatClass*
>(var);
277 ARCANE_FATAL(
"Can not build a reference from variable {0}",var->name());
285print(std::ostream& o)
const
289 o <<
"(dimension=" << size <<
") ";
309 itemGroup().synchronizer()->synchronize(
this);
326 itemGroup().synchronizer()->synchronize(
this, local_ids);
338 Real v2 = (
Real)(m_value->view().size());
350 ValueType& data_values = m_value->_internal()->_internalDeprecatedValue();
355 Integer nerror = csa.check(
this,ref_array,from_array,max_print,
true);
356 data_values.copy(ref_array);
373 reader->read(
this,ref_data.get());
376 return csa.check(
this,ref_data->view(),from_array,max_print,compare_ghost);
391 return csa.checkReplica(pm,var,values,max_print);
401 for(
Integer i=0; i<size; ++i )
402 int_values[i] = values[i];
404 return csa.checkReplica(pm,var,int_values,max_print);
411 return _checkIfSameOnAllReplicaHelper(replica_pm,
this,constValueView(),max_print);
439 error() << String::format(
"Can not convert the string '{0}' to type '{1}'",
465 <<
") of the group `" << group.
name() <<
"' does not match \n"
476 ARCANE_ASSERT(source.size()==destination.
size(),
477 (
"Impossible to copy: source and destination of different sizes !"));
479 const Integer size = source.size();
481 value[destination[i]] = value[source[i]];
493 ARCANE_ASSERT((first_source.
size()==destination.
size()) && (second_source.
size()==destination.
size()),
494 (
"Impossible to copy: source and destination of different sizes !"));
497 for(
Integer i=0; i<size; ++i ) {
498 value[destination[i]] = (T)((value[first_source[i]]+value[second_source[i]])/2);
524 m_value->resize(new_size);
527 for(
Integer i=0; i<new_size; ++i )
528 current_value.setAt(i,old_value.
at(new_to_old_ids[i]));
531 for(
Integer i=0; i<new_size; ++i )
552 ARCANE_UNUSED(group);
561 Int32 new_size = resize_args.newSize();
562 Int32 nb_additional_element = resize_args.nbAdditionalCapacity();
563 bool use_no_init = resize_args.isUseNoInit();
565 auto* value_internal = m_value->_internal();
567 if (nb_additional_element!=0){
568 Integer capacity = value_internal->capacity();
569 if (new_size>capacity)
570 value_internal->reserve(new_size+nb_additional_element);
576 Integer current_size = m_value->view().size();
580 value_internal->dispose();
583 value_internal->_internalDeprecatedValue().resizeNoInit(new_size);
585 value_internal->resize(new_size);
586 if (new_size>current_size){
589 for(
Integer i=current_size; i<new_size; ++i)
595 if (use_nan || use_nan2){
604 if (m_value->view().size() < value_internal->capacity()){
605 value_internal->shrink();
615 Int64 capacity = value_internal->capacity();
635 m_value->_internal()->shrink();
645 return m_value->_internal()->capacity();
651template<
typename DataType>
void VariableArrayT<DataType>::
652fill(
const DataType& value)
654 m_value->view().fill(value);
663 ARCANE_UNUSED(group);
670template<
typename DataType>
void
674 _checkSwapIsValid(&rhs);
677 m_value->swapValues(rhs.m_value);
680 rhs.syncReferences();
693 bool is_ok = (first_source.
size()==dsize) && (second_source.
size()==dsize);
695 ARCANE_FATAL(
"Unable to copy: source and destination of different sizes !");
700 value[destination[i]] = value[first_source[i]];
710 return m_value->_internal()->_internalDeprecatedValue();
716ARCANE_INTERNAL_INSTANTIATE_TEMPLATE_FOR_NUMERIC_DATATYPE(VariableArrayT);
717template class VariableArrayT<String>;
#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.
static constexpr Integer simdAlignment()
Alignement pour les structures utilisant la vectorisation.
Exception lorsqu'un argument est invalide.
Vue modifiable d'un tableau d'un type T.
T & at(Int64 i)
Elément d'indice i. Vérifie toujours les débordements.
Vue constante d'un tableau de type T.
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.
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 IVariable * checkVariable(const VariableInfo &infos)=0
Vérifie une variable.
virtual void synchronize(IVariable *var)=0
Synchronise la variable var en mode bloquant.
Interface d'une variable.
virtual eItemKind itemKind() const =0
Type des entités du maillage sur lequel repose la 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.
const String & name() const
Nom du groupe.
SharedPtrT< GroupIndexTable > localIdToIndex() const
Table des local ids vers une position pour toutes les entités du groupe.
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
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
Exception lorsqu'une opération n'est pas supportée.
Référence à une instance.
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.
TraceMessage error() const
Flot pour un message d'erreur.
Vecteur 1D de données avec sémantique par valeur (style STL).
Implémentation d'une variable sur un tableau 1D.
VariableArrayT(const VariableBuildInfo &v, const VariableInfo &vi)
Construit une variable basée sur la référence v.
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 shrinkMemory() override
Libère l'éventuelle mémoire supplémentaire allouée pour les données.
void compact(Int32ConstArrayView old_to_new_ids) override
Compacte les valeurs de la variable.
bool initialize(const ItemGroup &group, const String &value) override
Initialise la variable.
void copyItemsValues(Int32ConstArrayView source, Int32ConstArrayView destination) override
Copie les valeurs des entités numéros source dans les entités numéro destination.
IData * data() override
Données associées à la variable.
void print(std::ostream &o) const override
Imprime les valeurs de la variable sur le flot o.
void setIsSynchronized() override
Indique que la variable est synchronisée.
Real allocatedMemory() const override
Taille mémoire (en Koctet) utilisée par la variable.
void synchronize() override
Synchronise la variable.
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.
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.
IVariableMng * variableMng() const override
Gestionnaire de variable associé à la variable.
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.
IItemFamily * itemFamily() const final
Famille d'entité associée.
eDataType dataType() const override
Type de la donnée gérée par la variable (Real, Integer, ...)
@ 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.
std::int64_t Int64
Type entier signé sur 64 bits.
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.
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
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.