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