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

Go to the source code of this file.

Functions

 TEST_F (IdealRealGasMixtureFluidPropertiesTest, test)
 
 TEST_F (IdealRealGasMixtureFluidPropertiesTest, cpVolumeDependentEnthalpy)
 Verify the isobaric heat capacity against (dh/dT)_p of the mixture enthalpy h = sum_i x_i h_i(T, v / x_i), using a primary component whose enthalpy depends on the specific volume.
 
 TEST_F (IdealRealGasMixtureFluidPropertiesTest, transportVolumeDependentSecondary)
 Verify that the value and derivative overloads of the transport properties agree when a secondary component's internal energy depends on the specific volume.
 
 TEST_F (IdealRealGasMixtureFluidPropertiesTest, threeComponents)
 Verify the mass fraction derivatives for a mixture of three components, where the secondary mass fractions are independent and the primary mass fraction is 1 - sum of the others.
 

Function Documentation

◆ TEST_F() [1/4]

TEST_F ( IdealRealGasMixtureFluidPropertiesTest  ,
cpVolumeDependentEnthalpy   
)

Verify the isobaric heat capacity against (dh/dT)_p of the mixture enthalpy h = sum_i x_i h_i(T, v / x_i), using a primary component whose enthalpy depends on the specific volume.

Definition at line 135 of file IdealRealGasMixtureFluidPropertiesTest.C.

136{
137 const bool original_throw_on_warning = Moose::_throw_on_warning;
139
140 InputParameters fp_params = _factory.getValidParams("TestTVFluidProperties");
141 _fe_problem->addUserObject("TestTVFluidProperties", "fp_tv", fp_params);
142 InputParameters params = _factory.getValidParams("IdealRealGasMixtureFluidProperties");
143 params.set<UserObjectName>("fp_primary") = "fp_tv";
144 params.set<std::vector<UserObjectName>>("fp_secondary") = {"fp_nitrogen"};
145 params.set<bool>("allow_imperfect_jacobians") = true;
146 _fe_problem->addUserObject("IdealRealGasMixtureFluidProperties", "fp_tv_mix", params);
147 const auto & fp_mix = _fe_problem->getUserObject<IdealRealGasMixtureFluidProperties>("fp_tv_mix");
148
149 const Real T = 400.0;
150 const Real v = 1.2;
151 const std::vector<Real> x = {0.3};
152
153 // Mixture enthalpy as a function of (T, v)
154 const auto h_mix = [&](Real T, Real v)
155 {
156 const auto & fp_tv = _fe_problem->getUserObject<SinglePhaseFluidProperties>("fp_tv");
157 return (1.0 - x[0]) * fp_tv.h_from_T_v(T, v / (1.0 - x[0])) +
158 x[0] * _fp_nitrogen->h_from_T_v(T, v / x[0]);
159 };
160 const Real dT = 1e-4;
161 const Real dv = 1e-7;
162 const Real dh_dT = (h_mix(T + dT, v) - h_mix(T - dT, v)) / (2.0 * dT);
163 const Real dh_dv = (h_mix(T, v + dv) - h_mix(T, v - dv)) / (2.0 * dv);
164 Real p, dp_dT, dp_dv;
165 std::vector<Real> dp_dx;
166 fp_mix.p_from_T_v(T, v, x, p, dp_dT, dp_dv, dp_dx);
167 const Real cp_ref = dh_dT - dh_dv * dp_dT / dp_dv;
168
169 REL_TEST(fp_mix.cp_from_T_v(T, v, x), cp_ref, REL_TOL_DERIVATIVE);
170 Real cp, dcp_dT, dcp_dv;
171 std::vector<Real> dcp_dx;
172 fp_mix.cp_from_T_v(T, v, x, cp, dcp_dT, dcp_dv, dcp_dx);
173 REL_TEST(cp, cp_ref, REL_TOL_DERIVATIVE);
174
175 Moose::_throw_on_warning = original_throw_on_warning;
176}
const std::vector< double > x
const Real p
const double T
const double v
Class for fluid properties of an arbitrary vapor mixture.
T & set(const std::string &name, bool quiet_mode=false)
Common class for single phase fluid properties.
bool _throw_on_warning
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ TEST_F() [2/4]

TEST_F ( IdealRealGasMixtureFluidPropertiesTest  ,
test   
)

e(p,T)

s(p,T)

Definition at line 14 of file IdealRealGasMixtureFluidPropertiesTest.C.

15{
16 // save this setting so that it can be restored later
17 const bool original_throw_on_warning = Moose::_throw_on_warning;
19
20 Real T = 400.;
21 Real p = 100000.;
22 std::vector<Real> x = {0.9};
23
24 // pure fluids
25 const Real rho_nitrogen = _fp_nitrogen->rho_from_p_T(p, T);
26 const Real rho_steam = _fp_steam->rho_from_p_T(p, T);
27 REL_TEST(rho_nitrogen, 0.84228968026683726, REL_TOL_SAVED_VALUE);
28 REL_TEST(rho_steam, 0.61493738819320221, REL_TOL_SAVED_VALUE);
29
30 // rho(p,T)
31 const Real rho_mix = _fp_mix->rho_from_p_T(p, T, x);
32 REL_TEST(rho_mix, 0.88183704292782583, REL_TOL_SAVED_VALUE);
33 VAPOR_MIX_DERIV_TEST(_fp_mix->rho_from_p_T, p, T, x, REL_TOL_DERIVATIVE);
34
35 // v(p,T)
36 const Real v_mix = _fp_mix->v_from_p_T(p, T, x);
37 REL_TEST(v_mix, 1.1339963636363655, REL_TOL_SAVED_VALUE);
38 VAPOR_MIX_DERIV_TEST(_fp_mix->v_from_p_T, p, T, x, REL_TOL_DERIVATIVE);
39
41 const Real e_mix = _fp_mix->e_from_p_T(p, T, x);
42 REL_TEST(e_mix, 523068.96363636368, REL_TOL_SAVED_VALUE);
43 VAPOR_MIX_DERIV_TEST(_fp_mix->e_from_p_T, p, T, x, REL_TOL_DERIVATIVE);
44 // e(p,rho)
45 REL_TEST(_fp_mix->e_from_p_rho(p, rho_mix, x), e_mix, REL_TOL_CONSISTENCY);
46 VAPOR_MIX_DERIV_TEST(_fp_mix->e_from_p_rho, p, rho_mix, x, REL_TOL_DERIVATIVE);
47 // e(T,v)
48 REL_TEST(_fp_mix->e_from_T_v(T, v_mix, x), e_mix, REL_TOL_CONSISTENCY);
49 VAPOR_MIX_DERIV_TEST(_fp_mix->e_from_T_v, T, v_mix, x, REL_TOL_DERIVATIVE);
50
51 // p(v,e)
52 REL_TEST(_fp_mix->p_from_v_e(v_mix, e_mix, x), p, REL_TOL_CONSISTENCY);
53 VAPOR_MIX_DERIV_TEST(_fp_mix->p_from_v_e, v_mix, e_mix, x, REL_TOL_DERIVATIVE);
54 // p(T,v)
55 REL_TEST(_fp_mix->p_from_T_v(T, v_mix, x), p, REL_TOL_CONSISTENCY);
56 VAPOR_MIX_DERIV_TEST(_fp_mix->p_from_T_v, T, v_mix, x, REL_TOL_DERIVATIVE);
57
58 // T(v,e)
59 REL_TEST(_fp_mix->T_from_v_e(v_mix, e_mix, x), T, REL_TOL_CONSISTENCY);
60 VAPOR_MIX_DERIV_TEST(_fp_mix->T_from_v_e, v_mix, e_mix, x, REL_TOL_DERIVATIVE);
61 // T(p,v)
62 REL_TEST(_fp_mix->T_from_p_v(p, v_mix, x), T, REL_TOL_CONSISTENCY);
63 VAPOR_MIX_DERIV_TEST(_fp_mix->T_from_p_v, p, v_mix, x, REL_TOL_DERIVATIVE);
64
65 // c(p,T)
66 const Real c_mix = _fp_mix->c_from_p_T(p, T, x);
67 REL_TEST(c_mix, 418.49693534182865, REL_TOL_SAVED_VALUE);
68 VAPOR_MIX_DERIV_TEST(_fp_mix->c_from_p_T, p, T, x, REL_TOL_DERIVATIVE);
69 // c(v,e)
70 REL_TEST(_fp_mix->c_from_v_e(v_mix, e_mix, x), c_mix, REL_TOL_CONSISTENCY);
71 VAPOR_MIX_DERIV_TEST(_fp_mix->c_from_v_e, v_mix, e_mix, x, REL_TOL_DERIVATIVE);
72
74 const Real s_mix = _fp_mix->s_from_p_T(p, T, x);
75 REL_TEST(s_mix, 700.961535541455, REL_TOL_SAVED_VALUE);
76 VAPOR_MIX_DERIV_TEST(_fp_mix->s_from_p_T, p, T, x, REL_TOL_DERIVATIVE);
77 // s(T,v)
78 REL_TEST(_fp_mix->s_from_T_v(T, v_mix, x), s_mix, REL_TOL_CONSISTENCY);
79 VAPOR_MIX_DERIV_TEST(_fp_mix->s_from_T_v, T, v_mix, x, REL_TOL_DERIVATIVE);
80
81 // cp(p,T)
82 const Real cp_mix = _fp_mix->cp_from_p_T(p, T, x);
83 REL_TEST(cp_mix, 1083.6715000000002, REL_TOL_SAVED_VALUE);
84 VAPOR_MIX_DERIV_TEST(_fp_mix->cp_from_p_T, p, T, x, REL_TOL_DERIVATIVE);
85 // cp(T,v)
86 REL_TEST(_fp_mix->cp_from_T_v(T, v_mix, x), cp_mix, REL_TOL_CONSISTENCY);
87 VAPOR_MIX_DERIV_TEST(_fp_mix->cp_from_T_v, T, v_mix, x, REL_TOL_DERIVATIVE);
88
89 // cv(p,T)
90 const Real cv_mix = _fp_mix->cv_from_p_T(p, T, x);
91 REL_TEST(cv_mix, 771.82250000000022, REL_TOL_SAVED_VALUE);
92 VAPOR_MIX_DERIV_TEST(_fp_mix->cv_from_p_T, p, T, x, REL_TOL_DERIVATIVE);
93 // cv(T,v)
94 REL_TEST(_fp_mix->cv_from_T_v(T, v_mix, x), cv_mix, REL_TOL_CONSISTENCY);
95 VAPOR_MIX_DERIV_TEST(_fp_mix->cv_from_T_v, T, v_mix, x, REL_TOL_DERIVATIVE);
96
97 // mu(p,T)
98 const Real mu_mix = _fp_mix->mu_from_p_T(p, T, x);
99 REL_TEST(mu_mix, 2.089269788624648e-05, REL_TOL_SAVED_VALUE);
100 VAPOR_MIX_DERIV_TEST(_fp_mix->mu_from_p_T, p, T, x, REL_TOL_DERIVATIVE);
101 // mu(T,v)
102 REL_TEST(_fp_mix->mu_from_T_v(T, v_mix, x), mu_mix, REL_TOL_CONSISTENCY);
103 VAPOR_MIX_DERIV_TEST(_fp_mix->mu_from_T_v, T, v_mix, x, REL_TOL_DERIVATIVE);
104
105 // k(p,T)
106 const Real k_mix = _fp_mix->k_from_p_T(p, T, x);
107 REL_TEST(k_mix, 0.0319250086967551, REL_TOL_SAVED_VALUE);
108 VAPOR_MIX_DERIV_TEST(_fp_mix->k_from_p_T, p, T, x, REL_TOL_DERIVATIVE);
109 // k(T,v)
110 REL_TEST(_fp_mix->k_from_T_v(T, v_mix, x), k_mix, REL_TOL_CONSISTENCY);
111 VAPOR_MIX_DERIV_TEST(_fp_mix->k_from_T_v, T, v_mix, x, REL_TOL_DERIVATIVE);
112
113 // Compare calculations with a state-of-the-art mixture model. Note these are
114 // not expected to be exactly the same, so very loose tolerances must be used.
115 // mu and k are not available in the state-of-the-art mixture model.
116 T = 360.;
117 p = 100000.;
118 x[0] = 0.5;
119 REL_TEST(_fp_mix->rho_from_p_T(p, T, x), 0.7362935, 0.115554);
120 REL_TEST(_fp_mix->v_from_p_T(p, T, x), 1.3581540, 0.103585);
121 REL_TEST(_fp_mix->e_from_p_T(p, T, x), 1380586.9, 0.023648);
122 REL_TEST(_fp_mix->c_from_p_T(p, T, x), 428.1928, 0.017535);
123 REL_TEST(_fp_mix->cp_from_p_T(p, T, x), 1479.7114, 0.146444);
124 REL_TEST(_fp_mix->cv_from_p_T(p, T, x), 1090.5912, 0.183001);
125
126 // restore original setting
127 Moose::_throw_on_warning = original_throw_on_warning;
128}

◆ TEST_F() [3/4]

TEST_F ( IdealRealGasMixtureFluidPropertiesTest  ,
threeComponents   
)

Verify the mass fraction derivatives for a mixture of three components, where the secondary mass fractions are independent and the primary mass fraction is 1 - sum of the others.

Definition at line 219 of file IdealRealGasMixtureFluidPropertiesTest.C.

220{
221 const bool original_throw_on_warning = Moose::_throw_on_warning;
223
224 {
225 InputParameters params = _factory.getValidParams("IdealGasFluidProperties");
226 params.set<Real>("gamma") = 1.67;
227 params.set<Real>("molar_mass") = 0.039948;
228 _fe_problem->addUserObject("IdealGasFluidProperties", "fp_argon", params);
229 }
230 InputParameters params = _factory.getValidParams("IdealRealGasMixtureFluidProperties");
231 params.set<UserObjectName>("fp_primary") = "fp_steam";
232 params.set<std::vector<UserObjectName>>("fp_secondary") = {"fp_nitrogen", "fp_argon"};
233 params.set<bool>("allow_imperfect_jacobians") = true;
234 _fe_problem->addUserObject("IdealRealGasMixtureFluidProperties", "fp_mix3", params);
235 const auto & fp_mix3 = _fe_problem->getUserObject<IdealRealGasMixtureFluidProperties>("fp_mix3");
236
237 const Real T = 400.0;
238 const Real v = 1.1;
239 const std::vector<Real> x = {0.3, 0.2};
240
241 VAPOR_MIX_DERIV_TEST(fp_mix3.p_from_T_v, T, v, x, REL_TOL_DERIVATIVE);
242 VAPOR_MIX_DERIV_TEST(fp_mix3.e_from_T_v, T, v, x, REL_TOL_DERIVATIVE);
243 VAPOR_MIX_DERIV_TEST(fp_mix3.s_from_T_v, T, v, x, REL_TOL_DERIVATIVE);
244
245 Moose::_throw_on_warning = original_throw_on_warning;
246}

◆ TEST_F() [4/4]

TEST_F ( IdealRealGasMixtureFluidPropertiesTest  ,
transportVolumeDependentSecondary   
)

Verify that the value and derivative overloads of the transport properties agree when a secondary component's internal energy depends on the specific volume.

Definition at line 182 of file IdealRealGasMixtureFluidPropertiesTest.C.

183{
184 const bool original_throw_on_warning = Moose::_throw_on_warning;
186
187 // Secondary component whose e(T, v) depends on v and whose transport properties depend on e
188 InputParameters fp_params = _factory.getValidParams("TestTVFluidProperties");
189 _fe_problem->addUserObject("TestTVFluidProperties", "fp_tv_secondary", fp_params);
190 InputParameters params = _factory.getValidParams("IdealRealGasMixtureFluidProperties");
191 params.set<UserObjectName>("fp_primary") = "fp_nitrogen";
192 params.set<std::vector<UserObjectName>>("fp_secondary") = {"fp_tv_secondary"};
193 params.set<bool>("allow_imperfect_jacobians") = true;
194 _fe_problem->addUserObject("IdealRealGasMixtureFluidProperties", "fp_swapped_mix", params);
195 const auto & fp_mix =
196 _fe_problem->getUserObject<IdealRealGasMixtureFluidProperties>("fp_swapped_mix");
197
198 const Real T = 400.0;
199 const Real v = 1.1;
200 const std::vector<Real> x = {0.3};
201
202 Real mu, dmu_dT, dmu_dv;
203 std::vector<Real> dmu_dx;
204 fp_mix.mu_from_T_v(T, v, x, mu, dmu_dT, dmu_dv, dmu_dx);
205 REL_TEST(fp_mix.mu_from_T_v(T, v, x), mu, REL_TOL_CONSISTENCY);
206
207 Real k, dk_dT, dk_dv;
208 std::vector<Real> dk_dx;
209 fp_mix.k_from_T_v(T, v, x, k, dk_dT, dk_dv, dk_dx);
210 REL_TEST(fp_mix.k_from_T_v(T, v, x), k, REL_TOL_CONSISTENCY);
211
212 Moose::_throw_on_warning = original_throw_on_warning;
213}
const double mu