diff --git a/interfaces/cython/cantera/test/test_kinetics.py b/interfaces/cython/cantera/test/test_kinetics.py index cb124da50..cb41a14d0 100644 --- a/interfaces/cython/cantera/test/test_kinetics.py +++ b/interfaces/cython/cantera/test/test_kinetics.py @@ -728,6 +728,10 @@ class TestDuplicateReactions(utilities.CanteraTest): def test_unmatched_duplicate(self): self.check('J') + def test_nonreacting_species(self): + gas = ct.Solution(self.infile, 'K') + self.assertEqual(gas.n_reactions, 3) + class TestReaction(utilities.CanteraTest): @classmethod diff --git a/src/kinetics/Kinetics.cpp b/src/kinetics/Kinetics.cpp index 644519146..88643f29e 100644 --- a/src/kinetics/Kinetics.cpp +++ b/src/kinetics/Kinetics.cpp @@ -180,17 +180,23 @@ std::pair Kinetics::checkDuplicates(bool throw_err) const double Kinetics::checkDuplicateStoich(std::map& r1, std::map& r2) const { - auto b = r1.begin(), e = r1.end(); - int k1 = b->first; + std::unordered_set keys; // species keys (k+1 or -k-1) + for (auto& r : r1) { + keys.insert(r.first); + } + for (auto& r : r2) { + keys.insert(r.first); + } + int k1 = r1.begin()->first; // check for duplicate written in the same direction doublereal ratio = 0.0; if (r1[k1] && r2[k1]) { ratio = r2[k1]/r1[k1]; - ++b; bool different = false; - for (; b != e; ++b) { - k1 = b->first; - if (!r1[k1] || !r2[k1] || fabs(r2[k1]/r1[k1] - ratio) > 1.e-8) { + for (int k : keys) { + if ((r1[k] && !r2[k]) || + (!r1[k] && r2[k]) || + (r1[k] && fabs(r2[k]/r1[k] - ratio) > 1.e-8)) { different = true; break; } @@ -201,16 +207,14 @@ double Kinetics::checkDuplicateStoich(std::map& r1, } // check for duplicate written in the reverse direction - b = r1.begin(); - k1 = b->first; if (r1[k1] == 0.0 || r2[-k1] == 0.0) { return 0.0; } ratio = r2[-k1]/r1[k1]; - ++b; - for (; b != e; ++b) { - k1 = b->first; - if (!r1[k1] || !r2[-k1] || fabs(r2[-k1]/r1[k1] - ratio) > 1.e-8) { + for (int k : keys) { + if ((r1[k] && !r2[-k]) || + (!r1[k] && r2[-k]) || + (r1[k] && fabs(r2[-k]/r1[k] - ratio) > 1.e-8)) { return 0.0; } } diff --git a/test/data/duplicate-reactions.cti b/test/data/duplicate-reactions.cti index 34d00ab63..d5fd91079 100644 --- a/test/data/duplicate-reactions.cti +++ b/test/data/duplicate-reactions.cti @@ -17,6 +17,7 @@ make_gas('G', 'G-*') make_gas('H', 'H-*') make_gas('I', 'I-*') make_gas('J', ['C-1', 'F-1', 'I-1']) # unmatched duplicate +make_gas('K', 'K-*') kf = [1e10, 0, 100] @@ -60,3 +61,8 @@ three_body_reaction('O + H2 + M <=> H + OH + M', kf, id='H-2') # Declared duplicate (allowed) reaction('O + H2 <=> H + OH', kf, options='duplicate', id='I-1') reaction('H + OH <=> O + H2', kf, options='duplicate', id='I-2') + +# Not actually duplicates +reaction('O + 2 H <=> H2O', kf, id='K-0') # random other reaction +reaction('2 OH + H2 <=> H2O2 + H2', kf, id='K-1') +reaction('2 OH <=> H2O2', kf, id='K-2')