https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Functions
ADFluidPropsTest.C File Reference

Go to the source code of this file.

Functions

 TEST_F (ADFluidPropsTest, ad_basic)
 
 TEST_F (ADFluidPropsTest, ad_two_phase)
 
 TEST_F (ADFluidPropsTest, error_imperfect_jacobian)
 

Function Documentation

◆ TEST_F() [1/3]

TEST_F ( ADFluidPropsTest  ,
ad_basic   
)

Definition at line 14 of file ADFluidPropsTest.C.

15{
16 Real v = .7;
17 Real e = 214000;
18
19 Real p = 0;
20 Real dpdv = 0;
21 Real dpde = 0;
22 _fp->p_from_v_e(v, e, p, dpdv, dpde);
23
26 Moose::derivInsert(dvdx, 0, 1);
27 Moose::derivInsert(dvdx, 1, 2);
28 Moose::derivInsert(dvdx, 2, 3);
29 Moose::derivInsert(dedx, 0, 1);
30 Moose::derivInsert(dedx, 1, 0);
31 Moose::derivInsert(dedx, 2, 2);
32
33 ADReal v_ad(v, dvdx);
34 ADReal e_ad(e, dedx);
35 auto p_ad = _fp->p_from_v_e(v_ad, e_ad);
36
37 EXPECT_DOUBLE_EQ(p, p_ad.value());
38 for (size_t i = 0; i < 3; i++)
39 EXPECT_DOUBLE_EQ(dpdv * dvdx[i] + dpde * dedx[i], p_ad.derivatives()[i]);
40}
DualNumber< Real, DNDerivativeType, true > ADReal
SemiDynamicSparseNumberArray< Real, libMesh::dof_id_type, NWrapper< MOOSE_AD_MAX_DOFS_PER_ELEM > > DNDerivativeType
const Real p
const double v
void derivInsert(SemiDynamicSparseNumberArray< Real, libMesh::dof_id_type, NWrapper< N > > &derivs, libMesh::dof_id_type index, Real value)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ TEST_F() [2/3]

TEST_F ( ADFluidPropsTest  ,
ad_two_phase   
)

Definition at line 42 of file ADFluidPropsTest.C.

43{
44 const Real p = 1e5;
45 const Real T = 300;
46
48 Moose::derivInsert(dpdU, 0, 1);
49 Moose::derivInsert(dpdU, 1, 2);
50 Moose::derivInsert(dpdU, 2, 3);
51
53 Moose::derivInsert(dTdU, 0, 1);
54 Moose::derivInsert(dTdU, 1, 0);
55 Moose::derivInsert(dTdU, 2, 2);
56
57 const ADReal p_ad(p, dpdU);
58 const ADReal T_ad(T, dTdU);
59
60 const auto & fp_2phase = buildTwoPhaseFluidProperties();
61 const auto & fp_liquid =
62 _fe_problem->getUserObject<SinglePhaseFluidProperties>(fp_2phase.getLiquidName());
63 const auto & fp_vapor =
64 _fe_problem->getUserObject<SinglePhaseFluidProperties>(fp_2phase.getVaporName());
65
66 // Latent heat
67
68 const Real h_lat = fp_2phase.h_lat(p, T);
69
70 Real h_liquid = 0;
71 Real dh_liquid_dp = 0;
72 Real dh_liquid_dT = 0;
73 fp_liquid.h_from_p_T(p, T, h_liquid, dh_liquid_dp, dh_liquid_dT);
74
75 Real h_vapor = 0;
76 Real dh_vapor_dp = 0;
77 Real dh_vapor_dT = 0;
78 fp_vapor.h_from_p_T(p, T, h_vapor, dh_vapor_dp, dh_vapor_dT);
79
80 const Real dh_lat_dp = dh_vapor_dp - dh_liquid_dp;
81 const Real dh_lat_dT = dh_vapor_dT - dh_liquid_dT;
82
83 const ADReal h_lat_ad = fp_2phase.h_lat(p_ad, T_ad);
84
85 EXPECT_DOUBLE_EQ(h_lat, h_lat_ad.value());
86 for (size_t i = 0; i < 3; i++)
87 EXPECT_DOUBLE_EQ(dh_lat_dp * dpdU[i] + dh_lat_dT * dTdU[i], h_lat_ad.derivatives()[i]);
88
89 // Surface tension
90
91 const Real sigma = fp_2phase.sigma_from_T(T);
92 const Real dsigma_dT = fp_2phase.dsigma_dT_from_T(T);
93 const ADReal sigma_ad = fp_2phase.sigma_from_T(T_ad);
94
95 EXPECT_DOUBLE_EQ(sigma, sigma_ad.value());
96 for (size_t i = 0; i < 3; i++)
97 EXPECT_DOUBLE_EQ(dsigma_dT * dTdU[i], sigma_ad.derivatives()[i]);
98
99 // Saturation temperature
100
101 const Real T_sat = fp_2phase.T_sat(p);
102 const Real dT_sat_dp = fp_2phase.dT_sat_dp(p);
103 const ADReal T_sat_ad = fp_2phase.T_sat(p_ad);
104
105 EXPECT_DOUBLE_EQ(T_sat, T_sat_ad.value());
106 for (size_t i = 0; i < 3; i++)
107 EXPECT_DOUBLE_EQ(dT_sat_dp * dpdU[i], T_sat_ad.derivatives()[i]);
108
109 // Saturation pressure
110
111 const Real p_sat = fp_2phase.p_sat(T);
112 const Real dp_sat_dT = 1.0 / fp_2phase.dT_sat_dp(p_sat);
113 const ADReal p_sat_ad = fp_2phase.p_sat(T_ad);
114
115 EXPECT_DOUBLE_EQ(p_sat, p_sat_ad.value());
116 for (size_t i = 0; i < 3; i++)
117 EXPECT_DOUBLE_EQ(dp_sat_dT * dTdU[i], p_sat_ad.derivatives()[i]);
118}
const double T
Common class for single phase fluid properties.
const T & getUserObject(const std::string &param_name, bool is_dependency=true) const

◆ TEST_F() [3/3]

TEST_F ( ADFluidPropsTest  ,
error_imperfect_jacobian   
)

Definition at line 120 of file ADFluidPropsTest.C.

121{
122 ADReal v = .7;
123 ADReal e = 214000;
124
125 // This throws because g_from_v_e has no derivatives version implemented:
126 EXPECT_THROW(_fp->g_from_v_e(v, e), std::runtime_error);
127
128 // create fp with allow_imperfect_jacobians on - but warnings are errors still
129 auto & fp = buildObj("fp2", true);
130 EXPECT_THROW(fp.g_from_v_e(v, e), std::runtime_error);
131
132 // missing derivs become warnings instead of errors
134 bool toe = Moose::_throw_on_error;
137 EXPECT_NO_THROW(fp.g_from_v_e(v, e));
140}
bool _throw_on_error
bool _warnings_are_errors