Arcane  v3.16.0.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-2024 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/core/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;
53 typedef typename VariableDiff<DataType>::DiffInfo DiffInfo;
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é.
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();
72 GroupIndexTable * group_index_table = (var->isPartial())?group.localIdToIndex().get():0;
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>::
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);
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 {
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;
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
362ARCANE_INTERNAL_INSTANTIATE_TEMPLATE_FOR_NUMERIC_DATATYPE(VariableScalarT);
363template class VariableScalarT<String>;
364
365/*---------------------------------------------------------------------------*/
366/*---------------------------------------------------------------------------*/
367
368} // End namespace Arcane
369
370/*---------------------------------------------------------------------------*/
371/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
Exception lorsqu'un argument est invalide.
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'.
Interface de lecture des données d'une variable.
Definition IDataReader.h:41
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.
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:219
bool isOwn() const
true si l'entité est appartient au sous-domaine
Definition Item.h:253
Référence à une instance.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
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.
IMesh * mesh() const final
Maillage auquel est associé la variable.
Definition Variable.cc:789
Variable(const VariableBuildInfo &v, const VariableInfo &vi)
Créé une variable lié à la référence v.
Definition Variable.cc:332
void _setData(const Ref< IData > &data)
Positionne la donnée.
Definition Variable.cc:863
@ ReduceMin
Minimum des valeurs.
@ ReduceMax
Maximum des valeurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569
@ IK_Particle
Entité de maillage de genre particule.
double Real
Type représentant un réel.
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:43
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.