13#include "libmesh/utility.h"
28 _p_critical(1.2964e6),
30 _rho_molar_critical(15.508),
31 _rho_critical(1000.0 * _rho_molar_critical * _Mh2),
83 const Real Tstar = temperature / 30.41;
84 const Real logTstar = std::log(Tstar);
86 const Real rhor = density / 90.5;
90 for (std::size_t i = 0; i <
_amu.size(); ++i)
94 0.021357 * std::sqrt(1000.0 *
_Mh2 * temperature) / (0.297 * 0.297 * std::exp(sum));
98 for (std::size_t i = 0; i <
_bmu.size(); ++i)
105 mu0 + mu1 * density +
106 _cmu[0] * rhor * rhor *
107 std::exp(
_cmu[1] * Tr +
_cmu[2] / Tr +
_cmu[3] * rhor * rhor / (
_cmu[4] + Tr) +
122 const Real Tstar = temperature / 30.41;
123 const Real logTstar = std::log(Tstar);
125 const Real rhor = density / 90.5;
126 const Real drhor_drho = 1.0 / 90.5;
130 Real sum = 0.0, dsum_dT = 0.0;
131 for (std::size_t i = 0; i <
_amu.size(); ++i)
139 0.021357 * std::sqrt(1000.0 *
_Mh2 * temperature) / (0.297 * 0.297 * std::exp(sum));
140 const Real dmu0_dT = 21.357 *
_Mh2 * (1.0 - 2.0 * temperature * dsum_dT) * std::exp(-sum) /
141 (2.0 * std::sqrt(1000.0 *
_Mh2 * temperature) * 0.297 * 0.297);
145 for (std::size_t i = 0; i <
_bmu.size(); ++i)
150 MathUtils::pow(0.297, 3) * sumr * (dmu0_dT / Tstar - mu0 / (30.41 * Tstar * Tstar));
153 const Real exponent =
_cmu[1] * Tr +
_cmu[2] / Tr +
_cmu[3] * rhor * rhor / (
_cmu[4] + Tr) +
155 const Real dexponent_drho =
158 const Real dexponent_dT =
162 mu = (mu0 + mu1 * density +
_cmu[0] * rhor * rhor * std::exp(exponent)) * 1.0e-6;
164 (mu1 +
_cmu[0] * rhor * std::exp(exponent) * (2.0 * drhor_drho + rhor * dexponent_drho)) *
167 (dmu0_dT + density * dmu1_dT +
_cmu[0] * rhor * rhor * dexponent_dT * std::exp(exponent)) *
169 dmu_drho * ddensity_dT;
176 const Real density =
rho_from_p_T(pressure, temperature);
182 Real pressure, Real temperature, Real &
mu, Real & dmu_dp, Real & dmu_dT)
const
184 Real
rho, drho_dp, drho_dT;
189 dmu_dp = dmu_drho * drho_dp;
215 dmu_dp = dmu_drho * drho_dp;
222 const Real Tr = temperature / 33.145;
223 const Real rhor = density / 31.262;
227 for (std::size_t i = 0; i <
_a1k.size(); ++i)
231 for (std::size_t i = 0; i <
_a2k.size(); ++i)
234 const Real lambda0 = sum1 / sum2;
238 for (std::size_t i = 0; i <
_b1k.size(); ++i)
242 const Real lambdac = 6.24e-4 / (-2.58e-7 + std::abs(Tr - 1.0)) *
246 return lambda0 + lambdah + lambdac;
253 const Real density =
rho_from_p_T(pressure, temperature);
259 Real pressure, Real temperature, Real & k, Real & dk_dp, Real & dk_dT)
const
263 const Real
eps = 1.0e-6;
264 const Real peps = pressure *
eps;
265 const Real Teps = temperature *
eps;
267 dk_dp = (this->
k_from_p_T(pressure + peps, temperature) - k) / peps;
268 dk_dT = (this->
k_from_p_T(pressure, temperature + Teps) - k) / Teps;
274 return {-4.73284, 6.08954, 6.06066};
280 if (temperature < _T_triple || temperature >
_T_critical)
281 throw MooseException(
"Temperature is out of range in " +
name() +
": vaporPressure()");
284 const Real theta = 1.0 - Tr;
286 const Real logpressure = (-4.89789 * theta + 0.988588 * std::pow(theta, 1.5) +
287 0.349689 * Utility::pow<2>(theta) + 0.499356 * std::pow(theta, 2.85)) /
296 mooseError(
"vaporPressure() is not implemented");
303 Real alpha0 = std::log(delta) + 1.5 * std::log(tau) - 1.4579856475 + 1.888076782 * tau;
305 for (std::size_t i = 0; i <
_a.size(); ++i)
306 alpha0 +=
_a[i] * std::log(1.0 - std::exp(
_b[i] * tau));
311 for (std::size_t i = 0; i <
_t1.size(); ++i)
314 for (std::size_t i = 0; i <
_t2.size(); ++i)
317 for (std::size_t i = 0; i <
_t3.size(); ++i)
319 std::exp(
_phi3[i] * Utility::pow<2>(delta -
_D3[i]) +
323 return alpha0 + alphar;
330 Real dalpha0 = 1.0 / delta;
335 for (std::size_t i = 0; i <
_t1.size(); ++i)
338 for (std::size_t i = 0; i <
_t2.size(); ++i)
342 for (std::size_t i = 0; i <
_t3.size(); ++i)
344 std::exp(
_phi3[i] * Utility::pow<2>(delta -
_D3[i]) +
346 (
_d3[i] + delta * (2.0 *
_phi3[i] * (delta -
_D3[i])));
349 return dalpha0 + dalphar / delta;
356 Real dalpha0 = 1.5 / tau + 1.888076782;
358 for (std::size_t i = 0; i <
_a.size(); ++i)
359 dalpha0 +=
_a[i] *
_b[i] * (1.0 - 1.0 / (1.0 - std::exp(
_b[i] * tau)));
364 for (std::size_t i = 0; i <
_t1.size(); ++i)
367 for (std::size_t i = 0; i <
_t2.size(); ++i)
371 for (std::size_t i = 0; i <
_t3.size(); ++i)
373 std::exp(
_phi3[i] * Utility::pow<2>(delta -
_D3[i]) +
378 return dalpha0 + dalphar / tau;
385 Real dalpha0 = -1.0 / delta / delta;
390 for (std::size_t i = 0; i <
_t1.size(); ++i)
394 for (std::size_t i = 0; i <
_t2.size(); ++i)
396 (delta * delta - 2.0 *
_d2[i] * delta +
_d2[i] * (
_d2[i] - 1.0));
398 for (std::size_t i = 0; i <
_t3.size(); ++i)
400 std::exp(
_phi3[i] * Utility::pow<2>(delta -
_D3[i]) +
403 2.0 * delta * delta *
_phi3[i] *
404 (1.0 + 2.0 *
_phi3[i] * (
_D3[i] - delta) * (
_D3[i] - delta)) +
405 _d3[i] * (4.0 * delta *
_phi3[i] * (delta -
_D3[i]) - 1.0));
408 return dalpha0 + dalphar / delta / delta;
415 Real dalpha0 = -1.5 / tau / tau;
417 for (std::size_t i = 0; i <
_a.size(); ++i)
419 Real exptau = std::exp(
_b[i] * tau);
420 dalpha0 -=
_a[i] * (
_b[i] *
_b[i] * exptau / (1.0 - exptau) * (exptau / (1.0 - exptau) + 1.0));
426 for (std::size_t i = 0; i <
_t1.size(); ++i)
430 for (std::size_t i = 0; i <
_t2.size(); ++i)
432 std::pow(tau,
_t2[i]) * std::exp(-delta);
434 for (std::size_t i = 0; i <
_t3.size(); ++i)
436 std::exp(
_phi3[i] * Utility::pow<2>(delta -
_D3[i]) +
439 2.0 *
_beta3[i] * tau * tau);
442 return dalpha0 + dalphar / tau / tau;
451 for (std::size_t i = 0; i <
_t1.size(); ++i)
452 dalphar +=
_N1[i] *
_d1[i] *
_t1[i] * std::pow(delta,
_d1[i]) * std::pow(tau,
_t1[i]);
454 for (std::size_t i = 0; i <
_t2.size(); ++i)
455 dalphar +=
_N2[i] *
_t2[i] * std::pow(delta,
_d2[i]) * std::pow(tau,
_t2[i]) *
456 std::exp(-delta) * (
_d2[i] - delta);
458 for (std::size_t i = 0; i <
_t3.size(); ++i)
459 dalphar +=
_N3[i] * std::pow(delta,
_d3[i]) * std::pow(tau,
_t3[i]) *
460 std::exp(
_phi3[i] * Utility::pow<2>(delta -
_D3[i]) +
462 (
_d3[i] + delta * (2.0 *
_phi3[i] * (delta -
_D3[i]))) *
466 return dalphar / delta / tau;
registerMooseObject("FluidPropertiesApp", HydrogenFluidProperties)
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
Hydrogen (H2) fluid properties as a function of pressure (Pa) and temperature (K).
const std::array< Real, 5 > _a
Coefficients for ideal gas component of the Helmholtz free energy.
const std::array< Real, 2 > _N2
const std::array< Real, 4 > _a2k
const Real _Mh2
Hydrogen molar mass (kg/mol)
virtual Real molarMass() const override
Molar mass [kg/mol].
const std::array< Real, 5 > _D3
const std::array< Real, 5 > _b2k
virtual Real criticalPressure() const override
Critical pressure.
virtual Real criticalTemperature() const override
Critical temperature.
virtual Real criticalDensity() const override
Critical density.
const std::array< Real, 6 > _cmu
const std::array< Real, 2 > _t2
virtual Real dalpha_dtau(Real delta, Real tau) const override
Derivative of Helmholtz free energy wrt tau.
virtual Real mu_from_rho_T(Real density, Real temperature) const override
const std::array< unsigned int, 5 > _d3
const std::array< Real, 5 > _N3
virtual Real dalpha_ddelta(Real delta, Real tau) const override
Derivative of Helmholtz free energy wrt delta.
virtual Real vaporPressure(Real temperature) const override
Vapor pressure.
const std::array< Real, 7 > _bmu
virtual void rho_mu_from_p_T(Real pressure, Real temperature, Real &rho, Real &mu) const override
Combined methods.
virtual std::string fluidName() const override
Fluid name.
const std::array< Real, 5 > _b1k
virtual Real triplePointPressure() const override
Triple point pressure.
virtual Real alpha(Real delta, Real tau) const override
Helmholtz free energy for H2 From Leachman et al (reference above)
const Real _p_critical
Critical pressure (Pa)
const Real _rho_critical
Critical density (kg/m^3)
const std::array< Real, 5 > _gamma3
const std::array< Real, 5 > _phi3
const std::array< Real, 7 > _a1k
Coefficients for thermal conductivity.
virtual Real mu_from_p_T(Real pressure, Real temperature) const override
virtual Real d2alpha_ddelta2(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt delta.
const Real _p_triple
Triple point pressure (Pa)
virtual Real d2alpha_ddeltatau(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt delta and tau.
const std::array< Real, 5 > _t3
const std::array< unsigned int, 7 > _d1
const Real _T_triple
Triple point temperature (K)
virtual Real d2alpha_dtau2(Real delta, Real tau) const override
Second derivative of Helmholtz free energy wrt tau.
const std::array< Real, 7 > _t1
const std::array< Real, 7 > _N1
Coefficients for residual component of the Helmholtz free energy.
virtual Real k_from_rho_T(Real density, Real temperature) const override
const std::array< Real, 5 > _amu
Coefficients for viscosity.
HydrogenFluidProperties(const InputParameters ¶meters)
virtual std::vector< Real > henryCoefficients() const override
Henry's law coefficients for dissolution in water.
const std::array< unsigned int, 2 > _d2
const Real _T_critical
Critical temperature (K)
static InputParameters validParams()
const std::array< Real, 5 > _beta3
virtual Real k_from_p_T(Real pressure, Real temperature) const override
virtual Real triplePointTemperature() const override
Triple point temperature.
const std::array< Real, 5 > _b
void mooseError(Args &&... args) const