12 #include "Conversion.h"
13 #include "MathUtils.h"
14 #include "libmesh/utility.h"
23 params.addClassDescription(
24 "Fluid properties for carbon dioxide (CO2) using the Span & Wagner EOS");
81 throw MooseException(
"Temperature is below the triple point temperature in " +
name() +
82 ": meltingPressure()");
87 (1.0 + 1955.539 * (Tstar - 1.0) + 2055.4593 * Utility::pow<2>(Tstar - 1.0));
94 throw MooseException(
"Temperature is above the triple point temperature in " +
name() +
95 ": sublimationPressure()");
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)) /
111 throw MooseException(
"Temperature is out of range in " +
name() +
": vaporPressure()");
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)) /
126 mooseError(
name(),
": vaporPressure() is not implemented");
133 throw MooseException(
"Temperature is out of range in " +
name() +
": saturatedLiquiDensity()");
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);
149 throw MooseException(
"Temperature is out of range in " +
name() +
": saturatedVaporDensity()");
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));
166 for (std::size_t i = 0; i <
_a0.size(); ++i)
167 sum0 +=
_a0[i] * std::log(1.0 - std::exp(-
_theta0[i] * tau));
169 Real phi0 = std::log(delta) + 8.37304456 - 3.70454304 * tau + 2.5 * std::log(tau) + sum0;
172 Real theta, Delta, Psi;
174 for (std::size_t i = 0; i <
_n1.size(); ++i)
177 for (std::size_t i = 0; i <
_n2.size(); ++i)
181 for (std::size_t i = 0; i <
_n3.size(); ++i)
183 std::exp(-
_alpha3[i] * Utility::pow<2>(delta -
_eps3[i]) -
186 for (std::size_t i = 0; i <
_n4.size(); ++i)
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));
202 Real dphi0dd = 1.0 / delta;
205 Real theta, Delta, Psi, dDelta_dd, dPsi_dd;
208 for (std::size_t i = 0; i <
_n1.size(); ++i)
211 for (std::size_t i = 0; i <
_n2.size(); ++i)
216 for (std::size_t i = 0; i <
_n3.size(); ++i)
218 std::exp(-
_alpha3[i] * Utility::pow<2>(delta -
_eps3[i]) -
222 for (std::size_t i = 0; i <
_n4.size(); ++i)
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) *
230 std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 *
_beta4[i]) - 1.0) +
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);
238 return dphi0dd + dphirdd;
246 for (std::size_t i = 0; i <
_a0.size(); ++i)
249 Real dphi0dt = -3.70454304 + 2.5 / tau + sum0;
252 Real theta, Delta, Psi, dDelta_dt, dPsi_dt;
254 for (std::size_t i = 0; i <
_n1.size(); ++i)
257 for (std::size_t i = 0; i <
_n2.size(); ++i)
261 for (std::size_t i = 0; i <
_n3.size(); ++i)
263 std::exp(-
_alpha3[i] * Utility::pow<2>(delta -
_eps3[i]) -
267 for (std::size_t i = 0; i <
_n4.size(); ++i)
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;
275 dphirdt +=
_n4[i] * delta * (Psi * dDelta_dt +
std::pow(Delta,
_b4[i]) * dPsi_dt);
279 return dphi0dt + dphirdt;
286 Real d2phi0dd2 = -1.0 / delta / delta;
289 Real d2phirdd2 = 0.0;
290 Real theta, Delta, Psi, dDelta_dd, dPsi_dd, d2Delta_dd2, d2Psi_dd2;
292 for (std::size_t i = 0; i <
_n1.size(); ++i)
296 for (std::size_t i = 0; i <
_n2.size(); ++i)
303 for (std::size_t i = 0; i <
_n3.size(); ++i)
306 std::exp(-
_alpha3[i] * Utility::pow<2>(delta -
_eps3[i]) -
310 Utility::pow<2>(delta -
_eps3[i]) -
314 for (std::size_t i = 0; i <
_n4.size(); ++i)
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) *
322 std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 *
_beta4[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) +
330 Utility::pow<2>(
std::pow(Utility::pow<2>(delta - 1.0),
331 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));
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) +
341 (
_b4[i] - 1.0) *
std::pow(Delta,
_b4[i] - 2.0) * Utility::pow<2>(dDelta_dd)) *
345 return d2phi0dd2 + d2phirdd2;
353 for (std::size_t i = 0; i <
_a0.size(); ++i)
355 Utility::pow<2>(1.0 - std::exp(-
_theta0[i] * tau));
357 Real d2phi0dt2 = -2.5 / tau / tau - sum0;
360 Real d2phirdt2 = 0.0;
361 Real theta, Delta, Psi, dPsi_dt, dDelta_dt, d2Delta_dt2, d2Psi_dt2;
363 for (std::size_t i = 0; i <
_n1.size(); ++i)
367 for (std::size_t i = 0; i <
_n2.size(); ++i)
371 for (std::size_t i = 0; i <
_n3.size(); ++i)
373 std::exp(-
_alpha3[i] * Utility::pow<2>(delta -
_eps3[i]) -
378 for (std::size_t i = 0; i <
_n4.size(); ++i)
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);
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;
390 (Psi * d2Delta_dt2 + 2.0 * dDelta_dt * dPsi_dt +
std::pow(Delta,
_b4[i]) * d2Psi_dt2);
394 return d2phi0dt2 + d2phirdt2;
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)
408 for (std::size_t i = 0; i <
_n2.size(); ++i)
413 for (std::size_t i = 0; i <
_n3.size(); ++i)
415 std::exp(-
_alpha3[i] * Utility::pow<2>(delta -
_eps3[i]) -
420 for (std::size_t i = 0; i <
_n4.size(); ++i)
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) *
430 std::pow(Utility::pow<2>(delta - 1.0), 1.0 / (2.0 *
_beta4[i]) - 1.0) +
432 dDelta_dt = -2.0 * theta *
_b4[i] *
std::pow(Delta,
_b4[i] - 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;
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);
450 if (temperature < 216.0 || temperature > 1100.0 ||
density <= 0.0)
451 throw MooseException(
"Parameters out of range in " +
name() +
": pressure()");
460 if (density < gas_density || density > liquid_density)
475 if (temperature < 216.0 || temperature > 1100.0 ||
pressure <= 0.0)
476 throw MooseException(
"Parameters out of range in " +
name() +
": rho_from_p_T()");
481 throw MooseException(
"Input pressure and temperature in " +
name() +
482 ": rho_from_p_T() correspond to solid CO2 phase");
486 Real lower_density = 100.0;
487 Real upper_density = 1000.0;
519 Real
rho, drho_dp, drho_dT;
524 dmu_dp = dmu_drho * drho_dp;
531 if (temperature < 216.0 || temperature > 1000.0 ||
density > 1400.0)
532 throw MooseException(
"Parameters out of range in " +
name() +
": mu_from_rho_T()");
539 for (std::size_t i = 0; i <
_mu_a.size(); ++i)
542 Real mu0 = 1.00697 * std::sqrt(
temperature) / std::exp(sum);
546 _mu_d[2] * Utility::pow<6>(
density) / Utility::pow<3>(Tstar) +
549 return (mu0 + mue) * 1.0e-6;
561 if (temperature < 216.0 || temperature > 1000.0 ||
density > 1400.0)
562 throw MooseException(
"Parameters out of range in " +
name() +
": mu_drhoT()");
565 Real dTstar_dT = 1.0 / 251.196;
569 Real sum0 =
_mu_a[0], dsum0_dTstar = 0.0;
571 for (std::size_t i = 1; i <
_mu_a.size(); ++i)
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) /
584 _mu_d[2] * Utility::pow<6>(
density) / Utility::pow<3>(Tstar) +
588 6.0 *
_mu_d[2] * Utility::pow<5>(
density) / Utility::pow<3>(Tstar) +
592 Real dmue_dT = (-3.0 *
_mu_d[2] * Utility::pow<6>(
density) / Utility::pow<4>(Tstar) -
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;
622 dmu_dp = dmu_drho * drho_dp;
631 Real V = 37.51 - 9.585e-2 * Tc + 8.74e-4 * Tc * Tc - 5.044e-7 * Tc * Tc * Tc;
633 return 1.0e6 *
_Mco2 / V;
639 return {-8.55445, 4.01195, 9.52345};
657 const Real eps = 1.0e-6;
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()");
678 for (std::size_t i = 0; i <
_k_n1.size(); ++i)
682 for (std::size_t i = 0; i <
_k_n2.size(); ++i)
691 Utility::pow<2>(
_k_a[2] * (rhor - 1.0))) /
699 return 4.81384 * (sum1 + std::exp(-5.0 * rhor * rhor) * sum2 + 0.775547504 * lambdac) / 1000.0;