Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CaseTable.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/* CaseTable.cc (C) 2000-2023 */
9/* */
10/* Classe gérant une table de marche. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ValueConvert.h"
15#include "arcane/utils/ITraceMng.h"
16#include "arcane/utils/FatalErrorException.h"
17
18#include "arcane/CaseTable.h"
19#include "arcane/CaseTableParams.h"
20#include "arcane/MathUtils.h"
21#include "arcane/ISubDomain.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32template<class T> void
33_verboseBuiltInGetValue(const CaseTable* table,Integer index,T& v,const String& s)
34{
35 bool is_bad = builtInGetValue(v,s);
36 if (is_bad){
37 ARCANE_FATAL("Table '{0}' index={1} : can not convert value '{2}' to type '{3}'",
38 table->name(),index,s,typeToName(v));
39 }
40}
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44
46CaseTable(const CaseFunctionBuildInfo& info, eCurveType curve_type)
47: CaseFunction(info)
48, m_param_list(nullptr)
49, m_curve_type(curve_type)
50{
51 m_param_list = new CaseTableParams(info.m_param_type);
52 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_USE_LINEAR_SEARCH_IN_CASE_TABLE", true))
53 m_use_fast_search = v.value() == 0;
54}
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
58
59CaseTable::
60~CaseTable()
61{
62 delete m_param_list;
63}
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67
68bool CaseTable::
69_isValidIndex(Integer index) const
70{
71 Integer n = nbElement();
72 if (n==0)
73 return false;
74 if (index>=n)
75 return false;
76 return true;
77}
78
79/*---------------------------------------------------------------------------*/
80/*---------------------------------------------------------------------------*/
81
83valueToString(Integer id,String& str) const
84{
85 if (_isValidIndex(id))
86 str = m_value_list[id].asString();
87 else
88 str = String();
89}
90
91/*---------------------------------------------------------------------------*/
92/*---------------------------------------------------------------------------*/
93
95paramToString(Integer id,String& str) const
96{
97 m_param_list->toString(id,str);
98}
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102
104value(Real param,Real& v) const
105{ _findValueAndApplyTransform(param,v); }
106
108value(Real param,Integer& v) const
109{ _findValueAndApplyTransform(param,v); }
110
112value(Real param,bool& v) const
113{ _findValueAndApplyTransform(param,v); }
114
116value(Real param,String& v) const
117{ _findValueAndApplyTransform(param,v); }
118
120value(Real param,Real3& v) const
121{ _findValueAndApplyTransform(param,v); }
122
124value(Integer param,Real& v) const
125{ _findValueAndApplyTransform(param,v); }
126
128value(Integer param,Integer& v) const
129{ _findValueAndApplyTransform(param,v); }
130
131void CaseTable::
132value(Integer param,bool& v) const
133{ _findValueAndApplyTransform(param,v); }
134
136value(Integer param,String& v) const
137{ _findValueAndApplyTransform(param,v); }
138
140value(Integer param,Real3& v) const
141{ _findValueAndApplyTransform(param,v); }
142
143/*---------------------------------------------------------------------------*/
144/*---------------------------------------------------------------------------*/
145
147setParam(Integer id,const String& str)
148{
149 return m_param_list->setValue(id,str);
150}
151
152/*---------------------------------------------------------------------------*/
153/*---------------------------------------------------------------------------*/
154
156setValue(Integer id,const String& str)
157{
158 if (_isValidIndex(id))
159 return _setValue(id,str);
160 return ErrNo;
161}
162
163/*---------------------------------------------------------------------------*/
164/*---------------------------------------------------------------------------*/
165
166CaseTable::eError CaseTable::
167_setValue(Integer index,const String& value_str)
168{
169 SmallVariant variant(value_str);
170 eValueType value_type(valueType());
171 if (value_type==ValueReal){
172 Real v = 0.;
173 if (builtInGetValue(v,value_str)){
175 }
176 variant.setValueAll(v);
177 }
178 else if (value_type==ValueInteger){
179 Integer v = 0;
180 if (builtInGetValue(v,value_str)){
182 }
183 variant.setValueAll(v);
184 }
185 else if (value_type==ValueBool){
186 bool v = 0;
187 if (builtInGetValue(v,value_str)){
189 }
190 variant.setValueAll(v);
191 }
192
193 if (index>=m_value_list.size()){
194 m_value_list.add(variant);
195 }
196 else
197 m_value_list[index] = variant;
198
199 return ErrNo;
200}
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204
206setParamType(eParamType new_type)
207{
208 bool type_changed = (new_type!=paramType());
210 if (type_changed)
211 m_param_list->setType(new_type);
212}
213
214/*---------------------------------------------------------------------------*/
215/*---------------------------------------------------------------------------*/
216/*!
217 * \todo en cas d'erreur de l'un des deux, ne pas changer la valeur de l'autre.
218 */
220appendElement(const String& param,const String& value)
221{
222 eError err = m_param_list->appendValue(param);
223 if (err!=ErrNo)
224 return err;
225
226 return _setValue(m_value_list.size(),value);
227}
228
229/*---------------------------------------------------------------------------*/
230/*---------------------------------------------------------------------------*/
231
233insertElement(Integer id)
234{
235 // Ajoute un élément à la fin.
236 Integer n = nbElement();
237 if (n==0)
238 return;
239 if (id>=n)
240 id = n-1;
241
242
243 String param_str;
244 m_param_list->toString(n-1,param_str);
245 m_param_list->appendValue(param_str);
246
247 //SmallVariant value_str(m_value_list[n-1]);
248 m_value_list.add(m_value_list[n-1]);
249
250 for( Integer i=n; i>id; --i ){
251 m_param_list->toString(i-1,param_str);
252 m_param_list->setValue(i,param_str);
253 m_value_list[i] = m_value_list[i-1];
254 }
255}
256
257/*---------------------------------------------------------------------------*/
258/*---------------------------------------------------------------------------*/
259
261removeElement(Integer id)
262{
263 if (!_isValidIndex(id))
264 return;
265
266 m_value_list.remove(id);
267 m_param_list->removeValue(id);
268}
269
270/*---------------------------------------------------------------------------*/
271/*---------------------------------------------------------------------------*/
272
274nbElement() const
275{
276 return m_param_list->nbElement();
277}
278
279/*---------------------------------------------------------------------------*/
280/*---------------------------------------------------------------------------*/
281
283checkIfValid() const
284{
285 return true;
286}
287
288/*---------------------------------------------------------------------------*/
289/*---------------------------------------------------------------------------*/
290
291template<class U,class V> void CaseTable::
292_findValueAndApplyTransform(U param,V& avalue) const
293{
294 _findValue(param,avalue);
295 _applyValueTransform(avalue);
296}
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300
301template<typename U> Real
302_curveLinear(Real current_value,Real next_value,U t)
303{
304 return (Real)(current_value + (next_value-current_value)*t );
305}
306template<typename U> Real3
307_curveLinear(Real3 current_value,Real3 next_value,U t)
308{
309 return current_value + (next_value-current_value)*t;
310}
311template<typename U> Integer
312_curveLinear(Integer current_value,Integer next_value,U t)
313{
314 return Convert::toInteger( current_value + (next_value-current_value)*t );
315}
316template<typename U> bool
317_curveLinear(bool,bool,U)
318{
319 ARCANE_FATAL("Invalid for 'bool' type");
320}
321template<typename U> String
322_curveLinear(const String&,const String&,U)
323{
324 ARCANE_FATAL("Invalid for 'String' type");
325}
326
327/*---------------------------------------------------------------------------*/
328/*---------------------------------------------------------------------------*/
329/*!
330 * \brief Calcul la valeur de la courbe pour le paramètre \a param.
331 * La valeur est stockée dans \a value.
332 *
333 * \retval false en cas de succès
334 * \retval true si erreur
335 */
336template<typename ParamType,typename ValueType> void CaseTable::
337_findValue(ParamType param,ValueType& avalue) const
338{
339 _applyParamTransform(param);
340
341 // On suppose que les éléments de la table sont rangés par paramètres
342 // croissants (begin[i+1]>begin[i])
343 Integer nb_elem = nbElement();
344
345 Int32 i0 = 0;
346 Int32 iend = nb_elem;
347 if (m_use_fast_search)
348 m_param_list->getRange(param,i0,iend);
349
350 for( Integer i=i0; i<iend; ++i ){
351 const String& current_value_str = m_value_list[i].asString();
352 ParamType current_begin_value;
353 m_param_list->value(i,current_begin_value);
354
355 // Si dernier élément, on prend la valeur de celui-ci
356 if ((i+1)==nb_elem){
357 _verboseBuiltInGetValue(this,i,avalue,current_value_str);
358 return;
359 }
360
361 // Tout d'abord, regarde si le paramètre n'est pas
362 // égal ou inférieur à la borne actuelle.
363 if (math::isEqual(current_begin_value,param) || param<current_begin_value ){
364 _verboseBuiltInGetValue(this,i,avalue,current_value_str);
365 return;
366 }
367
368 const String& next_value_str = m_value_list[i+1].asString();
369 ParamType next_begin_value;
370 m_param_list->value(i+1,next_begin_value);
371
372 // Regarde si le paramètre n'est pas égal à la borne de l'élément suivant.
373 if (math::isEqual(next_begin_value,param)){
374 _verboseBuiltInGetValue(this,i,avalue,next_value_str);
375 return;
376 }
377
378 // Regarde si le paramètre est compris entre l'élément courant et le suivant.
379 if (param>current_begin_value && param<next_begin_value){
380 ValueType current_value = ValueType();
381 ValueType next_value = ValueType();
382 _verboseBuiltInGetValue(this,i,current_value,current_value_str);
383 if (m_curve_type==CurveConstant){
384 avalue = current_value;
385 return;
386 }
387 if (m_curve_type==CurveLinear){
388 _verboseBuiltInGetValue(this,i,next_value,next_value_str);
389 ParamType diff = next_begin_value - current_begin_value;
390 if (math::isZero(diff))
391 ARCANE_FATAL("Table '{0}' index={1} : DeltaX==0.0",name(),i);
392 ParamType t = (param - current_begin_value) / diff;
393 avalue = _curveLinear<ParamType>(current_value,next_value,t);
394 return;
395 }
396 }
397 }
398}
399
400/*---------------------------------------------------------------------------*/
401/*---------------------------------------------------------------------------*/
402
403} // End namespace Arcane
404
405/*---------------------------------------------------------------------------*/
406/*---------------------------------------------------------------------------*/
407
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Informations pour construire une instance de CaseFunction.
ICaseFunction::eParamType m_param_type
Type du paramètre (x)
void setParamType(eParamType type) override
Positionne le type de paramètre de la fonction.
String name() const override
nom de la fonction
eValueType valueType() const override
Type des valeurs de la fonction.
eParamType paramType() const override
Type du paramètre de la fonction.
virtual eError setValue(Integer id, const String &value)
Modifie la valeur de l'élément id.
Definition CaseTable.cc:156
virtual eError appendElement(const String &param, const String &value)
Ajoute un élément à la table.
Definition CaseTable.cc:220
virtual void setParamType(eParamType type)
Positionne le type de paramètre de la fonction.
Definition CaseTable.cc:206
virtual void insertElement(Integer id)
Insère un couple (paramètre,valeur) dans la fonction.
Definition CaseTable.cc:233
eCurveType
Type de la courbe de la table.
Definition CaseTable.h:64
@ CurveLinear
Courbe linéaire par morceau.
Definition CaseTable.h:67
@ CurveConstant
Courbe constante par morceau.
Definition CaseTable.h:66
virtual Integer nbElement() const
Nombre d'éléments de la fonction.
Definition CaseTable.cc:274
CaseTable(const CaseFunctionBuildInfo &info, eCurveType curve_type)
Construit une table de marche du jeu de données.
Definition CaseTable.cc:46
virtual void removeElement(Integer id)
Supprime un couple (paramètre,valeur) dans la fonction.
Definition CaseTable.cc:261
eError
Type des erreurs retournées par la classe.
Definition CaseTable.h:47
@ ErrCanNotConvertValueToRightType
Indique que la conversion de la valeur vers le type souhaité est impossible.
Definition CaseTable.h:54
virtual void value(Real param, Real &v) const
Valeur v de l'option pour le paramètre param.
Definition CaseTable.cc:104
virtual eError setParam(Integer id, const String &value)
Modifie le paramètre de l'élément id.
Definition CaseTable.cc:147
virtual bool checkIfValid() const
Vérifie la validité de la fonction.
Definition CaseTable.cc:283
virtual void paramToString(Integer id, String &param) const
\id ième paramètre dans la chaîne str
Definition CaseTable.cc:95
virtual void valueToString(Integer id, String &str) const
\id ième valeur dans la chaîne str
Definition CaseTable.cc:83
eParamType
Type d'un paramètre d'une fonction.
eValueType
Type d'une valeur d'une fonction.
@ ValueInteger
Valeur de type entière.
@ ValueReal
Valeur de type réelle.
@ ValueBool
Valeur de type entière.
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Classe gérant un type polymorphe.
Integer size() const
Nombre d'éléments du vecteur.
void remove(Int64 index)
Supprime l'entité ayant l'indice index.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Chaîne de caractères unicode.
Integer toInteger(Real r)
Converti un Real en Integer.
Definition Convert.h:53
constexpr __host__ __device__ bool isEqual(const _Type &a, const _Type &b)
Teste l'égalité bit à bit entre deux valeurs.
Definition Numeric.h:253
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.