void
SinglePhaseFluidProperties::e_dpT(Real p, Real T, Real & e, Real & de_dp, Real & de_dT) const
{
  mooseDeprecated(name(), ": e_dpT() is deprecated. Use e_from_p_T() instead");

  e_from_p_T(p, T, e, de_dp, de_dT);
}
void
StiffenedGasFluidProperties::e_from_p_T(Real p, Real T, Real & e, Real & de_dp, Real & de_dT) const
{
  e = e_from_p_T(p, T);
  de_dp = (1. - _gamma) * _p_inf / (p + _p_inf) / (p + _p_inf) * _cv * T;
  de_dT = (p + _gamma * _p_inf) / (p + _p_inf) * _cv;
}
Real
SinglePhaseFluidProperties::e(Real p, Real T) const
{
  mooseDeprecated(name(), ": e() is deprecated. Use e_from_p_T() instead");

  return e_from_p_T(p, T);
}
void
SinglePhaseFluidProperties::rho_e_from_p_T(Real p,
                                           Real T,
                                           Real & rho,
                                           Real & drho_dp,
                                           Real & drho_dT,
                                           Real & e,
                                           Real & de_dp,
                                           Real & de_dT) const
{
  rho_from_p_T(p, T, rho, drho_dp, drho_dT);
  e_from_p_T(p, T, e, de_dp, de_dT);
}
Example #5
0
void
NaClFluidProperties::rho_e_dpT(Real pressure,
                               Real temperature,
                               Real & rho,
                               Real & drho_dp,
                               Real & drho_dT,
                               Real & e,
                               Real & de_dp,
                               Real & de_dT) const
{
  rho_from_p_T(pressure, temperature, rho, drho_dp, drho_dT);
  e_from_p_T(pressure, temperature, e, de_dp, de_dT);
}
DualReal
SinglePhaseFluidProperties::e_from_p_T(const DualReal & p, const DualReal & T) const
{
  Real e = 0.0;
  Real pressure = p.value();
  Real temperature = T.value();
  Real de_dp = 0.0;
  Real de_dT = 0.0;
  e_from_p_T(pressure, temperature, e, de_dp, de_dT);

  DualReal result = e;
  for (size_t i = 0; i < p.derivatives().size(); ++i)
    result.derivatives()[i] = p.derivatives()[i] * de_dp + T.derivatives()[i] * de_dT;

  return result;
}
void
GeneralVaporMixtureFluidProperties::p_T_from_v_e(Real v,
                                                 Real e,
                                                 std::vector<Real> x,
                                                 Real & p,
                                                 Real & dp_dv,
                                                 Real & dp_de,
                                                 std::vector<Real> & dp_dx,
                                                 Real & T,
                                                 Real & dT_dv,
                                                 Real & dT_de,
                                                 std::vector<Real> & dT_dx) const
{
  p_T_from_v_e(v, e, x, p, T);

  // specific volume residual and Jacobians from primary vapor and mixture
  Real v_unused, dv_dp, dv_dT;
  std::vector<Real> dv_dx;
  v_from_p_T(p, T, x, v_unused, dv_dp, dv_dT, dv_dx);

  // specific internal energy residual and Jacobians from primary vapor and mixture
  Real e_unused, de_dp, de_dT;
  std::vector<Real> de_dx;
  e_from_p_T(p, T, x, e_unused, de_dp, de_dT, de_dx);

  // Compute derivatives using the following rules:
  //   * Reciprocity:         da/db|_c = (db/da|_c)^{-1}
  //   * Chain rule:          da/db|_c = da/dc|_b * dc/db|_a
  //   * Triple product rule: da/db|_c * db/dc|_a * dc/da|_b = -1
  dp_dv = de_dT / (dv_dp * de_dT - dv_dT * de_dp);
  dp_de = dv_dT / (de_dp * dv_dT - de_dT * dv_dp);
  dT_dv = de_dp / (dv_dT * de_dp - dv_dp * de_dT);
  dT_de = dv_dp / (de_dT * dv_dp - de_dp * dv_dT);

  // Derivatives with respect to mass fractions are more complicated, so a
  // finite difference approximation is used (this is expensive of course).
  for (unsigned int i = 0; i < _n_secondary_vapors; ++i)
  {
    Real p_perturbed, T_perturbed;
    std::vector<Real> x_perturbed(x);
    x_perturbed[i] += 1e-6;
    p_T_from_v_e(v, e, x_perturbed, p_perturbed, T_perturbed);

    dp_dx[i] = (p_perturbed - p) / 1e-6;
    dT_dx[i] = (T_perturbed - T) / 1e-6;
  }
}
void
IdealGasFluidPropertiesPT::rho_e_dpT(Real pressure,
                                     Real temperature,
                                     Real & rho,
                                     Real & drho_dp,
                                     Real & drho_dT,
                                     Real & e,
                                     Real & de_dp,
                                     Real & de_dT) const
{
  Real density, ddensity_dp, ddensity_dT;
  rho_from_p_T(pressure, temperature, density, ddensity_dp, ddensity_dT);
  rho = density;
  drho_dp = ddensity_dp;
  drho_dT = ddensity_dT;

  Real energy, denergy_dp, denergy_dT;
  e_from_p_T(pressure, temperature, energy, denergy_dp, denergy_dT);
  e = energy;
  de_dp = denergy_dp;
  de_dT = denergy_dT;
}
Example #9
0
Real
SimpleFluidProperties::h_from_p_T(Real pressure, Real temperature) const
{
  return e_from_p_T(pressure, temperature) +
         _pp_coeff * pressure / rho_from_p_T(pressure, temperature);
}
void
GeneralVaporMixtureFluidProperties::p_T_from_v_e(
    Real v, Real e, std::vector<Real> x, Real & p, Real & T) const
{
  // The residuals are the following:
  // residual[0] = v(p,T,x) - v
  // residual[1] = e(p,T,x) - e
  std::vector<Real> residual(2);

  // The Jacobian columns are the following:
  // 0: pressure
  // 1: temperature
  std::vector<std::vector<Real>> jacobian(2);
  jacobian[0].resize(2);
  jacobian[1].resize(2);

  std::vector<Real> dv_dx(_n_secondary_vapors);
  std::vector<Real> de_dx(_n_secondary_vapors);

  p = _p_guess;
  T = _T_guess;
  bool converged = false;
  std::stringstream err_ss;
  err_ss << name() << ": The nonlinear solve for p and T did not converge:\n";
  err_ss << "  v = " << v << ", e = " << e;
  for (unsigned int i = 0; i < _n_secondary_vapors; ++i)
    err_ss << ", x[" << i << "] = " << x[i];
  err_ss << "\n";
  for (unsigned int l = 0; l < _newton_max_its; ++l)
  {
    // specific volume residual and Jacobians from primary vapor and mixture
    Real v_it, dv_it_dp, dv_it_dT;
    std::vector<Real> dv_it_dx;
    v_from_p_T(p, T, x, v_it, dv_it_dp, dv_it_dT, dv_it_dx);
    residual[0] = v_it - v;
    jacobian[0][0] = dv_it_dp;
    jacobian[0][1] = dv_it_dT;

    // specific internal energy residual and Jacobians from primary vapor and mixture
    Real e_it, de_it_dp, de_it_dT;
    std::vector<Real> de_it_dx;
    e_from_p_T(p, T, x, e_it, de_it_dp, de_it_dT, de_it_dx);
    residual[1] = e_it - e;
    jacobian[1][0] = de_it_dp;
    jacobian[1][1] = de_it_dT;

    // compute scaled errors
    const Real scaled_residual_v = residual[0] / std::abs(v);
    const Real scaled_residual_e = residual[1] / std::abs(e);

    // check for convergence
    const Real l2_error =
        std::sqrt(std::pow(scaled_residual_v, 2) + std::pow(scaled_residual_e, 2));
    err_ss << "  Iteration " << l << ": p = " << p << ", T = " << T << ": l2 error = " << l2_error
           << "\n";
    if (l2_error < _newton_rel_tol)
    {
      converged = true;
      break;
    }

    // take Newton step: dx = -J^{-1} r
    const Real elim = jacobian[1][0] / jacobian[0][0];
    const Real T_step =
        (residual[1] - elim * residual[0]) / (jacobian[1][1] - elim * jacobian[0][1]);
    const Real p_step = (residual[0] - jacobian[0][1] * T_step) / jacobian[0][0];
    p -= p_step * _newton_damping;
    T -= T_step * _newton_damping;
  }

  if (converged)
  {
    if (_update_guesses)
    {
      _p_guess = p;
      _T_guess = T;
    }
  }
  else
  {
    err_ss << "\nTry setting the parameters 'p_initial_guess' and 'T_initial_guess'.";
    mooseWarning(err_ss.str());
    p = std::nan("");
    T = std::nan("");
  }
}
void
SinglePhaseFluidProperties::e_dpT(
    Real pressure, Real temperature, Real & e, Real & de_dp, Real & de_dT) const
{
  e_from_p_T(pressure, temperature, e, de_dp, de_dT);
}
Real
SinglePhaseFluidProperties::e(Real p, Real T) const
{
  return e_from_p_T(p, T);
}
Example #13
0
Real
NaClFluidProperties::cv_from_p_T(Real pressure, Real temperature) const
{
  return e_from_p_T(pressure, temperature) / temperature;
}