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