diff --git a/include/cantera/kinetics/GasKinetics.h b/include/cantera/kinetics/GasKinetics.h index 3e9c413670c..cf64ce0d8e0 100644 --- a/include/cantera/kinetics/GasKinetics.h +++ b/include/cantera/kinetics/GasKinetics.h @@ -67,6 +67,18 @@ class GasKinetics : public BulkKinetics //! reactions. virtual void update_rates_C(); + //! register a function that adds a reaction + void reg_addRxn(const std::string& name, + std::function)> f) { + m_addRxn[name] = f; + } + + //! register a function that modifies a reaction + void reg_modRxn(const std::string& name, + std::function)> f) { + m_modRxn[name] = f; + } + protected: //! Reaction index of each falloff reaction std::vector m_fallindx; @@ -117,6 +129,14 @@ class GasKinetics : public BulkKinetics //! Update the equilibrium constants in molar units. void updateKc(); + + //! map functions adding reactions + std::unordered_map)>> m_addRxn; + + //! map functions modifying reactions + std::unordered_map)>> m_modRxn; }; } diff --git a/src/kinetics/GasKinetics.cpp b/src/kinetics/GasKinetics.cpp index 154fc1aafcf..5596f14d828 100644 --- a/src/kinetics/GasKinetics.cpp +++ b/src/kinetics/GasKinetics.cpp @@ -18,6 +18,59 @@ GasKinetics::GasKinetics(thermo_t* thermo) : m_logStandConc(0.0), m_pres(0.0) { + reg_addRxn("elementary", + [&](shared_ptr R) { + addElementaryReaction(dynamic_cast(*R)); + }); + reg_modRxn("elementary", + [&](size_t i, shared_ptr R) { + modifyElementaryReaction(i, dynamic_cast(*R)); + }); + + reg_addRxn("three-body", + [&](shared_ptr R) { + addThreeBodyReaction(dynamic_cast(*R)); + }); + reg_modRxn("three-body", + [&](size_t i, shared_ptr R) { + modifyThreeBodyReaction(i, dynamic_cast(*R)); + }); + + reg_addRxn("falloff", + [&](shared_ptr R) { + addFalloffReaction(dynamic_cast(*R)); + }); + reg_modRxn("falloff", + [&](size_t i, shared_ptr R) { + modifyFalloffReaction(i, dynamic_cast(*R)); + }); + + reg_addRxn("chemically-activated", + [&](shared_ptr R) { + addFalloffReaction(dynamic_cast(*R)); + }); + reg_modRxn("chemically-activated", + [&](size_t i, shared_ptr R) { + modifyFalloffReaction(i, dynamic_cast(*R)); + }); + + reg_addRxn("pressure-dependent-Arrhenius", + [&](shared_ptr R) { + addPlogReaction(dynamic_cast(*R)); + }); + + reg_modRxn("pressure-dependent-Arrhenius", + [&](size_t i, shared_ptr R) { + modifyPlogReaction(i, dynamic_cast(*R)); + }); + reg_addRxn("Chebyshev", + [&](shared_ptr R) { + addChebyshevReaction(dynamic_cast(*R)); + }); + reg_modRxn("Chebyshev", + [&](size_t i, shared_ptr R) { + modifyChebyshevReaction(i, dynamic_cast(*R)); + }); } void GasKinetics::update_rates_T() @@ -230,26 +283,11 @@ bool GasKinetics::addReaction(shared_ptr r) return false; } - switch (r->reaction_type) { - case ELEMENTARY_RXN: - addElementaryReaction(dynamic_cast(*r)); - break; - case THREE_BODY_RXN: - addThreeBodyReaction(dynamic_cast(*r)); - break; - case FALLOFF_RXN: - case CHEMACT_RXN: - addFalloffReaction(dynamic_cast(*r)); - break; - case PLOG_RXN: - addPlogReaction(dynamic_cast(*r)); - break; - case CHEBYSHEV_RXN: - addChebyshevReaction(dynamic_cast(*r)); - break; - default: + try { + m_addRxn[r->type()](r); + } catch (std::out_of_range&) { throw CanteraError("GasKinetics::addReaction", - "Unknown reaction type specified: {}", r->reaction_type); + "Unknown reaction type specified: '{}'", r->type()); } return true; } @@ -323,26 +361,11 @@ void GasKinetics::modifyReaction(size_t i, shared_ptr rNew) // operations common to all reaction types BulkKinetics::modifyReaction(i, rNew); - switch (rNew->reaction_type) { - case ELEMENTARY_RXN: - modifyElementaryReaction(i, dynamic_cast(*rNew)); - break; - case THREE_BODY_RXN: - modifyThreeBodyReaction(i, dynamic_cast(*rNew)); - break; - case FALLOFF_RXN: - case CHEMACT_RXN: - modifyFalloffReaction(i, dynamic_cast(*rNew)); - break; - case PLOG_RXN: - modifyPlogReaction(i, dynamic_cast(*rNew)); - break; - case CHEBYSHEV_RXN: - modifyChebyshevReaction(i, dynamic_cast(*rNew)); - break; - default: + try { + m_modRxn[rNew->type()](i, rNew); + } catch (std::out_of_range&) { throw CanteraError("GasKinetics::modifyReaction", - "Unknown reaction type specified: {}", rNew->reaction_type); + "Unknown reaction type specified: '{}'", rNew->type()); } // invalidate all cached data