From 0eeae5d9c041c0fd21c24c881dd7da84d5bf0cfb Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Thu, 8 May 2014 23:01:53 +0000 Subject: [PATCH] [Thermo] Remove unnecessary manual memory management from PDSS_Water --- include/cantera/thermo/PDSS_Water.h | 13 ++- src/thermo/PDSS_Water.cpp | 146 +++++++++++----------------- 2 files changed, 61 insertions(+), 98 deletions(-) diff --git a/include/cantera/thermo/PDSS_Water.h b/include/cantera/thermo/PDSS_Water.h index 9be178d02..999f1b70a 100644 --- a/include/cantera/thermo/PDSS_Water.h +++ b/include/cantera/thermo/PDSS_Water.h @@ -15,6 +15,8 @@ #include "cantera/base/ct_defs.h" #include "PDSS.h" #include "VPStandardStateTP.h" +#include "WaterPropsIAPWS.h" + #include "WaterProps.h" namespace Cantera { @@ -114,9 +116,6 @@ public: PDSS_Water(VPStandardStateTP* tp, int spindex, const XML_Node& speciesNode, const XML_Node& phaseRef, bool spInstalled); - //! Destructor - virtual ~PDSS_Water(); - //! Duplication routine for objects which inherit from %PDSS /*! * This virtual routine can be used to duplicate %PDSS objects @@ -216,12 +215,12 @@ 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 WaterProps* getWaterProps() { - return m_waterProps; + return &m_waterProps; } //! @} @@ -283,7 +282,7 @@ private: /*! * This object owns m_sub */ - mutable WaterPropsIAPWS* m_sub; + mutable WaterPropsIAPWS m_sub; //! Pointer to the WaterProps object /*! @@ -293,7 +292,7 @@ private: * This object owns m_waterProps, and the WaterPropsIAPWS object used by * WaterProps is m_sub, which is defined above. */ - WaterProps* m_waterProps; + WaterProps m_waterProps; //! State of the system - density /*! diff --git a/src/thermo/PDSS_Water.cpp b/src/thermo/PDSS_Water.cpp index 22034c7b8..547c884ec 100644 --- a/src/thermo/PDSS_Water.cpp +++ b/src/thermo/PDSS_Water.cpp @@ -24,9 +24,7 @@ namespace Cantera { PDSS_Water::PDSS_Water() : - PDSS(), - m_sub(0), - m_waterProps(0), + m_waterProps(&m_sub), m_dens(1000.0), m_iState(WATER_LIQUID), EW_Offset(0.0), @@ -35,8 +33,6 @@ PDSS_Water::PDSS_Water() : m_allowGasPhase(false) { m_pdssType = cPDSS_WATER; - m_sub = new WaterPropsIAPWS(); - m_waterProps = new WaterProps(m_sub); m_spthermo = 0; constructSet(); m_minTemp = 200.; @@ -45,8 +41,7 @@ PDSS_Water::PDSS_Water() : PDSS_Water::PDSS_Water(VPStandardStateTP* tp, int spindex) : PDSS(tp, spindex), - m_sub(0), - m_waterProps(0), + m_waterProps(&m_sub), m_dens(1000.0), m_iState(WATER_LIQUID), EW_Offset(0.0), @@ -55,8 +50,6 @@ PDSS_Water::PDSS_Water(VPStandardStateTP* tp, int spindex) : m_allowGasPhase(false) { m_pdssType = cPDSS_WATER; - m_sub = new WaterPropsIAPWS(); - m_waterProps = new WaterProps(m_sub); m_spthermo = 0; constructSet(); m_minTemp = 200.; @@ -66,8 +59,7 @@ PDSS_Water::PDSS_Water(VPStandardStateTP* tp, int spindex) : PDSS_Water::PDSS_Water(VPStandardStateTP* tp, int spindex, const std::string& inputFile, const std::string& id) : PDSS(tp, spindex), - m_sub(0), - m_waterProps(0), + m_waterProps(&m_sub), m_dens(1000.0), m_iState(WATER_LIQUID), EW_Offset(0.0), @@ -76,8 +68,6 @@ PDSS_Water::PDSS_Water(VPStandardStateTP* tp, int spindex, m_allowGasPhase(false) { m_pdssType = cPDSS_WATER; - m_sub = new WaterPropsIAPWS(); - m_waterProps = new WaterProps(m_sub); constructPDSSFile(tp, spindex, inputFile, id); m_spthermo = 0; m_minTemp = 200.; @@ -88,8 +78,7 @@ PDSS_Water::PDSS_Water(VPStandardStateTP* tp, int spindex, const XML_Node& speciesNode, const XML_Node& phaseRoot, bool spInstalled) : PDSS(tp, spindex), - m_sub(0), - m_waterProps(0), + m_waterProps(&m_sub), m_dens(1000.0), m_iState(WATER_LIQUID), EW_Offset(0.0), @@ -98,8 +87,6 @@ PDSS_Water::PDSS_Water(VPStandardStateTP* tp, int spindex, m_allowGasPhase(false) { m_pdssType = cPDSS_WATER; - m_sub = new WaterPropsIAPWS(); - m_waterProps = new WaterProps(m_sub); std::string id= ""; constructPDSSXML(tp, spindex, phaseRoot, id) ; initThermo(); @@ -110,8 +97,7 @@ PDSS_Water::PDSS_Water(VPStandardStateTP* tp, int spindex, PDSS_Water::PDSS_Water(const PDSS_Water& b) : PDSS(), - m_sub(0), - m_waterProps(0), + m_waterProps(&m_sub), m_dens(1000.0), m_iState(WATER_LIQUID), EW_Offset(b.EW_Offset), @@ -119,7 +105,6 @@ PDSS_Water::PDSS_Water(const PDSS_Water& b) : m_verbose(b.m_verbose), m_allowGasPhase(b.m_allowGasPhase) { - m_sub = new WaterPropsIAPWS(); /* * Use the assignment operator to do the brunt * of the work for the copy constructor. @@ -137,16 +122,8 @@ PDSS_Water& PDSS_Water::operator=(const PDSS_Water& b) */ PDSS::operator=(b); - if (!m_sub) { - m_sub = new WaterPropsIAPWS(); - } - m_sub->operator=(*(b.m_sub)); - - if (!m_waterProps) { - m_waterProps = new WaterProps(m_sub); - } - m_waterProps->operator=(*(b.m_waterProps)); - + m_sub = b.m_sub; + m_waterProps = b.m_waterProps; m_dens = b.m_dens; m_iState = b.m_iState; EW_Offset = b.EW_Offset; @@ -157,12 +134,6 @@ PDSS_Water& PDSS_Water::operator=(const PDSS_Water& b) return *this; } -PDSS_Water::~PDSS_Water() -{ - delete m_waterProps; - delete m_sub; -} - PDSS* PDSS_Water::duplMyselfAsPDSS() const { return new PDSS_Water(*this); @@ -192,26 +163,19 @@ void PDSS_Water::constructPDSSFile(VPStandardStateTP* tp, int spindex, * Use this object to store information. */ - XML_Node* fxml = new XML_Node(); - fxml->build(fin); - XML_Node* fxml_phase = findXMLPhase(fxml, id); + XML_Node fxml; + fxml.build(fin); + XML_Node* fxml_phase = findXMLPhase(&fxml, id); if (!fxml_phase) { throw CanteraError("PDSS_Water::initThermo", "ERROR: Can not find phase named " + id + " in file named " + inputFile); } constructPDSSXML(tp, spindex, *fxml_phase, id); - delete fxml; } void PDSS_Water::constructSet() { - delete m_sub; - m_sub = new WaterPropsIAPWS(); - if (m_sub == 0) { - throw CanteraError("PDSS_Water::initThermo", - "could not create new substance object."); - } /* * Calculate the molecular weight. * hard coded to Cantera's elements and Water. @@ -228,7 +192,7 @@ void PDSS_Water::constructSet() doublereal presLow = 1.0E-2; doublereal oneBar = 1.0E5; doublereal dens = 1.0E-9; - m_dens = m_sub->density(T, presLow, WATER_GAS, dens); + m_dens = m_sub.density(T, presLow, WATER_GAS, dens); m_pres = presLow; SW_Offset = 0.0; doublereal s = entropy_mole(); @@ -252,97 +216,97 @@ void PDSS_Water::constructSet() * 1 bar. */ setTemperature(298.15); - m_dens = m_sub->density(298.15, OneAtm, WATER_LIQUID); + m_dens = m_sub.density(298.15, OneAtm, WATER_LIQUID); m_pres = OneAtm; } doublereal PDSS_Water::enthalpy_mole() const { - doublereal h = m_sub->enthalpy(); + doublereal h = m_sub.enthalpy(); return h + EW_Offset; } doublereal PDSS_Water::intEnergy_mole() const { - doublereal u = m_sub->intEnergy(); + doublereal u = m_sub.intEnergy(); return u + EW_Offset; } doublereal PDSS_Water::entropy_mole() const { - doublereal s = m_sub->entropy(); + doublereal s = m_sub.entropy(); return s + SW_Offset; } doublereal PDSS_Water::gibbs_mole() const { - doublereal g = m_sub->Gibbs(); + doublereal g = m_sub.Gibbs(); return g + EW_Offset - SW_Offset*m_temp; } doublereal PDSS_Water::cp_mole() const { - return m_sub->cp(); + return m_sub.cp(); } doublereal PDSS_Water::cv_mole() const { - return m_sub->cv(); + return m_sub.cv(); } doublereal PDSS_Water::molarVolume() const { - return m_sub->molarVolume(); + return m_sub.molarVolume(); } doublereal PDSS_Water::gibbs_RT_ref() const { doublereal T = m_temp; - m_sub->density(T, m_p0); - doublereal h = m_sub->enthalpy(); - m_sub->setState_TR(m_temp, m_dens); + m_sub.density(T, m_p0); + doublereal h = m_sub.enthalpy(); + m_sub.setState_TR(m_temp, m_dens); return (h + EW_Offset - SW_Offset*T)/(T * GasConstant); } doublereal PDSS_Water::enthalpy_RT_ref() const { doublereal T = m_temp; - m_sub->density(T, m_p0); - doublereal h = m_sub->enthalpy(); - m_sub->setState_TR(m_temp, m_dens); + m_sub.density(T, m_p0); + doublereal h = m_sub.enthalpy(); + m_sub.setState_TR(m_temp, m_dens); return (h + EW_Offset)/(T * GasConstant); } doublereal PDSS_Water::entropy_R_ref() const { doublereal T = m_temp; - m_sub->density(T, m_p0); - doublereal s = m_sub->entropy(); - m_sub->setState_TR(m_temp, m_dens); + m_sub.density(T, m_p0); + doublereal s = m_sub.entropy(); + m_sub.setState_TR(m_temp, m_dens); return (s + SW_Offset)/GasConstant; } doublereal PDSS_Water::cp_R_ref() const { doublereal T = m_temp; - m_sub->density(T, m_p0); - doublereal cp = m_sub->cp(); - m_sub->setState_TR(m_temp, m_dens); + m_sub.density(T, m_p0); + doublereal cp = m_sub.cp(); + m_sub.setState_TR(m_temp, m_dens); return cp/GasConstant; } doublereal PDSS_Water::molarVolume_ref() const { doublereal T = m_temp; - m_sub->density(T, m_p0); - doublereal mv = m_sub->molarVolume(); - m_sub->setState_TR(m_temp, m_dens); + m_sub.density(T, m_p0); + doublereal mv = m_sub.molarVolume(); + m_sub.setState_TR(m_temp, m_dens); return mv; } doublereal PDSS_Water::pressure() const { - doublereal p = m_sub->pressure(); + doublereal p = m_sub.pressure(); m_pres = p; return p; } @@ -354,7 +318,7 @@ void PDSS_Water::setPressure(doublereal p) doublereal T = m_temp; doublereal dens = m_dens; int waterState = WATER_LIQUID; - if (T > m_sub->Tcrit()) { + if (T > m_sub.Tcrit()) { waterState = WATER_SUPERCRIT; } @@ -362,7 +326,7 @@ void PDSS_Water::setPressure(doublereal p) //printf("waterPDSS: set pres = %g t = %g, waterState = %d\n", // p, T, waterState); #endif - doublereal dd = m_sub->density(T, p, waterState, dens); + doublereal dd = m_sub.density(T, p, waterState, dens); if (dd <= 0.0) { std::string stateString = "T = " + fp2str(T) + " K and p = " + fp2str(p) + " Pa"; @@ -373,7 +337,7 @@ void PDSS_Water::setPressure(doublereal p) m_pres = p; // We are only putting the phase check here because of speed considerations. - m_iState = m_sub->phaseState(true); + m_iState = m_sub.phaseState(true); if (! m_allowGasPhase) { if (m_iState != WATER_SUPERCRIT && m_iState != WATER_LIQUID && m_iState != WATER_UNSTABLELIQUID) { throw CanteraError("PDSS_Water::setPressure", @@ -384,7 +348,7 @@ void PDSS_Water::setPressure(doublereal p) doublereal PDSS_Water::thermalExpansionCoeff() const { - return m_sub->coeffThermExp(); + return m_sub.coeffThermExp(); } doublereal PDSS_Water::dthermalExpansionCoeffdT() const @@ -392,41 +356,41 @@ doublereal PDSS_Water::dthermalExpansionCoeffdT() const doublereal pres = pressure(); doublereal dens_save = m_dens; doublereal tt = m_temp - 0.04; - doublereal dd = m_sub->density(tt, pres, m_iState, m_dens); + doublereal dd = m_sub.density(tt, pres, m_iState, m_dens); if (dd < 0.0) { throw CanteraError("PDSS_Water::dthermalExpansionCoeffdT", "unable to solve for the density at T = " + fp2str(tt) + ", P = " + fp2str(pres)); } - doublereal vald = m_sub->coeffThermExp(); - m_sub->setState_TR(m_temp, dens_save); - doublereal val2 = m_sub->coeffThermExp(); + doublereal vald = m_sub.coeffThermExp(); + m_sub.setState_TR(m_temp, dens_save); + doublereal val2 = m_sub.coeffThermExp(); return (val2 - vald) / 0.04; } doublereal PDSS_Water::isothermalCompressibility() const { - return m_sub->isothermalCompressibility(); + return m_sub.isothermalCompressibility(); } doublereal PDSS_Water::critTemperature() const { - return m_sub->Tcrit(); + return m_sub.Tcrit(); } doublereal PDSS_Water::critPressure() const { - return m_sub->Pcrit(); + return m_sub.Pcrit(); } doublereal PDSS_Water::critDensity() const { - return m_sub->Rhocrit(); + return m_sub.Rhocrit(); } void PDSS_Water::setDensity(doublereal dens) { m_dens = dens; - m_sub->setState_TR(m_temp, m_dens); + m_sub.setState_TR(m_temp, m_dens); } doublereal PDSS_Water::density() const @@ -438,7 +402,7 @@ void PDSS_Water::setTemperature(doublereal temp) { m_temp = temp; doublereal dd = m_dens; - m_sub->setState_TR(temp, dd); + m_sub.setState_TR(temp, dd); } void PDSS_Water::setState_TP(doublereal temp, doublereal pres) @@ -451,26 +415,26 @@ void PDSS_Water::setState_TR(doublereal temp, doublereal dens) { m_temp = temp; m_dens = dens; - m_sub->setState_TR(m_temp, m_dens); + m_sub.setState_TR(m_temp, m_dens); } doublereal PDSS_Water::pref_safe(doublereal temp) const { - if (temp < m_sub->Tcrit()) { - doublereal pp = m_sub->psat_est(temp); + if (temp < m_sub.Tcrit()) { + doublereal pp = m_sub.psat_est(temp); if (pp > OneAtm) { return pp; } } else { - return m_sub->Pcrit(); + return m_sub.Pcrit(); } return OneAtm; } doublereal PDSS_Water::satPressure(doublereal t) { - doublereal pp = m_sub->psat(t, WATER_LIQUID); - m_dens = m_sub->density(); + doublereal pp = m_sub.psat(t, WATER_LIQUID); + m_dens = m_sub.density(); m_temp = t; return pp; }