59 const Real
tol = 1e-12;
64 REL_TEST(
fp.rho_from_p_T(ref.p, ref.T), ref.rho / R_ratio,
tol);
65 REL_TEST(
fp.e_from_p_T(ref.p, ref.T), ref.e * R_ratio,
tol);
66 REL_TEST(
fp.h_from_p_T(ref.p, ref.T), ref.h * R_ratio,
tol);
67 REL_TEST(
fp.s_from_p_T(ref.p, ref.T), ref.s * R_ratio,
tol);
68 REL_TEST(
fp.cp_from_p_T(ref.p, ref.T), ref.cp * R_ratio,
tol);
69 REL_TEST(
fp.cv_from_p_T(ref.p, ref.T), ref.cv * R_ratio,
tol);
70 REL_TEST(
fp.c_from_p_T(ref.p, ref.T), ref.c * std::sqrt(R_ratio),
tol);
102 for (
const auto *
fp : {_fp_h2o, _fp_n2})
103 for (
const auto & [
p,
T] :
104 {std::pair<Real, Real>(1e5, 600.0), std::pair<Real, Real>(3e6, 1500.0)})
106 const Real
rho =
fp->rho_from_p_T(
p,
T);
107 const Real
v = 1 /
rho;
108 const Real e =
fp->e_from_p_T(
p,
T);
109 const Real h =
fp->h_from_p_T(
p,
T);
110 const Real s =
fp->s_from_p_T(
p,
T);
111 const Real cp =
fp->cp_from_p_T(
p,
T);
112 const Real cv =
fp->cv_from_p_T(
p,
T);
113 const Real gamma =
fp->gamma_from_p_T(
p,
T);
114 const Real
c =
fp->c_from_p_T(
p,
T);
117 REL_TEST(
fp->v_from_p_T(
p,
T),
v, REL_TOL_CONSISTENCY);
118 REL_TEST(
fp->p_from_T_v(
T,
v),
p, REL_TOL_CONSISTENCY);
119 REL_TEST(
fp->e_from_T_v(
T,
v), e, REL_TOL_CONSISTENCY);
120 REL_TEST(
fp->h_from_T_v(
T,
v), h, REL_TOL_CONSISTENCY);
121 REL_TEST(
fp->s_from_T_v(
T,
v), s, REL_TOL_CONSISTENCY);
122 REL_TEST(
fp->cv_from_T_v(
T,
v), cv, REL_TOL_CONSISTENCY);
123 REL_TEST(
fp->e_from_p_rho(
p,
rho), e, REL_TOL_CONSISTENCY);
126 REL_TEST(h, e +
p *
v, REL_TOL_CONSISTENCY);
128 REL_TEST(gamma, cp / cv, REL_TOL_CONSISTENCY);
129 REL_TEST(
c *
c, gamma *
p *
v, REL_TOL_CONSISTENCY);
133 Real value, d_dp, d_dT, d_dv;
134 fp->h_from_p_T(
p,
T, value, d_dp, d_dT);
135 REL_TEST(d_dT, cp, REL_TOL_CONSISTENCY);
136 fp->e_from_T_v(
T,
v, value, d_dT, d_dv);
137 REL_TEST(d_dT, cv, REL_TOL_CONSISTENCY);
138 fp->s_from_p_T(
p,
T, value, d_dp, d_dT);
139 REL_TEST(d_dT, cp /
T, REL_TOL_CONSISTENCY);
140 REL_TEST(d_dp, -
v /
T, REL_TOL_CONSISTENCY);
147 for (
const auto & [
fp,
T] : {std::pair<const NASA7IdealGasFluidProperties *, Real>(_fp_h2o, 700),
148 std::pair<const NASA7IdealGasFluidProperties *, Real>(_fp_n2, 1500)})
151 const Real
rho =
fp->rho_from_p_T(
p,
T);
152 const Real
v = 1 /
rho;
154 DERIV_TEST(
fp->rho_from_p_T,
p,
T, REL_TOL_DERIVATIVE);
155 DERIV_TEST(
fp->v_from_p_T,
p,
T, REL_TOL_DERIVATIVE);
156 DERIV_TEST(
fp->e_from_p_T,
p,
T, REL_TOL_DERIVATIVE);
157 DERIV_TEST(
fp->h_from_p_T,
p,
T, REL_TOL_DERIVATIVE);
158 DERIV_TEST(
fp->s_from_p_T,
p,
T, REL_TOL_DERIVATIVE);
159 DERIV_TEST(
fp->cp_from_p_T,
p,
T, REL_TOL_DERIVATIVE);
160 DERIV_TEST(
fp->cv_from_p_T,
p,
T, REL_TOL_DERIVATIVE);
161 DERIV_TEST(
fp->c_from_p_T,
p,
T, REL_TOL_DERIVATIVE);
162 DERIV_TEST(
fp->gamma_from_p_T,
p,
T, REL_TOL_DERIVATIVE);
163 DERIV_TEST(
fp->mu_from_p_T,
p,
T, REL_TOL_DERIVATIVE);
164 DERIV_TEST(
fp->k_from_p_T,
p,
T, REL_TOL_DERIVATIVE);
165 DERIV_TEST(
fp->p_from_T_v,
T,
v, REL_TOL_DERIVATIVE);
166 DERIV_TEST(
fp->e_from_T_v,
T,
v, REL_TOL_DERIVATIVE);
167 DERIV_TEST(
fp->h_from_T_v,
T,
v, REL_TOL_DERIVATIVE);
168 DERIV_TEST(
fp->s_from_T_v,
T,
v, REL_TOL_DERIVATIVE);
169 DERIV_TEST(
fp->cv_from_T_v,
T,
v, REL_TOL_DERIVATIVE);
170 DERIV_TEST(
fp->e_from_p_rho,
p,
rho, REL_TOL_DERIVATIVE);
177 AD_DERIV_TEST(
fp->rho_from_p_T, p_ad, T_ad, REL_TOL_DERIVATIVE);
178 AD_DERIV_TEST(
fp->v_from_p_T, p_ad, T_ad, REL_TOL_DERIVATIVE);
179 AD_DERIV_TEST(
fp->e_from_p_T, p_ad, T_ad, REL_TOL_DERIVATIVE);
180 AD_DERIV_TEST(
fp->h_from_p_T, p_ad, T_ad, REL_TOL_DERIVATIVE);
181 AD_DERIV_TEST(
fp->s_from_p_T, p_ad, T_ad, REL_TOL_DERIVATIVE);
182 AD_DERIV_TEST(
fp->cp_from_p_T, p_ad, T_ad, REL_TOL_DERIVATIVE);
183 AD_DERIV_TEST(
fp->cv_from_p_T, p_ad, T_ad, REL_TOL_DERIVATIVE);
184 AD_DERIV_TEST(
fp->c_from_p_T, p_ad, T_ad, REL_TOL_DERIVATIVE);
185 AD_DERIV_TEST(
fp->gamma_from_p_T, p_ad, T_ad, REL_TOL_DERIVATIVE);
186 AD_DERIV_TEST(
fp->mu_from_p_T, p_ad, T_ad, REL_TOL_DERIVATIVE);
187 AD_DERIV_TEST(
fp->k_from_p_T, p_ad, T_ad, REL_TOL_DERIVATIVE);
188 AD_DERIV_TEST(
fp->p_from_T_v, T_ad, v_ad, REL_TOL_DERIVATIVE);
189 AD_DERIV_TEST(
fp->e_from_T_v, T_ad, v_ad, REL_TOL_DERIVATIVE);
190 AD_DERIV_TEST(
fp->h_from_T_v, T_ad, v_ad, REL_TOL_DERIVATIVE);
191 AD_DERIV_TEST(
fp->s_from_T_v, T_ad, v_ad, REL_TOL_DERIVATIVE);
192 AD_DERIV_TEST(
fp->cv_from_T_v, T_ad, v_ad, REL_TOL_DERIVATIVE);
193 AD_DERIV_TEST(
fp->e_from_p_rho, p_ad, rho_ad, REL_TOL_DERIVATIVE);
198 const ADReal T_seeded(
T, dT_dT);
199 REL_TEST(
fp->e_from_p_T(p_ad, T_seeded).derivatives()[0],
200 fp->cv_from_p_T(
p,
T),
201 REL_TOL_CONSISTENCY);
208 const auto warnings = flagCount(*_app,
true);
212 _fp_h2o->cp_from_p_T(
p, 250);
213 EXPECT_EQ(flagCount(*_app,
true), warnings);
217 const Real cp = _fp_n2->cp_from_p_T(
p, 250);
218 EXPECT_EQ(flagCount(*_app,
true), warnings + 1);
222 REL_TOL_CONSISTENCY);
223 _fp_h2o->cp_from_p_T(
p, 3600);
224 EXPECT_EQ(flagCount(*_app,
true), warnings + 2);
227 const Real e = _fp_n2->e_from_p_T(
p, 250);
228 const auto warnings_before_inversion = flagCount(*_app,
true);
229 REL_TEST(_fp_n2->T_from_v_e(1, e), 250, REL_TOL_CONSISTENCY);
230 EXPECT_EQ(flagCount(*_app,
true), warnings_before_inversion + 1);
233 const auto errors = flagCount(*_app,
false);
234 _fp_n2->e_from_p_T(
p, -10);
235 EXPECT_EQ(flagCount(*_app,
false), errors + 1);
236 _fp_n2->e_from_p_T(
p, std::numeric_limits<Real>::quiet_NaN());
237 EXPECT_EQ(flagCount(*_app,
false), errors + 2);
242 for (
const auto *
fp : {_fp_h2o, _fp_n2})
245 for (
const auto & [
p,
T] :
246 {std::pair<Real, Real>(1e5, 600.0), std::pair<Real, Real>(3e6, 1500.0)})
248 const Real
v =
fp->v_from_p_T(
p,
T);
249 const Real e =
fp->e_from_p_T(
p,
T);
250 const Real h =
fp->h_from_p_T(
p,
T);
251 const Real s =
fp->s_from_p_T(
p,
T);
253 REL_TEST(
fp->T_from_v_e(
v, e),
T, REL_TOL_CONSISTENCY);
254 REL_TEST(
fp->p_from_v_e(
v, e),
p, REL_TOL_CONSISTENCY);
255 REL_TEST(
fp->c_from_v_e(
v, e),
fp->c_from_p_T(
p,
T), REL_TOL_CONSISTENCY);
256 REL_TEST(
fp->cp_from_v_e(
v, e),
fp->cp_from_p_T(
p,
T), REL_TOL_CONSISTENCY);
257 REL_TEST(
fp->cv_from_v_e(
v, e),
fp->cv_from_p_T(
p,
T), REL_TOL_CONSISTENCY);
258 REL_TEST(
fp->gamma_from_v_e(
v, e),
fp->gamma_from_p_T(
p,
T), REL_TOL_CONSISTENCY);
259 REL_TEST(
fp->s_from_v_e(
v, e), s, REL_TOL_CONSISTENCY);
260 REL_TEST(
fp->g_from_v_e(
v, e), h -
T * s, REL_TOL_CONSISTENCY);
261 REL_TEST(
fp->T_from_p_h(
p, h),
T, REL_TOL_CONSISTENCY);
262 REL_TEST(
fp->s_from_h_p(h,
p), s, REL_TOL_CONSISTENCY);
263 REL_TEST(
fp->p_from_h_s(h, s),
p, REL_TOL_CONSISTENCY);
264 REL_TEST(
fp->e_from_v_h(
v, h), e, REL_TOL_CONSISTENCY);
267 Real value, d_d1, d_d2;
268 fp->s_from_v_e(
v, e, value, d_d1, d_d2);
269 REL_TEST(d_d1,
p /
T, REL_TOL_CONSISTENCY);
270 REL_TEST(d_d2, 1 /
T, REL_TOL_CONSISTENCY);
271 fp->p_from_h_s(h, s, value, d_d1, d_d2);
272 REL_TEST(d_d1, 1 /
v, REL_TOL_CONSISTENCY);
273 REL_TEST(d_d2, -
T /
v, REL_TOL_CONSISTENCY);
281 const Real T_mid = 1000;
282 const Real
v =
fp->v_from_p_T(
p, T_mid);
283 ABS_TEST(
fp->T_from_v_e(
v,
fp->e_from_p_T(
p, T_mid)), T_mid, 1e-3);
284 ABS_TEST(
fp->T_from_p_h(
p,
fp->h_from_p_T(
p, T_mid)), T_mid, 1e-3);
304 for (
const auto & [
fp,
T] : {std::pair<const NASA7IdealGasFluidProperties *, Real>(_fp_h2o, 700),
305 std::pair<const NASA7IdealGasFluidProperties *, Real>(_fp_n2, 1500)})
308 const Real
v =
fp->v_from_p_T(
p,
T);
309 const Real e =
fp->e_from_p_T(
p,
T);
310 const Real h =
fp->h_from_p_T(
p,
T);
311 const Real s =
fp->s_from_p_T(
p,
T);
313 DERIV_TEST(
fp->T_from_v_e,
v, e, REL_TOL_DERIVATIVE);
314 DERIV_TEST(
fp->p_from_v_e,
v, e, REL_TOL_DERIVATIVE);
315 DERIV_TEST(
fp->c_from_v_e,
v, e, REL_TOL_DERIVATIVE);
316 DERIV_TEST(
fp->cp_from_v_e,
v, e, REL_TOL_DERIVATIVE);
317 DERIV_TEST(
fp->cv_from_v_e,
v, e, REL_TOL_DERIVATIVE);
318 DERIV_TEST(
fp->gamma_from_v_e,
v, e, REL_TOL_DERIVATIVE);
319 DERIV_TEST(
fp->s_from_v_e,
v, e, REL_TOL_DERIVATIVE);
320 DERIV_TEST(
fp->g_from_v_e,
v, e, REL_TOL_DERIVATIVE);
321 DERIV_TEST(
fp->mu_from_v_e,
v, e, REL_TOL_DERIVATIVE);
322 DERIV_TEST(
fp->k_from_v_e,
v, e, REL_TOL_DERIVATIVE);
323 DERIV_TEST(
fp->T_from_p_h,
p, h, REL_TOL_DERIVATIVE);
324 DERIV_TEST(
fp->s_from_h_p, h,
p, REL_TOL_DERIVATIVE);
325 DERIV_TEST(
fp->p_from_h_s, h, s, REL_TOL_DERIVATIVE);
326 DERIV_TEST(
fp->e_from_v_h,
v, h, REL_TOL_DERIVATIVE);
334 AD_DERIV_TEST(
fp->T_from_v_e, v_ad, e_ad, REL_TOL_DERIVATIVE);
335 AD_DERIV_TEST(
fp->p_from_v_e, v_ad, e_ad, REL_TOL_DERIVATIVE);
336 AD_DERIV_TEST(
fp->c_from_v_e, v_ad, e_ad, REL_TOL_DERIVATIVE);
337 AD_DERIV_TEST(
fp->cp_from_v_e, v_ad, e_ad, REL_TOL_DERIVATIVE);
338 AD_DERIV_TEST(
fp->cv_from_v_e, v_ad, e_ad, REL_TOL_DERIVATIVE);
339 AD_DERIV_TEST(
fp->gamma_from_v_e, v_ad, e_ad, REL_TOL_DERIVATIVE);
340 AD_DERIV_TEST(
fp->s_from_v_e, v_ad, e_ad, REL_TOL_DERIVATIVE);
341 AD_DERIV_TEST(
fp->g_from_v_e, v_ad, e_ad, REL_TOL_DERIVATIVE);
342 AD_DERIV_TEST(
fp->mu_from_v_e, v_ad, e_ad, REL_TOL_DERIVATIVE);
343 AD_DERIV_TEST(
fp->k_from_v_e, v_ad, e_ad, REL_TOL_DERIVATIVE);
344 AD_DERIV_TEST(
fp->T_from_p_h, p_ad, h_ad, REL_TOL_DERIVATIVE);
345 AD_DERIV_TEST(
fp->s_from_h_p, h_ad, p_ad, REL_TOL_DERIVATIVE);
346 AD_DERIV_TEST(
fp->p_from_h_s, h_ad, s_ad, REL_TOL_DERIVATIVE);
347 AD_DERIV_TEST(
fp->e_from_v_h, v_ad, h_ad, REL_TOL_DERIVATIVE);
352 const ADReal e_seeded(e, de_de);
353 REL_TEST(
fp->T_from_v_e(v_ad, e_seeded).derivatives()[0],
354 1 /
fp->cv_from_p_T(
p,
T),
355 REL_TOL_CONSISTENCY);
398 std::vector<Real> temperatures;
402 const std::vector<Reference> references = {
403 {
"N2",
"NitrogenFluidProperties", {300, 600, 900}, 0.015, 0.06},
404 {
"H2",
"HydrogenFluidProperties", {300, 600, 900}, 0.06, 0.07},
405 {
"CH4",
"MethaneFluidProperties", {300, 600, 900}, 0.03, 0.08},
406 {
"CO2",
"CO2FluidProperties", {300, 600, 900}, 0.01, 0.09},
407 {
"H2O",
"Water97FluidProperties", {400, 700, 1100}, 0.01, 0.02}};
409 for (
const auto & ref : references)
411 const auto &
fp = buildFluidProperties(ref.species,
"transport_" + ref.species);
413 _fe_problem->addUserObject(ref.type,
"reference_" + ref.species, params);
414 const auto & reference =
416 for (
const auto T : ref.temperatures)
418 const Real
mu =
fp.mu_from_p_T(
p,
T);
419 const Real k =
fp.k_from_p_T(
p,
T);
420 REL_TEST(
mu, reference.mu_from_p_T(
p,
T), ref.mu_tol);
421 REL_TEST(k, reference.k_from_p_T(
p,
T), ref.k_tol);
424 const Real
v =
fp.v_from_p_T(
p,
T);
425 const Real e =
fp.e_from_p_T(
p,
T);
426 REL_TEST(
fp.mu_from_v_e(
v, e),
mu, REL_TOL_CONSISTENCY);
427 REL_TEST(
fp.k_from_v_e(
v, e), k, REL_TOL_CONSISTENCY);
455 const unsigned int n = 60;
456 for (
const std::string species : {
"H2",
"O2",
"H2O",
"CH4",
"CO",
"CO2",
"N2"})
458 const auto &
fp = buildFluidProperties(species,
"entropy_" + species);
460 const Real T_low = data.T_min / 2;
461 const Real T_high = 1.5 * data.T_max;
462 for (
const Real
p : {1e3, 1e7})
463 for (
const auto i : make_range(n + 1))
465 const Real
T = T_low * std::pow(T_high / T_low, Real(i) / n);
467 fp.rho_from_p_s(
p,
fp.s_from_p_T(
p,
T)),
fp.rho_from_p_T(
p,
T), REL_TOL_CONSISTENCY);
472 for (
const auto & [
fp,
T] : {std::pair<const NASA7IdealGasFluidProperties *, Real>(_fp_h2o, 700),
473 std::pair<const NASA7IdealGasFluidProperties *, Real>(_fp_n2, 1500)})
476 const Real s =
fp->s_from_p_T(
p,
T);
477 DERIV_TEST(
fp->rho_from_p_s,
p, s, REL_TOL_DERIVATIVE);
480 AD_DERIV_TEST(
fp->rho_from_p_s, p_ad, s_ad, REL_TOL_DERIVATIVE);
484 Real
rho, drho_dp, drho_ds;
485 fp->rho_from_p_s(
p, s,
rho, drho_dp, drho_ds);
486 REL_TEST(drho_ds, -
rho /
fp->cp_from_p_T(
p,
T), REL_TOL_CONSISTENCY);