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 :
15 : #pragma GCC diagnostic push
16 : #pragma GCC diagnostic ignored "-Woverloaded-virtual"
17 :
18 : /**
19 : * Stiffened gas fluid properties
20 : */
21 : class StiffenedGasFluidProperties : public SinglePhaseFluidProperties, public NaNInterface
22 : {
23 : public:
24 : static InputParameters validParams();
25 :
26 : StiffenedGasFluidProperties(const InputParameters & parameters);
27 : virtual ~StiffenedGasFluidProperties();
28 :
29 : virtual Real c_from_v_e(Real v, Real e) const override;
30 : virtual void c_from_v_e(Real v, Real e, Real & c, Real & dc_dv, Real & dc_de) const override;
31 : virtual Real cp_from_v_e(Real v, Real e) const override;
32 : virtual void cp_from_v_e(Real v, Real e, Real & cp, Real & dcp_dv, Real & dcp_de) const override;
33 : virtual Real cv_from_v_e(Real v, Real e) const override;
34 : virtual void cv_from_v_e(Real v, Real e, Real & cv, Real & dcv_dv, Real & dcv_de) const override;
35 : virtual Real mu_from_v_e(Real v, Real e) const override;
36 : virtual void mu_from_v_e(Real v, Real e, Real & mu, Real & dmu_dv, Real & dmu_de) const override;
37 : virtual Real k_from_v_e(Real v, Real e) const override;
38 : virtual void k_from_v_e(Real v, Real e, Real & k, Real & dk_dv, Real & dk_de) const override;
39 : virtual Real s_from_h_p(Real h, Real p) const override;
40 : virtual void s_from_h_p(Real h, Real p, Real & s, Real & ds_dh, Real & ds_dp) const override;
41 : virtual Real rho_from_p_s(Real p, Real s) const override;
42 : virtual void
43 : rho_from_p_s(Real p, Real s, Real & rho, Real & drho_dp, Real & drho_ds) const override;
44 : propfuncWithDefinitionOverride(rho, p, T);
45 : propfuncWithDefinitionOverride(e, p, rho);
46 : propfuncWithDefinitionOverride(s, v, e);
47 : propfuncWithDefinitionOverride(s, p, T);
48 : propfuncWithDefinitionOverride(T, v, e);
49 : propfuncWithDefinitionOverride(p, v, e);
50 : propfuncWithDefinitionOverride(T, p, h);
51 : virtual Real e_from_T_v(Real T, Real v) const override;
52 : virtual void e_from_T_v(Real T, Real v, Real & e, Real & de_dT, Real & de_dv) const override;
53 : virtual Real p_from_T_v(Real T, Real v) const override;
54 : virtual void p_from_T_v(Real T, Real v, Real & p, Real & dp_dT, Real & dp_dv) const override;
55 : virtual Real h_from_T_v(Real T, Real v) const override;
56 : virtual void h_from_T_v(Real T, Real v, Real & h, Real & dh_dT, Real & dh_dv) const override;
57 : virtual Real s_from_T_v(Real T, Real v) const override;
58 : virtual void s_from_T_v(Real T, Real v, Real & s, Real & ds_dT, Real & ds_dv) const override;
59 : virtual Real cv_from_T_v(Real T, Real v) const override;
60 : virtual Real e_spndl_from_v(Real v) const override;
61 : virtual void v_e_spndl_from_T(Real T, Real & v, Real & e) const override;
62 : virtual Real e_from_v_h(Real v, Real h) const override;
63 : virtual void e_from_v_h(Real v, Real h, Real & e, Real & de_dv, Real & de_dh) const override;
64 : virtual Real h_from_p_T(Real p, Real T) const override;
65 : virtual void h_from_p_T(Real p, Real T, Real & h, Real & dh_dp, Real & dh_dT) const override;
66 : virtual Real e_from_p_T(Real p, Real T) const override;
67 : virtual void e_from_p_T(Real p, Real T, Real & e, Real & de_dp, Real & de_dT) const override;
68 : virtual Real p_from_h_s(Real h, Real s) const override;
69 : virtual void p_from_h_s(Real h, Real s, Real & p, Real & dp_dh, Real & dp_ds) const override;
70 : virtual Real g_from_v_e(Real v, Real e) const override;
71 : virtual Real molarMass() const override;
72 : virtual Real criticalTemperature() const override;
73 : virtual Real criticalDensity() const override;
74 : virtual Real criticalInternalEnergy() const override;
75 : virtual Real cv_from_p_T(Real p, Real T) const override;
76 : virtual void cv_from_p_T(Real p, Real T, Real & cv, Real & dcv_dp, Real & dcv_dT) const override;
77 : virtual Real cp_from_p_T(Real p, Real T) const override;
78 : virtual void cp_from_p_T(Real p, Real T, Real & cp, Real & dcp_dp, Real & dcp_dT) const override;
79 : virtual Real mu_from_p_T(Real p, Real T) const override;
80 : virtual void mu_from_p_T(Real p, Real T, Real & mu, Real & dmu_dp, Real & dmu_dT) const override;
81 : virtual Real k_from_p_T(Real p, Real T) const override;
82 : virtual void k_from_p_T(Real p, Real T, Real & k, Real & dk_dp, Real & dk_dT) const override;
83 : virtual Real beta_from_p_T(Real p, Real T) const override;
84 : virtual void
85 : beta_from_p_T(Real p, Real T, Real & beta, Real & dbeta_dp, Real & dbeta_dT) const override;
86 :
87 : virtual Real c2_from_p_rho(Real pressure, Real rho) const;
88 :
89 : virtual Real pp_sat_from_p_T(Real /*p*/, Real /*T*/) const override;
90 :
91 : protected:
92 : bool _allow_nonphysical_states;
93 :
94 : Real _gamma;
95 : Real _cv;
96 : Real _q;
97 : Real _q_prime;
98 : Real _p_inf;
99 : Real _cp;
100 :
101 : Real _mu;
102 : Real _k;
103 : Real _molar_mass;
104 : // properties at critical point
105 : Real _T_c;
106 : Real _rho_c;
107 : Real _e_c;
108 : };
109 :
110 : #pragma GCC diagnostic pop
111 :
112 : template <typename CppType>
113 : CppType
114 325 : StiffenedGasFluidProperties::rho_from_p_T_template(const CppType & p, const CppType & T) const
115 : {
116 : mooseAssert(((_gamma - 1.0) * _cv * T) != 0.0, "Invalid gamma or cv or temperature detected!");
117 325 : CppType rho = (p + _p_inf) / ((_gamma - 1.0) * _cv * T);
118 325 : if (!_allow_nonphysical_states && rho <= 0.)
119 0 : return getNaN();
120 : else
121 7 : return rho;
122 : }
123 :
124 : template <typename CppType>
125 : void
126 4 : StiffenedGasFluidProperties::rho_from_p_T_template(
127 : const CppType & p, const CppType & T, CppType & rho, CppType & drho_dp, CppType & drho_dT) const
128 : {
129 : mooseAssert(((_gamma - 1.0) * _cv * T) != 0.0, "Invalid gamma or cv or temperature detected!");
130 5 : rho = (p + _p_inf) / ((_gamma - 1.0) * _cv * T);
131 4 : if (!_allow_nonphysical_states && rho <= 0.)
132 : {
133 0 : drho_dp = getNaN();
134 0 : drho_dT = getNaN();
135 : }
136 : else
137 : {
138 6 : drho_dp = 1. / ((_gamma - 1.0) * _cv * T);
139 6 : drho_dT = -(p + _p_inf) / ((_gamma - 1.0) * _cv * T * T);
140 : }
141 4 : }
142 :
143 : template <typename CppType>
144 : CppType
145 8 : StiffenedGasFluidProperties::e_from_p_rho_template(const CppType & p, const CppType & rho) const
146 : {
147 : mooseAssert((_gamma - 1.0) * rho != 0., "Invalid gamma or density detected!");
148 16 : return (p + _gamma * _p_inf) / ((_gamma - 1.0) * rho) + _q;
149 : }
150 :
151 : template <typename CppType>
152 : void
153 2 : StiffenedGasFluidProperties::e_from_p_rho_template(
154 : const CppType & p, const CppType & rho, CppType & e, CppType & de_dp, CppType & de_drho) const
155 : {
156 2 : e = e_from_p_rho_template(p, rho);
157 4 : de_dp = 1.0 / ((_gamma - 1.0) * rho);
158 4 : de_drho = -(p + _gamma * _p_inf) / ((_gamma - 1.0) * rho * rho);
159 2 : }
160 :
161 : template <typename CppType>
162 : CppType
163 15 : StiffenedGasFluidProperties::T_from_v_e_template(const CppType & v, const CppType & e) const
164 : {
165 45 : return (1.0 / _cv) * (e - _q - _p_inf * v);
166 : }
167 :
168 : template <typename CppType>
169 : void
170 32 : StiffenedGasFluidProperties::T_from_v_e_template(
171 : const CppType & v, const CppType & e, CppType & T, CppType & dT_dv, CppType & dT_de) const
172 : {
173 32 : T = T_from_v_e_template(v, e);
174 32 : dT_dv = -_p_inf / _cv;
175 32 : dT_de = 1.0 / _cv;
176 32 : }
177 :
178 : template <typename CppType>
179 : CppType
180 0 : StiffenedGasFluidProperties::T_from_p_h_template(const CppType & /*p*/, const CppType & h) const
181 : {
182 0 : return (1.0 / _cv) * (h - _q) / _gamma;
183 : }
184 :
185 : template <typename CppType>
186 : void
187 0 : StiffenedGasFluidProperties::T_from_p_h_template(
188 : const CppType & p, const CppType & h, CppType & T, CppType & dT_dp, CppType & dT_dh) const
189 : {
190 0 : T = T_from_p_h_template(p, h);
191 0 : dT_dp = 0;
192 0 : dT_dh = 1.0 / _cv / _gamma;
193 0 : }
194 :
195 : template <typename CppType>
196 : CppType
197 15 : StiffenedGasFluidProperties::p_from_v_e_template(const CppType & v, const CppType & e) const
198 : {
199 30 : return (_gamma - 1.0) * (e - _q) / v - _gamma * _p_inf;
200 : }
201 :
202 : template <typename CppType>
203 : void
204 90 : StiffenedGasFluidProperties::p_from_v_e_template(
205 : const CppType & v, const CppType & e, CppType & p, CppType & dp_dv, CppType & dp_de) const
206 : {
207 90 : p = p_from_v_e_template(v, e);
208 92 : dp_dv = -(_gamma - 1.0) * (e - _q) / v / v;
209 92 : dp_de = (_gamma - 1.0) / v;
210 90 : }
211 :
212 : template <typename CppType>
213 : CppType
214 746 : StiffenedGasFluidProperties::s_from_v_e_template(const CppType & v, const CppType & e) const
215 : {
216 : using std::pow, std::log;
217 :
218 7 : CppType T = T_from_v_e_template(v, e);
219 7 : CppType p = p_from_v_e_template(v, e);
220 753 : CppType n = pow(T, _gamma) / pow(p + _p_inf, _gamma - 1.0);
221 746 : if (n <= 0.0)
222 0 : return getNaN();
223 : else
224 753 : return _cv * log(n) + _q_prime;
225 : }
226 :
227 : template <typename CppType>
228 : void
229 30 : StiffenedGasFluidProperties::s_from_v_e_template(
230 : const CppType & v, const CppType & e, CppType & s, CppType & ds_dv, CppType & ds_de) const
231 : {
232 : using std::pow, std::log;
233 :
234 : CppType T, dT_dv, dT_de;
235 30 : T_from_v_e_template(v, e, T, dT_dv, dT_de);
236 :
237 : CppType p, dp_dv, dp_de;
238 30 : p_from_v_e_template(v, e, p, dp_dv, dp_de);
239 :
240 31 : const CppType n = pow(T, _gamma) / pow(p + _p_inf, _gamma - 1.0);
241 30 : if (n <= 0.0)
242 : {
243 0 : s = getNaN();
244 0 : ds_dv = getNaN();
245 0 : ds_de = getNaN();
246 : }
247 : else
248 : {
249 31 : s = _cv * log(n) + _q_prime;
250 :
251 30 : const CppType dn_dT = _gamma * pow(T, _gamma - 1.0) / pow(p + _p_inf, _gamma - 1.0);
252 31 : const CppType dn_dp = pow(T, _gamma) * (1.0 - _gamma) * pow(p + _p_inf, -_gamma);
253 :
254 30 : const CppType dn_dv = dn_dT * dT_dv + dn_dp * dp_dv;
255 30 : const CppType dn_de = dn_dT * dT_de + dn_dp * dp_de;
256 :
257 30 : ds_dv = _cv / n * dn_dv;
258 30 : ds_de = _cv / n * dn_de;
259 : }
260 30 : }
261 :
262 : template <typename CppType>
263 : CppType
264 12 : StiffenedGasFluidProperties::s_from_p_T_template(const CppType & p, const CppType & T) const
265 : {
266 : using std::pow, std::log;
267 :
268 18 : CppType n = pow(T, _gamma) / pow(p + _p_inf, _gamma - 1.0);
269 12 : if (n <= 0.0)
270 0 : return getNaN();
271 : else
272 18 : return _cv * log(n) + _q_prime;
273 : }
274 :
275 : template <typename CppType>
276 : void
277 2 : StiffenedGasFluidProperties::s_from_p_T_template(
278 : const CppType & p, const CppType & T, CppType & s, CppType & ds_dp, CppType & ds_dT) const
279 : {
280 : using std::pow, std::log;
281 :
282 3 : const CppType n = pow(T, _gamma) / pow(p + _p_inf, _gamma - 1.0);
283 2 : if (n <= 0.0)
284 : {
285 0 : s = getNaN();
286 0 : ds_dp = getNaN();
287 0 : ds_dT = getNaN();
288 : }
289 : else
290 : {
291 3 : s = _cv * log(n) + _q_prime;
292 :
293 2 : const CppType dn_dT = _gamma * pow(T, _gamma - 1.0) / pow(p + _p_inf, _gamma - 1.0);
294 3 : const CppType dn_dp = pow(T, _gamma) * (1.0 - _gamma) * pow(p + _p_inf, -_gamma);
295 :
296 2 : ds_dp = _cv / n * dn_dp;
297 2 : ds_dT = _cv / n * dn_dT;
298 : }
299 2 : }
|