https://mooseframework.inl.gov
Loading...
Searching...
No Matches
SinglePhaseFluidProperties.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
11
14{
16 params.set<std::string>("fp_type") = "single-phase-fp";
17
18 // Variable set conversion parameters
19 params.addRangeCheckedParam<Real>(
20 "tolerance", 1e-8, "tolerance > 0", "Tolerance for 2D Newton variable set conversion");
21 params.addRangeCheckedParam<Real>(
22 "T_initial_guess",
23 400,
24 "T_initial_guess > 0",
25 "Temperature initial guess for Newton Method variable set conversion");
26 params.addRangeCheckedParam<Real>(
27 "p_initial_guess",
28 2e5,
29 "p_initial_guess > 0",
30 "Pressure initial guess for Newton Method variable set conversion");
31 params.addParam<unsigned int>(
32 "max_newton_its", 100, "Maximum number of Newton iterations for variable set conversions");
33 params.addParam<bool>(
34 "verbose_newton", false, "Whether to output Newton inversion iterations to console");
36 "tolerance T_initial_guess p_initial_guess max_newton_its verbose_newton",
37 "Variable set conversions Newton solve");
38
39 return params;
40}
41
43 : FluidProperties(parameters),
44 // downstream apps are creating fluid properties without their parameters, hence the workaround
45 _tolerance(getParam<Real>("tolerance")),
46 _T_initial_guess(getParam<Real>("T_initial_guess")),
47 _p_initial_guess(getParam<Real>("p_initial_guess")),
48 _max_newton_its(getParam<unsigned int>("max_newton_its")),
49 _verbose_newton(getParam<bool>("verbose_newton"))
50{
51}
52
54
55#pragma GCC diagnostic push
56#pragma GCC diagnostic ignored "-Woverloaded-virtual"
57
58Real
59SinglePhaseFluidProperties::s_from_p_T(const Real pressure, const Real temperature) const
60{
61 Real v, e;
62 v_e_from_p_T(pressure, temperature, v, e);
63 return s_from_v_e(v, e);
64}
65
66void
67SinglePhaseFluidProperties::s_from_p_T(
68 const Real pressure, const Real temperature, Real & s, Real & ds_dp, Real & ds_dT) const
69{
70 Real v, e, dv_dp, dv_dT, de_dp, de_dT;
71 v_e_from_p_T(pressure, temperature, v, dv_dp, dv_dT, e, de_dp, de_dT);
72
73 Real ds_dv, ds_de;
74 s_from_v_e(v, e, s, ds_dv, ds_de);
75 ds_dp = ds_dv * dv_dp + ds_de * de_dp;
76 ds_dT = ds_dv * dv_dT + ds_de * de_dT;
77}
78
79Real
80SinglePhaseFluidProperties::s_from_v_e(const Real v, const Real e) const
81{
82 const Real p0 = _p_initial_guess;
83 const Real T0 = _T_initial_guess;
84 Real p, T;
85 bool conversion_succeeded = true;
86 p_T_from_v_e(v, e, p0, T0, p, T, conversion_succeeded);
87 const Real s = s_from_p_T(p, T);
88 return s;
89}
90
91void
92SinglePhaseFluidProperties::s_from_v_e(
93 const Real v, const Real e, Real & s, Real & ds_dv, Real & ds_de) const
94{
95 const Real p0 = _p_initial_guess;
96 const Real T0 = _T_initial_guess;
97 Real p, T;
98 bool conversion_succeeded = true;
99 p_T_from_v_e(v, e, p0, T0, p, T, conversion_succeeded);
100 s = s_from_p_T(p, T);
101 ds_dv = p / T;
102 ds_de = 1 / T;
103}
104
105Real
106SinglePhaseFluidProperties::c_from_p_T(Real p, Real T) const
107{
108 Real v, e;
109 v_e_from_p_T(p, T, v, e);
110 return c_from_v_e(v, e);
111}
112
113void
114SinglePhaseFluidProperties::c_from_p_T(Real p, Real T, Real & c, Real & dc_dp, Real & dc_dT) const
115{
116 Real v, e, dv_dp, dv_dT, de_dp, de_dT;
117 v_e_from_p_T(p, T, v, dv_dp, dv_dT, e, de_dp, de_dT);
118
119 Real dc_dv, dc_de;
120 c_from_v_e(v, e, c, dc_dv, dc_de);
121 dc_dp = dc_dv * dv_dp + dc_de * de_dp;
122 dc_dT = dc_dv * dv_dT + dc_de * de_dT;
123}
124
125Real
126SinglePhaseFluidProperties::mu_from_p_T(Real p, Real T) const
127{
128 Real v, e;
129 v_e_from_p_T(p, T, v, e);
130 return mu_from_v_e(v, e);
131}
132
133void
134SinglePhaseFluidProperties::mu_from_p_T(
135 Real p, Real T, Real & mu, Real & dmu_dp, Real & dmu_dT) const
136{
137 Real v, e, dv_dp, dv_dT, de_dp, de_dT;
138 v_e_from_p_T(p, T, v, dv_dp, dv_dT, e, de_dp, de_dT);
139
140 Real dmu_dv, dmu_de;
141 mu_from_v_e(v, e, mu, dmu_dv, dmu_de);
142 dmu_dp = dmu_dv * dv_dp + dmu_de * de_dp;
143 dmu_dT = dmu_dv * dv_dT + dmu_de * de_dT;
144}
145
146Real
147SinglePhaseFluidProperties::cv_from_p_T(Real p, Real T) const
148{
149 Real v, e;
150 v_e_from_p_T(p, T, v, e);
151 return cv_from_v_e(v, e);
152}
153
154void
155SinglePhaseFluidProperties::cv_from_p_T(
156 Real p, Real T, Real & cv, Real & dcv_dp, Real & dcv_dT) const
157{
158 Real v, e, dv_dp, dv_dT, de_dp, de_dT;
159 v_e_from_p_T(p, T, v, dv_dp, dv_dT, e, de_dp, de_dT);
160
161 Real dcv_dv, dcv_de;
162 cv_from_v_e(v, e, cv, dcv_dv, dcv_de);
163 dcv_dp = dcv_dv * dv_dp + dcv_de * de_dp;
164 dcv_dT = dcv_dv * dv_dT + dcv_de * de_dT;
165}
166
167Real
168SinglePhaseFluidProperties::cp_from_p_T(Real p, Real T) const
169{
170 Real v, e;
171 v_e_from_p_T(p, T, v, e);
172 return cp_from_v_e(v, e);
173}
174
175void
176SinglePhaseFluidProperties::cp_from_p_T(
177 Real p, Real T, Real & cp, Real & dcp_dp, Real & dcp_dT) const
178{
179 Real v, e, dv_dp, dv_dT, de_dp, de_dT;
180 v_e_from_p_T(p, T, v, dv_dp, dv_dT, e, de_dp, de_dT);
181
182 Real dcp_dv, dcp_de;
183 cp_from_v_e(v, e, cp, dcp_dv, dcp_de);
184 dcp_dp = dcp_dv * dv_dp + dcp_de * de_dp;
185 dcp_dT = dcp_dv * dv_dT + dcp_de * de_dT;
186}
187
188Real
189SinglePhaseFluidProperties::k_from_p_T(Real p, Real T) const
190{
191 Real v, e;
192 v_e_from_p_T(p, T, v, e);
193 return k_from_v_e(v, e);
194}
195
196void
197SinglePhaseFluidProperties::k_from_p_T(Real p, Real T, Real & k, Real & dk_dp, Real & dk_dT) const
198{
199 Real v, e, dv_dp, dv_dT, de_dp, de_dT;
200 v_e_from_p_T(p, T, v, dv_dp, dv_dT, e, de_dp, de_dT);
201
202 Real dk_dv, dk_de;
203 k_from_v_e(v, e, k, dk_dv, dk_de);
204 dk_dp = dk_dv * dv_dp + dk_de * de_dp;
205 dk_dT = dk_dv * dv_dT + dk_de * de_dT;
206}
207
208Real
209SinglePhaseFluidProperties::h_from_v_e(Real v, Real e) const
210{
211 return e + v * p_from_v_e(v, e);
212}
213
214void
215SinglePhaseFluidProperties::h_from_v_e(Real v, Real e, Real & h, Real & dh_dv, Real & dh_de) const
216{
217 Real p, dp_dv, dp_de;
218 p_from_v_e(v, e, p, dp_dv, dp_de);
219 h = e + v * p;
220 dh_dv = p + v * dp_dv;
221 dh_de = 1 + v * dp_de;
222}
223
224Real
225SinglePhaseFluidProperties::e_from_p_T(Real p, Real T) const
226{
227 const Real rho = rho_from_p_T(p, T);
228 return e_from_p_rho(p, rho);
229}
230
231void
232SinglePhaseFluidProperties::e_from_p_T(Real p, Real T, Real & e, Real & de_dp, Real & de_dT) const
233{
234 // From rho(p,T), compute: drho(p,T)/dp, drho(p,T)/dT
235 Real rho = 0., drho_dp = 0., drho_dT = 0.;
236 rho_from_p_T(p, T, rho, drho_dp, drho_dT);
237
238 // From e(p, rho), compute: de(p,rho)/dp, de(p,rho)/drho
239 Real depr_dp = 0., depr_drho = 0.;
240 e_from_p_rho(p, rho, e, depr_dp, depr_drho);
241 // Using partial derivative rules, we have:
242 // de(p,T)/dp = de(p,rho)/dp * dp/dp + de(p,rho)/drho * drho(p,T)/dp, (dp/dp == 1)
243 // de(p,T)/dT = de(p,rho)/dp * dp/dT + de(p,rho)/drho * drho(p,T)/dT, (dp/dT == 0)
244 de_dp = depr_dp + depr_drho * drho_dp;
245 de_dT = depr_drho * drho_dT;
246}
247
248Real
249SinglePhaseFluidProperties::v_from_p_T(Real p, Real T) const
250{
251 const Real rho = rho_from_p_T(p, T);
252 return 1.0 / rho;
253}
254
255void
256SinglePhaseFluidProperties::v_from_p_T(Real p, Real T, Real & v, Real & dv_dp, Real & dv_dT) const
257{
258 Real rho, drho_dp, drho_dT;
259 rho_from_p_T(p, T, rho, drho_dp, drho_dT);
260
261 v = 1.0 / rho;
262 const Real dv_drho = -1.0 / (rho * rho);
263
264 dv_dp = dv_drho * drho_dp;
265 dv_dT = dv_drho * drho_dT;
266}
267
268void
269SinglePhaseFluidProperties::beta_from_p_T(Real, Real, Real &, Real &, Real &) const
270{
271 mooseError(__PRETTY_FUNCTION__, " is not implemented.");
272}
273
274Real
275SinglePhaseFluidProperties::beta_from_p_T(Real p, Real T) const
276{
277 // The volumetric thermal expansion coefficient is defined as
278 // 1/v dv/dT)_p
279 // It is the fractional change rate of volume with respect to temperature change
280 // at constant pressure. Here it is coded as
281 // - 1/rho drho/dT)_p
282 // using chain rule with v = v(rho)
283
284 Real rho, drho_dp, drho_dT;
285 rho_from_p_T(p, T, rho, drho_dp, drho_dT);
286 return -drho_dT / rho;
287}
288
289Real
291{
292 mooseError(__PRETTY_FUNCTION__, " not implemented.");
293}
294
295std::string
297{
298 return std::string("");
299}
300
301Real
303{
304 mooseError(__PRETTY_FUNCTION__, " not implemented.");
305}
306
307Real
309{
310 mooseError(__PRETTY_FUNCTION__, " not implemented.");
311}
312
313Real
318
319Real
324
325Real
327{
328 mooseError(__PRETTY_FUNCTION__, " not implemented.");
329}
330
331Real
333{
334 mooseError(__PRETTY_FUNCTION__, " not implemented.");
335}
336
337Real
338SinglePhaseFluidProperties::gamma_from_v_e(Real v, Real e) const
339{
340 return cp_from_v_e(v, e) / cv_from_v_e(v, e);
341}
342
343void
344SinglePhaseFluidProperties::gamma_from_v_e(
345 Real v, Real e, Real & gamma, Real & dgamma_dv, Real & dgamma_de) const
346{
347 unimplementedDerivativeMethod(__PRETTY_FUNCTION__);
348
349 dgamma_dv = 0.0;
350 dgamma_de = 0.0;
351 gamma = gamma_from_v_e(v, e);
352}
353
354Real
355SinglePhaseFluidProperties::gamma_from_p_T(Real p, Real T) const
356{
357 return cp_from_p_T(p, T) / cv_from_p_T(p, T);
358}
359
360void
361SinglePhaseFluidProperties::gamma_from_p_T(
362 Real p, Real T, Real & gamma, Real & dgamma_dp, Real & dgamma_dT) const
363{
364 unimplementedDerivativeMethod(__PRETTY_FUNCTION__);
365
366 dgamma_dp = 0.0;
367 dgamma_dT = 0.0;
368 gamma = gamma_from_p_T(p, T);
369}
370
371Real
373{
374 mooseError(__PRETTY_FUNCTION__, " not implemented.");
375}
376
377std::vector<Real>
379{
380 mooseError(__PRETTY_FUNCTION__, " not implemented.");
381}
382
383void
384SinglePhaseFluidProperties::vaporPressure(Real T, Real & p, Real & dp_dT) const
385{
386 unimplementedDerivativeMethod(__PRETTY_FUNCTION__);
387
388 dp_dT = 0.0;
389 p = vaporPressure(T);
390}
391
392ADReal
394{
395 Real p = 0.0;
396 Real temperature = T.value();
397 Real dpdT = 0.0;
398
399 vaporPressure(temperature, p, dpdT);
400
401 ADReal result = p;
402 result.derivatives() = T.derivatives() * dpdT;
403
404 return result;
405}
406
407Real
409{
410 mooseError(__PRETTY_FUNCTION__, " not implemented.");
411}
412
413void
414SinglePhaseFluidProperties::vaporTemperature(Real p, Real & T, Real & dT_dp) const
415{
416 unimplementedDerivativeMethod(__PRETTY_FUNCTION__);
417
418 dT_dp = 0.0;
420}
421
422ADReal
424{
425 Real T = 0.0;
426 Real pressure = p.value();
427 Real dTdp = 0.0;
428
429 vaporTemperature(pressure, T, dTdp);
430
431 ADReal result = T;
432 result.derivatives() = p.derivatives() * dTdp;
433
434 return result;
435}
436
437void
439 Real T,
440 Real & rho,
441 Real & drho_dp,
442 Real & drho_dT,
443 Real & e,
444 Real & de_dp,
445 Real & de_dT) const
446{
447 rho_from_p_T(p, T, rho, drho_dp, drho_dT);
448 e_from_p_T(p, T, e, de_dp, de_dT);
449}
450
451void
452SinglePhaseFluidProperties::rho_mu_from_p_T(Real p, Real T, Real & rho, Real & mu) const
453{
454 rho = rho_from_p_T(p, T);
455 mu = mu_from_p_T(p, T);
456}
457
458void
460 Real T,
461 Real & rho,
462 Real & drho_dp,
463 Real & drho_dT,
464 Real & mu,
465 Real & dmu_dp,
466 Real & dmu_dT) const
467{
468 rho_from_p_T(p, T, rho, drho_dp, drho_dT);
469 mu_from_p_T(p, T, mu, dmu_dp, dmu_dT);
470}
471
472void
474 const ADReal & T,
475 ADReal & rho,
476 ADReal & mu) const
477{
478 rho = rho_from_p_T(p, T);
479 mu = mu_from_p_T(p, T);
480}
481
482Real
484{
485 mooseError(__PRETTY_FUNCTION__, " not implemented.");
486}
487
488void
490{
491 mooseError(__PRETTY_FUNCTION__, " not implemented.");
492}
493
494Real
495SinglePhaseFluidProperties::T_from_p_h(Real p, Real h) const
496{
497 const Real s = s_from_h_p(h, p);
498 const Real rho = rho_from_p_s(p, s);
499 const Real v = 1. / rho;
500 const Real e = e_from_v_h(v, h);
501 return T_from_v_e(v, e);
502}
503
504Real
505SinglePhaseFluidProperties::p_from_h_s(Real h, Real s) const
506{
509 Real p, T;
510 bool conversion_succeeded = true;
511 p_T_from_h_s(h, s, p0, T0, p, T, conversion_succeeded);
512 return p;
513}
514
515void
516SinglePhaseFluidProperties::p_from_h_s(Real h, Real s, Real & p, Real & dp_dh, Real & dp_ds) const
517{
520 Real T;
521 bool conversion_succeeded = true;
522 p_T_from_h_s(h, s, p0, T0, p, T, conversion_succeeded);
523 dp_dh = rho_from_p_T(p, T);
524 dp_ds = -T * rho_from_p_T(p, T);
525}
526
527void
528SinglePhaseFluidProperties::T_from_p_h(Real p, Real h, Real & T, Real & dT_dp, Real & dT_dh) const
529{
530 Real s, ds_dh, ds_dp;
531 s_from_h_p(h, p, s, ds_dh, ds_dp);
532
533 Real rho, drho_dp_partial, drho_ds;
534 rho_from_p_s(p, s, rho, drho_dp_partial, drho_ds);
535 const Real drho_dp = drho_dp_partial + drho_ds * ds_dp;
536 const Real drho_dh = drho_ds * ds_dh;
537
538 const Real v = 1.0 / rho;
539 const Real dv_drho = -1.0 / (rho * rho);
540 const Real dv_dp = dv_drho * drho_dp;
541 const Real dv_dh = dv_drho * drho_dh;
542
543 Real e, de_dv, de_dh_partial;
544 e_from_v_h(v, h, e, de_dv, de_dh_partial);
545 const Real de_dp = de_dv * dv_dp;
546 const Real de_dh = de_dh_partial + de_dv * dv_dh;
547
548 Real dT_dv, dT_de;
549 T_from_v_e(v, e, T, dT_dv, dT_de);
550 dT_dp = dT_dv * dv_dp + dT_de * de_dp;
551 dT_dh = dT_dv * dv_dh + dT_de * de_dh;
552}
553
554#pragma GCC diagnostic pop
DualNumber< Real, DNDerivativeType, true > ADReal
const double mu
const Real p
const double rho
const double T
const double v
void ErrorVector unsigned int
static InputParameters validParams()
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
void mooseError(Args &&... args) const
SinglePhaseFluidProperties(const InputParameters &parameters)
virtual std::vector< Real > henryCoefficients() const
Henry's law coefficients for dissolution in water.
const Real _T_initial_guess
Initial guess for temperature (or temperature used to compute the initial guess)
void p_T_from_h_s(const T &h, const T &s, Real p0, Real T0, T &pressure, T &temperature, bool &conversion_succeeded) const
Determines (p,T) from (h,s) using Newton Solve in 2D Useful for conversion between different sets of ...
virtual Real criticalInternalEnergy() const
Critical specific internal energy.
void p_T_from_v_e(const CppType &v, const CppType &e, Real p0, Real T0, CppType &p, CppType &T, bool &conversion_succeeded) const
Determines (p,T) from (v,e) using Newton Solve in 2D Useful for conversion between different sets of ...
const Real _p_initial_guess
Initial guess for pressure (or pressure used to compute the initial guess)
virtual void v_e_spndl_from_T(Real T, Real &v, Real &e) const
Specific internal energy from temperature and specific volume.
virtual Real vaporPressure(Real T) const
Vapor pressure.
static InputParameters validParams()
virtual void rho_e_from_p_T(Real p, Real T, Real &rho, Real &drho_dp, Real &drho_dT, Real &e, Real &de_dp, Real &de_dT) const
virtual Real triplePointPressure() const
Triple point pressure.
virtual Real e_spndl_from_v(Real v) const
Specific internal energy from temperature and specific volume.
virtual Real criticalDensity() const
Critical density.
virtual Real criticalPressure() const
Critical pressure.
virtual Real molarMass() const
Molar mass [kg/mol].
void unimplementedDerivativeMethod(const std::string &property_function_name) const
void v_e_from_p_T(const CppType &p, const CppType &T, CppType &v, CppType &e) const
e e e e s T T T T T rho v v T e h
virtual Real criticalTemperature() const
Critical temperature.
virtual Real triplePointTemperature() const
Triple point temperature.
virtual Real vaporTemperature(Real p) const
Vapor temperature.
e e e e s T T T T T rho v v T e p T T virtual T std::string fluidName() const
Fluid name.
virtual void rho_mu_from_p_T(Real p, Real T, Real &rho, Real &mu) const
Combined methods.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real