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++) {
102 "Use getState instead. To be removed after Cantera 2.3.");
109 for (
size_t n = 0; n <
m_surf.size(); n++) {
110 m_surf[n]->getCoverages(c + loc);
117 m_integ->setTolerances(m_rtol, m_atol);
118 m_integ->initialize(t0, *
this);
123 m_integ->initialize(t0, *
this);
124 m_integ->setMaxStepSize(t1 - t0);
138 for (
size_t n = 0; n <
m_surf.size(); n++) {
139 m_surf[n]->setCoverages(c + loc);
145 doublereal* ydot, doublereal* p)
149 for (
size_t n = 0; n <
m_surf.size(); n++) {
150 double rs0 = 1.0/
m_surf[n]->siteDensity();
154 for (
size_t k = 1; k <
m_nsp[n]; k++) {
155 ydot[k + loc] = m_work[kstart + k] * rs0 *
m_surf[n]->size(k);
164 doublereal timeScaleOverride)
170 doublereal time_scale = timeScaleOverride;
180 if (ifuncOverride >= 0) {
181 ifunc = ifuncOverride;
202 doublereal reltol = 1.0E-6;
203 doublereal atol = 1.0E-20;
208 for (
size_t k = 0; k <
m_nv; k++) {
223 int retn =
m_surfSolver->solveSurfProb(ifunc, time_scale, TKelvin, PGas,
230 retn =
m_surfSolver->solveSurfProb(ifunc, time_scale, TKelvin, PGas,
233 throw CanteraError(
"ImplicitSurfChem::solvePseudoSteadyStateProblem",
234 "solveSP return an error condition!");
242 for (
size_t ip = 0; ip <
m_surf.size(); ip++) {
244 kstart = m_specStartIndex[ip];
258 for (
size_t ip = 0; ip <
m_surf.size(); ip++) {
260 kstart = m_specStartIndex[ip];
273 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.
void warn_deprecated(const std::string &method, const std::string &extra)
Print a warning indicating that method is deprecated.
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...
virtual void getInitialConditions(doublereal t0, size_t leny, doublereal *y)
Set the initial conditions for the solution vector.
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.