14 #include "metaphysicl/dualnumberarray.h" 21 #define propfuncAD(want, prop1, prop2) \ 22 virtual ADReal want##_from_##prop1##_##prop2(const ADReal & p1, const ADReal & p2) const \ 25 Real raw1 = p1.value(); \ 26 Real raw2 = p2.value(); \ 29 want##_from_##prop1##_##prop2(raw1, raw2, x, dxd1, dxd2); \ 32 result.derivatives() = p1.derivatives() * dxd1 + p2.derivatives() * dxd2; \ 36 virtual void want##_from_##prop1##_##prop2(const ADReal & prop1, \ 37 const ADReal & prop2, \ 39 ADReal & d##want##d1, \ 40 ADReal & d##want##d2) const \ 42 unimplementedDerivativeMethod(__PRETTY_FUNCTION__); \ 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 \ 58 "The fluid properties class '", \ 60 "' has not implemented the method below. If your application requires this method, you " \ 61 "must either implement it or use a different fluid properties class.\n\n", \ 62 __PRETTY_FUNCTION__); \ 65 virtual void want##_from_##prop1##_##prop2( \ 66 Real prop1, Real prop2, Real & val, Real & d##want##d1, Real & d##want##d2) const \ 68 unimplementedDerivativeMethod(__PRETTY_FUNCTION__); \ 71 val = want##_from_##prop1##_##prop2(prop1, prop2); \ 74 propfuncAD(want, prop1, prop2) 81 #define propfuncWithDefault(want, prop1, prop2) \ 82 virtual Real want##_from_##prop1##_##prop2(Real, Real) const; \ 83 virtual void want##_from_##prop1##_##prop2( \ 84 Real prop1, Real prop2, Real & val, Real & d##want##d1, Real & d##want##d2) const; \ 86 propfuncAD(want, prop1, prop2) 91 #define propfuncWithDefinitionOverride(want, prop1, prop2) \ 92 Real want##_from_##prop1##_##prop2(Real, Real) const override; \ 93 void want##_from_##prop1##_##prop2( \ 94 Real prop1, Real prop2, Real & val, Real & d##want##d1, Real & d##want##d2) const override; \ 95 ADReal want##_from_##prop1##_##prop2(const ADReal &, const ADReal &) const override; \ 96 void want##_from_##prop1##_##prop2(const ADReal & prop1, \ 97 const ADReal & prop2, \ 99 ADReal & d##want##d1, \ 100 ADReal & d##want##d2) const override; \ 101 template <typename CppType> \ 102 CppType want##_from_##prop1##_##prop2##_template(const CppType & prop1, const CppType & prop2) \ 104 template <typename CppType> \ 105 void want##_from_##prop1##_##prop2##_template(const CppType & prop1, \ 106 const CppType & prop2, \ 108 CppType & d##want##d1, \ 109 CppType & d##want##d2) const 122 #pragma GCC diagnostic push 123 #pragma GCC diagnostic ignored "-Woverloaded-virtual" 224 #undef propfuncWithDefault 301 virtual void vaporPressure(Real
T, Real & psat, Real & dpsat_dT)
const;
323 template <
typename CppType>
324 void v_e_from_p_T(
const CppType &
p,
const CppType &
T, CppType &
v, CppType & e)
const;
325 template <
typename CppType>
333 CppType & de_dT)
const;
351 Real & dmu_dT)
const;
374 template <
typename CppType>
381 bool & conversion_succeeded)
const;
394 template <
typename T>
401 bool & conversion_succeeded)
const;
413 template <
typename T>
420 bool & conversion_succeeded)
const;
428 template <
typename T,
typename Functor>
436 template <
typename T>
455 "The fluid properties class '" +
type() +
456 "' has not implemented the method below, which computes derivatives of fluid properties " 457 "with regards to the flow variables. If your application requires this " 458 "method, you must either implement it or use a different fluid properties " 460 property_function_name;
463 mooseDoOnce(
mooseWarning(
message +
"\nThe unimplemented derivatives for this fluid property " 464 "are currently neglected, set to 0."));
467 "unimplemented derivatives of fluid properties by setting the " 468 "'allow_imperfect_jacobians' parameter");
472 #pragma GCC diagnostic pop 474 template <
typename T>
478 return {
T{0, 0},
T{1, 0}};
482 inline std::pair<Real, Real>
488 template <
typename T,
typename Functor>
491 const T
x,
const T &
y, T & z, T & dz_dx, T & dz_dy,
const Functor & z_from_x_y)
496 CompoundType x_c(
x,
zero);
497 auto & x_cd = x_c.derivatives();
499 CompoundType y_c(
y,
zero);
500 auto & y_cd = y_c.derivatives();
503 const auto z_c = z_from_x_y(x_c, y_c);
505 dz_dx = z_c.derivatives()[0];
506 dz_dy = z_c.derivatives()[1];
509 template <
typename CppType>
517 bool & conversion_succeeded)
const 519 auto v_lambda = [&](
const CppType &
pressure,
524 auto e_lambda = [&](
const CppType &
pressure,
533 conversion_succeeded =
true;
537 conversion_succeeded =
false;
540 if (!conversion_succeeded)
541 mooseDoOnce(
mooseWarning(
"Conversion from (v, e)=(",
v,
", ", e,
") to (p, T) failed"));
544 template <
typename T>
552 bool & conversion_succeeded)
const 562 conversion_succeeded =
true;
566 conversion_succeeded =
false;
569 if (!conversion_succeeded)
570 mooseDoOnce(
mooseWarning(
"Conversion from (v, h)=(",
v,
", ",
h,
") to (p, T) failed"));
573 template <
typename T>
581 bool & conversion_succeeded)
const 591 conversion_succeeded =
true;
595 conversion_succeeded =
false;
598 if (!conversion_succeeded)
599 mooseDoOnce(
mooseWarning(
"Conversion from (h, s)=(",
h,
", ", s,
") to (p, T) failed"));
602 template <
typename CppType>
609 const CppType
rho = rho_from_p_T(
p,
T);
614 e = e_from_p_T(
p,
T);
618 e = e_from_p_rho(
p,
rho);
622 template <
typename CppType>
631 CppType & de_dT)
const 633 CppType
rho, drho_dp, drho_dT;
634 rho_from_p_T(
p,
T,
rho, drho_dp, drho_dT);
637 const CppType dv_drho = -1.0 / (
rho *
rho);
638 dv_dp = dv_drho * drho_dp;
639 dv_dT = dv_drho * drho_dT;
641 CppType de_dp_partial, de_drho;
642 e_from_p_rho(
p,
rho, e, de_dp_partial, de_drho);
643 de_dp = de_dp_partial + de_drho * drho_dp;
644 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
e e e e s T T T propfuncWithDefault(cp, p, T) propfuncWithDefault(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()
static std::pair< T, T > makeZeroAndOne(const T &)
Given a type example, this method returns zero and unity representations of that type (first and seco...
virtual Real molarMass() const
Molar mass [kg/mol].
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
DualNumber< Real, DNDerivativeType, true > ADReal
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.
e e e e s T T T T T rho v v T e h
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
const std::string & type() const
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.
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 message
const unsigned int _max_newton_its
Maximum number of iterations for the variable conversion newton solves.
static const std::string pressure
const Real _p_initial_guess
Initial guess for pressure (or pressure used to compute the initial guess)
void mooseError(Args &&... args) const
virtual Real criticalPressure() const
Critical pressure.
e e e e s T T T T T rho v v T e p T T virtual T std::string fluidName() const
Fluid name.
const InputParameters & parameters() const
virtual Real vaporPressure(Real T) const
Vapor pressure.
const Real _T_initial_guess
Initial guess for temperature (or temperature used to compute the initial guess)
void unimplementedDerivativeMethod(const std::string &property_function_name) const
static const std::string k