From e3022a8057d97f6feba8a8b2d8f6c9f434d7cfa4 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Sat, 15 Nov 2014 00:47:13 +0000 Subject: [PATCH] [Kinetics] Check Reaction objects for orders on reversible reactions --- src/kinetics/Kinetics.cpp | 9 +++++++++ test/kinetics/kineticsFromScratch.cpp | 13 +++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/kinetics/Kinetics.cpp b/src/kinetics/Kinetics.cpp index bff58de0e..25ca45667 100644 --- a/src/kinetics/Kinetics.cpp +++ b/src/kinetics/Kinetics.cpp @@ -653,6 +653,15 @@ void Kinetics::addReaction(shared_ptr r) { r->validateRateConstant(); + // If reaction orders are specified, then this reaction does not follow + // mass-action kinetics, and is not an elementary reaction. So check that it + // is not reversible, since computing the reverse rate from thermochemistry + // only works for elementary reactions. + if (r->reversible && !r->orders.empty()) { + throw CanteraError("Kinetics::addReaction", "Reaction orders may only " + "be given for irreversible reactions"); + } + // Check for undeclared species for (Composition::const_iterator iter = r->reactants.begin(); iter != r->reactants.end(); diff --git a/test/kinetics/kineticsFromScratch.cpp b/test/kinetics/kineticsFromScratch.cpp index 9f9cc285d..ceacc2078 100644 --- a/test/kinetics/kineticsFromScratch.cpp +++ b/test/kinetics/kineticsFromScratch.cpp @@ -249,6 +249,19 @@ TEST_F(KineticsFromScratch, allow_negative_A) ASSERT_EQ((size_t) 1, kin.nReactions()); } +TEST_F(KineticsFromScratch, invalid_reversible_with_orders) +{ + Composition reac = parseCompString("O:1 H2:1"); + Composition prod = parseCompString("H:1 OH:1"); + Arrhenius rate(3.87e1, 2.7, 6260.0 / GasConst_cal_mol_K); + shared_ptr R(new ElementaryReaction(reac, prod, rate)); + R->orders["H2"] = 0.5; + + ASSERT_THROW(kin.addReaction(R), CanteraError); + ASSERT_EQ(0, kin.nReactions()); +} + + class InterfaceKineticsFromScratch : public testing::Test { public: