Line data Source code
1 : //* This file is part of the MOOSE framework
2 : //* https://mooseframework.inl.gov
3 : //*
4 : //* All rights reserved, see COPYRIGHT for full restrictions
5 : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 : //*
7 : //* Licensed under LGPL 2.1, please see LICENSE for details
8 : //* https://www.gnu.org/licenses/lgpl-2.1.html
9 :
10 : #pragma once
11 :
12 : #include "SinglePhaseFluidProperties.h"
13 : #include "NaNInterface.h"
14 : #include "Function.h"
15 :
16 : #pragma GCC diagnostic push
17 : #pragma GCC diagnostic ignored "-Woverloaded-virtual"
18 :
19 : /**
20 : * A calorically imperfect gas fluid property class
21 : * This fluid property assumes that internal energy is
22 : * a general monotonic function of temperature; behaves
23 : * like an ideal gas otherwise. In particular, it assumes:
24 : * p v = R_s T
25 : */
26 : class CaloricallyImperfectGas : public SinglePhaseFluidProperties, public NaNInterface
27 : {
28 : public:
29 : static InputParameters validParams();
30 :
31 : CaloricallyImperfectGas(const InputParameters & parameters);
32 :
33 : virtual void initialSetup() override;
34 :
35 : virtual Real p_from_v_e(Real v, Real e) const override;
36 : virtual ADReal p_from_v_e(const ADReal & v, const ADReal & e) const override;
37 : virtual void p_from_v_e(Real v, Real e, Real & p, Real & dp_dv, Real & dp_de) const override;
38 : virtual Real T_from_v_e(Real v, Real e) const override;
39 : virtual ADReal T_from_v_e(const ADReal & v, const ADReal & e) const override;
40 : virtual void T_from_v_e(Real v, Real e, Real & T, Real & dT_dv, Real & dT_de) const override;
41 :
42 : virtual Real cp_from_v_e(Real v, Real e) const override;
43 : virtual void cp_from_v_e(Real v, Real e, Real & cp, Real & dcp_dv, Real & dcp_de) const override;
44 : virtual Real cv_from_v_e(Real v, Real e) const override;
45 : virtual ADReal cv_from_v_e(ADReal v, ADReal e) const;
46 : virtual void cv_from_v_e(Real v, Real e, Real & cv, Real & dcv_dv, Real & dcv_de) const override;
47 : virtual Real mu_from_v_e(Real v, Real e) const override;
48 : virtual void mu_from_v_e(Real v, Real e, Real & mu, Real & dmu_dv, Real & dmu_de) const override;
49 : virtual Real k_from_v_e(Real v, Real e) const override;
50 : virtual void k_from_v_e(Real v, Real e, Real & k, Real & dk_dv, Real & dk_de) const override;
51 : virtual Real s_from_v_e(Real v, Real e) const override;
52 : virtual void s_from_v_e(Real v, Real e, Real & s, Real & ds_dv, Real & ds_de) const override;
53 : virtual Real s_from_p_T(Real p, Real T) const override;
54 : virtual void s_from_p_T(Real p, Real T, Real & s, Real & ds_dp, Real & ds_dT) const override;
55 : virtual Real s_from_h_p(Real h, Real p) const override;
56 : virtual void s_from_h_p(Real h, Real p, Real & s, Real & ds_dh, Real & ds_dp) const override;
57 : virtual Real rho_from_p_s(Real p, Real s) const override;
58 : virtual Real e_from_v_h(Real v, Real h) const override;
59 : virtual void e_from_v_h(Real v, Real h, Real & e, Real & de_dv, Real & de_dh) const override;
60 : virtual Real rho_from_p_T(Real p, Real T) const override;
61 : virtual ADReal rho_from_p_T(const ADReal & p, const ADReal & T) const override;
62 : virtual void
63 : rho_from_p_T(Real p, Real T, Real & rho, Real & drho_dp, Real & drho_dT) const override;
64 : virtual void rho_from_p_T(const ADReal & p,
65 : const ADReal & T,
66 : ADReal & rho,
67 : ADReal & drho_dp,
68 : ADReal & drho_dT) const override;
69 : propfuncWithDefinitionOverride(e, p, rho);
70 : virtual Real e_from_T_v(Real T, Real v) const override;
71 : virtual void e_from_T_v(Real T, Real v, Real & e, Real & de_dT, Real & de_dv) const override;
72 : virtual ADReal e_from_T_v(const ADReal & T, const ADReal & v) const override;
73 : virtual Real p_from_T_v(Real T, Real v) const override;
74 : virtual void p_from_T_v(Real T, Real v, Real & p, Real & dp_dT, Real & dp_dv) const override;
75 : virtual Real h_from_T_v(Real T, Real v) const override;
76 : virtual void h_from_T_v(Real T, Real v, Real & h, Real & dh_dT, Real & dh_dv) const override;
77 : virtual Real s_from_T_v(Real T, Real v) const override;
78 : virtual void s_from_T_v(Real T, Real v, Real & s, Real & ds_dT, Real & ds_dv) const override;
79 : virtual Real cv_from_T_v(Real T, Real v) const override;
80 : virtual Real e_spndl_from_v(Real v) const override;
81 : virtual void v_e_spndl_from_T(Real T, Real & v, Real & e) const override;
82 : virtual Real h_from_p_T(Real p, Real T) const override;
83 : virtual void h_from_p_T(Real p, Real T, Real & h, Real & dh_dp, Real & dh_dT) const override;
84 : virtual Real e_from_p_T(Real p, Real T) const override;
85 : virtual ADReal e_from_p_T(ADReal p, ADReal T) const;
86 : virtual void e_from_p_T(Real p, Real T, Real & e, Real & de_dp, Real & de_dT) const override;
87 : virtual Real T_from_p_h(Real p, Real h) const override;
88 : virtual void T_from_p_h(Real p, Real h, Real & T, Real & dT_dp, Real & dT_dh) const override;
89 : virtual Real cv_from_p_T(Real p, Real T) const override;
90 : virtual void cv_from_p_T(Real p, Real T, Real & cv, Real & dcv_dp, Real & dcv_dT) const override;
91 : virtual Real cp_from_p_T(Real p, Real T) const override;
92 : virtual void cp_from_p_T(Real p, Real T, Real & cp, Real & dcp_dp, Real & dcp_dT) const override;
93 : virtual Real mu_from_p_T(Real p, Real T) const override;
94 : virtual void mu_from_p_T(Real p, Real T, Real & mu, Real & dmu_dp, Real & dmu_dT) const override;
95 : virtual Real k_from_p_T(Real pressure, Real temperature) const override;
96 : virtual void
97 : k_from_p_T(Real pressure, Real temperature, Real & k, Real & dk_dp, Real & dk_dT) const override;
98 : virtual std::string fluidName() const override;
99 : virtual Real molarMass() const override;
100 : virtual Real criticalTemperature() const override;
101 : virtual Real criticalDensity() const override;
102 : virtual Real criticalInternalEnergy() const override;
103 : virtual Real gamma_from_v_e(Real v, Real e) const override;
104 : virtual ADReal gamma_from_v_e(ADReal v, ADReal e) const;
105 : virtual void
106 : gamma_from_v_e(Real v, Real e, Real & gamma, Real & dgamma_dv, Real & dgamma_de) const override;
107 : virtual Real gamma_from_p_T(Real p, Real T) const override;
108 : virtual ADReal gamma_from_p_T(ADReal p, ADReal T) const;
109 : virtual void
110 : gamma_from_p_T(Real p, Real T, Real & gamma, Real & dgamma_dp, Real & dgamma_dT) const override;
111 : virtual Real g_from_v_e(Real v, Real e) const override;
112 : virtual Real p_from_h_s(Real h, Real s) const override;
113 : virtual void p_from_h_s(Real h, Real s, Real & p, Real & dp_dh, Real & dp_ds) const override;
114 : virtual Real c_from_v_e(Real v, Real e) const override;
115 : virtual ADReal c_from_v_e(const ADReal & v, const ADReal & e) const override;
116 : virtual void c_from_v_e(Real v, Real e, Real & c, Real & dc_dv, Real & dc_de) const override;
117 : virtual Real c_from_p_T(Real p, Real T) const override;
118 : virtual ADReal c_from_p_T(const ADReal & p, const ADReal & T) const override;
119 : virtual void c_from_p_T(Real /*p*/, Real T, Real & c, Real & dc_dp, Real & dc_dT) const override;
120 :
121 : protected:
122 : /// sets up the T(e) reverse lookup table
123 : void setupLookupTables();
124 :
125 : /// function that handles exceeding parameter limits
126 : void outOfBounds(const std::string & function, Real value, Real min, Real max) const;
127 :
128 : ///@{ helper functions for e(T) and h(T), T(e), T(h), cv(T), cp(T)
129 : Real e_from_T(Real T) const;
130 : Real h_from_T(Real T) const;
131 : Real T_from_e(Real e) const;
132 : Real T_from_h(Real h) const;
133 : template <typename CppType>
134 : Real cv_from_T(const CppType & T) const;
135 : Real cp_from_T(Real T) const;
136 : void cv_from_T(Real T, Real & cv, Real & dcv_dT) const;
137 : void cp_from_T(Real T, Real & cp, Real & dcp_dT) const;
138 : Real Z_from_T(Real T) const;
139 : ///@}
140 :
141 : /// molar mass
142 : const Real & _molar_mass;
143 :
144 : /// Specific gas constant (R / molar mass)
145 : const Real _R_specific;
146 :
147 : // properties at critical point (used by IdealRealGasMixtureFluidProperties (primary component))
148 : Real _T_c;
149 : Real _rho_c;
150 : Real _e_c;
151 :
152 : ///@{ temperature limits when creating lookup tables
153 : Real _min_temperature;
154 : Real _max_temperature;
155 : ///@}
156 :
157 : /// temperature interval in lookup tables
158 : Real _delta_T;
159 :
160 : /// Flag to error if out of bounds
161 : const bool _out_of_bound_error;
162 :
163 : // tolerance for checking monotonicity of T for h(T) & e(T)
164 : Real _tol;
165 :
166 : /// Internal energy as a function of temperature
167 : const Function * _e_T;
168 : /// Dynamic viscosity
169 : const Function * _mu_T;
170 : /// Thermal conductivity
171 : const Function * _k_T;
172 :
173 : ///@{ internal energy and enthalpy limits when creating lookup tables
174 : Real _min_e;
175 : Real _max_e;
176 : Real _min_h;
177 : Real _max_h;
178 : ///@}
179 :
180 : ///@{ step size in internal energy and enthalpy
181 : Real _delta_e;
182 : Real _delta_h;
183 : ///@}
184 :
185 : ///@{ inverse lookup table data
186 : std::vector<Real> _T_h_lookup;
187 : std::vector<Real> _T_e_lookup;
188 : ///@}
189 :
190 : /// Z(T) lookup table on uniform grid between _min_temperature and _max_temperature
191 : std::vector<Real> _Z_T_lookup;
192 : };
193 :
194 : #pragma GCC diagnostic pop
195 :
196 : template <typename CppType>
197 : CppType
198 406 : CaloricallyImperfectGas::e_from_p_rho_template(const CppType & p, const CppType & rho) const
199 : {
200 406 : CppType T = p / (rho * _R_specific);
201 406 : return e_from_p_T(p, T);
202 : }
203 :
204 : template <typename CppType>
205 : void
206 2 : CaloricallyImperfectGas::e_from_p_rho_template(
207 : const CppType & p, const CppType & rho, CppType & e, CppType & de_dp, CppType & de_drho) const
208 : {
209 2 : CppType T = p / (rho * _R_specific);
210 2 : e = e_from_p_rho_template(p, rho);
211 2 : CppType cv = cv_from_T(T);
212 2 : de_dp = cv / (rho * _R_specific);
213 2 : de_drho = -cv * p / (rho * rho * _R_specific);
214 2 : }
215 :
216 : template <typename CppType>
217 : Real
218 303715 : CaloricallyImperfectGas::cv_from_T(const CppType & T) const
219 : {
220 : const auto raw_T = MetaPhysicL::raw_value(T);
221 303715 : if (raw_T < _min_temperature || raw_T > _max_temperature)
222 0 : outOfBounds("cv_from_T", raw_T, _min_temperature, _max_temperature);
223 :
224 303715 : return _e_T->timeDerivative(raw_T, Point());
225 : }
|