14 #include "metaphysicl/dualnumberarray.h" 21 #define propfuncAD(want, prop1, prop2) \ 22 virtual DualReal want##_from_##prop1##_##prop2(const DualReal & p1, const DualReal & p2) const \ 25 Real raw1 = p1.value(); \ 26 Real raw2 = p2.value(); \ 29 want##_from_##prop1##_##prop2(raw1, raw2, x, dxd1, dxd2); \ 31 DualReal result = x; \ 32 result.derivatives() = p1.derivatives() * dxd1 + p2.derivatives() * dxd2; \ 36 virtual void want##_from_##prop1##_##prop2(const DualReal & prop1, \ 37 const DualReal & prop2, \ 39 DualReal & d##want##d1, \ 40 DualReal & d##want##d2) const \ 42 fluidPropError(name(), ": ", __PRETTY_FUNCTION__, " derivative derivatives not implemented."); \ 43 Real dummy, tmp1, tmp2; \ 44 val = want##_from_##prop1##_##prop2(prop1, prop2); \ 45 want##_from_##prop1##_##prop2(prop1.value(), prop2.value(), dummy, tmp1, tmp2); \ 54 #define propfunc(want, prop1, prop2) \ 55 virtual Real want##_from_##prop1##_##prop2(Real, Real) const \ 57 mooseError(name(), ": ", __PRETTY_FUNCTION__, " not implemented."); \ 60 virtual void want##_from_##prop1##_##prop2( \ 61 Real prop1, Real prop2, Real & val, Real & d##want##d1, Real & d##want##d2) const \ 63 fluidPropError(name(), ": ", __PRETTY_FUNCTION__, " derivatives not implemented."); \ 66 val = want##_from_##prop1##_##prop2(prop1, prop2); \ 69 propfuncAD(want, prop1, prop2) 76 #define propfuncWithDefault(want, prop1, prop2) \ 77 virtual Real want##_from_##prop1##_##prop2(Real, Real) const; \ 78 virtual void want##_from_##prop1##_##prop2( \ 79 Real prop1, Real prop2, Real & val, Real & d##want##d1, Real & d##want##d2) const; \ 81 propfuncAD(want, prop1, prop2) 86 #define propfuncWithDefinitionOverride(want, prop1, prop2) \ 87 Real want##_from_##prop1##_##prop2(Real, Real) const override; \ 88 void want##_from_##prop1##_##prop2( \ 89 Real prop1, Real prop2, Real & val, Real & d##want##d1, Real & d##want##d2) const override; \ 90 ADReal want##_from_##prop1##_##prop2(const ADReal &, const ADReal &) const override; \ 91 void want##_from_##prop1##_##prop2(const ADReal & prop1, \ 92 const ADReal & prop2, \ 94 ADReal & d##want##d1, \ 95 ADReal & d##want##d2) const override; \ 96 template <typename CppType> \ 97 CppType want##_from_##prop1##_##prop2##_template(const CppType & prop1, const CppType & prop2) \ 99 template <typename CppType> \ 100 void want##_from_##prop1##_##prop2##_template(const CppType & prop1, \ 101 const CppType & prop2, \ 103 CppType & d##want##d1, \ 104 CppType & d##want##d2) const 117 #pragma GCC diagnostic push 118 #pragma GCC diagnostic ignored "-Woverloaded-virtual" 218 #undef propfuncWithDefault 225 virtual std::string fluidName()
const;
295 virtual void vaporPressure(Real
T, Real & psat, Real & dpsat_dT)
const;
317 template <
typename CppType>
318 void v_e_from_p_T(
const CppType &
p,
const CppType &
T, CppType &
v, CppType & e)
const;
319 template <
typename CppType>
327 CppType & de_dT)
const;
345 Real & dmu_dT)
const;
369 template <
typename CppType>
376 bool & conversion_succeeded)
const;
389 template <
typename T>
396 bool & conversion_succeeded)
const;
408 template <
typename T>
415 bool & conversion_succeeded)
const;
423 template <
typename T,
typename Functor>
431 template <
typename T>
444 template <
typename... Args>
454 #pragma GCC diagnostic pop 456 template <
typename T>
460 return {
T{0, 0},
T{1, 0}};
464 inline std::pair<Real, Real>
470 template <
typename T,
typename Functor>
473 const T
x,
const T &
y, T & z, T & dz_dx, T & dz_dy,
const Functor & z_from_x_y)
478 CompoundType x_c(
x,
zero);
479 auto & x_cd = x_c.derivatives();
481 CompoundType y_c(
y,
zero);
482 auto & y_cd = y_c.derivatives();
485 const auto z_c = z_from_x_y(x_c, y_c);
487 dz_dx = z_c.derivatives()[0];
488 dz_dy = z_c.derivatives()[1];
491 template <
typename CppType>
499 bool & conversion_succeeded)
const 501 auto v_lambda = [&](
const CppType &
pressure,
506 auto e_lambda = [&](
const CppType &
pressure,
515 conversion_succeeded =
true;
519 conversion_succeeded =
false;
522 if (!conversion_succeeded)
523 mooseDoOnce(
mooseWarning(
"Conversion from (v, e)=(",
v,
", ", e,
") to (p, T) failed"));
526 template <
typename T>
534 bool & conversion_succeeded)
const 544 conversion_succeeded =
true;
548 conversion_succeeded =
false;
551 if (!conversion_succeeded)
552 mooseDoOnce(
mooseWarning(
"Conversion from (v, h)=(",
v,
", ",
h,
") to (p, T) failed"));
555 template <
typename T>
563 bool & conversion_succeeded)
const 573 conversion_succeeded =
true;
577 conversion_succeeded =
false;
580 if (!conversion_succeeded)
581 mooseDoOnce(
mooseWarning(
"Conversion from (h, s)=(",
h,
", ", s,
") to (p, T) failed"));
584 template <
typename CppType>
591 const CppType
rho = rho_from_p_T(
p,
T);
596 e = e_from_p_T(
p,
T);
600 e = e_from_p_rho(
p,
rho);
604 template <
typename CppType>
613 CppType & de_dT)
const 615 CppType
rho, drho_dp, drho_dT;
616 rho_from_p_T(
p,
T,
rho, drho_dp, drho_dT);
619 const CppType dv_drho = -1.0 / (
rho *
rho);
620 dv_dp = dv_drho * drho_dp;
621 dv_dT = dv_drho * drho_dT;
623 CppType de_dp_partial, de_drho;
624 e_from_p_rho(
p,
rho, e, de_dp_partial, de_drho);
625 de_dp = de_dp_partial + de_drho * drho_dp;
626 de_dT = de_drho * drho_dT;
e e e e s T T T T T rho T
propfunc(p, v, e) propfunc(T
Compute a fluid property given for the state defined by two given properties.
static const std::string cv
const bool _allow_imperfect_jacobians
Flag to set unimplemented Jacobian entries to zero.
virtual Real triplePointTemperature() const
Triple point temperature.
void p_T_from_v_h(const T &v, const T &h, Real p0, Real T0, T &pressure, T &temperature, bool &conversion_succeeded) const
Determines (p,T) from (v,h) using Newton Solve in 2D Useful for conversion between different sets of ...
static InputParameters validParams()
DualNumber< Real, DNDerivativeType, true > DualReal
static std::pair< T, T > makeZeroAndOne(const T &)
Given a type example, this method returns zero and unity reperesentations of that type (first and sec...
virtual virtual std Real molarMass() const
Fluid name.
e e e e s T T T T T rho v v T s h T e propfuncWithDefault(gamma, p, T)
virtual std::vector< Real > henryCoefficients() const
Henry's law coefficients for dissolution in water.
SinglePhaseFluidProperties(const InputParameters ¶meters)
const std::vector< double > y
static const std::string temperature
void v_e_from_p_T(const CppType &p, const CppType &T, CppType &v, CppType &e) const
void mooseWarning(Args &&... args) const
void p_T_from_v_e(const CppType &v, const CppType &e, Real p0, Real T0, CppType &p, CppType &T, bool &conversion_succeeded) const
Determines (p,T) from (v,e) using Newton Solve in 2D Useful for conversion between different sets of ...
virtual Real criticalInternalEnergy() const
Critical specific internal energy.
static void xyDerivatives(const T x, const T &y, T &z, T &dz_dx, T &dz_dy, const Functor &z_from_x_y)
Computes the dependent variable z and its derivatives with respect to the independent variables x and...
static const std::string cp
virtual ~SinglePhaseFluidProperties()
const Real _tolerance
Newton's method may be used to convert between variable sets _tolerance, _T_initial_guess, and _p_initial_guess are the parameters for these iterative solves.
virtual Real vaporTemperature(Real p) const
Vapor temperature.
void NewtonSolve2D(const T &f, const T &g, const Real x0, const Real y0, T &x_final, T &y_final, const Real f_tol, const Real g_tol, const Functor1 &func1, const Functor2 &func2, const unsigned int max_its=100)
NewtonSolve2D does a 2D Newton Solve to solve for the x and y such that: f = func1(x, y) and g = func2(x, y).
FunctorEnvelope< T > Functor
virtual Real criticalTemperature() const
Critical temperature.
const std::vector< double > x
static const std::string mu
Common class for single phase fluid properties.
virtual void v_e_spndl_from_T(Real T, Real &v, Real &e) const
Specific internal energy from temperature and specific volume.
e e e e s T T T T T rho v v T h
virtual void 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
virtual Real triplePointPressure() const
Triple point pressure.
virtual Real e_spndl_from_v(Real v) const
Specific internal energy from temperature and specific volume.
void p_T_from_h_s(const T &h, const T &s, Real p0, Real T0, T &pressure, T &temperature, bool &conversion_succeeded) const
Determines (p,T) from (h,s) using Newton Solve in 2D Useful for conversion between different sets of ...
virtual void rho_mu_from_p_T(Real p, Real T, Real &rho, Real &mu) const
Combined methods.
virtual Real criticalDensity() const
Critical density.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::string v
static const std::string pressure
const Real _p_initial_guess
void mooseError(Args &&... args) const
virtual Real criticalPressure() const
Critical pressure.
const InputParameters & parameters() const
void fluidPropError(Args... args) const
virtual Real vaporPressure(Real T) const
Vapor pressure.
const Real _T_initial_guess
static const std::string k