60 const auto & fp_2phase = buildTwoPhaseFluidProperties();
66 const Real h_lat = fp_2phase.h_lat(
p,
T);
69 Real dh_liquid_dp = 0;
70 Real dh_liquid_dT = 0;
71 fp_liquid.h_from_p_T(
p,
T, h_liquid, dh_liquid_dp, dh_liquid_dT);
76 fp_vapor.h_from_p_T(
p,
T, h_vapor, dh_vapor_dp, dh_vapor_dT);
78 const Real dh_lat_dp = dh_vapor_dp - dh_liquid_dp;
79 const Real dh_lat_dT = dh_vapor_dT - dh_liquid_dT;
81 const ADReal h_lat_ad = fp_2phase.h_lat(p_ad, T_ad);
83 EXPECT_DOUBLE_EQ(h_lat, h_lat_ad.value());
84 for (
size_t i = 0; i < 3; i++)
85 EXPECT_DOUBLE_EQ(dh_lat_dp * dpdU[i] + dh_lat_dT * dTdU[i], h_lat_ad.derivatives()[i]);
90 const Real dsigma_dT = fp_2phase.dsigma_dT_from_T(
T);
91 const ADReal sigma_ad = fp_2phase.sigma_from_T(T_ad);
93 EXPECT_DOUBLE_EQ(
sigma, sigma_ad.value());
94 for (
size_t i = 0; i < 3; i++)
95 EXPECT_DOUBLE_EQ(dsigma_dT * dTdU[i], sigma_ad.derivatives()[i]);
99 const Real T_sat = fp_2phase.T_sat(
p);
100 const Real dT_sat_dp = fp_2phase.dT_sat_dp(
p);
101 const ADReal T_sat_ad = fp_2phase.T_sat(p_ad);
103 EXPECT_DOUBLE_EQ(T_sat, T_sat_ad.value());
104 for (
size_t i = 0; i < 3; i++)
105 EXPECT_DOUBLE_EQ(dT_sat_dp * dpdU[i], T_sat_ad.derivatives()[i]);
109 const Real p_sat = fp_2phase.p_sat(
T);
110 const Real dp_sat_dT = 1.0 / fp_2phase.dT_sat_dp(p_sat);
111 const ADReal p_sat_ad = fp_2phase.p_sat(T_ad);
113 EXPECT_DOUBLE_EQ(p_sat, p_sat_ad.value());
114 for (
size_t i = 0; i < 3; i++)
115 EXPECT_DOUBLE_EQ(dp_sat_dT * dTdU[i], p_sat_ad.derivatives()[i]);
DualNumber< Real, DNDerivativeType, false > ADReal
Common class for single phase fluid properties.
KokkosSemiDynamicSparseNumberArray< Real, libMesh::dof_id_type, NWrapper< MOOSE_AD_MAX_DOFS_PER_ELEM > > DNDerivativeType
const T & getUserObject(const std::string ¶m_name, bool is_dependency=true) const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void derivInsert(SemiDynamicSparseNumberArray< Real, libMesh::dof_id_type, NWrapper< N >> &derivs, libMesh::dof_id_type index, Real value)