93 doublereal Tc = T - 273.15;
94 const doublereal U1 = 288.9414;
95 const doublereal U2 = 508929.2;
96 const doublereal U3 = 68.12963;
97 const doublereal U4 = -3.9863;
99 doublereal tmp1 = Tc + U1;
100 doublereal tmp4 = Tc + U4;
101 doublereal t4t4 = tmp4 * tmp4;
102 doublereal tmp3 = Tc + U3;
103 doublereal rho = 1000. * (1.0 - tmp1*t4t4/(U2 * tmp3));
115 }
else if (ifunc == 3) {
117 }
else if (ifunc == 2) {
118 return 2.0 * rhomin / (T * T);
123 doublereal drhodT = 1000./U2 * (
124 - tmp4 * tmp4 / (tmp3)
125 - tmp1 * 2 * tmp4 / (tmp3)
126 + tmp1 * t4t4 / (tmp3*tmp3)
129 }
else if (ifunc == 3) {
131 }
else if (ifunc == 2) {
132 doublereal t3t3 = tmp3 * tmp3;
133 doublereal d2rhodT2 = 1000./U2 *
134 ((-4.0*tmp4-2.0*tmp1)/tmp3 +
135 (2.0*t4t4 + 4.0*tmp1*tmp4)/t3t3
136 - 2.0*tmp1 * t4t4/(t3t3*tmp3));
146 const doublereal U1 = 3.4279E2;
147 const doublereal U2 = -5.0866E-3;
148 const doublereal U3 = 9.4690E-7;
149 const doublereal U4 = -2.0525;
150 const doublereal U5 = 3.1159E3;
151 const doublereal U6 = -1.8289E2;
152 const doublereal U7 = -8.0325E3;
153 const doublereal U8 = 4.2142E6;
154 const doublereal U9 = 2.1417;
155 doublereal T2 = T * T;
157 doublereal eps1000 = U1 * exp(U2 * T + U3 * T2);
158 doublereal C = U4 + U5/(U6 + T);
159 doublereal B = U7 + U8/T + U9 * T;
161 doublereal Pbar = P_pascal * 1.0E-5;
162 doublereal tmpBpar = B + Pbar;
163 doublereal tmpB1000 = B + 1000.0;
164 doublereal ltmp = log(tmpBpar/tmpB1000);
165 doublereal epsRel = eps1000 + C * ltmp;
167 if (ifunc == 1 || ifunc == 2) {
168 doublereal tmpC = U6 + T;
169 doublereal dCdT = - U5/(tmpC * tmpC);
171 doublereal dBdT = - U8/(T * T) + U9;
173 doublereal deps1000dT = eps1000 * (U2 + 2.0 * U3 * T);
175 doublereal dltmpdT = (dBdT/tmpBpar - dBdT/tmpB1000);
177 return deps1000dT + dCdT * ltmp + C * dltmpdT;
179 doublereal T3 = T2 * T;
180 doublereal d2CdT2 = - 2.0 * dCdT / tmpC;
181 doublereal d2BdT2 = 2.0 * U8 / (T3);
183 doublereal d2ltmpdT2 = (d2BdT2*(1.0/tmpBpar - 1.0/tmpB1000) +
184 dBdT*dBdT*(1.0/(tmpB1000*tmpB1000) - 1.0/(tmpBpar*tmpBpar)));
186 doublereal d2eps1000dT2 = (deps1000dT * (U2 + 2.0 * U3 * T) + eps1000 * (2.0 * U3));
189 doublereal d2epsReldT2 = (d2eps1000dT2 + d2CdT2 * ltmp + 2.0 * dCdT * dltmpdT
195 doublereal dltmpdP = 1.0E-5 / tmpBpar;
207 if (psat > P_input) {
218 doublereal epsilon =
epsilon_0 * epsRelWater;
220 doublereal tmp = sqrt(2.0 *
Avogadro * dw / 1000.);
221 doublereal tmp2 = ElectronCharge * ElectronCharge *
Avogadro /
223 doublereal tmp3 = tmp2 * sqrt(tmp2);
224 doublereal A_Debye = tmp * tmp3 / (8.0 *
Pi);
232 if (ifunc == 1 || ifunc == 2) {
233 doublereal dAdT = - 1.5 * A_Debye / T;
235 doublereal depsRelWaterdT =
relEpsilon(T, P, 1);
236 dAdT -= A_Debye * (1.5 * depsRelWaterdT / epsRelWater);
246 doublereal contrib2 = - A_Debye * (0.5 * cte);
266 doublereal d2AdT2 = 1.5 / T * (A_Debye/T - dAdT);
268 doublereal d2epsRelWaterdT2 =
relEpsilon(T, P, 2);
277 d2AdT2 += 1.5 * (- dAdT * depsRelWaterdT / epsRelWater
278 - A_Debye / epsRelWater *
279 (d2epsRelWaterdT2 - depsRelWaterdT * depsRelWaterdT / epsRelWater));
281 doublereal deltaT = -0.1;
282 doublereal Tdel = T + deltaT;
284 doublereal dctedT = (cte_del - cte) / Tdel;
289 doublereal contrib3 = 0.5 * (-(dAdT * cte) -(A_Debye * dctedT));
309 doublereal dAdP = 0.0;
311 doublereal depsRelWaterdP =
relEpsilon(T, P, 3);
312 dAdP -= A_Debye * (1.5 * depsRelWaterdP / epsRelWater);
317 dAdP += A_Debye * (0.5 * kappa);
345 "Unable to solve for density at T = " +
fp2str(temp) +
" and P = " +
fp2str(press));
354 throw CanteraError(
"WaterProps::isothermalCompressibility_IAPWS",
355 "Unable to solve for density at T = " +
fp2str(temp) +
" and P = " +
fp2str(press));
363 const doublereal H[4] = {1.,
369 const doublereal Hij[6][7] = {
370 { 0.5132047, 0.2151778, -0.2818107, 0.1778064, -0.04176610, 0., 0.},
371 { 0.3205656, 0.7317883, -1.070786 , 0.4605040, 0., -0.01578386, 0.},
372 { 0., 1.241044 , -1.263184 , 0.2340379, 0., 0., 0.},
373 { 0., 1.476783 , 0., -0.4924179, 0.1600435, 0., -0.003629481},
374 {-0.7782567, 0.0 , 0., 0. , 0., 0., 0.},
375 { 0.1885447, 0.0 , 0., 0. , 0., 0., 0.},
377 const doublereal TStar = 647.27;
378 const doublereal rhoStar = 317.763;
379 const doublereal presStar = 22.115E6;
380 const doublereal muStar = 55.071E-6;
395 doublereal rhobar = dens/rhoStar;
396 doublereal tbar = temp / TStar;
399 doublereal tbar2 = tbar * tbar;
400 doublereal tbar3 = tbar2 * tbar;
402 doublereal mu0bar = std::sqrt(tbar) / (H[0] + H[1]/tbar + H[2]/tbar2 + H[3]/tbar3);
407 doublereal tfac1 = 1.0 / tbar - 1.0;
408 doublereal tfac2 = tfac1 * tfac1;
409 doublereal tfac3 = tfac2 * tfac1;
410 doublereal tfac4 = tfac3 * tfac1;
411 doublereal tfac5 = tfac4 * tfac1;
413 doublereal rfac1 = rhobar - 1.0;
414 doublereal rfac2 = rfac1 * rfac1;
415 doublereal rfac3 = rfac2 * rfac1;
416 doublereal rfac4 = rfac3 * rfac1;
417 doublereal rfac5 = rfac4 * rfac1;
418 doublereal rfac6 = rfac5 * rfac1;
420 doublereal sum = (Hij[0][0] + Hij[1][0]*tfac1 + Hij[4][0]*tfac4 + Hij[5][0]*tfac5 +
421 Hij[0][1]*rfac1 + Hij[1][1]*tfac1*rfac1 + Hij[2][1]*tfac2*rfac1 + Hij[3][1]*tfac3*rfac1 +
422 Hij[0][2]*rfac2 + Hij[1][2]*tfac1*rfac2 + Hij[2][2]*tfac2*rfac2 +
423 Hij[0][3]*rfac3 + Hij[1][3]*tfac1*rfac3 + Hij[2][3]*tfac2*rfac3 + Hij[3][3]*tfac3*rfac3 +
424 Hij[0][4]*rfac4 + Hij[3][4]*tfac3*rfac4 +
425 Hij[1][5]*tfac1*rfac5 + Hij[3][6]*tfac3*rfac6
427 doublereal mu1bar = std::exp(rhobar * sum);
430 doublereal mu2bar = 1.0;
431 if ((tbar >= 0.9970) && tbar <= 1.0082) {
432 if ((rhobar >= 0.755) && (rhobar <= 1.290)) {
434 drhodp *= presStar / rhoStar;
435 doublereal xsi = rhobar * drhodp;
437 mu2bar = 0.922 * std::pow(xsi, 0.0263);
442 doublereal mubar = mu0bar * mu1bar * mu2bar;
444 return mubar * muStar;
449 static const doublereal Tstar = 647.27;
450 static const doublereal rhostar = 317.763;
451 static const doublereal lambdastar = 0.4945;
452 static const doublereal presstar = 22.115E6;
453 static const doublereal L[4] = {
459 static const doublereal Lji[6][5] = {
460 { 1.3293046, 1.7018363, 5.2246158, 8.7127675, -1.8525999},
461 {-0.40452437, -2.2156845, -10.124111, -9.5000611, 0.93404690},
462 { 0.24409490, 1.6511057, 4.9874687, 4.3786606, 0.0},
463 { 0.018660751, -0.76736002, -0.27297694, -0.91783782, 0.0},
464 {-0.12961068, 0.37283344, -0.43083393, 0.0, 0.0},
465 { 0.044809953, -0.11203160, 0.13333849, 0.0, 0.0},
471 doublereal rhobar = dens/rhostar;
472 doublereal tbar = temp / Tstar;
473 doublereal tbar2 = tbar * tbar;
474 doublereal tbar3 = tbar2 * tbar;
475 doublereal lambda0bar = sqrt(tbar) / (L[0] + L[1]/tbar + L[2]/tbar2 + L[3]/tbar3);
479 doublereal tfac1 = 1.0 / tbar - 1.0;
480 doublereal tfac2 = tfac1 * tfac1;
481 doublereal tfac3 = tfac2 * tfac1;
482 doublereal tfac4 = tfac3 * tfac1;
484 doublereal rfac1 = rhobar - 1.0;
485 doublereal rfac2 = rfac1 * rfac1;
486 doublereal rfac3 = rfac2 * rfac1;
487 doublereal rfac4 = rfac3 * rfac1;
488 doublereal rfac5 = rfac4 * rfac1;
490 doublereal sum = (Lji[0][0] + Lji[0][1]*tfac1 + Lji[0][2]*tfac2 + Lji[0][3]*tfac3 + Lji[0][4]*tfac4 +
491 Lji[1][0]*rfac1 + Lji[1][1]*tfac1*rfac1 + Lji[1][2]*tfac2*rfac1 + Lji[1][3]*tfac3*rfac1 + Lji[1][4]*tfac4*rfac1 +
492 Lji[2][0]*rfac2 + Lji[2][1]*tfac1*rfac2 + Lji[2][2]*tfac2*rfac2 + Lji[2][3]*tfac3*rfac2 +
493 Lji[3][0]*rfac3 + Lji[3][1]*tfac1*rfac3 + Lji[3][2]*tfac2*rfac3 + Lji[3][3]*tfac3*rfac3 +
494 Lji[4][0]*rfac4 + Lji[4][1]*tfac1*rfac4 + Lji[4][2]*tfac2*rfac4 +
495 Lji[5][0]*rfac5 + Lji[5][1]*tfac1*rfac5 + Lji[5][2]*tfac2*rfac5
497 doublereal lambda1bar = exp(rhobar * sum);
499 doublereal mu0bar = std::sqrt(tbar) / (H[0] + H[1]/tbar + H[2]/tbar2 + H[3]/tbar3);
501 doublereal tfac5 = tfac4 * tfac1;
502 doublereal rfac6 = rfac5 * rfac1;
504 sum = (Hij[0][0] + Hij[1][0]*tfac1 + Hij[4][0]*tfac4 + Hij[5][0]*tfac5 +
505 Hij[0][1]*rfac1 + Hij[1][1]*tfac1*rfac1 + Hij[2][1]*tfac2*rfac1 + Hij[3][1]*tfac3*rfac1 +
506 Hij[0][2]*rfac2 + Hij[1][2]*tfac1*rfac2 + Hij[2][2]*tfac2*rfac2 +
507 Hij[0][3]*rfac3 + Hij[1][3]*tfac1*rfac3 + Hij[2][3]*tfac2*rfac3 + Hij[3][3]*tfac3*rfac3 +
508 Hij[0][4]*rfac4 + Hij[3][4]*tfac3*rfac4 +
509 Hij[1][5]*tfac1*rfac5 + Hij[3][6]*tfac3*rfac6
511 doublereal mu1bar = std::exp(rhobar * sum);
513 doublereal t2r2 = tbar * tbar / (rhobar * rhobar);
515 drhodp *= presStar / rhoStar;
516 doublereal xsi = rhobar * drhodp;
517 doublereal xsipow = std::pow(xsi, 0.4678);
518 doublereal rho1 = rhobar - 1.;
519 doublereal rho2 = rho1 * rho1;
520 doublereal rho4 = rho2 * rho2;
521 doublereal temp2 = (tbar - 1.0) * (tbar - 1.0);
533 doublereal dpdT_const_rho = beta *
GasConstant * dens / 18.015268;
534 dpdT_const_rho *= Tstar / presstar;
536 doublereal lambda2bar = 0.0013848 / (mu0bar * mu1bar) * t2r2 * dpdT_const_rho * dpdT_const_rho *
537 xsipow * sqrt(rhobar) * exp(-18.66*temp2 - rho4);
539 return (lambda0bar * lambda1bar + lambda2bar) * lambdastar;
doublereal isothermalCompressibility() const
Returns the coefficient of isothermal compressibility for the state of the object.
CTML ("Cantera Markup Language") is the variant of XML that Cantera uses to store data...
doublereal viscosityWater() const
Returns the viscosity of water at the current conditions (kg/m/s)
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.
doublereal density_IAPWS() const
Returns the density 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 coeffThermExp() const
Returns the coefficient of thermal expansion.
doublereal satPressure(doublereal T)
Returns the saturation pressure given the temperature.
doublereal dpdrho() const
Returns the value of dp / drho at constant T for the state of the object.
WaterProps & operator=(const WaterProps &b)
Assignment operator.
doublereal isothermalCompressibility_IAPWS(doublereal T, doublereal P)
Returns the isothermal compressibility of water.
The WaterProps class is used to house several approximation routines for properties of water...
virtual ~WaterProps()
destructor
WaterPropsIAPWS * getWater()
Get a pointer to a changeable WaterPropsIAPWS object.
std::string fp2str(const double x, const std::string &fmt)
Convert a double into a c++ string.
Class for the liquid water pressure dependent standard state.
WaterPropsIAPWS * m_waterIAPWS
Pointer to the WaterPropsIAPWS object.
doublereal thermalConductivityWater() const
Returns the thermal conductivity of water at the current conditions (W/m/K)
Base class for exceptions thrown by Cantera classes.
WaterProps()
Default constructor.
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.
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...
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 temperature() const
Returns the temperature (Kelvin)
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.
doublereal coeffPresExp() const
Returns the isochoric pressure derivative wrt temperature.
Headers for a class for calculating the equation of state of water from the IAPWS 1995 Formulation ba...