Line data Source code
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 :
10 : #include "HeliumFluidProperties.h"
11 :
12 : registerMooseObject("FluidPropertiesApp", HeliumFluidProperties);
13 :
14 : InputParameters
15 22 : HeliumFluidProperties::validParams()
16 : {
17 22 : InputParameters params = SinglePhaseFluidProperties::validParams();
18 22 : params.addClassDescription("Fluid properties for helium");
19 22 : return params;
20 0 : }
21 :
22 11 : HeliumFluidProperties::HeliumFluidProperties(const InputParameters & parameters)
23 11 : : SinglePhaseFluidProperties(parameters), _cv(3117.0), _cp(5195.0)
24 : {
25 11 : }
26 :
27 : std::string
28 1 : HeliumFluidProperties::fluidName() const
29 : {
30 1 : return "helium";
31 : }
32 :
33 : Real
34 1 : HeliumFluidProperties::e_from_p_rho(Real p, Real rho) const
35 : {
36 : // Initial guess using ideal gas law
37 1 : Real e = p / (_cp / _cv - 1.) / rho;
38 1 : 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 2 : p_from_v_e(v, e, p_from_props, dp_dv, dp_de);
47 : const Real & jacobian = dp_de;
48 2 : const Real residual = p_from_props - p;
49 :
50 2 : if (std::abs(residual) / p < 1e-12)
51 : break;
52 :
53 1 : const Real delta_e = -residual / jacobian;
54 1 : e += delta_e;
55 1 : } while (++it < max_its);
56 :
57 1 : if (it >= max_its)
58 0 : mooseWarning("The e_from_p_rho iteration failed to converge");
59 :
60 1 : return e;
61 : }
62 :
63 : ADReal
64 0 : HeliumFluidProperties::e_from_p_rho(const ADReal & p, const ADReal & rho) const
65 : {
66 : // Initial guess using ideal gas law
67 0 : ADReal e = p / (_cp / _cv - 1.) / rho;
68 0 : 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 0 : 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 0 : if (std::abs(residual.value()) / p.value() < 1e-12)
81 : break;
82 :
83 0 : const ADReal delta_e = -residual / jacobian;
84 0 : e += delta_e;
85 0 : } while (++it < max_its);
86 :
87 0 : if (it >= max_its)
88 0 : mooseWarning("The e_from_p_rho iteration failed to converge");
89 :
90 0 : return e;
91 : }
92 :
93 : Real
94 10 : HeliumFluidProperties::p_from_v_e(Real v, Real e) const
95 : {
96 10 : Real T = T_from_v_e(v, e);
97 10 : return T / (48.14 * v - 0.4446 / std::pow(T, 0.2)) * 1.0e5;
98 : }
99 :
100 : ADReal
101 0 : HeliumFluidProperties::p_from_v_e(const ADReal & v, const ADReal & e) const
102 : {
103 : using std::pow;
104 0 : const ADReal T = T_from_v_e(v, e);
105 0 : return T / (48.14 * v - 0.4446 / pow(T, 0.2)) * 1.0e5;
106 : }
107 :
108 : void
109 3 : HeliumFluidProperties::p_from_v_e(Real v, Real e, Real & p, Real & dp_dv, Real & dp_de) const
110 : {
111 3 : p = p_from_v_e(v, e);
112 :
113 : Real T, dT_dv, dT_de;
114 3 : T_from_v_e(v, e, T, dT_dv, dT_de);
115 :
116 3 : Real val = 48.14 * v - 0.4446 / std::pow(T, 0.2);
117 3 : Real dp_dT = 1.0e5 / val - 0.4446 * 0.2e5 * std::pow(T, -0.2) / (val * val);
118 :
119 3 : dp_dv = -48.14e5 * T / (val * val); // taking advantage of dT_dv = 0.0;
120 3 : dp_de = dp_dT * dT_de;
121 3 : }
122 :
123 : void
124 0 : HeliumFluidProperties::p_from_v_e(
125 : const ADReal & v, const ADReal & e, ADReal & p, ADReal & dp_dv, ADReal & dp_de) const
126 : {
127 : using std::pow;
128 0 : p = p_from_v_e(v, e);
129 :
130 : ADReal T, dT_dv, dT_de;
131 0 : T_from_v_e(v, e, T, dT_dv, dT_de);
132 :
133 0 : auto val = 48.14 * v - 0.4446 / pow(T, 0.2);
134 0 : auto dp_dT = 1.0e5 / val - 0.4446 * 0.2e5 * pow(T, -0.2) / (val * val);
135 :
136 0 : dp_dv = -48.14e5 * T / (val * val); // taking advantage of dT_dv = 0.0;
137 0 : dp_de = dp_dT * dT_de;
138 0 : }
139 :
140 : Real
141 0 : HeliumFluidProperties::p_from_T_v(const Real T, const Real v) const
142 : {
143 : // Formula taken from p_from_v_e method
144 0 : return T / (48.14 * v - 0.4446 / std::pow(T, 0.2)) * 1.0e5;
145 : }
146 :
147 : ADReal
148 0 : HeliumFluidProperties::p_from_T_v(const ADReal & T, const ADReal & v) const
149 : {
150 : using std::pow;
151 : // Formula taken from p_from_v_e method
152 0 : return T / (48.14 * v - 0.4446 / pow(T, 0.2)) * 1.0e5;
153 : }
154 :
155 : Real
156 0 : HeliumFluidProperties::e_from_T_v(const Real T, const Real /*v*/) const
157 : {
158 : // Formula taken from e_from_p_T method
159 0 : return _cv * T;
160 : }
161 :
162 : void
163 0 : HeliumFluidProperties::e_from_T_v(
164 : const Real T, const Real v, Real & e, Real & de_dT, Real & de_dv) const
165 : {
166 0 : e = e_from_T_v(T, v);
167 0 : de_dT = _cv;
168 0 : de_dv = 0;
169 0 : }
170 :
171 : ADReal
172 0 : HeliumFluidProperties::e_from_T_v(const ADReal & T, const ADReal & /*v*/) const
173 : {
174 : // Formula taken from e_from_p_T method
175 0 : return _cv * T;
176 : }
177 :
178 : void
179 0 : HeliumFluidProperties::e_from_T_v(
180 : const ADReal & T, const ADReal & v, ADReal & e, ADReal & de_dT, ADReal & de_dv) const
181 : {
182 0 : e = e_from_T_v(T, v);
183 0 : de_dT = _cv;
184 0 : de_dv = 0;
185 0 : }
186 :
187 : Real
188 22 : HeliumFluidProperties::T_from_v_e(Real /*v*/, Real e) const
189 : {
190 22 : return e / _cv;
191 : }
192 :
193 : ADReal
194 0 : HeliumFluidProperties::T_from_v_e(const ADReal & /*v*/, const ADReal & e) const
195 : {
196 0 : return e / _cv;
197 : }
198 :
199 : void
200 4 : HeliumFluidProperties::T_from_v_e(Real v, Real e, Real & T, Real & dT_dv, Real & dT_de) const
201 : {
202 4 : T = T_from_v_e(v, e);
203 4 : dT_dv = 0.0;
204 4 : dT_de = 1.0 / _cv;
205 4 : }
206 :
207 : void
208 0 : HeliumFluidProperties::T_from_v_e(
209 : const ADReal & v, const ADReal & e, ADReal & T, ADReal & dT_dv, ADReal & dT_de) const
210 : {
211 0 : T = SinglePhaseFluidProperties::T_from_v_e(v, e);
212 0 : dT_dv = 0.0;
213 0 : dT_de = 1.0 / _cv;
214 0 : }
215 :
216 : Real
217 1 : HeliumFluidProperties::T_from_p_h(Real /* p */, Real h) const
218 : {
219 1 : return h / _cp;
220 : }
221 :
222 : ADReal
223 0 : HeliumFluidProperties::T_from_p_h(const ADReal & /* p */, const ADReal & h) const
224 : {
225 0 : return h / _cp;
226 : }
227 :
228 : Real
229 0 : HeliumFluidProperties::c_from_v_e(Real v, Real e) const
230 : {
231 0 : Real p = p_from_v_e(v, e);
232 0 : Real T = T_from_v_e(v, e);
233 :
234 : Real rho, drho_dp, drho_dT;
235 0 : rho_from_p_T(p, T, rho, drho_dp, drho_dT);
236 :
237 0 : Real c2 = -(p / rho / rho - _cv / drho_dT) / (_cv * drho_dp / drho_dT);
238 0 : return std::sqrt(c2);
239 : }
240 :
241 : void
242 0 : HeliumFluidProperties::c_from_v_e(Real v, Real e, Real & c, Real & dc_dv, Real & dc_de) const
243 : {
244 : using std::sqrt;
245 :
246 0 : ADReal myv = v;
247 : Moose::derivInsert(myv.derivatives(), 0, 1);
248 : Moose::derivInsert(myv.derivatives(), 1, 0);
249 0 : ADReal mye = e;
250 : Moose::derivInsert(mye.derivatives(), 0, 0);
251 : Moose::derivInsert(mye.derivatives(), 1, 1);
252 :
253 0 : auto p = SinglePhaseFluidProperties::p_from_v_e(myv, mye);
254 0 : auto T = SinglePhaseFluidProperties::T_from_v_e(myv, mye);
255 :
256 : ADReal rho, drho_dp, drho_dT;
257 0 : rho_from_p_T(p, T, rho, drho_dp, drho_dT);
258 :
259 0 : auto cc = sqrt(-(p / rho / rho - _cv / drho_dT) / (_cv * drho_dp / drho_dT));
260 0 : c = cc.value();
261 0 : dc_dv = cc.derivatives()[0];
262 0 : dc_de = cc.derivatives()[1];
263 0 : }
264 :
265 : Real
266 7 : HeliumFluidProperties::cp_from_v_e(Real /*v*/, Real /*e*/) const
267 : {
268 7 : return _cp;
269 : }
270 :
271 : void
272 1 : HeliumFluidProperties::cp_from_v_e(Real v, Real e, Real & cp, Real & dcp_dv, Real & dcp_de) const
273 : {
274 1 : cp = cp_from_v_e(v, e);
275 1 : dcp_dv = 0.0;
276 1 : dcp_de = 0.0;
277 1 : }
278 :
279 : Real
280 7 : HeliumFluidProperties::cv_from_v_e(Real /*v*/, Real /*e*/) const
281 : {
282 7 : return _cv;
283 : }
284 :
285 : void
286 1 : HeliumFluidProperties::cv_from_v_e(Real v, Real e, Real & cv, Real & dcv_dv, Real & dcv_de) const
287 : {
288 1 : cv = cv_from_v_e(v, e);
289 1 : dcv_dv = 0.0;
290 1 : dcv_de = 0.0;
291 1 : }
292 :
293 : Real
294 1 : HeliumFluidProperties::mu_from_v_e(Real v, Real e) const
295 : {
296 1 : return 3.674e-7 * std::pow(T_from_v_e(v, e), 0.7);
297 : }
298 :
299 : Real
300 1 : HeliumFluidProperties::k_from_v_e(Real v, Real e) const
301 : {
302 1 : Real p_in_bar = p_from_v_e(v, e) * 1.0e-5;
303 1 : Real T = T_from_v_e(v, e);
304 1 : 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));
305 : }
306 :
307 : Real
308 0 : HeliumFluidProperties::beta_from_p_T(Real pressure, Real temperature) const
309 : {
310 : Real rho;
311 : Real drho_dT;
312 : Real drho_dp;
313 0 : rho_from_p_T(pressure, temperature, rho, drho_dp, drho_dT);
314 :
315 0 : return -drho_dT / rho;
316 : }
317 :
318 : Real
319 14 : HeliumFluidProperties::rho_from_p_T(Real pressure, Real temperature) const
320 : {
321 14 : Real p_in_bar = pressure * 1.0e-5;
322 14 : return 48.14 * p_in_bar / (temperature + 0.4446 * p_in_bar / std::pow(temperature, 0.2));
323 : }
324 :
325 : void
326 1 : HeliumFluidProperties::rho_from_p_T(
327 : Real pressure, Real temperature, Real & rho, Real & drho_dp, Real & drho_dT) const
328 : {
329 1 : rho = rho_from_p_T(pressure, temperature);
330 1 : Real val = 1.0 / (temperature + 0.4446e-5 * pressure / std::pow(temperature, 0.2));
331 1 : drho_dp = 48.14e-5 * (val - 0.4446e-5 * pressure * val * val / std::pow(temperature, 0.2));
332 1 : drho_dT =
333 1 : -48.14e-5 * pressure * val * val * (1.0 - 0.08892e-5 * pressure / std::pow(temperature, 1.2));
334 1 : }
335 :
336 : void
337 0 : HeliumFluidProperties::rho_from_p_T(const ADReal & pressure,
338 : const ADReal & temperature,
339 : ADReal & rho,
340 : ADReal & drho_dp,
341 : ADReal & drho_dT) const
342 : {
343 : using std::pow;
344 0 : rho = SinglePhaseFluidProperties::rho_from_p_T(pressure, temperature);
345 0 : auto val = 1.0 / (temperature + 0.4446e-5 * pressure / pow(temperature, 0.2));
346 0 : drho_dp = 48.14e-5 * (val - 0.4446e-5 * pressure * val * val / pow(temperature, 0.2));
347 : drho_dT =
348 0 : -48.14e-5 * pressure * val * val * (1.0 - 0.08892e-5 * pressure / pow(temperature, 1.2));
349 0 : }
350 :
351 : Real
352 13 : HeliumFluidProperties::e_from_p_T(Real /*pressure*/, Real temperature) const
353 : {
354 13 : return _cv * temperature;
355 : }
356 :
357 : void
358 1 : HeliumFluidProperties::e_from_p_T(
359 : Real pressure, Real temperature, Real & e, Real & de_dp, Real & de_dT) const
360 : {
361 1 : e = e_from_p_T(pressure, temperature);
362 1 : de_dp = 0.0;
363 1 : de_dT = _cv;
364 1 : }
365 :
366 : Real
367 8 : HeliumFluidProperties::h_from_p_T(Real /*pressure*/, Real temperature) const
368 : {
369 8 : return _cp * temperature;
370 : }
371 :
372 : void
373 1 : HeliumFluidProperties::h_from_p_T(
374 : Real pressure, Real temperature, Real & h, Real & dh_dp, Real & dh_dT) const
375 : {
376 1 : h = h_from_p_T(pressure, temperature);
377 1 : dh_dp = 0.0;
378 1 : dh_dT = _cp;
379 1 : }
380 :
381 : Real
382 1 : HeliumFluidProperties::molarMass() const
383 : {
384 1 : return 4.002602e-3;
385 : }
386 :
387 : Real
388 7 : HeliumFluidProperties::cp_from_p_T(Real /*pressure*/, Real /*temperature*/) const
389 : {
390 7 : return _cp;
391 : }
392 :
393 : void
394 1 : HeliumFluidProperties::cp_from_p_T(
395 : Real pressure, Real temperature, Real & cp, Real & dcp_dp, Real & dcp_dT) const
396 : {
397 1 : cp = cp_from_p_T(pressure, temperature);
398 1 : dcp_dp = 0.0;
399 1 : dcp_dT = 0.0;
400 1 : }
401 :
402 : Real
403 7 : HeliumFluidProperties::cv_from_p_T(Real /*pressure*/, Real /*temperature*/) const
404 : {
405 7 : return _cv;
406 : }
407 :
408 : void
409 1 : HeliumFluidProperties::cv_from_p_T(
410 : Real pressure, Real temperature, Real & cv, Real & dcv_dp, Real & dcv_dT) const
411 : {
412 1 : cv = cv_from_p_T(pressure, temperature);
413 1 : dcv_dp = 0.0;
414 1 : dcv_dT = 0.0;
415 1 : }
416 :
417 : Real
418 7 : HeliumFluidProperties::mu_from_p_T(Real /*pressure*/, Real temperature) const
419 : {
420 7 : return 3.674e-7 * std::pow(temperature, 0.7);
421 : }
422 :
423 : void
424 1 : HeliumFluidProperties::mu_from_p_T(
425 : Real pressure, Real temperature, Real & mu, Real & dmu_dp, Real & dmu_dT) const
426 : {
427 1 : mu = mu_from_p_T(pressure, temperature);
428 1 : dmu_dp = 0.0;
429 1 : dmu_dT = 3.674e-7 * 0.7 * std::pow(temperature, -0.3);
430 1 : }
431 :
432 : Real
433 7 : HeliumFluidProperties::k_from_p_T(Real pressure, Real temperature) const
434 : {
435 7 : return 2.682e-3 * (1.0 + 1.123e-8 * pressure) *
436 7 : std::pow(temperature, 0.71 * (1.0 - 2.0e-9 * pressure));
437 : }
438 :
439 : void
440 1 : HeliumFluidProperties::k_from_p_T(
441 : Real pressure, Real temperature, Real & k, Real & dk_dp, Real & dk_dT) const
442 : {
443 1 : k = k_from_p_T(pressure, temperature);
444 :
445 1 : Real term = 1.0 + 1.123e-8 * pressure;
446 1 : Real exp = 0.71 * (1.0 - 2.0e-9 * pressure);
447 :
448 1 : dk_dp = 2.682e-3 * (term * 0.71 * (-2.0e-9) * std::log(temperature) * std::pow(temperature, exp) +
449 1 : std::pow(temperature, exp) * 1.123e-8);
450 :
451 1 : dk_dT = 2.682e-3 * term * exp * std::pow(temperature, exp - 1.0);
452 1 : }
|