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.addParam<bool>(
34  "verbose_newton", false, "Whether to output Newton inversion iterations to console");
35  params.addParamNamesToGroup(
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 
58 Real
59 SinglePhaseFluidProperties::s_from_p_T(const Real pressure, const Real temperature) const
60 {
61  Real v, e;
63  return s_from_v_e(v, e);
64 }
65 
66 void
67 SinglePhaseFluidProperties::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 
79 Real
80 SinglePhaseFluidProperties::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 
91 void
92 SinglePhaseFluidProperties::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 
105 Real
106 SinglePhaseFluidProperties::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 
113 void
114 SinglePhaseFluidProperties::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 
125 Real
126 SinglePhaseFluidProperties::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 
133 void
134 SinglePhaseFluidProperties::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 
146 Real
147 SinglePhaseFluidProperties::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 
154 void
155 SinglePhaseFluidProperties::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 
167 Real
168 SinglePhaseFluidProperties::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 
175 void
176 SinglePhaseFluidProperties::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 
188 Real
189 SinglePhaseFluidProperties::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 
196 void
197 SinglePhaseFluidProperties::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 
208 Real
209 SinglePhaseFluidProperties::h_from_v_e(Real v, Real e) const
210 {
211  return e + v * p_from_v_e(v, e);
212 }
213 
214 void
215 SinglePhaseFluidProperties::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 
224 Real
225 SinglePhaseFluidProperties::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 
231 void
232 SinglePhaseFluidProperties::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 
248 Real
249 SinglePhaseFluidProperties::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 
255 void
256 SinglePhaseFluidProperties::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 
268 void
269 SinglePhaseFluidProperties::beta_from_p_T(Real, Real, Real &, Real &, Real &) const
270 {
271  mooseError(__PRETTY_FUNCTION__, " is not implemented.");
272 }
273 
274 Real
275 SinglePhaseFluidProperties::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 
289 Real
291 {
292  mooseError(__PRETTY_FUNCTION__, " not implemented.");
293 }
294 
295 std::string
297 {
298  return std::string("");
299 }
300 
301 Real
303 {
304  mooseError(__PRETTY_FUNCTION__, " not implemented.");
305 }
306 
307 Real
309 {
310  mooseError(__PRETTY_FUNCTION__, " not implemented.");
311 }
312 
313 Real
315 {
316  return rho_from_p_T(criticalPressure(), criticalTemperature());
317 }
318 
319 Real
321 {
322  return e_from_p_rho(criticalPressure(), criticalDensity());
323 }
324 
325 Real
327 {
328  mooseError(__PRETTY_FUNCTION__, " not implemented.");
329 }
330 
331 Real
333 {
334  mooseError(__PRETTY_FUNCTION__, " not implemented.");
335 }
336 
337 Real
338 SinglePhaseFluidProperties::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 
343 void
344 SinglePhaseFluidProperties::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 
354 Real
355 SinglePhaseFluidProperties::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 
360 void
361 SinglePhaseFluidProperties::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 
371 Real
373 {
374  mooseError(__PRETTY_FUNCTION__, " not implemented.");
375 }
376 
377 std::vector<Real>
379 {
380  mooseError(__PRETTY_FUNCTION__, " not implemented.");
381 }
382 
383 void
384 SinglePhaseFluidProperties::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 
392 ADReal
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 
407 Real
409 {
410  mooseError(__PRETTY_FUNCTION__, " not implemented.");
411 }
412 
413 void
414 SinglePhaseFluidProperties::vaporTemperature(Real p, Real & T, Real & dT_dp) const
415 {
416  unimplementedDerivativeMethod(__PRETTY_FUNCTION__);
417 
418  dT_dp = 0.0;
419  T = vaporTemperature(p);
420 }
421 
422 ADReal
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 
437 void
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 
451 void
452 SinglePhaseFluidProperties::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 
458 void
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 
472 void
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 
482 Real
484 {
485  mooseError(__PRETTY_FUNCTION__, " not implemented.");
486 }
487 
488 void
490 {
491  mooseError(__PRETTY_FUNCTION__, " not implemented.");
492 }
493 
494 Real
495 SinglePhaseFluidProperties::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 
504 Real
505 SinglePhaseFluidProperties::p_from_h_s(Real h, Real s) const
506 {
507  Real p0 = _p_initial_guess;
508  Real T0 = _T_initial_guess;
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 
515 void
516 SinglePhaseFluidProperties::p_from_h_s(Real h, Real s, Real & p, Real & dp_dh, Real & dp_ds) const
517 {
518  Real p0 = _p_initial_guess;
519  Real T0 = _T_initial_guess;
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 
527 void
528 SinglePhaseFluidProperties::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
static const std::string cv
Definition: NS.h:126
virtual Real triplePointTemperature() const
Triple point temperature.
static InputParameters validParams()
const double T
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].
const double v
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:60
void v_e_from_p_T(const CppType &p, const CppType &T, CppType &v, CppType &e) const
DualNumber< Real, DNDerivativeType, false > ADReal
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:125
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.
const double rho
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
const Real p
static const std::string pressure
Definition: NS.h:57
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 double mu
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:134
void ErrorVector unsigned int
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)