www.mooseframework.org
MethaneFluidProperties.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 
10 #include "MethaneFluidProperties.h"
11 #include "MathUtils.h"
12 #include "libmesh/utility.h"
13 
14 registerMooseObject("FluidPropertiesApp", MethaneFluidProperties);
15 
16 template <>
17 InputParameters
19 {
20  InputParameters params = validParams<HelmholtzFluidProperties>();
21  params.addClassDescription("Fluid properties for methane (CH4)");
22  return params;
23 }
24 
25 MethaneFluidProperties::MethaneFluidProperties(const InputParameters & parameters)
26  : HelmholtzFluidProperties(parameters),
27  _Mch4(16.0425e-3),
28  _p_critical(4.5992e6),
29  _T_critical(190.564),
30  _rho_critical(162.66),
31  _p_triple(1.169e4),
32  _T_triple(90.6941)
33 {
34 }
35 
37 
38 std::string
40 {
41  return "methane";
42 }
43 
44 Real
46 {
47  return _Mch4;
48 }
49 
50 Real
52 {
53  return _p_critical;
54 }
55 
56 Real
58 {
59  return _T_critical;
60 }
61 
62 Real
64 {
65  return _rho_critical;
66 }
67 
68 Real
70 {
71  return _p_triple;
72 }
73 
74 Real
76 {
77  return _T_triple;
78 }
79 
80 Real
81 MethaneFluidProperties::mu_from_p_T(Real /*pressure*/, Real temperature) const
82 {
83  // Check the temperature is in the range of validity (200 K <= T <= 1000 K)
84  if (temperature <= 200.0 || temperature >= 1000.0)
85  mooseException(
86  "Temperature ", temperature, "K out of range (200K, 1000K) in ", name(), ": mu_from_p_T()");
87 
88  Real viscosity = 0.0;
89  for (std::size_t i = 0; i < _a.size(); ++i)
90  viscosity += _a[i] * MathUtils::pow(temperature, i);
91 
92  return viscosity * 1.e-6;
93 }
94 
95 void
97  Real pressure, Real temperature, Real & mu, Real & dmu_dp, Real & dmu_dT) const
98 {
99 
100  mu = this->mu_from_p_T(pressure, temperature);
101  dmu_dp = 0.0;
102 
103  Real dmudt = 0.0;
104  for (std::size_t i = 0; i < _a.size(); ++i)
105  dmudt += i * _a[i] * MathUtils::pow(temperature, i) / temperature;
106  dmu_dT = dmudt * 1.e-6;
107 }
108 
109 Real
110 MethaneFluidProperties::k_from_p_T(Real /*pressure*/, Real temperature) const
111 {
112  // Check the temperature is in the range of validity (200 K <= T <= 1000 K)
113  if (temperature <= 200.0 || temperature >= 1000.0)
114  mooseException(
115  "Temperature ", temperature, "K out of range (200K, 1000K) in ", name(), ": k()");
116 
117  Real kt = 0.0;
118  for (std::size_t i = 0; i < _b.size(); ++i)
119  kt += _b[i] * MathUtils::pow(temperature, i);
120 
121  return kt;
122 }
123 
124 void
126  Real /*pressure*/, Real temperature, Real & k, Real & dk_dp, Real & dk_dT) const
127 {
128  // Check the temperature is in the range of validity (200 K <= T <= 1000 K)
129  if (temperature <= 200.0 || temperature >= 1000.0)
130  mooseException(
131  "Temperature ", temperature, "K out of range (200K, 1000K) in ", name(), ": k()");
132 
133  Real kt = 0.0, dkt_dT = 0.0;
134 
135  for (std::size_t i = 0; i < _b.size(); ++i)
136  kt += _b[i] * MathUtils::pow(temperature, i);
137 
138  for (std::size_t i = 1; i < _b.size(); ++i)
139  dkt_dT += i * _b[i] * MathUtils::pow(temperature, i) / temperature;
140 
141  k = kt;
142  dk_dp = 0.0;
143  dk_dT = dkt_dT;
144 }
145 
146 Real
148 {
149  if (temperature < _T_triple || temperature > _T_critical)
150  mooseException("Temperature is out of range in ", name(), ": vaporPressure()");
151 
152  const Real Tr = temperature / _T_critical;
153  const Real theta = 1.0 - Tr;
154 
155  const Real logpressure = (-6.036219 * theta + 1.409353 * std::pow(theta, 1.5) -
156  0.4945199 * Utility::pow<2>(theta) - 1.443048 * std::pow(theta, 4.5)) /
157  Tr;
158 
159  return _p_critical * std::exp(logpressure);
160 }
161 
162 void
163 MethaneFluidProperties::vaporPressure(Real, Real &, Real &) const
164 {
165  mooseError(name(), ": vaporPressure() is not implemented");
166 }
167 
168 std::vector<Real>
170 {
171  return {-10.44708, 4.66491, 12.12986};
172 }
173 
174 Real
176 {
177  if (temperature < _T_triple || temperature > _T_critical)
178  mooseException(
179  "Temperature ", temperature, " is out of range in ", name(), ": saturatedLiquidDensity()");
180 
181  const Real Tr = temperature / _T_critical;
182  const Real theta = 1.0 - Tr;
183 
184  const Real logdensity = 1.9906389 * std::pow(theta, 0.354) - 0.78756197 * std::sqrt(theta) +
185  0.036976723 * std::pow(theta, 2.5);
186 
187  return _rho_critical * std::exp(logdensity);
188 }
189 
190 Real
192 {
193  if (temperature < _T_triple || temperature > _T_critical)
194  mooseException(
195  "Temperature ", temperature, " is out of range in ", name(), ": saturatedVaporDensity()");
196 
197  const Real Tr = temperature / _T_critical;
198  const Real theta = 1.0 - Tr;
199 
200  const Real logdensity =
201  -1.880284 * std::pow(theta, 0.354) - 2.8526531 * std::pow(theta, 5.0 / 6.0) -
202  3.000648 * std::pow(theta, 1.5) - 5.251169 * std::pow(theta, 2.5) -
203  13.191859 * std::pow(theta, 25.0 / 6.0) - 37.553961 * std::pow(theta, 47.0 / 6.0);
204 
205  return _rho_critical * std::exp(logdensity);
206 }
207 
208 Real
209 MethaneFluidProperties::alpha(Real delta, Real tau) const
210 {
211  // Ideal gas component of the Helmholtz free energy
212  Real alpha0 = std::log(delta) + 9.91243972 - 6.33270087 * tau + 3.0016 * std::log(tau);
213 
214  for (std::size_t i = 0; i < _a0.size(); ++i)
215  alpha0 += _a0[i] * std::log(1.0 - std::exp(-_b0[i] * tau));
216 
217  // Residual component of the Helmholtz free energy
218  Real alphar = 0.0;
219 
220  for (std::size_t i = 0; i < _t1.size(); ++i)
221  alphar += _N1[i] * MathUtils::pow(delta, _d1[i]) * std::pow(tau, _t1[i]);
222 
223  for (std::size_t i = 0; i < _t2.size(); ++i)
224  alphar += _N2[i] * MathUtils::pow(delta, _d2[i]) * std::pow(tau, _t2[i]) *
225  std::exp(-MathUtils::pow(delta, _c2[i]));
226 
227  for (std::size_t i = 0; i < _t3.size(); ++i)
228  alphar += _N3[i] * MathUtils::pow(delta, _d3[i]) * std::pow(tau, _t3[i]) *
229  std::exp(-_alpha3[i] * Utility::pow<2>(delta - _D3[i]) -
230  _beta3[i] * Utility::pow<2>(tau - _gamma3[i]));
231 
232  // The Helmholtz free energy is the sum of these two
233  return alpha0 + alphar;
234 }
235 
236 Real
237 MethaneFluidProperties::dalpha_ddelta(Real delta, Real tau) const
238 {
239  // Ideal gas component of the Helmholtz free energy
240  Real dalpha0 = 1.0 / delta;
241 
242  // Residual component of the Helmholtz free energy
243  Real dalphar = 0.0;
244 
245  for (std::size_t i = 0; i < _t1.size(); ++i)
246  dalphar += _N1[i] * _d1[i] * MathUtils::pow(delta, _d1[i]) * std::pow(tau, _t1[i]);
247 
248  for (std::size_t i = 0; i < _t2.size(); ++i)
249  dalphar += _N2[i] * MathUtils::pow(delta, _d2[i]) * std::pow(tau, _t2[i]) *
250  std::exp(-MathUtils::pow(delta, _c2[i])) *
251  (_d2[i] - _c2[i] * MathUtils::pow(delta, _c2[i]));
252 
253  for (std::size_t i = 0; i < _t3.size(); ++i)
254  dalphar += _N3[i] * MathUtils::pow(delta, _d3[i]) * std::pow(tau, _t3[i]) *
255  std::exp(-_alpha3[i] * Utility::pow<2>(delta - _D3[i]) -
256  _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
257  (_d3[i] - delta * (2.0 * _alpha3[i] * (delta - _D3[i])));
258 
259  // The Helmholtz free energy is the sum of these two
260  return dalpha0 + dalphar / delta;
261 }
262 
263 Real
264 MethaneFluidProperties::dalpha_dtau(Real delta, Real tau) const
265 {
266  // Ideal gas component of the Helmholtz free energy
267  Real dalpha0 = -6.33270087 + 3.0016 / tau;
268 
269  for (std::size_t i = 0; i < _a0.size(); ++i)
270  dalpha0 += _a0[i] * _b0[i] * (1.0 / (1.0 - std::exp(-_b0[i] * tau)) - 1.0);
271 
272  // Residual component of the Helmholtz free energy
273  Real dalphar = 0.0;
274 
275  for (std::size_t i = 0; i < _t1.size(); ++i)
276  dalphar += _N1[i] * _t1[i] * MathUtils::pow(delta, _d1[i]) * std::pow(tau, _t1[i]);
277 
278  for (std::size_t i = 0; i < _t2.size(); ++i)
279  dalphar += _N2[i] * _t2[i] * MathUtils::pow(delta, _d2[i]) * std::pow(tau, _t2[i]) *
280  std::exp(-MathUtils::pow(delta, _c2[i]));
281 
282  for (std::size_t i = 0; i < _t3.size(); ++i)
283  dalphar += _N3[i] * MathUtils::pow(delta, _d3[i]) * std::pow(tau, _t3[i]) *
284  std::exp(-_alpha3[i] * Utility::pow<2>(delta - _D3[i]) -
285  _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
286  (_t3[i] + tau * (2.0 * _beta3[i] * (tau - _gamma3[i])));
287 
288  // The Helmholtz free energy is the sum of these two
289  return dalpha0 + dalphar / tau;
290 }
291 
292 Real
293 MethaneFluidProperties::d2alpha_ddelta2(Real delta, Real tau) const
294 {
295  // Ideal gas component of the Helmholtz free energy
296  Real dalpha0 = -1.0 / delta / delta;
297 
298  // Residual component of the Helmholtz free energy
299  Real dalphar = 0.0;
300 
301  for (std::size_t i = 0; i < _t1.size(); ++i)
302  dalphar +=
303  _N1[i] * _d1[i] * (_d1[i] - 1.0) * MathUtils::pow(delta, _d1[i]) * std::pow(tau, _t1[i]);
304 
305  for (std::size_t i = 0; i < _t2.size(); ++i)
306  dalphar += _N2[i] * MathUtils::pow(delta, _d2[i]) * std::pow(tau, _t2[i]) *
307  std::exp(-MathUtils::pow(delta, _c2[i])) *
308  ((_d2[i] - _c2[i] * MathUtils::pow(delta, _c2[i])) *
309  (_d2[i] - 1.0 - _c2[i] * MathUtils::pow(delta, _c2[i])) -
310  _c2[i] * _c2[i] * MathUtils::pow(delta, _c2[i]));
311 
312  for (std::size_t i = 0; i < _t3.size(); ++i)
313  dalphar += _N3[i] * std::pow(tau, _t3[i]) *
314  std::exp(-_alpha3[i] * Utility::pow<2>(delta - _D3[i]) -
315  _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
316  (-2.0 * _alpha3[i] * MathUtils::pow(delta, _d3[i] + 2) +
317  4.0 * _alpha3[i] * _alpha3[i] * MathUtils::pow(delta, _d3[i] + 2) *
318  MathUtils::pow(delta - _D3[i], 2) -
319  4.0 * _d3[i] * _alpha3[i] * MathUtils::pow(delta, _d3[i] + 1) * (delta - _D3[i]) +
320  _d3[i] * (_d3[i] - 1) * MathUtils::pow(delta, _d3[i]));
321 
322  // The Helmholtz free energy is the sum of these two
323  return dalpha0 + dalphar / delta / delta;
324 }
325 
326 Real
327 MethaneFluidProperties::d2alpha_dtau2(Real delta, Real tau) const
328 {
329  // Ideal gas component of the Helmholtz free energy
330  Real dalpha0 = -3.0016 / tau / tau;
331 
332  for (std::size_t i = 0; i < _a0.size(); ++i)
333  {
334  Real exptau = std::exp(-_b0[i] * tau);
335  dalpha0 -= _a0[i] * (_b0[i] * _b0[i] * exptau / (1.0 - exptau) / (1.0 - exptau));
336  }
337 
338  // Residual component of the Helmholtz free energy
339  Real dalphar = 0.0;
340 
341  for (std::size_t i = 0; i < _t1.size(); ++i)
342  dalphar +=
343  _N1[i] * _t1[i] * (_t1[i] - 1.0) * MathUtils::pow(delta, _d1[i]) * std::pow(tau, _t1[i]);
344 
345  for (std::size_t i = 0; i < _t2.size(); ++i)
346  dalphar += _N2[i] * _t2[i] * (_t2[i] - 1.0) * MathUtils::pow(delta, _d2[i]) *
347  std::pow(tau, _t2[i]) * std::exp(-MathUtils::pow(delta, _c2[i]));
348 
349  for (std::size_t i = 0; i < _t3.size(); ++i)
350  dalphar += _N3[i] * MathUtils::pow(delta, _d3[i]) * std::pow(tau, _t3[i]) *
351  std::exp(-_alpha3[i] * Utility::pow<2>(delta - _D3[i]) -
352  _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
353  (tau * _t3[i] - _beta3[i] * tau * tau * MathUtils::pow(tau - _gamma3[i], 2) -
354  _t3[i] - 2.0 * tau * tau * _beta3[i]);
355 
356  // The Helmholtz free energy is the sum of these two
357  return dalpha0 + dalphar / tau / tau;
358 }
359 
360 Real
361 MethaneFluidProperties::d2alpha_ddeltatau(Real delta, Real tau) const
362 {
363  // Residual component of the Helmholtz free energy
364  Real dalphar = 0.0;
365 
366  for (std::size_t i = 0; i < _t1.size(); ++i)
367  dalphar += _N1[i] * _d1[i] * _t1[i] * std::pow(delta, _d1[i]) * std::pow(tau, _t1[i]);
368 
369  for (std::size_t i = 0; i < _t2.size(); ++i)
370  dalphar += _N2[i] * _t2[i] * std::pow(delta, _d2[i]) * std::pow(tau, _t2[i]) *
371  std::exp(-MathUtils::pow(delta, _c2[i])) *
372  (_d2[i] - _c2[i] * MathUtils::pow(delta, _c2[i]));
373 
374  for (std::size_t i = 0; i < _t3.size(); ++i)
375  dalphar += _N3[i] * std::pow(delta, _d3[i]) * std::pow(tau, _t3[i]) *
376  std::exp(-_alpha3[i] * Utility::pow<2>(delta - _D3[i]) -
377  _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
378  (_d3[i] - 2.0 * _alpha3[i] * delta * (delta - _D3[i]) *
379  (_t3[i] - 2.0 * _beta3[i] * tau * (tau - _gamma3[i])));
380 
381  // The Helmholtz free energy is the sum of these two
382  return dalphar / delta / tau;
383 }
MethaneFluidProperties::_beta3
const std::array< Real, 4 > _beta3
Definition: MethaneFluidProperties.h:164
MethaneFluidProperties::k_from_p_T
virtual Real k_from_p_T(Real pressure, Real temperature) const override
Definition: MethaneFluidProperties.C:110
MethaneFluidProperties::_d2
const std::array< unsigned int, 23 > _d2
Definition: MethaneFluidProperties.h:156
MethaneFluidProperties::_N3
const std::array< Real, 4 > _N3
Definition: MethaneFluidProperties.h:159
MethaneFluidProperties
Methane (CH4) fluid properties as a function of pressure (Pa) and temperature (K).
Definition: MethaneFluidProperties.h:37
MethaneFluidProperties::_p_critical
const Real _p_critical
Critical pressure (Pa)
Definition: MethaneFluidProperties.h:113
MethaneFluidProperties::_alpha3
const std::array< Real, 4 > _alpha3
Definition: MethaneFluidProperties.h:163
MethaneFluidProperties::_d3
const std::array< int, 4 > _d3
Definition: MethaneFluidProperties.h:162
pow
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
Definition: ExpressionBuilder.h:673
MethaneFluidProperties::_a
const std::array< Real, 6 > _a
Coefficients for viscosity.
Definition: MethaneFluidProperties.h:169
validParams< MethaneFluidProperties >
InputParameters validParams< MethaneFluidProperties >()
Definition: MethaneFluidProperties.C:18
validParams< HelmholtzFluidProperties >
InputParameters validParams< HelmholtzFluidProperties >()
Definition: HelmholtzFluidProperties.C:16
MethaneFluidProperties::fluidName
virtual std::string fluidName() const override
Definition: MethaneFluidProperties.C:39
MethaneFluidProperties::henryCoefficients
virtual std::vector< Real > henryCoefficients() const override
Henry's law coefficients for dissolution in water.
Definition: MethaneFluidProperties.C:169
MethaneFluidProperties::criticalDensity
virtual Real criticalDensity() const override
Critical density.
Definition: MethaneFluidProperties.C:63
MethaneFluidProperties::~MethaneFluidProperties
virtual ~MethaneFluidProperties()
Definition: MethaneFluidProperties.C:36
MethaneFluidProperties::_T_critical
const Real _T_critical
Critical temperature (K)
Definition: MethaneFluidProperties.h:115
MethaneFluidProperties::criticalPressure
virtual Real criticalPressure() const override
Critical pressure.
Definition: MethaneFluidProperties.C:51
MethaneFluidProperties::_T_triple
const Real _T_triple
Triple point temperature (K)
Definition: MethaneFluidProperties.h:121
MethaneFluidProperties.h
MethaneFluidProperties::saturatedVaporDensity
Real saturatedVaporDensity(Real temperature) const
Saturated vapor density of CH4 Valid for temperatures between the triple point temperature and critic...
Definition: MethaneFluidProperties.C:191
MethaneFluidProperties::_c2
const std::array< unsigned int, 23 > _c2
Definition: MethaneFluidProperties.h:154
MethaneFluidProperties::_d1
const std::array< unsigned int, 13 > _d1
Definition: MethaneFluidProperties.h:143
MethaneFluidProperties::_p_triple
const Real _p_triple
Triple point pressure (Pa)
Definition: MethaneFluidProperties.h:119
MethaneFluidProperties::triplePointTemperature
virtual Real triplePointTemperature() const override
Triple point temperature.
Definition: MethaneFluidProperties.C:75
MethaneFluidProperties::_rho_critical
const Real _rho_critical
Critical density (kg/m^3)
Definition: MethaneFluidProperties.h:117
MethaneFluidProperties::_a0
const std::array< Real, 5 > _a0
Coefficients for ideal gas component of the Helmholtz free energy.
Definition: MethaneFluidProperties.h:124
MethaneFluidProperties::alpha
virtual Real alpha(Real delta, Real tau) const override
Helmholtz free energy.
Definition: MethaneFluidProperties.C:209
MethaneFluidProperties::triplePointPressure
virtual Real triplePointPressure() const override
Triple point pressure.
Definition: MethaneFluidProperties.C:69
MethaneFluidProperties::_t3
const std::array< Real, 4 > _t3
Definition: MethaneFluidProperties.h:161
MethaneFluidProperties::vaporPressure
virtual Real vaporPressure(Real temperature) const override
Vapor pressure.
Definition: MethaneFluidProperties.C:147
MethaneFluidProperties::criticalTemperature
virtual Real criticalTemperature() const override
Critical temperature.
Definition: MethaneFluidProperties.C:57
MethaneFluidProperties::d2alpha_ddeltatau
virtual Real d2alpha_ddeltatau(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt delta and tau.
Definition: MethaneFluidProperties.C:361
MethaneFluidProperties::_N2
const std::array< Real, 23 > _N2
Definition: MethaneFluidProperties.h:145
name
const std::string name
Definition: Setup.h:21
MethaneFluidProperties::dalpha_dtau
virtual Real dalpha_dtau(Real delta, Real tau) const override
Derivative of Helmholtz free energy wrt tau.
Definition: MethaneFluidProperties.C:264
MethaneFluidProperties::_N1
const std::array< Real, 13 > _N1
Coefficients for residual component of the Helmholtz free energy.
Definition: MethaneFluidProperties.h:128
HelmholtzFluidProperties
Base class equation of state for fluids that use a Helmholtz free energy alpha(delta,...
Definition: HelmholtzFluidProperties.h:34
MethaneFluidProperties::saturatedLiquidDensity
Real saturatedLiquidDensity(Real temperature) const
Saturated liquid density of CH4 Valid for temperatures between the triple point temperature and criti...
Definition: MethaneFluidProperties.C:175
MethaneFluidProperties::mu_from_p_T
virtual Real mu_from_p_T(Real pressure, Real temperature) const override
Definition: MethaneFluidProperties.C:81
MethaneFluidProperties::molarMass
virtual Real molarMass() const override
Fluid name.
Definition: MethaneFluidProperties.C:45
MethaneFluidProperties::MethaneFluidProperties
MethaneFluidProperties(const InputParameters &parameters)
Definition: MethaneFluidProperties.C:25
NS::temperature
const std::string temperature
Definition: NS.h:26
MethaneFluidProperties::dalpha_ddelta
virtual Real dalpha_ddelta(Real delta, Real tau) const override
Derivative of Helmholtz free energy wrt delta.
Definition: MethaneFluidProperties.C:237
MethaneFluidProperties::_t1
const std::array< Real, 13 > _t1
Definition: MethaneFluidProperties.h:141
MethaneFluidProperties::_b0
const std::array< Real, 5 > _b0
Definition: MethaneFluidProperties.h:125
MethaneFluidProperties::_D3
const std::array< Real, 4 > _D3
Definition: MethaneFluidProperties.h:166
registerMooseObject
registerMooseObject("FluidPropertiesApp", MethaneFluidProperties)
MethaneFluidProperties::_b
const std::array< Real, 7 > _b
Coefficients for thermal conductivity.
Definition: MethaneFluidProperties.h:172
MethaneFluidProperties::d2alpha_ddelta2
virtual Real d2alpha_ddelta2(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt delta.
Definition: MethaneFluidProperties.C:293
MethaneFluidProperties::_Mch4
const Real _Mch4
Methane molar mass (kg/mol)
Definition: MethaneFluidProperties.h:111
MethaneFluidProperties::_gamma3
const std::array< Real, 4 > _gamma3
Definition: MethaneFluidProperties.h:165
MethaneFluidProperties::_t2
const std::array< Real, 23 > _t2
Definition: MethaneFluidProperties.h:151
MethaneFluidProperties::d2alpha_dtau2
virtual Real d2alpha_dtau2(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt tau.
Definition: MethaneFluidProperties.C:327
NS::pressure
const std::string pressure
Definition: NS.h:25