TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
CoolProp_to_TRUST_Sat_generique.cpp
1/****************************************************************************
2* Copyright (c) 2025, 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#include <CoolProp_to_TRUST_Sat_generique.h>
17
18using namespace CoolProp;
19
20// iterator index !
21#define i_it2 std::distance(RR.begin(), &val)
22
23void CoolProp_to_TRUST_Sat_generique::set_saturation_generique(const char *const model_name, const char *const fluid_name)
24{
25#ifdef HAS_COOLPROP
26 fld_name_sat_ = std::string(fluid_name);
27 fluide = std::shared_ptr<AbstractState>(AbstractState::factory(std::string(model_name), fld_name_sat_));
28#else
29 Cerr << "CoolProp_to_TRUST_Sat_generique::" << __func__ << " should not be called since TRUST is not compiled with the CoolProp library !!! " << finl;
30 throw;
31#endif
32}
33
34int CoolProp_to_TRUST_Sat_generique::tppi_get_single_sat_p_(SAT enum_prop, const SpanD P_ou_T, SpanD res, int ncomp, int ind, bool is_liq) const
35{
36#ifdef HAS_COOLPROP
37 if (enum_prop == SAT::P_SAT || enum_prop == SAT::P_SAT_DT)
38 {
39 assert ((int)P_ou_T.size() == (int)res.size());
40 const int sz = (int )res.size();
41 if (enum_prop == SAT::P_SAT)
42 for (int i = 0; i < sz; i++)
43 {
44 fluide->update(CoolProp::QT_INPUTS, 0, P_ou_T[i]); // SI units
45 res[i] = fluide->p();
46 }
47 else // SAT::P_SAT_DT
48 for (int i = 0; i < sz; i++)
49 {
50 double plus_ = EPS, minus_ = EPS;
51 fluide->update(CoolProp::QT_INPUTS, 0, P_ou_T[i] * (1. + EPS)); // SI units
52 plus_ = fluide->p();
53 fluide->update(CoolProp::QT_INPUTS, 0, P_ou_T[i] * (1. - EPS)); // SI units
54 minus_ = fluide->p();
55 res[i] = (plus_ - minus_) / ( 2 * EPS * P_ou_T[i]);
56 }
57 return 0; // FIXME : on suppose que tout OK
58 }
59
60 assert (ncomp * (int)P_ou_T.size() == (int)res.size());
61 if (ncomp == 1) return tppi_get_single_sat_p__(enum_prop, P_ou_T, res, is_liq);
62 else /* attention stride */
63 {
64 VectorD temp_((int)P_ou_T.size());
65 SpanD RR(temp_);
66 for (auto& val : RR) val = res[i_it2 * ncomp + ind];
67 tppi_get_single_sat_p__(enum_prop, P_ou_T, RR, is_liq);
68 for (auto& val : RR) res[i_it2 * ncomp + ind] = val;
69 return 0; // FIXME : on suppose que tout OK
70 }
71#else
72 Cerr << "CoolProp_to_TRUST_Sat_generique::" << __func__ << " should not be called since TRUST is not compiled with the CoolProp library !!! " << finl;
73 throw;
74#endif
75}
76
77int CoolProp_to_TRUST_Sat_generique::tppi_get_single_sat_p__(SAT enum_prop, const SpanD P, SpanD res, bool is_liq) const
78{
79#ifdef HAS_COOLPROP
80 // derivees qui manquent ...
81 if (enum_prop == SAT::T_SAT_DP || enum_prop == SAT::LV_SAT_DP || enum_prop == SAT::RHOL_SAT_DP || enum_prop == SAT::RHOV_SAT_DP ||
82 enum_prop == SAT::CPL_SAT_DP || enum_prop == SAT::CPV_SAT_DP || enum_prop == SAT::HL_SAT_DP || enum_prop == SAT::HV_SAT_DP)
83 return FD_derivative_p(enum_prop, P, res, is_liq);
84
85 const int sz = (int )res.size();
86 if (enum_prop == SAT::LV_SAT)
87 {
88 for (int i = 0; i < sz; i++)
89 {
90 fluide->update(CoolProp::PQ_INPUTS, P[i], 1); // SI units
91 const double hv_ = fluide->hmass();
92 fluide->update(CoolProp::PQ_INPUTS, P[i], 0); // SI units
93 const double hl_ = fluide->hmass();
94 res[i] = hv_ - hl_;
95 }
96 return 0; // FIXME : on suppose que tout OK
97 }
98
99 for (int i = 0; i < sz; i++)
100 {
101 fluide->update(CoolProp::PQ_INPUTS, P[i], is_liq ? 0 : 1); // SI units
102 if (enum_prop == SAT::T_SAT) res[i] = fluide->T();
103 if (enum_prop == SAT::HL_SAT || enum_prop == SAT::HV_SAT) res[i] = fluide->hmass();
104 if (enum_prop == SAT::RHOL_SAT || enum_prop == SAT::RHOV_SAT) res[i] = fluide->rhomass();
105 if (enum_prop == SAT::CPL_SAT || enum_prop == SAT::CPV_SAT) res[i] = fluide->cpmass();
106 if (enum_prop == SAT::LAMBDA) res[i] = fluide->conductivity();
107 if (enum_prop == SAT::MU) res[i] = fluide->viscosity();
108 if (enum_prop == SAT::SIGMA && user_uniform_sigma_<=0.)
109 {
110 // soucis la avec plusieurs instance de factory abstract_state
111// res[i] = fluide->surface_tension();
112 const int ph_ = is_liq ? 0 : 1;
113 res[i] = CoolProp::PropsSI("surface_tension", "P", P[i], "Q", ph_, fld_name_sat_);
114 }
115 else if (enum_prop == SAT::SIGMA && user_uniform_sigma_>0.) res[i] = user_uniform_sigma_;
116 }
117 return 0; // FIXME : on suppose que tout OK
118#else
119 Cerr << "CoolProp_to_TRUST_Sat_generique::" << __func__ << " should not be called since TRUST is not compiled with the CoolProp library !!! " << finl;
120 throw;
121#endif
122}
123
124int CoolProp_to_TRUST_Sat_generique::FD_derivative_p(SAT enum_prop, const SpanD P, SpanD res, bool is_liq) const
125{
126#ifdef HAS_COOLPROP
127 const int sz = (int )res.size();
128
129 if (enum_prop == SAT::LV_SAT_DP)
130 {
131 for (int i = 0; i < sz; i++)
132 {
133 double plus_ = EPS, minus_ = EPS;
134 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. + EPS), 1); // SI units
135 plus_ = fluide->hmass();
136 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. - EPS), 1); // SI units
137 minus_ = fluide->hmass();
138 const double hv_dp_ = (plus_ - minus_) / ( 2 * EPS * P[i]);
139
140
141 plus_ = EPS, minus_ = EPS;
142 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. + EPS), 0); // SI units
143 plus_ = fluide->hmass();
144 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. - EPS), 0); // SI units
145 minus_ = fluide->hmass();
146 const double hl_dp_ = (plus_ - minus_) / ( 2 * EPS * P[i]);
147
148 res[i] = hv_dp_ - hl_dp_;
149 }
150 return 0; // FIXME : on suppose que tout OK
151 }
152
153 for (int i = 0; i < sz; i++)
154 {
155 double plus_ = EPS, minus_ = EPS;
156
157 is_liq ? fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. + EPS), 0) : fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. + EPS), 1); // SI units
158 if (enum_prop == SAT::T_SAT_DP) plus_ = fluide->T();
159 if (enum_prop == SAT::HL_SAT_DP || enum_prop == SAT::HV_SAT_DP) plus_ = fluide->hmass();
160 if (enum_prop == SAT::RHOL_SAT_DP || enum_prop == SAT::RHOV_SAT_DP) plus_ = fluide->rhomass();
161 if (enum_prop == SAT::CPL_SAT_DP || enum_prop == SAT::CPV_SAT_DP) plus_ = fluide->cpmass();
162
163 is_liq ? fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. - EPS), 0) : fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. - EPS), 1); // SI units
164 if (enum_prop == SAT::T_SAT_DP) minus_ = fluide->T();
165 if (enum_prop == SAT::HL_SAT_DP || enum_prop == SAT::HV_SAT_DP) minus_ = fluide->hmass();
166 if (enum_prop == SAT::RHOL_SAT_DP || enum_prop == SAT::RHOV_SAT_DP) minus_ = fluide->rhomass();
167 if (enum_prop == SAT::CPL_SAT_DP || enum_prop == SAT::CPV_SAT_DP) minus_ = fluide->cpmass();
168
169 res[i] = (plus_ - minus_) / ( 2 * EPS * P[i]);
170 }
171
172 return 0; // FIXME : on suppose que tout OK
173#else
174 Cerr << "CoolProp_to_TRUST_Sat_generique::" << __func__ << " should not be called since TRUST is not compiled with the CoolProp library !!! " << finl;
175 throw;
176#endif
177}
178
179int CoolProp_to_TRUST_Sat_generique::tppi_get_all_flux_interfacial_pb_multiphase(const SpanD P, MSatSpanD sats, int ncomp, int ind) const
180{
181#ifdef HAS_COOLPROP
182 assert((int )sats.size() == 7);
183 const int sz = (int) P.size();
184
185 SpanD dPTs__ = sats.at(SAT::T_SAT_DP), Hvs__ = sats.at(SAT::HV_SAT), Hls__ = sats.at(SAT::HL_SAT),
186 dPHvs__ = sats.at(SAT::HV_SAT_DP), dPHls__ = sats.at(SAT::HL_SAT_DP), Lvap__ = sats.at(SAT::LV_SAT), dPLvap__ = sats.at(SAT::LV_SAT_DP);
187
188#ifndef NDEBUG
189 for (auto &itr : sats) assert(ncomp * (int )P.size() == (int )itr.second.size());
190#endif
191
192 if (ncomp == 1)
193 for (int i = 0; i < sz; i++)
194 {
195 fluide->update(CoolProp::PQ_INPUTS, P[i], 0); // SI units
196 Hls__[i] = fluide->hmass();
197
198 fluide->update(CoolProp::PQ_INPUTS, P[i], 1); // SI units
199 Hvs__[i] = fluide->hmass();
200
201 // derivees
202 double plus_1_ = EPS, minus_1_ = EPS, plus_2_ = EPS, minus_2_ = EPS;
203
204 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. + EPS), 0); // SI units
205 plus_1_ = fluide->T();
206 plus_2_ = fluide->hmass();
207
208 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. - EPS), 0); // SI units
209 minus_1_ = fluide->T();
210 minus_2_ = fluide->hmass();
211
212 dPTs__[i] = (plus_1_ - minus_1_) / ( 2 * EPS * P[i]);
213 dPHls__[i] = (plus_2_ - minus_2_) / ( 2 * EPS * P[i]);
214
215 plus_1_ = EPS, minus_1_ = EPS;
216
217 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. + EPS), 1); // SI units
218 plus_1_ = fluide->hmass();
219
220 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. - EPS), 1); // SI units
221 minus_1_ = fluide->hmass();
222
223 dPHvs__[i] = (plus_1_ - minus_1_) / ( 2 * EPS * P[i]);
224
225 // fill values
226 Lvap__[i] = Hvs__[i] - Hls__[i];
227 dPLvap__[i] = dPHvs__[i] - dPHls__[i];
228 }
229 else /* attention stride */
230 {
231 VectorD dPTs(sz), Hvs(sz), Hls(sz), dPHvs(sz), dPHls(sz), Lvap(sz), dPLvap;
232 SpanD dPTs_(dPTs), Hvs_(Hvs), Hls_(Hls), dPHvs_(dPHvs), dPHls_(dPHls), Lvap_(Lvap), dPLvap_(dPLvap);
233
234 for (int i = 0; i < sz; i++)
235 {
236 fluide->update(CoolProp::PQ_INPUTS, P[i], 0); // SI units
237 Hls_[i] = fluide->hmass();
238
239 fluide->update(CoolProp::PQ_INPUTS, P[i], 1); // SI units
240 Hvs_[i] = fluide->hmass();
241
242 // derivees
243 double plus_1_ = EPS, minus_1_ = EPS, plus_2_ = EPS, minus_2_ = EPS;
244
245 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. + EPS), 0); // SI units
246 plus_1_ = fluide->T();
247 plus_2_ = fluide->hmass();
248
249 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. - EPS), 0); // SI units
250 minus_1_ = fluide->T();
251 minus_2_ = fluide->hmass();
252
253 dPTs_[i] = (plus_1_ - minus_1_) / ( 2 * EPS * P[i]);
254 dPHls_[i] = (plus_2_ - minus_2_) / ( 2 * EPS * P[i]);
255
256 plus_1_ = EPS, minus_1_ = EPS;
257
258 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. + EPS), 1); // SI units
259 plus_1_ = fluide->hmass();
260
261 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. - EPS), 1); // SI units
262 minus_1_ = fluide->hmass();
263
264 dPHvs_[i] = (plus_1_ - minus_1_) / ( 2 * EPS * P[i]);
265
266 // fill values
267 dPTs__[i * ncomp + ind] = dPTs_[i];
268 Hvs__[i * ncomp + ind] = Hvs_[i];
269 Hls__[i * ncomp + ind] = Hls_[i];
270 dPHvs__[i * ncomp + ind] = dPHvs_[i];
271 dPHls__[i * ncomp + ind] = dPHls_[i];
272 Lvap__[i * ncomp + ind] = Hvs_[i] - Hls_[i];
273 dPLvap__[i * ncomp + ind] = dPHvs_[i] - dPHls_[i];
274 }
275 }
276
277 return 0; // FIXME : on suppose que tout OK
278#else
279 Cerr << "CoolProp_to_TRUST_Sat_generique::" << __func__ << " should not be called since TRUST is not compiled with the CoolProp library !!! " << finl;
280 throw;
281#endif
282}
283
284int CoolProp_to_TRUST_Sat_generique::tppi_get_all_sat_loi_F5(const MSpanD input, MSatSpanD sats, int ncomp, int id) const
285{
286#ifdef HAS_COOLPROP
287 const SpanD P = input.at("pression");
288 const int sz = (int) P.size();
289
290#ifndef NDEBUG
291 assert(ncomp == 1);
292 for (auto &itr : sats) assert(ncomp * sz == (int )itr.second.size());
293#endif
294
295 bool has_liq_prop = false, has_vap_prop = false;
296 for (auto &itr : sats)
297 {
298 if (itr.first == SAT::T_SAT || itr.first == SAT::SIGMA || itr.first == SAT::HL_SAT || itr.first == SAT::RHOL_SAT || itr.first == SAT::CPL_SAT) has_liq_prop = true;
299 break;
300 }
301
302 for (auto &itr : sats)
303 {
304 if (itr.first == SAT::HV_SAT || itr.first == SAT::RHOV_SAT || itr.first == SAT::CPV_SAT) has_vap_prop = true;
305 break;
306 }
307
308 if (has_liq_prop)
309 for (int i = 0; i < sz; i++)
310 {
311 fluide->update(CoolProp::PQ_INPUTS, P[i], 0); // SI units
312 for (auto &itr : sats)
313 {
314 SAT prop_ = itr.first;
315 SpanD span_ = itr.second;
316
317 if (prop_ == SAT::T_SAT) span_[i] = fluide->T();
318 if (prop_ == SAT::SIGMA) span_[i] = fluide->surface_tension();
319
320 if (prop_ == SAT::HL_SAT) span_[i] = fluide->hmass();
321 if (prop_ == SAT::RHOL_SAT) span_[i] = fluide->rhomass();
322 if (prop_ == SAT::CPL_SAT) span_[i] = fluide->cpmass();
323 }
324 }
325
326 if (has_vap_prop)
327 for (int i = 0; i < sz; i++)
328 {
329 fluide->update(CoolProp::PQ_INPUTS, P[i], 1); // SI units
330 for (auto &itr : sats)
331 {
332 SAT prop_ = itr.first;
333 SpanD span_ = itr.second;
334
335 if (prop_ == SAT::HV_SAT) span_[i] = fluide->hmass();
336 if (prop_ == SAT::RHOV_SAT) span_[i] = fluide->rhomass();
337 if (prop_ == SAT::CPV_SAT) span_[i] = fluide->cpmass();
338 }
339 }
340
341 // derivees qui manquent ...
342 bool has_liq_DP = false, has_vap_DP = false;
343 for (auto &itr : sats)
344 {
345 if (itr.first == SAT::T_SAT_DP || itr.first == SAT::HL_SAT_DP || itr.first == SAT::RHOL_SAT_DP || itr.first == SAT::CPL_SAT_DP || itr.first == SAT::SIGMA_DP) has_liq_DP = true;
346 break;
347 }
348
349 for (auto &itr : sats)
350 {
351 if (itr.first == SAT::HV_SAT_DP || itr.first == SAT::RHOV_SAT_DP || itr.first == SAT::CPV_SAT_DP ) has_vap_DP = true;
352 break;
353 }
354
355 if (has_liq_DP)
356 for (int i = 0; i < sz; i++)
357 {
358 double plus_T_ = EPS, plus_h_ = EPS, plus_rho_ = EPS, plus_cp_ = EPS, plus_sigma_ = EPS;
359 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. + EPS), 0);
360 for (auto &itr : sats)
361 {
362 SAT prop_ = itr.first;
363
364 if (prop_ == SAT::T_SAT_DP) plus_T_ = fluide->T();
365 if (prop_ == SAT::HL_SAT_DP) plus_h_ = fluide->hmass();
366 if (prop_ == SAT::RHOL_SAT_DP) plus_rho_ = fluide->rhomass();
367 if (prop_ == SAT::CPL_SAT_DP) plus_cp_ = fluide->cpmass();
368 if (prop_ == SAT::SIGMA_DP) plus_sigma_ = fluide->surface_tension();
369 }
370
371 double minus_T_ = EPS, minus_h_ = EPS, minus_rho_ = EPS, minus_cp_ = EPS, minus_sigma_ = EPS;
372 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. - EPS), 0);
373 for (auto &itr : sats)
374 {
375 SAT prop_ = itr.first;
376
377 if (prop_ == SAT::T_SAT_DP) minus_T_ = fluide->T();
378 if (prop_ == SAT::HL_SAT_DP) minus_h_ = fluide->hmass();
379 if (prop_ == SAT::RHOL_SAT_DP) minus_rho_ = fluide->rhomass();
380 if (prop_ == SAT::CPL_SAT_DP) minus_cp_ = fluide->cpmass();
381 if (prop_ == SAT::SIGMA_DP) minus_sigma_ = fluide->surface_tension();
382 }
383 for (auto &itr : sats)
384 {
385 SAT prop_ = itr.first;
386 SpanD span_ = itr.second;
387
388 if (prop_ == SAT::T_SAT_DP) span_[i] = (plus_T_ - minus_T_) / ( 2 * EPS * P[i]);
389 if (prop_ == SAT::HL_SAT_DP) span_[i] = (plus_h_ - minus_h_) / ( 2 * EPS * P[i]);
390 if (prop_ == SAT::RHOL_SAT_DP) span_[i] = (plus_rho_ - minus_rho_) / ( 2 * EPS * P[i]);
391 if (prop_ == SAT::CPL_SAT_DP) span_[i] = (plus_cp_ - minus_cp_) / ( 2 * EPS * P[i]);
392 if (prop_ == SAT::SIGMA_DP) span_[i] = (plus_sigma_ - minus_sigma_) / ( 2 * EPS * P[i]);
393 }
394 }
395
396 if (has_vap_DP)
397 for (int i = 0; i < sz; i++)
398 {
399 double plus_h_ = EPS, plus_rho_ = EPS, plus_cp_ = EPS;
400 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. + EPS), 1);
401 for (auto &itr : sats)
402 {
403 SAT prop_ = itr.first;
404
405 if (prop_ == SAT::HV_SAT_DP) plus_h_ = fluide->hmass();
406 if (prop_ == SAT::RHOV_SAT_DP) plus_rho_ = fluide->rhomass();
407 if (prop_ == SAT::CPV_SAT_DP) plus_cp_ = fluide->cpmass();
408 }
409
410 double minus_h_ = EPS, minus_rho_ = EPS, minus_cp_ = EPS;
411 fluide->update(CoolProp::PQ_INPUTS, P[i] * (1. - EPS), 1);
412 for (auto &itr : sats)
413 {
414 SAT prop_ = itr.first;
415
416 if (prop_ == SAT::HV_SAT_DP) minus_h_ = fluide->hmass();
417 if (prop_ == SAT::RHOV_SAT_DP) minus_rho_ = fluide->rhomass();
418 if (prop_ == SAT::CPV_SAT_DP) minus_cp_ = fluide->cpmass();
419 }
420 for (auto &itr : sats)
421 {
422 SAT prop_ = itr.first;
423 SpanD span_ = itr.second;
424
425 if (prop_ == SAT::HV_SAT_DP) span_[i] = (plus_h_ - minus_h_) / ( 2 * EPS * P[i]);
426 if (prop_ == SAT::RHOV_SAT_DP) span_[i] = (plus_rho_ - minus_rho_) / ( 2 * EPS * P[i]);
427 if (prop_ == SAT::CPV_SAT_DP) span_[i] = (plus_cp_ - minus_cp_) / ( 2 * EPS * P[i]);
428
429 }
430 }
431
432 return 0; // FIXME : on suppose que tout OK
433#else
434 Cerr << "CoolProp_to_TRUST_Sat_generique::" << __func__ << " should not be called since TRUST is not compiled with the CoolProp library !!! " << finl;
435 throw;
436#endif
437}
int tppi_get_all_sat_loi_F5(const MSpanD input, MSatSpanD sats, int ncomp=1, int ind=0) const override
int tppi_get_all_flux_interfacial_pb_multiphase(const SpanD P, MSatSpanD sats, int ncomp=1, int ind=0) const override
void set_saturation_generique(const char *const model_name, const char *const fluid_name) override