| Cantera 3.0.0

Loading...
Searching...
No Matches
WaterSSTP.cpp
Go to the documentation of this file.
1/**
2 * @file WaterSSTP.cpp
3 * Definitions for a ThermoPhase class consisting of pure water (see @ref thermoprops
4 * and class @link Cantera::WaterSSTP WaterSSTP@endlink).
5 */
6
7// This file is part of Cantera. See License.txt in the top-level directory or
8// at https://cantera.org/license.txt for license and copyright information.
9
10#include "cantera/thermo/WaterSSTP.h"
11#include "cantera/thermo/ThermoFactory.h"
12#include "cantera/base/stringUtils.h"
13
14 namespace Cantera
15{
16 WaterSSTP::WaterSSTP(const string& inputFile, const string& id)
17{
18 initThermoFile(inputFile, id);
19}
20
21 string WaterSSTP::phaseOfMatter() const {
22 const vector<string> phases = {
23 "gas", "liquid", "supercritical", "unstable-liquid", "unstable-gas"
24 };
25 return phases[m_sub.phaseState()];
26}
27
28 void WaterSSTP::initThermo()
29{
30 SingleSpeciesTP::initThermo();
31
32 // Calculate the molecular weight. Note while there may be a very good
33 // calculated weight in the steam table class, using this weight may lead to
34 // codes exhibiting mass loss issues. We need to grab the elemental atomic
35 // weights used in the Element class and calculate a consistent H2O
36 // molecular weight based on that.
37 size_t nH = elementIndex("H");
38 if (nH == npos) {
39 throw CanteraError("WaterSSTP::initThermo",
40 "H not an element");
41 }
42 double mw_H = atomicWeight(nH);
43 size_t nO = elementIndex("O");
44 if (nO == npos) {
45 throw CanteraError("WaterSSTP::initThermo",
46 "O not an element");
47 }
48 double mw_O = atomicWeight(nO);
49 m_mw = 2.0 * mw_H + mw_O;
50 setMolecularWeight(0,m_mw);
51
52 // Set the baseline
53 double T = 298.15;
54 Phase::setDensity(7.0E-8);
55 Phase::setTemperature(T);
56
57 double presLow = 1.0E-2;
58 double oneBar = 1.0E5;
59 double dd = m_sub.density(T, presLow, WATER_GAS, 7.0E-8);
60 setDensity(dd);
61 setTemperature(T);
62 SW_Offset = 0.0;
63 double s = entropy_mole();
64 s -= GasConstant * log(oneBar/presLow);
65 if (s != 188.835E3) {
66 SW_Offset = 188.835E3 - s;
67 }
68 s = entropy_mole();
69 s -= GasConstant * log(oneBar/presLow);
70
71 double h = enthalpy_mole();
72 if (h != -241.826E6) {
73 EW_Offset = -241.826E6 - h;
74 }
75 h = enthalpy_mole();
76
77 // Set the initial state of the system to 298.15 K and 1 bar.
78 setTemperature(298.15);
79 double rho0 = m_sub.density(298.15, OneAtm, WATER_LIQUID);
80 setDensity(rho0);
81
82 m_waterProps = make_unique<WaterProps>(&m_sub);
83
84 // Set the flag to say we are ready to calculate stuff
85 m_ready = true;
86}
87
88 void WaterSSTP::getEnthalpy_RT(double* hrt) const
89{
90 *hrt = (m_sub.enthalpy_mass() * m_mw + EW_Offset) / RT();
91}
92
93 void WaterSSTP::getIntEnergy_RT(double* ubar) const
94{
95 *ubar = (m_sub.intEnergy_mass() * m_mw + EW_Offset)/ RT();
96}
97
98 void WaterSSTP::getEntropy_R(double* sr) const
99{
100 sr[0] = (m_sub.entropy_mass() * m_mw + SW_Offset) / GasConstant;
101}
102
103 void WaterSSTP::getGibbs_RT(double* grt) const
104{
105 *grt = (m_sub.gibbs_mass() * m_mw + EW_Offset) / RT()
106 - SW_Offset / GasConstant;
107 if (!m_ready) {
108 throw CanteraError("waterSSTP::getGibbs_RT", "Phase not ready");
109 }
110}
111
112 void WaterSSTP::getStandardChemPotentials(double* gss) const
113{
114 *gss = (m_sub.gibbs_mass() * m_mw + EW_Offset - SW_Offset*temperature());
115 if (!m_ready) {
116 throw CanteraError("waterSSTP::getStandardChemPotentials",
117 "Phase not ready");
118 }
119}
120
121 void WaterSSTP::getCp_R(double* cpr) const
122{
123 cpr[0] = m_sub.cp_mass() * m_mw / GasConstant;
124}
125
126 double WaterSSTP::cv_mole() const
127{
128 return m_sub.cv_mass() * m_mw;
129}
130
131 void WaterSSTP::getEnthalpy_RT_ref(double* hrt) const
132{
133 double p = pressure();
134 double T = temperature();
135 double dens = density();
136 int waterState = WATER_GAS;
137 double rc = m_sub.Rhocrit();
138 if (dens > rc) {
139 waterState = WATER_LIQUID;
140 }
141 double dd = m_sub.density(T, OneAtm, waterState, dens);
142 if (dd <= 0.0) {
143 throw CanteraError("WaterSSTP::getEnthalpy_RT_ref", "error");
144 }
145 double h = m_sub.enthalpy_mass() * m_mw;
146 *hrt = (h + EW_Offset) / RT();
147 dd = m_sub.density(T, p, waterState, dens);
148}
149
150 void WaterSSTP::getGibbs_RT_ref(double* grt) const
151{
152 double p = pressure();
153 double T = temperature();
154 double dens = density();
155 int waterState = WATER_GAS;
156 double rc = m_sub.Rhocrit();
157 if (dens > rc) {
158 waterState = WATER_LIQUID;
159 }
160 double dd = m_sub.density(T, OneAtm, waterState, dens);
161 if (dd <= 0.0) {
162 throw CanteraError("WaterSSTP::getGibbs_RT_ref", "error");
163 }
164 m_sub.setState_TD(T, dd);
165 double g = m_sub.gibbs_mass() * m_mw;
166 *grt = (g + EW_Offset - SW_Offset*T)/ RT();
167 dd = m_sub.density(T, p, waterState, dens);
168}
169
170 void WaterSSTP::getGibbs_ref(double* g) const
171{
172 getGibbs_RT_ref(g);
173 for (size_t k = 0; k < m_kk; k++) {
174 g[k] *= RT();
175 }
176}
177
178 void WaterSSTP::getEntropy_R_ref(double* sr) const
179{
180 double p = pressure();
181 double T = temperature();
182 double dens = density();
183 int waterState = WATER_GAS;
184 double rc = m_sub.Rhocrit();
185 if (dens > rc) {
186 waterState = WATER_LIQUID;
187 }
188 double dd = m_sub.density(T, OneAtm, waterState, dens);
189
190 if (dd <= 0.0) {
191 throw CanteraError("WaterSSTP::getEntropy_R_ref", "error");
192 }
193 m_sub.setState_TD(T, dd);
194
195 double s = m_sub.entropy_mass() * m_mw;
196 *sr = (s + SW_Offset)/ GasConstant;
197 dd = m_sub.density(T, p, waterState, dens);
198}
199
200 void WaterSSTP::getCp_R_ref(double* cpr) const
201{
202 double p = pressure();
203 double T = temperature();
204 double dens = density();
205 int waterState = WATER_GAS;
206 double rc = m_sub.Rhocrit();
207 if (dens > rc) {
208 waterState = WATER_LIQUID;
209 }
210 double dd = m_sub.density(T, OneAtm, waterState, dens);
211 m_sub.setState_TD(T, dd);
212 if (dd <= 0.0) {
213 throw CanteraError("WaterSSTP::getCp_R_ref", "error");
214 }
215 double cp = m_sub.cp_mass() * m_mw;
216 *cpr = cp / GasConstant;
217 dd = m_sub.density(T, p, waterState, dens);
218}
219
220 void WaterSSTP::getStandardVolumes_ref(double* vol) const
221{
222 double p = pressure();
223 double T = temperature();
224 double dens = density();
225 int waterState = WATER_GAS;
226 double rc = m_sub.Rhocrit();
227 if (dens > rc) {
228 waterState = WATER_LIQUID;
229 }
230 double dd = m_sub.density(T, OneAtm, waterState, dens);
231 if (dd <= 0.0) {
232 throw CanteraError("WaterSSTP::getStandardVolumes_ref", "error");
233 }
234 *vol = meanMolecularWeight() /dd;
235 dd = m_sub.density(T, p, waterState, dens);
236}
237
238 double WaterSSTP::pressure() const
239{
240 return m_sub.pressure();
241}
242
243 void WaterSSTP::setPressure(double p)
244{
245 double T = temperature();
246 double dens = density();
247 double pp = m_sub.psat(T);
248 int waterState = WATER_SUPERCRIT;
249 if (T < m_sub.Tcrit()) {
250 if (p >= pp) {
251 waterState = WATER_LIQUID;
252 dens = 1000.;
253 } else if (!m_allowGasPhase) {
254 throw CanteraError("WaterSSTP::setPressure",
255 "Model assumes liquid phase; pressure p = {} lies below\n"
256 "the saturation pressure (P_sat = {}).", p, pp);
257 }
258 }
259
260 double dd = m_sub.density(T, p, waterState, dens);
261 if (dd <= 0.0) {
262 throw CanteraError("WaterSSTP::setPressure", "Error");
263 }
264 setDensity(dd);
265}
266
267 double WaterSSTP::isothermalCompressibility() const
268{
269 return m_sub.isothermalCompressibility();
270}
271
272 double WaterSSTP::thermalExpansionCoeff() const
273{
274 return m_sub.coeffThermExp();
275}
276
277 double WaterSSTP::dthermalExpansionCoeffdT() const
278{
279 double pres = pressure();
280 double dens_save = density();
281 double T = temperature();
282 double tt = T - 0.04;
283 double dd = m_sub.density(tt, pres, WATER_LIQUID, dens_save);
284 if (dd < 0.0) {
285 throw CanteraError("WaterSSTP::dthermalExpansionCoeffdT",
286 "Unable to solve for the density at T = {}, P = {}", tt, pres);
287 }
288 double vald = m_sub.coeffThermExp();
289 m_sub.setState_TD(T, dens_save);
290 double val2 = m_sub.coeffThermExp();
291 return (val2 - vald) / 0.04;
292}
293
294 double WaterSSTP::critTemperature() const
295{
296 return m_sub.Tcrit();
297}
298
299 double WaterSSTP::critPressure() const
300{
301 return m_sub.Pcrit();
302}
303
304 double WaterSSTP::critDensity() const
305{
306 return m_sub.Rhocrit();
307}
308
309 void WaterSSTP::setTemperature(const double temp)
310{
311 if (temp < 273.16) {
312 throw CanteraError("WaterSSTP::setTemperature",
313 "Model assumes liquid phase; temperature T = {} lies below\n"
314 "the triple point temperature (T_triple = 273.16).", temp);
315 }
316 Phase::setTemperature(temp);
317 m_sub.setState_TD(temp, density());
318}
319
320 void WaterSSTP::setDensity(const double dens)
321{
322 Phase::setDensity(dens);
323 m_sub.setState_TD(temperature(), dens);
324}
325
326 double WaterSSTP::satPressure(double t) {
327 double tsave = temperature();
328 double dsave = density();
329 double pp = m_sub.psat(t);
330 m_sub.setState_TD(tsave, dsave);
331 return pp;
332}
333
334 double WaterSSTP::vaporFraction() const
335{
336 if (temperature() >= m_sub.Tcrit()) {
337 double dens = density();
338 if (dens >= m_sub.Rhocrit()) {
339 return 0.0;
340 }
341 return 1.0;
342 }
343 // If below tcrit we always return 0 from this class
344 return 0.0;
345}
346
347}
ThermoFactory.h
Headers for the factory class that can create known ThermoPhase objects (see Thermodynamic Properties...
WaterSSTP.h
Declares a ThermoPhase class consisting of pure water (see Thermodynamic Properties and class WaterSS...
Cantera::CanteraError
Base class for exceptions thrown by Cantera classes.
Definition ctexceptions.h:66
Cantera::Phase::m_kk
size_t m_kk
Number of species in the phase.
Definition Phase.h:947
Cantera::Phase::temperature
double temperature() const
Temperature (K).
Definition Phase.h:662
Cantera::Phase::meanMolecularWeight
double meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
Definition Phase.h:760
Cantera::Phase::elementIndex
size_t elementIndex(const string &name) const
Return the index of element named 'name'.
Definition Phase.cpp:55
Cantera::Phase::atomicWeight
double atomicWeight(size_t m) const
Atomic weight of element m.
Definition Phase.cpp:70
Cantera::Phase::setDensity
virtual void setDensity(const double density_)
Set the internally stored density (kg/m^3) of the phase.
Definition Phase.cpp:707
Cantera::Phase::density
virtual double density() const
Density (kg/m^3).
Definition Phase.h:687
Cantera::Phase::setTemperature
virtual void setTemperature(double temp)
Set the internally stored temperature of the phase (K).
Definition Phase.h:728
Cantera::Phase::setMolecularWeight
void setMolecularWeight(const int k, const double mw)
Set the molecular weight of a single species to a given value.
Definition Phase.cpp:1016
Cantera::SingleSpeciesTP::enthalpy_mole
double enthalpy_mole() const override
Molar enthalpy. Units: J/kmol.
Definition SingleSpeciesTP.cpp:20
Cantera::SingleSpeciesTP::entropy_mole
double entropy_mole() const override
Molar entropy. Units: J/kmol/K.
Definition SingleSpeciesTP.cpp:34
Cantera::ThermoPhase::RT
double RT() const
Return the Gas Constant multiplied by the current temperature.
Definition ThermoPhase.h:1077
Cantera::ThermoPhase::initThermo
virtual void initThermo()
Initialize the ThermoPhase object after all species have been set up.
Definition ThermoPhase.cpp:1093
Cantera::ThermoPhase::initThermoFile
void initThermoFile(const string &inputFile, const string &id)
Initialize a ThermoPhase object using an input file.
Definition ThermoPhase.cpp:1072
Cantera::WaterPropsIAPWS::coeffThermExp
double coeffThermExp() const
Returns the coefficient of thermal expansion.
Definition WaterPropsIAPWS.cpp:255
Cantera::WaterPropsIAPWS::density
double density(double temperature, double pressure, int phase=-1, double rhoguess=-1.0)
Calculates the density given the temperature and the pressure, and a guess at the density.
Definition WaterPropsIAPWS.cpp:75
Cantera::WaterPropsIAPWS::pressure
double pressure() const
Calculates the pressure (Pascals), given the current value of the temperature and density.
Definition WaterPropsIAPWS.cpp:67
Cantera::WaterPropsIAPWS::gibbs_mass
double gibbs_mass() const
Get the Gibbs free energy (J/kg) at the current temperature and density.
Definition WaterPropsIAPWS.cpp:591
Cantera::WaterPropsIAPWS::isothermalCompressibility
double isothermalCompressibility() const
Returns the coefficient of isothermal compressibility for the state of the object.
Definition WaterPropsIAPWS.cpp:236
Cantera::WaterPropsIAPWS::psat
double psat(double temperature, int waterState=WATER_LIQUID)
This function returns the saturation pressure given the temperature as an input parameter,...
Definition WaterPropsIAPWS.cpp:321
Cantera::WaterPropsIAPWS::Pcrit
double Pcrit() const
Returns the critical pressure of water (22.064E6 Pa)
Definition WaterPropsIAPWS.h:432
Cantera::WaterPropsIAPWS::cv_mass
double cv_mass() const
Get the constant volume heat capacity (J/kg/K) at the current temperature and density.
Definition WaterPropsIAPWS.cpp:611
Cantera::WaterPropsIAPWS::entropy_mass
double entropy_mass() const
Get the entropy (J/kg/K) at the current temperature and density.
Definition WaterPropsIAPWS.cpp:606
Cantera::WaterPropsIAPWS::Rhocrit
double Rhocrit() const
Return the critical density of water (kg m-3)
Definition WaterPropsIAPWS.h:440
Cantera::WaterPropsIAPWS::Tcrit
double Tcrit() const
Returns the critical temperature of water (Kelvin)
Definition WaterPropsIAPWS.h:424
Cantera::WaterPropsIAPWS::cp_mass
double cp_mass() const
Get the constant pressure heat capacity (J/kg/K) at the current temperature and density.
Definition WaterPropsIAPWS.cpp:616
Cantera::WaterPropsIAPWS::intEnergy_mass
double intEnergy_mass() const
Get the internal energy (J/kg) at the current temperature and density.
Definition WaterPropsIAPWS.cpp:601
Cantera::WaterPropsIAPWS::setState_TD
void setState_TD(double temperature, double rho)
Set the internal state of the object wrt temperature and density.
Definition WaterPropsIAPWS.cpp:585
Cantera::WaterPropsIAPWS::phaseState
int phaseState(bool checkState=false) const
Returns the Phase State flag for the current state of the object.
Definition WaterPropsIAPWS.cpp:363
Cantera::WaterPropsIAPWS::enthalpy_mass
double enthalpy_mass() const
Get the enthalpy (J/kg) at the current temperature and density.
Definition WaterPropsIAPWS.cpp:596
Cantera::WaterSSTP::setDensity
void setDensity(const double dens) override
Set the density of the phase.
Definition WaterSSTP.cpp:320
Cantera::WaterSSTP::m_waterProps
unique_ptr< WaterProps > m_waterProps
Pointer to the WaterProps object.
Definition WaterSSTP.h:200
Cantera::WaterSSTP::thermalExpansionCoeff
double thermalExpansionCoeff() const override
Return the volumetric thermal expansion coefficient. Units: 1/K.
Definition WaterSSTP.cpp:272
Cantera::WaterSSTP::m_sub
WaterPropsIAPWS m_sub
WaterPropsIAPWS that calculates the real properties of water.
Definition WaterSSTP.h:192
Cantera::WaterSSTP::m_ready
bool m_ready
Boolean is true if object has been properly initialized for calculation.
Definition WaterSSTP.h:220
Cantera::WaterSSTP::pressure
double pressure() const override
Return the thermodynamic pressure (Pa).
Definition WaterSSTP.cpp:238
Cantera::WaterSSTP::critPressure
double critPressure() const override
Critical pressure (Pa).
Definition WaterSSTP.cpp:299
Cantera::WaterSSTP::SW_Offset
double SW_Offset
Offset constant used to obtain consistency with NIST convention.
Definition WaterSSTP.h:217
Cantera::WaterSSTP::critDensity
double critDensity() const override
Critical density (kg/m3).
Definition WaterSSTP.cpp:304
Cantera::WaterSSTP::getEntropy_R
void getEntropy_R(double *sr) const override
Get the array of nondimensional Entropy functions for the standard state species at the current T and...
Definition WaterSSTP.cpp:98
Cantera::WaterSSTP::getGibbs_ref
void getGibbs_ref(double *g) const override
Returns the vector of the Gibbs function of the reference state at the current temperature of the sol...
Definition WaterSSTP.cpp:170
Cantera::WaterSSTP::critTemperature
double critTemperature() const override
Critical temperature (K).
Definition WaterSSTP.cpp:294
Cantera::WaterSSTP::WaterSSTP
WaterSSTP(const string &inputFile="", const string &id="")
Full constructor for a water phase.
Definition WaterSSTP.cpp:16
Cantera::WaterSSTP::getCp_R
void getCp_R(double *cpr) const override
Get the nondimensional Heat Capacities at constant pressure for the species standard states at the cu...
Definition WaterSSTP.cpp:121
Cantera::WaterSSTP::initThermo
void initThermo() override
Initialize the ThermoPhase object after all species have been set up.
Definition WaterSSTP.cpp:28
Cantera::WaterSSTP::setPressure
void setPressure(double p) override
Set the internally stored pressure (Pa) at constant temperature and composition.
Definition WaterSSTP.cpp:243
Cantera::WaterSSTP::getStandardVolumes_ref
void getStandardVolumes_ref(double *vol) const override
Get the molar volumes of the species reference states at the current T and P_ref of the solution.
Definition WaterSSTP.cpp:220
Cantera::WaterSSTP::vaporFraction
double vaporFraction() const override
Return the fraction of vapor at the current conditions.
Definition WaterSSTP.cpp:334
Cantera::WaterSSTP::dthermalExpansionCoeffdT
double dthermalExpansionCoeffdT() const
Return the derivative of the volumetric thermal expansion coefficient.
Definition WaterSSTP.cpp:277
Cantera::WaterSSTP::cv_mole
double cv_mole() const override
Molar heat capacity at constant volume. Units: J/kmol/K.
Definition WaterSSTP.cpp:126
Cantera::WaterSSTP::EW_Offset
double EW_Offset
Offset constants used to obtain consistency with the NIST database.
Definition WaterSSTP.h:210
Cantera::WaterSSTP::getEnthalpy_RT
void getEnthalpy_RT(double *hrt) const override
Get the nondimensional Enthalpy functions for the species at their standard states at the current T a...
Definition WaterSSTP.cpp:88
Cantera::WaterSSTP::getEntropy_R_ref
void getEntropy_R_ref(double *er) const override
Returns the vector of nondimensional entropies of the reference state at the current temperature of t...
Definition WaterSSTP.cpp:178
Cantera::WaterSSTP::setTemperature
void setTemperature(const double temp) override
Set the temperature of the phase.
Definition WaterSSTP.cpp:309
Cantera::WaterSSTP::isothermalCompressibility
double isothermalCompressibility() const override
Returns the isothermal compressibility. Units: 1/Pa.
Definition WaterSSTP.cpp:267
Cantera::WaterSSTP::getGibbs_RT
void getGibbs_RT(double *grt) const override
Get the nondimensional Gibbs functions for the species in their standard states at the current T and ...
Definition WaterSSTP.cpp:103
Cantera::WaterSSTP::getStandardChemPotentials
void getStandardChemPotentials(double *gss) const override
Get the array of chemical potentials at unit activity for the species at their standard states at the...
Definition WaterSSTP.cpp:112
Cantera::WaterSSTP::getCp_R_ref
void getCp_R_ref(double *cprt) const override
Returns the vector of nondimensional constant pressure heat capacities of the reference state at the ...
Definition WaterSSTP.cpp:200
Cantera::WaterSSTP::getIntEnergy_RT
void getIntEnergy_RT(double *urt) const override
Returns the vector of nondimensional Internal Energies of the standard state species at the current T...
Definition WaterSSTP.cpp:93
Cantera::WaterSSTP::m_mw
double m_mw
Molecular weight of Water -> Cantera assumption.
Definition WaterSSTP.h:203
Cantera::WaterSSTP::m_allowGasPhase
bool m_allowGasPhase
Since this phase represents a liquid (or supercritical) phase, it is an error to return a gas-phase a...
Definition WaterSSTP.h:228
Cantera::WaterSSTP::getGibbs_RT_ref
void getGibbs_RT_ref(double *grt) const override
Returns the vector of nondimensional Gibbs Free Energies of the reference state at the current temper...
Definition WaterSSTP.cpp:150
Cantera::WaterSSTP::phaseOfMatter
string phaseOfMatter() const override
String indicating the mechanical phase of the matter in this Phase.
Definition WaterSSTP.cpp:21
Cantera::WaterSSTP::getEnthalpy_RT_ref
void getEnthalpy_RT_ref(double *hrt) const override
Returns the vector of nondimensional enthalpies of the reference state at the current temperature of ...
Definition WaterSSTP.cpp:131
Cantera::WaterSSTP::satPressure
double satPressure(double t) override
Return the saturation pressure given the temperature.
Definition WaterSSTP.cpp:326
Cantera::OneAtm
const double OneAtm
One atmosphere [Pa].
Definition ct_defs.h:96
Cantera::GasConstant
const double GasConstant
Universal Gas Constant [J/kmol/K].
Definition ct_defs.h:120
Cantera
Namespace for the Cantera kernel.
Definition AnyMap.cpp:564
Cantera::npos
const size_t npos
index returned by functions to indicate "no position"
Definition ct_defs.h:195
stringUtils.h
Contains declarations for string manipulation functions within Cantera.