From 0690626ab840320806d6c443247155070bf67dd4 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Wed, 7 Oct 2015 15:47:26 -0400 Subject: [PATCH] Make m_sub a regular member of WaterSSTP instead of a pointer --- include/cantera/thermo/WaterSSTP.h | 8 +- src/thermo/WaterSSTP.cpp | 119 +++++++++++++---------------- 2 files changed, 57 insertions(+), 70 deletions(-) diff --git a/include/cantera/thermo/WaterSSTP.h b/include/cantera/thermo/WaterSSTP.h index 0cd769f39..143d05e68 100644 --- a/include/cantera/thermo/WaterSSTP.h +++ b/include/cantera/thermo/WaterSSTP.h @@ -12,6 +12,7 @@ #define CT_WATERSSTP_H #include "SingleSpeciesTP.h" +#include "cantera/thermo/WaterPropsIAPWS.h" namespace Cantera { @@ -417,7 +418,7 @@ public: //! Get a pointer to a changeable WaterPropsIAPWS object WaterPropsIAPWS* getWater() { - return m_sub; + return &m_sub; } //! Get a pointer to a changeable WaterPropsIAPWS object @@ -434,9 +435,8 @@ protected: void _updateThermo() const; private: - //! Pointer to the WaterPropsIAPWS that calculates the real properties - //! of water. - mutable WaterPropsIAPWS* m_sub; + //! WaterPropsIAPWS that calculates the real properties of water. + mutable WaterPropsIAPWS m_sub; //! Pointer to the WaterProps object /*! diff --git a/src/thermo/WaterSSTP.cpp b/src/thermo/WaterSSTP.cpp index 1e321f31a..3f0602eab 100644 --- a/src/thermo/WaterSSTP.cpp +++ b/src/thermo/WaterSSTP.cpp @@ -10,7 +10,6 @@ */ #include "cantera/thermo/WaterSSTP.h" -#include "cantera/thermo/WaterPropsIAPWS.h" #include "cantera/thermo/WaterProps.h" #include "cantera/thermo/ThermoFactory.h" #include "cantera/base/stringUtils.h" @@ -20,7 +19,6 @@ using namespace std; namespace Cantera { WaterSSTP::WaterSSTP() : - m_sub(0), m_waterProps(0), m_mw(0.0), EW_Offset(0.0), @@ -31,7 +29,6 @@ WaterSSTP::WaterSSTP() : } WaterSSTP::WaterSSTP(const std::string& inputFile, const std::string& id) : - m_sub(0), m_waterProps(0), m_mw(0.0), EW_Offset(0.0), @@ -43,7 +40,6 @@ WaterSSTP::WaterSSTP(const std::string& inputFile, const std::string& id) : } WaterSSTP::WaterSSTP(XML_Node& phaseRoot, const std::string& id) : - m_sub(0), m_waterProps(0), m_mw(0.0), EW_Offset(0.0), @@ -56,7 +52,6 @@ WaterSSTP::WaterSSTP(XML_Node& phaseRoot, const std::string& id) : WaterSSTP::WaterSSTP(const WaterSSTP& b) : SingleSpeciesTP(b), - m_sub(0), m_waterProps(0), m_mw(b.m_mw), EW_Offset(b.EW_Offset), @@ -64,8 +59,7 @@ WaterSSTP::WaterSSTP(const WaterSSTP& b) : m_ready(false), m_allowGasPhase(b.m_allowGasPhase) { - m_sub = new WaterPropsIAPWS(*(b.m_sub)); - m_waterProps = new WaterProps(m_sub); + m_waterProps = new WaterProps(&m_sub); /* * Use the assignment operator to do the brunt @@ -79,10 +73,10 @@ WaterSSTP& WaterSSTP::operator=(const WaterSSTP& b) if (&b == this) { return *this; } - *m_sub = *b.m_sub; + m_sub = b.m_sub; if (!m_waterProps) { - m_waterProps = new WaterProps(m_sub); + m_waterProps = new WaterProps(&m_sub); } *m_waterProps = *b.m_waterProps; @@ -99,7 +93,6 @@ ThermoPhase* WaterSSTP::duplMyselfAsThermoPhase() const WaterSSTP::~WaterSSTP() { - delete m_sub; delete m_waterProps; } @@ -109,12 +102,6 @@ void WaterSSTP::initThermoXML(XML_Node& phaseNode, const std::string& id) * Do initializations that don't depend on knowing the XML file */ initThermo(); - delete m_sub; - m_sub = new WaterPropsIAPWS(); - if (m_sub == 0) { - throw CanteraError("WaterSSTP::initThermo", - "could not create new substance object."); - } /* * Calculate the molecular weight. Note while there may * be a very good calculated weight in the steam table @@ -149,7 +136,7 @@ void WaterSSTP::initThermoXML(XML_Node& phaseNode, const std::string& id) doublereal presLow = 1.0E-2; doublereal oneBar = 1.0E5; - doublereal dd = m_sub->density(T, presLow, WATER_GAS, 7.0E-8); + doublereal dd = m_sub.density(T, presLow, WATER_GAS, 7.0E-8); setDensity(dd); setTemperature(T); SW_Offset = 0.0; @@ -172,10 +159,10 @@ void WaterSSTP::initThermoXML(XML_Node& phaseNode, const std::string& id) * 1 bar. */ setTemperature(298.15); - double rho0 = m_sub->density(298.15, OneAtm, WATER_LIQUID); + double rho0 = m_sub.density(298.15, OneAtm, WATER_LIQUID); setDensity(rho0); - m_waterProps = new WaterProps(m_sub); + m_waterProps = new WaterProps(&m_sub); /* * We have to do something with the thermo function here. @@ -196,23 +183,23 @@ void WaterSSTP::setParametersFromXML(const XML_Node& eosdata) void WaterSSTP::getEnthalpy_RT(doublereal* hrt) const { - *hrt = (m_sub->enthalpy() + EW_Offset)/(GasConstant*temperature()); + *hrt = (m_sub.enthalpy() + EW_Offset)/(GasConstant*temperature()); } void WaterSSTP::getIntEnergy_RT(doublereal* ubar) const { - *ubar = (m_sub->intEnergy() + EW_Offset)/GasConstant; + *ubar = (m_sub.intEnergy() + EW_Offset)/GasConstant; } void WaterSSTP::getEntropy_R(doublereal* sr) const { - sr[0] = (m_sub->entropy() + SW_Offset) / GasConstant; + sr[0] = (m_sub.entropy() + SW_Offset) / GasConstant; } void WaterSSTP::getGibbs_RT(doublereal* grt) const { double T = temperature(); - *grt = (m_sub->Gibbs() + EW_Offset - SW_Offset*T) / (GasConstant * T); + *grt = (m_sub.Gibbs() + EW_Offset - SW_Offset*T) / (GasConstant * T); if (!m_ready) { throw CanteraError("waterSSTP::", "Phase not ready"); } @@ -220,7 +207,7 @@ void WaterSSTP::getGibbs_RT(doublereal* grt) const void WaterSSTP::getStandardChemPotentials(doublereal* gss) const { - *gss = (m_sub->Gibbs() + EW_Offset - SW_Offset*temperature()); + *gss = (m_sub.Gibbs() + EW_Offset - SW_Offset*temperature()); if (!m_ready) { throw CanteraError("waterSSTP::", "Phase not ready"); } @@ -228,12 +215,12 @@ void WaterSSTP::getStandardChemPotentials(doublereal* gss) const void WaterSSTP::getCp_R(doublereal* cpr) const { - cpr[0] = m_sub->cp() / GasConstant; + cpr[0] = m_sub.cp() / GasConstant; } doublereal WaterSSTP::cv_mole() const { - return m_sub->cv(); + return m_sub.cv(); } void WaterSSTP::getEnthalpy_RT_ref(doublereal* hrt) const @@ -242,17 +229,17 @@ void WaterSSTP::getEnthalpy_RT_ref(doublereal* hrt) const double T = temperature(); double dens = density(); int waterState = WATER_GAS; - double rc = m_sub->Rhocrit(); + double rc = m_sub.Rhocrit(); if (dens > rc) { waterState = WATER_LIQUID; } - doublereal dd = m_sub->density(T, OneAtm, waterState, dens); + doublereal dd = m_sub.density(T, OneAtm, waterState, dens); if (dd <= 0.0) { throw CanteraError("setPressure", "error"); } - doublereal h = m_sub->enthalpy(); + doublereal h = m_sub.enthalpy(); *hrt = (h + EW_Offset) / (GasConstant * T); - dd = m_sub->density(T, p, waterState, dens); + dd = m_sub.density(T, p, waterState, dens); } void WaterSSTP::getGibbs_RT_ref(doublereal* grt) const @@ -261,18 +248,18 @@ void WaterSSTP::getGibbs_RT_ref(doublereal* grt) const double T = temperature(); double dens = density(); int waterState = WATER_GAS; - double rc = m_sub->Rhocrit(); + double rc = m_sub.Rhocrit(); if (dens > rc) { waterState = WATER_LIQUID; } - doublereal dd = m_sub->density(T, OneAtm, waterState, dens); + doublereal dd = m_sub.density(T, OneAtm, waterState, dens); if (dd <= 0.0) { throw CanteraError("setPressure", "error"); } - m_sub->setState_TR(T, dd); - doublereal g = m_sub->Gibbs(); + m_sub.setState_TR(T, dd); + doublereal g = m_sub.Gibbs(); *grt = (g + EW_Offset - SW_Offset*T)/ (GasConstant * T); - dd = m_sub->density(T, p, waterState, dens); + dd = m_sub.density(T, p, waterState, dens); } void WaterSSTP::getGibbs_ref(doublereal* g) const @@ -289,20 +276,20 @@ void WaterSSTP::getEntropy_R_ref(doublereal* sr) const double T = temperature(); double dens = density(); int waterState = WATER_GAS; - double rc = m_sub->Rhocrit(); + double rc = m_sub.Rhocrit(); if (dens > rc) { waterState = WATER_LIQUID; } - doublereal dd = m_sub->density(T, OneAtm, waterState, dens); + doublereal dd = m_sub.density(T, OneAtm, waterState, dens); if (dd <= 0.0) { throw CanteraError("setPressure", "error"); } - m_sub->setState_TR(T, dd); + m_sub.setState_TR(T, dd); - doublereal s = m_sub->entropy(); + doublereal s = m_sub.entropy(); *sr = (s + SW_Offset)/ GasConstant; - dd = m_sub->density(T, p, waterState, dens); + dd = m_sub.density(T, p, waterState, dens); } void WaterSSTP::getCp_R_ref(doublereal* cpr) const @@ -311,18 +298,18 @@ void WaterSSTP::getCp_R_ref(doublereal* cpr) const double T = temperature(); double dens = density(); int waterState = WATER_GAS; - double rc = m_sub->Rhocrit(); + double rc = m_sub.Rhocrit(); if (dens > rc) { waterState = WATER_LIQUID; } - doublereal dd = m_sub->density(T, OneAtm, waterState, dens); - m_sub->setState_TR(T, dd); + doublereal dd = m_sub.density(T, OneAtm, waterState, dens); + m_sub.setState_TR(T, dd); if (dd <= 0.0) { throw CanteraError("setPressure", "error"); } - doublereal cp = m_sub->cp(); + doublereal cp = m_sub.cp(); *cpr = cp / GasConstant; - dd = m_sub->density(T, p, waterState, dens); + dd = m_sub.density(T, p, waterState, dens); } void WaterSSTP::getStandardVolumes_ref(doublereal* vol) const @@ -331,21 +318,21 @@ void WaterSSTP::getStandardVolumes_ref(doublereal* vol) const double T = temperature(); double dens = density(); int waterState = WATER_GAS; - double rc = m_sub->Rhocrit(); + double rc = m_sub.Rhocrit(); if (dens > rc) { waterState = WATER_LIQUID; } - doublereal dd = m_sub->density(T, OneAtm, waterState, dens); + doublereal dd = m_sub.density(T, OneAtm, waterState, dens); if (dd <= 0.0) { throw CanteraError("setPressure", "error"); } *vol = meanMolecularWeight() /dd; - dd = m_sub->density(T, p, waterState, dens); + dd = m_sub.density(T, p, waterState, dens); } doublereal WaterSSTP::pressure() const { - return m_sub->pressure(); + return m_sub.pressure(); } void WaterSSTP::setPressure(doublereal p) @@ -353,11 +340,11 @@ void WaterSSTP::setPressure(doublereal p) double T = temperature(); double dens = density(); int waterState = WATER_GAS; - double rc = m_sub->Rhocrit(); + double rc = m_sub.Rhocrit(); if (dens > rc) { waterState = WATER_LIQUID; } - doublereal dd = m_sub->density(T, p, waterState, dens); + doublereal dd = m_sub.density(T, p, waterState, dens); if (dd <= 0.0) { throw CanteraError("setPressure", "error"); } @@ -366,12 +353,12 @@ void WaterSSTP::setPressure(doublereal p) doublereal WaterSSTP::isothermalCompressibility() const { - return m_sub->isothermalCompressibility(); + return m_sub.isothermalCompressibility(); } doublereal WaterSSTP::thermalExpansionCoeff() const { - return m_sub->coeffThermExp(); + return m_sub.coeffThermExp(); } doublereal WaterSSTP::dthermalExpansionCoeffdT() const @@ -380,57 +367,57 @@ doublereal WaterSSTP::dthermalExpansionCoeffdT() const doublereal dens_save = density(); double T = temperature(); double tt = T - 0.04; - doublereal dd = m_sub->density(tt, pres, WATER_LIQUID, dens_save); + doublereal dd = m_sub.density(tt, pres, WATER_LIQUID, dens_save); if (dd < 0.0) { throw CanteraError("WaterSSTP::dthermalExpansionCoeffdT", "Unable to solve for the density at T = {}, P = {}", tt, pres); } - doublereal vald = m_sub->coeffThermExp(); - m_sub->setState_TR(T, dens_save); - doublereal val2 = m_sub->coeffThermExp(); + doublereal vald = m_sub.coeffThermExp(); + m_sub.setState_TR(T, dens_save); + doublereal val2 = m_sub.coeffThermExp(); return (val2 - vald) / 0.04; } doublereal WaterSSTP::critTemperature() const { - return m_sub->Tcrit(); + return m_sub.Tcrit(); } doublereal WaterSSTP::critPressure() const { - return m_sub->Pcrit(); + return m_sub.Pcrit(); } doublereal WaterSSTP::critDensity() const { - return m_sub->Rhocrit(); + return m_sub.Rhocrit(); } void WaterSSTP::setTemperature(const doublereal temp) { Phase::setTemperature(temp); - m_sub->setState_TR(temp, density()); + m_sub.setState_TR(temp, density()); } void WaterSSTP::setDensity(const doublereal dens) { Phase::setDensity(dens); - m_sub->setState_TR(temperature(), dens); + m_sub.setState_TR(temperature(), dens); } doublereal WaterSSTP::satPressure(doublereal t) { doublereal tsave = temperature(); doublereal dsave = density(); - doublereal pp = m_sub->psat(t); - m_sub->setState_TR(tsave, dsave); + doublereal pp = m_sub.psat(t); + m_sub.setState_TR(tsave, dsave); return pp; } doublereal WaterSSTP::vaporFraction() const { - if (temperature() >= m_sub->Tcrit()) { + if (temperature() >= m_sub.Tcrit()) { double dens = density(); - if (dens >= m_sub->Rhocrit()) { + if (dens >= m_sub.Rhocrit()) { return 0.0; } return 1.0;