www.mooseframework.org
CO2FluidProperties.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 "CO2FluidProperties.h"
11 #include "BrentsMethod.h"
12 #include "Conversion.h"
13 #include "MathUtils.h"
14 #include "libmesh/utility.h"
15 
16 registerMooseObject("FluidPropertiesApp", CO2FluidProperties);
17 
18 template <>
19 InputParameters
21 {
22  InputParameters params = validParams<HelmholtzFluidProperties>();
23  params.addClassDescription(
24  "Fluid properties for carbon dioxide (CO2) using the Span & Wagner EOS");
25  return params;
26 }
27 
28 CO2FluidProperties::CO2FluidProperties(const InputParameters & parameters)
29  : HelmholtzFluidProperties(parameters)
30 {
31 }
32 
34 
35 std::string
37 {
38  return "co2";
39 }
40 
41 Real
43 {
44  return _Mco2;
45 }
46 
47 Real
49 {
50  return _critical_pressure;
51 }
52 
53 Real
55 {
56  return _critical_temperature;
57 }
58 
59 Real
61 {
62  return _critical_density;
63 }
64 
65 Real
67 {
69 }
70 
71 Real
73 {
75 }
76 
77 Real
79 {
81  throw MooseException("Temperature is below the triple point temperature in " + name() +
82  ": meltingPressure()");
83 
85 
86  return _triple_point_pressure *
87  (1.0 + 1955.539 * (Tstar - 1.0) + 2055.4593 * Utility::pow<2>(Tstar - 1.0));
88 }
89 
90 Real
92 {
94  throw MooseException("Temperature is above the triple point temperature in " + name() +
95  ": sublimationPressure()");
96 
98 
100  std::exp((-14.740846 * (1.0 - Tstar) + 2.4327015 * std::pow(1.0 - Tstar, 1.9) -
101  5.3061778 * std::pow(1.0 - Tstar, 2.9)) /
102  Tstar);
103 
104  return pressure;
105 }
106 
107 Real
109 {
110  if (temperature < _triple_point_temperature || temperature > _critical_temperature)
111  throw MooseException("Temperature is out of range in " + name() + ": vaporPressure()");
112 
113  Real Tstar = temperature / _critical_temperature;
114 
115  Real logpressure =
116  (-7.0602087 * (1.0 - Tstar) + 1.9391218 * std::pow(1.0 - Tstar, 1.5) -
117  1.6463597 * Utility::pow<2>(1.0 - Tstar) - 3.2995634 * Utility::pow<4>(1.0 - Tstar)) /
118  Tstar;
119 
120  return _critical_pressure * std::exp(logpressure);
121 }
122 
123 void
124 CO2FluidProperties::vaporPressure(Real, Real &, Real &) const
125 {
126  mooseError(name(), ": vaporPressure() is not implemented");
127 }
128 
129 Real
131 {
132  if (temperature < _triple_point_temperature || temperature > _critical_temperature)
133  throw MooseException("Temperature is out of range in " + name() + ": saturatedLiquiDensity()");
134 
135  Real Tstar = temperature / _critical_temperature;
136 
137  Real logdensity = 1.9245108 * std::pow(1.0 - Tstar, 0.34) -
138  0.62385555 * std::pow(1.0 - Tstar, 0.5) -
139  0.32731127 * std::pow(1.0 - Tstar, 10.0 / 6.0) +
140  0.39245142 * std::pow(1.0 - Tstar, 11.0 / 6.0);
141 
142  return _critical_density * std::exp(logdensity);
143 }
144 
145 Real
147 {
148  if (temperature < _triple_point_temperature || temperature > _critical_temperature)
149  throw MooseException("Temperature is out of range in " + name() + ": saturatedVaporDensity()");
150 
151  Real Tstar = temperature / _critical_temperature;
152 
153  Real logdensity =
154  (-1.7074879 * std::pow(1.0 - Tstar, 0.34) - 0.82274670 * std::pow(1.0 - Tstar, 0.5) -
155  4.6008549 * (1.0 - Tstar) - 10.111178 * std::pow(1.0 - Tstar, 7.0 / 3.0) -
156  29.742252 * std::pow(1.0 - Tstar, 14.0 / 3.0));
157 
158  return _critical_density * std::exp(logdensity);
159 }
160 
161 Real
162 CO2FluidProperties::alpha(Real delta, Real tau) const
163 {
164  // Ideal gas component of the Helmholtz free energy
165  Real sum0 = 0.0;
166  for (std::size_t i = 0; i < _a0.size(); ++i)
167  sum0 += _a0[i] * std::log(1.0 - std::exp(-_theta0[i] * tau));
168 
169  Real phi0 = std::log(delta) + 8.37304456 - 3.70454304 * tau + 2.5 * std::log(tau) + sum0;
170 
171  // Residual component of the Helmholtz free energy
172  Real theta, Delta, Psi;
173  Real phir = 0.0;
174  for (std::size_t i = 0; i < _n1.size(); ++i)
175  phir += _n1[i] * MathUtils::pow(delta, _d1[i]) * std::pow(tau, _t1[i]);
176 
177  for (std::size_t i = 0; i < _n2.size(); ++i)
178  phir += _n2[i] * MathUtils::pow(delta, _d2[i]) * std::pow(tau, _t2[i]) *
179  std::exp(-MathUtils::pow(delta, _c2[i]));
180 
181  for (std::size_t i = 0; i < _n3.size(); ++i)
182  phir += _n3[i] * MathUtils::pow(delta, _d3[i]) * MathUtils::pow(tau, _t3[i]) *
183  std::exp(-_alpha3[i] * Utility::pow<2>(delta - _eps3[i]) -
184  _beta3[i] * Utility::pow<2>(tau - _gamma3[i]));
185 
186  for (std::size_t i = 0; i < _n4.size(); ++i)
187  {
188  theta = 1.0 - tau + _A4[i] * std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 * _beta4[i]));
189  Delta = Utility::pow<2>(theta) + _B4[i] * std::pow(Utility::pow<2>(delta - 1.0), _a4[i]);
190  Psi = std::exp(-_C4[i] * Utility::pow<2>(delta - 1.0) - _D4[i] * Utility::pow<2>(tau - 1.0));
191  phir += _n4[i] * std::pow(Delta, _b4[i]) * delta * Psi;
192  }
193 
194  // The Helmholtz free energy is the sum of these components
195  return phi0 + phir;
196 }
197 
198 Real
199 CO2FluidProperties::dalpha_ddelta(Real delta, Real tau) const
200 {
201  // Derivative of the ideal gas component wrt gamma
202  Real dphi0dd = 1.0 / delta;
203 
204  // Derivative of the residual component wrt gamma
205  Real theta, Delta, Psi, dDelta_dd, dPsi_dd;
206  Real dphirdd = 0.0;
207 
208  for (std::size_t i = 0; i < _n1.size(); ++i)
209  dphirdd += _n1[i] * _d1[i] * MathUtils::pow(delta, _d1[i] - 1.0) * std::pow(tau, _t1[i]);
210 
211  for (std::size_t i = 0; i < _n2.size(); ++i)
212  dphirdd += _n2[i] * std::exp(-MathUtils::pow(delta, _c2[i])) *
213  (MathUtils::pow(delta, _d2[i] - 1.0) * std::pow(tau, _t2[i]) *
214  (_d2[i] - _c2[i] * MathUtils::pow(delta, _c2[i])));
215 
216  for (std::size_t i = 0; i < _n3.size(); ++i)
217  dphirdd += _n3[i] * MathUtils::pow(delta, _d3[i]) * MathUtils::pow(tau, _t3[i]) *
218  std::exp(-_alpha3[i] * Utility::pow<2>(delta - _eps3[i]) -
219  _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
220  (_d3[i] / delta - 2.0 * _alpha3[i] * (delta - _eps3[i]));
221 
222  for (std::size_t i = 0; i < _n4.size(); ++i)
223  {
224  theta = 1.0 - tau + _A4[i] * std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 * _beta4[i]));
225  Delta = Utility::pow<2>(theta) + _B4[i] * std::pow(Utility::pow<2>(delta - 1.0), _a4[i]);
226  Psi = std::exp(-_C4[i] * Utility::pow<2>(delta - 1.0) - _D4[i] * Utility::pow<2>(tau - 1.0));
227  dPsi_dd = -2.0 * _C4[i] * (delta - 1.0) * Psi;
228  dDelta_dd = (delta - 1.0) *
229  (_A4[i] * theta * 2.0 / _beta4[i] *
230  std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 * _beta4[i]) - 1.0) +
231  2.0 * _B4[i] * _a4[i] * std::pow(Utility::pow<2>(delta - 1.0), _a4[i] - 1.0));
232 
233  dphirdd += _n4[i] * (std::pow(Delta, _b4[i]) * (Psi + delta * dPsi_dd) +
234  _b4[i] * std::pow(Delta, _b4[i] - 1.0) * dDelta_dd * delta * Psi);
235  }
236 
237  // The derivative of the free energy wrt delta is the sum of these components
238  return dphi0dd + dphirdd;
239 }
240 
241 Real
242 CO2FluidProperties::dalpha_dtau(Real delta, Real tau) const
243 {
244  // Derivative of the ideal gas component wrt tau
245  Real sum0 = 0.0;
246  for (std::size_t i = 0; i < _a0.size(); ++i)
247  sum0 += _a0[i] * _theta0[i] * (1.0 / (1.0 - std::exp(-_theta0[i] * tau)) - 1.0);
248 
249  Real dphi0dt = -3.70454304 + 2.5 / tau + sum0;
250 
251  // Derivative of the residual component wrt tau
252  Real theta, Delta, Psi, dDelta_dt, dPsi_dt;
253  Real dphirdt = 0.0;
254  for (std::size_t i = 0; i < _n1.size(); ++i)
255  dphirdt += _n1[i] * _t1[i] * MathUtils::pow(delta, _d1[i]) * std::pow(tau, _t1[i] - 1.0);
256 
257  for (std::size_t i = 0; i < _n2.size(); ++i)
258  dphirdt += _n2[i] * _t2[i] * MathUtils::pow(delta, _d2[i]) * std::pow(tau, _t2[i] - 1.0) *
259  std::exp(-MathUtils::pow(delta, _c2[i]));
260 
261  for (std::size_t i = 0; i < _n3.size(); ++i)
262  dphirdt += _n3[i] * MathUtils::pow(delta, _d3[i]) * MathUtils::pow(tau, _t3[i]) *
263  std::exp(-_alpha3[i] * Utility::pow<2>(delta - _eps3[i]) -
264  _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
265  (_t3[i] / tau - 2.0 * _beta3[i] * (tau - _gamma3[i]));
266 
267  for (std::size_t i = 0; i < _n4.size(); ++i)
268  {
269  theta = 1.0 - tau + _A4[i] * std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 * _beta4[i]));
270  Delta = Utility::pow<2>(theta) + _B4[i] * std::pow(Utility::pow<2>(delta - 1.0), _a4[i]);
271  Psi = std::exp(-_C4[i] * Utility::pow<2>(delta - 1.0) - _D4[i] * Utility::pow<2>(tau - 1.0));
272  dDelta_dt = -2.0 * theta * _b4[i] * std::pow(Delta, _b4[i] - 1.0);
273  dPsi_dt = -2.0 * _D4[i] * (tau - 1.0) * Psi;
274 
275  dphirdt += _n4[i] * delta * (Psi * dDelta_dt + std::pow(Delta, _b4[i]) * dPsi_dt);
276  }
277 
278  // The derivative of the free energy wrt tau is the sum of these components
279  return dphi0dt + dphirdt;
280 }
281 
282 Real
283 CO2FluidProperties::d2alpha_ddelta2(Real delta, Real tau) const
284 {
285  // Second derivative of the ideal gas component wrt gamma
286  Real d2phi0dd2 = -1.0 / delta / delta;
287 
288  // Second derivative of the residual component wrt gamma
289  Real d2phirdd2 = 0.0;
290  Real theta, Delta, Psi, dDelta_dd, dPsi_dd, d2Delta_dd2, d2Psi_dd2;
291 
292  for (std::size_t i = 0; i < _n1.size(); ++i)
293  d2phirdd2 += _n1[i] * _d1[i] * (_d1[i] - 1.0) * MathUtils::pow(delta, _d1[i] - 2) *
294  std::pow(tau, _t1[i]);
295 
296  for (std::size_t i = 0; i < _n2.size(); ++i)
297  d2phirdd2 += _n2[i] * std::exp(-MathUtils::pow(delta, _c2[i])) *
298  MathUtils::pow(delta, _d2[i] - 2) * std::pow(tau, _t2[i]) *
299  ((_d2[i] - _c2[i] * MathUtils::pow(delta, _c2[i])) *
300  (_d2[i] - 1.0 - _c2[i] * MathUtils::pow(delta, _c2[i])) -
301  _c2[i] * _c2[i] * MathUtils::pow(delta, _c2[i]));
302 
303  for (std::size_t i = 0; i < _n3.size(); ++i)
304  d2phirdd2 +=
305  _n3[i] * MathUtils::pow(tau, _t3[i]) *
306  std::exp(-_alpha3[i] * Utility::pow<2>(delta - _eps3[i]) -
307  _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
308  (-2.0 * _alpha3[i] * MathUtils::pow(delta, _d3[i]) +
309  4.0 * _alpha3[i] * _alpha3[i] * MathUtils::pow(delta, _d3[i]) *
310  Utility::pow<2>(delta - _eps3[i]) -
311  4.0 * _d3[i] * _alpha3[i] * MathUtils::pow(delta, _d3[i] - 1.0) * (delta - _eps3[i]) +
312  _d3[i] * (_d3[i] - 1.0) * MathUtils::pow(delta, _d3[i] - 2.0));
313 
314  for (std::size_t i = 0; i < _n4.size(); ++i)
315  {
316  theta = 1.0 - tau + _A4[i] * std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 * _beta4[i]));
317  Delta = Utility::pow<2>(theta) + _B4[i] * std::pow(Utility::pow<2>(delta - 1.0), _a4[i]);
318  Psi = std::exp(-_C4[i] * Utility::pow<2>(delta - 1.0) - _D4[i] * Utility::pow<2>(tau - 1.0));
319  dPsi_dd = -2.0 * _C4[i] * (delta - 1.0) * Psi;
320  dDelta_dd = (delta - 1.0) *
321  (_A4[i] * theta * 2.0 / _beta4[i] *
322  std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 * _beta4[i]) - 1.0) +
323  2.0 * _B4[i] * _a4[i] * std::pow(Utility::pow<2>(delta - 1.0), _a4[i] - 1.0));
324  d2Psi_dd2 = 3.0 * _D4[i] * Psi * (2.0 * _C4[i] * Utility::pow<2>(delta - 1.0) - 1.0);
325  d2Delta_dd2 = 1.0 / (delta - 1.0) * dDelta_dd +
326  (delta - 1.0) * (delta - 1.0) *
327  (4.0 * _B4[i] * _a4[i] * (_a4[i] - 1.0) *
328  std::pow(Utility::pow<2>(delta - 1.0), _a4[i] - 2.0) +
329  2.0 * _A4[i] * _A4[i] *
330  Utility::pow<2>(std::pow(Utility::pow<2>(delta - 1.0),
331  1.0 / (2.0 * _beta4[i]) - 1.0)) /
332  _beta4[i] / _beta4[i] +
333  (4.0 / _beta4[i]) * _A4[i] * theta * (1.0 / (2.0 * _beta4[i]) - 1.0) *
334  std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 * _beta4[i]) - 2.0));
335  d2phirdd2 +=
336  _n4[i] *
337  (std::pow(Delta, _b4[i]) * (2.0 * dPsi_dd + delta * d2Psi_dd2) +
338  2.0 * _b4[i] * std::pow(Delta, _b4[i] - 1.0) * dDelta_dd * (Psi + delta * dPsi_dd) +
339  _b4[i] *
340  (std::pow(Delta, _b4[i] - 1.0) * d2Delta_dd2 +
341  (_b4[i] - 1.0) * std::pow(Delta, _b4[i] - 2.0) * Utility::pow<2>(dDelta_dd)) *
342  delta * Psi);
343  }
344  // The second derivative of the free energy wrt delta is the sum of these components
345  return d2phi0dd2 + d2phirdd2;
346 }
347 
348 Real
349 CO2FluidProperties::d2alpha_dtau2(Real delta, Real tau) const
350 {
351  // Second derivative of the ideal gas component wrt tau
352  Real sum0 = 0.0;
353  for (std::size_t i = 0; i < _a0.size(); ++i)
354  sum0 += _a0[i] * _theta0[i] * _theta0[i] * std::exp(-_theta0[i] * tau) /
355  Utility::pow<2>(1.0 - std::exp(-_theta0[i] * tau));
356 
357  Real d2phi0dt2 = -2.5 / tau / tau - sum0;
358 
359  // Second derivative of the residual component wrt tau
360  Real d2phirdt2 = 0.0;
361  Real theta, Delta, Psi, dPsi_dt, dDelta_dt, d2Delta_dt2, d2Psi_dt2;
362 
363  for (std::size_t i = 0; i < _n1.size(); ++i)
364  d2phirdt2 += _n1[i] * _t1[i] * (_t1[i] - 1.0) * MathUtils::pow(delta, _d1[i]) *
365  std::pow(tau, _t1[i] - 2.0);
366 
367  for (std::size_t i = 0; i < _n2.size(); ++i)
368  d2phirdt2 += _n2[i] * _t2[i] * (_t2[i] - 1.0) * MathUtils::pow(delta, _d2[i]) *
369  std::exp(-MathUtils::pow(delta, _c2[i])) * std::pow(tau, _t2[i] - 2.0);
370 
371  for (std::size_t i = 0; i < _n3.size(); ++i)
372  d2phirdt2 += _n3[i] * MathUtils::pow(delta, _d3[i]) * MathUtils::pow(tau, _t3[i]) *
373  std::exp(-_alpha3[i] * Utility::pow<2>(delta - _eps3[i]) -
374  _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
375  (Utility::pow<2>(_t3[i] / tau - 2.0 * _beta3[i] * (tau - _gamma3[i])) -
376  _t3[i] / tau / tau - 2.0 * _beta3[i]);
377 
378  for (std::size_t i = 0; i < _n4.size(); ++i)
379  {
380  theta = 1.0 - tau + _A4[i] * std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 * _beta4[i]));
381  Delta = Utility::pow<2>(theta) + _B4[i] * std::pow(Utility::pow<2>(delta - 1.0), _a4[i]);
382  Psi = std::exp(-_C4[i] * Utility::pow<2>(delta - 1.0) - _D4[i] * Utility::pow<2>(tau - 1.0));
383  dDelta_dt = -2.0 * theta * _b4[i] * std::pow(Delta, _b4[i] - 1.0);
384  d2Delta_dt2 = 2.0 * _b4[i] * std::pow(Delta, _b4[i] - 1.0) +
385  4.0 * theta * theta * _b4[i] * (_b4[i] - 1.0) * std::pow(Delta, _b4[i] - 2.0);
386  dPsi_dt = -2.0 * _D4[i] * (tau - 1.0) * Psi;
387  d2Psi_dt2 = 2.0 * _D4[i] * (2.0 * _D4[i] * (tau - 1.0) * (tau - 1.0) - 1.0) * Psi;
388  d2phirdt2 +=
389  _n4[i] * delta *
390  (Psi * d2Delta_dt2 + 2.0 * dDelta_dt * dPsi_dt + std::pow(Delta, _b4[i]) * d2Psi_dt2);
391  }
392 
393  // The second derivative of the free energy wrt tau is the sum of these components
394  return d2phi0dt2 + d2phirdt2;
395 }
396 
397 Real
398 CO2FluidProperties::d2alpha_ddeltatau(Real delta, Real tau) const
399 {
400  // Note: second derivative of the ideal gas component wrt delta and tau is 0
401  // Derivative of the residual component wrt gamma
402  Real theta, Delta, Psi, dDelta_dd, dPsi_dd, dDelta_dt, dPsi_dt, d2Delta_ddt, d2Psi_ddt;
403  Real d2phirddt = 0.0;
404  for (std::size_t i = 0; i < _n1.size(); ++i)
405  d2phirddt += _n1[i] * _d1[i] * _t1[i] * MathUtils::pow(delta, _d1[i] - 1.0) *
406  std::pow(tau, _t1[i] - 1.0);
407 
408  for (std::size_t i = 0; i < _n2.size(); ++i)
409  d2phirddt += _n2[i] * std::exp(-MathUtils::pow(delta, _c2[i])) *
410  (MathUtils::pow(delta, _d2[i] - 1.0) * _t2[i] * std::pow(tau, _t2[i] - 1.0) *
411  (_d2[i] - _c2[i] * MathUtils::pow(delta, _c2[i])));
412 
413  for (std::size_t i = 0; i < _n3.size(); ++i)
414  d2phirddt += _n3[i] * MathUtils::pow(delta, _d3[i]) * MathUtils::pow(tau, _t3[i]) *
415  std::exp(-_alpha3[i] * Utility::pow<2>(delta - _eps3[i]) -
416  _beta3[i] * Utility::pow<2>(tau - _gamma3[i])) *
417  (_d3[i] / delta - 2.0 * _alpha3[i] * (delta - _eps3[i])) *
418  (_t3[i] / tau - 2.0 * _beta3[i] * (tau - _gamma3[i]));
419 
420  for (std::size_t i = 0; i < _n4.size(); ++i)
421  {
422  theta = 1.0 - tau + _A4[i] * std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 * _beta4[i]));
423  Delta = Utility::pow<2>(theta) + _B4[i] * std::pow(Utility::pow<2>(delta - 1.0), _a4[i]);
424  Psi = std::exp(-_C4[i] * Utility::pow<2>(delta - 1.0) - _D4[i] * Utility::pow<2>(tau - 1.0));
425  dPsi_dd = -2.0 * _C4[i] * (delta - 1.0) * Psi;
426  dPsi_dt = -2.0 * _D4[i] * (tau - 1.0) * Psi;
427  d2Psi_ddt = 4.0 * _C4[i] * _D4[i] * (delta - 1.0) * (tau - 1.0) * Psi;
428  dDelta_dd = (delta - 1.0) *
429  (_A4[i] * theta * 2.0 / _beta4[i] *
430  std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 * _beta4[i]) - 1.0) +
431  2.0 * _B4[i] * _a4[i] * std::pow(Utility::pow<2>(delta - 1.0), _a4[i] - 1.0));
432  dDelta_dt = -2.0 * theta * _b4[i] * std::pow(Delta, _b4[i] - 1.0);
433  d2Delta_ddt = -2.0 * _A4[i] * _b4[i] / _beta4[i] * std::pow(Delta, _b4[i] - 1.0) *
434  (delta - 1.0) *
435  std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 * _beta4[i]) - 1.0) -
436  2.0 * theta * _b4[i] * (_b4[i] - 1.0) * std::pow(Delta, _b4[i] - 2.0) * dDelta_dd;
437 
438  d2phirddt += _n4[i] * (std::pow(Delta, _b4[i]) * (dPsi_dt + delta * d2Psi_ddt) +
439  delta * _b4[i] * std::pow(Delta, _b4[i] - 1.0) * dDelta_dd * dPsi_dt +
440  dDelta_dt * (Psi + delta * dPsi_dd) + d2Delta_ddt * delta * Psi);
441  }
442 
443  return d2phirddt;
444 }
445 
446 Real
448 {
449  // Check that the input parameters are within the region of validity
450  if (temperature < 216.0 || temperature > 1100.0 || density <= 0.0)
451  throw MooseException("Parameters out of range in " + name() + ": pressure()");
452 
453  Real pressure = 0.0;
454 
456  {
457  Real gas_density = saturatedVaporDensity(temperature);
458  Real liquid_density = saturatedLiquidDensity(temperature);
459 
460  if (density < gas_density || density > liquid_density)
462  else
464  }
465  else
467 
468  return pressure;
469 }
470 
471 Real
473 {
474  // Check that the input parameters are within the region of validity
475  if (temperature < 216.0 || temperature > 1100.0 || pressure <= 0.0)
476  throw MooseException("Parameters out of range in " + name() + ": rho_from_p_T()");
477 
478  // Also check that the pressure and temperature are not in the solid phase region
481  throw MooseException("Input pressure and temperature in " + name() +
482  ": rho_from_p_T() correspond to solid CO2 phase");
483 
484  Real density;
485  // Initial estimate of a bracketing interval for the density
486  Real lower_density = 100.0;
487  Real upper_density = 1000.0;
488 
489  // The density is found by finding the zero of the pressure calculated using the
490  // Span and Wagner EOS minus the input pressure
491  auto pressure_diff = [&pressure, &temperature, this](Real x) {
492  return p_from_rho_T(x, temperature) - pressure;
493  };
494 
495  BrentsMethod::bracket(pressure_diff, lower_density, upper_density);
496  density = BrentsMethod::root(pressure_diff, lower_density, upper_density);
497 
498  return density;
499 }
500 
501 void
503  Real pressure, Real temperature, Real & rho, Real & drho_dp, Real & drho_dT) const
504 {
506 }
507 
508 Real
510 {
512  return mu_from_rho_T(rho, temperature);
513 }
514 
515 void
517  Real pressure, Real temperature, Real & mu, Real & dmu_dp, Real & dmu_dT) const
518 {
519  Real rho, drho_dp, drho_dT;
521 
522  Real dmu_drho;
523  mu_from_rho_T(rho, temperature, drho_dT, mu, dmu_drho, dmu_dT);
524  dmu_dp = dmu_drho * drho_dp;
525 }
526 
527 Real
529 {
530  // Check that the input parameters are within the region of validity
531  if (temperature < 216.0 || temperature > 1000.0 || density > 1400.0)
532  throw MooseException("Parameters out of range in " + name() + ": mu_from_rho_T()");
533 
534  Real Tstar = temperature / 251.196;
535 
536  // Viscosity in the zero-density limit
537  Real sum = 0.0;
538 
539  for (std::size_t i = 0; i < _mu_a.size(); ++i)
540  sum += _mu_a[i] * MathUtils::pow(std::log(Tstar), i);
541 
542  Real mu0 = 1.00697 * std::sqrt(temperature) / std::exp(sum);
543 
544  // Excess viscosity due to finite density
545  Real mue = _mu_d[0] * density + _mu_d[1] * Utility::pow<2>(density) +
546  _mu_d[2] * Utility::pow<6>(density) / Utility::pow<3>(Tstar) +
547  _mu_d[3] * Utility::pow<8>(density) + _mu_d[4] * Utility::pow<8>(density) / Tstar;
548 
549  return (mu0 + mue) * 1.0e-6; // convert to Pa.s
550 }
551 
552 void
554  Real temperature,
555  Real ddensity_dT,
556  Real & mu,
557  Real & dmu_drho,
558  Real & dmu_dT) const
559 {
560  // Check that the input parameters are within the region of validity
561  if (temperature < 216.0 || temperature > 1000.0 || density > 1400.0)
562  throw MooseException("Parameters out of range in " + name() + ": mu_drhoT()");
563 
564  Real Tstar = temperature / 251.196;
565  Real dTstar_dT = 1.0 / 251.196;
566 
567  // Viscosity in the zero-density limit. Note this is only a function of T.
568  // Start the sum at i = 1 so the derivative is defined
569  Real sum0 = _mu_a[0], dsum0_dTstar = 0.0;
570 
571  for (std::size_t i = 1; i < _mu_a.size(); ++i)
572  {
573  sum0 += _mu_a[i] * MathUtils::pow(std::log(Tstar), i);
574  dsum0_dTstar += i * _mu_a[i] * MathUtils::pow(std::log(Tstar), i - 1) / Tstar;
575  }
576 
577  Real mu0 = 1.00697 * std::sqrt(temperature) / std::exp(sum0);
578  Real dmu0_dT = (0.5 * 1.00697 / std::sqrt(temperature) -
579  1.00697 * std::sqrt(temperature) * dsum0_dTstar * dTstar_dT) /
580  std::exp(sum0);
581 
582  // Excess viscosity due to finite density
583  Real mue = _mu_d[0] * density + _mu_d[1] * Utility::pow<2>(density) +
584  _mu_d[2] * Utility::pow<6>(density) / Utility::pow<3>(Tstar) +
585  _mu_d[3] * Utility::pow<8>(density) + _mu_d[4] * Utility::pow<8>(density) / Tstar;
586 
587  Real dmue_drho = _mu_d[0] + 2.0 * _mu_d[1] * density +
588  6.0 * _mu_d[2] * Utility::pow<5>(density) / Utility::pow<3>(Tstar) +
589  8.0 * _mu_d[3] * Utility::pow<7>(density) +
590  8.0 * _mu_d[4] * Utility::pow<7>(density) / Tstar;
591 
592  Real dmue_dT = (-3.0 * _mu_d[2] * Utility::pow<6>(density) / Utility::pow<4>(Tstar) -
593  _mu_d[4] * Utility::pow<8>(density) / Tstar / Tstar) *
594  dTstar_dT;
595 
596  // Viscosity in Pa.s is
597  mu = (mu0 + mue) * 1.0e-6;
598  dmu_drho = dmue_drho * 1.0e-6;
599  dmu_dT = (dmu0_dT + dmue_dT) * 1.0e-6 + dmu_drho * ddensity_dT;
600 }
601 
602 void
603 CO2FluidProperties::rho_mu_from_p_T(Real pressure, Real temperature, Real & rho, Real & mu) const
604 {
607 }
608 
609 void
611  Real temperature,
612  Real & rho,
613  Real & drho_dp,
614  Real & drho_dT,
615  Real & mu,
616  Real & dmu_dp,
617  Real & dmu_dT) const
618 {
619  rho_from_p_T(pressure, temperature, rho, drho_dp, drho_dT);
620  Real dmu_drho;
621  mu_from_rho_T(rho, temperature, drho_dT, mu, dmu_drho, dmu_dT);
622  dmu_dp = dmu_drho * drho_dp;
623 }
624 
625 Real
627 {
628  // This correlation uses temperature in C
629  Real Tc = temperature - _T_c2k;
630  // The parial volume
631  Real V = 37.51 - 9.585e-2 * Tc + 8.74e-4 * Tc * Tc - 5.044e-7 * Tc * Tc * Tc;
632 
633  return 1.0e6 * _Mco2 / V;
634 }
635 
636 std::vector<Real>
638 {
639  return {-8.55445, 4.01195, 9.52345};
640 }
641 
642 Real
644 {
645  // Require density first
648 }
649 
650 void
652  Real pressure, Real temperature, Real & k, Real & dk_dp, Real & dk_dT) const
653 {
654  k = this->k_from_p_T(pressure, temperature);
655  // Calculate derivatives using finite differences. Note: this will be slow as
656  // multiple calculations of density are required
657  const Real eps = 1.0e-6;
658  const Real peps = pressure * eps;
659  const Real Teps = temperature * eps;
660 
661  dk_dp = (this->k_from_p_T(pressure + peps, temperature) - k) / peps;
662  dk_dT = (this->k_from_p_T(pressure, temperature + Teps) - k) / Teps;
663 }
664 
665 Real
667 {
668  // Check the temperature is in the range of validity (216.592 K <= T <= 1000 K)
669  if (temperature <= _triple_point_temperature || temperature >= 1000.0)
670  throw MooseException("Temperature " + Moose::stringify(temperature) +
671  "K out of range (200K, 1000K) in " + name() + ": k()");
672 
673  // Scaled variables
675  Real rhor = density / _critical_density;
676 
677  Real sum1 = 0.0;
678  for (std::size_t i = 0; i < _k_n1.size(); ++i)
679  sum1 += _k_n1[i] * std::pow(Tr, _k_g1[i]) * MathUtils::pow(rhor, _k_h1[i]);
680 
681  Real sum2 = 0.0;
682  for (std::size_t i = 0; i < _k_n2.size(); ++i)
683  sum2 += _k_n2[i] * std::pow(Tr, _k_g2[i]) * MathUtils::pow(rhor, _k_h2[i]);
684 
685  // Near-critical enhancement
686  Real alpha =
687  1.0 - _k_a[9] * std::acosh(1.0 + _k_a[10] * std::pow(Utility::pow<2>(1.0 - Tr), _k_a[11]));
688  Real lambdac =
689  rhor *
690  std::exp(-std::pow(rhor, _k_a[0]) / _k_a[0] - Utility::pow<2>(_k_a[1] * (Tr - 1.0)) -
691  Utility::pow<2>(_k_a[2] * (rhor - 1.0))) /
692  std::pow(std::pow(Utility::pow<2>(
693  1.0 - 1.0 / Tr +
694  _k_a[3] * std::pow(Utility::pow<2>(rhor - 1.0), 1.0 / (2.0 * _k_a[4]))),
695  _k_a[5]) +
696  std::pow(Utility::pow<2>(_k_a[6] * (rhor - alpha)), _k_a[7]),
697  _k_a[8]);
698 
699  return 4.81384 * (sum1 + std::exp(-5.0 * rhor * rhor) * sum2 + 0.775547504 * lambdac) / 1000.0;
700 }
CO2FluidProperties::_D4
const std::array< Real, 3 > _D4
Definition: CO2FluidProperties.h:238
CO2FluidProperties::henryCoefficients
virtual std::vector< Real > henryCoefficients() const override
Henry's law coefficients for dissolution in water.
Definition: CO2FluidProperties.C:637
CO2FluidProperties::_B4
const std::array< Real, 3 > _B4
Definition: CO2FluidProperties.h:236
CO2FluidProperties::_k_n1
const std::array< Real, 3 > _k_n1
Definition: CO2FluidProperties.h:250
CO2FluidProperties::molarMass
virtual Real molarMass() const override
Fluid name.
Definition: CO2FluidProperties.C:42
HelmholtzFluidProperties::rho_from_p_T
virtual Real rho_from_p_T(Real pressure, Real temperature) const override
Definition: HelmholtzFluidProperties.C:29
CO2FluidProperties::_n3
const std::array< Real, 5 > _n3
Definition: CO2FluidProperties.h:223
CO2FluidProperties::rho_from_p_T
virtual Real rho_from_p_T(Real pressure, Real temperature) const override
Definition: CO2FluidProperties.C:472
CO2FluidProperties::dalpha_ddelta
virtual Real dalpha_ddelta(Real delta, Real tau) const override
Derivative of Helmholtz free energy wrt delta.
Definition: CO2FluidProperties.C:199
CO2FluidProperties::_n1
const std::array< Real, 7 > _n1
Coefficients for the residual component of the Helmholtz free energy.
Definition: CO2FluidProperties.h:199
CO2FluidProperties::_C4
const std::array< Real, 3 > _C4
Definition: CO2FluidProperties.h:237
CO2FluidProperties::_k_g2
const std::array< Real, 7 > _k_g2
Definition: CO2FluidProperties.h:247
CO2FluidProperties::_n4
const std::array< Real, 3 > _n4
Definition: CO2FluidProperties.h:231
HelmholtzFluidProperties::p_from_rho_T
virtual Real p_from_rho_T(Real rho, Real T) const
Pressure as a function of density and temperature.
Definition: HelmholtzFluidProperties.C:222
CO2FluidProperties::~CO2FluidProperties
virtual ~CO2FluidProperties()
Definition: CO2FluidProperties.C:33
CO2FluidProperties::fluidName
virtual std::string fluidName() const override
Definition: CO2FluidProperties.C:36
pow
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
Definition: ExpressionBuilder.h:673
CO2FluidProperties::_gamma3
const std::array< Real, 5 > _gamma3
Definition: CO2FluidProperties.h:229
CO2FluidProperties::_k_a
const std::array< Real, 12 > _k_a
Definition: CO2FluidProperties.h:253
CO2FluidProperties::_mu_d
const std::array< Real, 5 > _mu_d
Definition: CO2FluidProperties.h:242
CO2FluidProperties::criticalPressure
virtual Real criticalPressure() const override
Critical pressure.
Definition: CO2FluidProperties.C:48
CO2FluidProperties::_beta4
const std::array< Real, 3 > _beta4
Definition: CO2FluidProperties.h:234
CO2FluidProperties::dalpha_dtau
virtual Real dalpha_dtau(Real delta, Real tau) const override
Derivative of Helmholtz free energy wrt tau.
Definition: CO2FluidProperties.C:242
CO2FluidProperties::_critical_temperature
const Real _critical_temperature
Critical temperature (K)
Definition: CO2FluidProperties.h:184
validParams< HelmholtzFluidProperties >
InputParameters validParams< HelmholtzFluidProperties >()
Definition: HelmholtzFluidProperties.C:16
CO2FluidProperties::_theta0
const std::array< Real, 5 > _theta0
Definition: CO2FluidProperties.h:196
CO2FluidProperties::criticalDensity
virtual Real criticalDensity() const override
Critical density.
Definition: CO2FluidProperties.C:60
CO2FluidProperties::mu_from_p_T
virtual Real mu_from_p_T(Real pressure, Real temperature) const override
Definition: CO2FluidProperties.C:509
BrentsMethod::root
Real root(std::function< Real(Real)> const &f, Real x1, Real x2, Real tol=1.0e-12)
Finds the root of a function using Brent's method.
Definition: BrentsMethod.C:61
CO2FluidProperties::_k_n2
const std::array< Real, 7 > _k_n2
Definition: CO2FluidProperties.h:251
CO2FluidProperties::_alpha3
const std::array< Real, 5 > _alpha3
Definition: CO2FluidProperties.h:227
CO2FluidProperties::partialDensity
Real partialDensity(Real temperature) const
Partial density of dissolved CO2 From Garcia, Density of aqueous solutions of CO2,...
Definition: CO2FluidProperties.C:626
CO2FluidProperties::rho_mu_from_p_T
virtual void rho_mu_from_p_T(Real pressure, Real temperature, Real &rho, Real &mu) const override
Combined methods.
Definition: CO2FluidProperties.C:603
CO2FluidProperties::_k_g1
const std::array< Real, 3 > _k_g1
Coefficients for the thermal conductivity.
Definition: CO2FluidProperties.h:246
CO2FluidProperties::saturatedVaporDensity
Real saturatedVaporDensity(Real temperature) const
Saturated vapor density of CO2 Valid for temperatures between the triple point temperature and critic...
Definition: CO2FluidProperties.C:146
CO2FluidProperties::d2alpha_dtau2
virtual Real d2alpha_dtau2(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt tau.
Definition: CO2FluidProperties.C:349
CO2FluidProperties::_a0
const std::array< Real, 5 > _a0
Coefficients for the ideal gas component of the Helmholtz free energy.
Definition: CO2FluidProperties.h:195
CO2FluidProperties
CO2 fluid properties Most thermophysical properties taken from: Span and Wagner, "A New Equation of S...
Definition: CO2FluidProperties.h:45
CO2FluidProperties::_b4
const std::array< Real, 3 > _b4
Definition: CO2FluidProperties.h:233
CO2FluidProperties::_Mco2
const Real _Mco2
Molar mass of CO2 (kg/mol)
Definition: CO2FluidProperties.h:180
CO2FluidProperties::criticalTemperature
virtual Real criticalTemperature() const override
Critical temperature.
Definition: CO2FluidProperties.C:54
CO2FluidProperties::_d1
const std::array< unsigned int, 7 > _d1
Definition: CO2FluidProperties.h:206
FluidProperties::_T_c2k
const Real _T_c2k
Conversion of temperature from Celsius to Kelvin.
Definition: FluidProperties.h:46
CO2FluidProperties::d2alpha_ddelta2
virtual Real d2alpha_ddelta2(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt delta.
Definition: CO2FluidProperties.C:283
CO2FluidProperties::triplePointPressure
virtual Real triplePointPressure() const override
Triple point pressure.
Definition: CO2FluidProperties.C:66
CO2FluidProperties::_A4
const std::array< Real, 3 > _A4
Definition: CO2FluidProperties.h:235
CO2FluidProperties::_a4
const std::array< Real, 3 > _a4
Definition: CO2FluidProperties.h:232
CO2FluidProperties::_c2
const std::array< unsigned int, 27 > _c2
Definition: CO2FluidProperties.h:221
NS::density
const std::string density
Definition: NS.h:16
CO2FluidProperties::_d3
const std::array< unsigned int, 5 > _d3
Definition: CO2FluidProperties.h:225
CO2FluidProperties::_triple_point_temperature
const Real _triple_point_temperature
Triple point temperature (K)
Definition: CO2FluidProperties.h:190
CO2FluidProperties::d2alpha_ddeltatau
virtual Real d2alpha_ddeltatau(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt delta and tau.
Definition: CO2FluidProperties.C:398
CO2FluidProperties::vaporPressure
virtual Real vaporPressure(Real temperature) const override
Vapor pressure.
Definition: CO2FluidProperties.C:108
CO2FluidProperties::sublimationPressure
Real sublimationPressure(Real temperature) const
Sublimation pressure.
Definition: CO2FluidProperties.C:91
SinglePhaseFluidProperties::rho
e e e e p h T rho
Definition: SinglePhaseFluidProperties.h:169
name
const std::string name
Definition: Setup.h:21
CO2FluidProperties::_beta3
const std::array< Real, 5 > _beta3
Definition: CO2FluidProperties.h:228
CO2FluidProperties::meltingPressure
Real meltingPressure(Real temperature) const
Melting pressure.
Definition: CO2FluidProperties.C:78
CO2FluidProperties::k_from_rho_T
virtual Real k_from_rho_T(Real density, Real temperature) const override
Definition: CO2FluidProperties.C:666
validParams< CO2FluidProperties >
InputParameters validParams< CO2FluidProperties >()
Definition: CO2FluidProperties.C:20
CO2FluidProperties::_critical_pressure
const Real _critical_pressure
Critical pressure (Pa)
Definition: CO2FluidProperties.h:182
HelmholtzFluidProperties
Base class equation of state for fluids that use a Helmholtz free energy alpha(delta,...
Definition: HelmholtzFluidProperties.h:34
CO2FluidProperties::mu_from_rho_T
virtual Real mu_from_rho_T(Real density, Real temperature) const override
Definition: CO2FluidProperties.C:528
CO2FluidProperties::_critical_density
const Real _critical_density
Critical density (kg/m^3)
Definition: CO2FluidProperties.h:186
CO2FluidProperties::_triple_point_pressure
const Real _triple_point_pressure
Triple point pressure (Pa)
Definition: CO2FluidProperties.h:188
CO2FluidProperties::_d2
const std::array< unsigned int, 27 > _d2
Definition: CO2FluidProperties.h:216
registerMooseObject
registerMooseObject("FluidPropertiesApp", CO2FluidProperties)
BrentsMethod.h
CO2FluidProperties::_n2
const std::array< Real, 27 > _n2
Definition: CO2FluidProperties.h:208
NS::temperature
const std::string temperature
Definition: NS.h:26
CO2FluidProperties::alpha
virtual Real alpha(Real delta, Real tau) const override
Helmholtz free energy.
Definition: CO2FluidProperties.C:162
CO2FluidProperties::_eps3
const std::array< Real, 5 > _eps3
Definition: CO2FluidProperties.h:230
CO2FluidProperties::_mu_a
const std::array< Real, 5 > _mu_a
Coefficients for viscosity.
Definition: CO2FluidProperties.h:241
CO2FluidProperties::_t1
const std::array< Real, 7 > _t1
Definition: CO2FluidProperties.h:207
CO2FluidProperties::k_from_p_T
virtual Real k_from_p_T(Real pressure, Real temperature) const override
Definition: CO2FluidProperties.C:643
CO2FluidProperties::triplePointTemperature
virtual Real triplePointTemperature() const override
Triple point temperature.
Definition: CO2FluidProperties.C:72
CO2FluidProperties::_k_h2
const std::array< unsigned int, 7 > _k_h2
Definition: CO2FluidProperties.h:249
CO2FluidProperties::saturatedLiquidDensity
Real saturatedLiquidDensity(Real temperature) const
Saturated liquid density of CO2 Valid for temperatures between the triple point temperature and criti...
Definition: CO2FluidProperties.C:130
CO2FluidProperties::_t3
const std::array< unsigned int, 5 > _t3
Definition: CO2FluidProperties.h:226
CO2FluidProperties::_k_h1
const std::array< unsigned int, 3 > _k_h1
Definition: CO2FluidProperties.h:248
CO2FluidProperties::CO2FluidProperties
CO2FluidProperties(const InputParameters &parameters)
Definition: CO2FluidProperties.C:28
CO2FluidProperties::_t2
const std::array< Real, 27 > _t2
Definition: CO2FluidProperties.h:218
BrentsMethod::bracket
void bracket(std::function< Real(Real)> const &f, Real &x1, Real &x2)
Function to bracket a root of a given function.
Definition: BrentsMethod.C:17
CO2FluidProperties::p_from_rho_T
virtual Real p_from_rho_T(Real density, Real temperature) const override
Pressure as a function of density and temperature.
Definition: CO2FluidProperties.C:447
CO2FluidProperties.h
NS::pressure
const std::string pressure
Definition: NS.h:25