Added more error control and checking. This is needed for new
test problems.
This commit is contained in:
parent
3ce657f0c7
commit
653e9fac7a
2 changed files with 41 additions and 8 deletions
|
|
@ -10,13 +10,17 @@ namespace Cantera {
|
||||||
// convenience functions
|
// 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 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 equilibrate(MultiPhase& s, const char* XY,
|
||||||
doublereal tol = 1.0e-9, int maxsteps = 1000, int maxiter = 100,
|
doublereal tol = 1.0e-9, int maxsteps = 1000, int maxiter = 100,
|
||||||
int loglevel = 0);
|
int loglevel = -99);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -89,11 +89,14 @@ namespace Cantera {
|
||||||
///
|
///
|
||||||
/// @ingroup equil
|
/// @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) {
|
doublereal rtol, int maxsteps, int maxiter, int loglevel) {
|
||||||
MultiPhase* m = 0;
|
MultiPhase* m = 0;
|
||||||
ChemEquil* e = 0;
|
ChemEquil* e = 0;
|
||||||
bool redo = true;
|
bool redo = true;
|
||||||
|
int retn = -1;
|
||||||
|
int nAttempts = 0;
|
||||||
|
int retnSub = 0;
|
||||||
|
|
||||||
beginLogGroup("equilibrate", loglevel);
|
beginLogGroup("equilibrate", loglevel);
|
||||||
addLogEntry("Single-phase equilibrate function");
|
addLogEntry("Single-phase equilibrate function");
|
||||||
|
|
@ -114,24 +117,46 @@ namespace Cantera {
|
||||||
try {
|
try {
|
||||||
m->addPhase(&s, 1.0);
|
m->addPhase(&s, 1.0);
|
||||||
m->init();
|
m->init();
|
||||||
equilibrate(*m, XY, rtol, maxsteps, maxiter, loglevel);
|
nAttempts++;
|
||||||
|
(void) equilibrate(*m, XY, rtol, maxsteps, maxiter, loglevel);
|
||||||
redo = false;
|
redo = false;
|
||||||
addLogEntry("MultiPhaseEquil solver succeeded.");
|
addLogEntry("MultiPhaseEquil solver succeeded.");
|
||||||
delete m;
|
delete m;
|
||||||
|
retn = nAttempts;
|
||||||
}
|
}
|
||||||
catch (CanteraError err) {
|
catch (CanteraError err) {
|
||||||
addLogEntry("MultiPhaseEquil solver failed.");
|
addLogEntry("MultiPhaseEquil solver failed.");
|
||||||
endLogGroup("equilibrate");
|
|
||||||
delete m;
|
delete m;
|
||||||
throw err;
|
if (nAttempts < 2) {
|
||||||
|
addLogEntry("Trying single phase ChemEquil solver.");
|
||||||
|
solver = -1;
|
||||||
|
} else {
|
||||||
|
endLogGroup("equilibrate");
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else { // solver <= 0
|
else { // solver <= 0
|
||||||
|
/*
|
||||||
|
* Call the element potential solver
|
||||||
|
*/
|
||||||
e = new ChemEquil;
|
e = new ChemEquil;
|
||||||
try {
|
try {
|
||||||
e->options.maxIterations = maxsteps;
|
e->options.maxIterations = maxsteps;
|
||||||
e->options.relTolerance = rtol;
|
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());
|
s.setElementPotentials(e->elementPotentials());
|
||||||
redo = false;
|
redo = false;
|
||||||
delete e;
|
delete e;
|
||||||
|
|
@ -154,6 +179,10 @@ namespace Cantera {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // while (redo)
|
} // while (redo)
|
||||||
|
/*
|
||||||
|
* We are here only for a success
|
||||||
|
*/
|
||||||
endLogGroup("equilibrate");
|
endLogGroup("equilibrate");
|
||||||
|
return retn;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue