Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
VariableScalar.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* VariableScalar.cc (C) 2000-2024 */
9/* */
10/* Variable scalaire. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/VariableScalar.h"
15
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"
22
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"
36
37#include "arcane/datatype/DataStorageBuildInfo.h"
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41
42namespace Arcane
43{
44
45/*---------------------------------------------------------------------------*/
46/*---------------------------------------------------------------------------*/
47
48template<class DataType>
50: public VariableDiff<DataType>
51{
54
55 public:
56 //TODO: a simplifier car recopie de ArrayVariableDiff
57 // mais pour les variables scalaires il n'y a qu'une valeur et aucun groupe
58 // associé.
59 Integer
61 int max_print,bool compare_ghost)
62 {
63 ItemGroup group = var->itemGroup();
64 if (group.null())
65 return 0;
66 IMesh* mesh = group.mesh();
67 if (!mesh)
68 return 0;
69 ITraceMng* msg = mesh->traceMng();
70 IParallelMng* pm = mesh->parallelMng();
71
72 GroupIndexTable * group_index_table = (var->isPartial())?group.localIdToIndex().get():0;
73
74 int nb_diff = 0;
75 bool compare_failed = false;
76 Integer ref_size = ref.size();
77 ENUMERATE_ITEM(i,group){
78 const Item& item = *i;
79 if (!item.isOwn() && !compare_ghost)
80 continue;
81 Integer index = item.localId();
83 index = (*group_index_table)[index];
84 if (index<0)
85 continue;
86 }
87
88 DataType diff = DataType();
89 if (index>=ref_size){
90 ++nb_diff;
91 compare_failed = true;
92 }
93 else{
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));
98 ++nb_diff;
99 }
100 }
101 }
102 if (compare_failed){
103 Int32 sid = pm->commRank();
104 const String& var_name = var->name();
105 msg->pinfo() << "Processor " << sid << " : "
106 << " Unable to compare : elements numbers are different !"
107 << " pour la variable " << var_name << " ref_size=" << ref_size;
108
109 }
110 if (nb_diff!=0)
111 this->_sortAndDump(var,pm,max_print);
112
113 return nb_diff;
114 }
115
116 Integer checkReplica(IParallelMng* pm,IVariable* var,const DataType& var_value,
117 Integer max_print)
118 {
119 // Appelle la bonne spécialisation pour être sur que le type template possède
120 // la réduction.
122 if constexpr(std::is_same<TrueType,ReduceType>::value)
123 return _checkReplica2(pm,var_value);
124 ARCANE_UNUSED(pm);
125 ARCANE_UNUSED(var);
126 ARCANE_UNUSED(var_value);
127 ARCANE_UNUSED(max_print);
128 throw NotSupportedException(A_FUNCINFO);
129 }
130
131 private:
132
133 Integer _checkReplica2(IParallelMng* pm,const DataType& var_value)
134 {
135 Int32 nb_rank = pm->commSize();
136 if (nb_rank==1)
137 return 0;
138
139 DataType max_value = pm->reduce(Parallel::ReduceMax,var_value);
140 DataType min_value = pm->reduce(Parallel::ReduceMin,var_value);
141
142 Integer nb_diff = 0;
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));
146 ++nb_diff;
147 }
148 return nb_diff;
149 }
150
151};
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158
159template<typename T> VariableScalarT<T>::
161: Variable(v,info)
162, m_value(nullptr)
163{
164 IDataFactoryMng* df = v.dataFactoryMng();
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());
169 _setData(makeRef(m_value));
170}
171
172/*---------------------------------------------------------------------------*/
173/*---------------------------------------------------------------------------*/
174
175template<typename T> auto VariableScalarT<T>::
176getReference(const VariableBuildInfo& vb,const VariableInfo& vi) -> ThatClass*
177{
178 ThatClass* true_ptr = 0;
179 IVariableMng* vm = vb.variableMng();
180 IVariable* var = vm->checkVariable(vi);
181 if (var)
182 true_ptr = dynamic_cast<ThatClass*>(var);
183 else{
184 true_ptr = new ThatClass(vb,vi);
185 vm->_internalApi()->addVariable(true_ptr);
186 }
187 ARCANE_CHECK_PTR(true_ptr);
188 return true_ptr;
189}
190
191/*---------------------------------------------------------------------------*/
192/*---------------------------------------------------------------------------*/
193
194template<typename T> VariableScalarT<T>* VariableScalarT<T>::
195getReference(IVariable* var)
196{
197 if (!var)
198 throw ArgumentException(A_FUNCINFO,"null variable");
199 ThatClass* true_ptr = dynamic_cast<ThatClass*>(var);
200 if (!true_ptr)
201 ARCANE_FATAL("Can not build a reference from variable {0}",var->name());
202 return true_ptr;
203}
204
205/*---------------------------------------------------------------------------*/
206/*---------------------------------------------------------------------------*/
207
208template<typename T> Integer VariableScalarT<T>::
209checkIfSame(IDataReader* reader,int max_print,bool compare_ghost)
210{
211 if (itemKind()==IK_Particle)
212 return 0;
213 T from(value());
214 T ref = T();
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);
222}
223
224/*---------------------------------------------------------------------------*/
225/*---------------------------------------------------------------------------*/
226// Utilise une fonction Helper afin de spécialiser l'appel dans le
227// cas du type 'Byte' car ArrayVariableDiff::checkReplica() utilise
228// une réduction Min/Max et cela n'existe pas en MPI pour le type Byte.
229namespace
230{
231 template<typename T> Integer
232 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
233 const T& value,Integer max_print)
234 {
235 ScalarVariableDiff<T> csa;
236 return csa.checkReplica(pm,var,value,max_print);
237 }
238
239 // Spécialisation pour le type 'Byte' qui ne supporte pas les réductions.
240 Integer
241 _checkIfSameOnAllReplicaHelper(IParallelMng* pm,IVariable* var,
242 const Byte& value,Integer max_print)
243 {
244 Integer int_value = value;
245 ScalarVariableDiff<Integer> csa;
246 return csa.checkReplica(pm,var,int_value,max_print);
247 }
248}
249
250/*---------------------------------------------------------------------------*/
251/*---------------------------------------------------------------------------*/
252
253template<typename T> Integer VariableScalarT<T>::
254_checkIfSameOnAllReplica(IParallelMng* replica_pm,Integer max_print)
255{
256 return _checkIfSameOnAllReplicaHelper(replica_pm,this,value(),max_print);
257}
258
259/*---------------------------------------------------------------------------*/
260/*---------------------------------------------------------------------------*/
261
262template<typename T> void VariableScalarT<T>::
263print(std::ostream& o) const
264{
265 o << m_value->value();
266}
267
268/*---------------------------------------------------------------------------*/
269/*---------------------------------------------------------------------------*/
270
271template<typename T> void VariableScalarT<T>::
273{
274 // Rien à faire pour les variables scalaires
275}
276
277/*---------------------------------------------------------------------------*/
278/*---------------------------------------------------------------------------*/
279
280template<typename T> void VariableScalarT<T>::
282{
283 // Rien à faire pour les variables scalaires
284 ARCANE_UNUSED(local_ids);
285}
286
287/*---------------------------------------------------------------------------*/
288/*---------------------------------------------------------------------------*/
289
290template<typename T> Real VariableScalarT<T>::
291allocatedMemory() const
292{
293 return static_cast<Real>(sizeof(T));
294}
295
296/*---------------------------------------------------------------------------*/
297/*---------------------------------------------------------------------------*/
298
299template<typename T> void VariableScalarT<T>::
301{
302 ARCANE_UNUSED(source);
303 ARCANE_UNUSED(destination);
304}
305
306/*---------------------------------------------------------------------------*/
307/*---------------------------------------------------------------------------*/
308
309template<typename T> void VariableScalarT<T>::
312 Int32ConstArrayView destination)
313{
314 ARCANE_UNUSED(first_source);
315 ARCANE_UNUSED(second_source);
316 ARCANE_UNUSED(destination);
317}
318
319/*---------------------------------------------------------------------------*/
320/*---------------------------------------------------------------------------*/
321
322template<typename T> void VariableScalarT<T>::
324{
325 ARCANE_UNUSED(new_to_old_ids);
326}
327
328/*---------------------------------------------------------------------------*/
329/*---------------------------------------------------------------------------*/
330
331template<typename T> void VariableScalarT<T>::
333{
334}
335
336/*---------------------------------------------------------------------------*/
337/*---------------------------------------------------------------------------*/
338
339template<typename T> void VariableScalarT<T>::
340setIsSynchronized(const ItemGroup& group)
341{
342 ARCANE_UNUSED(group);
343}
344
345/*---------------------------------------------------------------------------*/
346/*---------------------------------------------------------------------------*/
347
348template<typename DataType> void
350swapValues(ThatClass& rhs)
351{
352 _checkSwapIsValid(&rhs);
353 m_value->swapValues(rhs.m_value);
354 // Il faut mettre à jour les références pour cette variable et \a rhs.
355 syncReferences();
356 rhs.syncReferences();
357}
358
359/*---------------------------------------------------------------------------*/
360/*---------------------------------------------------------------------------*/
361
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>;
372
373/*---------------------------------------------------------------------------*/
374/*---------------------------------------------------------------------------*/
375
376} // End namespace Arcane
377
378/*---------------------------------------------------------------------------*/
379/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
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.
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.
Interface d'une variable.
Definition IVariable.h:54
Groupe d'entités de maillage.
Definition ItemGroup.h:49
SharedPtrT< GroupIndexTable > localIdToIndex() const
Table des local ids vers une position pour toutes les entités du groupe.
Definition ItemGroup.h:292
bool null() const
true is le groupe est le groupe nul
Definition ItemGroup.h:70
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:126
Classe de base d'un élément de maillage.
Definition Item.h:83
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:210
bool isOwn() const
true si l'entité est appartient au sous-domaine
Definition Item.h:244
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
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.
Variable scalaire.
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.
Instance d'une variable.
Definition Variable.h:79
void _setData(const Ref< IData > &data)
Positionne la donnée.
Definition Variable.cc:863
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
Exception lorsqu'une opération n'est pas supportée.
Chaîne de caractères unicode.
TraceMessage pinfo() const
Flot pour un message d'information en parallèle.
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.
Definition UtilsTypes.h:142
Int32 Integer
Type représentant un entier.