13#include "libmesh/utility.h"
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)
138 0.021357 * std::sqrt(1000.0 *
_Mh2 * temperature) / (0.297 * 0.297 * std::exp(sum));
139 const Real dmu0_dT = 21.357 *
_Mh2 * (1.0 - 2.0 * temperature * dsum_dT) * std::exp(-sum) /
140 (2.0 * std::sqrt(1000.0 *
_Mh2 * temperature) * 0.297 * 0.297);
144 for (std::size_t i = 0; i <
_bmu.size(); ++i)
149 MathUtils::pow(0.297, 3) * sumr * (dmu0_dT / Tstar - mu0 / (30.41 * Tstar * Tstar));
152 const Real exponent =
_cmu[1] * Tr +
_cmu[2] / Tr +
_cmu[3] * rhor * rhor / (
_cmu[4] + Tr) +
154 const Real dexponent_drho =
157 const Real dexponent_dT =
161 mu = (mu0 + mu1 * density +
_cmu[0] * rhor * rhor * std::exp(exponent)) * 1.0e-6;
163 (mu1 +
_cmu[0] * rhor * std::exp(exponent) * (2.0 * drhor_drho + rhor * dexponent_drho)) *
166 (dmu0_dT + density * dmu1_dT +
_cmu[0] * rhor * rhor * dexponent_dT * std::exp(exponent)) *
168 dmu_drho * ddensity_dT;
175 const Real density =
rho_from_p_T(pressure, temperature);
181 Real pressure, Real temperature, Real &
mu, Real & dmu_dp, Real & dmu_dT)
const
183 Real
rho, drho_dp, drho_dT;
188 dmu_dp = dmu_drho * drho_dp;
214 dmu_dp = dmu_drho * drho_dp;
221 const Real Tr = temperature / 33.145;
222 const Real rhor = density / 31.262;
226 for (std::size_t i = 0; i <
_a1k.size(); ++i)
230 for (std::size_t i = 0; i <
_a2k.size(); ++i)
233 const Real lambda0 = sum1 / sum2;
237 for (std::size_t i = 0; i <
_b1k.size(); ++i)
241 const Real lambdac = 6.24e-4 / (-2.58e-7 + std::abs(Tr - 1.0)) *
245 return lambda0 + lambdah + lambdac;
252 const Real density =
rho_from_p_T(pressure, temperature);
258 Real pressure, Real temperature, Real & k, Real & dk_dp, Real & dk_dT)
const
262 const Real
eps = 1.0e-6;
263 const Real peps = pressure *
eps;
264 const Real Teps = temperature *
eps;
266 dk_dp = (this->
k_from_p_T(pressure + peps, temperature) - k) / peps;
267 dk_dT = (this->
k_from_p_T(pressure, temperature + Teps) - k) / Teps;
273 return {-4.73284, 6.08954, 6.06066};
279 if (temperature < _T_triple || temperature >
_T_critical)
280 throw MooseException(
"Temperature is out of range in " +
name() +
": vaporPressure()");
283 const Real theta = 1.0 - Tr;
285 const Real logpressure = (-4.89789 * theta + 0.988588 * std::pow(theta, 1.5) +
286 0.349689 * Utility::pow<2>(theta) + 0.499356 * std::pow(theta, 2.85)) /
295 mooseError(
"vaporPressure() is not implemented");
302 Real alpha0 = std::log(delta) + 1.5 * std::log(tau) - 1.4579856475 + 1.888076782 * tau;
304 for (std::size_t i = 0; i <
_a.size(); ++i)
305 alpha0 +=
_a[i] * std::log(1.0 - std::exp(
_b[i] * tau));
310 for (std::size_t i = 0; i <
_t1.size(); ++i)
313 for (std::size_t i = 0; i <
_t2.size(); ++i)
316 for (std::size_t i = 0; i <
_t3.size(); ++i)
318 std::exp(
_phi3[i] * Utility::pow<2>(delta -
_D3[i]) +
322 return alpha0 + alphar;
329 Real dalpha0 = 1.0 / delta;
334 for (std::size_t i = 0; i <
_t1.size(); ++i)
337 for (std::size_t i = 0; i <
_t2.size(); ++i)
341 for (std::size_t i = 0; i <
_t3.size(); ++i)
343 std::exp(
_phi3[i] * Utility::pow<2>(delta -
_D3[i]) +
345 (
_d3[i] + delta * (2.0 *
_phi3[i] * (delta -
_D3[i])));
348 return dalpha0 + dalphar / delta;
355 Real dalpha0 = 1.5 / tau + 1.888076782;
357 for (std::size_t i = 0; i <
_a.size(); ++i)
358 dalpha0 +=
_a[i] *
_b[i] * (1.0 - 1.0 / (1.0 - std::exp(
_b[i] * tau)));
363 for (std::size_t i = 0; i <
_t1.size(); ++i)
366 for (std::size_t i = 0; i <
_t2.size(); ++i)
370 for (std::size_t i = 0; i <
_t3.size(); ++i)
372 std::exp(
_phi3[i] * Utility::pow<2>(delta -
_D3[i]) +
377 return dalpha0 + dalphar / tau;
384 Real dalpha0 = -1.0 / delta / delta;
389 for (std::size_t i = 0; i <
_t1.size(); ++i)
393 for (std::size_t i = 0; i <
_t2.size(); ++i)
395 (delta * delta - 2.0 *
_d2[i] * delta +
_d2[i] * (
_d2[i] - 1.0));
397 for (std::size_t i = 0; i <
_t3.size(); ++i)
399 std::exp(
_phi3[i] * Utility::pow<2>(delta -
_D3[i]) +
402 2.0 * delta * delta *
_phi3[i] *
403 (1.0 + 2.0 *
_phi3[i] * (
_D3[i] - delta) * (
_D3[i] - delta)) +
404 _d3[i] * (4.0 * delta *
_phi3[i] * (delta -
_D3[i]) - 1.0));
407 return dalpha0 + dalphar / delta / delta;
414 Real dalpha0 = -1.5 / tau / tau;
416 for (std::size_t i = 0; i <
_a.size(); ++i)
418 Real exptau = std::exp(
_b[i] * tau);
419 dalpha0 -=
_a[i] * (
_b[i] *
_b[i] * exptau / (1.0 - exptau) * (exptau / (1.0 - exptau) + 1.0));
425 for (std::size_t i = 0; i <
_t1.size(); ++i)
429 for (std::size_t i = 0; i <
_t2.size(); ++i)
431 std::pow(tau,
_t2[i]) * std::exp(-delta);
433 for (std::size_t i = 0; i <
_t3.size(); ++i)
435 std::exp(
_phi3[i] * Utility::pow<2>(delta -
_D3[i]) +
438 2.0 *
_beta3[i] * tau * tau *
443 return dalpha0 + dalphar / tau / tau;
452 for (std::size_t i = 0; i <
_t1.size(); ++i)
453 dalphar +=
_N1[i] *
_d1[i] *
_t1[i] * std::pow(delta,
_d1[i]) * std::pow(tau,
_t1[i]);
455 for (std::size_t i = 0; i <
_t2.size(); ++i)
456 dalphar +=
_N2[i] *
_t2[i] * std::pow(delta,
_d2[i]) * std::pow(tau,
_t2[i]) *
457 std::exp(-delta) * (
_d2[i] - delta);
459 for (std::size_t i = 0; i <
_t3.size(); ++i)
460 dalphar +=
_N3[i] * std::pow(delta,
_d3[i]) * std::pow(tau,
_t3[i]) *
461 std::exp(
_phi3[i] * Utility::pow<2>(delta -
_D3[i]) +
463 (
_d3[i] + delta * (2.0 *
_phi3[i] * (delta -
_D3[i]))) *
467 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