Removed unnecessary manual memory management from ChemEquil

This commit is contained in:
Ray Speth 2012-03-09 22:57:57 +00:00
parent 312b7ff2c4
commit f3968fdda8
2 changed files with 28 additions and 50 deletions

View file

@ -21,6 +21,8 @@
#include "MultiPhaseEquil.h"
#include <memory>
namespace Cantera
{
@ -185,7 +187,7 @@ protected:
*/
size_t m_nComponents;
PropertyCalculator<thermo_t> *m_p1, *m_p2;
std::auto_ptr<PropertyCalculator<thermo_t> > m_p1, m_p2;
/**
* Current value of the mole fractions in the single phase.

View file

@ -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<thermo_t>;
m_p2 = new PressureCalculator<thermo_t>;
m_p1.reset(new TemperatureCalculator<thermo_t>);
m_p2.reset(new PressureCalculator<thermo_t>);
break;
case HP:
case PH:
tempFixed = false;
m_p1 = new EnthalpyCalculator<thermo_t>;
m_p2 = new PressureCalculator<thermo_t>;
m_p1.reset(new EnthalpyCalculator<thermo_t>);
m_p2.reset(new PressureCalculator<thermo_t>);
break;
case SP:
case PS:
tempFixed = false;
m_p1 = new EntropyCalculator<thermo_t>;
m_p2 = new PressureCalculator<thermo_t>;
m_p1.reset(new EntropyCalculator<thermo_t>);
m_p2.reset(new PressureCalculator<thermo_t>);
break;
case SV:
case VS:
tempFixed = false;
m_p1 = new EntropyCalculator<thermo_t>;
m_p2 = new DensityCalculator<thermo_t>;
m_p1.reset(new EntropyCalculator<thermo_t>);
m_p2.reset(new DensityCalculator<thermo_t>);
break;
case TV:
case VT:
m_p1 = new TemperatureCalculator<thermo_t>;
m_p2 = new DensityCalculator<thermo_t>;
m_p1.reset(new TemperatureCalculator<thermo_t>);
m_p2.reset(new DensityCalculator<thermo_t>);
break;
case UV:
case VU:
tempFixed = false;
m_p1 = new IntEnergyCalculator<thermo_t>;
m_p2 = new DensityCalculator<thermo_t>;
m_p1.reset(new IntEnergyCalculator<thermo_t>);
m_p2.reset(new DensityCalculator<thermo_t>);
break;
default:
if (loglevel > 0) {