Cantera 2.6.0

WaterPropsIAPWS.h
Go to the documentation of this file.
1/**
2 * @file WaterPropsIAPWS.h
3 * Headers for a class for calculating the equation of state of water
4 * from the IAPWS 1995 Formulation based on the steam tables thermodynamic
5 * basis (See class \link Cantera::WaterPropsIAPWS WaterPropsIAPWS\endlink).
6 */
7
8// This file is part of Cantera. See License.txt in the top-level directory or
9// at https://cantera.org/license.txt for license and copyright information.
10
11#ifndef WATERPROPSIAPWS_H
12#define WATERPROPSIAPWS_H
13
14#include "WaterPropsIAPWSphi.h"
15
16 namespace Cantera
17{
18/**
19 * @name Names for the phase regions
20 *
21 * These constants are defined and used in the interface to describe the
22 * location of where we are in (T,rho) space.
23 *
24 * WATER_UNSTABLELIQUID indicates that we are in the unstable region, inside the
25 * spinodal curve where dpdrho < 0.0 amongst other properties. The difference
26 * between WATER_UNSTABLELIQUID and WATER_UNSTABLEGAS is that
27 * for WATER_UNSTABLELIQUID d2pdrho2 > 0 and dpdrho < 0.0
28 * for WATER_UNSTABLEGAS d2pdrho2 < 0 and dpdrho < 0.0
29 */
30//@{
31#define WATER_GAS 0
32#define WATER_LIQUID 1
33#define WATER_SUPERCRIT 2
34#define WATER_UNSTABLELIQUID 3
35#define WATER_UNSTABLEGAS 4
36//@}
37
38//! Class for calculating the equation of state of water.
39/*!
40 * This is a helper class for WaterSSTP and PDSS_Water and does not constitute
41 * a complete implementation of a thermo phase by itself (see \ref thermoprops
42 * and classes \link Cantera::WaterSSTP WaterSSTP\endlink and
43 * \link Cantera::PDSS_Water PDSS_Water\endlink).
44 *
45 * The reference is W. Wagner, A. Pruss, "The IAPWS Formulation 1995 for the
46 * Thermodynamic Properties of Ordinary Water Substance for General and
47 * Scientific Use," J. Phys. Chem. Ref. Dat, 31, 387, 2002.
48 *
49 * This class provides a very complicated polynomial for the specific
50 * Helmholtz free energy of water, as a function of temperature and density.
51 *
52 * \f[
53 * \frac{M\hat{f}(\rho,T)}{R T} = \phi(\delta, \tau) =
54 * \phi^o(\delta, \tau) + \phi^r(\delta, \tau)
55 * \f]
56 *
57 * where
58 *
59 * \f[
60 * \delta = \rho / \rho_c \quad \mathrm{and} \quad \tau = T_c / T
61 * \f]
62 *
63 * The following constants are assumed
64 *
65 * \f[
66 * T_c = 647.096\mathrm{\;K}
67 * \f]
68 * \f[
69 * \rho_c = 322 \mathrm{\;kg\,m^{-3}}
70 * \f]
71 * \f[
72 * R/M = 0.46151805 \mathrm{\;kJ\,kg^{-1}\,K^{-1}}
73 * \f]
74 *
75 * The free energy is a unique single-valued function of the temperature and
76 * density over its entire range.
77 *
78 * Note, the base thermodynamic state for this class is the one used in the
79 * steam tables, such that the liquid at the triple point for water has the
80 * following properties:
81 *
82 * - u(273.16, rho) = 0.0
83 * - s(273.16, rho) = 0.0
84 * - psat(273.16) = 611.655 Pascal
85 * - rho(273.16, psat) = 999.793 kg m-3
86 *
87 * Therefore, to use this class within %Cantera, offsets to u() and s() must
88 * be used to put the water class onto the same basis as other thermodynamic
89 * quantities. For example, in the WaterSSTP class, these offsets are
90 * calculated in the following way. The thermodynamic base state for water is
91 * set to the NIST basis here by specifying constants EW_Offset and SW_Offset.
92 * These offsets are calculated on the fly so that the following properties
93 * hold:
94 *
95 * - Delta_Hfo_idealGas(298.15, 1bar) = -241.826 kJ/gmol
96 * - So_idealGas(298.15, 1bar) = 188.835 J/gmolK
97 *
98 * The offsets are calculated by actually computing the above quantities and
99 * then calculating the correction factor.
100 *
101 * This class provides an interface to the WaterPropsIAPWSphi class, which
102 * actually calculates the \f$ \phi^o(\delta, \tau) \f$ and the
103 * \f$ \phi^r(\delta, \tau) \f$ polynomials in dimensionless form.
104 *
105 * All thermodynamic results from this class are returned in dimensional form.
106 * This is because the gas constant (and molecular weight) used within this
107 * class is allowed to be potentially different than that used elsewhere in
108 * %Cantera. Therefore, everything has to be in dimensional units. Note,
109 * however, the thermodynamic basis is set to that used in the steam tables.
110 * (u = s = 0 for liquid water at the triple point).
111 *
112 * This class is not a ThermoPhase. However, it does maintain an internal
113 * state of the object that is dependent on temperature and density. The
114 * internal state is characterized by an internally stored \f$ \tau\f$ and a
115 * \f$ \delta \f$ value, and an iState value, which indicates whether the
116 * point is a liquid, a gas, or a supercritical fluid. Along with that the
117 * \f$ \tau\f$ and a \f$ \delta \f$ values are polynomials of \f$ \tau\f$ and
118 * a \f$ \delta \f$ that are kept by the WaterPropsIAPWSphi class. Therefore,
119 * whenever \f$ \tau\f$ or \f$ \delta \f$ is changed, the function setState()
120 * must be called in order for the internal state to be kept up to date.
121 *
122 * The class is pretty straightforward. However, one function deserves
123 * mention. The density() function calculates the density that is consistent
124 * with a particular value of the temperature and pressure. It may therefore
125 * be multivalued or potentially there may be no answer from this function. It
126 * therefore takes a phase guess and a density guess as optional parameters.
127 * If no guesses are supplied to density(), a gas phase guess is assumed. This
128 * may or may not be what is wanted. Therefore, density() should usually at
129 * least be supplied with a phase guess so that it may manufacture an
130 * appropriate density guess. density() manufactures the initial density
131 * guess, nondimensionalizes everything, and then calls
132 * WaterPropsIAPWSphi::dfind(), which does the iterative calculation to find
133 * the density condition that matches the desired input pressure.
134 *
135 * The phase guess defines are located in the .h file. they are
136 *
137 * - WATER_GAS
138 * - WATER_LIQUID
139 * - WATER_SUPERCRIT
140 *
141 * There are only three functions which actually change the value of the
142 * internal state of this object after it's been instantiated
143 *
144 * - setState_TR(temperature, rho)
145 * - density(temperature, pressure, phase, rhoguess)
146 * - psat(temperature, waterState);
147 *
148 * The setState_TR() is the main function that sets the temperature and rho
149 * value. The density() function serves as a setState_TP() function, in that
150 * it sets internal state to a temperature and pressure. However, note that
151 * this is potentially multivalued. Therefore, we need to supply in addition a
152 * phase guess and a rho guess to the input temperature and pressure. The
153 * psat() function sets the internal state to the saturated liquid or
154 * saturated gas state, depending on the waterState parameter.
155 *
156 * Because the underlying object WaterPropsIAPWSphi is privately held, you can
157 * be sure that the underlying state of this object doesn't change except due
158 * to the three function calls listed above.
159 *
160 * @ingroup thermoprops
161 */
162 class WaterPropsIAPWS
163{
164 public:
165 //! Base constructor
166 WaterPropsIAPWS();
167
168 WaterPropsIAPWS(const WaterPropsIAPWS& right) = delete;
169 WaterPropsIAPWS& operator=(const WaterPropsIAPWS& right) = delete;
170
171 //! Set the internal state of the object wrt temperature and density
172 /*!
173 * @param temperature temperature (kelvin)
174 * @param rho density (kg m-3)
175 */
176 void setState_TR(doublereal temperature, doublereal rho);
177
178 //! Calculate the Helmholtz free energy in mks units of J kmol-1 K-1,
179 //! using the last temperature and density
180 doublereal helmholtzFE() const;
181
182 //! Calculate the Gibbs free energy in mks units of J kmol-1 K-1.
183 //! using the last temperature and density
184 doublereal Gibbs() const;
185
186 //! Calculate the enthalpy in mks units of J kmol-1
187 //! using the last temperature and density
188 doublereal enthalpy() const;
189
190 //! Calculate the internal energy in mks units of J kmol-1
191 doublereal intEnergy() const;
192
193 //! Calculate the entropy in mks units of J kmol-1 K-1
194 doublereal entropy() const;
195
196 //! Calculate the constant volume heat capacity in mks units of J kmol-1 K-1
197 //! at the last temperature and density
198 doublereal cv() const;
199
200 //! Calculate the constant pressure heat capacity in mks units of J kmol-1 K-1
201 //! at the last temperature and density
202 doublereal cp() const;
203
204 //! Calculate the molar volume (kmol m-3) at the last temperature and
205 //! density
206 doublereal molarVolume() const;
207
208 //! Calculates the pressure (Pascals), given the current value of the
209 //! temperature and density.
210 /*!
211 * The density is an independent variable in the underlying equation of state
212 *
213 * @returns the pressure (Pascal)
214 */
215 doublereal pressure() const;
216
217 //! Calculates the density given the temperature and the pressure,
218 //! and a guess at the density. Sets the internal state.
219 /*!
220 * Note, below T_c, this is a multivalued function.
221 *
222 * The density() function calculates the density that is consistent with
223 * a particular value of the temperature and pressure. It may therefore be
224 * multivalued or potentially there may be no answer from this function.
225 * It therefore takes a phase guess and a density guess as optional
226 * parameters. If no guesses are supplied to density(), a gas phase guess
227 * is assumed. This may or may not be what is wanted. Therefore, density()
228 * should usually at least be supplied with a phase guess so that it may
229 * manufacture an appropriate density guess. density() manufactures the
230 * initial density guess, nondimensionalizes everything, and then calls
231 * WaterPropsIAPWSphi::dfind(), which does the iterative calculation to
232 * find the density condition that matches the desired input pressure.
233 *
234 * @param temperature Kelvin
235 * @param pressure Pressure in Pascals (Newton/m**2)
236 * @param phase guessed phase of water; -1: no guessed phase
237 * @param rhoguess guessed density of the water; -1.0 no guessed density
238 * @returns the density. If an error is encountered in the calculation the
239 * value of -1.0 is returned.
240 */
241 doublereal density(doublereal temperature, doublereal pressure,
242 int phase = -1, doublereal rhoguess = -1.0);
243
244 //! Calculates the density given the temperature and the pressure,
245 //! and a guess at the density, while not changing the internal state
246 /*!
247 * Note, below T_c, this is a multivalued function.
248 *
249 * The density() function calculates the density that is consistent with a
250 * particular value of the temperature and pressure. It may therefore be
251 * multivalued or potentially there may be no answer from this function.
252 * It therefore takes a phase guess and a density guess as optional
253 * parameters. If no guesses are supplied to density(), a gas phase guess
254 * is assumed. This may or may not be what is wanted. Therefore, density()
255 * should usually at least be supplied with a phase guess so that it may
256 * manufacture an appropriate density guess. density() manufactures the
257 * initial density guess, nondimensionalizes everything, and then calls
258 * WaterPropsIAPWSphi::dfind(), which does the iterative calculation to
259 * find the density condition that matches the desired input pressure.
260 *
261 * @param pressure Pressure in Pascals (Newton/m**2)
262 * @param phase guessed phase of water; -1: no guessed phase
263 * @param rhoguess guessed density of the water; -1.0: no guessed density
264 * @returns the density. If an error is encountered in the calculation the
265 * value of -1.0 is returned.
266 */
267 doublereal density_const(doublereal pressure, int phase = -1, doublereal rhoguess = -1.0) const;
268
269 //! Returns the density (kg m-3)
270 /*!
271 * The density is an independent variable in the underlying equation of state
272 *
273 * @returns the density (kg m-3)
274 */
275 doublereal density() const;
276
277 //! Returns the temperature (Kelvin)
278 /*!
279 * @return s the internally stored temperature
280 */
281 doublereal temperature() const;
282
283 //! Returns the coefficient of thermal expansion.
284 /*!
285 * alpha = d (ln V) / dT at constant P.
286 *
287 * @returns the coefficient of thermal expansion
288 */
289 doublereal coeffThermExp() const;
290
291 //! Returns the isochoric pressure derivative wrt temperature
292 /*!
293 * beta = M / (rho * Rgas) (d (pressure) / dT) at constant rho
294 *
295 * Note for ideal gases this is equal to one.
296 *
297 * beta = delta (phi0_d() + phiR_d()) - tau delta (phi0_dt() + phiR_dt())
298 */
299 doublereal coeffPresExp() const;
300
301 //! Returns the coefficient of isothermal compressibility for the state of
302 //! the object
303 /*!
304 * kappa = - d (ln V) / dP at constant T.
305 *
306 * units - 1/Pascal
307 *
308 * @returns the isothermal compressibility
309 */
310 doublereal isothermalCompressibility() const;
311
312 //! Returns the value of dp / drho at constant T for the state of the object
313 /*!
314 * units - Joules / kg
315 *
316 * @returns dpdrho
317 */
318 doublereal dpdrho() const;
319
320 //! This function returns an estimated value for the saturation pressure.
321 /*!
322 * It does this via a polynomial fit of the vapor pressure curve.
323 * units = (Pascals)
324 *
325 * @param temperature Input temperature (Kelvin)
326 *
327 * @returns the estimated saturation pressure
328 */
329 doublereal psat_est(doublereal temperature) const;
330
331 //! This function returns the saturation pressure given the temperature as
332 //! an input parameter, and sets the internal state to the saturated
333 //! conditions.
334 /*!
335 * Note this function will return the saturation pressure, given the
336 * temperature. It will then set the state of the system to the saturation
337 * condition. The input parameter waterState is used to either specify the
338 * liquid state or the gas state at the desired temperature and saturated
339 * pressure.
340 *
341 * If the input temperature, T, is above T_c, this routine will set the
342 * internal state to T and the pressure to P_c. Then, return P_c.
343 *
344 * @param temperature input temperature (kelvin)
345 * @param waterState integer specifying the water state
346 * @returns the saturation pressure. units = Pascal
347 */
348 doublereal psat(doublereal temperature, int waterState = WATER_LIQUID);
349
350 //! Return the value of the density at the water spinodal point (on the
351 //! liquid side) for the current temperature.
352 /*!
353 * @returns the density with units of kg m-3
354 */
355 doublereal densSpinodalWater() const;
356
357 //! Return the value of the density at the water spinodal point (on the gas
358 //! side) for the current temperature.
359 /*!
360 * @returns the density with units of kg m-3
361 */
362 doublereal densSpinodalSteam() const;
363
364 //! Returns the Phase State flag for the current state of the object
365 /*!
366 * @param checkState If true, this function does a complete check to see
367 * where in parameters space we are
368 *
369 * There are three values:
370 * - WATER_GAS below the critical temperature but below the critical density
371 * - WATER_LIQUID below the critical temperature but above the critical density
372 * - WATER_SUPERCRIT above the critical temperature
373 */
374 int phaseState(bool checkState = false) const;
375
376 //! Returns the critical temperature of water (Kelvin)
377 /*!
378 * This is hard coded to the value 647.096 Kelvin
379 */
380 doublereal Tcrit() const {
381 return 647.096;
382 }
383
384 //! Returns the critical pressure of water (22.064E6 Pa)
385 /*!
386 * This is hard coded to the value of 22.064E6 pascals
387 */
388 doublereal Pcrit() const {
389 return 22.064E6;
390 }
391
392 //! Return the critical density of water (kg m-3)
393 /*!
394 * This is equal to 322 kg m-3.
395 */
396 doublereal Rhocrit() const {
397 return 322.;
398 }
399
400 private:
401 //! Calculate the dimensionless temp and rho and store internally.
402 /*!
403 * @param temperature input temperature (kelvin)
404 * @param rho density in kg m-3
405 */
406 void calcDim(doublereal temperature, doublereal rho);
407
408 //! Utility routine in the calculation of the saturation pressure
409 /*!
410 * Calculate the Gibbs free energy in mks units of J kmol-1 K-1.
411 *
412 * @param temperature temperature (kelvin)
413 * @param pressure pressure (Pascal)
414 * @param densLiq Output density of liquid
415 * @param densGas output Density of gas
416 * @param delGRT output delGRT
417 */
418 void corr(doublereal temperature, doublereal pressure, doublereal& densLiq,
419 doublereal& densGas, doublereal& delGRT);
420
421 //! Utility routine in the calculation of the saturation pressure
422 /*!
423 * @param temperature temperature (kelvin)
424 * @param pressure pressure (Pascal)
425 * @param densLiq Output density of liquid
426 * @param densGas output Density of gas
427 * @param pcorr output corrected pressure
428 */
429 void corr1(doublereal temperature, doublereal pressure, doublereal& densLiq,
430 doublereal& densGas, doublereal& pcorr);
431
432 //! pointer to the underlying object that does the calculations.
433 mutable WaterPropsIAPWSphi m_phi;
434
435 //! Dimensionless temperature, tau = T_C / T
436 doublereal tau;
437
438 //! Dimensionless density, delta = rho / rho_c
439 mutable doublereal delta;
440
441 //! Current state of the system
442 mutable int iState;
443};
444
445}
446#endif
WaterPropsIAPWSphi.h
Header for Lowest level of the classes which support a real water model (see class WaterPropsIAPWS an...
Cantera::WaterPropsIAPWS
Class for calculating the equation of state of water.
Definition: WaterPropsIAPWS.h:163
Cantera::WaterPropsIAPWS::corr
void corr(doublereal temperature, doublereal pressure, doublereal &densLiq, doublereal &densGas, doublereal &delGRT)
Utility routine in the calculation of the saturation pressure.
Definition: WaterPropsIAPWS.cpp:274
Cantera::WaterPropsIAPWS::corr1
void corr1(doublereal temperature, doublereal pressure, doublereal &densLiq, doublereal &densGas, doublereal &pcorr)
Utility routine in the calculation of the saturation pressure.
Definition: WaterPropsIAPWS.cpp:298
Cantera::WaterPropsIAPWS::calcDim
void calcDim(doublereal temperature, doublereal rho)
Calculate the dimensionless temp and rho and store internally.
Definition: WaterPropsIAPWS.cpp:45
Cantera::WaterPropsIAPWS::coeffThermExp
doublereal coeffThermExp() const
Returns the coefficient of thermal expansion.
Definition: WaterPropsIAPWS.cpp:259
Cantera::WaterPropsIAPWS::densSpinodalWater
doublereal densSpinodalWater() const
Return the value of the density at the water spinodal point (on the liquid side) for the current temp...
Definition: WaterPropsIAPWS.cpp:405
Cantera::WaterPropsIAPWS::cp
doublereal cp() const
Calculate the constant pressure heat capacity in mks units of J kmol-1 K-1 at the last temperature an...
Definition: WaterPropsIAPWS.cpp:612
Cantera::WaterPropsIAPWS::tau
doublereal tau
Dimensionless temperature, tau = T_C / T.
Definition: WaterPropsIAPWS.h:436
Cantera::WaterPropsIAPWS::pressure
doublereal pressure() const
Calculates the pressure (Pascals), given the current value of the temperature and density.
Definition: WaterPropsIAPWS.cpp:70
Cantera::WaterPropsIAPWS::enthalpy
doublereal enthalpy() const
Calculate the enthalpy in mks units of J kmol-1 using the last temperature and density.
Definition: WaterPropsIAPWS.cpp:586
Cantera::WaterPropsIAPWS::density_const
doublereal density_const(doublereal pressure, int phase=-1, doublereal rhoguess=-1.0) const
Calculates the density given the temperature and the pressure, and a guess at the density,...
Definition: WaterPropsIAPWS.cpp:138
Cantera::WaterPropsIAPWS::coeffPresExp
doublereal coeffPresExp() const
Returns the isochoric pressure derivative wrt temperature.
Definition: WaterPropsIAPWS.cpp:254
Cantera::WaterPropsIAPWS::Tcrit
doublereal Tcrit() const
Returns the critical temperature of water (Kelvin)
Definition: WaterPropsIAPWS.h:380
Cantera::WaterPropsIAPWS::WaterPropsIAPWS
WaterPropsIAPWS()
Base constructor.
Definition: WaterPropsIAPWS.cpp:38
Cantera::WaterPropsIAPWS::densSpinodalSteam
doublereal densSpinodalSteam() const
Return the value of the density at the water spinodal point (on the gas side) for the current tempera...
Definition: WaterPropsIAPWS.cpp:493
Cantera::WaterPropsIAPWS::cv
doublereal cv() const
Calculate the constant volume heat capacity in mks units of J kmol-1 K-1 at the last temperature and ...
Definition: WaterPropsIAPWS.cpp:606
Cantera::WaterPropsIAPWS::molarVolume
doublereal molarVolume() const
Calculate the molar volume (kmol m-3) at the last temperature and density.
Definition: WaterPropsIAPWS.cpp:618
Cantera::WaterPropsIAPWS::entropy
doublereal entropy() const
Calculate the entropy in mks units of J kmol-1 K-1.
Definition: WaterPropsIAPWS.cpp:600
Cantera::WaterPropsIAPWS::intEnergy
doublereal intEnergy() const
Calculate the internal energy in mks units of J kmol-1.
Definition: WaterPropsIAPWS.cpp:593
Cantera::WaterPropsIAPWS::Rhocrit
doublereal Rhocrit() const
Return the critical density of water (kg m-3)
Definition: WaterPropsIAPWS.h:396
Cantera::WaterPropsIAPWS::density
doublereal density() const
Returns the density (kg m-3)
Definition: WaterPropsIAPWS.cpp:192
Cantera::WaterPropsIAPWS::Gibbs
doublereal Gibbs() const
Calculate the Gibbs free energy in mks units of J kmol-1 K-1.
Definition: WaterPropsIAPWS.cpp:267
Cantera::WaterPropsIAPWS::iState
int iState
Current state of the system.
Definition: WaterPropsIAPWS.h:442
Cantera::WaterPropsIAPWS::temperature
doublereal temperature() const
Returns the temperature (Kelvin)
Definition: WaterPropsIAPWS.cpp:197
Cantera::WaterPropsIAPWS::helmholtzFE
doublereal helmholtzFE() const
Calculate the Helmholtz free energy in mks units of J kmol-1 K-1, using the last temperature and dens...
Definition: WaterPropsIAPWS.cpp:62
Cantera::WaterPropsIAPWS::psat_est
doublereal psat_est(doublereal temperature) const
This function returns an estimated value for the saturation pressure.
Definition: WaterPropsIAPWS.cpp:202
Cantera::WaterPropsIAPWS::delta
doublereal delta
Dimensionless density, delta = rho / rho_c.
Definition: WaterPropsIAPWS.h:439
Cantera::WaterPropsIAPWS::psat
doublereal psat(doublereal temperature, int waterState=WATER_LIQUID)
This function returns the saturation pressure given the temperature as an input parameter,...
Definition: WaterPropsIAPWS.cpp:323
Cantera::WaterPropsIAPWS::setState_TR
void setState_TR(doublereal temperature, doublereal rho)
Set the internal state of the object wrt temperature and density.
Definition: WaterPropsIAPWS.cpp:580
Cantera::WaterPropsIAPWS::m_phi
WaterPropsIAPWSphi m_phi
pointer to the underlying object that does the calculations.
Definition: WaterPropsIAPWS.h:433
Cantera::WaterPropsIAPWS::dpdrho
doublereal dpdrho() const
Returns the value of dp / drho at constant T for the state of the object.
Definition: WaterPropsIAPWS.cpp:247
Cantera::WaterPropsIAPWS::phaseState
int phaseState(bool checkState=false) const
Returns the Phase State flag for the current state of the object.
Definition: WaterPropsIAPWS.cpp:365
Cantera::WaterPropsIAPWS::isothermalCompressibility
doublereal isothermalCompressibility() const
Returns the coefficient of isothermal compressibility for the state of the object.
Definition: WaterPropsIAPWS.cpp:240
Cantera::WaterPropsIAPWS::Pcrit
doublereal Pcrit() const
Returns the critical pressure of water (22.064E6 Pa)
Definition: WaterPropsIAPWS.h:388
Cantera::WaterPropsIAPWSphi
Low level class for the real description of water.
Definition: WaterPropsIAPWSphi.h:35
Cantera
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:557