www.mooseframework.org
NitrogenFluidProperties.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
15 registerMooseObject("FluidPropertiesApp", NitrogenFluidProperties);
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 
37 std::string
39 {
40  return "nitrogen";
41 }
42 
43 Real
45 {
46  return _Mn2;
47 }
48 
49 Real
51 {
52  return _p_critical;
53 }
54 
55 Real
57 {
58  return _T_critical;
59 }
60 
61 Real
63 {
64  return _rho_critical;
65 }
66 
67 Real
69 {
70  return _p_triple;
71 }
72 
73 Real
75 {
76  return _T_triple;
77 }
78 
79 Real
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 
105 void
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 
151 Real
153 {
154  // Require density first
157 }
158 
159 void
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 
171 void
173  Real temperature,
174  Real & rho,
175  Real & mu) const
176 {
179 }
180 
181 void
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 
197 Real
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 
218 Real
220 {
221  // Require density first
224 }
225 
226 void
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 
240 std::vector<Real>
242 {
243  return {-9.67578, 4.72162, 11.70585};
244 }
245 
246 Real
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 
263 void
264 NitrogenFluidProperties::vaporPressure(Real, Real &, Real &) const
265 {
266  mooseError("vaporPressure() is not implemented");
267 }
268 
269 Real
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 
285 Real
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 
303 Real
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 
330 Real
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 
357 Real
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 
385 Real
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 
416 Real
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 
447 Real
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 std::array< Real, 6 > _tk
const std::array< Real, 5 > _gammamu
const std::array< Real, 5 > _Nmu
const std::array< Real, 4 > _gamma3
const Real _T_triple
Triple point temperature (K)
virtual Real d2alpha_ddeltatau(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt delta and tau.
virtual Real alpha(Real delta, Real tau) const override
Helmholtz free energy.
const std::array< unsigned int, 4 > _j3
virtual Real criticalTemperature() const override
Critical temperature.
const std::array< Real, 6 > _gammak
virtual Real d2alpha_dtau2(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt tau.
const Real eps
const std::array< Real, 6 > _Nk
Coefficients for thermal conductivity.
const std::array< unsigned int, 26 > _i2
virtual Real criticalPressure() const override
Critical pressure.
const std::array< Real, 4 > _phi3
const std::array< Real, 26 > _j2
Real saturatedVaporDensity(Real temperature) const
Saturated vapor density of N2 Valid for temperatures between the triple point temperature and critica...
const std::array< Real, 5 > _bmu
Coefficients for viscosity.
static const std::string density
Definition: NS.h:33
int delta(unsigned int i, unsigned int j)
Delta function, which returns zero if $i j$ and unity if $i=j$.
virtual Real d2alpha_ddelta2(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt delta.
virtual Real vaporPressure(Real temperature) const override
Vapor pressure.
virtual std::string fluidName() const override
static const std::string temperature
Definition: NS.h:57
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
virtual const std::string & name() const
virtual Real criticalDensity() const override
Critical density.
const Real _rho_molar_critical
Critical molar density (mol/l)
const std::array< Real, 8 > _a
Coefficients for ideal gas component of the Helmholtz free energy.
const std::array< unsigned int, 6 > _i1
virtual Real mu_from_rho_T(Real density, Real temperature) const override
const std::array< Real, 26 > _N2
Real saturatedLiquidDensity(Real temperature) const
Saturated liquid density of N2 Valid for temperatures between the triple point temperature and critic...
const std::array< unsigned int, 6 > _dk
static const std::string mu
Definition: NS.h:122
virtual Real mu_from_p_T(Real pressure, Real temperature) const override
Nitrogen (N2) fluid properties as a function of pressure (Pa) and temperature (K).
virtual Real rho_from_p_T(Real pressure, Real temperature) const override
const std::array< unsigned int, 4 > _i3
const std::array< Real, 6 > _j1
const std::array< Real, 5 > _tmu
const std::array< Real, 5 > _dmu
const Real _rho_critical
Critical density (kg/m^3)
static InputParameters validParams()
const std::array< Real, 5 > _lmu
const std::array< unsigned int, 26 > _l2
NitrogenFluidProperties(const InputParameters &parameters)
const std::array< Real, 6 > _N1
Coefficients for residual component of the Helmholtz free energy.
const std::array< unsigned int, 6 > _lk
const Real _T_critical
Critical temperature (K)
registerMooseObject("FluidPropertiesApp", NitrogenFluidProperties)
const Real _p_critical
Critical pressure (Pa)
virtual Real triplePointTemperature() const override
Triple point temperature.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static InputParameters validParams()
virtual Real k_from_p_T(Real pressure, Real temperature) const override
const std::array< Real, 4 > _N3
virtual Real k_from_rho_T(Real density, Real temperature) const override
const Real _Mn2
Nitrogen molar mass (kg/mol)
virtual void rho_mu_from_p_T(Real pressure, Real temperature, Real &rho, Real &mu) const override
Combined methods.
const std::array< Real, 4 > _beta3
static const std::string pressure
Definition: NS.h:56
const Real _p_triple
Triple point pressure (Pa)
void mooseError(Args &&... args) const
virtual Real triplePointPressure() const override
Triple point pressure.
void addClassDescription(const std::string &doc_string)
virtual Real molarMass() const override
Fluid name.
T pow(T x, int e)
virtual Real dalpha_ddelta(Real delta, Real tau) const override
Derivative of Helmholtz free energy wrt delta.
Base class equation of state for fluids that use a Helmholtz free energy alpha(delta, tau), where delta is a scaled density and tau is a scaled temperature.
MooseUnits pow(const MooseUnits &, int)
virtual Real dalpha_dtau(Real delta, Real tau) const override
Derivative of Helmholtz free energy wrt tau.
static const std::string k
Definition: NS.h:124
virtual std::vector< Real > henryCoefficients() const override
Henry&#39;s law coefficients for dissolution in water.