19 std::vector<Real> T = {100, 200, 300, 400, 500};
20 std::vector<Real> e = {1825110, 5272540, 10342290, 17034360, 25348750};
21 std::vector<Real> T2 = {100, 500};
22 std::vector<Real>
mu = {1, 6};
23 std::vector<Real>
k = {11, 1};
25 InputParameters e_fn_params = _factory.getValidParams(
"PiecewiseLinear");
26 e_fn_params.
set<std::vector<Real>>(
"x") = T;
27 e_fn_params.
set<std::vector<Real>>(
"y") = e;
28 _fe_problem->addFunction(
"PiecewiseLinear",
"e_fn", e_fn_params);
30 InputParameters mu_fn_params = _factory.getValidParams(
"PiecewiseLinear");
31 mu_fn_params.
set<std::vector<Real>>(
"x") = T2;
32 mu_fn_params.
set<std::vector<Real>>(
"y") =
mu;
33 _fe_problem->addFunction(
"PiecewiseLinear",
"mu_fn", mu_fn_params);
35 InputParameters k_fn_params = _factory.getValidParams(
"PiecewiseLinear");
36 k_fn_params.
set<std::vector<Real>>(
"x") = T2;
37 k_fn_params.
set<std::vector<Real>>(
"y") =
k;
38 _fe_problem->addFunction(
"PiecewiseLinear",
"k_fn", k_fn_params);
40 InputParameters uo_pars = _factory.getValidParams(
"CaloricallyImperfectGas");
41 uo_pars.
set<
Real>(
"molar_mass") = 0.002;
42 uo_pars.
set<FunctionName>(
"e") =
"e_fn";
43 uo_pars.
set<FunctionName>(
"mu") =
"mu_fn";
44 uo_pars.
set<FunctionName>(
"k") =
"k_fn";
45 uo_pars.
set<
Real>(
"min_temperature") = 100.0;
46 uo_pars.
set<
Real>(
"max_temperature") = 500.0;
47 uo_pars.
set<
Real>(
"temperature_resolution") = 0.01;
48 _fe_problem->addUserObject(
"CaloricallyImperfectGas",
"fp", uo_pars);
55 unsigned int np = 200;
56 Real dT = (max_T - min_T) / ((
Real)np - 1.0);
57 Real Ru = 8.31446261815324;
62 for (
unsigned int j = 1;
j < np - 1; ++
j)
64 Real T = min_T +
j * dT;
66 const Real rho =
fp->rho_from_p_T(p, T);
67 const Real v = 1.0 / rho;
68 Real h =
fp->h_from_p_T(p, T);
69 Real e =
fp->e_from_p_T(p, T);
74 Real s =
fp->s_from_p_T(p, T);
77 REL_TEST(
fp->rho_from_p_s(p, s), rho, 10.0 * REL_TOL_CONSISTENCY);
80 REL_TEST(
fp->e_from_v_h(
v, h), e, 10.0 * REL_TOL_CONSISTENCY);
81 REL_TEST(
fp->e_from_p_rho(p, rho), e, 10.0 * REL_TOL_CONSISTENCY);
82 REL_TEST(
fp->e_from_T_v(T,
v), e, 10.0 * REL_TOL_CONSISTENCY);
85 REL_TEST(
fp->cv_from_T_v(T,
v),
cv, 10.0 * REL_TOL_CONSISTENCY);
86 REL_TEST(
fp->cv_from_v_e(
v, e),
cv, 10.0 * REL_TOL_CONSISTENCY);
89 REL_TEST(
fp->cp_from_v_e(
v, e),
cp, 10.0 * REL_TOL_CONSISTENCY);
92 REL_TEST(
fp->h_from_T_v(T,
v), h, 10.0 * REL_TOL_CONSISTENCY);
95 REL_TEST(
fp->p_from_v_e(
v, e), p, 10.0 * REL_TOL_CONSISTENCY);
96 REL_TEST(
fp->p_from_T_v(T,
v), p, 10.0 * REL_TOL_CONSISTENCY);
99 REL_TEST(
fp->T_from_p_h(p, h), T, 10.0 * REL_TOL_CONSISTENCY);
100 REL_TEST(
fp->T_from_v_e(
v, e), T, 10.0 * REL_TOL_CONSISTENCY);
103 REL_TEST(
fp->k_from_v_e(
v, e),
k, 10.0 * REL_TOL_CONSISTENCY);
106 REL_TEST(
fp->mu_from_v_e(
v, e),
mu, 10.0 * REL_TOL_CONSISTENCY);
112 for (
unsigned int j = 1;
j < np - 1; ++
j)
114 Real T = min_T +
j * dT;
116 const Real rho =
fp->rho_from_p_T(p, T);
117 const Real v = 1.0 / rho;
118 Real e =
fp->e_from_p_T(p, T);
124 ADReal ad_p =
fp->p_from_v_e(ad_v, ad_e);
128 ADReal ad_T =
fp->T_from_v_e(ad_v, ad_e);
133 ADReal ad_rho =
fp->rho_from_p_T(ad_p, ad_T);
142 fp->gamma_from_p_T(ad_p, ad_T),
153 Real e = 10342290 * 0.75 + 17034360 * 0.25;
154 Real h = e + p /
fp->rho_from_p_T(p, T);
157 REL_TEST(h,
fp->h_from_p_T(p, T), 1e-5);
158 REL_TEST(e,
fp->e_from_p_T(p, T), 1e-5);
159 REL_TEST(e,
fp->e_from_v_h(
v, h), 1e-5);
166 Real cv = (17034360.0 - 10342290.0) / 100.0;
168 REL_TEST(
cp,
fp->cp_from_p_T(p, T), 1e-5);
169 REL_TEST(
cv,
fp->cv_from_p_T(p, T), 1e-5);
172 Real e =
fp->e_from_p_T(p, T);
173 REL_TEST(
cp,
fp->cp_from_v_e(
v, e), 1e-5);
174 REL_TEST(
cv,
fp->cv_from_v_e(
v, e), 1e-5);
181 REL_TEST(
fp->mu_from_p_T(p, T), 2.875, 1e-5);
182 REL_TEST(
fp->k_from_p_T(p, T), 7.25, 1e-5);
185 Real e =
fp->e_from_p_T(p, T);
186 REL_TEST(
fp->mu_from_v_e(
v, e), 2.875, 0.001);
187 REL_TEST(
fp->k_from_v_e(
v, e), 7.25, 0.001);
190 fp->mu_from_p_T(p, T,
mu, dmu_dp, dmu_dT);
191 REL_TEST(dmu_dT, 0.0125, 1e-5);
193 Real k, dk_dp, dk_dT;
194 fp->k_from_p_T(p, T,
k, dk_dp, dk_dT);
195 REL_TEST(dk_dT, -0.025, 1e-5);
199 fp->mu_from_v_e(
v, e,
mu, dmu_dv, dmu_de);
200 REL_TEST(dmu_de, 0.0125 /
cv, 0.001);
203 fp->k_from_v_e(
v, e,
k, dk_dv, dk_de);
204 REL_TEST(dk_de, -0.025 /
cv, 0.001);
211 Real e = 10342290 * 0.75 + 17034360 * 0.25;
212 Real h = e + p /
fp->rho_from_p_T(p, T);
217 Real s =
fp->s_from_p_T(p, T);
220 Real gamma =
fp->gamma_from_p_T(p, T);
221 Real ssound =
fp->c_from_p_T(p, T);
226 fp->p_from_v_e(
v, e,
a,
b,
c);
228 DERIV_TEST_CUSTOM_PERTURBATION(
fp->p_from_v_e,
v, e, 1e-4, 1e-4);
233 fp->T_from_v_e(
v, e,
a,
b,
c);
235 DERIV_TEST_CUSTOM_PERTURBATION(
fp->T_from_v_e,
v, e, 1e-4, 1e-4);
240 fp->cp_from_v_e(
v, e,
a,
b,
c);
242 DERIV_TEST_CUSTOM_PERTURBATION(
fp->cp_from_v_e,
v, e, 1e-4, 1e-4);
247 fp->cv_from_v_e(
v, e,
a,
b,
c);
249 DERIV_TEST_CUSTOM_PERTURBATION(
fp->cv_from_v_e,
v, e, 1e-4, 1e-4);
254 fp->mu_from_v_e(
v, e,
a,
b,
c);
256 DERIV_TEST_CUSTOM_PERTURBATION(
fp->mu_from_v_e,
v, e, 1e-4, 1e-4);
261 fp->k_from_v_e(
v, e,
a,
b,
c);
263 DERIV_TEST_CUSTOM_PERTURBATION(
fp->k_from_v_e,
v, e, 1e-4, 1e-4);
268 fp->s_from_v_e(
v, e,
a,
b,
c);
270 DERIV_TEST_CUSTOM_PERTURBATION(
fp->s_from_v_e,
v, e, 1e-4, 1e-4);
275 fp->s_from_p_T(p, T,
a,
b,
c);
277 DERIV_TEST_CUSTOM_PERTURBATION(
fp->s_from_p_T, p, T, 1e-4, 1e-4);
282 fp->s_from_h_p(h, p,
a,
b,
c);
284 DERIV_TEST_CUSTOM_PERTURBATION(
fp->s_from_h_p, h, p, 1e-4, 1e-4);
289 fp->e_from_v_h(
v, h,
a,
b,
c);
291 DERIV_TEST_CUSTOM_PERTURBATION(
fp->e_from_v_h,
v, h, 1e-4, 1e-4);
296 fp->rho_from_p_T(p, T,
a,
b,
c);
297 REL_TEST(
a, rho,
tol);
298 DERIV_TEST_CUSTOM_PERTURBATION(
fp->rho_from_p_T, p, T, 1e-4, 1e-4);
303 fp->e_from_p_rho(p, rho,
a,
b,
c);
305 DERIV_TEST_CUSTOM_PERTURBATION(
fp->e_from_p_rho, p, rho, 1e-4, 1e-4);
310 fp->e_from_T_v(T,
v,
a,
b,
c);
312 DERIV_TEST_CUSTOM_PERTURBATION(
fp->e_from_T_v, T,
v, 1e-4, 1e-4);
317 fp->p_from_T_v(T,
v,
a,
b,
c);
319 DERIV_TEST_CUSTOM_PERTURBATION(
fp->p_from_T_v, T,
v, 1e-4, 1e-4);
324 fp->h_from_T_v(T,
v,
a,
b,
c);
326 DERIV_TEST_CUSTOM_PERTURBATION(
fp->h_from_T_v, T,
v, 1e-4, 1e-4);
331 fp->s_from_T_v(T,
v,
a,
b,
c);
333 DERIV_TEST_CUSTOM_PERTURBATION(
fp->s_from_T_v, T,
v, 1e-4, 1e-4);
338 fp->h_from_p_T(p, T,
a,
b,
c);
340 DERIV_TEST_CUSTOM_PERTURBATION(
fp->h_from_p_T, p, T, 1e-4, 1e-4);
345 fp->e_from_p_T(p, T,
a,
b,
c);
347 DERIV_TEST_CUSTOM_PERTURBATION(
fp->e_from_p_T, p, T, 1e-4, 1e-4);
352 fp->T_from_p_h(p, h,
a,
b,
c);
354 DERIV_TEST_CUSTOM_PERTURBATION(
fp->T_from_p_h, p, h, 1e-4, 1e-4);
359 fp->cv_from_p_T(p, T,
a,
b,
c);
361 DERIV_TEST_CUSTOM_PERTURBATION(
fp->cv_from_p_T, p, T, 1e-4, 1e-4);
366 fp->cp_from_p_T(p, T,
a,
b,
c);
368 DERIV_TEST_CUSTOM_PERTURBATION(
fp->cp_from_p_T, p, T, 1e-4, 1e-4);
373 fp->mu_from_p_T(p, T,
a,
b,
c);
375 DERIV_TEST_CUSTOM_PERTURBATION(
fp->mu_from_p_T, p, T, 1e-4, 1e-4);
380 fp->k_from_p_T(p, T,
a,
b,
c);
382 DERIV_TEST_CUSTOM_PERTURBATION(
fp->k_from_p_T, p, T, 1e-4, 1e-4);
387 fp->gamma_from_p_T(p, T,
a,
b,
c);
388 REL_TEST(
a, gamma,
tol);
389 DERIV_TEST_CUSTOM_PERTURBATION(
fp->gamma_from_p_T, p, T, 1e-4, 1e-4);
394 fp->gamma_from_v_e(
v, e,
a,
b,
c);
395 REL_TEST(
a, gamma,
tol);
396 DERIV_TEST_CUSTOM_PERTURBATION(
fp->gamma_from_v_e,
v, e, 1e-4, 1e-4);
401 fp->c_from_v_e(
v, e,
a,
b,
c);
402 REL_TEST(
a, ssound,
tol);
403 DERIV_TEST_CUSTOM_PERTURBATION(
fp->c_from_v_e,
v, e, 1e-4, 1e-4);
408 fp->c_from_p_T(p, T,
a,
b,
c);
409 REL_TEST(
a, ssound,
tol);
410 DERIV_TEST_CUSTOM_PERTURBATION(
fp->c_from_p_T, p, T, 1e-4, 1e-4);
417 Real Z = 0.5 * (80459 + 80460.7);
419 const Real rho =
fp->rho_from_p_T(p, T);
420 const Real v = 1.0 / rho;
422 Real e =
fp->e_from_p_T(p, T);
423 Real h =
fp->h_from_p_T(p, T);
424 Real s =
Z + Rs * std::log(
v / v0);
426 REL_TEST(
fp->s_from_p_T(p, T), s, 1e-6);
427 REL_TEST(
fp->s_from_v_e(
v, e), s, 1e-6);
428 REL_TEST(
fp->s_from_h_p(h, p), s, 1e-6);
429 REL_TEST(
fp->s_from_T_v(T,
v), s, 1e-6);
433 Real s_alt, ds_dp, ds_dT;
434 fp->s_from_p_T(p, T, s_alt, ds_dp, ds_dT);
435 REL_TEST(s_alt, s, 1e-5);
436 DERIV_TEST_CUSTOM_PERTURBATION(
fp->s_from_p_T, p, T, 1e-4, 1e-4);
441 Real s_alt, ds_dv, ds_de;
442 fp->s_from_v_e(
v, e, s_alt, ds_dv, ds_de);
443 REL_TEST(s_alt, s, 1e-5);
444 DERIV_TEST_CUSTOM_PERTURBATION(
fp->s_from_v_e,
v, e, 1e-4, 1e-4);
449 Real s_alt, ds_dh, ds_dp;
450 fp->s_from_h_p(h, p, s_alt, ds_dh, ds_dp);
451 REL_TEST(s_alt, s, 1e-5);
452 DERIV_TEST_CUSTOM_PERTURBATION(
fp->s_from_h_p, h, p, 1e-4, 1e-4);
460 fp->cp_from_p_T(1.0e6, 600.0);
463 catch (
const std::exception &
err)
465 std::size_t pos = std::string(
err.what()).find(
"which is outside of the bounds of");
466 ASSERT_TRUE(pos != std::string::npos);
471 fp->cp_from_p_T(1.0e6, 99.0);
474 catch (
const std::exception &
err)
476 std::size_t pos = std::string(
err.what()).find(
"which is outside of the bounds of");
477 ASSERT_TRUE(pos != std::string::npos);
486 std::vector<Real> T = {100, 200, 300, 400, 500};
487 std::vector<Real> bad_e = {2859400, 8578200, 17156400, 8578200, 42891000};
488 InputParameters bad_e_fn_params = _factory.getValidParams(
"PiecewiseLinear");
489 bad_e_fn_params.
set<std::vector<Real>>(
"x") = T;
490 bad_e_fn_params.
set<std::vector<Real>>(
"y") = bad_e;
491 _fe_problem->addFunction(
"PiecewiseLinear",
"bad_e_fn", bad_e_fn_params);
493 InputParameters uo_pars_bad_e_fn = _factory.getValidParams(
"CaloricallyImperfectGas");
494 uo_pars_bad_e_fn.
set<
Real>(
"molar_mass") = 0.002;
495 uo_pars_bad_e_fn.
set<FunctionName>(
"e") =
"bad_e_fn";
496 uo_pars_bad_e_fn.
set<FunctionName>(
"mu") =
"default_fn";
497 uo_pars_bad_e_fn.
set<FunctionName>(
"k") =
"default_fn";
498 uo_pars_bad_e_fn.
set<
Real>(
"min_temperature") = 100.0;
499 uo_pars_bad_e_fn.
set<
Real>(
"max_temperature") = 500.0;
500 _fe_problem->addUserObject(
"CaloricallyImperfectGas",
"fp_bad_e_fn", uo_pars_bad_e_fn);
508 catch (
const std::exception &
err)
510 std::size_t pos = std::string(
err.what()).find(
"e(T) is not monotonically increasing with T");
511 ASSERT_TRUE(pos != std::string::npos);
519 std::vector<Real> e = {1825110, 5272540, 10342290, 17034360, 25348750};
520 std::vector<Real> bad_T = {150, 200, 300, 400, 500};
521 InputParameters bad_e_fn_params2 = _factory.getValidParams(
"PiecewiseLinear");
522 bad_e_fn_params2.
set<std::vector<Real>>(
"x") = bad_T;
523 bad_e_fn_params2.
set<std::vector<Real>>(
"y") = e;
524 _fe_problem->addFunction(
"PiecewiseLinear",
"bad_e_fn2", bad_e_fn_params2);
526 InputParameters uo_pars_bad_e_fn2 = _factory.getValidParams(
"CaloricallyImperfectGas");
527 uo_pars_bad_e_fn2.
set<
Real>(
"molar_mass") = 0.002;
528 uo_pars_bad_e_fn2.
set<FunctionName>(
"e") =
"bad_e_fn2";
529 uo_pars_bad_e_fn2.
set<FunctionName>(
"mu") =
"default_fn";
530 uo_pars_bad_e_fn2.
set<FunctionName>(
"k") =
"default_fn";
531 uo_pars_bad_e_fn2.
set<
Real>(
"min_temperature") = 100.0;
532 uo_pars_bad_e_fn2.
set<
Real>(
"max_temperature") = 500.0;
533 _fe_problem->addUserObject(
"CaloricallyImperfectGas",
"fp_bad_e_fn2", uo_pars_bad_e_fn2);
541 catch (
const std::exception &
err)
543 std::size_t pos = std::string(
err.what()).find(
"e(T) is not monotonically increasing with T");
544 ASSERT_TRUE(pos != std::string::npos);
553 InputParameters ideal_uo_pars = _factory.getValidParams(
"IdealGasFluidProperties");
554 ideal_uo_pars.
set<
Real>(
"molar_mass") = 0.002;
555 ideal_uo_pars.
set<
Real>(
"gamma") = 1.41;
556 _fe_problem->addUserObject(
"IdealGasFluidProperties",
"ideal_fp", ideal_uo_pars);
559 Real Ru = 8.31446261815324;
560 Real Rs = Ru / 0.002;
562 Real cp_val = gamma / (gamma - 1) * Rs;
563 Real cv_val = cp_val / gamma;
564 std::vector<Real> temps = {0.0, 500.0};
565 std::vector<Real> internal_energies = {0.0, 500.0 * cv_val};
567 InputParameters lin_e_fn_params = _factory.getValidParams(
"PiecewiseLinear");
568 lin_e_fn_params.
set<std::vector<Real>>(
"x") = temps;
569 lin_e_fn_params.
set<std::vector<Real>>(
"y") = internal_energies;
570 _fe_problem->addFunction(
"PiecewiseLinear",
"lin_e_fn", lin_e_fn_params);
572 InputParameters compare_uo_pars = _factory.getValidParams(
"CaloricallyImperfectGas");
573 compare_uo_pars.
set<
Real>(
"molar_mass") = 0.002;
574 compare_uo_pars.
set<FunctionName>(
"e") =
"lin_e_fn";
575 compare_uo_pars.
set<FunctionName>(
"mu") =
"default_fn";
576 compare_uo_pars.
set<FunctionName>(
"k") =
"default_fn";
577 compare_uo_pars.
set<
Real>(
"min_temperature") = 100.0;
578 compare_uo_pars.
set<
Real>(
"max_temperature") = 500.0;
579 _fe_problem->addUserObject(
"CaloricallyImperfectGas",
"compare_fp", compare_uo_pars);
589 Real v = ideal->v_from_p_T(p, T);
604 REL_TEST(ideal->
e_from_p_rho(p, rho), compare_with_ideal->e_from_p_rho(p, rho), 1e-5);
613 Real v = ideal->v_from_p_T(p, T);
615 Real c = 0, dc_dv = 0, dc_de = 0;
617 Real c2 = 0, dc_dv2 = 0, dc_de2 = 0;
618 compare_with_ideal->
c_from_v_e(
v, e, c2, dc_dv2, dc_de2);
619 REL_TEST(dc_dv, dc_dv2, 1e-5);
620 REL_TEST(dc_de, dc_de2, 1e-5);
625 Real v = ideal->v_from_p_T(p, T);
627 Real pp = 0, dp_dv = 0, dp_de = 0;
629 Real pp2 = 0, dp_dv2 = 0, dp_de2 = 0;
630 compare_with_ideal->
p_from_v_e(
v, e, pp2, dp_dv2, dp_de2);
631 REL_TEST(dp_dv, dp_dv2, 1e-5);
632 REL_TEST(dp_de, dp_de2, 1e-5);
637 Real v = ideal->v_from_p_T(p, T);
639 Real TT = 0, dT_dv = 0, dT_de = 0;
641 Real TT2 = 0, dT_dv2 = 0, dT_de2 = 0;
642 compare_with_ideal->
T_from_v_e(
v, e, TT2, dT_dv2, dT_de2);
643 REL_TEST(dT_dv, dT_dv2, 1e-5);
644 REL_TEST(dT_de, dT_de2, 1e-5);
649 Real v = ideal->v_from_p_T(p, T);
651 Real ee = 0, de_dv = 0, de_dh = 0;
653 Real ee2 = 0, de_dv2 = 0, de_dh2 = 0;
654 compare_with_ideal->
e_from_v_h(
v, h, ee2, de_dv2, de_dh2);
655 REL_TEST(de_dv, de_dv2, 1e-5);
656 REL_TEST(de_dh, de_dh2, 1e-5);
static const std::string cv
virtual Real cv_from_p_T(Real p, Real T) const override
A calorically imperfect gas fluid property class This fluid property assumes that internal energy is ...
virtual Real rho_from_p_T(Real p, Real T) const override
virtual Real e_from_v_h(Real v, Real h) const override
virtual Real cv_from_v_e(Real v, Real e) const override
virtual Real cp_from_p_T(Real p, Real T) const override
virtual Real gamma_from_v_e(Real v, Real e) const override
virtual Real e_from_v_h(Real v, Real h) const override
virtual Real p_from_v_e(Real v, Real e) const override
virtual Real T_from_v_e(Real v, Real e) const override
virtual Real e_from_T_v(Real T, Real v) const override
DualNumber< Real, DNDerivativeType, true > ADReal
virtual Real cv_from_v_e(Real v, Real e) const override
static const std::string cp
virtual Real e_from_p_rho(Real p, Real rho) const override
virtual Real T_from_v_e(Real v, Real e) const override
static const std::string mu
virtual Real p_from_T_v(Real T, Real v) const override
virtual Real gamma_from_v_e(Real v, Real e) const override
virtual Real c_from_p_T(Real p, Real T) const override
virtual Real e_from_p_T(Real p, Real T) const override
virtual Real e_from_T_v(Real T, Real v) const override
TEST_F(CaloricallyImperfectGasTest, testAll)
Verify that the fluid name is correctly returned.
virtual Real cp_from_v_e(Real v, Real e) const override
virtual Real rho_from_p_T(Real p, Real T) const override
virtual Real c_from_v_e(Real v, Real e) const override
const T & getUserObject(const std::string ¶m_name, bool is_dependency=true) const
virtual Real h_from_p_T(Real p, Real T) const override
virtual Real p_from_T_v(Real T, Real v) const override
static const std::string Z
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::string v
virtual Real e_from_p_T(Real p, Real T) const override
virtual Real p_from_v_e(Real v, Real e) const override
virtual Real cp_from_v_e(Real v, Real e) const override
virtual Real cp_from_p_T(Real p, Real T) const override
virtual Real c_from_v_e(Real v, Real e) const override
virtual Real gamma_from_p_T(Real p, Real T) const override
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
virtual Real h_from_p_T(Real p, Real T) const override
Ideal gas fluid properties Default parameters are for air at atmospheric pressure and temperature...
virtual Real gamma_from_p_T(Real p, Real T) const override
static const std::string k
virtual Real cv_from_p_T(Real p, Real T) const override
virtual Real c_from_p_T(Real p, Real T) const override