19Implemente_instanciable_sans_constructeur_ni_destructeur(
Table,
"Table",
Objet_U);
42 fval.dimensionner(nb_comp);
43 for (
int i = 0; i < nb_comp; i++)
46 Cerr <<
"Reading and interpretation of the function " << tmp << finl;
48 fval[i].setString(tmp);
49 fval[i].addVar(
"val");
50 fval[i].parseString();
52 Cerr <<
"Interpretation of the function " << tmp <<
" OK" << finl;
66 fval.dimensionner(dim);
67 for (
int i=0; i<dim; i++)
71 fval[i].setString(tmp);
76 fval[i].addVar(
"val");
77 fval[i].parseString();
79 Cerr <<
"Interpretation of the function " << tmp <<
" OK" << finl;
111double nlinear_interpolation(
const std::vector<double>& x,
const std::vector<std::pair<double, double>>& gridpoints,
const std::vector<double>& data)
113 const int n = (int)x.size();
116 std::vector<double> weight(n);
117 for (
int i = 0; i < n; i++)
118 weight[i] = std::min(1.0, std::max(0.0, (x[i] - gridpoints[i].first) / (gridpoints[i].second - gridpoints[i].first)));
122 double interpolant = 0.0, prod;
123 for (
int j = 0, i; j < (1<<n); interpolant += prod, j++)
124 for (prod = data[j], i = 0; i < n; i++) prod *= (j >> (n - 1 - i)) & 1 ? weight[i] : 1.0 - weight[i];
132 assert(les_parametres.size() == 1);
133 const DoubleVect& p = les_parametres[0];
134 const int size = p.
size();
135 if (p[0] >= vp)
return les_valeurs(0);
138 for (
int i = 1; i < size; i++)
139 if (p[i] == vp)
return les_valeurs(i);
140 else if (p[i] > vp)
return (les_valeurs(i - 1) + ((les_valeurs(i) - les_valeurs(i - 1)) / (p[i] - p[i - 1])) * (vp - p[i - 1]));
142 return les_valeurs(size - 1);
147 std::vector<double> vals_param {val_param};
148 return val(vals_param, ncomp);
151double Table::val(
const std::vector<double>& vals_param,
int ncomp)
const
153 const int nb_param = les_parametres.size();
154 int nb_comp = les_valeurs.size();
155 if (nb_param == (
int)vals_param.size())
157 std::vector<double> data;
158 std::vector<int> icube;
159 std::vector<std::pair<double, double>> gridpoints;
161 for (
int ip = 0; ip < nb_param; ip++)
163 const DoubleVect& p = les_parametres[ip];
166 Cerr <<
"Error, a table should have more than one single value." << finl;
170 int i_interval = p.
size() - 1;
171 for (
int i = 1; i < p.
size(); i++)
172 if (vals_param[ip] < p[i])
177 icube.push_back(i_interval - 1);
178 gridpoints.push_back({p[i_interval - 1], p[i_interval]});
180 for (
int j = 0; j < (1 << nb_param); j++)
182 std::vector<int> index(nb_param, 0);
183 for (
int k = 0; k < nb_param; k++) index[nb_param - 1 - k] = icube[nb_param - 1 - k] + ((j >> k) & 1);
187 for (
int i = 1; i < nb_param; i++)
188 k = k * les_parametres[i].size() + index[i];
189 k = k * nb_comp + ncomp;
191 data.push_back(les_valeurs[k]);
194 return nlinear_interpolation(vals_param, gridpoints, data);
196 else if (isf == 1 && vals_param.size() == 1)
202 else Process::exit(
"Error in a Table::val : wrong number of parameters.");
214 Cerr <<
"Table::val(const DoubleVect& ) is not coded yet." << finl;
232 if (les_parametres.size() == 1)
235 const DoubleVect& p = les_parametres[0];
237 if (p[0] >= val_param)
240 for(
int j=0; j<size; j++)
241 x[j] = les_valeurs(0,j);
243 else if (p[size_p-1] <= val_param)
246 for(
int j=0; j<size; j++)
247 x[j] = les_valeurs(size_p-1,j);
251 for (
int i=1; i<size_p; i++)
252 if (p[i] == val_param)
255 for(
int j=0; j<size; j++)
256 x[j] = les_valeurs(i,j);
259 else if (p[i] > val_param)
262 for(
int j=0; j<size; j++)
263 x[j] = les_valeurs(i-1,j)+
264 ((les_valeurs(i,j)-les_valeurs(i-1,j))/(p[i]-p[i-1]))
265 *(val_param-p[i-1]) ;
272 Cerr <<
"Error in a Table : it misses some parameters." << finl;
285 Cerr <<
"Table::val(const DoubleVect& ) is not coded yet." << finl;
292DoubleTab&
Table::valeurs(
const DoubleTab& val_param,
const DoubleTab& pos,
const double tps,DoubleTab& aval)
const
307 double val_ = param[0];
308 for (
int i = 1; i < param.
size(); i++)
309 if (val_ < param[i]) val_ = param[i];
312 les_valeurs.ref(aval);
313 les_parametres.dimensionner(1);
314 les_parametres[0].ref(param);
320 for (
int n = 0; n < params.
size(); n++)
322 double val_ = params[n][0];
323 for (
int i = 1; i < params[n].
size(); i++)
324 if (val_ < params[n][i]) val_ = params[n][i];
329 les_parametres.dimensionner(params.
size());
330 for (
int i = 0; i < params.
size(); i++) les_parametres[i].ref(params[i]);
333static bool checked=
false;
338 for (
int comp = 0; comp < les_valeurs.dimension(1); comp++)
340 double val_ = les_valeurs(0, comp);
341 for (
int i = 1; i < les_valeurs.dimension(0); i++)
342 if (val_ != les_valeurs(i, comp))
343 instationnaire_ =
true;
347 return instationnaire_;
Class defining operators and methods for all reading operation in an input flow (file,...
class Nom Une chaine de caractere pour nommer les objets de TRUST
classe Objet_U Cette classe est la classe de base des Objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Classe Parser_Eval Cette classe a pour fonction d evaleur les valeurs prises par une fonction analyti...
VECT(Parser_U) &fonction()
void eval_fct(const DoubleTab &positions, DoubleTab &val) const
classe Parser_U Version de la classe Parser, derivant de Objet_U.
void setVar(const char *sv, double val)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
Table()
Constructeur par defaut.
void remplir(const DoubleVect ¶m, const DoubleTab &val)
Affecte les parametres et les valeurs de la table.
double val_simple(double vals_param) const
double val(const double val_param, int ncomp=0) const
DoubleTab & valeurs(const DoubleTab &val_param, const DoubleTab &pos, const double tps, DoubleTab &val) const
Entree & lire_f(Entree &is, const int nb_comp)
Entree & lire_fxyzt(Entree &is, const int dim)
bool instationnaire() const