58 WaterProps::~WaterProps()
65 WaterProps& WaterProps::operator=(
const WaterProps& b)
87 static const doublereal Tc = T - 273.15;
88 static const doublereal U1 = 288.9414;
89 static const doublereal U2 = 508929.2;
90 static const doublereal U3 = 68.12963;
91 static const doublereal U4 = -3.9863;
93 doublereal tmp1 = Tc + U1;
94 doublereal tmp4 = Tc + U4;
95 doublereal t4t4 = tmp4 * tmp4;
96 doublereal tmp3 = Tc + U3;
97 doublereal rho = 1000. * (1.0 - tmp1*t4t4/(U2 * tmp3));
106 }
else if (ifunc == 3) {
108 }
else if (ifunc == 2) {
109 return 2.0 * rhomin / (T * T);
114 doublereal drhodT = 1000./U2 * (
115 - tmp4 * tmp4 / (tmp3)
116 - tmp1 * 2 * tmp4 / (tmp3)
117 + tmp1 * t4t4 / (tmp3*tmp3)
120 }
else if (ifunc == 3) {
122 }
else if (ifunc == 2) {
123 doublereal t3t3 = tmp3 * tmp3;
124 doublereal d2rhodT2 = 1000./U2 *
125 ((-4.0*tmp4-2.0*tmp1)/tmp3 +
126 (2.0*t4t4 + 4.0*tmp1*tmp4)/t3t3
127 - 2.0*tmp1 * t4t4/(t3t3*tmp3));
136 static const doublereal U1 = 3.4279E2;
137 static const doublereal U2 = -5.0866E-3;
138 static const doublereal U3 = 9.4690E-7;
139 static const doublereal U4 = -2.0525;
140 static const doublereal U5 = 3.1159E3;
141 static const doublereal U6 = -1.8289E2;
142 static const doublereal U7 = -8.0325E3;
143 static const doublereal U8 = 4.2142E6;
144 static const doublereal U9 = 2.1417;
145 doublereal T2 = T * T;
147 doublereal eps1000 = U1 * exp(U2 * T + U3 * T2);
148 doublereal C = U4 + U5/(U6 + T);
149 doublereal B = U7 + U8/T + U9 * T;
150 doublereal Pbar = P_pascal * 1.0E-5;
151 doublereal tmpBpar = B + Pbar;
152 doublereal tmpB1000 = B + 1000.0;
153 doublereal ltmp = log(tmpBpar/tmpB1000);
154 doublereal epsRel = eps1000 + C * ltmp;
156 if (ifunc == 1 || ifunc == 2) {
157 doublereal tmpC = U6 + T;
158 doublereal dCdT = - U5/(tmpC * tmpC);
159 doublereal dBdT = - U8/(T * T) + U9;
160 doublereal deps1000dT = eps1000 * (U2 + 2.0 * U3 * T);
161 doublereal dltmpdT = (dBdT/tmpBpar - dBdT/tmpB1000);
163 return deps1000dT + dCdT * ltmp + C * dltmpdT;
165 doublereal T3 = T2 * T;
166 doublereal d2CdT2 = - 2.0 * dCdT / tmpC;
167 doublereal d2BdT2 = 2.0 * U8 / (T3);
168 doublereal d2ltmpdT2 = (d2BdT2*(1.0/tmpBpar - 1.0/tmpB1000) +
169 dBdT*dBdT*(1.0/(tmpB1000*tmpB1000) - 1.0/(tmpBpar*tmpBpar)));
170 doublereal d2eps1000dT2 = (deps1000dT * (U2 + 2.0 * U3 * T) + eps1000 * (2.0 * U3));
173 doublereal d2epsReldT2 = (d2eps1000dT2 + d2CdT2 * ltmp + 2.0 * dCdT * dltmpdT
179 doublereal dltmpdP = 1.0E-5 / tmpBpar;
189 if (psat > P_input) {
195 doublereal epsilon =
epsilon_0 * epsRelWater;
197 doublereal tmp = sqrt(2.0 *
Avogadro * dw / 1000.);
198 doublereal tmp2 = ElectronCharge * ElectronCharge *
Avogadro /
200 doublereal tmp3 = tmp2 * sqrt(tmp2);
201 doublereal A_Debye = tmp * tmp3 / (8.0 *
Pi);
205 if (ifunc == 1 || ifunc == 2) {
206 doublereal dAdT = - 1.5 * A_Debye / T;
208 doublereal depsRelWaterdT =
relEpsilon(T, P, 1);
209 dAdT -= A_Debye * (1.5 * depsRelWaterdT / epsRelWater);
213 doublereal contrib2 = - A_Debye * (0.5 * cte);
224 doublereal d2AdT2 = 1.5 / T * (A_Debye/T - dAdT);
225 doublereal d2epsRelWaterdT2 =
relEpsilon(T, P, 2);
226 d2AdT2 += 1.5 * (- dAdT * depsRelWaterdT / epsRelWater
227 - A_Debye / epsRelWater *
228 (d2epsRelWaterdT2 - depsRelWaterdT * depsRelWaterdT / epsRelWater));
229 doublereal deltaT = -0.1;
230 doublereal Tdel = T + deltaT;
232 doublereal dctedT = (cte_del - cte) / Tdel;
233 doublereal contrib3 = 0.5 * (-(dAdT * cte) -(A_Debye * dctedT));
248 doublereal dAdP = 0.0;
249 doublereal depsRelWaterdP =
relEpsilon(T, P, 3);
250 dAdP -= A_Debye * (1.5 * depsRelWaterdP / epsRelWater);
252 dAdP += A_Debye * (0.5 * kappa);
278 "Unable to solve for density at T = {} and P = {}", temp, press);
287 throw CanteraError(
"WaterProps::isothermalCompressibility_IAPWS",
288 "Unable to solve for density at T = {} and P = {}", temp, press);
293 static const doublereal H[4] = {1., 0.978197, 0.579829, -0.202354};
295 static const doublereal Hij[6][7] = {
296 { 0.5132047, 0.2151778, -0.2818107, 0.1778064, -0.04176610, 0., 0.},
297 { 0.3205656, 0.7317883, -1.070786 , 0.4605040, 0., -0.01578386, 0.},
298 { 0., 1.241044 , -1.263184 , 0.2340379, 0., 0., 0.},
299 { 0., 1.476783 , 0., -0.4924179, 0.1600435, 0., -0.003629481},
300 {-0.7782567, 0.0 , 0., 0. , 0., 0., 0.},
301 { 0.1885447, 0.0 , 0., 0. , 0., 0., 0.},
304 static const doublereal rhoStar = 317.763;
305 static const doublereal presStar = 22.115E6;
309 static const doublereal TStar = 647.27;
310 static const doublereal muStar = 55.071E-6;
314 doublereal rhobar = dens/rhoStar;
315 doublereal tbar = temp / TStar;
316 doublereal tbar2 = tbar * tbar;
317 doublereal tbar3 = tbar2 * tbar;
318 doublereal mu0bar = std::sqrt(tbar) / (H[0] + H[1]/tbar + H[2]/tbar2 + H[3]/tbar3);
320 doublereal tfac1 = 1.0 / tbar - 1.0;
321 doublereal tfac2 = tfac1 * tfac1;
322 doublereal tfac3 = tfac2 * tfac1;
323 doublereal tfac4 = tfac3 * tfac1;
324 doublereal tfac5 = tfac4 * tfac1;
326 doublereal rfac1 = rhobar - 1.0;
327 doublereal rfac2 = rfac1 * rfac1;
328 doublereal rfac3 = rfac2 * rfac1;
329 doublereal rfac4 = rfac3 * rfac1;
330 doublereal rfac5 = rfac4 * rfac1;
331 doublereal rfac6 = rfac5 * rfac1;
333 doublereal sum = (Hij[0][0] + Hij[1][0]*tfac1 + Hij[4][0]*tfac4 + Hij[5][0]*tfac5 +
334 Hij[0][1]*rfac1 + Hij[1][1]*tfac1*rfac1 + Hij[2][1]*tfac2*rfac1 + Hij[3][1]*tfac3*rfac1 +
335 Hij[0][2]*rfac2 + Hij[1][2]*tfac1*rfac2 + Hij[2][2]*tfac2*rfac2 +
336 Hij[0][3]*rfac3 + Hij[1][3]*tfac1*rfac3 + Hij[2][3]*tfac2*rfac3 + Hij[3][3]*tfac3*rfac3 +
337 Hij[0][4]*rfac4 + Hij[3][4]*tfac3*rfac4 +
338 Hij[1][5]*tfac1*rfac5 + Hij[3][6]*tfac3*rfac6
340 doublereal mu1bar = std::exp(rhobar * sum);
343 doublereal mu2bar = 1.0;
344 if (tbar >= 0.9970 && tbar <= 1.0082 && rhobar >= 0.755 && rhobar <= 1.290) {
346 drhodp *= presStar / rhoStar;
347 doublereal xsi = rhobar * drhodp;
349 mu2bar = 0.922 * std::pow(xsi, 0.0263);
353 doublereal mubar = mu0bar * mu1bar * mu2bar;
354 return mubar * muStar;
359 static const doublereal Tstar = 647.27;
360 static const doublereal rhostar = 317.763;
361 static const doublereal lambdastar = 0.4945;
362 static const doublereal presstar = 22.115E6;
363 static const doublereal L[4] = {
369 static const doublereal Lji[6][5] = {
370 { 1.3293046, 1.7018363, 5.2246158, 8.7127675, -1.8525999},
371 {-0.40452437, -2.2156845, -10.124111, -9.5000611, 0.93404690},
372 { 0.24409490, 1.6511057, 4.9874687, 4.3786606, 0.0},
373 { 0.018660751, -0.76736002, -0.27297694, -0.91783782, 0.0},
374 {-0.12961068, 0.37283344, -0.43083393, 0.0, 0.0},
375 { 0.044809953, -0.11203160, 0.13333849, 0.0, 0.0},
381 doublereal rhobar = dens/rhostar;
382 doublereal tbar = temp / Tstar;
383 doublereal tbar2 = tbar * tbar;
384 doublereal tbar3 = tbar2 * tbar;
385 doublereal lambda0bar = sqrt(tbar) / (L[0] + L[1]/tbar + L[2]/tbar2 + L[3]/tbar3);
387 doublereal tfac1 = 1.0 / tbar - 1.0;
388 doublereal tfac2 = tfac1 * tfac1;
389 doublereal tfac3 = tfac2 * tfac1;
390 doublereal tfac4 = tfac3 * tfac1;
392 doublereal rfac1 = rhobar - 1.0;
393 doublereal rfac2 = rfac1 * rfac1;
394 doublereal rfac3 = rfac2 * rfac1;
395 doublereal rfac4 = rfac3 * rfac1;
396 doublereal rfac5 = rfac4 * rfac1;
398 doublereal sum = (Lji[0][0] + Lji[0][1]*tfac1 + Lji[0][2]*tfac2 + Lji[0][3]*tfac3 + Lji[0][4]*tfac4 +
399 Lji[1][0]*rfac1 + Lji[1][1]*tfac1*rfac1 + Lji[1][2]*tfac2*rfac1 + Lji[1][3]*tfac3*rfac1 + Lji[1][4]*tfac4*rfac1 +
400 Lji[2][0]*rfac2 + Lji[2][1]*tfac1*rfac2 + Lji[2][2]*tfac2*rfac2 + Lji[2][3]*tfac3*rfac2 +
401 Lji[3][0]*rfac3 + Lji[3][1]*tfac1*rfac3 + Lji[3][2]*tfac2*rfac3 + Lji[3][3]*tfac3*rfac3 +
402 Lji[4][0]*rfac4 + Lji[4][1]*tfac1*rfac4 + Lji[4][2]*tfac2*rfac4 +
403 Lji[5][0]*rfac5 + Lji[5][1]*tfac1*rfac5 + Lji[5][2]*tfac2*rfac5
405 doublereal lambda1bar = exp(rhobar * sum);
406 doublereal mu0bar = std::sqrt(tbar) / (H[0] + H[1]/tbar + H[2]/tbar2 + H[3]/tbar3);
407 doublereal tfac5 = tfac4 * tfac1;
408 doublereal rfac6 = rfac5 * rfac1;
410 sum = (Hij[0][0] + Hij[1][0]*tfac1 + Hij[4][0]*tfac4 + Hij[5][0]*tfac5 +
411 Hij[0][1]*rfac1 + Hij[1][1]*tfac1*rfac1 + Hij[2][1]*tfac2*rfac1 + Hij[3][1]*tfac3*rfac1 +
412 Hij[0][2]*rfac2 + Hij[1][2]*tfac1*rfac2 + Hij[2][2]*tfac2*rfac2 +
413 Hij[0][3]*rfac3 + Hij[1][3]*tfac1*rfac3 + Hij[2][3]*tfac2*rfac3 + Hij[3][3]*tfac3*rfac3 +
414 Hij[0][4]*rfac4 + Hij[3][4]*tfac3*rfac4 +
415 Hij[1][5]*tfac1*rfac5 + Hij[3][6]*tfac3*rfac6
417 doublereal mu1bar = std::exp(rhobar * sum);
418 doublereal t2r2 = tbar * tbar / (rhobar * rhobar);
420 drhodp *= presStar / rhoStar;
421 doublereal xsi = rhobar * drhodp;
422 doublereal xsipow = std::pow(xsi, 0.4678);
423 doublereal rho1 = rhobar - 1.;
424 doublereal rho2 = rho1 * rho1;
425 doublereal rho4 = rho2 * rho2;
426 doublereal temp2 = (tbar - 1.0) * (tbar - 1.0);
435 doublereal dpdT_const_rho = beta *
GasConstant * dens / 18.015268;
436 dpdT_const_rho *= Tstar / presstar;
437 doublereal lambda2bar = 0.0013848 / (mu0bar * mu1bar) * t2r2 * dpdT_const_rho * dpdT_const_rho *
438 xsipow * sqrt(rhobar) * exp(-18.66*temp2 - rho4);
439 return (lambda0bar * lambda1bar + lambda2bar) * lambdastar;
doublereal dpdrho() const
Returns the value of dp / drho at constant T for the state of the object.
CTML ("Cantera Markup Language") is the variant of XML that Cantera uses to store data...
doublereal density(doublereal temperature, doublereal pressure, int phase=-1, doublereal rhoguess=-1.0)
Calculates the density given the temperature and the pressure, and a guess at the density...
Class for calculating the equation of state of water.
Implementation of a pressure dependent standard state virtual function for a Pure Water Phase (see Sp...
Header for a class used to house several approximation routines for properties of water...
doublereal temperature() const
Returns the temperature (Kelvin)
doublereal satPressure(doublereal T)
Returns the saturation pressure given the temperature.
doublereal isothermalCompressibility_IAPWS(doublereal T, doublereal P)
Returns the isothermal compressibility of water.
doublereal isothermalCompressibility() const
Returns the coefficient of isothermal compressibility for the state of the object.
The WaterProps class is used to house several approximation routines for properties of water...
WaterPropsIAPWS * getWater()
Get a pointer to a changeable WaterPropsIAPWS object.
Class for the liquid water pressure dependent standard state.
WaterPropsIAPWS * m_waterIAPWS
Pointer to the WaterPropsIAPWS object.
doublereal density_IAPWS() const
Returns the density of water.
doublereal viscosityWater() const
Returns the viscosity of water at the current conditions (kg/m/s)
Base class for exceptions thrown by Cantera classes.
WaterProps()
Default constructor.
doublereal coeffThermExp() const
Returns the coefficient of thermal expansion.
doublereal coeffPresExp() const
Returns the isochoric pressure derivative wrt temperature.
const doublereal Avogadro
Avogadro's Number [number/kmol].
const doublereal GasConstant
Universal Gas Constant. [J/kmol/K].
Contains declarations for string manipulation functions within Cantera.
doublereal thermalConductivityWater() const
Returns the thermal conductivity of water at the current conditions (W/m/K)
const doublereal epsilon_0
Permittivity of free space in F/m.
doublereal ADebye(doublereal T, doublereal P, int ifunc)
ADebye calculates the value of A_Debye as a function of temperature and pressure according to relatio...
doublereal coeffThermalExp_IAPWS(doublereal T, doublereal P)
returns the coefficient of thermal expansion
doublereal relEpsilon(doublereal T, doublereal P_pascal, int ifunc=0)
Bradley-Pitzer equation for the dielectric constant of water as a function of temperature and pressur...
Namespace for the Cantera kernel.
static doublereal density_T(doublereal T, doublereal P, int ifunc)
Simple calculation of water density at atmospheric pressure.
bool m_own_sub
true if we own the WaterPropsIAPWS object
doublereal psat(doublereal temperature, int waterState=WATER_LIQUID)
This function returns the saturation pressure given the temperature as an input parameter, and sets the internal state to the saturated conditions.