[Thermo] Remove unnecessary manual memory management from PDSS_Water

This commit is contained in:
Ray Speth 2014-05-08 23:01:53 +00:00
parent edaef6a0b7
commit 0eeae5d9c0
2 changed files with 61 additions and 98 deletions

View file

@ -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
/*!

View file

@ -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;
}