https://mooseframework.inl.gov
Loading...
Searching...
No Matches
NitrogenFluidProperties.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#include "Conversion.h"
12#include "MathUtils.h"
13#include "libmesh/utility.h"
14
16
19{
21 params.addClassDescription("Fluid properties for Nitrogen (N2)");
22 return params;
23}
24
26 : HelmholtzFluidProperties(parameters),
27 _Mn2(28.01348e-3),
28 _p_critical(3.3958e6),
29 _T_critical(126.192),
30 _rho_molar_critical(11.1839),
31 _rho_critical(313.3),
32 _p_triple(12.523e3),
33 _T_triple(63.151)
34{
35}
36
37std::string
39{
40 return "nitrogen";
41}
42
43Real
45{
46 return _Mn2;
47}
48
49Real
54
55Real
60
61Real
66
67Real
72
73Real
78
79Real
80NitrogenFluidProperties::mu_from_rho_T(Real density, Real temperature) const
81{
82 // Scale the input density and temperature
83 const Real delta = density / _rho_critical;
84 const Real tau = _T_critical / temperature;
85 const Real logTstar = std::log(temperature / 98.94);
86
87 // The dilute gas component
88 Real logOmega = 0.0;
89 for (std::size_t i = 0; i < _bmu.size(); ++i)
90 logOmega += _bmu[i] * MathUtils::pow(logTstar, i);
91
92 const Real mu0 =
93 0.0266958 * std::sqrt(1000.0 * _Mn2 * temperature) / (0.3656 * 0.3656 * std::exp(logOmega));
94
95 // The residual component
96 Real mur = 0.0;
97 for (std::size_t i = 0; i < _Nmu.size(); ++i)
98 mur += _Nmu[i] * std::pow(tau, _tmu[i]) * MathUtils::pow(delta, _dmu[i]) *
99 std::exp(-_gammamu[i] * MathUtils::pow(delta, _lmu[i]));
100
101 // The viscosity in Pa.s
102 return (mu0 + mur) * 1.0e-6;
103}
104
105void
107 Real temperature,
108 Real ddensity_dT,
109 Real & mu,
110 Real & dmu_drho,
111 Real & dmu_dT) const
112{
113 // Scale the input density and temperature
114 const Real delta = density / _rho_critical;
115 const Real tau = _T_critical / temperature;
116 const Real logTstar = std::log(temperature / 98.94);
117
118 // The dilute gas component
119 Real logOmega = 0.0, dlogOmega_dT = 0.0;
120 for (std::size_t i = 0; i < _bmu.size(); ++i)
121 {
122 logOmega += _bmu[i] * MathUtils::pow(logTstar, i);
123 dlogOmega_dT += i * _bmu[i] * MathUtils::pow(logTstar, i) / (temperature * logTstar);
124 }
125
126 const Real mu0 =
127 0.0266958 * std::sqrt(1000.0 * _Mn2 * temperature) / (0.3656 * 0.3656 * std::exp(logOmega));
128 const Real dmu0_dT = 26.6958 * _Mn2 * (1.0 - 2.0 * temperature * dlogOmega_dT) *
129 std::exp(-logOmega) /
130 (2.0 * std::sqrt(1000.0 * _Mn2 * temperature) * 0.3656 * 0.3656);
131
132 // The residual component
133 Real mur = 0.0, dmur_drho = 0.0, dmur_dT = 0.0;
134 Real term;
135 for (std::size_t i = 0; i < _Nmu.size(); ++i)
136 {
137 term = _Nmu[i] * std::pow(tau, _tmu[i]) * MathUtils::pow(delta, _dmu[i]) *
138 std::exp(-_gammamu[i] * MathUtils::pow(delta, _lmu[i]));
139 mur += term;
140 dmur_drho += (_dmu[i] - _lmu[i] * _gammamu[i] * MathUtils::pow(delta, _lmu[i])) * term / delta /
141 _rho_molar_critical / (1000.0 * _Mn2);
142 dmur_dT += -_tmu[i] * term / temperature;
143 }
144
145 // The viscosity in Pa.s
146 mu = (mu0 + mur) * 1.0e-6;
147 dmu_drho = dmur_drho * 1.0e-6;
148 dmu_dT = (dmu0_dT + dmur_dT) * 1.0e-6 + dmu_drho * ddensity_dT;
149}
150
151Real
152NitrogenFluidProperties::mu_from_p_T(Real pressure, Real temperature) const
153{
154 // Require density first
155 const Real density = rho_from_p_T(pressure, temperature);
156 return mu_from_rho_T(density, temperature);
157}
158
159void
161 Real pressure, Real temperature, Real & mu, Real & dmu_dp, Real & dmu_dT) const
162{
163 Real rho, drho_dp, drho_dT;
164 rho_from_p_T(pressure, temperature, rho, drho_dp, drho_dT);
165
166 Real dmu_drho;
167 mu_from_rho_T(rho, temperature, drho_dT, mu, dmu_drho, dmu_dT);
168 dmu_dp = dmu_drho * drho_dp;
169}
170
171void
173 Real temperature,
174 Real & rho,
175 Real & mu) const
176{
177 rho = rho_from_p_T(pressure, temperature);
178 mu = mu_from_rho_T(rho, temperature);
179}
180
181void
183 Real temperature,
184 Real & rho,
185 Real & drho_dp,
186 Real & drho_dT,
187 Real & mu,
188 Real & dmu_dp,
189 Real & dmu_dT) const
190{
191 rho_from_p_T(pressure, temperature, rho, drho_dp, drho_dT);
192 Real dmu_drho;
193 mu_from_rho_T(rho, temperature, drho_dT, mu, dmu_drho, dmu_dT);
194 dmu_dp = dmu_drho * drho_dp;
195}
196
197Real
198NitrogenFluidProperties::k_from_rho_T(Real density, Real temperature) const
199{
200 // Scale the input density and temperature
201 const Real delta = density / _rho_critical;
202 const Real tau = _T_critical / temperature;
203
204 // The dilute gas component
205 const Real lambda0 =
206 1.511 * mu_from_rho_T(0.0, temperature) * 1.0e6 + 2.117 / tau - 3.332 * std::pow(tau, -0.7);
207
208 // The residual component
209 Real lambdar = 0.0;
210 for (std::size_t i = 0; i < _Nk.size(); ++i)
211 lambdar += _Nk[i] * std::pow(tau, _tk[i]) * MathUtils::pow(delta, _dk[i]) *
212 std::exp(-_gammak[i] * MathUtils::pow(delta, _lk[i]));
213
214 // The thermal conductivity (note: critical enhancement not implemented)
215 return (lambda0 + lambdar) * 1.0e-3;
216}
217
218Real
219NitrogenFluidProperties::k_from_p_T(Real pressure, Real temperature) const
220{
221 // Require density first
222 const Real density = rho_from_p_T(pressure, temperature);
223 return k_from_rho_T(density, temperature);
224}
225
226void
228 Real pressure, Real temperature, Real & k, Real & dk_dp, Real & dk_dT) const
229{
230 k = this->k_from_p_T(pressure, temperature);
231 // Calculate derivatives using finite differences
232 const Real eps = 1.0e-6;
233 const Real peps = pressure * eps;
234 const Real Teps = temperature * eps;
235
236 dk_dp = (this->k_from_p_T(pressure + peps, temperature) - k) / peps;
237 dk_dT = (this->k_from_p_T(pressure, temperature + Teps) - k) / Teps;
238}
239
240std::vector<Real>
242{
243 return {-9.67578, 4.72162, 11.70585};
244}
245
246Real
248{
249 if (temperature < _T_triple || temperature > _T_critical)
250 throw MooseException("Temperature is out of range in " + name() + ": vaporPressure()");
251
252 const Real Tr = temperature / _T_critical;
253 const Real theta = 1.0 - Tr;
254
255 const Real logpressure =
256 (-6.12445284 * theta + 1.2632722 * std::pow(theta, 1.5) - 0.765910082 * std::pow(theta, 2.5) -
257 1.77570564 * Utility::pow<5>(theta)) /
258 Tr;
259
260 return _p_critical * std::exp(logpressure);
261}
262
263void
264NitrogenFluidProperties::vaporPressure(Real, Real &, Real &) const
265{
266 mooseError("vaporPressure() is not implemented");
267}
268
269Real
271{
272 if (temperature < _T_triple || temperature > _T_critical)
273 throw MooseException("Temperature is out of range in " + name() + ": vaporPressure()");
274
275 const Real Tr = temperature / _T_critical;
276 const Real theta = 1.0 - Tr;
277
278 const Real logpressure =
279 1.48654237 * std::pow(theta, 0.3294) - 0.280476066 * std::pow(theta, 2.0 / 3.0) +
280 0.0894143085 * std::pow(theta, 8.0 / 3.0) - 0.119879866 * std::pow(theta, 35.0 / 6.0);
281
282 return _rho_critical * std::exp(logpressure);
283}
284
285Real
287{
288 if (temperature < _T_triple || temperature > _T_critical)
289 throw MooseException("Temperature is out of range in " + name() + ": vaporPressure()");
290
291 const Real Tr = temperature / _T_critical;
292 const Real theta = 1.0 - Tr;
293
294 const Real logpressure =
295 (-1.70127164 * std::pow(theta, 0.34) - 3.70402649 * std::pow(theta, 5.0 / 6.0) +
296 1.29859383 * std::pow(theta, 7.0 / 6.0) - 0.561424977 * std::pow(theta, 13.0 / 6.0) -
297 2.68505381 * std::pow(theta, 14.0 / 3.0)) /
298 Tr;
299
300 return _rho_critical * std::exp(logpressure);
301}
302
303Real
304NitrogenFluidProperties::alpha(Real delta, Real tau) const
305{
306 // Ideal gas component of the Helmholtz free energy
307 const Real alpha0 = std::log(delta) + _a[0] * std::log(tau) + _a[1] + _a[2] * tau + _a[3] / tau +
308 _a[4] / Utility::pow<2>(tau) + _a[5] / Utility::pow<3>(tau) +
309 _a[6] * std::log(1.0 - std::exp(-_a[7] * tau));
310
311 // Residual component of the Helmholtz free energy
312 Real alphar = 0.0;
313
314 for (std::size_t i = 0; i < _N1.size(); ++i)
315 alphar += _N1[i] * MathUtils::pow(delta, _i1[i]) * std::pow(tau, _j1[i]);
316
317 for (std::size_t i = 0; i < _N2.size(); ++i)
318 alphar += _N2[i] * MathUtils::pow(delta, _i2[i]) * std::pow(tau, _j2[i]) *
319 std::exp(-MathUtils::pow(delta, _l2[i]));
320
321 for (std::size_t i = 0; i < _N3.size(); ++i)
322 alphar += _N3[i] * MathUtils::pow(delta, _i3[i]) * std::pow(tau, _j3[i]) *
323 std::exp(-_phi3[i] * Utility::pow<2>(delta - 1.0) -
324 _beta3[i] * Utility::pow<2>(tau - _gamma3[i]));
325
326 // The Helmholtz free energy is the sum of these two
327 return alpha0 + alphar;
328}
329
330Real
331NitrogenFluidProperties::dalpha_ddelta(Real delta, Real tau) const
332{
333 // Ideal gas component of the Helmholtz free energy
334 const Real dalpha0 = 1.0 / delta;
335
336 // Residual component of the Helmholtz free energy
337 Real dalphar = 0.0;
338
339 for (std::size_t i = 0; i < _N1.size(); ++i)
340 dalphar += _N1[i] * _i1[i] * MathUtils::pow(delta, _i1[i]) * std::pow(tau, _j1[i]);
341
342 for (std::size_t i = 0; i < _N2.size(); ++i)
343 dalphar += _N2[i] * MathUtils::pow(delta, _i2[i]) * std::pow(tau, _j2[i]) *
344 std::exp(-MathUtils::pow(delta, _l2[i])) *
345 (_i2[i] - _l2[i] * MathUtils::pow(delta, _l2[i]));
346
347 for (std::size_t i = 0; i < _N3.size(); ++i)
348 dalphar += _N3[i] * MathUtils::pow(delta, _i3[i]) * std::pow(tau, _j3[i]) *
349 std::exp(-_phi3[i] * Utility::pow<2>(delta - 1.0) -
350 _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
351 (_i3[i] - 2.0 * delta * _phi3[i] * (delta - 1.0));
352
353 // The Helmholtz free energy is the sum of these two
354 return dalpha0 + dalphar / delta;
355}
356
357Real
358NitrogenFluidProperties::dalpha_dtau(Real delta, Real tau) const
359{
360 // Ideal gas component of the Helmholtz free energy
361 const Real dalpha0 = _a[0] + _a[2] * tau - _a[3] / tau - 2.0 * _a[4] / Utility::pow<2>(tau) -
362 3.0 * _a[5] / Utility::pow<3>(tau) +
363 _a[6] * _a[7] * tau / (std::exp(_a[7] * tau) - 1.0);
364
365 // Residual component of the Helmholtz free energy
366 Real dalphar = 0.0;
367
368 for (std::size_t i = 0; i < _N1.size(); ++i)
369 dalphar += _N1[i] * _j1[i] * MathUtils::pow(delta, _i1[i]) * std::pow(tau, _j1[i]);
370
371 for (std::size_t i = 0; i < _N2.size(); ++i)
372 dalphar += _N2[i] * _j2[i] * MathUtils::pow(delta, _i2[i]) * std::pow(tau, _j2[i]) *
373 std::exp(-MathUtils::pow(delta, _l2[i]));
374
375 for (std::size_t i = 0; i < _N3.size(); ++i)
376 dalphar += _N3[i] * MathUtils::pow(delta, _i3[i]) * std::pow(tau, _j3[i]) *
377 std::exp(-_phi3[i] * Utility::pow<2>(delta - 1.0) -
378 _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
379 (_j3[i] - 2.0 * tau * _beta3[i] * (tau - _gamma3[i]));
380
381 // The Helmholtz free energy is the sum of these two
382 return (dalpha0 + dalphar) / tau;
383}
384
385Real
387{
388 // Ideal gas component of the Helmholtz free energy
389 const Real dalpha0 = -1.0 / delta / delta;
390
391 // Residual component of the Helmholtz free energy
392 Real dalphar = 0.0;
393
394 for (std::size_t i = 0; i < _N1.size(); ++i)
395 dalphar +=
396 _N1[i] * _i1[i] * (_i1[i] - 1.0) * MathUtils::pow(delta, _i1[i]) * std::pow(tau, _j1[i]);
397
398 for (std::size_t i = 0; i < _N2.size(); ++i)
399 dalphar += _N2[i] * MathUtils::pow(delta, _i2[i]) * std::pow(tau, _j2[i]) *
400 std::exp(-MathUtils::pow(delta, _l2[i])) *
401 ((_i2[i] - _l2[i] * MathUtils::pow(delta, _l2[i])) *
402 (_i2[i] - 1.0 - _l2[i] * MathUtils::pow(delta, _l2[i])) -
403 _l2[i] * _l2[i] * MathUtils::pow(delta, _l2[i]));
404
405 for (std::size_t i = 0; i < _N3.size(); ++i)
406 dalphar += _N3[i] * MathUtils::pow(delta, _i3[i]) * std::pow(tau, _j3[i]) *
407 std::exp(-_phi3[i] * Utility::pow<2>(delta - 1.0) -
408 _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
409 (Utility::pow<2>(_i3[i] - 2.0 * delta * _phi3[i] * (delta - 1.0)) - _i3[i] -
410 2.0 * delta * delta * _phi3[i]);
411
412 // The Helmholtz free energy
413 return dalpha0 + dalphar / delta / delta;
414}
415
416Real
417NitrogenFluidProperties::d2alpha_dtau2(Real delta, Real tau) const
418{
419 // Ideal gas component of the Helmholtz free energy
420 const Real dalpha0 = -_a[0] + 2.0 * _a[3] / tau + 6.0 * _a[4] / Utility::pow<2>(tau) +
421 12.0 * _a[5] / Utility::pow<3>(tau) -
422 _a[6] * _a[7] * _a[7] * tau * tau * std::exp(_a[7] * tau) /
423 Utility::pow<2>(std::exp(_a[7] * tau) - 1.0);
424
425 // Residual component of the Helmholtz free energy
426 Real dalphar = 0.0;
427
428 for (std::size_t i = 0; i < _N1.size(); ++i)
429 dalphar +=
430 _N1[i] * _j1[i] * (_j1[i] - 1.0) * MathUtils::pow(delta, _i1[i]) * std::pow(tau, _j1[i]);
431
432 for (std::size_t i = 0; i < _N2.size(); ++i)
433 dalphar += _N2[i] * _j2[i] * (_j2[i] - 1.0) * MathUtils::pow(delta, _i2[i]) *
434 std::pow(tau, _j2[i]) * std::exp(-MathUtils::pow(delta, _l2[i]));
435
436 for (std::size_t i = 0; i < _N3.size(); ++i)
437 dalphar += _N3[i] * MathUtils::pow(delta, _i3[i]) * std::pow(tau, _j3[i]) *
438 std::exp(-_phi3[i] * Utility::pow<2>(delta - 1.0) -
439 _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
440 (Utility::pow<2>(_j3[i] - 2.0 * tau * _beta3[i] * (tau - _gamma3[i])) - _j3[i] -
441 2.0 * tau * tau * _beta3[i]);
442
443 // The Helmholtz free energy is the sum of these two
444 return (dalpha0 + dalphar) / tau / tau;
445}
446
447Real
449{
450 // Residual component of the Helmholtz free energy (second derivative of ideal
451 // component wrt delta and tau is 0)
452 Real dalphar = 0.0;
453
454 for (std::size_t i = 0; i < _N1.size(); ++i)
455 dalphar += _N1[i] * _i1[i] * _j1[i] * MathUtils::pow(delta, _i1[i]) * std::pow(tau, _j1[i]);
456
457 for (std::size_t i = 0; i < _N2.size(); ++i)
458 dalphar += _N2[i] * _j2[i] * MathUtils::pow(delta, _i2[i]) * std::pow(tau, _j2[i]) *
459 std::exp(-MathUtils::pow(delta, _l2[i])) *
460 (_i2[i] - _l2[i] * MathUtils::pow(delta, _l2[i]));
461
462 for (std::size_t i = 0; i < _N3.size(); ++i)
463 dalphar += _N3[i] * MathUtils::pow(delta, _i3[i]) * std::pow(tau, _j3[i]) *
464 std::exp(-_phi3[i] * Utility::pow<2>(delta - 1.0) -
465 _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
466 (_i3[i] - 2.0 * delta * _phi3[i] * (delta - 1.0)) *
467 (_j3[i] - 2.0 * tau * _beta3[i] * (tau - _gamma3[i]));
468
469 // The Helmholtz free energy
470 return dalphar / delta / tau;
471}
const double mu
const double rho
registerMooseObject("FluidPropertiesApp", NitrogenFluidProperties)
const std::string name
Definition Setup.h:21
Base class equation of state for fluids that use a Helmholtz free energy alpha(delta,...
static InputParameters validParams()
virtual Real rho_from_p_T(Real pressure, Real temperature) const override
void addClassDescription(const std::string &doc_string)
void mooseError(Args &&... args) const
Nitrogen (N2) fluid properties as a function of pressure (Pa) and temperature (K).
const std::array< Real, 26 > _j2
const std::array< unsigned int, 4 > _i3
const Real _T_critical
Critical temperature (K)
const std::array< Real, 26 > _N2
NitrogenFluidProperties(const InputParameters &parameters)
virtual Real dalpha_dtau(Real delta, Real tau) const override
Derivative of Helmholtz free energy wrt tau.
const std::array< unsigned int, 26 > _l2
virtual Real alpha(Real delta, Real tau) const override
Helmholtz free energy.
const std::array< Real, 4 > _gamma3
const std::array< unsigned int, 4 > _j3
virtual Real k_from_rho_T(Real density, Real temperature) const override
const std::array< Real, 6 > _tk
const std::array< unsigned int, 26 > _i2
const std::array< Real, 4 > _beta3
virtual Real dalpha_ddelta(Real delta, Real tau) const override
Derivative of Helmholtz free energy wrt delta.
const std::array< Real, 5 > _dmu
const std::array< Real, 5 > _tmu
const Real _p_critical
Critical pressure (Pa)
const std::array< unsigned int, 6 > _dk
const std::array< Real, 5 > _Nmu
virtual Real criticalDensity() const override
Critical density.
virtual std::string fluidName() const override
Fluid name.
const std::array< Real, 4 > _N3
const std::array< Real, 5 > _bmu
Coefficients for viscosity.
virtual Real d2alpha_ddelta2(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt delta.
const std::array< Real, 6 > _j1
virtual Real d2alpha_ddeltatau(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt delta and tau.
virtual Real triplePointPressure() const override
Triple point pressure.
const std::array< Real, 6 > _gammak
const std::array< Real, 8 > _a
Coefficients for ideal gas component of the Helmholtz free energy.
const std::array< Real, 5 > _lmu
const std::array< unsigned int, 6 > _i1
const Real _rho_molar_critical
Critical molar density (mol/l)
Real saturatedVaporDensity(Real temperature) const
Saturated vapor density of N2 Valid for temperatures between the triple point temperature and critica...
virtual Real vaporPressure(Real temperature) const override
Vapor pressure.
virtual Real criticalPressure() const override
Critical pressure.
virtual Real molarMass() const override
Molar mass [kg/mol].
virtual Real criticalTemperature() const override
Critical temperature.
const Real _p_triple
Triple point pressure (Pa)
Real saturatedLiquidDensity(Real temperature) const
Saturated liquid density of N2 Valid for temperatures between the triple point temperature and critic...
virtual Real triplePointTemperature() const override
Triple point temperature.
const std::array< Real, 6 > _N1
Coefficients for residual component of the Helmholtz free energy.
virtual Real d2alpha_dtau2(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt tau.
const std::array< Real, 4 > _phi3
static InputParameters validParams()
const std::array< Real, 5 > _gammamu
virtual Real k_from_p_T(Real pressure, Real temperature) const override
const Real _rho_critical
Critical density (kg/m^3)
const Real _Mn2
Nitrogen molar mass (kg/mol)
const std::array< Real, 6 > _Nk
Coefficients for thermal conductivity.
virtual std::vector< Real > henryCoefficients() const override
Henry's law coefficients for dissolution in water.
const Real _T_triple
Triple point temperature (K)
const std::array< unsigned int, 6 > _lk
virtual Real mu_from_rho_T(Real density, Real temperature) const override
virtual Real mu_from_p_T(Real pressure, Real temperature) const override
virtual void rho_mu_from_p_T(Real pressure, Real temperature, Real &rho, Real &mu) const override
Combined methods.
T pow(T x, int e)