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); }
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; }
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); }
Real NaClFluidProperties::cv_from_p_T(Real pressure, Real temperature) const { return e_from_p_T(pressure, temperature) / temperature; }