From 01a9bdcf58438bbfb04330b48a2d2528a21c5372 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Fri, 17 Aug 2012 16:43:13 +0000 Subject: [PATCH] Fixed handling of explicit reaction orders for some reactions For reactions with unity reactant stoichiometric coefficients, explicit values for the forward reaction order were being ignored while setting up the StoichManager. Added a few tests that confirm that these rates are being calculated correctly. --- include/cantera/kinetics/StoichManager.h | 3 +- test/python/runTests.py | 1 + test/python/testKinetics.py | 40 ++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 test/python/testKinetics.py diff --git a/include/cantera/kinetics/StoichManager.h b/include/cantera/kinetics/StoichManager.h index c54753959..265044061 100644 --- a/include/cantera/kinetics/StoichManager.h +++ b/include/cantera/kinetics/StoichManager.h @@ -827,8 +827,9 @@ public: m_n[rxn] = k.size(); bool frac = false; for (size_t n = 0; n < stoich.size(); n++) { - if (stoich[n] != 1.0) { + if (stoich[n] != 1.0 || order[n] != 1.0) { frac = true; + break; } } if (frac) { diff --git a/test/python/runTests.py b/test/python/runTests.py index fb6bd01f5..3c4dd8b9c 100644 --- a/test/python/runTests.py +++ b/test/python/runTests.py @@ -20,6 +20,7 @@ if __name__ == '__main__': loader = unittest.TestLoader() runner = unittest.TextTestRunner(verbosity=2) suite = loader.loadTestsFromName('testSolution') + suite = loader.loadTestsFromName('testKinetics') suite.addTests(loader.loadTestsFromName('testPureFluid')) suite.addTests(loader.loadTestsFromName('testEquilibrium')) suite.addTests(loader.loadTestsFromName('testReactors')) diff --git a/test/python/testKinetics.py b/test/python/testKinetics.py new file mode 100644 index 000000000..317a66b8e --- /dev/null +++ b/test/python/testKinetics.py @@ -0,0 +1,40 @@ +import utilities +import Cantera as ct + +class ExplicitForwardOrderTest(utilities.CanteraTest): + def setUp(self): + self.gas = ct.IdealGasMix('../data/explicit-forward-order.xml') + self.gas.set(T=800, P=101325, X=[0.01, 0.90, 0.02, 0.03, 0.04]) + + def test_irreversibility(self): + # Reactions are irreversible + Rr = self.gas.revRateConstants() + self.assertEqual(Rr[0], 0.0) + self.assertEqual(Rr[1], 0.0) + + def test_rateConstants(self): + # species order: [H, AR, R1A, R1B, P1] + + C = self.gas.moleFractions() * self.gas.molarDensity() + Rf = self.gas.fwdRatesOfProgress() + kf = self.gas.fwdRateConstants() + self.assertNear(Rf[0], kf[0] * C[2]**1.5 * C[3]**0.5) + self.assertNear(Rf[1], kf[1] * C[0]**1.0 * C[4]**0.2) + + def test_ratio1(self): + rop1 = self.gas.fwdRatesOfProgress() + # Double concentration of H and R1A + self.gas.set(T=800, P=101325, X=[0.02, 0.87, 0.04, 0.03, 0.04]) + rop2 = self.gas.fwdRatesOfProgress() + ratio = rop2/rop1 + self.assertNear(ratio[0], 2**1.5) # order of R1A is 1.5 + self.assertNear(ratio[1], 2**1.0) # order of H is 1.0 + + def test_ratio2(self): + rop1 = self.gas.fwdRatesOfProgress() + # Double concentration of P1 and R1B + self.gas.set(T=800, P=101325, X=[0.01, 0.83, 0.02, 0.06, 0.08]) + rop2 = self.gas.fwdRatesOfProgress() + ratio = rop2/rop1 + self.assertNear(ratio[0], 2**0.5) # order of R1B is 0.5 + self.assertNear(ratio[1], 2**0.2) # order of P1 is 1.0