Arcane  v3.14.10.0
Documentation utilisateur
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{
52 typedef VariableDataTypeTraitsT<DataType> VarDataTypeTraits;
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();
82 if (group_index_table){
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.
121 using ReduceType = typename VariableDataTypeTraitsT<DataType>::HasReduceMinMax;
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();
165 DataStorageBuildInfo storage_build_info(v.traceMng());
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>::
311 Int32ConstArrayView second_source,
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>::
323compact(Int32ConstArrayView new_to_old_ids)
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'.
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.
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
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.
Definition Variable.cc:863
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.
Definition UtilsTypes.h:142
Int32 Integer
Type représentant un entier.