diff --git a/include/cantera/thermo/PDSS.h b/include/cantera/thermo/PDSS.h
index 4294fec76..b67d80d20 100644
--- a/include/cantera/thermo/PDSS.h
+++ b/include/cantera/thermo/PDSS.h
@@ -675,6 +675,26 @@ protected:
doublereal* m_Vss_ptr;
};
+//! Base class for PDSS classes which compute molar properties directly
+class PDSS_Molar : public virtual PDSS
+{
+public:
+ virtual doublereal enthalpy_RT() const;
+ virtual doublereal entropy_R() const;
+ virtual doublereal gibbs_RT() const;
+ virtual doublereal cp_R() const;
+};
+
+//! Base class for PDSS classes which compute nondimensional properties directly
+class PDSS_Nondimensional : public virtual PDSS
+{
+public:
+ virtual doublereal enthalpy_mole() const;
+ virtual doublereal entropy_mole() const;
+ virtual doublereal gibbs_mole() const;
+ virtual doublereal cp_mole() const;
+};
+
}
#endif
diff --git a/include/cantera/thermo/PDSS_ConstVol.h b/include/cantera/thermo/PDSS_ConstVol.h
index f8bc83d6d..2f4ee933e 100644
--- a/include/cantera/thermo/PDSS_ConstVol.h
+++ b/include/cantera/thermo/PDSS_ConstVol.h
@@ -23,7 +23,7 @@ class VPStandardStateTP;
/*!
* @ingroup pdssthermo
*/
-class PDSS_ConstVol : public PDSS
+class PDSS_ConstVol : public PDSS_Nondimensional
{
public:
//! @name Constructors
@@ -85,14 +85,10 @@ public:
//! @{
// See PDSS.h for documentation of functions overridden from Class PDSS
- virtual doublereal enthalpy_mole() const;
virtual doublereal enthalpy_RT() const;
virtual doublereal intEnergy_mole() const;
- virtual doublereal entropy_mole() const;
virtual doublereal entropy_R() const;
- virtual doublereal gibbs_mole() const;
virtual doublereal gibbs_RT() const;
- virtual doublereal cp_mole() const;
virtual doublereal cp_R() const;
virtual doublereal cv_mole() const;
virtual doublereal molarVolume() const;
diff --git a/include/cantera/thermo/PDSS_HKFT.h b/include/cantera/thermo/PDSS_HKFT.h
index b14f9441e..3494c6ec6 100644
--- a/include/cantera/thermo/PDSS_HKFT.h
+++ b/include/cantera/thermo/PDSS_HKFT.h
@@ -29,7 +29,7 @@ class WaterProps;
/*!
* @ingroup pdssthermo
*/
-class PDSS_HKFT : public PDSS
+class PDSS_HKFT : public PDSS_Molar
{
public:
diff --git a/include/cantera/thermo/PDSS_IdealGas.h b/include/cantera/thermo/PDSS_IdealGas.h
index 5dd21c765..3719f9ae1 100644
--- a/include/cantera/thermo/PDSS_IdealGas.h
+++ b/include/cantera/thermo/PDSS_IdealGas.h
@@ -25,7 +25,7 @@ class VPStandardStateTP;
*
* @ingroup pdssthermo
*/
-class PDSS_IdealGas : public PDSS
+class PDSS_IdealGas : public PDSS_Nondimensional
{
public:
//! @name Constructors
@@ -88,14 +88,10 @@ public:
// See PDSS.h for documentation of functions overridden from Class PDSS
- virtual doublereal enthalpy_mole() const;
virtual doublereal enthalpy_RT() const;
virtual doublereal intEnergy_mole() const;
- virtual doublereal entropy_mole() const;
virtual doublereal entropy_R() const;
- virtual doublereal gibbs_mole() const;
virtual doublereal gibbs_RT() const;
- virtual doublereal cp_mole() const;
virtual doublereal cp_R() const;
virtual doublereal cv_mole() const;
virtual doublereal molarVolume() const;
diff --git a/include/cantera/thermo/PDSS_IonsFromNeutral.h b/include/cantera/thermo/PDSS_IonsFromNeutral.h
index 651fc2983..dda684f05 100644
--- a/include/cantera/thermo/PDSS_IonsFromNeutral.h
+++ b/include/cantera/thermo/PDSS_IonsFromNeutral.h
@@ -27,7 +27,7 @@ class ThermoPhase;
*
* @ingroup pdssthermo
*/
-class PDSS_IonsFromNeutral : public PDSS
+class PDSS_IonsFromNeutral : public PDSS_Nondimensional
{
public:
//! @name Constructors
@@ -92,12 +92,9 @@ public:
// See PDSS.h for documentation of functions overridden from Class PDSS
- virtual doublereal enthalpy_mole() const;
virtual doublereal enthalpy_RT() const;
virtual doublereal intEnergy_mole() const;
- virtual doublereal entropy_mole() const;
virtual doublereal entropy_R() const;
- virtual doublereal gibbs_mole() const;
/*!
* @copydoc PDSS::gibbs_RT()
@@ -112,7 +109,6 @@ public:
* case is the single anion species, with species index sp.
*/
virtual doublereal gibbs_RT() const;
- virtual doublereal cp_mole() const;
virtual doublereal cp_R() const;
virtual doublereal molarVolume() const;
virtual doublereal density() const;
diff --git a/include/cantera/thermo/PDSS_SSVol.h b/include/cantera/thermo/PDSS_SSVol.h
index 0be2490a5..c91f0840c 100644
--- a/include/cantera/thermo/PDSS_SSVol.h
+++ b/include/cantera/thermo/PDSS_SSVol.h
@@ -156,7 +156,7 @@ class VPStandardStateTP;
*
* @ingroup pdssthermo
*/
-class PDSS_SSVol : public PDSS
+class PDSS_SSVol : public PDSS_Nondimensional
{
public:
//! @name Constructors
@@ -219,14 +219,10 @@ public:
// See PDSS.h for documentation of functions overridden from Class PDSS
- virtual doublereal enthalpy_mole() const;
virtual doublereal enthalpy_RT() const;
virtual doublereal intEnergy_mole() const;
- virtual doublereal entropy_mole() const;
virtual doublereal entropy_R() const;
- virtual doublereal gibbs_mole() const;
virtual doublereal gibbs_RT() const;
- virtual doublereal cp_mole() const;
virtual doublereal cp_R() const;
virtual doublereal cv_mole() const;
virtual doublereal molarVolume() const;
diff --git a/include/cantera/thermo/PDSS_Water.h b/include/cantera/thermo/PDSS_Water.h
index 999f1b70a..6878fcf0c 100644
--- a/include/cantera/thermo/PDSS_Water.h
+++ b/include/cantera/thermo/PDSS_Water.h
@@ -53,7 +53,7 @@ class WaterProps;
*
* @ingroup pdssthermo
*/
-class PDSS_Water : public PDSS
+class PDSS_Water : public PDSS_Molar
{
public:
//! @name Constructors
diff --git a/src/thermo/PDSS.cpp b/src/thermo/PDSS.cpp
index b09989d31..cac931976 100644
--- a/src/thermo/PDSS.cpp
+++ b/src/thermo/PDSS.cpp
@@ -221,8 +221,7 @@ doublereal PDSS::enthalpy_mole() const
doublereal PDSS::enthalpy_RT() const
{
- double RT = GasConstant * m_temp;
- return enthalpy_mole()/RT;
+ throw NotImplementedError("PDSS::enthalpy_RT()");
}
doublereal PDSS::intEnergy_mole() const
@@ -237,7 +236,7 @@ doublereal PDSS::entropy_mole() const
doublereal PDSS::entropy_R() const
{
- return entropy_mole()/GasConstant;
+ throw NotImplementedError("PDSS::entropy_R()");
}
doublereal PDSS::gibbs_mole() const
@@ -247,8 +246,7 @@ doublereal PDSS::gibbs_mole() const
doublereal PDSS::gibbs_RT() const
{
- double RT = GasConstant * m_temp;
- return gibbs_mole()/RT;
+ throw NotImplementedError("PDSS::gibbs_RT()");
}
doublereal PDSS::cp_mole() const
@@ -258,7 +256,7 @@ doublereal PDSS::cp_mole() const
doublereal PDSS::cp_R() const
{
- return cp_mole()/GasConstant;
+ throw NotImplementedError("PDSS::cp_R()");
}
doublereal PDSS::molarVolume() const
@@ -404,4 +402,49 @@ void PDSS::reportParams(size_t& kindex, int& type,
maxTemp_ = m_maxTemp;
refPressure_ = m_p0;
}
+
+// PDSS_Molar methods
+
+doublereal PDSS_Molar::enthalpy_RT() const
+{
+ return enthalpy_mole() / (GasConstant * temperature());
+}
+
+doublereal PDSS_Molar::entropy_R() const
+{
+ return entropy_mole() / GasConstant;
+}
+
+doublereal PDSS_Molar::gibbs_RT() const
+{
+ return gibbs_mole() / (GasConstant * temperature());
+}
+
+doublereal PDSS_Molar::cp_R() const
+{
+ return cp_mole() / GasConstant;
+}
+
+// PDSS_Nondimensional methods
+
+doublereal PDSS_Nondimensional::enthalpy_mole() const
+{
+ return enthalpy_RT() * GasConstant * temperature();
+}
+
+doublereal PDSS_Nondimensional::entropy_mole() const
+{
+ return entropy_R() * GasConstant;
+}
+
+doublereal PDSS_Nondimensional::gibbs_mole() const
+{
+ return gibbs_RT() * GasConstant * temperature();
+}
+
+doublereal PDSS_Nondimensional::cp_mole() const
+{
+ return cp_R() * GasConstant;
+}
+
}
diff --git a/src/thermo/PDSS_ConstVol.cpp b/src/thermo/PDSS_ConstVol.cpp
index 5550cd5a3..4ea147d67 100644
--- a/src/thermo/PDSS_ConstVol.cpp
+++ b/src/thermo/PDSS_ConstVol.cpp
@@ -156,14 +156,6 @@ void PDSS_ConstVol::initThermo()
m_Vss_ptr[m_spindex] = m_constMolarVolume;
}
-doublereal
-PDSS_ConstVol::enthalpy_mole() const
-{
- doublereal val = enthalpy_RT();
- doublereal RT = GasConstant * m_temp;
- return val * RT;
-}
-
doublereal
PDSS_ConstVol::enthalpy_RT() const
{
@@ -179,40 +171,18 @@ PDSS_ConstVol::intEnergy_mole() const
return val * RT;
}
-doublereal
-PDSS_ConstVol::entropy_mole() const
-{
- doublereal val = entropy_R();
- return val * GasConstant;
-}
-
doublereal
PDSS_ConstVol::entropy_R() const
{
return m_sss_R_ptr[m_spindex];
}
-doublereal
-PDSS_ConstVol::gibbs_mole() const
-{
- doublereal val = gibbs_RT();
- doublereal RT = GasConstant * m_temp;
- return val * RT;
-}
-
doublereal
PDSS_ConstVol::gibbs_RT() const
{
return m_gss_RT_ptr[m_spindex];
}
-doublereal
-PDSS_ConstVol::cp_mole() const
-{
- doublereal val = m_cpss_R_ptr[m_spindex];
- return val * GasConstant;
-}
-
doublereal
PDSS_ConstVol::cp_R() const
{
diff --git a/src/thermo/PDSS_HKFT.cpp b/src/thermo/PDSS_HKFT.cpp
index 78bcf7ee3..5a77628f8 100644
--- a/src/thermo/PDSS_HKFT.cpp
+++ b/src/thermo/PDSS_HKFT.cpp
@@ -476,7 +476,7 @@ void PDSS_HKFT::initThermo()
{
PDSS::initThermo();
- m_waterSS = (PDSS_Water*) m_tp->providePDSS(0);
+ m_waterSS = dynamic_cast(m_tp->providePDSS(0));
/*
* Section to initialize m_Z_pr_tr and m_Y_pr_tr
*/
@@ -553,7 +553,7 @@ void PDSS_HKFT::initAllPtrs(VPStandardStateTP* vptp_ptr, VPSSMgr* vpssmgr_ptr,
SpeciesThermo* spthermo_ptr)
{
PDSS::initAllPtrs(vptp_ptr, vpssmgr_ptr, spthermo_ptr);
- m_waterSS = (PDSS_Water*) m_tp->providePDSS(0);
+ m_waterSS = dynamic_cast(m_tp->providePDSS(0));
delete m_waterProps;
m_waterProps = new WaterProps(m_waterSS);
}
diff --git a/src/thermo/PDSS_IdealGas.cpp b/src/thermo/PDSS_IdealGas.cpp
index 0737f54f2..8ce14167e 100644
--- a/src/thermo/PDSS_IdealGas.cpp
+++ b/src/thermo/PDSS_IdealGas.cpp
@@ -118,14 +118,6 @@ void PDSS_IdealGas::initThermo()
m_maxTemp = m_spthermo->maxTemp(m_spindex);
}
-doublereal
-PDSS_IdealGas::enthalpy_mole() const
-{
- doublereal val = enthalpy_RT();
- doublereal RT = GasConstant * m_temp;
- return val * RT;
-}
-
doublereal
PDSS_IdealGas::enthalpy_RT() const
{
@@ -140,40 +132,18 @@ PDSS_IdealGas::intEnergy_mole() const
return val * RT;
}
-doublereal
-PDSS_IdealGas::entropy_mole() const
-{
- doublereal val = entropy_R();
- return val * GasConstant;
-}
-
doublereal
PDSS_IdealGas::entropy_R() const
{
return m_s0_R_ptr[m_spindex] - log(m_pres/m_p0);
}
-doublereal
-PDSS_IdealGas::gibbs_mole() const
-{
- doublereal val = gibbs_RT();
- doublereal RT = GasConstant * m_temp;
- return val * RT;
-}
-
doublereal
PDSS_IdealGas::gibbs_RT() const
{
return m_g0_RT_ptr[m_spindex] + log(m_pres/m_p0);
}
-doublereal
-PDSS_IdealGas::cp_mole() const
-{
- doublereal val = cp_R();
- return val * GasConstant;
-}
-
doublereal
PDSS_IdealGas::cp_R() const
{
diff --git a/src/thermo/PDSS_IonsFromNeutral.cpp b/src/thermo/PDSS_IonsFromNeutral.cpp
index 3d6d690c3..36861f00b 100644
--- a/src/thermo/PDSS_IonsFromNeutral.cpp
+++ b/src/thermo/PDSS_IonsFromNeutral.cpp
@@ -215,14 +215,6 @@ void PDSS_IonsFromNeutral::initThermo()
m_maxTemp = m_spthermo->maxTemp(m_spindex);
}
-doublereal
-PDSS_IonsFromNeutral::enthalpy_mole() const
-{
- doublereal val = enthalpy_RT();
- doublereal RT = GasConstant * m_temp;
- return val * RT;
-}
-
doublereal
PDSS_IonsFromNeutral::enthalpy_RT() const
{
@@ -243,13 +235,6 @@ PDSS_IonsFromNeutral::intEnergy_mole() const
return val * RT;
}
-doublereal
-PDSS_IonsFromNeutral::entropy_mole() const
-{
- doublereal val = entropy_R();
- return val * GasConstant;
-}
-
doublereal
PDSS_IonsFromNeutral::entropy_R() const
{
@@ -265,14 +250,6 @@ PDSS_IonsFromNeutral::entropy_R() const
return val;
}
-doublereal
-PDSS_IonsFromNeutral::gibbs_mole() const
-{
- doublereal val = gibbs_RT();
- doublereal RT = GasConstant * m_temp;
- return val * RT;
-}
-
doublereal
PDSS_IonsFromNeutral::gibbs_RT() const
{
@@ -288,13 +265,6 @@ PDSS_IonsFromNeutral::gibbs_RT() const
return val;
}
-doublereal
-PDSS_IonsFromNeutral::cp_mole() const
-{
- doublereal val = cp_R();
- return val * GasConstant;
-}
-
doublereal
PDSS_IonsFromNeutral::cp_R() const
{
diff --git a/src/thermo/PDSS_SSVol.cpp b/src/thermo/PDSS_SSVol.cpp
index 9d8359a4e..bae696705 100644
--- a/src/thermo/PDSS_SSVol.cpp
+++ b/src/thermo/PDSS_SSVol.cpp
@@ -182,14 +182,6 @@ void PDSS_SSVol::initThermo()
m_Vss_ptr[m_spindex] = m_constMolarVolume;
}
-doublereal
-PDSS_SSVol::enthalpy_mole() const
-{
- doublereal val = enthalpy_RT();
- doublereal RT = GasConstant * m_temp;
- return val * RT;
-}
-
doublereal
PDSS_SSVol::enthalpy_RT() const
{
@@ -205,40 +197,18 @@ PDSS_SSVol::intEnergy_mole() const
return val * RT;
}
-doublereal
-PDSS_SSVol::entropy_mole() const
-{
- doublereal val = entropy_R();
- return val * GasConstant;
-}
-
doublereal
PDSS_SSVol::entropy_R() const
{
return m_sss_R_ptr[m_spindex];
}
-doublereal
-PDSS_SSVol::gibbs_mole() const
-{
- doublereal val = gibbs_RT();
- doublereal RT = GasConstant * m_temp;
- return val * RT;
-}
-
doublereal
PDSS_SSVol::gibbs_RT() const
{
return m_gss_RT_ptr[m_spindex];
}
-doublereal
-PDSS_SSVol::cp_mole() const
-{
- doublereal val = m_cpss_R_ptr[m_spindex];
- return val * GasConstant;
-}
-
doublereal
PDSS_SSVol::cp_R() const
{
diff --git a/src/thermo/VPSSMgr_Water_HKFT.cpp b/src/thermo/VPSSMgr_Water_HKFT.cpp
index 6f46a3493..9b3b6a58d 100644
--- a/src/thermo/VPSSMgr_Water_HKFT.cpp
+++ b/src/thermo/VPSSMgr_Water_HKFT.cpp
@@ -52,7 +52,7 @@ VPSSMgr_Water_HKFT::operator=(const VPSSMgr_Water_HKFT& b)
return *this;
}
VPSSMgr::operator=(b);
- m_waterSS = (PDSS_Water*) m_vptp_ptr->providePDSS(0);
+ m_waterSS = dynamic_cast(m_vptp_ptr->providePDSS(0));
m_tlastRef = -1.0;
return *this;
}
@@ -154,9 +154,9 @@ void VPSSMgr_Water_HKFT::_updateRefStateThermo() const
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_waterSS->density()) / m_vptp_ptr->molecularWeight(0);
- PDSS_HKFT* ps;
+ PDSS* ps;
for (size_t k = 1; k < m_kk; k++) {
- ps = (PDSS_HKFT*) m_vptp_ptr->providePDSS(k);
+ ps = m_vptp_ptr->providePDSS(k);
ps->setState_TP(m_tlast, m_p0);
m_cp0_R[k] = ps->cp_R();
m_s0_R[k] = ps->entropy_mole() / GasConstant;
@@ -173,7 +173,7 @@ void VPSSMgr_Water_HKFT::_updateRefStateThermo() const
}
m_waterSS->setState_TP(m_tlast, m_plast);
for (size_t k = 1; k < m_kk; k++) {
- ps = (PDSS_HKFT*) m_vptp_ptr->providePDSS(k);
+ ps = m_vptp_ptr->providePDSS(k);
ps->setState_TP(m_tlast, m_plast);
}
}
@@ -190,7 +190,7 @@ void VPSSMgr_Water_HKFT::_updateStandardStateThermo()
m_Vss[0] = (m_vptp_ptr->molecularWeight(0)) / (m_waterSS->density());
for (size_t k = 1; k < m_kk; k++) {
- PDSS_HKFT* ps = (PDSS_HKFT*) m_vptp_ptr->providePDSS(k);
+ PDSS* ps = m_vptp_ptr->providePDSS(k);
ps->setState_TP(m_tlast, m_plast);
m_cpss_R[k] = ps->cp_R();
m_sss_R[k] = ps->entropy_R();