[Thermo] Remove unnecessary manual memory management from PDSS_Water
This commit is contained in:
parent
edaef6a0b7
commit
0eeae5d9c0
2 changed files with 61 additions and 98 deletions
|
|
@ -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
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue