TrioCFD 1.9.9_beta
TrioCFD documentation
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 Represents a real fluid and its physical properties:
39 *
40 * - kinematic viscosity, (mu)
41 * - dynamic viscosity, (nu)
42 * - density, (rho)
43 * - diffusivity, (alpha)
44 * - thermal conductivity,(lambda)
45 * - heat capacity, (Cp)
46 * - thermal expansion coefficient (beta_co)
47 *
48 * @sa Milieu_base
49 */
51{
52 Declare_base_sans_constructeur(Fluide_reel_base);
53public :
55 {
56 converter_H_to_T_.set_instance(*this);
57 converter_T_to_H_.set_instance(*this);
58 }
59
60 bool initTimeStep(double dt) override;
61 int initialiser(const double temps) override;
62 int check_unknown_range() const override; // verifies that each unknown "inco" lies between val_min[inco] and val_max[inco]
63 int is_incompressible() const override { return (P_ref_ >= 0 && T_ref_ >= 0) || (P_ref_ >= 0 && h_ref_ >= 0); }
64 void abortTimeStep() override;
65 void mettre_a_jour(double temps) override;
66 void preparer_calcul() override;
67 void set_param(Param& param) const override;
68 void discretiser(const Probleme_base& pb, const Discretisation_base& dis) override;
69 void creer_champs_non_lus() override { /* everything is done in discretiser */ }
70
71 // range[inco] = { min, max}: by default, nothing to check
72 virtual std::map<std::string, std::array<double, 2>> unknown_range() const { return {}; }
73 virtual std::map<std::string, std::array<double, 2>> unknown_range_h() const { return {}; }
74
75 // Methods used only in Pb_Euler
76 inline virtual double calculer_vitesse_son(const double& rho, const double& p) const
77 {
78 Process::exit("Fluide_reel_base::calculer_vitesse_son is not implemented for your fluid !!! To call only for Pb_Euler also ... \n");
79 return 0.;
80 }
81 inline virtual double calculer_pression(const double& rho, const double& rhou, const double& rhoE) const
82 {
83 Process::exit("Fluide_reel_base::calculer_vitesse_son is not implemented for your fluid !!! To call only for Pb_Euler also ... \n");
84 return 0.;
85 }
86 inline virtual double init_energie_tot(const double& rho, const double& norm_U, const double& u) const
87 {
88 Process::exit("Fluide_reel_base::calculer_vitesse_son is not implemented for your fluid !!! To call only for Pb_Euler also ... \n");
89 return 0.;
90 }
91
92protected :
93 double T_ref_ = -1., P_ref_ = -1., h_ref_ = -1., t_init_ = -1.;
94 int first_maj_ = 1;
95 bool res_en_T_ = true; // by default resolution in T
96
99
102
103 /*
104 * *******************
105 * For compressible
106 * *******************
107 */
108
109 /* Laws in T */
110 // density
111 virtual void rho_(const SpanD T, const SpanD P, SpanD R, int ncomp = 1, int id = 0) const = 0;
112 virtual void dP_rho_(const SpanD T, const SpanD P, SpanD dP_R, int ncomp = 1, int id = 0) const = 0;
113 virtual void dT_rho_(const SpanD T, const SpanD P, SpanD dT_R, int ncomp = 1, int id = 0) const = 0;
114
115 // enthalpy
116 virtual void h_(const SpanD T, const SpanD P, SpanD H, int ncomp = 1, int id = 0) const = 0;
117 virtual void dP_h_(const SpanD T, const SpanD P, SpanD dP_H, int ncomp = 1, int id = 0) const = 0;
118 virtual void dT_h_(const SpanD T, const SpanD P, SpanD dT_H, int ncomp = 1, int id = 0) const = 0;
119
120 // "weak" field laws -> no derivatives
121 virtual void cp_(const SpanD T, const SpanD P, SpanD CP, int ncomp = 1, int id = 0) const = 0;
122 virtual void beta_(const SpanD T, const SpanD P, SpanD B, int ncomp = 1, int id = 0) const = 0;
123 virtual void mu_(const SpanD T, const SpanD P, SpanD M, int ncomp = 1, int id = 0) const = 0;
124 virtual void lambda_(const SpanD T, const SpanD P, SpanD L, int ncomp = 1, int id = 0) const = 0;
125
126 // application-specific methods to improve performance: used in Pb_Multiphase (for now!)
127 virtual void compute_CPMLB_pb_multiphase_(const MSpanD , MLoiSpanD, int ncomp = 1, int id = 0) const;
128 virtual void compute_all_pb_multiphase_(const MSpanD , MLoiSpanD, MLoiSpanD , int ncomp = 1, int id = 0) const;
129
130 // Methods that can be called if point-to-point calculation is required
131 double _rho_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::rho_>(T,P); }
132 double _dP_rho_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::dP_rho_>(T,P); }
133 double _dT_rho_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::dT_rho_>(T,P); }
134
135 double _h_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::h_>(T,P); }
136 double _dP_h_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::dP_h_>(T,P); }
137 double _dT_h_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::dT_h_>(T,P); }
138
139 double _cp_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::cp_>(T,P); }
140 double _beta_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::beta_>(T,P); }
141 double _mu_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::mu_>(T,P); }
142 double _lambda_(const double T, const double P) const { return double_to_span<&Fluide_reel_base::lambda_>(T,P); }
143
144 /* Laws in h */
145 // density
146 virtual void rho_h_(const SpanD h, const SpanD P, SpanD R, int ncomp = 1, int id = 0) const = 0;
147 virtual void dP_rho_h_(const SpanD h, const SpanD P, SpanD dP_R, int ncomp = 1, int id = 0) const = 0;
148 virtual void dh_rho_h_(const SpanD h, const SpanD P, SpanD dT_R, int ncomp = 1, int id = 0) const = 0;
149
150 // temperature (from h)
151 virtual void T_(const SpanD h, const SpanD P, SpanD H, int ncomp = 1, int id = 0) const = 0;
152 virtual void dP_T_(const SpanD h, const SpanD P, SpanD dP_H, int ncomp = 1, int id = 0) const = 0;
153 virtual void dh_T_(const SpanD h, const SpanD P, SpanD dT_H, int ncomp = 1, int id = 0) const = 0;
154
155 // "weak" field laws -> no derivatives
156 virtual void cp_h_(const SpanD h, const SpanD P, SpanD CP, int ncomp = 1, int id = 0) const = 0;
157 virtual void beta_h_(const SpanD h, const SpanD P, SpanD B, int ncomp = 1, int id = 0) const = 0;
158 virtual void mu_h_(const SpanD h, const SpanD P, SpanD M, int ncomp = 1, int id = 0) const = 0;
159 virtual void lambda_h_(const SpanD h, const SpanD P, SpanD L, int ncomp = 1, int id = 0) const = 0;
160
161 // application-specific methods to improve performance: used in Pb_Multiphase (for now!)
162 virtual void compute_CPMLB_pb_multiphase_h_(const MSpanD , MLoiSpanD_h, int ncomp = 1, int id = 0) const;
163 virtual void compute_all_pb_multiphase_h_(const MSpanD , MLoiSpanD_h, MLoiSpanD_h , int ncomp = 1, int id = 0) const;
164
165 // Methods that can be called if point-to-point calculation is required
166 double _rho_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::rho_h_>(h,P); }
167 double _dP_rho_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::dP_rho_h_>(h,P); }
168 double _dh_rho_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::dh_rho_h_>(h,P); }
169
170 double _T_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::T_>(h,P); }
171 double _dP_T_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::dP_T_>(h,P); }
172 double _dh_T_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::dh_T_>(h,P); }
173
174 double _cp_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::cp_h_>(h,P); }
175 double _beta_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::beta_h_>(h,P); }
176 double _mu_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::mu_h_>(h,P); }
177 double _lambda_h_(const double h, const double P) const { return double_to_span<&Fluide_reel_base::lambda_h_>(h,P); }
178
179private:
180 typedef void(Fluide_reel_base::*function_span_generic)(const SpanD , const SpanD , SpanD , int , int ) const;
181
182 template <function_span_generic FUNC>
183 void double_to_span(const double T_ou_h, const double P, SpanD res) const
184 {
185 ArrayD Tt = {T_ou_h}, Pp = {P}, res_ = {0.};
186 (this->*FUNC)(SpanD(Tt), SpanD(Pp), SpanD(res_),1,0); // fill res_
187 for (auto& val : res) val = res_[0]; // fill res
188 }
189
190 template <function_span_generic FUNC>
191 double double_to_span(const double T_ou_h, const double P) const
192 {
193 ArrayD Tt = {T_ou_h}, Pp = {P}, res_ = {0.};
194 (this->*FUNC)(SpanD(Tt), SpanD(Pp), SpanD(res_),1,0); // fill res_
195 return res_[0];
196 }
197
198 /*
199 * *********************
200 * For incompressible
201 * *********************
202 */
203
204 /* Laws in T */
205 void _rho_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::rho_>(T,P,res); }
206 void _dP_rho_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dP_rho_>(T,P,res); }
207 void _dT_rho_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dT_rho_>(T,P,res); }
208
209 void _h_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::h_>(T,P,res); }
210 void _dP_h_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dP_h_>(T,P,res); }
211 void _dT_h_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dT_h_>(T,P,res); }
212
213 void _cp_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::cp_>(T,P,res); }
214 void _beta_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::beta_>(T,P,res); }
215 void _mu_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::mu_>(T,P,res); }
216 void _lambda_(const double T, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::lambda_>(T,P,res); }
217
218 void _compute_CPMLB_pb_multiphase_(MLoiSpanD ) const;
219 void _compute_all_pb_multiphase_(MLoiSpanD , MLoiSpanD ) const;
220
221public:
222 /*
223 * Elie Saikali: internal struct to convert derivatives from h to T (for Pb_Multiphase).
224 *
225 * We seek dX/dP|T and dX/dT|P
226 *
227 * We know that dX = dX/dP|T dP + dX/dT|P dT = dX/dP|h dP + dX/dh|P dh
228 *
229 * Expanding:
230 *
231 * dX/dP|h dP + dX/dh|P dh = dX/dP|h dP + dX/dh|P { dh/dP|T dP + dh/dT|P dT }
232 * = { dX/dP|h + dX/dh|P * dh/dP|T } dP + { dX/dh|P * dh/dT|P } dT
233 * = dX/dP|T dP + dX/dT|P dT
234 *
235 * Therefore,
236 *
237 * dX/dP|T = dX/dP|h + dX/dh|P * dh/dP|T
238 * dX/dT|P = dX/dh|P * dh/dT|P
239 *
240 * / \ / \ / \
241 * | dX/dP|T | | 1 dh/dP|T | | dX/dP|h |
242 * | | = | | * | |
243 * | dX/dT|P | | 0 dh/dT|P | | dX/dh|P |
244 * \ / \ / \ /
245 */
246
247
248 struct H_to_T
249 {
250 void set_instance(const Fluide_reel_base& fld) { z_fld_ = fld; }
251
252 void dX_dP_T(const SpanD dX_dP_h, const SpanD dX_dh_P, SpanD dX_dP);
253 void dX_dT_P(const SpanD dX_dP_h, const SpanD dX_dh_P, SpanD dX_dT);
254 private:
256 };
257
258 struct T_to_H
259 {
260 void set_instance(const Fluide_reel_base& fld) { z_fld_ = fld; }
261
262 void dX_dP_h(const SpanD dX_dP_T, const SpanD dX_dT_P, SpanD dX_dP);
263 void dX_dh_P(const SpanD dX_dP_T, const SpanD dX_dT_P, SpanD dX_dh);
264 private:
266 };
267
270
271 /* Laws in h */
272 void _rho_h_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::rho_h_>(h,P,res); }
273 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); }
274 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); }
275
276 void _T_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::T_>(h,P,res); }
277 void _dP_T_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dP_T_>(h,P,res); }
278 void _dh_T_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::dh_T_>(h,P,res); }
279
280 void _cp_h_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::cp_h_>(h,P,res); }
281 void _beta_h_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::beta_h_>(h,P,res); }
282 void _mu_h_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::mu_h_>(h,P,res); }
283 void _lambda_h_(const double h, const double P, SpanD res) const { double_to_span<&Fluide_reel_base::lambda_h_>(h,P,res); }
284
285 void _compute_CPMLB_pb_multiphase_h_(MLoiSpanD_h ) const;
286 void _compute_all_pb_multiphase_h_(MLoiSpanD_h , MLoiSpanD_h ) const;
287};
288
289#endif /* Fluide_reel_base_included */
class Discretisation_base This class represents a spatial discretization scheme, which
Base class for an incompressible fluid and its properties:
Definition Fluide_base.h:36
Represents a real fluid and its physical properties:
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
Initializes the fluid parameters.
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
Performs a time update of the medium and therefore of its characteristic parameters.
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
class Probleme_base It is a Probleme_U that is not a coupling.
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Definition Process.cpp:466
void set_instance(const Fluide_reel_base &fld)
void set_instance(const Fluide_reel_base &fld)