TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Fluide_reel_base.h
1/****************************************************************************
2* Copyright (c) 2026, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#ifndef Fluide_reel_base_included
17#define Fluide_reel_base_included
18
19#include <Fluide_base.h>
20#include <functional>
21#include <span.hpp>
22#include <Param.h>
23#include <vector>
24#include <array>
25#include <map>
26
27enum class Loi_en_T;
28enum class Loi_en_h;
29
30using MLoiSpanD = std::map<Loi_en_T, tcb::span<double>>;
31using MLoiSpanD_h = std::map<Loi_en_h, tcb::span<double>>;
32using MSpanD = std::map<std::string, tcb::span<double>>;
33using VectorD = std::vector<double>;
34using ArrayD = std::array<double,1>;
35using SpanD = tcb::span<double>;
36
37
38/*! @brief Classe Fluide_reel_base Cette classe represente un fluide reel ainsi que
39 *
40 * ses proprietes:
41 * - viscosite cinematique, (mu)
42 * - viscosite dynamique, (nu)
43 * - masse volumique, (rho)
44 * - diffusivite, (alpha)
45 * - conductivite, (lambda)
46 * - capacite calorifique, (Cp)
47 * - dilatabilite thermique du constituant (beta_co)
48 *
49 * @sa Milieu_base
50 */
52{
53 Declare_base_sans_constructeur(Fluide_reel_base);
54public :
56 {
57 converter_H_to_T_.set_instance(*this);
58 converter_T_to_H_.set_instance(*this);
59 }
60
61 bool initTimeStep(double dt) override;
62 int initialiser(const double temps) override;
63 int check_unknown_range() const override; //verifie que chaque inconnue "inco" est entre val_min[inco] et val_max[inco]
64 int is_incompressible() const override { return (P_ref_ >= 0 && T_ref_ >= 0) || (P_ref_ >= 0 && h_ref_ >= 0); }
65 void abortTimeStep() override;
66 void mettre_a_jour(double temps) override;
67 void preparer_calcul() override;
68 void set_param(Param& param) const override;
69 void discretiser(const Probleme_base& pb, const Discretisation_base& dis) override;
70 void creer_champs_non_lus() override { /* everything is done in discretiser */ }
71
72 //gamme range[inco] = { min, max} : par defaut, rien a controler
73 virtual std::map<std::string, std::array<double, 2>> unknown_range() const { return {}; }
74 virtual std::map<std::string, std::array<double, 2>> unknown_range_h() const { return {}; }
75
76 // Methodes utilisees uniquement dans Pb_Euler
77 inline virtual double calculer_vitesse_son(const double& rho, const double& p) const
78 {
79 Process::exit("Fluide_reel_base::calculer_vitesse_son is not implemented for your fluid !!! To call only for Pb_Euler also ... \n");
80 return 0.;
81 }
82 inline virtual double calculer_pression(const double& rho, const double& rhou, const double& rhoE) const
83 {
84 Process::exit("Fluide_reel_base::calculer_vitesse_son is not implemented for your fluid !!! To call only for Pb_Euler also ... \n");
85 return 0.;
86 }
87 inline virtual double init_energie_tot(const double& rho, const double& norm_U, const double& u) const
88 {
89 Process::exit("Fluide_reel_base::calculer_vitesse_son is not implemented for your fluid !!! To call only for Pb_Euler also ... \n");
90 return 0.;
91 }
92
93protected :
94 double T_ref_ = -1., P_ref_ = -1., h_ref_ = -1., t_init_ = -1.;
95 int first_maj_ = 1;
96 bool res_en_T_ = true; // par defaut resolution en T
97
100
103
104 /*
105 * *****************
106 * Pour compressible
107 * *****************
108 */
109
110 /* Lois en T */
111 // densite
112 virtual void rho_(const SpanD T, const SpanD P, SpanD R, int ncomp = 1, int id = 0) const = 0;
113 virtual void dP_rho_(const SpanD T, const SpanD P, SpanD dP_R, int ncomp = 1, int id = 0) const = 0;
114 virtual void dT_rho_(const SpanD T, const SpanD P, SpanD dT_R, int ncomp = 1, int id = 0) const = 0;
115
116 // enthalpie
117 virtual void h_(const SpanD T, const SpanD P, SpanD H, int ncomp = 1, int id = 0) const = 0;
118 virtual void dP_h_(const SpanD T, const SpanD P, SpanD dP_H, int ncomp = 1, int id = 0) const = 0;
119 virtual void dT_h_(const SpanD T, const SpanD P, SpanD dT_H, int ncomp = 1, int id = 0) const = 0;
120
121 // lois champs "faibles" -> pas de derivees
122 virtual void cp_(const SpanD T, const SpanD P, SpanD CP, int ncomp = 1, int id = 0) const = 0;
123 virtual void beta_(const SpanD T, const SpanD P, SpanD B, int ncomp = 1, int id = 0) const = 0;
124 virtual void mu_(const SpanD T, const SpanD P, SpanD M, int ncomp = 1, int id = 0) const = 0;
125 virtual void lambda_(const SpanD T, const SpanD P, SpanD L, int ncomp = 1, int id = 0) const = 0;
126
127 // methodes particulieres par application pour gagner en performance : utilisees dans Pb_Multiphase (pour le moment !)
128 virtual void compute_CPMLB_pb_multiphase_(const MSpanD , MLoiSpanD, int ncomp = 1, int id = 0) const;
129 virtual void compute_all_pb_multiphase_(const MSpanD , MLoiSpanD, MLoiSpanD , int ncomp = 1, int id = 0) const;
130
131 // Methods that can be called if point-to-point calculation is required
132 double _rho_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::rho_>(T,P); }
133 double _dP_rho_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::dP_rho_>(T,P); }
134 double _dT_rho_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::dT_rho_>(T,P); }
135
136 double _h_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::h_>(T,P); }
137 double _dP_h_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::dP_h_>(T,P); }
138 double _dT_h_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::dT_h_>(T,P); }
139
140 double _cp_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::cp_>(T,P); }
141 double _beta_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::beta_>(T,P); }
142 double _mu_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::mu_>(T,P); }
143 double _lambda_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::lambda_>(T,P); }
144
145 /* Lois en h */
146 // densite
147 virtual void rho_h_(const SpanD h, const SpanD P, SpanD R, int ncomp = 1, int id = 0) const = 0;
148 virtual void dP_rho_h_(const SpanD h, const SpanD P, SpanD dP_R, int ncomp = 1, int id = 0) const = 0;
149 virtual void dh_rho_h_(const SpanD h, const SpanD P, SpanD dT_R, int ncomp = 1, int id = 0) const = 0;
150
151 // temperature
152 virtual void T_(const SpanD h, const SpanD P, SpanD H, int ncomp = 1, int id = 0) const = 0;
153 virtual void dP_T_(const SpanD h, const SpanD P, SpanD dP_H, int ncomp = 1, int id = 0) const = 0;
154 virtual void dh_T_(const SpanD h, const SpanD P, SpanD dT_H, int ncomp = 1, int id = 0) const = 0;
155
156 // lois champs "faibles" -> pas de derivees
157 virtual void cp_h_(const SpanD h, const SpanD P, SpanD CP, int ncomp = 1, int id = 0) const = 0;
158 virtual void beta_h_(const SpanD h, const SpanD P, SpanD B, int ncomp = 1, int id = 0) const = 0;
159 virtual void mu_h_(const SpanD h, const SpanD P, SpanD M, int ncomp = 1, int id = 0) const = 0;
160 virtual void lambda_h_(const SpanD h, const SpanD P, SpanD L, int ncomp = 1, int id = 0) const = 0;
161
162 // methods particuliers par application pour gagner en performance : utilise dans Pb_Multiphase (pour le moment !)
163 virtual void compute_CPMLB_pb_multiphase_h_(const MSpanD , MLoiSpanD_h, int ncomp = 1, int id = 0) const;
164 virtual void compute_all_pb_multiphase_h_(const MSpanD , MLoiSpanD_h, MLoiSpanD_h , int ncomp = 1, int id = 0) const;
165
166 // Methods that can be called if point-to-point calculation is required
167 double _rho_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::rho_h_>(h,P); }
168 double _dP_rho_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::dP_rho_h_>(h,P); }
169 double _dh_rho_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::dh_rho_h_>(h,P); }
170
171 double _T_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::T_>(h,P); }
172 double _dP_T_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::dP_T_>(h,P); }
173 double _dh_T_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::dh_T_>(h,P); }
174
175 double _cp_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::cp_h_>(h,P); }
176 double _beta_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::beta_h_>(h,P); }
177 double _mu_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::mu_h_>(h,P); }
178 double _lambda_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::lambda_h_>(h,P); }
179
180private:
181 typedef void(Fluide_reel_base::*function_span_generic)(const SpanD , const SpanD , SpanD , int , int ) const;
182
183 template <function_span_generic FUNC>
184 void double_to_span(const double T_ou_h, const double P, SpanD res) const
185 {
186 ArrayD Tt = {T_ou_h}, Pp = {P}, res_ = {0.};
187 (this->*FUNC)(SpanD(Tt), SpanD(Pp), SpanD(res_),1,0); // fill res_
188 for (auto& val : res) val = res_[0]; // fill res
189 }
190
191 template <function_span_generic FUNC>
192 double double_to_span(const double T_ou_h, const double P) const
193 {
194 ArrayD Tt = {T_ou_h}, Pp = {P}, res_ = {0.};
195 (this->*FUNC)(SpanD(Tt), SpanD(Pp), SpanD(res_),1,0); // fill res_
196 return res_[0];
197 }
198
199 /*
200 * *********************
201 * Pour l'incompressible
202 * *********************
203 */
204
205 /* Lois en T */
206 void _rho_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::rho_>(T,P,res); }
207 void _dP_rho_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dP_rho_>(T,P,res); }
208 void _dT_rho_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dT_rho_>(T,P,res); }
209
210 void _h_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::h_>(T,P,res); }
211 void _dP_h_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dP_h_>(T,P,res); }
212 void _dT_h_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dT_h_>(T,P,res); }
213
214 void _cp_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::cp_>(T,P,res); }
215 void _beta_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::beta_>(T,P,res); }
216 void _mu_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::mu_>(T,P,res); }
217 void _lambda_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::lambda_>(T,P,res); }
218
219 void _compute_CPMLB_pb_multiphase_(MLoiSpanD ) const;
220 void _compute_all_pb_multiphase_(MLoiSpanD , MLoiSpanD ) const;
221
222public:
223 /*
224 * Elie Saikali : struct interne pour convertir les derivees en h a T (pour Pb_Multiphase).
225 *
226 * XXX : VOIR AVEC LE CAHIER D'ANTOINE SI T'ES PAS D'ACCORD (ici, au contraire d'EOS, the doc is available :-) )
227 *
228 * On cherche dX/dP|T et dX/dT|P
229 *
230 * On sait que dX = dX/dP|T dP + dX/dT|P dT = dX/dP|h dP + dX/dh|P dh
231 *
232 * Lets Go :
233 *
234 * dX/dP|h dP + dX/dh|P dh = dX/dP|h dP + dX/dh|P { dh/dP|T dP + dh/dT|P dT }
235 * = { dX/dP|h + dX/dh|P * dh/dP|T } dP + { dX/dh|P * dh/dT|P } dT
236 * = dX/dP|T dP + dX/dT|P dT
237 *
238 * Alors,
239 *
240 * dX/dP|T = dX/dP|h + dX/dh|P * dh/dP|T
241 * dX/dT|P = dX/dh|P * dh/dT|P
242 *
243 * / \ / \ / \
244 * | dX/dP|T | | 1 dh/dP|T | | dX/dP|h |
245 * | | = | | * | |
246 * | dX/dT|P | | 0 dh/dT|P | | dX/dh|P |
247 * \ / \ / \ /
248 */
249
250
251 struct H_to_T
252 {
253 void set_instance(const Fluide_reel_base& fld) { z_fld_ = fld; }
254
255 void dX_dP_T(const SpanD dX_dP_h, const SpanD dX_dh_P, SpanD dX_dP);
256 void dX_dT_P(const SpanD dX_dP_h, const SpanD dX_dh_P, SpanD dX_dT);
257 private:
259 };
260
261 struct T_to_H
262 {
263 void set_instance(const Fluide_reel_base& fld) { z_fld_ = fld; }
264
265 void dX_dP_h(const SpanD dX_dP_T, const SpanD dX_dT_P, SpanD dX_dP);
266 void dX_dh_P(const SpanD dX_dP_T, const SpanD dX_dT_P, SpanD dX_dh);
267 private:
269 };
270
273
274 /* Lois en h */
275 void _rho_h_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::rho_h_>(h,P,res); }
276 void _dP_rho_h_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dP_rho_h_>(h,P,res); }
277 void _dh_rho_h_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dh_rho_h_>(h,P,res); }
278
279 void _T_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::T_>(h,P,res); }
280 void _dP_T_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dP_T_>(h,P,res); }
281 void _dh_T_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dh_T_>(h,P,res); }
282
283 void _cp_h_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::cp_h_>(h,P,res); }
284 void _beta_h_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::beta_h_>(h,P,res); }
285 void _mu_h_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::mu_h_>(h,P,res); }
286 void _lambda_h_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::lambda_h_>(h,P,res); }
287
288 void _compute_CPMLB_pb_multiphase_h_(MLoiSpanD_h ) const;
289 void _compute_all_pb_multiphase_h_(MLoiSpanD_h , MLoiSpanD_h ) const;
290};
291
292#endif /* Fluide_reel_base_included */
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Definition Fluide_base.h:38
Classe Fluide_reel_base Cette classe represente un fluide reel ainsi que.
void _mu_h_(const double h, const double P, SpanD res) const
void calculate_fluid_properties_incompressible()
virtual void dh_T_(const SpanD h, const SpanD P, SpanD dT_H, int ncomp=1, int id=0) const =0
double _dh_rho_h_(const double h, const double P) const
int check_unknown_range() const override
double _lambda_h_(const double h, const double P) const
virtual void dh_rho_h_(const SpanD h, const SpanD P, SpanD dT_R, int ncomp=1, int id=0) const =0
void calculate_fluid_properties_enthalpie()
virtual void lambda_(const SpanD T, const SpanD P, SpanD L, int ncomp=1, int id=0) const =0
virtual void T_(const SpanD h, const SpanD P, SpanD H, int ncomp=1, int id=0) const =0
virtual void compute_CPMLB_pb_multiphase_(const MSpanD, MLoiSpanD, int ncomp=1, int id=0) const
double _dP_T_(const double h, const double P) const
int is_incompressible() const override
void _beta_h_(const double h, const double P, SpanD res) const
double _mu_h_(const double h, const double P) const
double _rho_(const double T, const double P) const
void _compute_CPMLB_pb_multiphase_h_(MLoiSpanD_h) const
virtual std::map< std::string, std::array< double, 2 > > unknown_range() const
double _beta_(const double T, const double P) const
void calculate_fluid_properties_enthalpie_incompressible()
void preparer_calcul() override
virtual void cp_(const SpanD T, const SpanD P, SpanD CP, int ncomp=1, int id=0) const =0
virtual void dT_h_(const SpanD T, const SpanD P, SpanD dT_H, int ncomp=1, int id=0) const =0
int initialiser(const double temps) override
Initialise les parametres du fluide.
double _h_(const double T, const double P) const
virtual void rho_h_(const SpanD h, const SpanD P, SpanD R, int ncomp=1, int id=0) const =0
virtual double calculer_vitesse_son(const double &rho, const double &p) const
virtual void lambda_h_(const SpanD h, const SpanD P, SpanD L, int ncomp=1, int id=0) const =0
double _cp_(const double T, const double P) const
double _beta_h_(const double h, const double P) const
void _rho_h_(const double h, const double P, SpanD res) const
double _dP_h_(const double T, const double P) const
virtual void h_(const SpanD T, const SpanD P, SpanD H, int ncomp=1, int id=0) const =0
virtual void dP_h_(const SpanD T, const SpanD P, SpanD dP_H, int ncomp=1, int id=0) const =0
virtual void cp_h_(const SpanD h, const SpanD P, SpanD CP, int ncomp=1, int id=0) const =0
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps du milieu, et donc de ses parametres caracteristiques.
double _dT_rho_(const double T, const double P) const
void _cp_h_(const double h, const double P, SpanD res) const
double _dh_T_(const double h, const double P) const
double _dP_rho_h_(const double h, const double P) const
virtual void dP_rho_h_(const SpanD h, const SpanD P, SpanD dP_R, int ncomp=1, int id=0) const =0
double _lambda_(const double T, const double P) const
double _cp_h_(const double h, const double P) const
virtual void beta_(const SpanD T, const SpanD P, SpanD B, int ncomp=1, int id=0) const =0
double _dT_h_(const double T, const double P) const
virtual void mu_h_(const SpanD h, const SpanD P, SpanD M, int ncomp=1, int id=0) const =0
virtual void dP_T_(const SpanD h, const SpanD P, SpanD dP_H, int ncomp=1, int id=0) const =0
virtual void mu_(const SpanD T, const SpanD P, SpanD M, int ncomp=1, int id=0) const =0
void _compute_all_pb_multiphase_h_(MLoiSpanD_h, MLoiSpanD_h) const
virtual void dT_rho_(const SpanD T, const SpanD P, SpanD dT_R, int ncomp=1, int id=0) const =0
void discretiser(const Probleme_base &pb, const Discretisation_base &dis) override
double _dP_rho_(const double T, const double P) const
double _mu_(const double T, const double P) const
double _rho_h_(const double h, const double P) const
bool initTimeStep(double dt) override
void _dP_rho_h_(const double h, const double P, SpanD res) const
void _lambda_h_(const double h, const double P, SpanD res) const
virtual void compute_all_pb_multiphase_h_(const MSpanD, MLoiSpanD_h, MLoiSpanD_h, int ncomp=1, int id=0) const
virtual void compute_CPMLB_pb_multiphase_h_(const MSpanD, MLoiSpanD_h, int ncomp=1, int id=0) const
virtual std::map< std::string, std::array< double, 2 > > unknown_range_h() const
virtual void compute_all_pb_multiphase_(const MSpanD, MLoiSpanD, MLoiSpanD, int ncomp=1, int id=0) const
virtual double init_energie_tot(const double &rho, const double &norm_U, const double &u) const
void _dh_rho_h_(const double h, const double P, SpanD res) const
void creer_champs_non_lus() override
virtual void rho_(const SpanD T, const SpanD P, SpanD R, int ncomp=1, int id=0) const =0
void set_param(Param &param) const override
virtual void beta_h_(const SpanD h, const SpanD P, SpanD B, int ncomp=1, int id=0) const =0
void _T_(const double h, const double P, SpanD res) const
virtual void dP_rho_(const SpanD T, const SpanD P, SpanD dP_R, int ncomp=1, int id=0) const =0
void _dP_T_(const double h, const double P, SpanD res) const
double _T_(const double h, const double P) const
void _dh_T_(const double h, const double P, SpanD res) const
void abortTimeStep() override
virtual double calculer_pression(const double &rho, const double &rhou, const double &rhoE) const
OBS_PTR(Domaine_dis_base) zdb_
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
void set_instance(const Fluide_reel_base &fld)
void set_instance(const Fluide_reel_base &fld)