Added more error control and checking. This is needed for new

test problems.
This commit is contained in:
Harry Moffat 2006-10-20 21:22:30 +00:00
parent 3ce657f0c7
commit 653e9fac7a
2 changed files with 41 additions and 8 deletions

View file

@ -10,13 +10,17 @@ namespace Cantera {
// convenience functions
//-----------------------------------------------------------
void equilibrate(thermo_t& s, const char* XY,
/**
* Return variable is equal to the number of subroutine attempts
* it took to equilibrate the system.
*/
int equilibrate(thermo_t& s, const char* XY,
int solver = -1, doublereal rtol = 1.0e-9, int maxsteps = 1000,
int maxiter = 100, int loglevel = 0);
int maxiter = 100, int loglevel = -99);
doublereal equilibrate(MultiPhase& s, const char* XY,
doublereal tol = 1.0e-9, int maxsteps = 1000, int maxiter = 100,
int loglevel = 0);
int loglevel = -99);
}

View file

@ -89,11 +89,14 @@ namespace Cantera {
///
/// @ingroup equil
void equilibrate(thermo_t& s, const char* XY, int solver,
int equilibrate(thermo_t& s, const char* XY, int solver,
doublereal rtol, int maxsteps, int maxiter, int loglevel) {
MultiPhase* m = 0;
ChemEquil* e = 0;
bool redo = true;
int retn = -1;
int nAttempts = 0;
int retnSub = 0;
beginLogGroup("equilibrate", loglevel);
addLogEntry("Single-phase equilibrate function");
@ -114,24 +117,46 @@ namespace Cantera {
try {
m->addPhase(&s, 1.0);
m->init();
equilibrate(*m, XY, rtol, maxsteps, maxiter, loglevel);
nAttempts++;
(void) equilibrate(*m, XY, rtol, maxsteps, maxiter, loglevel);
redo = false;
addLogEntry("MultiPhaseEquil solver succeeded.");
delete m;
retn = nAttempts;
}
catch (CanteraError err) {
addLogEntry("MultiPhaseEquil solver failed.");
endLogGroup("equilibrate");
delete m;
throw err;
if (nAttempts < 2) {
addLogEntry("Trying single phase ChemEquil solver.");
solver = -1;
} else {
endLogGroup("equilibrate");
throw err;
}
}
}
else { // solver <= 0
/*
* Call the element potential solver
*/
e = new ChemEquil;
try {
e->options.maxIterations = maxsteps;
e->options.relTolerance = rtol;
e->equilibrate(s,XY);
nAttempts++;
retnSub = e->equilibrate(s,XY);
if (retnSub < 0) {
addLogEntry("ChemEquil solver failed.");
if (nAttempts < 2) {
addLogEntry("Trying MultiPhaseEquil solver.");
solver = 1;
} else {
throw CanteraError("equilibrate",
"Both equilibrium solvers failed");
}
}
retn = nAttempts;
s.setElementPotentials(e->elementPotentials());
redo = false;
delete e;
@ -154,6 +179,10 @@ namespace Cantera {
}
}
} // while (redo)
/*
* We are here only for a success
*/
endLogGroup("equilibrate");
return retn;
}
}