Classes | |
class | MultiPhase |
A class for multiphase mixtures. More... | |
class | vcs_MultiPhaseEquil |
Cantera's Interface to the Multiphase chemical equilibrium solver. More... | |
Functions | |
int | equilibrate (thermo_t &s, const char *XY, int solver=-1, doublereal rtol=1.0e-9, int maxsteps=5000, int maxiter=100, int loglevel=-99) |
Equilibrate a ThermoPhase object. | |
doublereal | equilibrate (MultiPhase &s, const char *XY, doublereal rtol=1.0e-9, int maxsteps=5000, int maxiter=100, int loglevel=-99) |
Equilibrate a MultiPhase object. | |
int | BasisOptimize (int *usedZeroedSpecies, bool doFormRxn, MultiPhase *mphase, vector_int &orderVectorSpecies, vector_int &orderVectorElements, vector_fp &formRxnMatrix) |
Choose the optimum basis of species for the equilibrium calculations. | |
int | ElemRearrange (int nComponents, const vector_fp &elementAbundances, MultiPhase *mphase, vector_int &orderVectorSpecies, vector_int &orderVectorElements) |
This subroutine handles the potential rearrangement of the constraint equations represented by the Formula Matrix. | |
int | vcs_equilibrate (thermo_t &s, const char *XY, int estimateEquil=0, int printLvl=0, int solver=-1, doublereal rtol=1.0e-9, int maxsteps=5000, int maxiter=100, int loglevel=-99) |
Set a single-phase chemical solution to chemical equilibrium. | |
int | vcs_equilibrate (MultiPhase &s, const char *XY, int estimateEquil=0, int printLvl=0, int solver=2, doublereal rtol=1.0e-9, int maxsteps=5000, int maxiter=100, int loglevel=-99) |
Set a multi-phase chemical solution to chemical equilibrium. | |
int | vcs_equilibrate_1 (MultiPhase &s, int ixy, int estimateEquil=0, int printLvl=0, int solver=2, doublereal rtol=1.0e-9, int maxsteps=5000, int maxiter=100, int loglevel=-99) |
Set a multi-phase chemical solution to chemical equilibrium. |
Cantera has several different equilibrium routines.
int BasisOptimize | ( | int * | usedZeroedSpecies, | |
bool | doFormRxn, | |||
MultiPhase * | mphase, | |||
vector_int & | orderVectorSpecies, | |||
vector_int & | orderVectorElements, | |||
vector_fp & | formRxnMatrix | |||
) |
Choose the optimum basis of species for the equilibrium calculations.
This is done by choosing the species with the largest mole fraction not currently a linear combination of the previous components. Then, calculate the stoichiometric coefficient matrix for that basis.
Calculates the identity of the component species in the mechanism. Rearranges the solution data to put the component data at the front of the species list.
Then, calculates SC(J,I) the formation reactions for all noncomponent species in the mechanism.
Input ---------
mphase | Pointer to the multiphase object. Contains the species mole fractions, which are used to pick the current optimal species component basis. | |
orderVectorElements | Order vector for the elements. The element rows in the formula matrix are rearranged according to this vector. | |
orderVectorSpecies | Order vector for the species. The species are rearranged according to this formula. The first nCompoments of this vector contain the calculated species components on exit. | |
doFormRxn | If true, the routine calculates the formation reaction matrix based on the calculated component species. If false, this step is skipped. |
Output ---------
usedZeroedSpecies | = If true, then a species with a zero concentration was used as a component. The problem may be converged. | |
formRxnMatrix |
Definition at line 83 of file BasisOptimize.cpp.
References DATA_PTR, MultiPhase::elementName(), MultiPhase::getMoles(), MultiPhase::nAtoms(), MultiPhase::nElements(), MultiPhase::nSpecies(), MultiPhase::speciesName(), Cantera::writelog(), and Cantera::writelogf().
int ElemRearrange | ( | int | nComponents, | |
const vector_fp & | elementAbundances, | |||
MultiPhase * | mphase, | |||
vector_int & | orderVectorSpecies, | |||
vector_int & | orderVectorElements | |||
) |
This subroutine handles the potential rearrangement of the constraint equations represented by the Formula Matrix.
Rearrangement is only necessary when the number of components is less than the number of elements. For this case, some constraints can never be satisfied exactly, because the range space represented by the Formula Matrix of the components can't span the extra space. These constraints, which are out of the range space of the component Formula matrix entries, are migrated to the back of the Formula matrix.
A prototypical example is an extra element column in FormulaMatrix[], which is identically zero. For example, let's say that argon is has an element column in FormulaMatrix[], but no species in the mechanism actually contains argon. Then, nc < ne. Unless the entry for desired element abundance vector for Ar is zero, then this element abundance constraint can never be satisfied. The constraint vector is not in the range space of the formula matrix. Also, without perturbation of FormulaMatrix[], BasisOptimize[] would produce a zero pivot because the matrix would be singular (unless the argon element column was already the last column of FormulaMatrix[]. This routine borrows heavily from BasisOptimize algorithm. It finds nc constraints which span the range space of the Component Formula matrix, and assigns them as the first nc components in the formular matrix. This guarrantees that BasisOptimize has a nonsingular matrix to invert. input
nComponents | Number of components calculated previously. | |
elementAbundances | Current value of the element abundances | |
mphase | Input pointer to a MultiPhase object | |
orderVectorSpecies | input vector containing the ordering of the global species in mphase. This is used to extract the component basis of the mphase object. |
output
orderVectorElements | Ouput vector containing the order of the elements that is necessary for calculation of the formula matrix. |
Definition at line 611 of file BasisOptimize.cpp.
References MultiPhase::elementName(), MultiPhase::nAtoms(), MultiPhase::nElements(), MultiPhase::nSpecies(), Cantera::writelog(), and Cantera::writelogf().
doublereal Cantera::equilibrate | ( | MultiPhase & | s, | |
const char * | XY, | |||
doublereal | rtol = 1.0e-9 , |
|||
int | maxsteps = 5000 , |
|||
int | maxiter = 100 , |
|||
int | loglevel = -99 | |||
) |
Equilibrate a MultiPhase object.
Equilibrate a MultiPhase object. The XY parameter indicates what two thermodynamic quantities, other than element composition, are to be held constant during the equilibration process.
This is the top-level driver for multiphase equilibrium. It doesn't do much more than call the equilibrate method of class MultiPhase, except that it adds some messages to the logfile, if loglevel is set > 0.
s | MultiPhase object that will be equilibrated. | |
XY | String representation of what is being held constant | |
rtol | Relative tolerance | |
maxsteps | Maximum number of steps | |
maxiter | Maximum iterations | |
loglevel | loglevel |
int Cantera::equilibrate | ( | thermo_t & | s, | |
const char * | XY, | |||
int | solver = -1 , |
|||
doublereal | rtol = 1.0e-9 , |
|||
int | maxsteps = 5000 , |
|||
int | maxiter = 100 , |
|||
int | loglevel = -99 | |||
) |
Equilibrate a ThermoPhase object.
Set a single-phase chemical solution to chemical equilibrium. This is a convenience function that uses one or the other of the two chemical equilibrium solvers. The XY parameter indicates what two thermodynamic quantities, other than element composition, are to be held constant during the equilibration process.
s | ThermoPhase object that will be equilibrated. | |
XY | String representation of what two properties are being held constant | |
solver | ID of the solver to be used to equlibrate the phase. If solver = 0, the ChemEquil solver will be used, and if solver = 1, the MultiPhaseEquil solver will be used (slower than ChemEquil, but more stable). If solver < 0 (default, then ChemEquil will be tried first, and if it fails MultiPhaseEquil will be tried. | |
rtol | Relative tolerance | |
maxsteps | Maximum number of steps to take to find the solution | |
maxiter | For the MultiPhaseEquil solver only, this is the maximum number of outer temperature or pressure iterations to take when T and/or P is not held fixed. | |
loglevel | loglevel Controls amount of diagnostic output. loglevel = 0 suppresses diagnostics, and increasingly-verbose messages are written as loglevel increases. The messages are written to a file in HTML format for viewing in a web browser. |
int Cantera::vcs_equilibrate | ( | MultiPhase & | s, | |
const char * | XY, | |||
int | estimateEquil = 0 , |
|||
int | printLvl = 0 , |
|||
int | solver = 2 , |
|||
doublereal | rtol = 1.0e-9 , |
|||
int | maxsteps = 5000 , |
|||
int | maxiter = 100 , |
|||
int | loglevel = -99 | |||
) |
Set a multi-phase chemical solution to chemical equilibrium.
This function uses the vcs_MultiPhaseEquil interface to the vcs solver. The function uses the element abundance vector that is currently consistent with the composition within the phases themselves. Two other thermodynamic quantities, determined by the XY string, are held constant during the equilibration.
s | The object to set to an equilibrium state | |
XY | A character string representing the unknowns to be held constant | |
estimateEquil | integer indicating whether the solver should estimate its own initial condition. If 0, the initial mole fraction vector in the ThermoPhase object is used as the initial condition. If 1, the initial mole fraction vector is used if the element abundances are satisfied. if -1, the initial mole fraction vector is thrown out, and an estimate is formulated. | |
printLvl | Determines the amount of printing that gets sent to stdout from the vcs package (Note, you may have to compile with debug flags to get some printing). | |
solver | Determines which solver is used.
| |
rtol | Relative tolerance of the solve. Defaults to 1.0E-9. | |
maxsteps | The maximum number of steps to take to find the solution. | |
maxiter | For the MultiPhaseEquil solver only, this is the maximum number of outer temperature or pressure iterations to take when T and/or P is not held fixed. | |
loglevel | Controls amount of diagnostic output. loglevel = 0 suppresses diagnostics, and increasingly-verbose messages are written as loglevel increases. The messages are written to a file in HTML format for viewing in a web browser. |
int Cantera::vcs_equilibrate | ( | thermo_t & | s, | |
const char * | XY, | |||
int | estimateEquil = 0 , |
|||
int | printLvl = 0 , |
|||
int | solver = -1 , |
|||
doublereal | rtol = 1.0e-9 , |
|||
int | maxsteps = 5000 , |
|||
int | maxiter = 100 , |
|||
int | loglevel = -99 | |||
) |
Set a single-phase chemical solution to chemical equilibrium.
The function uses the element abundance vector that is currently consistent with the composition within the phase itself. Two other thermodynamic quantities, determined by the XY string, are held constant during the equilibration. This is a convenience function that uses one or the other of the two chemical equilibrium solvers.
s | The object to set to an equilibrium state | |
XY | An integer specifying the two properties to be held constant. | |
estimateEquil | integer indicating whether the solver should estimate its own initial condition. If 0, the initial mole fraction vector in the ThermoPhase object is used as the initial condition. If 1, the initial mole fraction vector is used if the element abundances are satisfied. if -1, the initial mole fraction vector is thrown out, and an estimate is formulated. | |
printLvl | Determines the amount of printing that gets sent to stdout from the vcs package (Note, you may have to compile with debug flags to get some printing). | |
solver | The equilibrium solver to use. If solver = 0, the ChemEquil solver will be used, and if solver = 1, the vcs_MultiPhaseEquil solver will be used (slower than ChemEquil, but more stable). If solver < 0 (default, then ChemEquil will be tried first, and if it fails vcs_MultiPhaseEquil will be tried. | |
rtol | Relative tolerance of the solve. Defaults to 1.0E-9. | |
maxsteps | The maximum number of steps to take to find the solution. | |
maxiter | For the MultiPhaseEquil solver only, this is the maximum number of outer temperature or pressure iterations to take when T and/or P is not held fixed. | |
loglevel | Controls amount of diagnostic output. loglevel = 0 suppresses diagnostics, and increasingly-verbose messages are written as loglevel increases. The messages are written to a file in HTML format for viewing in a web browser. |
int Cantera::vcs_equilibrate_1 | ( | MultiPhase & | s, | |
int | ixy, | |||
int | estimateEquil = 0 , |
|||
int | printLvl = 0 , |
|||
int | solver = 2 , |
|||
doublereal | rtol = 1.0e-9 , |
|||
int | maxsteps = 5000 , |
|||
int | maxiter = 100 , |
|||
int | loglevel = -99 | |||
) |
Set a multi-phase chemical solution to chemical equilibrium.
This function uses the vcs_MultiPhaseEquil interface to the vcs solver. The function uses the element abundance vector that is currently consistent with the composition within the phases themselves. Two other thermodynamic quantities, determined by the XY string, are held constant during the equilibration.
s | The object to set to an equilibrium state | |
ixy | An integer specifying the two properties to be held constant. | |
estimateEquil | integer indicating whether the solver should estimate its own initial condition. If 0, the initial mole fraction vector in the ThermoPhase object is used as the initial condition. If 1, the initial mole fraction vector is used if the element abundances are satisfied. if -1, the initial mole fraction vector is thrown out, and an estimate is formulated. | |
printLvl | Determines the amount of printing that gets sent to stdout from the vcs package (Note, you may have to compile with debug flags to get some printing). | |
solver | Determines which solver is used.
| |
rtol | Relative tolerance of the solve. Defaults to 1.0E-9. | |
maxsteps | The maximum number of steps to take to find the solution. | |
maxiter | For the MultiPhaseEquil solver only, this is the maximum number of outer temperature or pressure iterations to take when T and/or P is not held fixed. | |
loglevel | Controls amount of diagnostic output. loglevel = 0 suppresses diagnostics, and increasingly-verbose messages are written as loglevel increases. The messages are written to a file in HTML format for viewing in a web browser. |