diff --git a/include/cantera/kinetics/ImplicitSurfChem.h b/include/cantera/kinetics/ImplicitSurfChem.h index 3c2603cc7..1ab6f7c0b 100644 --- a/include/cantera/kinetics/ImplicitSurfChem.h +++ b/include/cantera/kinetics/ImplicitSurfChem.h @@ -61,8 +61,16 @@ public: * @param k Vector of pointers to InterfaceKinetics objects Each object * consists of a surface or an edge containing internal degrees of * freedom representing the concentration of surface adsorbates. + * @param rtol The relative tolerance for the integrator + * @param atol The absolute tolerance for the integrator + * @param maxStepSize The maximum step-size the integrator is allowed to take + * @param maxSteps the maximum number of time-steps the integrator can take + * @param maxErrTestFails the maximum permissible number of error test failures */ - ImplicitSurfChem(std::vector k); + ImplicitSurfChem(std::vector k, + doublereal rtol=1.e-7, doublereal atol=1.e-14, + doublereal maxStepSize=0, size_t maxSteps=0, + size_t maxErrTestFails=0); virtual ~ImplicitSurfChem() {}; @@ -230,6 +238,8 @@ protected: std::unique_ptr m_integ; doublereal m_atol, m_rtol; // tolerances doublereal m_maxstep; //!< max step size + size_t m_nmax; //!< maximum number of steps allowed + size_t m_maxErrTestFails; //!< maximum number of error test failures allowed vector_fp m_work; /** diff --git a/include/cantera/kinetics/InterfaceKinetics.h b/include/cantera/kinetics/InterfaceKinetics.h index faec6c625..bf9823f05 100644 --- a/include/cantera/kinetics/InterfaceKinetics.h +++ b/include/cantera/kinetics/InterfaceKinetics.h @@ -240,8 +240,16 @@ public: * \f] * * @param tstep Time value to advance the surface coverages + * @param rtol The relative tolerance for the integrator + * @param atol The absolute tolerance for the integrator + * @param maxStepSize The maximum step-size the integrator is allowed to take + * @param maxSteps the maximum number of time-steps the integrator can take + * before reaching tstep + * @param maxErrTestFails the maximum permissible number of error test failures */ - void advanceCoverages(doublereal tstep); + void advanceCoverages(doublereal tstep, doublereal rtol=1.e-7, + doublereal atol=1.e-14, doublereal maxStepSize=0, + size_t maxSteps=0, size_t maxErrTestFails=0); //! Solve for the pseudo steady-state of the surface problem /*! diff --git a/src/kinetics/ImplicitSurfChem.cpp b/src/kinetics/ImplicitSurfChem.cpp index f44827196..1586e72b2 100644 --- a/src/kinetics/ImplicitSurfChem.cpp +++ b/src/kinetics/ImplicitSurfChem.cpp @@ -17,13 +17,18 @@ using namespace std; namespace Cantera { -ImplicitSurfChem::ImplicitSurfChem(vector k) : +ImplicitSurfChem::ImplicitSurfChem( + vector k, doublereal rtol, doublereal atol, + doublereal maxStepSize, size_t maxSteps, + size_t maxErrTestFails) : m_nv(0), m_numTotalBulkSpecies(0), m_numTotalSpecies(0), - m_atol(1.e-14), - m_rtol(1.e-7), - m_maxstep(0.0), + m_atol(atol), + m_rtol(rtol), + m_maxstep(maxStepSize), + m_nmax(maxSteps), + m_maxErrTestFails(maxErrTestFails), m_mediumSpeciesStart(-1), m_bulkSpeciesStart(-1), m_surfSpeciesStart(-1), @@ -107,6 +112,18 @@ void ImplicitSurfChem::getState(doublereal* c) void ImplicitSurfChem::initialize(doublereal t0) { m_integ->setTolerances(m_rtol, m_atol); + if (m_maxstep > 0) + { + m_integ->setMaxStepSize(m_maxstep); + } + if (m_nmax > 0) + { + m_integ->setMaxSteps(m_nmax); + } + if (m_maxErrTestFails > 0) + { + m_integ->setMaxErrTestFails(m_maxErrTestFails); + } m_integ->initialize(t0, *this); } diff --git a/src/kinetics/InterfaceKinetics.cpp b/src/kinetics/InterfaceKinetics.cpp index 4e668952c..117661e76 100644 --- a/src/kinetics/InterfaceKinetics.cpp +++ b/src/kinetics/InterfaceKinetics.cpp @@ -767,11 +767,14 @@ doublereal InterfaceKinetics::electrochem_beta(size_t irxn) const return 0.0; } -void InterfaceKinetics::advanceCoverages(doublereal tstep) +void InterfaceKinetics::advanceCoverages(doublereal tstep, doublereal rtol, + doublereal atol, doublereal maxStepSize, + size_t maxSteps, size_t maxErrTestFails) { if (m_integrator == 0) { vector k{this}; - m_integrator = new ImplicitSurfChem(k); + m_integrator = new ImplicitSurfChem(k, rtol, atol, maxStepSize, maxSteps, + maxErrTestFails); m_integrator->initialize(); } m_integrator->integrate(0.0, tstep);