Moved the water viscosity calculation to WaterProps.cpp.

Changed calcDensity to be a virtual function started at VPStandardStateTP().
   It's a protected function as well.
   At the VPStandardStateTP level, calcDensity() produces an error when called, because the EOS isn't specified. Derived classes must define this function, supplying the EOS.

WaterPropsIAPW: I added documentation to this routine, defining what functions changes the state of the object.

IdealMolalSoln: I had forgotten to update this object to employ the newer setState_TP() strategy that I had used in VPStandardStateTP().
This commit is contained in:
Harry Moffat 2009-09-15 15:01:39 +00:00
parent 8b9bdcfdce
commit 276602af3a
12 changed files with 446 additions and 105 deletions

View file

@ -330,8 +330,37 @@ namespace Cantera {
*/
_updateStandardStateThermo();
/*
* Calculate all of the other standard volumes
* -> note these are constant for now
*/
calcDensity();
}
/*
* Calculate the density of the mixture using the partial
* molar volumes and mole fractions as input
*
* The formula for this is
*
* \f[
* \rho = \frac{\sum_k{X_k W_k}}{\sum_k{X_k V_k}}
* \f]
*
* where \f$X_k\f$ are the mole fractions, \f$W_k\f$ are
* the molecular weights, and \f$V_k\f$ are the pure species
* molar volumes.
*
* Note, the basis behind this formula is that in an ideal
* solution the partial molar volumes are equal to the pure
* species molar volumes. We have additionally specified
* in this class that the pure species molar volumes are
* independent of temperature and pressure.
*
*/
void DebyeHuckel::calcDensity() {
if (m_waterSS) {
/*
* Store the internal density of the water SS.
* Note, we would have to do this for all other
@ -339,42 +368,19 @@ namespace Cantera {
*/
m_densWaterSS = m_waterSS->density();
}
/*
* Calculate all of the other standard volumes
* -> note these are constant for now
*/
/*
* Get the partial molar volumes of all of the
* species. -> note this is a lookup for
* water, here since it was done above.
*/
double *vbar = &m_pp[0];
getPartialMolarVolumes(vbar);
/*
* Get mole fractions of all species.
*/
double *x = &m_tmpV[0];
getMoleFractions(x);
/*
* Calculate the solution molar volume and the
* solution density.
*/
doublereal vtotal = 0.0;
for (int i = 0; i < m_kk; i++) {
vtotal += vbar[i] * x[i];
}
doublereal dd = meanMolecularWeight() / vtotal;
/*
* Now, update the State class with the results. This
* stores the density.
*/
State::setDensity(dd);
}
/*
* The isothermal compressibility. Units: 1/Pa.
* The isothermal compressibility is defined as

View file

@ -766,10 +766,10 @@ namespace Cantera {
*/
virtual void setPressure(doublereal p);
/**
* Calculate the density of the mixture using the partial
* molar volumes and mole fractions as input
*
protected:
//! Calculate the density of the mixture using the partial
//! molar volumes and mole fractions as input
/*!
* The formula for this is
*
* \f[
@ -785,12 +785,10 @@ namespace Cantera {
* species molar volumes. We have additionally specified
* in this class that the pure species molar volumes are
* independent of temperature and pressure.
*
* NOTE: This is a non-virtual function, which is not a
* member of the ThermoPhase base class.
*/
void calcDensity();
virtual void calcDensity();
public:
//! Set the internally storred density (gm/m^3) of the phase.
/*!
* Overwritten setDensity() function is necessary because the

View file

@ -1456,7 +1456,7 @@ namespace Cantera {
*/
virtual void setPressure(doublereal p);
private:
protected:
/**
* Calculate the density of the mixture using the partial
* molar volumes and mole fractions as input

View file

@ -288,55 +288,20 @@ namespace Cantera {
* The mass density is not a function of pressure.
*/
void IdealMolalSoln::setPressure(doublereal p) {
setState_TP(temperature(), p);
}
#ifdef DEBUG_MODE
//printf("setPressure: %g\n", p);
#endif
/*
* Store the current pressure
*/
m_Pcurrent = p;
/*
* update the standard state thermo
* -> This involves calling the water function and setting the pressure
*/
updateStandardStateThermo();
/*
* Calculate all of the other standard volumes
* -> note these are constant for now
*/
/*
* Get the partial molar volumes of all of the
* species. -> note this is a lookup for
* water, here since it was done above.
*/
void IdealMolalSoln::calcDensity() {
double *vbar = &m_pp[0];
getPartialMolarVolumes(vbar);
/*
* Get mole fractions of all species.
*/
double *x = &m_tmpV[0];
getMoleFractions(x);
/*
* Calculate the solution molar volume and the
* solution density.
*/
doublereal vtotal = 0.0;
for (int i = 0; i < m_kk; i++) {
vtotal += vbar[i] * x[i];
}
doublereal dd = meanMolecularWeight() / vtotal;
/*
* Now, update the State class with the results. This
* stores the density.
*/
State::setDensity(dd);
}
/*
@ -409,6 +374,14 @@ namespace Cantera {
}
}
void IdealMolalSoln::setState_TP(doublereal temp, doublereal pres) {
State::setTemperature(temp);
m_Pcurrent = pres;
updateStandardStateThermo();
//m_densWaterSS = m_waterSS->density();
calcDensity();
}
//
// ------- Activities and Activity Concentrations
//

View file

@ -278,6 +278,7 @@ namespace Cantera {
*/
virtual void setPressure(doublereal p);
protected:
/**
* Calculate the density of the mixture using the partial
* molar volumes and mole fractions as input
@ -303,6 +304,7 @@ namespace Cantera {
*/
void calcDensity();
public:
/**
* Overwritten setDensity() function is necessary because the
* density is not an indendent variable.
@ -336,6 +338,15 @@ namespace Cantera {
*/
void setMolarDensity(const doublereal rho);
//! Set the temperature (K) and pressure (Pa)
/*!
* Set the temperature and pressure.
*
* @param t Temperature (K)
* @param p Pressure (Pa)
*/
virtual void setState_TP(doublereal t, doublereal p);
//! The isothermal compressibility. Units: 1/Pa.
/*!
* The isothermal compressibility is defined as

View file

@ -130,7 +130,7 @@ namespace Cantera {
*/
virtual doublereal isothermalCompressibility() const;
private:
protected:
/**
* Calculate the density of the mixture using the partial
* molar volumes and mole fractions as input
@ -154,7 +154,7 @@ namespace Cantera {
* NOTE: This is a non-virtual function, which is not a
* member of the ThermoPhase base class.
*/
void calcDensity();
virtual void calcDensity();
public:

View file

@ -347,6 +347,10 @@ namespace Cantera {
updateStandardStateThermo();
}
void VPStandardStateTP::calcDensity() {
err("VPStandardStateTP::calcDensity() called, but EOS for phase is not known");
}
void VPStandardStateTP::setState_TP(doublereal t, doublereal pres) {
/*
@ -371,6 +375,7 @@ namespace Cantera {
*/
//setTemperature(t);
//setPressure(pres);
calcDensity();
}

View file

@ -277,7 +277,33 @@ namespace Cantera {
*/
virtual void setPressure(const doublereal p);
protected:
/**
* Calculate the density of the mixture using the partial
* molar volumes and mole fractions as input
*
* The formula for this is
*
* \f[
* \rho = \frac{\sum_k{X_k W_k}}{\sum_k{X_k V_k}}
* \f]
*
* where \f$X_k\f$ are the mole fractions, \f$W_k\f$ are
* the molecular weights, and \f$V_k\f$ are the pure species
* molar volumes.
*
* Note, the basis behind this formula is that in an ideal
* solution the partial molar volumes are equal to the pure
* species molar volumes. We have additionally specified
* in this class that the pure species molar volumes are
* independent of temperature and pressure.
*
* NOTE: This is a non-virtual function, which is not a
* member of the ThermoPhase base class.
*/
virtual void calcDensity();
public:
//! Set the temperature and pressure at the same time
/*!
* Note this function triggers a reevalulation of the standard

View file

@ -434,11 +434,26 @@ namespace Cantera {
return pres;
}
// Returns the density of water
/*
* This function sets the internal temperature and pressure
* of the underlying object at the same time.
*
* @param T Temperature (kelvin)
* @param P pressure (pascal)
*/
double WaterProps::density_IAPWS(double temp, double press) {
double dens = m_waterIAPWS->density(temp, press, WATER_LIQUID);
return dens;
}
double dens;
dens = m_waterIAPWS->density(temp, press, WATER_LIQUID);
// Returns the density of water
/*
* This function uses the internal state of the
* underlying water object
*/
double WaterProps::density_IAPWS() const {
double dens = m_waterIAPWS->density();
return dens;
}
@ -463,4 +478,111 @@ namespace Cantera {
}
// Parameters for the viscosityWater() function
const double H[4] = {1.,
0.978197,
0.579829,
-0.202354};
const double Hij[6][7] =
{
{ 0.5132047, 0.2151778, -0.2818107, 0.1778064, -0.04176610, 0., 0.},
{ 0.3205656, 0.7317883, -1.070786 , 0.4605040, 0., -0.01578386, 0.},
{ 0., 1.241044 , -1.263184 , 0.2340379, 0., 0., 0.},
{ 0., 1.476783 , 0., -0.4924179, 0.1600435, 0., -0.003629481},
{-0.7782567, 0.0 , 0., 0. , 0., 0., 0.},
{ 0.1885447, 0.0 , 0., 0. , 0., 0., 0.},
};
const double TStar = 647.27; // Kelvin
const double rhoStar = 317.763; // kg / m3
const double presStar = 22.115E6; // Pa
const double muStar = 55.071E-6; //Pa s
// Returns the viscosity of water at the current conditions
// (kg/m/s)
/*
* This function calculates the value of the viscosity of pure
* water at the current T and P.
*
* The formulas used are from the paper
*
* J. V. Sengers, J. T. R. Watson, "Improved International
* Formulations for the Viscosity and Thermal Conductivity of
* Water Substance", J. Phys. Chem. Ref. Data, 15, 1291 (1986).
*
* The formulation is accurate for all temperatures and pressures,
* for steam and for water, even near the critical point.
* Pressures above 500 MPa and temperature above 900 C are suspect.
*/
double WaterProps::viscosityWater() const {
double temp = m_waterIAPWS->temperature();
double dens = m_waterIAPWS->density();
//WaterPropsIAPWS *waterP = new WaterPropsIAPWS();
//m_waterIAPWS->setState_TR(temp, dens);
//double pressure = m_waterIAPWS->pressure();
//printf("pressure = %g\n", pressure);
//dens = 18.02 * pressure / (GasConstant * temp);
//printf ("mod dens = %g\n", dens);
double rhobar = dens/rhoStar;
double tbar = temp / TStar;
// double pbar = pressure / presStar;
double tbar2 = tbar * tbar;
double tbar3 = tbar2 * tbar;
double mu0bar = std::sqrt(tbar) / (H[0] + H[1]/tbar + H[2]/tbar2 + H[3]/tbar3);
//printf("mu0bar = %g\n", mu0bar);
//printf("mu0 = %g\n", mu0bar * muStar);
double tfac1 = 1.0 / tbar - 1.0;
double tfac2 = tfac1 * tfac1;
double tfac3 = tfac2 * tfac1;
double tfac4 = tfac3 * tfac1;
double tfac5 = tfac4 * tfac1;
double rfac1 = rhobar - 1.0;
double rfac2 = rfac1 * rfac1;
double rfac3 = rfac2 * rfac1;
double rfac4 = rfac3 * rfac1;
double rfac5 = rfac4 * rfac1;
double rfac6 = rfac5 * rfac1;
double sum = (Hij[0][0] + Hij[1][0]*tfac1 + Hij[4][0]*tfac4 + Hij[5][0]*tfac5 +
Hij[0][1]*rfac1 + Hij[1][1]*tfac1*rfac1 + Hij[2][1]*tfac2*rfac1 + Hij[3][1]*tfac3*rfac1 +
Hij[0][2]*rfac2 + Hij[1][2]*tfac1*rfac2 + Hij[2][2]*tfac2*rfac2 +
Hij[0][3]*rfac3 + Hij[1][3]*tfac1*rfac3 + Hij[2][3]*tfac2*rfac3 + Hij[3][3]*tfac3*rfac3 +
Hij[0][4]*rfac4 + Hij[3][4]*tfac3*rfac4 +
Hij[1][5]*tfac1*rfac5 + Hij[3][6]*tfac3*rfac6
);
double mu1bar = std::exp(rhobar * sum);
// Apply the near-critical point corrections if necessary
double mu2bar = 1.0;
if ((tbar >= 0.9970) && tbar <= 1.0082) {
if ((rhobar >= 0.755) && (rhobar <= 1.290)) {
double drhodp = 1.0 / m_waterIAPWS->dpdrho();
drhodp *= presStar / rhoStar;
double xsi = rhobar * drhodp;
if (xsi >= 21.93) {
mu2bar = 0.922 * std::pow(xsi, 0.0263);
}
}
}
double mubar = mu0bar * mu1bar * mu2bar;
return mubar * muStar;
}
}

View file

@ -265,11 +265,22 @@ namespace Cantera {
//! Returns the density of water
/*!
* This function sets the internal temperature and pressure
* of the underlying object at the same time.
*
* @param T Temperature (kelvin)
* @param P pressure (pascal)
*/
double density_IAPWS(double T, double P);
//! Returns the density of water
/*!
* This function uses the internal state of the
* underlying water object
*/
double density_IAPWS() const;
//! returns the coefficient of thermal expansion
/*!
* @param T Temperature (kelvin)
@ -284,6 +295,24 @@ namespace Cantera {
*/
double isothermalCompressibility_IAPWS(double T, double P);
//! Returns the viscosity of water at the current conditions
//! (kg/m/s)
/*!
* This function calculates the value of the viscosity of pure
* water at the current T and P.
*
* The formulas used are from the paper
* J. V. Sengers, J. T. R. Watson, "Improved International
* Formulations for the Viscosity and Thermal Conductivity of
* Water Substance", J. Phys. Chem. Ref. Data, 15, 1291 (1986).
*
* The formulation is accurate for all temperatures and pressures,
* for steam and for water, even near the critical point.
* Pressures above 500 MPa and temperature above 900 C are suspect.
*/
double viscosityWater() const;
protected:
//! Pointer to the WaterPropsIAPWS object

View file

@ -49,6 +49,7 @@ static const doublereal Rgas = 8.314371E3; // Joules kmol-1 K-1
#endif
//@}
// Base constructor
WaterPropsIAPWS:: WaterPropsIAPWS() :
m_phi(0),
tau(-1.0),
@ -58,6 +59,10 @@ WaterPropsIAPWS:: WaterPropsIAPWS() :
m_phi = new WaterPropsIAPWSphi();
}
// Copy constructor
/*
* @param b Object to be copied
*/
WaterPropsIAPWS::WaterPropsIAPWS(const WaterPropsIAPWS &b) :
m_phi(0),
tau(b.tau),
@ -68,6 +73,10 @@ WaterPropsIAPWS::WaterPropsIAPWS(const WaterPropsIAPWS &b) :
m_phi->tdpolycalc(tau, delta);
}
// assignment constructor
/*
* @param right Object to be copied
*/
WaterPropsIAPWS & WaterPropsIAPWS::operator=(const WaterPropsIAPWS &b) {
if (this == &b) return *this;
tau = b.tau;
@ -77,12 +86,20 @@ WaterPropsIAPWS & WaterPropsIAPWS::operator=(const WaterPropsIAPWS &b) {
return *this;
}
// destructor
WaterPropsIAPWS::~WaterPropsIAPWS() {
delete (m_phi);
m_phi = 0;
}
/*
* Calculate the dimensionless temp and rho and store internally.
*
* @param temperature input temperature (kelvin)
* @param rho density in kg m-3
*
* this is a private function
*/
void WaterPropsIAPWS::calcDim(doublereal temperature, doublereal rho) {
tau = T_c / temperature;
delta = rho / Rho_c;
@ -100,6 +117,8 @@ void WaterPropsIAPWS::calcDim(doublereal temperature, doublereal rho) {
}
}
// Calculate the Helmholtz free energy in mks units of J kmol-1 K-1,
// using the last temperature and density
doublereal WaterPropsIAPWS::helmholtzFE() const {
doublereal retn = m_phi->phi(tau, delta);
doublereal temperature = T_c/tau;
@ -194,7 +213,32 @@ doublereal WaterPropsIAPWS::density(doublereal temperature, doublereal pressure,
return density_retn;
}
// Calculates the density given the temperature and the pressure,
// and a guess at the density, while not changing the internal state
/*
* Note, below T_c, this is a multivalued function.
*
* The #density() function calculates the density that is consistent with
* a particular value of the temperature and pressure. It may therefore be
* multivalued or potentially there may be no answer from this function. It therefore
* takes a phase guess and a density guess as optional parameters. If no guesses are
*
* supplied to density(), a gas phase guess is assumed. This may or may not be what
* is wanted. Therefore, density() should usually at leat be supplied with a phase
* guess so that it may manufacture an appropriate density guess.
* #density() manufactures the initial density guess, nondimensionalizes everything,
* and then calls #WaterPropsIAPWSphi::dfind(), which does the iterative calculation
* to find the density condition that matches the desired input pressure.
*
* @param pressure : Pressure in Pascals (Newton/m**2)
* @param phase : guessed phase of water
* : -1: no guessed phase
* @param rhoguess : guessed density of the water
* : -1.0 no guessed density
* @return
* Returns the density. If an error is encountered in the calculation
* the value of -1.0 is returned.
*/
doublereal WaterPropsIAPWS::density_const(doublereal pressure,
int phase, doublereal rhoguess) const {
doublereal temperature = T_c / tau;
@ -256,12 +300,24 @@ doublereal WaterPropsIAPWS::density_const(doublereal pressure,
return density_retn;
}
// Returns the density (kg m-3)
/*
* The density is an independent variable in the underlying equation of state
*
* @return Returns the density (kg m-3)
*/
doublereal WaterPropsIAPWS::density() const {
return (delta * Rho_c);
}
// Returns the temperature (Kelvin)
/*
* @return Returns the internally storred temperature
*/
doublereal WaterPropsIAPWS::temperature() const {
return (T_c / tau);
}
/*
* psat_est provides a rough estimate of the saturation
* pressure given the temperature. This is used as an initial
@ -319,6 +375,13 @@ doublereal WaterPropsIAPWS::isothermalCompressibility() const {
return (1.0 / (dens * dpdrho_val));
}
// Returns the value of dp / drho at constant T at the current
// state of the object
/*
* units - Joules / kg
*
* @return returns dpdrho
*/
doublereal WaterPropsIAPWS::dpdrho() const {
doublereal retn = m_phi->dimdpdrho(tau, delta);
doublereal temperature = T_c/tau;
@ -326,11 +389,26 @@ doublereal WaterPropsIAPWS::dpdrho() const {
return val;
}
// Returns the isochoric pressure derivative wrt temperature
/*
* beta = M / (rho * Rgas) (d (pressure) / dT) at constant rho
*
* Note for ideal gases this is equal to one.
*
* beta = delta (phi0_d() + phiR_d())
* - tau delta (phi0_dt() + phiR_dt())
*/
doublereal WaterPropsIAPWS:: coeffPresExp() const {
doublereal retn = m_phi->dimdpdT(tau, delta);
return (retn);
}
// Returns the coefficient of thermal expansion.
/*
* alpha = d (ln V) / dT at constant P.
*
* @return Returns the coefficient of thermal expansion
*/
doublereal WaterPropsIAPWS:: coeffThermExp() const {
doublereal kappa = isothermalCompressibility();
doublereal beta = coeffPresExp();
@ -338,15 +416,27 @@ doublereal WaterPropsIAPWS:: coeffThermExp() const {
return (kappa * dens * Rgas * beta / M_water);
}
// Calculate the Gibbs free energy in mks units of J kmol-1 K-1.
// using the last temperature and density
doublereal WaterPropsIAPWS::Gibbs() const {
doublereal gRT = m_phi->gibbs_RT();
doublereal temperature = T_c/tau;
return (gRT * Rgas * temperature);
}
// Utility routine in the calculation of the saturation pressure
/*
* Private routine
*
* Calculate the Gibbs free energy in mks units of
* J kmol-1 K-1.
*
* @param temperature temperature (kelvin)
* @param pressure pressure (Pascal)
* @param densLiq Output density of liquid
* @param densGas output Density of gas
* @param delGRT output delGRT
*/
void WaterPropsIAPWS::
corr(doublereal temperature, doublereal pressure, doublereal &densLiq,
@ -373,6 +463,16 @@ corr(doublereal temperature, doublereal pressure, doublereal &densLiq,
delGRT = gibbsLiqRT - gibbsGasRT;
}
// Utility routine in the calculation of the saturation pressure
/*
* Private routine
*
* @param temperature temperature (kelvin)
* @param pressure pressure (Pascal)
* @param densLiq Output density of liquid
* @param densGas output Density of gas
* @param pcorr output corrected pressure
*/
void WaterPropsIAPWS::
corr1(doublereal temperature, doublereal pressure, doublereal &densLiq,
doublereal &densGas, doublereal &pcorr) {
@ -401,13 +501,27 @@ corr1(doublereal temperature, doublereal pressure, doublereal &densLiq,
pcorr = rhs * Rgas * temperature / M_water;
}
/**
* Calculate the saturation pressure given the temperature.
* p : Pascals : Newtons/m**2
*/
static int method = 1;
// This function returns the saturation pressure given the
// temperature as an input parameter, and sets the internal state to the saturated
// conditions.
/*
* Note this function will return the saturation pressure, given the temperature.
* It will then set the state of the system to the saturation condition. The input
* parameter waterState is used to either specify the liquid state or the
* gas state at the desired temperatue and saturated pressure.
*
* If the input temperature, T, is above T_c, this routine will set the internal
* state to T and the pressure to P_c. Then, return P_c.
*
* @param temperature input temperature (kelvin)
* @param waterState integer specifying the water state
*
* @return Returns the saturation pressure
* units = Pascal
*/
doublereal WaterPropsIAPWS::psat(doublereal temperature, int waterState) {
static int method = 1;
doublereal densLiq = -1.0, densGas = -1.0, delGRT = 0.0;
doublereal dp, pcorr;
if (temperature >= T_c) {
@ -450,6 +564,16 @@ doublereal WaterPropsIAPWS::psat(doublereal temperature, int waterState) {
return p;
}
// Returns the Phase State flag for the current state of the object
/*
* @param checkState If true, this function does a complete check to see where
* in paramters space we are
*
* There are three values:
* WATER_GAS below the critical temperature but below the critical density
* WATER_LIQUID below the critical temperature but above the critical density
* WATER_SUPERCRIT above the critical temperature
*/
int WaterPropsIAPWS::phaseState(bool checkState) const {
if (checkState) {
if (tau <= 1.0) {
@ -494,8 +618,11 @@ int WaterPropsIAPWS::phaseState(bool checkState) const {
return iState;
}
// Find the water spinodal density
// Return the value of the density at the water spinodal point (on the liquid side)
// for the current temperature.
/*
* @return returns the density with units of kg m-3
*/
doublereal WaterPropsIAPWS::densSpinodalWater() const {
doublereal temperature = T_c/tau;
doublereal delta_save = delta;
@ -587,8 +714,11 @@ doublereal WaterPropsIAPWS::densSpinodalWater() const {
return dens_new;
}
// Find the steam spinodal density
// Return the value of the density at the water spinodal point (on the gas side)
// for the current temperature.
/*
* @return returns the density with units of kg m-3
*/
doublereal WaterPropsIAPWS::densSpinodalSteam() const {
doublereal temperature = T_c/tau;
doublereal delta_save = delta;
@ -682,9 +812,7 @@ doublereal WaterPropsIAPWS::densSpinodalSteam() const {
return dens_new;
}
/**
/*
* Sets the internal state of the object to the
* specified temperature and density.
*/
@ -693,7 +821,6 @@ void WaterPropsIAPWS::setState_TR(doublereal temperature, doublereal rho) {
m_phi->tdpolycalc(tau, delta);
}
/*
* Calculate the enthalpy in mks units of
* J kmol-1 K-1.
@ -704,7 +831,6 @@ doublereal WaterPropsIAPWS::enthalpy() const {
return (hRT * Rgas * temperature);
}
/*
* Calculate the internal Energy in mks units of
* J kmol-1 K-1.
@ -733,11 +859,15 @@ doublereal WaterPropsIAPWS::cv() const {
return (cvR * Rgas);
}
// Calculate the constant pressure heat capacity in mks units of J kmol-1 K-1
// at the last temperature and density
doublereal WaterPropsIAPWS::cp() const {
doublereal cpR = m_phi->cp_R();
return (cpR * Rgas);
}
// Calculate the molar volume (kmol m-3)
// at the last temperature and density
doublereal WaterPropsIAPWS::molarVolume() const {
doublereal rho = delta * Rho_c;
return (M_water / rho);

View file

@ -134,6 +134,25 @@
* - WATER_LIQUID
* - WATER_SUPERCRIT
*
* There are only three functions which actually change the value of the internal
* state of this object after it's been instantiated
* - setState_TR(temperature, rho)
* - density(temperature, pressure, phase, rhoguess)
* - psat(temperature, waterState);
*
* The setState_TR() is the main function that sets the temperature and rho value.
* The density() function serves as a setState_TP() function, in that it sets
* internal state to a temperature and pressure. However, note that this is potentially
* multivalued. Therefore, we need to supply in addition a phase guess and a rho guess
* to the input temperature and pressure.
* The psat() function sets the internal state to the saturated liquid or saturated gas
* state, dependeing on the waterState parameter.
*
* Because the underlying object WaterPropsIAPWSphi is privately held, you can be
* sure that the underlying state of this object doesn't change except due to the
* three function calls listed above.
*
* @ingroup thermoprops
*
*/
@ -243,6 +262,7 @@ public:
* a particular value of the temperature and pressure. It may therefore be
* multivalued or potentially there may be no answer from this function. It therefore
* takes a phase guess and a density guess as optional parameters. If no guesses are
* supplied to density(), a gas phase guess is assumed. This may or may not be what
* is wanted. Therefore, density() should usually at leat be supplied with a phase
* guess so that it may manufacture an appropriate density guess.
@ -264,9 +284,17 @@ public:
//! Returns the density (kg m-3)
/*!
* The density is an independent variable in the underlying equation of state
*
* @return Returns the density (kg m-3)
*/
doublereal density() const;
//! Returns the temperature (Kelvin)
/*!
* @return Returns the internally storred temperature
*/
doublereal temperature() const;
//! Returns the coefficient of thermal expansion.
/*!
* alpha = d (ln V) / dT at constant P.
@ -276,7 +304,7 @@ public:
*/
doublereal coeffThermExp() const;
//! Returns the isochoric pressure-temperature coefficient
//! Returns the isochoric pressure derivative wrt temperature
/*!
*
* beta = M / (rho * Rgas) (d (pressure) / dT) at constant rho
@ -322,14 +350,22 @@ public:
*/
doublereal psat_est(doublereal temperature) const;
//! This function returns the saturation pressure given the
//! temperature as an input parameter.
//! This function returns the saturation pressure given the
//! temperature as an input parameter, and sets the internal state to the saturated
//! conditions.
/*!
* Note this function will return the saturation pressure, given the temperature.
* It will then set the state of the system to the saturation condition. The input
* parameter waterState is used to either specify the liquid state or the
* gas state at the desired temperatue and saturated pressure.
*
* If the input temperature, T, is above T_c, this routine will set the internal
* state to T and the pressure to P_c. Then, return P_c.
*
* @param temperature input temperature (kelvin)
* @param waterState integer specifying the water state
*
* @return
* Returns the saturation pressure
* @return Returns the saturation pressure
* units = Pascal
*/
doublereal psat(doublereal temperature, int waterState = WATER_LIQUID);
@ -364,23 +400,24 @@ public:
/*!
* This is hard coded to the value 647.096 Kelvin
*/
doublereal Tcrit() { return 647.096;}
doublereal Tcrit() const { return 647.096;}
//! Returns the critical pressure of water (22.064E6 Pa)
/*!
* This is hard coded to the value of 22.064E6 pascals
*/
doublereal Pcrit() { return 22.064E6;}
doublereal Pcrit() const { return 22.064E6;}
//! Return the critical density of water (kg m-3)
/*!
* This is equal to 322 kg m-3.
*/
doublereal Rhocrit() { return 322.;}
doublereal Rhocrit() const { return 322.;}
private:
/**
* Calculate the dimensionless temp and rho and store internally.
//! Calculate the dimensionless temp and rho and store internally.
/*!
* Private routine
*
* @param temperature input temperature (kelvin)
* @param rho density in kg m-3
@ -389,6 +426,8 @@ private:
//! Utility routine in the calculation of the saturation pressure
/*!
* Private routine
*
* @param temperature temperature (kelvin)
* @param pressure pressure (Pascal)
* @param densLiq Output density of liquid
@ -400,6 +439,8 @@ private:
//! Utility routine in the calculation of the saturation pressure
/*!
* Private routine
*
* @param temperature temperature (kelvin)
* @param pressure pressure (Pascal)
* @param densLiq Output density of liquid