[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:
Ray Speth 2017-02-06 22:22:07 -05:00
parent 0249ce89b8
commit 38d291c683
13 changed files with 373 additions and 76 deletions

View file

@ -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;

View file

@ -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.

View file

@ -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];
}
}

View file

@ -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];

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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();

View file

@ -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
View 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>

View 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);
}

View file

@ -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
------------------------------------------------------------

View file

@ -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)
------------------------------------------------------------