diff --git a/Cantera/src/thermo/DebyeHuckel.cpp b/Cantera/src/thermo/DebyeHuckel.cpp
index 5bfe711c7..33645818b 100644
--- a/Cantera/src/thermo/DebyeHuckel.cpp
+++ b/Cantera/src/thermo/DebyeHuckel.cpp
@@ -49,6 +49,8 @@ namespace Cantera {
m_densWaterSS(1000.),
m_waterProps(0)
{
+ m_useTmpRefStateStorage = true;
+ m_useTmpStandardStateStorage = false;
m_npActCoeff.resize(3);
m_npActCoeff[0] = 0.1127;
m_npActCoeff[1] = -0.01049;
@@ -78,11 +80,13 @@ namespace Cantera {
m_densWaterSS(1000.),
m_waterProps(0)
{
+ m_useTmpRefStateStorage = true;
+ m_useTmpStandardStateStorage = false;
m_npActCoeff.resize(3);
m_npActCoeff[0] = 0.1127;
m_npActCoeff[1] = -0.01049;
m_npActCoeff[2] = 1.545E-3;
- constructPhaseFile(inputFile, id);
+ constructPhaseFile(inputFile, id);
}
DebyeHuckel::DebyeHuckel(XML_Node& phaseRoot, std::string id) :
@@ -100,11 +104,13 @@ namespace Cantera {
m_densWaterSS(1000.),
m_waterProps(0)
{
+ m_useTmpRefStateStorage = true;
+ m_useTmpStandardStateStorage = false;
m_npActCoeff.resize(3);
m_npActCoeff[0] = 0.1127;
m_npActCoeff[1] = -0.01049;
m_npActCoeff[2] = 1.545E-3;
- constructPhaseXML(phaseRoot, id);
+ constructPhaseXML(phaseRoot, id);
}
/*
@@ -1013,6 +1019,113 @@ namespace Cantera {
vol[0] = molecularWeight(0)/dd;
}
}
+
+
+
+ void DebyeHuckel::getGibbs_RT_ref(doublereal *grt) const {
+ /*
+ * Call the function that makes sure the local copy of
+ * the species reference thermo functions are up to date
+ * for the current temperature.
+ */
+ _updateRefStateThermo();
+ /*
+ * Copy the gibbs function into return vector.
+ */
+ copy(m_g0_RT.begin(), m_g0_RT.end(), grt);
+
+ if (m_waterSS) {
+ double pnow = m_Pcurrent;
+ double tnow = temperature();
+ m_waterSS->setTempPressure(tnow, m_p0);
+ double mu0 = m_waterSS->gibbs_mole();
+ m_waterSS->setTempPressure(tnow, pnow);
+ double rt = _RT();
+ grt[0] = mu0 / rt;
+ }
+
+ }
+
+ void DebyeHuckel::getEnthalpy_RT_ref(doublereal *hrt) const {
+ /*
+ * Call the function that makes sure the local copy of
+ * the species reference thermo functions are up to date
+ * for the current temperature.
+ */
+ _updateRefStateThermo();
+ /*
+ * Copy the gibbs function into return vector.
+ */
+ copy(m_h0_RT.begin(), m_h0_RT.end(), hrt);
+
+ if (m_waterSS) {
+ double pnow = m_Pcurrent;
+ double tnow = temperature();
+ m_waterSS->setTempPressure(tnow, m_p0);
+ double h0 = m_waterSS->enthalpy_mole();
+ m_waterSS->setTempPressure(tnow, pnow);
+ double rt = _RT();
+ hrt[0] = h0 / rt;
+ }
+ }
+
+ void DebyeHuckel::getEntropy_R_ref(doublereal *sr) const {
+ /*
+ * Call the function that makes sure the local copy of
+ * the species reference thermo functions are up to date
+ * for the current temperature.
+ */
+ _updateRefStateThermo();
+ /*
+ * Copy the gibbs function into return vector.
+ */
+ copy(m_s0_R.begin(), m_s0_R.end(), sr);
+
+ if (m_waterSS) {
+ double pnow = m_Pcurrent;
+ double tnow = temperature();
+ m_waterSS->setTempPressure(tnow, m_p0);
+ double s0 = m_waterSS->entropy_mole();
+ m_waterSS->setTempPressure(tnow, pnow);
+ sr[0] = s0 / GasConstant;
+ }
+ }
+
+ void DebyeHuckel::getCp_R_ref(doublereal *cpr) const {
+ /*
+ * Call the function that makes sure the local copy of
+ * the species reference thermo functions are up to date
+ * for the current temperature.
+ */
+ _updateRefStateThermo();
+ copy(m_cp0_R.begin(), m_cp0_R.end(), cpr);
+ if (m_waterSS) {
+ double pnow = m_Pcurrent;
+ double tnow = temperature();
+ m_waterSS->setTempPressure(tnow, m_p0);
+ double cp0 = m_waterSS->cp_mole();
+ m_waterSS->setTempPressure(tnow, pnow);
+ cpr[0] = cp0 / GasConstant;
+ }
+ }
+
+ /*
+ * Get the molar volumes of each species in their reference
+ * states at the current
+ * T and P of the solution.
+ * units = m^3 / kmol
+ */
+ void DebyeHuckel::getStandardVolumes_ref(doublereal *vol) const {
+ double psave = m_Pcurrent;
+ _updateStandardStateThermo(m_p0);
+ copy(m_speciesSize.begin(),
+ m_speciesSize.end(), vol);
+ if (m_waterSS) {
+ double dd = m_waterSS->density();
+ vol[0] = molecularWeight(0)/dd;
+ }
+ _updateStandardStateThermo(psave);
+ }
/*
* ------ Thermodynamic Values for the Species Reference States ---
@@ -1703,6 +1816,11 @@ namespace Cantera {
}
}
+
+ if (m_waterSS) {
+ m_useTmpRefStateStorage = false;
+ }
+
/*
* Lastly set the state
*/
diff --git a/Cantera/src/thermo/DebyeHuckel.h b/Cantera/src/thermo/DebyeHuckel.h
index c8c47829f..e8ee89420 100644
--- a/Cantera/src/thermo/DebyeHuckel.h
+++ b/Cantera/src/thermo/DebyeHuckel.h
@@ -1209,6 +1209,56 @@ namespace Cantera {
*/
virtual void getStandardVolumes(doublereal *vol) const;
+ //! Returns the vector of nondimensional
+ //! Gibbs Free Energies of the reference state at the current temperature
+ //! of the solution and the reference pressure for the species.
+ /*!
+ * @param grt Output vector containing the nondimensional reference state
+ * Gibbs Free energies. Length: m_kk.
+ */
+ virtual void getGibbs_RT_ref(doublereal *grt) const;
+
+ //! Returns the vector of nondimensional
+ //! enthalpies of the reference state at the current temperature
+ //! of the solution and the reference pressure for the species.
+ /*!
+ * @param hrt Output vector containing the nondimensional reference state enthalpies
+ * Length: m_kk.
+ */
+ virtual void getEnthalpy_RT_ref(doublereal *hrt) const;
+
+ /*!
+ * Returns the vector of nondimensional
+ * entropies of the reference state at the current temperature
+ * of the solution and the reference pressure for each species.
+ *
+ * @param er Output vector containing the nondimensional reference state
+ * entropies. Length: m_kk.
+ */
+ virtual void getEntropy_R_ref(doublereal *er) const;
+
+ /*!
+ * Returns the vector of nondimensional
+ * constant pressure heat capacities of the reference state
+ * at the current temperature of the solution
+ * and reference pressure for each species.
+ *
+ * @param cprt Output vector of nondimensional reference state
+ * heat capacities at constant pressure for the species.
+ * Length: m_kk
+ */
+ virtual void getCp_R_ref(doublereal *cprt) const;
+
+ //! Get the molar volumes of the species reference states at the current
+ //! T and P_ref of the solution.
+ /*!
+ * units = m^3 / kmol
+ *
+ * @param vol Output vector containing the standard state volumes.
+ * Length: m_kk.
+ */
+ virtual void getStandardVolumes_ref(doublereal *vol) const;
+
protected:
//! Updates the standard state thermodynamic functions at the current T and P of the solution.
diff --git a/Cantera/src/thermo/HMWSoln.cpp b/Cantera/src/thermo/HMWSoln.cpp
index 864688b67..af09733b3 100644
--- a/Cantera/src/thermo/HMWSoln.cpp
+++ b/Cantera/src/thermo/HMWSoln.cpp
@@ -1132,7 +1132,7 @@ namespace Cantera {
getStandardChemPotentials(gpure);
}
- /**
+ /*
*
* getEnthalpy_RT() (virtual, const)
*
@@ -1149,8 +1149,19 @@ namespace Cantera {
*/
void HMWSoln::
getEnthalpy_RT(doublereal* hrt) const {
+ /*
+ * Call the function that makes sure the local copy of
+ * the species reference thermo functions are up to date
+ * for the current temperature.
+ */
_updateStandardStateThermo();
- getEnthalpy_RT_ref(hrt);
+ /*
+ * Copy the gibbs function into return vector.
+ */
+ copy(m_h0_RT.begin(), m_h0_RT.end(), hrt);
+ // We don't call the reference state functions, because there may
+ // not be a solution at 1 atm for the water equation.
+ // getEnthalpy_RT_ref(hrt);
doublereal pref;
doublereal delta_p;
double RT = _RT();
@@ -1163,7 +1174,7 @@ namespace Cantera {
hrt[0] /= RT;
}
- /**
+ /*
* getEntropy_R() (virtual, const)
*
* Get the nondimensional Entropies for the species
@@ -1180,7 +1191,13 @@ namespace Cantera {
void HMWSoln::
getEntropy_R(doublereal* sr) const {
_updateStandardStateThermo();
- getEntropy_R_ref(sr);
+ /*
+ * Copy the gibbs function into return vector.
+ */
+ copy(m_s0_R.begin(), m_s0_R.end(), sr);
+ // We don't call the reference state functions, because there may
+ // not be a solution at 1 atm for the water equation.
+ //getEntropy_R_ref(sr);
sr[0] = m_waterSS->entropy_mole();
sr[0] /= GasConstant;
}
@@ -1202,7 +1219,8 @@ namespace Cantera {
*/
void HMWSoln::getCp_R(doublereal* cpr) const {
_updateStandardStateThermo();
- getCp_R_ref(cpr);
+ copy(m_cp0_R.begin(), m_cp0_R.end(), cpr);
+ //getCp_R_ref(cpr);
cpr[0] = m_waterSS->cp_mole();
cpr[0] /= GasConstant;
}
@@ -1222,8 +1240,110 @@ namespace Cantera {
vol[0] = molecularWeight(0)/dd;
}
+
+
+ void HMWSoln::getGibbs_RT_ref(doublereal *grt) const {
+ /*
+ * Call the function that makes sure the local copy of
+ * the species reference thermo functions are up to date
+ * for the current temperature.
+ */
+ _updateRefStateThermo();
+ /*
+ * Copy the gibbs function into return vector.
+ */
+ copy(m_g0_RT.begin(), m_g0_RT.end(), grt);
+
+ double pnow = m_Pcurrent;
+ double tnow = temperature();
+ m_waterSS->setTempPressure(tnow, m_p0);
+ double mu0 = m_waterSS->gibbs_mole();
+ m_waterSS->setTempPressure(tnow, pnow);
+ double rt = _RT();
+ grt[0] = mu0 / rt;
+ }
+
+ void HMWSoln::getEnthalpy_RT_ref(doublereal *hrt) const {
+ /*
+ * Call the function that makes sure the local copy of
+ * the species reference thermo functions are up to date
+ * for the current temperature.
+ */
+ _updateRefStateThermo();
+ /*
+ * Copy the gibbs function into return vector.
+ */
+ copy(m_h0_RT.begin(), m_h0_RT.end(), hrt);
+
+ double pnow = m_Pcurrent;
+ double tnow = temperature();
+ m_waterSS->setTempPressure(tnow, m_p0);
+ double h0 = m_waterSS->enthalpy_mole();
+ m_waterSS->setTempPressure(tnow, pnow);
+ double rt = _RT();
+ hrt[0] = h0 / rt;
+ }
+
+
+ void HMWSoln::getEntropy_R_ref(doublereal *sr) const {
+ /*
+ * Call the function that makes sure the local copy of
+ * the species reference thermo functions are up to date
+ * for the current temperature.
+ */
+ _updateRefStateThermo();
+ /*
+ * Copy the gibbs function into return vector.
+ */
+ copy(m_s0_R.begin(), m_s0_R.end(), sr);
+
+ double pnow = m_Pcurrent;
+ double tnow = temperature();
+ m_waterSS->setTempPressure(tnow, m_p0);
+ double s0 = m_waterSS->entropy_mole();
+ m_waterSS->setTempPressure(tnow, pnow);
+ sr[0] = s0 / GasConstant;
+ }
+
+
+ void HMWSoln::getCp_R_ref(doublereal *cpr) const {
+ /*
+ * Call the function that makes sure the local copy of
+ * the species reference thermo functions are up to date
+ * for the current temperature.
+ */
+ _updateRefStateThermo();
+ copy(m_cp0_R.begin(), m_cp0_R.end(), cpr);
+ double pnow = m_Pcurrent;
+ double tnow = temperature();
+ m_waterSS->setTempPressure(tnow, m_p0);
+ double cp0 = m_waterSS->cp_mole();
+ m_waterSS->setTempPressure(tnow, pnow);
+ cpr[0] = cp0 / GasConstant;
+ }
+
/*
- * Updates the standard state thermodynamic functions at the current T and P of the solution.
+ * Get the molar volumes of each species in their reference
+ * states at the current
+ * T and P of the solution.
+ * units = m^3 / kmol
+ */
+ void HMWSoln::getStandardVolumes_ref(doublereal *vol) const {
+ double psave = m_Pcurrent;
+ _updateStandardStateThermo(m_p0);
+ copy(m_speciesSize.begin(),
+ m_speciesSize.end(), vol);
+ if (m_waterSS) {
+ double dd = m_waterSS->density();
+ vol[0] = molecularWeight(0)/dd;
+ }
+ _updateStandardStateThermo(psave);
+ }
+
+
+ /*
+ * Updates the standard state thermodynamic functions at the current T and
+ * P of the solution.
*
* @internal
*
@@ -3527,7 +3647,6 @@ namespace Cantera {
std::exit(-1);
}
- double d2_wateract_dT2;
std::string sni, snj, snk;
const double *molality = DATA_PTR(m_molalities);
diff --git a/Cantera/src/thermo/HMWSoln.h b/Cantera/src/thermo/HMWSoln.h
index 32c7a0a2c..63e7dcc92 100644
--- a/Cantera/src/thermo/HMWSoln.h
+++ b/Cantera/src/thermo/HMWSoln.h
@@ -621,6 +621,56 @@ namespace Cantera {
*/
virtual void getStandardVolumes(doublereal *vol) const;
+ //! Returns the vector of nondimensional
+ //! Gibbs Free Energies of the reference state at the current temperature
+ //! of the solution and the reference pressure for the species.
+ /*!
+ * @param grt Output vector containing the nondimensional reference state
+ * Gibbs Free energies. Length: m_kk.
+ */
+ virtual void getGibbs_RT_ref(doublereal *grt) const;
+
+ //! Returns the vector of nondimensional
+ //! enthalpies of the reference state at the current temperature
+ //! of the solution and the reference pressure for the species.
+ /*!
+ * @param hrt Output vector containing the nondimensional reference state enthalpies
+ * Length: m_kk.
+ */
+ virtual void getEnthalpy_RT_ref(doublereal *hrt) const;
+
+ /*!
+ * Returns the vector of nondimensional
+ * entropies of the reference state at the current temperature
+ * of the solution and the reference pressure for each species.
+ *
+ * @param er Output vector containing the nondimensional reference state
+ * entropies. Length: m_kk.
+ */
+ virtual void getEntropy_R_ref(doublereal *er) const;
+
+ /*!
+ * Returns the vector of nondimensional
+ * constant pressure heat capacities of the reference state
+ * at the current temperature of the solution
+ * and reference pressure for each species.
+ *
+ * @param cprt Output vector of nondimensional reference state
+ * heat capacities at constant pressure for the species.
+ * Length: m_kk
+ */
+ virtual void getCp_R_ref(doublereal *cprt) const;
+
+ //! Get the molar volumes of the species reference states at the current
+ //! T and P_ref of the solution.
+ /*!
+ * units = m^3 / kmol
+ *
+ * @param vol Output vector containing the standard state volumes.
+ * Length: m_kk.
+ */
+ virtual void getStandardVolumes_ref(doublereal *vol) const;
+
protected:
//! Updates the standard state thermodynamic functions at the current T and P of the solution.
diff --git a/Cantera/src/thermo/IdealMolalSoln.cpp b/Cantera/src/thermo/IdealMolalSoln.cpp
index 672da8011..7134b1360 100644
--- a/Cantera/src/thermo/IdealMolalSoln.cpp
+++ b/Cantera/src/thermo/IdealMolalSoln.cpp
@@ -38,6 +38,7 @@ namespace Cantera {
MolalityVPSSTP(),
m_formGC(2)
{
+ m_useTmpRefStateStorage = true;
}
/**
@@ -77,14 +78,18 @@ namespace Cantera {
}
IdealMolalSoln::IdealMolalSoln(std::string inputFile, std::string id) :
- MolalityVPSSTP()
+ MolalityVPSSTP(),
+ m_formGC(2)
{
+ m_useTmpRefStateStorage = true;
constructPhaseFile(inputFile, id);
}
IdealMolalSoln::IdealMolalSoln(XML_Node& root, std::string id) :
- MolalityVPSSTP()
+ MolalityVPSSTP(),
+ m_formGC(2)
{
+ m_useTmpRefStateStorage = true;
constructPhaseXML(root, id);
}
diff --git a/Cantera/src/thermo/VPStandardStateTP.cpp b/Cantera/src/thermo/VPStandardStateTP.cpp
index 708010454..4520881dc 100644
--- a/Cantera/src/thermo/VPStandardStateTP.cpp
+++ b/Cantera/src/thermo/VPStandardStateTP.cpp
@@ -38,7 +38,7 @@ namespace Cantera {
m_tlast_ref(-1.0),
m_plast(-1.0),
m_p0(OneAtm),
- m_useTmpRefStateStorage(true),
+ m_useTmpRefStateStorage(false),
m_useTmpStandardStateStorage(false)
{
}
@@ -59,7 +59,7 @@ namespace Cantera {
m_tlast_ref(-1.0),
m_plast(-1.0),
m_p0(OneAtm),
- m_useTmpRefStateStorage(true),
+ m_useTmpRefStateStorage(false),
m_useTmpStandardStateStorage(false)
{
*this = b;
@@ -390,12 +390,18 @@ namespace Cantera {
void VPStandardStateTP::initLengths() {
m_kk = nSpecies();
int leng = m_kk;
- if (m_useTmpRefStateStorage){
- m_h0_RT.resize(leng);
- m_g0_RT.resize(leng);
- m_cp0_R.resize(leng);
- m_s0_R.resize(leng);
- }
+ /*
+ * malloc the storage for this even if
+ * m_useTmpRefStateStorage is set to false.
+ * So many functions need that temporary storage anyway.
+ * However, that variable is still used to see if the
+ * storage is used to supply the complete picture.
+ */
+ m_h0_RT.resize(leng);
+ m_g0_RT.resize(leng);
+ m_cp0_R.resize(leng);
+ m_s0_R.resize(leng);
+
if (m_useTmpStandardStateStorage) {
m_hss_RT.resize(leng);
m_gss_RT.resize(leng);
diff --git a/Cantera/src/thermo/VPStandardStateTP.h b/Cantera/src/thermo/VPStandardStateTP.h
index db832cacf..f62b85ae0 100644
--- a/Cantera/src/thermo/VPStandardStateTP.h
+++ b/Cantera/src/thermo/VPStandardStateTP.h
@@ -510,7 +510,7 @@ namespace Cantera {
/*!
* boolean indicating whether temporary reference state storage is used
- * -> default is true
+ * -> default is false
*/
bool m_useTmpRefStateStorage;