version 3.10-dev
region2.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3//
4// SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
7
18#ifndef DUMUX_IAPWS_REGION2_HH
19#define DUMUX_IAPWS_REGION2_HH
20
21#include <cmath>
22#include <iostream>
24
25namespace Dumux {
26namespace IAPWS {
27
38template <class Scalar>
40{
41public:
50 static void checkValidityRange(Scalar temperature, Scalar pressure,
51 const std::string& propertyName = "This property")
52 {
53 // actually this is:
54 /* (273.15 <= temperature && temperature <= 623.15 && pressure <= vaporPressure(temperature)) ||
55 (623.15 < temperature && temperature <= 863.15 && pressure <= auxPressure(temperature)) ||
56 (863.15 < temperature && temperature <= 1073.15 && pressure < 100e6); */
57 if ((temperature <= 623.15 && pressure <= 100e6) ||
58 (temperature > 623.15 && temperature <= 1073.15 && pressure <= 16.532e6 ))
59 return;
60
61 DUNE_THROW(NumericalProblem,
62 propertyName << " of steam is only implemented for temperatures below 623.15K and "
63 "pressures below 100MPa. (T=" << temperature << ", p=" << pressure << ")");
64 }
65
71 static constexpr Scalar tau(Scalar temperature)
72 { return 540.0 / temperature; }
73
80 static constexpr Scalar dTau_dt(Scalar temperature)
81 { return - 540.0 / (temperature*temperature); }
82
88 static constexpr Scalar pi(Scalar pressure)
89 { return pressure / 1e6; }
90
97 static constexpr Scalar dPi_dp(Scalar pressure)
98 { return 1.0 / 1e6; }
99
106 static constexpr Scalar dp_dPi(Scalar pressure)
107 { return 1e6; }
108
120 static Scalar gamma(Scalar temperature, Scalar pressure)
121 {
122 Scalar tau = tau(temperature); /* reduced temperature */
123 Scalar pi = pi(pressure); /* reduced pressure */
124
125 Scalar result;
126
127 // ideal gas part
128 using std::pow;
129 result = ln(pi);
130 for (int i = 0; i < 9; ++i)
131 result += n_g(i)*pow(tau, J_g(i));
132
133 // residual part
134 for (int i = 0; i < 43; ++i)
135 result += n_r(i)*
136 pow(pi, I_r(i))*
137 pow(tau - 0.5, J_r(i));
138 return result;
139 }
140
153 static Scalar dGamma_dTau(Scalar temperature, Scalar pressure)
154 {
155 Scalar tau_ = tau(temperature); /* reduced temperature */
156 Scalar pi_ = pi(pressure); /* reduced pressure */
157
158 // ideal gas part
159 using std::pow;
160 Scalar result = 0;
161 for (int i = 0; i < 9; i++) {
162 result += n_g(i) *
163 J_g(i) *
164 pow(tau_, J_g(i) - 1);
165 }
166
167 // residual part
168 for (int i = 0; i < 43; i++) {
169 result += n_r(i) *
170 pow(pi_, I_r(i)) *
171 J_r(i) *
172 pow(tau_ - 0.5, J_r(i) - 1);
173 }
174
175 return result;
176 }
177
190 static Scalar dGamma_dPi(Scalar temperature, Scalar pressure)
191 {
192 Scalar tau_ = tau(temperature); /* reduced temperature */
193 Scalar pi_ = pi(pressure); /* reduced pressure */
194
195 // ideal gas part
196 Scalar result = 1/pi_;
197
198 // residual part
199 using std::pow;
200 for (int i = 0; i < 43; i++) {
201 result += n_r(i) *
202 I_r(i) *
203 pow(pi_, I_r(i) - 1) *
204 pow(tau_ - 0.5, J_r(i));
205 }
206
207 return result;
208 }
209
222 static Scalar ddGamma_dTaudPi(Scalar temperature, Scalar pressure)
223 {
224 Scalar tau_ = tau(temperature); /* reduced temperature */
225 Scalar pi_ = pi(pressure); /* reduced pressure */
226
227 // ideal gas part
228 Scalar result = 0;
229
230 // residual part
231 using std::pow;
232 for (int i = 0; i < 43; i++) {
233 result += n_r(i) *
234 I_r(i) *
235 J_r(i) *
236 pow(pi_, I_r(i) - 1) *
237 pow(tau_ - 0.5, J_r(i) - 1);
238 }
239
240 return result;
241 }
242
255 static Scalar ddGamma_ddPi(Scalar temperature, Scalar pressure)
256 {
257 Scalar tau_ = tau(temperature); /* reduced temperature */
258 Scalar pi_ = pi(pressure); /* reduced pressure */
259
260 // ideal gas part
261 Scalar result = -1/(pi_*pi_);
262
263 // residual part
264 using std::pow;
265 for (int i = 0; i < 43; i++) {
266 result += n_r(i) *
267 I_r(i) *
268 (I_r(i) - 1) *
269 pow(pi_, I_r(i) - 2) *
270 pow(tau_ - 0.5, J_r(i));
271 }
272
273 return result;
274 }
275
288 static Scalar ddGamma_ddTau(Scalar temperature, Scalar pressure)
289 {
290 Scalar tau_ = tau(temperature); /* reduced temperature */
291 Scalar pi_ = pi(pressure); /* reduced pressure */
292
293 // ideal gas part
294 using std::pow;
295 Scalar result = 0;
296 for (int i = 0; i < 9; i++) {
297 result += n_g(i) *
298 J_g(i) *
299 (J_g(i) - 1) *
300 pow(tau_, J_g(i) - 2);
301 }
302
303 // residual part
304 using std::pow;
305 for (int i = 0; i < 43; i++) {
306 result += n_r(i) *
307 pow(pi_, I_r(i)) *
308 J_r(i) *
309 (J_r(i) - 1.) *
310 pow(tau_ - 0.5, J_r(i) - 2.);
311 }
312
313 return result;
314 }
315
316private:
317 static Scalar n_g(int i)
318 {
319 constexpr const Scalar n[9] = {
320 -0.96927686500217e1, 0.10086655968018e2, -0.56087911283020e-2,
321 0.71452738081455e-1, -0.40710498223928, 0.14240819171444e1,
322 -0.43839511319450e1, -0.28408632460772, 0.21268463753307e-1
323 };
324 return n[i];
325 }
326
327 static Scalar n_r(int i)
328 {
329 constexpr const Scalar n[43] = {
330 -0.17731742473213e-2, -0.17834862292358e-1, -0.45996013696365e-1,
331 -0.57581259083432e-1, -0.50325278727930e-1, -0.33032641670203e-4,
332 -0.18948987516315e-3, -0.39392777243355e-2, -0.43797295650573e-1,
333 -0.26674547914087e-4, 0.20481737692309e-7, 0.43870667284435e-6,
334 -0.32277677238570e-4, -0.15033924542148e-2, -0.40668253562649e-1,
335 -0.78847309559367e-9, 0.12790717852285e-7, 0.48225372718507e-6,
336 0.22922076337661e-5, -0.16714766451061e-10, -0.21171472321355e-2,
337 -0.23895741934104e2, -0.59059564324270e-17, -0.12621808899101e-5,
338 -0.38946842435739e-1, 0.11256211360459e-10, -0.82311340897998e1,
339 0.19809712802088e-7, 0.10406965210174e-18, -0.10234747095929e-12,
340 -0.10018179379511e-8, -0.80882908646985e-10, 0.10693031879409,
341 -0.33662250574171, 0.89185845355421e-24, 0.30629316876232e-12,
342 -0.42002467698208e-5, -0.59056029685639e-25, 0.37826947613457e-5,
343 -0.12768608934681e-14, 0.73087610595061e-28, 0.55414715350778e-16,
344 -0.94369707241210e-6
345 };
346 return n[i];
347 }
348
349 static Scalar I_r(int i)
350 {
351 constexpr const short int I[43] = {
352 1, 1, 1,
353 1, 1, 2,
354 2, 2, 2,
355 2, 3, 3,
356 3, 3, 3,
357 4, 4, 4,
358 5, 6, 6,
359 6, 7, 7,
360 7, 8, 8,
361 9, 10, 10,
362 10, 16, 16,
363 18, 20, 20,
364 20, 21, 22,
365 23, 24, 24,
366 24
367 };
368 return I[i];
369 }
370
371 static Scalar J_g(int i)
372 {
373 constexpr const short int J[9] = {
374 0, 1, -5,
375 -4, -3, -2,
376 -1, 2, 3
377 };
378 return J[i];
379 }
380
381 static Scalar J_r(int i)
382 {
383 constexpr const short int J[43] = {
384 0, 1, 2,
385 3, 6, 1,
386 2, 4, 7,
387 36, 0, 1,
388 3, 6, 35,
389 1, 2, 3,
390 7, 3, 16,
391 35, 0, 11,
392 25, 8, 36,
393 13, 4, 10,
394 14, 29, 50,
395 57, 20, 35,
396 48, 21, 53,
397 39, 26, 40,
398 58
399 };
400 return J[i];
401 }
402
403};
404
405} // end namespace IAPWS
406} // end namespace Dumux
407
408#endif
Implements the equations for region 2 of the IAPWS '97 formulation.
Definition: region2.hh:40
static Scalar ddGamma_ddTau(Scalar temperature, Scalar pressure)
The second partial derivative of the Gibbs free energy to the normalized temperature for IAPWS region...
Definition: region2.hh:288
static Scalar dGamma_dTau(Scalar temperature, Scalar pressure)
The partial derivative of the Gibbs free energy to the normalized temperature for IAPWS region 2 (i....
Definition: region2.hh:153
static Scalar ddGamma_dTaudPi(Scalar temperature, Scalar pressure)
The partial derivative of the Gibbs free energy to the normalized pressure and to the normalized temp...
Definition: region2.hh:222
static Scalar gamma(Scalar temperature, Scalar pressure)
The Gibbs free energy for IAPWS region 2 (i.e. sub-critical steam) (dimensionless).
Definition: region2.hh:120
static Scalar ddGamma_ddPi(Scalar temperature, Scalar pressure)
The second partial derivative of the Gibbs free energy to the normalized pressure for IAPWS region 2 ...
Definition: region2.hh:255
static void checkValidityRange(Scalar temperature, Scalar pressure, const std::string &propertyName="This property")
Returns true if IAPWS region 2 applies for a (temperature, pressure) pair.
Definition: region2.hh:50
static constexpr Scalar dTau_dt(Scalar temperature)
Returns the derivative of the reduced temperature to the temperature for IAPWS region 2.
Definition: region2.hh:80
static constexpr Scalar pi(Scalar pressure)
Returns the reduced pressure (dimensionless) for IAPWS region 2.
Definition: region2.hh:88
static constexpr Scalar dPi_dp(Scalar pressure)
Returns the derivative of the reduced pressure to the pressure for IAPWS region 2 in .
Definition: region2.hh:97
static constexpr Scalar tau(Scalar temperature)
Returns the reduced temperature (dimensionless) for IAPWS region 2.
Definition: region2.hh:71
static constexpr Scalar dp_dPi(Scalar pressure)
Returns the derivative of the pressure to the reduced pressure for IAPWS region 2 (dimensionless).
Definition: region2.hh:106
static Scalar dGamma_dPi(Scalar temperature, Scalar pressure)
The partial derivative of the Gibbs free energy to the normalized pressure for IAPWS region 2 (i....
Definition: region2.hh:190
Exception thrown if a fixable numerical problem occurs.
Definition: exceptions.hh:27
Some exceptions thrown in DuMux
std::string temperature() noexcept
I/O name of temperature for equilibrium models.
Definition: name.hh:39
std::string pressure(int phaseIdx) noexcept
I/O name of pressure for multiphase systems.
Definition: name.hh:22
Definition: adapt.hh:17