14#include "arcane/core/VariableScalar.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/ITraceMng.h"
23#include "arcane/core/VariableDiff.h"
24#include "arcane/core/VariableBuildInfo.h"
25#include "arcane/core/VariableInfo.h"
26#include "arcane/core/IApplication.h"
27#include "arcane/core/IVariableMng.h"
28#include "arcane/core/IItemFamily.h"
29#include "arcane/core/IVariableSynchronizer.h"
30#include "arcane/core/IDataReader.h"
31#include "arcane/core/ItemGroup.h"
32#include "arcane/core/IDataFactoryMng.h"
33#include "arcane/core/IParallelMng.h"
34#include "arcane/core/IMesh.h"
35#include "arcane/core/internal/IVariableMngInternal.h"
37#include "arcane/datatype/DataStorageBuildInfo.h"
48template<
class DataType>
61 int max_print,
bool compare_ghost)
75 bool compare_failed =
false;
76 Integer ref_size = ref.
size();
78 const Item& item = *i;
79 if (!item.
isOwn() && !compare_ghost)
82 if (group_index_table){
83 index = (*group_index_table)[index];
88 DataType diff = DataType();
91 compare_failed =
true;
94 DataType dref = ref[index];
95 DataType dcurrent = current[index];
96 if (VarDataTypeTraits::verifDifferent(dref,dcurrent,diff,
true)){
97 this->m_diffs_info.add(
DiffInfo(dcurrent,dref,diff,item,NULL_ITEM_ID));
105 msg->
pinfo() <<
"Processor " << sid <<
" : "
106 <<
" Unable to compare : elements numbers are different !"
107 <<
" pour la variable " << var_name <<
" ref_size=" << ref_size;
111 this->_sortAndDump(var,pm,max_print);
122 if constexpr(std::is_same<TrueType,ReduceType>::value)
123 return _checkReplica2(pm,var_value);
126 ARCANE_UNUSED(var_value);
127 ARCANE_UNUSED(max_print);
133 Integer _checkReplica2(
IParallelMng* pm,
const DataType& var_value)
139 DataType max_value = pm->
reduce(Parallel::ReduceMax,var_value);
140 DataType min_value = pm->
reduce(Parallel::ReduceMin,var_value);
143 DataType diff = DataType();
144 if (VarDataTypeTraits::verifDifferent(min_value,max_value,diff,
true)){
145 this->m_diffs_info.add(
DiffInfo(min_value,max_value,diff,0,NULL_ITEM_ID));
166 String storage_full_type =
info.storageTypeInfo().fullName();
167 Ref<IData>
data = df->createSimpleDataRef(storage_full_type,storage_build_info);
168 m_value =
dynamic_cast<ValueDataType*
>(
data.get());
178 ThatClass* true_ptr = 0;
182 true_ptr =
dynamic_cast<ThatClass*
>(var);
184 true_ptr =
new ThatClass(vb,vi);
187 ARCANE_CHECK_PTR(true_ptr);
194template<
typename T> VariableScalarT<T>* VariableScalarT<T>::
195getReference(IVariable* var)
198 throw ArgumentException(A_FUNCINFO,
"null variable");
199 ThatClass* true_ptr =
dynamic_cast<ThatClass*
>(var);
201 ARCANE_FATAL(
"Can not build a reference from variable {0}",var->name());
208template<
typename T>
Integer VariableScalarT<T>::
209checkIfSame(IDataReader* reader,
int max_print,
bool compare_ghost)
215 Ref< IScalarDataT<T> > ref_data(m_value->cloneTrueEmptyRef());
216 reader->read(
this,ref_data.get());
217 ref = ref_data->value();
218 ConstArrayView<T> from_array(1,&from);
219 ConstArrayView<T> ref_array(1,&ref);
220 ScalarVariableDiff<T> csa;
221 return csa.check(
this,ref_array,from_array,max_print,compare_ghost);
232 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
233 const T& value,Integer max_print)
235 ScalarVariableDiff<T> csa;
236 return csa.checkReplica(pm,var,value,max_print);
241 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
242 const Byte& value,Integer max_print)
245 ScalarVariableDiff<Integer> csa;
246 return csa.checkReplica(pm,var,int_value,max_print);
253template<
typename T>
Integer VariableScalarT<T>::
254_checkIfSameOnAllReplica(IParallelMng* replica_pm,Integer max_print)
256 return _checkIfSameOnAllReplicaHelper(replica_pm,
this,value(),max_print);
263print(std::ostream& o)
const
265 o << m_value->value();
284 ARCANE_UNUSED(local_ids);
293 return static_cast<Real
>(
sizeof(T));
302 ARCANE_UNUSED(source);
303 ARCANE_UNUSED(destination);
314 ARCANE_UNUSED(first_source);
315 ARCANE_UNUSED(second_source);
316 ARCANE_UNUSED(destination);
325 ARCANE_UNUSED(new_to_old_ids);
342 ARCANE_UNUSED(group);
348template<
typename DataType>
void
352 _checkSwapIsValid(&rhs);
353 m_value->swapValues(rhs.m_value);
356 rhs.syncReferences();
362template class VariableScalarT<Byte>;
363template class VariableScalarT<Real>;
364template class VariableScalarT<Int16>;
365template class VariableScalarT<Int32>;
366template class VariableScalarT<Int64>;
367template class VariableScalarT<Real2>;
368template class VariableScalarT<Real2x2>;
369template class VariableScalarT<Real3>;
370template class VariableScalarT<Real3x3>;
371template class VariableScalarT<String>;
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Informations pour construire une instance de 'IData'.
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 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 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.
IData * data() override
Données associées à 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.
VariableScalarT(const VariableBuildInfo &v, const VariableInfo &vi)
Construit une variable basée sur la référence v.
void setIsSynchronized() override
Indique que la variable est synchronisée.
void synchronize() override
Synchronise 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 print(std::ostream &o) const override
Imprime les valeurs de la variable sur le flot o.
void compact(Int32ConstArrayView new_to_old_ids) override
Compacte les valeurs de la variable.
Real allocatedMemory() const override
Taille mémoire (en Koctet) utilisée par la variable.
void _setData(const Ref< IData > &data)
Positionne la donnée.
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.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ IK_Particle
Entité de maillage de genre particule.
unsigned char Byte
Type d'un octet.
Int32 Integer
Type représentant un entier.