From 6727902c3f2d14d55cb0d8b7cfc4826433a7739f Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Sat, 15 Nov 2014 00:47:04 +0000 Subject: [PATCH] [Kinetics] Allow skipping third-body efficiencies when using Reaction --- include/cantera/kinetics/Kinetics.h | 12 ++++++++++++ src/kinetics/GasKinetics.cpp | 9 ++++++++- src/kinetics/Kinetics.cpp | 3 ++- test/kinetics/kineticsFromScratch.cpp | 27 +++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/include/cantera/kinetics/Kinetics.h b/include/cantera/kinetics/Kinetics.h index 8844a679b..095122e20 100644 --- a/include/cantera/kinetics/Kinetics.h +++ b/include/cantera/kinetics/Kinetics.h @@ -814,6 +814,15 @@ public: m_skipUndeclaredSpecies = skip; } + //! Determine behavior when adding a new reaction that contains third-body + //! efficiencies for species not defined in any of the phases associated + //! with this kinetics manager. If set to true, the given third-body + //! efficiency will be ignored. If false, (the default) an exception will be + //! raised. + void skipUndeclaredThirdBodies(bool skip) { + m_skipUndeclaredThirdBodies = skip; + } + //! @deprecated To be removed after Cantera 2.2. No longer called as part //! of addReaction. virtual void installReagents(const ReactionData& r) { @@ -1084,6 +1093,9 @@ protected: //! @see skipUndeclaredSpecies() bool m_skipUndeclaredSpecies; + //! @see skipUndeclaredThirdBodies() + bool m_skipUndeclaredThirdBodies; + private: std::map > m_rgroups; std::map > m_pgroups; diff --git a/src/kinetics/GasKinetics.cpp b/src/kinetics/GasKinetics.cpp index 3145a728e..c78191c63 100644 --- a/src/kinetics/GasKinetics.cpp +++ b/src/kinetics/GasKinetics.cpp @@ -375,7 +375,14 @@ void GasKinetics::addThreeBodyReaction(ThirdBodyReaction& r) for (Composition::const_iterator iter = r.third_body.efficiencies.begin(); iter != r.third_body.efficiencies.end(); ++iter) { - efficiencies[kineticsSpeciesIndex(iter->first)] = iter->second; + size_t k = kineticsSpeciesIndex(iter->first); + if (k != npos) { + efficiencies[k] = iter->second; + } else if (!m_skipUndeclaredThirdBodies) { + throw CanteraError("GasKinetics::addThreeBodyReaction", "Found " + "third-body efficiency for undefined species '" + iter->first + + "' while adding reaction '" + r.equation() + "'"); + } } m_3b_concm.install(nReactions(), efficiencies, r.third_body.default_efficiency); diff --git a/src/kinetics/Kinetics.cpp b/src/kinetics/Kinetics.cpp index b8238c420..8ba3d715f 100644 --- a/src/kinetics/Kinetics.cpp +++ b/src/kinetics/Kinetics.cpp @@ -23,7 +23,8 @@ Kinetics::Kinetics() : m_surfphase(npos), m_rxnphase(npos), m_mindim(4), - m_skipUndeclaredSpecies(false) + m_skipUndeclaredSpecies(false), + m_skipUndeclaredThirdBodies(false) { } diff --git a/test/kinetics/kineticsFromScratch.cpp b/test/kinetics/kineticsFromScratch.cpp index e24252acd..1e3885646 100644 --- a/test/kinetics/kineticsFromScratch.cpp +++ b/test/kinetics/kineticsFromScratch.cpp @@ -78,6 +78,33 @@ TEST_F(KineticsFromScratch, add_three_body_reaction) check_rates(1); } +TEST_F(KineticsFromScratch, undefined_third_body) +{ + Composition reac = parseCompString("O:2"); + Composition prod = parseCompString("O2:1"); + Arrhenius rate(1.2e11, -1.0, 0.0); + ThirdBody tbody; + tbody.efficiencies = parseCompString("H2:0.1 CO2:0.83"); + shared_ptr R(new ThirdBodyReaction(reac, prod, rate, tbody)); + + ASSERT_THROW(kin.addReaction(R), CanteraError); +} + +TEST_F(KineticsFromScratch, skip_undefined_third_body) +{ + Composition reac = parseCompString("O:2"); + Composition prod = parseCompString("O2:1"); + Arrhenius rate(1.2e11, -1.0, 0.0); + ThirdBody tbody; + tbody.efficiencies = parseCompString("H2:0.1 CO2:0.83"); + shared_ptr R(new ThirdBodyReaction(reac, prod, rate, tbody)); + + kin.skipUndeclaredThirdBodies(true); + kin.addReaction(R); + ASSERT_EQ((size_t) 1, kin.nReactions()); +} + + TEST_F(KineticsFromScratch, add_falloff_reaction) { // reaction 2: