From f61747973c76f53446ecaad469b70c45735bfa8f Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Thu, 8 May 2014 23:01:59 +0000 Subject: [PATCH] [Thermo] Extract common implementations out of PDSS descendants The descendants either calculate molar properties from nondimensonal properties or vice versa. Add two derived classes to PDSS to implement these behaviors, and have the leaf classes derive from whichever one of these makes sense. --- include/cantera/thermo/PDSS.h | 20 +++++++ include/cantera/thermo/PDSS_ConstVol.h | 6 +- include/cantera/thermo/PDSS_HKFT.h | 2 +- include/cantera/thermo/PDSS_IdealGas.h | 6 +- include/cantera/thermo/PDSS_IonsFromNeutral.h | 6 +- include/cantera/thermo/PDSS_SSVol.h | 6 +- include/cantera/thermo/PDSS_Water.h | 2 +- src/thermo/PDSS.cpp | 55 +++++++++++++++++-- src/thermo/PDSS_ConstVol.cpp | 30 ---------- src/thermo/PDSS_HKFT.cpp | 4 +- src/thermo/PDSS_IdealGas.cpp | 30 ---------- src/thermo/PDSS_IonsFromNeutral.cpp | 30 ---------- src/thermo/PDSS_SSVol.cpp | 30 ---------- src/thermo/VPSSMgr_Water_HKFT.cpp | 10 ++-- 14 files changed, 82 insertions(+), 155 deletions(-) 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();