https://mooseframework.inl.gov
Loading...
Searching...
No Matches
HeliumFluidProperties.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
13
16{
18 params.addClassDescription("Fluid properties for helium");
19 return params;
20}
21
23 : SinglePhaseFluidProperties(parameters), _cv(3117.0), _cp(5195.0)
24{
25}
26
27std::string
29{
30 return "helium";
31}
32
33Real
35{
36 // Initial guess using ideal gas law
37 Real e = p / (_cp / _cv - 1.) / rho;
38 const Real v = 1. / rho;
39
40 Real p_from_props, dp_dv, dp_de;
41 const unsigned int max_its = 10;
42 unsigned int it = 0;
43
44 do
45 {
46 p_from_v_e(v, e, p_from_props, dp_dv, dp_de);
47 const Real & jacobian = dp_de;
48 const Real residual = p_from_props - p;
49
50 if (std::abs(residual) / p < 1e-12)
51 break;
52
53 const Real delta_e = -residual / jacobian;
54 e += delta_e;
55 } while (++it < max_its);
56
57 if (it >= max_its)
58 mooseWarning("The e_from_p_rho iteration failed to converge");
59
60 return e;
61}
62
65{
66 // Initial guess using ideal gas law
67 ADReal e = p / (_cp / _cv - 1.) / rho;
68 const ADReal v = 1. / rho;
69
70 ADReal p_from_props, dp_dv, dp_de;
71 const unsigned int max_its = 10;
72 unsigned int it = 0;
73
74 do
75 {
76 p_from_v_e(v, e, p_from_props, dp_dv, dp_de);
77 const ADReal & jacobian = dp_de;
78 const ADReal residual = p_from_props - p;
79
80 if (std::abs(residual.value()) / p.value() < 1e-12)
81 break;
82
83 const ADReal delta_e = -residual / jacobian;
84 e += delta_e;
85 } while (++it < max_its);
86
87 if (it >= max_its)
88 mooseWarning("The e_from_p_rho iteration failed to converge");
89
90 return e;
91}
92
93Real
95{
96 Real T = T_from_v_e(v, e);
97 return T / (48.14 * v - 0.4446 / std::pow(T, 0.2)) * 1.0e5;
98}
99
100ADReal
102{
103 using std::pow;
104 const ADReal T = T_from_v_e(v, e);
105 return T / (48.14 * v - 0.4446 / pow(T, 0.2)) * 1.0e5;
106}
107
108void
109HeliumFluidProperties::p_from_v_e(Real v, Real e, Real & p, Real & dp_dv, Real & dp_de) const
110{
111 p = p_from_v_e(v, e);
112
113 Real T, dT_dv, dT_de;
114 T_from_v_e(v, e, T, dT_dv, dT_de);
115
116 Real val = 48.14 * v - 0.4446 / std::pow(T, 0.2);
117 Real dp_dT = 1.0e5 / val - 0.4446 * 0.2e5 * std::pow(T, -0.2) / (val * val);
118
119 dp_dv = -48.14e5 * T / (val * val); // taking advantage of dT_dv = 0.0;
120 dp_de = dp_dT * dT_de;
121}
122
123void
125 const ADReal & v, const ADReal & e, ADReal & p, ADReal & dp_dv, ADReal & dp_de) const
126{
127 using std::pow;
128 p = p_from_v_e(v, e);
129
130 ADReal T, dT_dv, dT_de;
131 T_from_v_e(v, e, T, dT_dv, dT_de);
132
133 auto val = 48.14 * v - 0.4446 / pow(T, 0.2);
134 auto dp_dT = 1.0e5 / val - 0.4446 * 0.2e5 * pow(T, -0.2) / (val * val);
135
136 dp_dv = -48.14e5 * T / (val * val); // taking advantage of dT_dv = 0.0;
137 dp_de = dp_dT * dT_de;
138}
139
140Real
141HeliumFluidProperties::p_from_T_v(const Real T, const Real v) const
142{
143 // Formula taken from p_from_v_e method
144 return T / (48.14 * v - 0.4446 / std::pow(T, 0.2)) * 1.0e5;
145}
146
147ADReal
149{
150 using std::pow;
151 // Formula taken from p_from_v_e method
152 return T / (48.14 * v - 0.4446 / pow(T, 0.2)) * 1.0e5;
153}
154
155Real
156HeliumFluidProperties::e_from_T_v(const Real T, const Real /*v*/) const
157{
158 // Formula taken from e_from_p_T method
159 return _cv * T;
160}
161
162void
164 const Real T, const Real v, Real & e, Real & de_dT, Real & de_dv) const
165{
166 e = e_from_T_v(T, v);
167 de_dT = _cv;
168 de_dv = 0;
169}
170
171ADReal
173{
174 // Formula taken from e_from_p_T method
175 return _cv * T;
176}
177
178void
180 const ADReal & T, const ADReal & v, ADReal & e, ADReal & de_dT, ADReal & de_dv) const
181{
182 e = e_from_T_v(T, v);
183 de_dT = _cv;
184 de_dv = 0;
185}
186
187Real
188HeliumFluidProperties::T_from_v_e(Real /*v*/, Real e) const
189{
190 return e / _cv;
191}
192
193ADReal
194HeliumFluidProperties::T_from_v_e(const ADReal & /*v*/, const ADReal & e) const
195{
196 return e / _cv;
197}
198
199void
200HeliumFluidProperties::T_from_v_e(Real v, Real e, Real & T, Real & dT_dv, Real & dT_de) const
201{
202 T = T_from_v_e(v, e);
203 dT_dv = 0.0;
204 dT_de = 1.0 / _cv;
205}
206
207void
209 const ADReal & v, const ADReal & e, ADReal & T, ADReal & dT_dv, ADReal & dT_de) const
210{
211 T = SinglePhaseFluidProperties::T_from_v_e(v, e);
212 dT_dv = 0.0;
213 dT_de = 1.0 / _cv;
214}
215
216Real
217HeliumFluidProperties::T_from_p_h(Real /* p */, Real h) const
218{
219 return h / _cp;
220}
221
222ADReal
223HeliumFluidProperties::T_from_p_h(const ADReal & /* p */, const ADReal & h) const
224{
225 return h / _cp;
226}
227
228Real
230{
231 Real p = p_from_v_e(v, e);
232 Real T = T_from_v_e(v, e);
233
234 Real rho, drho_dp, drho_dT;
235 rho_from_p_T(p, T, rho, drho_dp, drho_dT);
236
237 Real c2 = -(p / rho / rho - _cv / drho_dT) / (_cv * drho_dp / drho_dT);
238 return std::sqrt(c2);
239}
240
241void
242HeliumFluidProperties::c_from_v_e(Real v, Real e, Real & c, Real & dc_dv, Real & dc_de) const
243{
244 using std::sqrt;
245
246 ADReal myv = v;
247 Moose::derivInsert(myv.derivatives(), 0, 1);
248 Moose::derivInsert(myv.derivatives(), 1, 0);
249 ADReal mye = e;
250 Moose::derivInsert(mye.derivatives(), 0, 0);
251 Moose::derivInsert(mye.derivatives(), 1, 1);
252
253 auto p = SinglePhaseFluidProperties::p_from_v_e(myv, mye);
254 auto T = SinglePhaseFluidProperties::T_from_v_e(myv, mye);
255
256 ADReal rho, drho_dp, drho_dT;
257 rho_from_p_T(p, T, rho, drho_dp, drho_dT);
258
259 auto cc = sqrt(-(p / rho / rho - _cv / drho_dT) / (_cv * drho_dp / drho_dT));
260 c = cc.value();
261 dc_dv = cc.derivatives()[0];
262 dc_de = cc.derivatives()[1];
263}
264
265Real
266HeliumFluidProperties::cp_from_v_e(Real /*v*/, Real /*e*/) const
267{
268 return _cp;
269}
270
271void
272HeliumFluidProperties::cp_from_v_e(Real v, Real e, Real & cp, Real & dcp_dv, Real & dcp_de) const
273{
274 cp = cp_from_v_e(v, e);
275 dcp_dv = 0.0;
276 dcp_de = 0.0;
277}
278
279Real
280HeliumFluidProperties::cv_from_v_e(Real /*v*/, Real /*e*/) const
281{
282 return _cv;
283}
284
285void
286HeliumFluidProperties::cv_from_v_e(Real v, Real e, Real & cv, Real & dcv_dv, Real & dcv_de) const
287{
288 cv = cv_from_v_e(v, e);
289 dcv_dv = 0.0;
290 dcv_de = 0.0;
291}
292
293Real
295{
296 return 3.674e-7 * std::pow(T_from_v_e(v, e), 0.7);
297}
298
299void
300HeliumFluidProperties::mu_from_v_e(Real v, Real e, Real & mu, Real & dmu_dv, Real & dmu_de) const
301{
302 mu = mu_from_v_e(v, e);
303 const Real dmu_dT = 0.7 * 3.674e-7 * std::pow(T_from_v_e(v, e), -0.3);
304 dmu_dv = 0.0; // dmu_dp = 0, dT_dv is zero
305 dmu_de = dmu_dT / _cv; // dmu_dp = 0
306}
307
308Real
310{
311 Real p_in_bar = p_from_v_e(v, e) * 1.0e-5;
312 Real T = T_from_v_e(v, e);
313 return 2.682e-3 * (1.0 + 1.123e-3 * p_in_bar) * std::pow(T, 0.71 * (1.0 - 2.0e-4 * p_in_bar));
314}
315
316void
317HeliumFluidProperties::k_from_v_e(Real v, Real e, Real & k, Real & dk_dv, Real & dk_de) const
318{
319 Real T = 0., p = 0., dT_dv = 0., dT_de = 0., dp_dv = 0., dp_de = 0.;
320 T_from_v_e(v, e, T, dT_dv, dT_de);
321 p_from_v_e(v, e, p, dp_dv, dp_de);
322
323 // b and d scaled by 1e-5 to account for conversion to bar
324 constexpr Real a = 2.682e-3;
325 constexpr Real b = 1.123e-8;
326 constexpr Real c = 0.71;
327 constexpr Real d = 2.0e-9;
328
329 k = a * (1.0 + b * p) * std::pow(T, c * (1.0 - d * p));
330 Real dk_dT = a * c * (1.0 + b * p) * (1.0 - d * p) * std::pow(T, c * (1.0 - d * p) - 1.0);
331 Real dk_dp = a * std::pow(T, c * (1.0 - d * p)) * (b - c * d * (1 + b * p) * std::log(T));
332
333 dk_dv = dk_dp * dp_dv; // dT_dv is zero
334 dk_de = dk_dT * dT_de + dk_dp * dp_de;
335}
336
337Real
338HeliumFluidProperties::beta_from_p_T(Real pressure, Real temperature) const
339{
340 Real rho;
341 Real drho_dT;
342 Real drho_dp;
343 rho_from_p_T(pressure, temperature, rho, drho_dp, drho_dT);
344
345 return -drho_dT / rho;
346}
347
348Real
349HeliumFluidProperties::rho_from_p_T(Real pressure, Real temperature) const
350{
351 Real p_in_bar = pressure * 1.0e-5;
352 return 48.14 * p_in_bar / (temperature + 0.4446 * p_in_bar / std::pow(temperature, 0.2));
353}
354
355void
357 Real pressure, Real temperature, Real & rho, Real & drho_dp, Real & drho_dT) const
358{
359 rho = rho_from_p_T(pressure, temperature);
360 Real val = 1.0 / (temperature + 0.4446e-5 * pressure / std::pow(temperature, 0.2));
361 drho_dp = 48.14e-5 * (val - 0.4446e-5 * pressure * val * val / std::pow(temperature, 0.2));
362 drho_dT =
363 -48.14e-5 * pressure * val * val * (1.0 - 0.08892e-5 * pressure / std::pow(temperature, 1.2));
364}
365
366void
368 const ADReal & temperature,
369 ADReal & rho,
370 ADReal & drho_dp,
371 ADReal & drho_dT) const
372{
373 using std::pow;
374 rho = SinglePhaseFluidProperties::rho_from_p_T(pressure, temperature);
375 auto val = 1.0 / (temperature + 0.4446e-5 * pressure / pow(temperature, 0.2));
376 drho_dp = 48.14e-5 * (val - 0.4446e-5 * pressure * val * val / pow(temperature, 0.2));
377 drho_dT =
378 -48.14e-5 * pressure * val * val * (1.0 - 0.08892e-5 * pressure / pow(temperature, 1.2));
379}
380
381Real
382HeliumFluidProperties::e_from_p_T(Real /*pressure*/, Real temperature) const
383{
384 return _cv * temperature;
385}
386
387void
389 Real pressure, Real temperature, Real & e, Real & de_dp, Real & de_dT) const
390{
391 e = e_from_p_T(pressure, temperature);
392 de_dp = 0.0;
393 de_dT = _cv;
394}
395
396Real
397HeliumFluidProperties::e_from_v_h(Real /*v*/, Real h) const
398{
399 return _cv * (h / _cp);
400}
401
402void
403HeliumFluidProperties::e_from_v_h(Real v, Real h, Real & e, Real & de_dv, Real & de_dh) const
404{
405 e = e_from_v_h(v, h);
406 de_dv = 0.;
407 de_dh = _cv / _cp;
408}
409
410Real
411HeliumFluidProperties::h_from_p_T(Real /*pressure*/, Real temperature) const
412{
413 return _cp * temperature;
414}
415
416void
418 Real pressure, Real temperature, Real & h, Real & dh_dp, Real & dh_dT) const
419{
420 h = h_from_p_T(pressure, temperature);
421 dh_dp = 0.0;
422 dh_dT = _cp;
423}
424
425void
427 const ADReal & temperature,
428 ADReal & h,
429 ADReal & dh_dp,
430 ADReal & dh_dT) const
431{
432 h = _cp * temperature;
433 dh_dp = 0.0;
434 dh_dT = _cp;
435}
436
437Real
439{
440 return 4.002602e-3;
441}
442
443Real
444HeliumFluidProperties::cp_from_p_T(Real /*pressure*/, Real /*temperature*/) const
445{
446 return _cp;
447}
448
449void
451 Real pressure, Real temperature, Real & cp, Real & dcp_dp, Real & dcp_dT) const
452{
453 cp = cp_from_p_T(pressure, temperature);
454 dcp_dp = 0.0;
455 dcp_dT = 0.0;
456}
457
458Real
459HeliumFluidProperties::cv_from_p_T(Real /*pressure*/, Real /*temperature*/) const
460{
461 return _cv;
462}
463
464void
466 Real pressure, Real temperature, Real & cv, Real & dcv_dp, Real & dcv_dT) const
467{
468 cv = cv_from_p_T(pressure, temperature);
469 dcv_dp = 0.0;
470 dcv_dT = 0.0;
471}
472
473Real
474HeliumFluidProperties::mu_from_p_T(Real /*pressure*/, Real temperature) const
475{
476 return 3.674e-7 * std::pow(temperature, 0.7);
477}
478
479void
481 Real pressure, Real temperature, Real & mu, Real & dmu_dp, Real & dmu_dT) const
482{
483 mu = mu_from_p_T(pressure, temperature);
484 dmu_dp = 0.0;
485 dmu_dT = 3.674e-7 * 0.7 * std::pow(temperature, -0.3);
486}
487
488Real
489HeliumFluidProperties::k_from_p_T(Real pressure, Real temperature) const
490{
491 return 2.682e-3 * (1.0 + 1.123e-8 * pressure) *
492 std::pow(temperature, 0.71 * (1.0 - 2.0e-9 * pressure));
493}
494
495void
497 Real pressure, Real temperature, Real & k, Real & dk_dp, Real & dk_dT) const
498{
499 k = k_from_p_T(pressure, temperature);
500
501 Real term = 1.0 + 1.123e-8 * pressure;
502 Real exp = 0.71 * (1.0 - 2.0e-9 * pressure);
503
504 dk_dp = 2.682e-3 * (term * 0.71 * (-2.0e-9) * std::log(temperature) * std::pow(temperature, exp) +
505 std::pow(temperature, exp) * 1.123e-8);
506
507 dk_dT = 2.682e-3 * term * exp * std::pow(temperature, exp - 1.0);
508}
DualNumber< Real, DNDerivativeType, true > ADReal
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
const double mu
const Real p
const double rho
const double T
const double v
registerMooseObject("FluidPropertiesApp", HeliumFluidProperties)
Fluid properties for helium .
Real e_from_p_rho(Real p, Real rho) const override
virtual Real cp_from_v_e(Real v, Real e) const override
Isobaric specific heat from specific volume and specific internal energy.
const Real _cv
specific heat at constant volume
virtual Real molarMass() const override
Molar mass.
virtual Real k_from_p_T(Real p, Real T) const override
Thermal conductivity from pressure and temperature.
virtual Real c_from_v_e(Real v, Real e) const override
Speed of sound from specific volume and specific internal energy.
virtual Real e_from_p_T(Real p, Real T) const override
Specific internal energy from pressure and temperature.
virtual Real beta_from_p_T(Real p, Real T) const override
Thermal expansion coefficient from pressure and temperature.
virtual Real h_from_p_T(Real p, Real T) const override
Specific enthalpy from pressure and temperature.
virtual Real mu_from_p_T(Real p, Real T) const override
Dynamic viscosity from pressure and temperature.
virtual Real cv_from_v_e(Real v, Real e) const override
Isochoric specific heat from specific volume and specific internal energy.
virtual Real cv_from_p_T(Real p, Real T) const override
Isochoric specific heat capacity from pressure and temperature.
Real e_from_T_v(Real T, Real) const override
virtual Real k_from_v_e(Real v, Real e) const override
Thermal conductivity from specific volume and specific internal energy.
virtual Real cp_from_p_T(Real p, Real T) const override
Isobaric specific heat capacity from pressure and temperature.
HeliumFluidProperties(const InputParameters &parameters)
virtual Real T_from_p_h(Real p, Real h) const override
Temperature from pressure and specific enthalpy.
virtual Real e_from_v_h(Real v, Real h) const override
Specific internal energy from specific volume and specific enthalpy.
const Real _cp
specific heat at constant pressure
virtual Real T_from_v_e(Real v, Real e) const override
Temperature from specific volume and specific internal energy.
virtual Real rho_from_p_T(Real p, Real T) const override
Density from pressure and temperature.
static InputParameters validParams()
virtual Real p_from_v_e(Real v, Real e) const override
Pressure from specific volume and specific internal energy.
virtual Real mu_from_v_e(Real v, Real e) const override
Dynamic viscosity from specific volume and specific internal energy.
virtual std::string fluidName() const override
Fluid name.
Real p_from_T_v(Real T, Real v) const override
void addClassDescription(const std::string &doc_string)
void mooseWarning(Args &&... args) const
Common class for single phase fluid properties.
static InputParameters validParams()
e e e e s T T T T T rho v v T e h
void derivInsert(SemiDynamicSparseNumberArray< Real, libMesh::dof_id_type, NWrapper< N > > &derivs, libMesh::dof_id_type index, Real value)