diff --git a/include/cantera/equil/ChemEquil.h b/include/cantera/equil/ChemEquil.h index 559fdb9f8..1d10f533e 100644 --- a/include/cantera/equil/ChemEquil.h +++ b/include/cantera/equil/ChemEquil.h @@ -21,6 +21,8 @@ #include "MultiPhaseEquil.h" +#include + namespace Cantera { @@ -185,7 +187,7 @@ protected: */ size_t m_nComponents; - PropertyCalculator *m_p1, *m_p2; + std::auto_ptr > m_p1, m_p2; /** * Current value of the mole fractions in the single phase. diff --git a/src/equil/ChemEquil.cpp b/src/equil/ChemEquil.cpp index acf76824c..1fd059e63 100644 --- a/src/equil/ChemEquil.cpp +++ b/src/equil/ChemEquil.cpp @@ -64,7 +64,7 @@ int _equilflag(const char* xy) /// Default Constructor. -ChemEquil::ChemEquil() : m_skip(npos), m_p1(0), m_p2(0), m_elementTotalSum(1.0), +ChemEquil::ChemEquil() : m_skip(npos), m_elementTotalSum(1.0), m_p0(OneAtm), m_eloc(npos), m_elemFracCutoff(1.0E-100), m_doResPerturb(false) @@ -77,7 +77,7 @@ ChemEquil::ChemEquil() : m_skip(npos), m_p1(0), m_p2(0), m_elementTotalSum(1.0), * @param s ThermoPhase object that will be used in the equilibrium calls. */ ChemEquil::ChemEquil(thermo_t& s) : - m_skip(npos), m_p1(0), m_p2(0), + m_skip(npos), m_elementTotalSum(1.0), m_p0(OneAtm), m_eloc(npos), m_elemFracCutoff(1.0E-100), @@ -86,19 +86,10 @@ ChemEquil::ChemEquil(thermo_t& s) : initialize(s); } -/// Destructor ChemEquil::~ChemEquil() { - if (m_p1) { - delete m_p1; - } - if (m_p2) { - delete m_p2; - } } - - /** * Prepare for equilibrium calculations. * @param s object representing the solution phase. @@ -251,25 +242,23 @@ void ChemEquil::update(const thermo_t& s) int ChemEquil::setInitialMoles(thermo_t& s, vector_fp& elMoleGoal, int loglevel) { - MultiPhase* mp = 0; - MultiPhaseEquil* e = 0; int iok = 0; if (loglevel > 0) { beginLogGroup("ChemEquil::setInitialMoles"); } try { - mp = new MultiPhase; - mp->addPhase(&s, 1.0); - mp->init(); - e = new MultiPhaseEquil(mp, true, loglevel-1); - e->setInitialMixMoles(loglevel-1); + MultiPhase mp; + mp.addPhase(&s, 1.0); + mp.init(); + MultiPhaseEquil e(&mp, true, loglevel-1); + e.setInitialMixMoles(loglevel-1); // store component indices if (m_nComponents > m_kk) { m_nComponents = m_kk; } for (size_t m = 0; m < m_nComponents; m++) { - m_component[m] = e->componentIndex(m); + m_component[m] = e.componentIndex(m); } for (size_t k = 0; k < m_kk; k++) { if (s.moleFraction(k) > 0.0) { @@ -306,13 +295,9 @@ int ChemEquil::setInitialMoles(thermo_t& s, vector_fp& elMoleGoal, } #endif - delete e; - delete mp; iok = 0; } catch (CanteraError& err) { err.save(); - delete e; - delete mp; iok = -1; } if (loglevel > 0) { @@ -352,13 +337,13 @@ int ChemEquil::estimateElementPotentials(thermo_t& s, vector_fp& lambda_RT, s.setMoleFractions(DATA_PTR(xMF_est)); s.getMoleFractions(DATA_PTR(xMF_est)); - MultiPhase* mp = new MultiPhase; - mp->addPhase(&s, 1.0); - mp->init(); + MultiPhase mp; + mp.addPhase(&s, 1.0); + mp.init(); int usedZeroedSpecies = 0; vector_fp formRxnMatrix; m_nComponents = BasisOptimize(&usedZeroedSpecies, false, - mp, m_orderVectorSpecies, + &mp, m_orderVectorSpecies, m_orderVectorElements, formRxnMatrix); for (size_t m = 0; m < m_nComponents; m++) { @@ -371,16 +356,13 @@ int ChemEquil::estimateElementPotentials(thermo_t& s, vector_fp& lambda_RT, s.setMoleFractions(DATA_PTR(xMF_est)); s.getMoleFractions(DATA_PTR(xMF_est)); - size_t nct = Cantera::ElemRearrange(m_nComponents, elMolesGoal, mp, + size_t nct = Cantera::ElemRearrange(m_nComponents, elMolesGoal, &mp, m_orderVectorSpecies, m_orderVectorElements); if (nct != m_nComponents) { throw CanteraError("ChemEquil::estimateElementPotentials", "confused"); } - delete mp; - - s.getChemPotentials(DATA_PTR(mu_RT)); doublereal rrt = 1.0/(GasConstant* s.temperature()); scale(mu_RT.begin(), mu_RT.end(), mu_RT.begin(), rrt); @@ -510,12 +492,6 @@ int ChemEquil::equilibrate(thermo_t& s, const char* XYstr, doublereal xval, yval, tmp; int fail = 0; - if (m_p1) { - delete m_p1; - } - if (m_p2) { - delete m_p2; - } bool tempFixed = true; int XY = _equilflag(XYstr); @@ -542,37 +518,37 @@ int ChemEquil::equilibrate(thermo_t& s, const char* XYstr, switch (XY) { case TP: case PT: - m_p1 = new TemperatureCalculator; - m_p2 = new PressureCalculator; + m_p1.reset(new TemperatureCalculator); + m_p2.reset(new PressureCalculator); break; case HP: case PH: tempFixed = false; - m_p1 = new EnthalpyCalculator; - m_p2 = new PressureCalculator; + m_p1.reset(new EnthalpyCalculator); + m_p2.reset(new PressureCalculator); break; case SP: case PS: tempFixed = false; - m_p1 = new EntropyCalculator; - m_p2 = new PressureCalculator; + m_p1.reset(new EntropyCalculator); + m_p2.reset(new PressureCalculator); break; case SV: case VS: tempFixed = false; - m_p1 = new EntropyCalculator; - m_p2 = new DensityCalculator; + m_p1.reset(new EntropyCalculator); + m_p2.reset(new DensityCalculator); break; case TV: case VT: - m_p1 = new TemperatureCalculator; - m_p2 = new DensityCalculator; + m_p1.reset(new TemperatureCalculator); + m_p2.reset(new DensityCalculator); break; case UV: case VU: tempFixed = false; - m_p1 = new IntEnergyCalculator; - m_p2 = new DensityCalculator; + m_p1.reset(new IntEnergyCalculator); + m_p2.reset(new DensityCalculator); break; default: if (loglevel > 0) {