Cantera  3.1.0a1
PDSS_Water.cpp
Go to the documentation of this file.
1 /**
2  * @file PDSS_Water.cpp
3  */
4 
5 // This file is part of Cantera. See License.txt in the top-level directory or
6 // at https://cantera.org/license.txt for license and copyright information.
7 
12 #include "cantera/base/global.h"
13 
14 namespace Cantera
15 {
17  m_waterProps(&m_sub)
18 {
19  m_minTemp = 200.;
20  m_maxTemp = 10000.;
21  m_mw = 2*getElementWeight("H") + getElementWeight("O");
22 
23  // Set the baseline
24  double T = 298.15;
25  m_p0 = OneAtm;
26  double presLow = 1.0E-2;
27  double oneBar = 1.0E5;
28  double dens = 1.0E-9;
29  m_dens = m_sub.density(T, presLow, WATER_GAS, dens);
30  m_pres = presLow;
31  SW_Offset = 0.0;
32  double s = entropy_mole();
33  s -= GasConstant * log(oneBar/presLow);
34  if (s != 188.835E3) {
35  SW_Offset = 188.835E3 - s;
36  }
37  s = entropy_mole();
38  s -= GasConstant * log(oneBar/presLow);
39 
40  double h = enthalpy_mole();
41  if (h != -241.826E6) {
42  EW_Offset = -241.826E6 - h;
43  }
44  h = enthalpy_mole();
45 
46  // Set the initial state of the system to 298.15 K and 1 bar.
47  setTemperature(298.15);
48  m_dens = m_sub.density(298.15, OneAtm, WATER_LIQUID);
49  m_pres = OneAtm;
50 }
51 
53 {
54  return m_sub.enthalpy_mass() * m_mw + EW_Offset;
55 }
56 
58 {
59  return m_sub.intEnergy_mass() * m_mw + EW_Offset;
60 }
61 
63 {
64  return m_sub.entropy_mass() * m_mw + SW_Offset;
65 }
66 
67 double PDSS_Water::gibbs_mole() const
68 {
70 }
71 
72 double PDSS_Water::cp_mole() const
73 {
74  return m_sub.cp_mass() * m_mw;
75 }
76 
77 double PDSS_Water::cv_mole() const
78 {
79  return m_sub.cv_mass() * m_mw;
80 }
81 
83 {
84  return m_mw / m_sub.density();
85 }
86 
88 {
90  double h = m_sub.enthalpy_mass() * m_mw;
92  return (h + EW_Offset - SW_Offset * m_temp) / (m_temp * GasConstant);
93 }
94 
96 {
98  double h = m_sub.enthalpy_mass() * m_mw;
100  return (h + EW_Offset) / (m_temp * GasConstant);
101 }
102 
104 {
106  double s = m_sub.entropy_mass() * m_mw;
108  return (s + SW_Offset) / GasConstant;
109 }
110 
111 double PDSS_Water::cp_R_ref() const
112 {
114  double cp = m_sub.cp_mass() * m_mw;
116  return cp / GasConstant;
117 }
118 
120 {
122  double mv = m_mw / m_sub.density();
124  return mv;
125 }
126 
127 double PDSS_Water::pressure() const
128 {
129  m_pres = m_sub.pressure();
130  return m_pres;
131 }
132 
134 {
135  // In this routine we must be sure to only find the water branch of the
136  // curve and not the gas branch
137  double T = m_temp;
138  double dens = m_dens;
139  int waterState = WATER_LIQUID;
140  if (T > m_sub.Tcrit()) {
141  waterState = WATER_SUPERCRIT;
142  }
143 
144  double dd = m_sub.density(T, p, waterState, dens);
145  if (dd <= 0.0) {
146  throw CanteraError("PDSS_Water:setPressure",
147  "Failed to set water SS state: T = {} K and p = {} Pa", T, p);
148  }
149  m_dens = dd;
150  m_pres = p;
151 
152  // We are only putting the phase check here because of speed considerations.
153  m_iState = m_sub.phaseState(true);
154  if (!m_allowGasPhase && m_iState != WATER_SUPERCRIT && m_iState != WATER_LIQUID && m_iState != WATER_UNSTABLELIQUID) {
155  throw CanteraError("PDSS_Water::setPressure",
156  "Water State isn't liquid or crit");
157  }
158 }
159 
161 {
162  return m_sub.coeffThermExp();
163 }
164 
166 {
167  double pres = pressure();
168  double dens_save = m_dens;
169  double tt = m_temp - 0.04;
170  double dd = m_sub.density(tt, pres, m_iState, m_dens);
171  if (dd < 0.0) {
172  throw CanteraError("PDSS_Water::dthermalExpansionCoeffdT",
173  "unable to solve for the density at T = {}, P = {}", tt, pres);
174  }
175  double vald = m_sub.coeffThermExp();
176  m_sub.setState_TD(m_temp, dens_save);
177  double val2 = m_sub.coeffThermExp();
178  return (val2 - vald) / 0.04;
179 }
180 
182 {
184 }
185 
187 {
188  return m_sub.Tcrit();
189 }
190 
192 {
193  return m_sub.Pcrit();
194 }
195 
197 {
198  return m_sub.Rhocrit();
199 }
200 
201 void PDSS_Water::setDensity(double dens)
202 {
203  m_dens = dens;
205 }
206 
207 double PDSS_Water::density() const
208 {
209  return m_dens;
210 }
211 
212 void PDSS_Water::setTemperature(double temp)
213 {
214  m_temp = temp;
215  m_sub.setState_TD(temp, m_dens);
216 }
217 
218 void PDSS_Water::setState_TP(double temp, double pres)
219 {
220  m_temp = temp;
221  setPressure(pres);
222 }
223 
224 double PDSS_Water::pref_safe(double temp) const
225 {
226  if (temp < m_sub.Tcrit()) {
227  double pp = m_sub.psat_est(temp);
228  if (pp > OneAtm) {
229  return pp;
230  }
231  } else {
232  return m_sub.Pcrit();
233  }
234  return OneAtm;
235 }
236 
237 double PDSS_Water::satPressure(double t)
238 {
239  double pp = m_sub.psat(t, WATER_LIQUID);
240  m_dens = m_sub.density();
241  m_temp = t;
242  return pp;
243 }
244 
245 void PDSS_Water::getParameters(AnyMap& eosNode) const
246 {
247  eosNode["model"] = "liquid-water-IAPWS95";
248 }
249 
250 }
Contains the getElementWeight function and the definitions of element constraint types.
Implementation of a pressure dependent standard state virtual function for a Pure Water Phase (see Sp...
Headers for a class for calculating the equation of state of water from the IAPWS 1995 Formulation ba...
A map of string keys to values whose type can vary at runtime.
Definition: AnyMap.h:427
Base class for exceptions thrown by Cantera classes.
Definition: ctexceptions.h:66
void setPressure(double pres) override
Sets the pressure in the object.
Definition: PDSS_Water.cpp:133
double molarVolume() const override
Return the molar volume at standard state.
Definition: PDSS_Water.cpp:82
void setTemperature(double temp) override
Set the internal temperature.
Definition: PDSS_Water.cpp:212
double enthalpy_mole() const override
Return the molar enthalpy in units of J kmol-1.
Definition: PDSS_Water.cpp:52
double thermalExpansionCoeff() const override
Return the volumetric thermal expansion coefficient. Units: 1/K.
Definition: PDSS_Water.cpp:160
WaterPropsIAPWS m_sub
Pointer to the WaterPropsIAPWS object, which does the actual calculations for the real equation of st...
Definition: PDSS_Water.h:160
double pressure() const override
Returns the pressure (Pa)
Definition: PDSS_Water.cpp:127
double critPressure() const override
critical pressure
Definition: PDSS_Water.cpp:191
double SW_Offset
Offset constant used to obtain consistency with NIST convention.
Definition: PDSS_Water.h:203
double critDensity() const override
critical density
Definition: PDSS_Water.cpp:196
double gibbs_RT_ref() const override
Return the molar Gibbs free energy divided by RT at reference pressure.
Definition: PDSS_Water.cpp:87
double critTemperature() const override
critical temperature
Definition: PDSS_Water.cpp:186
double isothermalCompressibility() const
Returns the isothermal compressibility. Units: 1/Pa.
Definition: PDSS_Water.cpp:181
double entropy_R_ref() const override
Return the molar entropy divided by R at reference pressure.
Definition: PDSS_Water.cpp:103
double dthermalExpansionCoeffdT() const
Return the derivative of the volumetric thermal expansion coefficient.
Definition: PDSS_Water.cpp:165
double enthalpy_RT_ref() const override
Return the molar enthalpy divided by RT at reference pressure.
Definition: PDSS_Water.cpp:95
double cv_mole() const override
Return the molar const volume heat capacity in units of J kmol-1 K-1.
Definition: PDSS_Water.cpp:77
void getParameters(AnyMap &eosNode) const override
Store the parameters needed to reconstruct a copy of this PDSS object.
Definition: PDSS_Water.cpp:245
double EW_Offset
Offset constants used to obtain consistency with the NIST database.
Definition: PDSS_Water.h:196
double intEnergy_mole() const override
Return the molar internal Energy in units of J kmol-1.
Definition: PDSS_Water.cpp:57
double entropy_mole() const override
Return the molar entropy in units of J kmol-1 K-1.
Definition: PDSS_Water.cpp:62
void setState_TP(double temp, double pres) override
Set the internal temperature and pressure.
Definition: PDSS_Water.cpp:218
int m_iState
state of the fluid
Definition: PDSS_Water.h:189
double cp_mole() const override
Return the molar const pressure heat capacity in units of J kmol-1 K-1.
Definition: PDSS_Water.cpp:72
double m_dens
State of the system - density.
Definition: PDSS_Water.h:177
double pref_safe(double temp) const
Returns a reference pressure value that can be safely calculated by the underlying real equation of s...
Definition: PDSS_Water.cpp:224
double density() const override
Return the standard state density at standard state.
Definition: PDSS_Water.cpp:207
double gibbs_mole() const override
Return the molar Gibbs free energy in units of J kmol-1.
Definition: PDSS_Water.cpp:67
bool m_allowGasPhase
Since this phase represents a liquid phase, it's an error to return a gas-phase answer.
Definition: PDSS_Water.h:212
double molarVolume_ref() const override
Return the molar volume at reference pressure.
Definition: PDSS_Water.cpp:119
void setDensity(double dens)
Set the density of the water phase.
Definition: PDSS_Water.cpp:201
PDSS_Water()
Default constructor.
Definition: PDSS_Water.cpp:16
double satPressure(double t) override
saturation pressure
Definition: PDSS_Water.cpp:237
double cp_R_ref() const override
Return the molar heat capacity divided by R at reference pressure.
Definition: PDSS_Water.cpp:111
double m_p0
Reference state pressure of the species.
Definition: PDSS.h:404
double m_temp
Current temperature used by the PDSS object.
Definition: PDSS.h:398
double m_pres
State of the system - pressure.
Definition: PDSS.h:401
double m_maxTemp
Maximum temperature.
Definition: PDSS.h:410
double m_minTemp
Minimum temperature.
Definition: PDSS.h:407
double m_mw
Molecular Weight of the species.
Definition: PDSS.h:413
double coeffThermExp() const
Returns the coefficient of thermal expansion.
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.
double pressure() const
Calculates the pressure (Pascals), given the current value of the temperature and density.
double gibbs_mass() const
Get the Gibbs free energy (J/kg) at the current temperature and density.
double isothermalCompressibility() const
Returns the coefficient of isothermal compressibility for the state of the object.
double psat(double temperature, int waterState=WATER_LIQUID)
This function returns the saturation pressure given the temperature as an input parameter,...
double Pcrit() const
Returns the critical pressure of water (22.064E6 Pa)
double cv_mass() const
Get the constant volume heat capacity (J/kg/K) at the current temperature and density.
double entropy_mass() const
Get the entropy (J/kg/K) at the current temperature and density.
double Rhocrit() const
Return the critical density of water (kg m-3)
double Tcrit() const
Returns the critical temperature of water (Kelvin)
double cp_mass() const
Get the constant pressure heat capacity (J/kg/K) at the current temperature and density.
double intEnergy_mass() const
Get the internal energy (J/kg) at the current temperature and density.
void setState_TD(double temperature, double rho)
Set the internal state of the object wrt temperature and density.
int phaseState(bool checkState=false) const
Returns the Phase State flag for the current state of the object.
double psat_est(double temperature) const
This function returns an estimated value for the saturation pressure.
double enthalpy_mass() const
Get the enthalpy (J/kg) at the current temperature and density.
This file contains definitions for utility functions and text for modules, inputfiles and logging,...
const double OneAtm
One atmosphere [Pa].
Definition: ct_defs.h:96
const double GasConstant
Universal Gas Constant [J/kmol/K].
Definition: ct_defs.h:120
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:564
double getElementWeight(const string &ename)
Get the atomic weight of an element.
Definition: Elements.cpp:251
Contains declarations for string manipulation functions within Cantera.