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 7 : CppType T = T_from_v_e_template(v, e);
217 7 : CppType p = p_from_v_e_template(v, e);
218 753 : CppType n = std::pow(T, _gamma) / std::pow(p + _p_inf, _gamma - 1.0);
219 746 : if (n <= 0.0)
220 0 : return getNaN();
221 : else
222 753 : return _cv * std::log(n) + _q_prime;
223 : }
224 :
225 : template <typename CppType>
226 : void
227 30 : StiffenedGasFluidProperties::s_from_v_e_template(
228 : const CppType & v, const CppType & e, CppType & s, CppType & ds_dv, CppType & ds_de) const
229 : {
230 : CppType T, dT_dv, dT_de;
231 30 : T_from_v_e_template(v, e, T, dT_dv, dT_de);
232 :
233 : CppType p, dp_dv, dp_de;
234 30 : p_from_v_e_template(v, e, p, dp_dv, dp_de);
235 :
236 31 : const CppType n = std::pow(T, _gamma) / std::pow(p + _p_inf, _gamma - 1.0);
237 30 : if (n <= 0.0)
238 : {
239 0 : s = getNaN();
240 0 : ds_dv = getNaN();
241 0 : ds_de = getNaN();
242 : }
243 : else
244 : {
245 31 : s = _cv * std::log(n) + _q_prime;
246 :
247 30 : const CppType dn_dT = _gamma * std::pow(T, _gamma - 1.0) / std::pow(p + _p_inf, _gamma - 1.0);
248 31 : const CppType dn_dp = std::pow(T, _gamma) * (1.0 - _gamma) * std::pow(p + _p_inf, -_gamma);
249 :
250 30 : const CppType dn_dv = dn_dT * dT_dv + dn_dp * dp_dv;
251 30 : const CppType dn_de = dn_dT * dT_de + dn_dp * dp_de;
252 :
253 30 : ds_dv = _cv / n * dn_dv;
254 30 : ds_de = _cv / n * dn_de;
255 : }
256 30 : }
257 :
258 : template <typename CppType>
259 : CppType
260 12 : StiffenedGasFluidProperties::s_from_p_T_template(const CppType & p, const CppType & T) const
261 : {
262 18 : CppType n = std::pow(T, _gamma) / std::pow(p + _p_inf, _gamma - 1.0);
263 12 : if (n <= 0.0)
264 0 : return getNaN();
265 : else
266 18 : return _cv * std::log(n) + _q_prime;
267 : }
268 :
269 : template <typename CppType>
270 : void
271 2 : StiffenedGasFluidProperties::s_from_p_T_template(
272 : const CppType & p, const CppType & T, CppType & s, CppType & ds_dp, CppType & ds_dT) const
273 : {
274 3 : const CppType n = std::pow(T, _gamma) / std::pow(p + _p_inf, _gamma - 1.0);
275 2 : if (n <= 0.0)
276 : {
277 0 : s = getNaN();
278 0 : ds_dp = getNaN();
279 0 : ds_dT = getNaN();
280 : }
281 : else
282 : {
283 3 : s = _cv * std::log(n) + _q_prime;
284 :
285 2 : const CppType dn_dT = _gamma * std::pow(T, _gamma - 1.0) / std::pow(p + _p_inf, _gamma - 1.0);
286 3 : const CppType dn_dp = std::pow(T, _gamma) * (1.0 - _gamma) * std::pow(p + _p_inf, -_gamma);
287 :
288 2 : ds_dp = _cv / n * dn_dp;
289 2 : ds_dT = _cv / n * dn_dT;
290 : }
291 2 : }
|