20 ImplicitSurfChem::ImplicitSurfChem(vector<InterfaceKinetics*> k) :
22 m_numTotalBulkSpecies(0),
27 m_mediumSpeciesStart(-1),
28 m_bulkSpeciesStart(-1),
29 m_surfSpeciesStart(-1),
30 m_commonTempPressForPhases(true),
34 size_t kinSpIndex = 0;
36 for (
size_t n = 0; n < k.size(); n++) {
39 size_t ns = k[n]->surfacePhaseIndex();
42 "kinetics manager contains no surface phase");
46 size_t nsp =
m_surf.back()->nSpecies();
49 size_t nt = k[n]->nTotalSpecies();
50 ntmax = std::max(nt, ntmax);
51 m_specStartIndex.push_back(kinSpIndex);
53 size_t nPhases = kinPtr->
nPhases();
56 for (
size_t ip = 0; ip < nPhases; ip++) {
62 m_numTotalBulkSpecies += nsp;
65 pLocTmp[ip] = int(imatch);
67 pLocTmp[ip] = -int(n);
70 pLocVec.push_back(pLocTmp);
72 m_numTotalSpecies =
m_nv + m_numTotalBulkSpecies;
74 m_concSpeciesSave.resize(m_numTotalSpecies, 0.0);
76 m_integ.reset(newIntegrator(
"CVODE"));
81 m_integ->setProblemType(DENSE + NOJAC);
86 int ImplicitSurfChem::checkMatch(std::vector<ThermoPhase*> m_vec,
ThermoPhase* thPtr)
89 for (
int i = 0; i < (int) m_vec.size(); i++) {
101 for (
size_t n = 0; n <
m_surf.size(); n++) {
102 m_surf[n]->getCoverages(c + loc);
109 m_integ->setTolerances(m_rtol, m_atol);
110 m_integ->initialize(t0, *
this);
115 m_integ->initialize(t0, *
this);
116 m_integ->setMaxStepSize(t1 - t0);
130 for (
size_t n = 0; n <
m_surf.size(); n++) {
131 m_surf[n]->setCoverages(c + loc);
137 doublereal* ydot, doublereal* p)
141 for (
size_t n = 0; n <
m_surf.size(); n++) {
142 double rs0 = 1.0/
m_surf[n]->siteDensity();
146 for (
size_t k = 1; k <
m_nsp[n]; k++) {
147 ydot[k + loc] = m_work[kstart + k] * rs0 *
m_surf[n]->size(k);
156 doublereal timeScaleOverride)
162 doublereal time_scale = timeScaleOverride;
172 if (ifuncOverride >= 0) {
173 ifunc = ifuncOverride;
194 doublereal reltol = 1.0E-6;
195 doublereal atol = 1.0E-20;
200 for (
size_t k = 0; k <
m_nv; k++) {
215 int retn =
m_surfSolver->solveSurfProb(ifunc, time_scale, TKelvin, PGas,
222 retn =
m_surfSolver->solveSurfProb(ifunc, time_scale, TKelvin, PGas,
225 throw CanteraError(
"ImplicitSurfChem::solvePseudoSteadyStateProblem",
226 "solveSP return an error condition!");
234 for (
size_t ip = 0; ip <
m_surf.size(); ip++) {
236 kstart = m_specStartIndex[ip];
250 for (
size_t ip = 0; ip <
m_surf.size(); ip++) {
252 kstart = m_specStartIndex[ip];
265 for (
size_t ip = 0; ip <
m_surf.size(); ip++) {
Backward Differentiation.
Header for a simple thermodynamics model of a surface phase derived from ThermoPhase, assuming an ideal solution model (see Thermodynamic Properties and class SurfPhase).
std::vector< size_t > m_surfindex
index of the surface phase in each InterfaceKinetics object
doublereal temperature() const
Temperature (K).
virtual void getState(doublereal *y)
Get the current state of the solution vector.
thermo_t & thermo(size_t n=0)
This method returns a reference to the nth ThermoPhase object defined in this kinetics mechanism...
std::unique_ptr< Integrator > m_integ
Pointer to the CVODE integrator.
void solvePseudoSteadyStateProblem(int ifuncOverride=-1, doublereal timeScaleOverride=1.0)
Solve for the pseudo steady-state of the surface problem.
std::vector< ThermoPhase * > m_bulkPhases
Vector of pointers to bulk phases.
Method to solve a pseudo steady state surface problem.
const size_t npos
index returned by functions to indicate "no position"
std::unique_ptr< solveSP > m_surfSolver
Pointer to the helper method, Placid, which solves the surface problem.
std::vector< size_t > m_nsp
Vector of number of species in each Surface Phase.
size_t nSpecies() const
Returns the number of species in the phase.
const int BULK_ETCH
Etching of a bulk phase is to be expected.
size_t nPhases() const
The number of phases participating in the reaction mechanism.
std::vector< SurfPhase * > m_surf
vector of pointers to surface phases.
Base class for a phase with thermodynamic properties.
std::vector< int > vector_int
Vector of ints.
A simple thermodynamic model for a surface phase, assuming an ideal solution model.
int m_ioFlag
Controls the amount of printing from this routine and underlying routines.
bool m_commonTempPressForPhases
If true, a common temperature and pressure for all surface and bulk phases associated with the surfac...
const int SFLUX_INITIALIZE
This assumes that the initial guess supplied to the routine is far from the correct one...
A kinetics manager for heterogeneous reaction mechanisms.
const int SFLUX_RESIDUAL
Need to solve the surface problem in order to calculate the surface fluxes of gas-phase species...
size_t m_nv
Total number of surface species in all surface phases.
Base class for exceptions thrown by Cantera classes.
virtual void eval(doublereal t, doublereal *y, doublereal *ydot, doublereal *p)
Evaluate the value of ydot[k] at the current conditions.
virtual void setConcentrations(const doublereal *const conc)
Set the concentrations to the specified values within the phase.
void integrate0(doublereal t0, doublereal t1)
Integrate from t0 to t1 without reinitializing the integrator.
void setConcSpecies(const doublereal *const vecConcSpecies)
Sets the concentrations within phases that are unknowns in the surface problem.
Declarations for the implicit integration of surface site density equations (see Kinetics Managers an...
virtual void setState_TP(doublereal t, doublereal p)
Set the temperature (K) and pressure (Pa)
virtual doublereal pressure() const
Return the thermodynamic pressure (Pa).
void getConcSpecies(doublereal *const vecConcSpecies) const
virtual void initialize(doublereal t0=0.0)
void setCommonState_TP(doublereal TKelvin, doublereal PresPa)
Sets the state variable in all thermodynamic phases (surface and surrounding bulk phases) to the inpu...
void updateState(doublereal *y)
Set the mixture to a state consistent with solution vector y.
Header file for implicit surface problem solver (see Chemical Kinetics and class solveSP).
std::vector< InterfaceKinetics * > m_vecKinPtrs
vector of pointers to InterfaceKinetics objects
Namespace for the Cantera kernel.
void getConcentrations(doublereal *const c) const
Get the species concentrations (kmol/m^3).
vector_fp m_concSpecies
Temporary vector - length num species in the Kinetics object.
void integrate(doublereal t0, doublereal t1)
Integrate from t0 to t1. The integrator is reinitialized first.