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/datatype/DataTracer.h"
36#include "arcane/datatype/DataTypeTraits.h"
37#include "arcane/datatype/DataStorageBuildInfo.h"
39#include "arcane/VariableArray.h"
40#include "arcane/RawCopy.h"
42#include "arcane/core/internal/IDataInternal.h"
43#include "arcane/core/internal/IVariableMngInternal.h"
54template<
class DataType>
65 int max_print,
bool compare_ghost)
68 return _checkAsArray(var,ref,current,max_print);
82 bool compare_failed =
false;
83 Integer ref_size = ref.
size();
86 if (!item.
isOwn() && !compare_ghost)
89 if (group_index_table){
90 index = (*group_index_table)[index];
94 DataType diff = DataType();
97 compare_failed =
true;
100 DataType dref = ref[index];
101 DataType dcurrent = current[index];
102 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,
true)){
103 this->m_diffs_info.add(
DiffInfo(dcurrent,dref,diff,item,NULL_ITEM_ID));
111 msg->
pinfo() <<
"Processor " << sid <<
" : "
112 <<
"comparison impossible because the number of the elements is different "
113 <<
" for the variable " << var_name <<
" ref_size=" << ref_size;
117 this->_sortAndDump(var,pm,max_print);
128 if constexpr(std::is_same<TrueType,ReduceType>::value)
129 return _checkReplica2(pm,var,var_value,max_print);
133 ARCANE_UNUSED(var_value);
134 ARCANE_UNUSED(max_print);
147 bool compare_failed =
false;
148 Integer ref_size = ref.
size();
149 Integer current_size = current.
size();
150 for( Integer index=0; index<current_size; ++index ){
151 DataType diff = DataType();
152 if (index>=ref_size){
154 compare_failed =
true;
157 DataType dref = ref[index];
158 DataType dcurrent = current[index];
159 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,
true)){
160 this->m_diffs_info.add(
DiffInfo(dcurrent,dref,diff,index,NULL_ITEM_ID));
168 msg->
pinfo() <<
"Processor " << sid <<
" : "
169 <<
" comparaison impossible car nombre d'éléments différents"
170 <<
" pour la variable " << var_name <<
" ref_size=" << ref_size;
174 this->_sortAndDump(var,pm,max_print);
183 Integer size = var_values.
size();
185 Integer max_size = pm->
reduce(Parallel::ReduceMax,size);
186 Integer min_size = pm->
reduce(Parallel::ReduceMin,size);
188 if (max_size!=min_size){
190 msg->
info() <<
"Can not compare values on replica for variable '" << var_name <<
"'"
191 <<
" because the number of elements is not the same on all the replica "
192 <<
" min=" << min_size <<
" max="<< max_size;
198 pm->
reduce(Parallel::ReduceMax,max_values);
199 pm->
reduce(Parallel::ReduceMin,min_values);
201 for( Integer index=0; index<size; ++index ){
202 DataType diff = DataType();
203 DataType min_val = min_values[index];
204 DataType max_val = max_values[index];
205 if (VarDataTypeTraits::verifDifferent(min_val,max_val,diff,
true)){
206 this->m_diffs_info.add(
DiffInfo(min_val,max_val,diff,index,NULL_ITEM_ID));
211 this->_sortAndDump(var,pm,max_print);
230 String storage_full_type =
info.storageTypeInfo().fullName();
231 Ref<IData>
data = df->createSimpleDataRef(storage_full_type,storage_build_info);
232 m_value =
dynamic_cast<ValueDataType*
>(
data.get());
248template<
typename T> VariableArrayT<T>* VariableArrayT<T>::
249getReference(
const VariableBuildInfo& vb,
const VariableInfo& vi)
253 ThatClass* true_ptr =
nullptr;
257 true_ptr =
dynamic_cast<ThatClass*
>(var);
259 true_ptr =
new ThatClass(vb,vi);
260 vm->_internalApi()->addVariable(true_ptr);
262 ARCANE_CHECK_PTR(true_ptr);
269template<
typename T> VariableArrayT<T>* VariableArrayT<T>::
270getReference(IVariable* var)
273 throw ArgumentException(A_FUNCINFO,
"null variable");
274 auto* true_ptr =
dynamic_cast<ThatClass*
>(var);
276 ARCANE_FATAL(
"Can not build a reference from variable {0}",var->name());
284print(std::ostream& o)
const
287 Integer size = x.
size();
288 o <<
"(dimension=" << size <<
") ";
306 ARCANE_FATAL(
"variable '{0}' without family",fullName());
308 itemGroup().synchronizer()->synchronize(
this);
323 ARCANE_FATAL(
"variable '{0}' without family",fullName());
325 itemGroup().synchronizer()->synchronize(
this, local_ids);
336 Real v1 = (Real)(
sizeof(T));
337 Real v2 = (Real)(m_value->view().size());
349 ValueType& data_values = m_value->_internal()->_internalDeprecatedValue();
354 Integer nerror = csa.check(
this,ref_array,from_array,max_print,
true);
355 data_values.copy(ref_array);
364template<
typename T>
Integer VariableArrayT<T>::
365checkIfSame(IDataReader* reader,Integer max_print,
bool compare_ghost)
369 ArrayView<T> from_array(valueView());
371 Ref< IArrayDataT<T> > ref_data(m_value->cloneTrueEmptyRef());
372 reader->read(
this,ref_data.get());
374 ArrayVariableDiff<T> csa;
375 return csa.check(
this,ref_data->view(),from_array,max_print,compare_ghost);
386 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
387 ConstArrayView<T> values,Integer max_print)
389 ArrayVariableDiff<T> csa;
390 return csa.checkReplica(pm,var,values,max_print);
395 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
396 ConstArrayView<Byte> values,Integer max_print)
399 UniqueArray<Integer> int_values(size);
400 for( Integer i=0; i<size; ++i )
401 int_values[i] = values[i];
402 ArrayVariableDiff<Integer> csa;
403 return csa.checkReplica(pm,var,int_values,max_print);
407template<
typename T>
Integer VariableArrayT<T>::
408_checkIfSameOnAllReplica(IParallelMng* replica_pm,Integer max_print)
410 return _checkIfSameOnAllReplicaHelper(replica_pm,
this,constValueView(),max_print);
438 error() << String::format(
"Can not convert the string '{0}' to type '{1}'",
463 error() <<
"The type of elements (" <<
itemKindName(group_kind)
464 <<
") of the group `" << group.
name() <<
"' does not match \n"
465 <<
"the type of the variable (" <<
itemKindName(this->itemKind()) <<
").";
475 ARCANE_ASSERT(source.
size()==destination.
size(),
476 (
"Impossible to copy: source and destination of different sizes !"));
478 const Integer size = source.
size();
479 for(Integer i=0; i<size; ++i )
480 value[destination[i]] = value[source[i]];
492 ARCANE_ASSERT((first_source.
size()==destination.
size()) && (second_source.
size()==destination.
size()),
493 (
"Impossible to copy: source and destination of different sizes !"));
495 const Integer size = first_source.
size();
496 for(Integer i=0; i<size; ++i ) {
497 value[destination[i]] = (T)((value[first_source[i]]+value[second_source[i]])/2);
517 debug(
Trace::High) <<
"Skip compact for partial variable " << name();
522 Integer new_size = new_to_old_ids.
size();
523 m_value->resize(new_size);
526 for( Integer i=0; i<new_size; ++i )
527 current_value.setAt(i,old_value.
at(new_to_old_ids[i]));
530 for( Integer i=0; i<new_size; ++i )
542 setIsSynchronized(itemGroup());
551 ARCANE_UNUSED(group);
560 auto* value_internal = m_value->_internal();
562 if (nb_additional_element!=0){
563 Integer capacity = value_internal->capacity();
564 if (new_size>capacity)
565 value_internal->reserve(new_size+nb_additional_element);
571 Integer current_size = m_value->view().size();
575 value_internal->dispose();
577 value_internal->resize(new_size);
578 if (new_size>current_size){
580 ArrayView<T> values = this->valueView();
581 for(Integer i=current_size; i<new_size; ++i)
587 if (use_nan || use_nan2){
588 ArrayView<T> view = this->valueView();
589 DataTypeTraitsT<T>::fillNan(view.subView(current_size,new_size-current_size));
596 if (m_value->view().size() < value_internal->capacity()){
597 value_internal->shrink();
607 Int64 capacity = value_internal->capacity();
615template<
typename DataType>
void VariableArrayT<DataType>::
616resizeWithReserve(Integer n,Integer nb_additional)
618 _resizeWithReserve(n,nb_additional);
627 m_value->_internal()->shrink();
637 return m_value->_internal()->capacity();
643template<
typename DataType>
void VariableArrayT<DataType>::
644fill(
const DataType& value)
646 m_value->view().fill(value);
652template<
typename DataType>
void VariableArrayT<DataType>::
653fill(
const DataType& value,
const ItemGroup& group)
655 ARCANE_UNUSED(group);
662template<
typename DataType>
void
663VariableArrayT<DataType>::
664swapValues(ThatClass& rhs)
666 _checkSwapIsValid(&rhs);
669 m_value->swapValues(rhs.m_value);
672 rhs.syncReferences();
684 Integer dsize = destination.
size();
685 bool is_ok = (first_source.
size()==dsize) && (second_source.
size()==dsize);
687 ARCANE_FATAL(
"Unable to copy: source and destination of different sizes !");
690 const Integer size = first_source.
size();
691 for(Integer i=0; i<size; ++i )
692 value[destination[i]] = value[first_source[i]];
702 return m_value->_internal()->_internalDeprecatedValue();
708template class VariableArrayT<Byte>;
709template class VariableArrayT<Real>;
710template class VariableArrayT<Int16>;
711template class VariableArrayT<Int32>;
712template class VariableArrayT<Int64>;
713template class VariableArrayT<Real2>;
714template class VariableArrayT<Real2x2>;
715template class VariableArrayT<Real3>;
716template class VariableArrayT<Real3x3>;
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.
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.
virtual IParallelMng * parallelMng() const =0
Gestionnaire de parallélisme associé
virtual IVariable * checkVariable(const VariableInfo &infos)=0
Vérifie une variable.
virtual void synchronize(IVariable *var)=0
Synchronise la variable var en mode bloquant.
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.
virtual IVariableMng * variableMng() const =0
Gestionnaire de variable associé à 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
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.
Infos caractérisant une variable.
void _setData(const Ref< IData > &data)
Positionne la donnée.
IVariableMng * variableMng() const override
Gestionnaire de variable associé à la variable.
static constexpr Integer simdAlignment()
Alignement pour les structures utilisant la vectorisation.
Vue modifiable d'un tableau d'un type T.
ConstReferenceType at(Int64 i) const
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.
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.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- 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.
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é.
Int32 Integer
Type représentant un entier.