[Thermo] Fix reference pressure assumptions in VPSSMgr classes
The reference pressure (p0) must be species-specific, since for certain PDSS classes (e.g. PDSS_Water) p0 is a function of temperature, while for other classes (PDSS_ConstVol) it is a constant. VPSSMgr_Water_ConstVol further assumed that the reference pressure for all species was 1 atm, ignoring the setting in the PDSS object. Fixing this changed test results for HMW_test_1 and HMW_test_3. Added a test that specifically compares VPSSMgr_Water_ConstVol with VPSSMgr_General.
This commit is contained in:
parent
0249ce89b8
commit
38d291c683
13 changed files with 373 additions and 76 deletions
|
|
@ -677,8 +677,8 @@ protected:
|
|||
//! properties were calculated at.
|
||||
mutable doublereal m_plast;
|
||||
|
||||
//! Reference pressure (Pa) must be the same for all species - defaults to 1 atm.
|
||||
mutable doublereal m_p0;
|
||||
//! Reference pressure (Pa) for each species
|
||||
mutable vector_fp m_p0;
|
||||
|
||||
//! minimum temperature for the standard state calculations
|
||||
doublereal m_minTemp;
|
||||
|
|
|
|||
|
|
@ -287,12 +287,6 @@ protected:
|
|||
//! were calculated at.
|
||||
mutable doublereal m_Plast_ss;
|
||||
|
||||
/*!
|
||||
* Reference pressure (Pa) must be the same for all species
|
||||
* - defaults to OneAtm
|
||||
*/
|
||||
doublereal m_P0;
|
||||
|
||||
// -> suggest making this private!
|
||||
//! Pointer to the VPSS manager that calculates all of the standard state
|
||||
//! info efficiently.
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@ VPSSMgr::VPSSMgr(VPStandardStateTP* vptp_ptr, MultiSpeciesThermo* spthermo) :
|
|||
m_spthermo(spthermo),
|
||||
m_tlast(-1.0),
|
||||
m_plast(-1.0),
|
||||
m_p0(-1.0),
|
||||
m_minTemp(-1.0),
|
||||
m_maxTemp(1.0E8),
|
||||
m_useTmpRefStateStorage(false),
|
||||
|
|
@ -266,10 +265,10 @@ void VPSSMgr::initLengths()
|
|||
|
||||
void VPSSMgr::initThermoXML(XML_Node& phaseNode, const std::string& id)
|
||||
{
|
||||
const PDSS* kPDSS = m_vptp_ptr->providePDSS(0);
|
||||
m_p0 = kPDSS->refPressure();
|
||||
for (size_t i = 0; i < m_kk; i++) {
|
||||
const PDSS* kPDSS = m_vptp_ptr->providePDSS(i);
|
||||
m_p0.resize(std::max(m_p0.size(), i+1));
|
||||
m_p0[i] = kPDSS->refPressure();
|
||||
m_minTemp = std::max(m_minTemp, kPDSS->minTemp());
|
||||
m_maxTemp = std::min(m_maxTemp, kPDSS->maxTemp());
|
||||
}
|
||||
|
|
@ -281,9 +280,8 @@ void VPSSMgr::installSTSpecies(size_t k, const XML_Node& s,
|
|||
shared_ptr<SpeciesThermoInterpType> stit(newSpeciesThermoInterpType(s.child("thermo")));
|
||||
stit->validate(s["name"]);
|
||||
m_spthermo->install_STIT(k, stit);
|
||||
if (m_p0 < 0.0) {
|
||||
m_p0 = m_spthermo->refPressure(k);
|
||||
}
|
||||
m_p0.resize(std::max(m_p0.size(), k+1));
|
||||
m_p0[k] = m_spthermo->refPressure(k);
|
||||
}
|
||||
|
||||
PDSS* VPSSMgr::createInstallPDSS(size_t k, const XML_Node& s,
|
||||
|
|
@ -315,7 +313,7 @@ doublereal VPSSMgr::refPressure(size_t k) const
|
|||
if (k != npos) {
|
||||
return m_vptp_ptr->providePDSS(k)->refPressure();
|
||||
}
|
||||
return m_p0;
|
||||
return m_p0[0];
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,10 +34,9 @@ VPSSMgr_ConstVol::VPSSMgr_ConstVol(VPStandardStateTP* vp_ptr, MultiSpeciesThermo
|
|||
*/
|
||||
void VPSSMgr_ConstVol::_updateStandardStateThermo()
|
||||
{
|
||||
doublereal del_pRT = (m_plast - m_p0) / (GasConstant * m_tlast);
|
||||
|
||||
for (size_t k = 0; k < m_kk; k++) {
|
||||
m_hss_RT[k] = m_h0_RT[k] + del_pRT * m_Vss[k];
|
||||
m_hss_RT[k] = m_h0_RT[k]
|
||||
+ (m_plast - m_p0[k]) / (GasConstant * m_tlast) * m_Vss[k];
|
||||
m_cpss_R[k] = m_cp0_R[k];
|
||||
m_sss_R[k] = m_s0_R[k];
|
||||
m_gss_RT[k] = m_hss_RT[k] - m_sss_R[k];
|
||||
|
|
|
|||
|
|
@ -146,10 +146,8 @@ PDSS* VPSSMgr_General::createInstallPDSS(size_t k, const XML_Node& speciesNode,
|
|||
m_kk = std::max(m_kk, k+1);
|
||||
m_minTemp = std::max(m_minTemp, kPDSS->minTemp());
|
||||
m_maxTemp = std::min(m_maxTemp, kPDSS->maxTemp());
|
||||
doublereal p0 = kPDSS->refPressure();
|
||||
if (k == 0) {
|
||||
m_p0 = p0;
|
||||
}
|
||||
m_p0.resize(std::max(m_p0.size(), k+1));
|
||||
m_p0[k] = kPDSS->refPressure();
|
||||
return kPDSS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,13 +43,12 @@ void VPSSMgr_IdealGas::getStandardVolumes(doublereal* vol) const
|
|||
|
||||
void VPSSMgr_IdealGas::_updateStandardStateThermo()
|
||||
{
|
||||
doublereal pp = log(m_plast / m_p0);
|
||||
doublereal v = temperature() *GasConstant /m_plast;
|
||||
|
||||
for (size_t k = 0; k < m_kk; k++) {
|
||||
m_hss_RT[k] = m_h0_RT[k];
|
||||
m_cpss_R[k] = m_cp0_R[k];
|
||||
m_sss_R[k] = m_s0_R[k] - pp;
|
||||
m_sss_R[k] = m_s0_R[k] - log(m_plast / m_p0[k]);
|
||||
m_gss_RT[k] = m_hss_RT[k] - m_sss_R[k];
|
||||
m_Vss[k] = v;
|
||||
}
|
||||
|
|
@ -76,7 +75,7 @@ PDSS* VPSSMgr_IdealGas::createInstallPDSS(size_t k, const XML_Node& speciesNode,
|
|||
PDSS* kPDSS = new PDSS_IdealGas(m_vptp_ptr, k, speciesNode,
|
||||
*phaseNode_ptr, true);
|
||||
|
||||
m_p0 = m_spthermo->refPressure(k);
|
||||
m_p0[k] = m_spthermo->refPressure(k);
|
||||
return kPDSS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,9 +33,9 @@ VPSSMgr_Water_ConstVol::VPSSMgr_Water_ConstVol(VPStandardStateTP* vp_ptr,
|
|||
void VPSSMgr_Water_ConstVol::getEnthalpy_RT_ref(doublereal* hrt) const
|
||||
{
|
||||
// Everything should be OK except for the water SS
|
||||
m_p0 = m_waterSS->pref_safe(m_tlast);
|
||||
if (m_p0 != m_plast) {
|
||||
m_waterSS->setState_TP(m_tlast, m_p0);
|
||||
m_p0[0] = m_waterSS->pref_safe(m_tlast);
|
||||
if (m_p0[0] != m_plast) {
|
||||
m_waterSS->setState_TP(m_tlast, m_p0[0]);
|
||||
m_h0_RT[0] = (m_waterSS->enthalpy_mole()) / (GasConstant * m_tlast);
|
||||
m_waterSS->setState_TP(m_tlast, m_plast);
|
||||
} else {
|
||||
|
|
@ -47,9 +47,9 @@ void VPSSMgr_Water_ConstVol::getEnthalpy_RT_ref(doublereal* hrt) const
|
|||
void VPSSMgr_Water_ConstVol::getGibbs_RT_ref(doublereal* grt) const
|
||||
{
|
||||
// Everything should be OK except for the water SS
|
||||
m_p0 = m_waterSS->pref_safe(m_tlast);
|
||||
if (m_p0 != m_plast) {
|
||||
m_waterSS->setState_TP(m_tlast, m_p0);
|
||||
m_p0[0] = m_waterSS->pref_safe(m_tlast);
|
||||
if (m_p0[0] != m_plast) {
|
||||
m_waterSS->setState_TP(m_tlast, m_p0[0]);
|
||||
m_g0_RT[0] = (m_waterSS->gibbs_mole()) / (GasConstant * m_tlast);
|
||||
m_waterSS->setState_TP(m_tlast, m_plast);
|
||||
} else {
|
||||
|
|
@ -69,9 +69,9 @@ void VPSSMgr_Water_ConstVol::getGibbs_ref(doublereal* g) const
|
|||
void VPSSMgr_Water_ConstVol::getEntropy_R_ref(doublereal* sr) const
|
||||
{
|
||||
// Everything should be OK except for the water SS
|
||||
m_p0 = m_waterSS->pref_safe(m_tlast);
|
||||
if (m_p0 != m_plast) {
|
||||
m_waterSS->setState_TP(m_tlast, m_p0);
|
||||
m_p0[0] = m_waterSS->pref_safe(m_tlast);
|
||||
if (m_p0[0] != m_plast) {
|
||||
m_waterSS->setState_TP(m_tlast, m_p0[0]);
|
||||
m_s0_R[0] = (m_waterSS->entropy_mole()) / GasConstant;
|
||||
m_waterSS->setState_TP(m_tlast, m_plast);
|
||||
} else {
|
||||
|
|
@ -83,9 +83,9 @@ void VPSSMgr_Water_ConstVol::getEntropy_R_ref(doublereal* sr) const
|
|||
void VPSSMgr_Water_ConstVol::getCp_R_ref(doublereal* cpr) const
|
||||
{
|
||||
// Everything should be OK except for the water SS
|
||||
m_p0 = m_waterSS->pref_safe(m_tlast);
|
||||
if (m_p0 != m_plast) {
|
||||
m_waterSS->setState_TP(m_tlast, m_p0);
|
||||
m_p0[0] = m_waterSS->pref_safe(m_tlast);
|
||||
if (m_p0[0] != m_plast) {
|
||||
m_waterSS->setState_TP(m_tlast, m_p0[0]);
|
||||
m_cp0_R[0] = (m_waterSS->cp_mole()) / GasConstant;
|
||||
m_waterSS->setState_TP(m_tlast, m_plast);
|
||||
} else {
|
||||
|
|
@ -97,9 +97,9 @@ void VPSSMgr_Water_ConstVol::getCp_R_ref(doublereal* cpr) const
|
|||
void VPSSMgr_Water_ConstVol::getStandardVolumes_ref(doublereal* vol) const
|
||||
{
|
||||
// Everything should be OK except for the water SS
|
||||
m_p0 = m_waterSS->pref_safe(m_tlast);
|
||||
if (m_p0 != m_plast) {
|
||||
m_waterSS->setState_TP(m_tlast, m_p0);
|
||||
m_p0[0] = m_waterSS->pref_safe(m_tlast);
|
||||
if (m_p0[0] != m_plast) {
|
||||
m_waterSS->setState_TP(m_tlast, m_p0[0]);
|
||||
m_V0[0] = m_vptp_ptr->molecularWeight(0) / m_waterSS->density();
|
||||
m_waterSS->setState_TP(m_tlast, m_plast);
|
||||
} else {
|
||||
|
|
@ -110,27 +110,25 @@ void VPSSMgr_Water_ConstVol::getStandardVolumes_ref(doublereal* vol) const
|
|||
|
||||
void VPSSMgr_Water_ConstVol::_updateRefStateThermo() const
|
||||
{
|
||||
m_p0 = m_waterSS->pref_safe(m_tlast);
|
||||
m_p0[0] = m_waterSS->pref_safe(m_tlast);
|
||||
m_spthermo->update(m_tlast, &m_cp0_R[0], &m_h0_RT[0], &m_s0_R[0]);
|
||||
for (size_t k = 0; k < m_kk; k++) {
|
||||
m_g0_RT[k] = m_h0_RT[k] - m_s0_R[k];
|
||||
m_vptp_ptr->providePDSS(k)->setTemperature(m_tlast);
|
||||
}
|
||||
m_waterSS->setState_TP(m_tlast, m_p0);
|
||||
m_waterSS->setState_TP(m_tlast, m_p0[0]);
|
||||
m_h0_RT[0] = (m_waterSS->enthalpy_mole()) / (GasConstant * m_tlast);
|
||||
m_s0_R[0] = (m_waterSS->entropy_mole()) / GasConstant;
|
||||
m_cp0_R[0] = (m_waterSS->cp_mole()) / GasConstant;
|
||||
m_g0_RT[0] = (m_hss_RT[0] - m_sss_R[0]);
|
||||
m_V0[0] = m_vptp_ptr->molecularWeight(0) / (m_waterSS->density());
|
||||
m_g0_RT[0] = (m_h0_RT[0] - m_s0_R[0]);
|
||||
m_V0[0] = m_waterSS->molarVolume();
|
||||
m_waterSS->setState_TP(m_tlast, m_plast);
|
||||
}
|
||||
|
||||
void VPSSMgr_Water_ConstVol::_updateStandardStateThermo()
|
||||
{
|
||||
doublereal del_pRT = (m_plast - OneAtm) / (GasConstant * m_tlast);
|
||||
|
||||
for (size_t k = 1; k < m_kk; k++) {
|
||||
m_hss_RT[k] = m_h0_RT[k] + del_pRT * m_Vss[k];
|
||||
m_hss_RT[k] = m_h0_RT[k] + (m_plast - m_p0[k]) / (GasConstant * m_tlast) * m_Vss[k];
|
||||
m_cpss_R[k] = m_cp0_R[k];
|
||||
m_sss_R[k] = m_s0_R[k];
|
||||
m_gss_RT[k] = m_hss_RT[k] - m_sss_R[k];
|
||||
|
|
@ -144,7 +142,7 @@ void VPSSMgr_Water_ConstVol::_updateStandardStateThermo()
|
|||
m_sss_R[0] = (m_waterSS->entropy_mole()) / GasConstant;
|
||||
m_cpss_R[0] = (m_waterSS->cp_mole()) / GasConstant;
|
||||
m_gss_RT[0] = (m_hss_RT[0] - m_sss_R[0]);
|
||||
m_Vss[0] = (m_vptp_ptr->molecularWeight(0) / m_waterSS->density());
|
||||
m_Vss[0] = m_waterSS->molarVolume();
|
||||
}
|
||||
|
||||
void VPSSMgr_Water_ConstVol::initThermoXML(XML_Node& phaseNode,
|
||||
|
|
@ -225,6 +223,7 @@ PDSS* VPSSMgr_Water_ConstVol::createInstallPDSS(size_t k,
|
|||
|
||||
// instantiate a new kPDSS object
|
||||
kPDSS = new PDSS_ConstVol(m_vptp_ptr, k, speciesNode, *phaseNode_ptr, true);
|
||||
m_p0[k] = kPDSS->refPressure();
|
||||
}
|
||||
return kPDSS;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -110,8 +110,8 @@ void VPSSMgr_Water_HKFT::updateRefStateThermo() const
|
|||
|
||||
void VPSSMgr_Water_HKFT::_updateRefStateThermo() const
|
||||
{
|
||||
m_p0 = m_waterSS->pref_safe(m_tlast);
|
||||
m_waterSS->setState_TP(m_tlast, m_p0);
|
||||
m_p0[0] = m_waterSS->pref_safe(m_tlast);
|
||||
m_waterSS->setState_TP(m_tlast, m_p0[0]);
|
||||
m_h0_RT[0] = (m_waterSS->enthalpy_mole()) / (GasConstant * m_tlast);
|
||||
m_s0_R[0] = (m_waterSS->entropy_mole()) / GasConstant;
|
||||
m_cp0_R[0] = (m_waterSS->cp_mole()) / GasConstant;
|
||||
|
|
@ -120,7 +120,7 @@ void VPSSMgr_Water_HKFT::_updateRefStateThermo() const
|
|||
PDSS* ps;
|
||||
for (size_t k = 1; k < m_kk; k++) {
|
||||
ps = m_vptp_ptr->providePDSS(k);
|
||||
ps->setState_TP(m_tlast, m_p0);
|
||||
ps->setState_TP(m_tlast, m_p0[0]);
|
||||
m_cp0_R[k] = ps->cp_R();
|
||||
m_s0_R[k] = ps->entropy_mole() / GasConstant;
|
||||
m_g0_RT[k] = ps->gibbs_RT();
|
||||
|
|
|
|||
|
|
@ -20,8 +20,7 @@ namespace Cantera
|
|||
VPStandardStateTP::VPStandardStateTP() :
|
||||
m_Pcurrent(OneAtm),
|
||||
m_Tlast_ss(-1.0),
|
||||
m_Plast_ss(-1.0),
|
||||
m_P0(OneAtm)
|
||||
m_Plast_ss(-1.0)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
252
test/data/HMW_NaCl.xml
Normal file
252
test/data/HMW_NaCl.xml
Normal file
|
|
@ -0,0 +1,252 @@
|
|||
<?xml version="1.0"?>
|
||||
<ctml>
|
||||
<phase id="water_constvol" dim="3">
|
||||
<speciesArray datasrc="#species_waterSolution">
|
||||
H2O(L) Cl- H+ Na+ OH-
|
||||
</speciesArray>
|
||||
<state>
|
||||
<temperature units="K"> 298.15 </temperature>
|
||||
<pressure units="Pa"> 101325.0 </pressure>
|
||||
<soluteMolalities>
|
||||
Na+:6.0954
|
||||
Cl-:6.0954
|
||||
H+:2.1628E-9
|
||||
OH-:1.3977E-6
|
||||
</soluteMolalities>
|
||||
</state>
|
||||
<thermo model="HMW">
|
||||
<variablePressureStandardStateManager model="water_constvol" />
|
||||
<standardConc model="solvent_volume" />
|
||||
<activityCoefficients model="Pitzer">
|
||||
<A_Debye> 1.175930 </A_Debye>
|
||||
<B_Debye> 3.28640E9 </B_Debye>
|
||||
<ionicRadius default="3.042843" units="Angstroms">
|
||||
</ionicRadius>
|
||||
<binarySaltParameters cation="Na+" anion="Cl-">
|
||||
<beta0> 0.0765 </beta0>
|
||||
<beta1> 0.2664 </beta1>
|
||||
<beta2> 0.0 </beta2>
|
||||
<Cphi> 0.00127 </Cphi>
|
||||
<Alpha1> 2.0 </Alpha1>
|
||||
</binarySaltParameters>
|
||||
|
||||
<binarySaltParameters cation="H+" anion="Cl-">
|
||||
<beta0> 0.1775 </beta0>
|
||||
<beta1> 0.2945 </beta1>
|
||||
<beta2> 0.0 </beta2>
|
||||
<Cphi> 0.0008 </Cphi>
|
||||
<Alpha1> 2.0 </Alpha1>
|
||||
</binarySaltParameters>
|
||||
|
||||
<binarySaltParameters cation="Na+" anion="OH-">
|
||||
<beta0> 0.0864 </beta0>
|
||||
<beta1> 0.253 </beta1>
|
||||
<beta2> 0.0 </beta2>
|
||||
<Cphi> 0.0044 </Cphi>
|
||||
<Alpha1> 2.0 </Alpha1>
|
||||
</binarySaltParameters>
|
||||
|
||||
<thetaAnion anion1="Cl-" anion2="OH-">
|
||||
<theta> -0.05 </theta>
|
||||
</thetaAnion>
|
||||
|
||||
<psiCommonCation cation="Na+" anion1="Cl-" anion2="OH-">
|
||||
<theta> -0.05 </theta>
|
||||
<Psi> -0.006 </Psi>
|
||||
</psiCommonCation>
|
||||
|
||||
<thetaCation cation1="Na+" cation2="H+">
|
||||
<theta> 0.036 </theta>
|
||||
</thetaCation>
|
||||
|
||||
<psiCommonAnion anion="Cl-" cation1="Na+" cation2="H+">
|
||||
<Theta> 0.036 </Theta>
|
||||
<Psi> -0.004 </Psi>
|
||||
</psiCommonAnion>
|
||||
|
||||
</activityCoefficients>
|
||||
<solvent> H2O(L) </solvent>
|
||||
</thermo>
|
||||
<elementArray datasrc="elements.xml"> O H C E Fe Si N Na Cl </elementArray>
|
||||
</phase>
|
||||
|
||||
<phase id="general" dim="3">
|
||||
<speciesArray datasrc="#species_waterSolution">
|
||||
H2O(L) Cl- H+ Na+ OH-
|
||||
</speciesArray>
|
||||
<state>
|
||||
<temperature units="K"> 298.15 </temperature>
|
||||
<pressure units="Pa"> 101325.0 </pressure>
|
||||
<soluteMolalities>
|
||||
Na+:6.0954
|
||||
Cl-:6.0954
|
||||
H+:2.1628E-9
|
||||
OH-:1.3977E-6
|
||||
</soluteMolalities>
|
||||
</state>
|
||||
<!-- thermo model identifies the inherited class
|
||||
from ThermoPhase that will handle the thermodynamics.
|
||||
-->
|
||||
<thermo model="HMW">
|
||||
<variablePressureStandardStateManager model="general" />
|
||||
<standardConc model="solvent_volume" />
|
||||
<activityCoefficients model="Pitzer">
|
||||
<!-- A_Debye units = sqrt(kg/gmol)
|
||||
This is adjusted to match the GWB value so
|
||||
that numerical comparisons can be made
|
||||
Aln = 0.5107
|
||||
-->
|
||||
<A_Debye> 1.175930 </A_Debye>
|
||||
<!-- B_Debye units = sqrt(kg/gmol)/m
|
||||
-->
|
||||
<B_Debye> 3.28640E9 </B_Debye>
|
||||
<ionicRadius default="3.042843" units="Angstroms">
|
||||
</ionicRadius>
|
||||
<binarySaltParameters cation="Na+" anion="Cl-">
|
||||
<beta0> 0.0765 </beta0>
|
||||
<beta1> 0.2664 </beta1>
|
||||
<beta2> 0.0 </beta2>
|
||||
<Cphi> 0.00127 </Cphi>
|
||||
<Alpha1> 2.0 </Alpha1>
|
||||
</binarySaltParameters>
|
||||
|
||||
<binarySaltParameters cation="H+" anion="Cl-">
|
||||
<beta0> 0.1775 </beta0>
|
||||
<beta1> 0.2945 </beta1>
|
||||
<beta2> 0.0 </beta2>
|
||||
<Cphi> 0.0008 </Cphi>
|
||||
<Alpha1> 2.0 </Alpha1>
|
||||
</binarySaltParameters>
|
||||
|
||||
<binarySaltParameters cation="Na+" anion="OH-">
|
||||
<beta0> 0.0864 </beta0>
|
||||
<beta1> 0.253 </beta1>
|
||||
<beta2> 0.0 </beta2>
|
||||
<Cphi> 0.0044 </Cphi>
|
||||
<Alpha1> 2.0 </Alpha1>
|
||||
</binarySaltParameters>
|
||||
|
||||
<thetaAnion anion1="Cl-" anion2="OH-">
|
||||
<theta> -0.05 </theta>
|
||||
</thetaAnion>
|
||||
|
||||
<psiCommonCation cation="Na+" anion1="Cl-" anion2="OH-">
|
||||
<theta> -0.05 </theta>
|
||||
<Psi> -0.006 </Psi>
|
||||
</psiCommonCation>
|
||||
|
||||
<thetaCation cation1="Na+" cation2="H+">
|
||||
<theta> 0.036 </theta>
|
||||
</thetaCation>
|
||||
|
||||
<psiCommonAnion anion="Cl-" cation1="Na+" cation2="H+">
|
||||
<Theta> 0.036 </Theta>
|
||||
<Psi> -0.004 </Psi>
|
||||
</psiCommonAnion>
|
||||
|
||||
</activityCoefficients>
|
||||
<solvent> H2O(L) </solvent>
|
||||
</thermo>
|
||||
<elementArray datasrc="elements.xml"> O H C E Fe Si N Na Cl </elementArray>
|
||||
</phase>
|
||||
|
||||
|
||||
<speciesData id="species_waterSolution">
|
||||
|
||||
<species name="H2O(L)">
|
||||
<atomArray>H:2 O:1 </atomArray>
|
||||
<thermo>
|
||||
<NASA Tmax="600.0" Tmin="273.14999999999998" P0="100000.0">
|
||||
<floatArray name="coeffs" size="7">
|
||||
7.255750050E+01, -6.624454020E-01, 2.561987460E-03, -4.365919230E-06,
|
||||
2.781789810E-09, -4.188654990E+04, -2.882801370E+02
|
||||
</floatArray>
|
||||
</NASA>
|
||||
</thermo>
|
||||
<standardState model="waterIAPWS">
|
||||
</standardState>
|
||||
</species>
|
||||
|
||||
<species name="Na+">
|
||||
<atomArray> Na:1 E:-1 </atomArray>
|
||||
<charge> +1 </charge>
|
||||
<thermo>
|
||||
<Mu0 Pref="100000.0" Tmax="1000.0" Tmin="200.0">
|
||||
<H298 units="cal/mol"> 0.0 </H298>
|
||||
<numPoints> 2 </numPoints>
|
||||
<floatArray size="2" title="Mu0Values" units="Dimensionless">
|
||||
-125.5213, -125.5213
|
||||
</floatArray>
|
||||
<floatArray size="2" title="Mu0Temperatures">
|
||||
298.15, 333.15
|
||||
</floatArray>
|
||||
</Mu0>
|
||||
</thermo>
|
||||
<standardState model="constant_incompressible">
|
||||
<molarVolume> 1.3 </molarVolume>
|
||||
</standardState>
|
||||
</species>
|
||||
|
||||
<species name="Cl-">
|
||||
<atomArray> Cl:1 E:1 </atomArray>
|
||||
<charge> -1 </charge>
|
||||
<standardState model="constant_incompressible">
|
||||
<molarVolume> 1.3 </molarVolume>
|
||||
</standardState>
|
||||
<thermo>
|
||||
<Mu0 Pref="100000.0" Tmax="333." Tmin="298.">
|
||||
<H298 units="cal/mol"> 0.0 </H298>
|
||||
<numPoints> 2 </numPoints>
|
||||
<floatArray size="2" title="Mu0Values" units="Dimensionless">
|
||||
-52.8716 , -52.8716
|
||||
</floatArray>
|
||||
<floatArray size="2" title="Mu0Temperatures">
|
||||
298.15, 333.15
|
||||
</floatArray>
|
||||
</Mu0>
|
||||
</thermo>
|
||||
</species>
|
||||
|
||||
<species name="H+">
|
||||
<atomArray> H:1 E:-1 </atomArray>
|
||||
<charge> +1 </charge>
|
||||
<standardState model="constant_incompressible">
|
||||
<molarVolume> 1.3 </molarVolume>
|
||||
</standardState>
|
||||
<thermo>
|
||||
<Mu0 Pref="100000.0" Tmax="333." Tmin="298.">
|
||||
<H298 units="cal/mol"> 0.0 </H298>
|
||||
<numPoints> 2 </numPoints>
|
||||
<floatArray size="2" title="Mu0Values" units="Dimensionless">
|
||||
0.0 , 0.0
|
||||
</floatArray>
|
||||
<floatArray size="2" title="Mu0Temperatures">
|
||||
298.15, 333.15
|
||||
</floatArray>
|
||||
</Mu0>
|
||||
</thermo>
|
||||
</species>
|
||||
|
||||
<species name="OH-">
|
||||
<atomArray> O:1 H:1 E:1 </atomArray>
|
||||
<charge> -1 </charge>
|
||||
<standardState model="constant_incompressible">
|
||||
<molarVolume> 1.3 </molarVolume>
|
||||
</standardState>
|
||||
<thermo>
|
||||
<Mu0 Pref="100000.0" Tmax="333." Tmin="298.">
|
||||
<H298 units="cal/mol"> 0.0 </H298>
|
||||
<numPoints> 2 </numPoints>
|
||||
<floatArray size="2" title="Mu0Values" units="Dimensionless">
|
||||
-91.523 , -91.523
|
||||
</floatArray>
|
||||
<floatArray size="2" title="Mu0Temperatures">
|
||||
298.15, 333.15
|
||||
</floatArray>
|
||||
</Mu0>
|
||||
</thermo>
|
||||
</species>
|
||||
|
||||
</speciesData>
|
||||
|
||||
</ctml>
|
||||
59
test/thermo/standardStateManagers.cpp
Normal file
59
test/thermo/standardStateManagers.cpp
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
#include "gtest/gtest.h"
|
||||
#include "cantera/thermo/HMWSoln.h"
|
||||
|
||||
using namespace Cantera;
|
||||
|
||||
TEST(HMW, VPSSMgrGeneral_vs_VPSSMgrWater_ConstVol)
|
||||
{
|
||||
// Calculations should give the same result using either the generic
|
||||
// VPSSMgr_General class or one of the more specialized classes such as
|
||||
// VPSSMgr_Water_ConstVol.
|
||||
HMWSoln p1("../data/HMW_NaCl.xml", "water_constvol");
|
||||
HMWSoln p2("../data/HMW_NaCl.xml", "general");
|
||||
size_t n = p1.nSpecies();
|
||||
vector_fp molalities(n);
|
||||
p1.getMolalities(molalities.data());
|
||||
molalities[2] = 2.1628E-9;
|
||||
molalities[3] = 6.0997;
|
||||
molalities[4] = 1.3977E-6;
|
||||
molalities[1] = molalities[2] + molalities[3] - molalities[4];
|
||||
p1.setMolalities(molalities.data());
|
||||
p2.setMolalities(molalities.data());
|
||||
p1.setState_TP(310.15, 201325);
|
||||
p2.setState_TP(310.15, 201325);
|
||||
|
||||
vector_fp v1(n);
|
||||
vector_fp v2(n);
|
||||
p1.getStandardVolumes(v1.data());
|
||||
p2.getStandardVolumes(v2.data());
|
||||
for (size_t i = 0; i < n; i++) {
|
||||
EXPECT_NEAR(v1[i], v2[i], 1e-9) << p1.speciesName(i);
|
||||
}
|
||||
|
||||
p1.getCp_R(v1.data());
|
||||
p2.getCp_R(v2.data());
|
||||
for (size_t i = 0; i < n; i++) {
|
||||
EXPECT_NEAR(v1[i], v2[i], 1e-10) << p1.speciesName(i);
|
||||
}
|
||||
|
||||
p1.getEntropy_R(v1.data());
|
||||
p2.getEntropy_R(v2.data());
|
||||
for (size_t i = 0; i < n; i++) {
|
||||
EXPECT_NEAR(v1[i], v2[i], 1e-10) << p1.speciesName(i);
|
||||
}
|
||||
|
||||
p1.getEnthalpy_RT(v1.data());
|
||||
p2.getEnthalpy_RT(v2.data());
|
||||
for (size_t i = 0; i < n; i++) {
|
||||
EXPECT_NEAR(v1[i], v2[i], 1e-10) << p1.speciesName(i);
|
||||
}
|
||||
|
||||
p1.getChemPotentials_RT(v1.data());
|
||||
p2.getChemPotentials_RT(v2.data());
|
||||
for (size_t i = 0; i < n; i++) {
|
||||
EXPECT_NEAR(v1[i], v2[i], 1e-10) << p1.speciesName(i);
|
||||
}
|
||||
|
||||
EXPECT_NEAR(p1.entropy_mole(), p2.entropy_mole(), 1e-7);
|
||||
EXPECT_NEAR(p1.enthalpy_mole(), p2.enthalpy_mole(), 1e-4);
|
||||
}
|
||||
|
|
@ -37,22 +37,22 @@ a2 = 3.04284e-10
|
|||
Species Standard chemical potentials (kJ/gmol)
|
||||
------------------------------------------------------------
|
||||
H2O(L) -306.685728
|
||||
Cl- -131.066416
|
||||
H+ 0
|
||||
Na+ -311.16189
|
||||
OH- -226.88157
|
||||
Cl- -131.064694
|
||||
H+ 0.0017225
|
||||
Na+ -311.160167
|
||||
OH- -226.879848
|
||||
------------------------------------------------------------
|
||||
Some DeltaSS values: Delta(mu_0)
|
||||
NaCl(S): Na+ + Cl- -> NaCl(S): 9.597906 kJ/gmol
|
||||
: 3.871747 (dimensionless)
|
||||
: 1.681478 (dimensionless/ln10)
|
||||
NaCl(S): Na+ + Cl- -> NaCl(S): 9.594461 kJ/gmol
|
||||
: 3.870358 (dimensionless)
|
||||
: 1.680875 (dimensionless/ln10)
|
||||
G0(NaCl(S)) = -432.6304 (fixed)
|
||||
G0(Na+) = -311.1619
|
||||
G0(Cl-) = -131.0664
|
||||
OH-: H2O(L) - H+ -> OH-: 79.80416 kJ/gmol
|
||||
: 32.1926 (dimensionless)
|
||||
: 13.98107 (dimensionless/ln10)
|
||||
G0(OH-) = -226.8816
|
||||
G0(H+) = 0
|
||||
G0(Na+) = -311.1602
|
||||
G0(Cl-) = -131.0647
|
||||
OH-: H2O(L) - H+ -> OH-: 79.8076 kJ/gmol
|
||||
: 32.19399 (dimensionless)
|
||||
: 13.98167 (dimensionless/ln10)
|
||||
G0(OH-) = -226.8798
|
||||
G0(H+) = 0.0017225
|
||||
G0(H2O(L)) = -306.6857
|
||||
------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -38,16 +38,16 @@ Index Name MoleF MolalityCropped Charge
|
|||
Species Standard chemical potentials (kJ/gmol)
|
||||
------------------------------------------------------------
|
||||
H2O(L) -317.175788
|
||||
Cl- -186.016281
|
||||
H+ 0
|
||||
Na+ -441.617151
|
||||
OH- -322.002134
|
||||
Cl- -186.014558
|
||||
H+ 0.0017225
|
||||
Na+ -441.615429
|
||||
OH- -322.000412
|
||||
------------------------------------------------------------
|
||||
Some DeltaSS values: Delta(mu_0)
|
||||
NaCl(S): Na+ + Cl- -> NaCl(S): 195 kJ/gmol
|
||||
: 78.663 (dimensionless)
|
||||
: 34.163 (dimensionless/ln10)
|
||||
OH-: H2O(L) - H+ -> OH-: -4.8263 kJ/gmol
|
||||
: -1.9469 (dimensionless)
|
||||
: -0.84554 (dimensionless/ln10)
|
||||
: 78.662 (dimensionless)
|
||||
: 34.162 (dimensionless/ln10)
|
||||
OH-: H2O(L) - H+ -> OH-: -4.8229 kJ/gmol
|
||||
: -1.9455 (dimensionless)
|
||||
: -0.84493 (dimensionless/ln10)
|
||||
------------------------------------------------------------
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue