[Kinetics] Fix handling of integral, explicit reaction orders
If any of the reaction orders differ from the corresponding stoichiometric coefficients, the reaction needs to be handled as the general case, instead of just when the orders are non-integral.
This commit is contained in:
parent
6f7241b08b
commit
4efad93a6d
4 changed files with 29 additions and 4 deletions
|
|
@ -771,7 +771,7 @@ public:
|
|||
}
|
||||
bool frac = false;
|
||||
for (size_t n = 0; n < stoich.size(); n++) {
|
||||
if (fmod(stoich[n], 1.0) || fmod(order[n], 1.0)) {
|
||||
if (fmod(stoich[n], 1.0) || stoich[n] != order[n]) {
|
||||
frac = true;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -426,8 +426,8 @@ class ExplicitForwardOrderTest(utilities.CanteraTest):
|
|||
def test_irreversibility(self):
|
||||
# Reactions are irreversible
|
||||
Rr = self.gas.reverse_rate_constants
|
||||
self.assertEqual(Rr[0], 0.0)
|
||||
self.assertEqual(Rr[1], 0.0)
|
||||
for i in range(3):
|
||||
self.assertEqual(Rr[i], 0.0)
|
||||
|
||||
def test_rateConstants(self):
|
||||
# species order: [H, AR, R1A, R1B, P1]
|
||||
|
|
@ -436,6 +436,7 @@ class ExplicitForwardOrderTest(utilities.CanteraTest):
|
|||
kf = self.gas.forward_rate_constants
|
||||
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)
|
||||
self.assertNear(Rf[2], kf[2] * C[2]**3.0)
|
||||
|
||||
def test_ratio1(self):
|
||||
rop1 = self.gas.forward_rates_of_progress
|
||||
|
|
@ -445,6 +446,7 @@ class ExplicitForwardOrderTest(utilities.CanteraTest):
|
|||
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
|
||||
self.assertNear(ratio[2], 2**3) # order of R1A is 3
|
||||
|
||||
def test_ratio2(self):
|
||||
rop1 = self.gas.forward_rates_of_progress
|
||||
|
|
@ -454,6 +456,7 @@ class ExplicitForwardOrderTest(utilities.CanteraTest):
|
|||
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
|
||||
self.assertNear(ratio[2], 2**0.0) # order of R1B is 0
|
||||
|
||||
|
||||
class TestSofcKinetics(utilities.CanteraTest):
|
||||
|
|
|
|||
|
|
@ -13,8 +13,14 @@ REACTIONS
|
|||
R1A+R1B=>H+P1 1e12 0.0 20000.0
|
||||
FORD / R1A 1.5 /
|
||||
FORD / R1B 0.5 /
|
||||
DUPLICATE
|
||||
|
||||
H+P1=>R1A+R1B 5e13 -2.0 5000.0
|
||||
FORD / P1 0.2 /
|
||||
|
||||
R1A+R1B=>H+P1 1e12 0.0 20000.0
|
||||
FORD / R1A 3.0 /
|
||||
FORD / R1B 0.0 /
|
||||
DUPLICATE
|
||||
|
||||
END
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@
|
|||
<reactionData id="reaction_data">
|
||||
|
||||
<!-- reaction 0001 -->
|
||||
<reaction reversible="no" id="0001">
|
||||
<reaction duplicate="yes" reversible="no" id="0001">
|
||||
<equation>R1A + R1B =] H + P1</equation>
|
||||
<order species="R1B">0.5</order>
|
||||
<order species="R1A">1.5</order>
|
||||
|
|
@ -138,5 +138,21 @@
|
|||
<reactants>H:1.0 P1:1</reactants>
|
||||
<products>R1B:1 R1A:1.0</products>
|
||||
</reaction>
|
||||
|
||||
<!-- reaction 0003 -->
|
||||
<reaction duplicate="yes" reversible="no" id="0003">
|
||||
<equation>R1A + R1B =] H + P1</equation>
|
||||
<order species="R1B">0.0</order>
|
||||
<order species="R1A">3.0</order>
|
||||
<rateCoeff>
|
||||
<Arrhenius>
|
||||
<A>1.000000E+06</A>
|
||||
<b>0.0</b>
|
||||
<E units="cal/mol">20000.000000</E>
|
||||
</Arrhenius>
|
||||
</rateCoeff>
|
||||
<reactants>R1B:1 R1A:1.0</reactants>
|
||||
<products>H:1.0 P1:1</products>
|
||||
</reaction>
|
||||
</reactionData>
|
||||
</ctml>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue