Use b instead of n for temperature exponent

Resolves Issue 198.
This commit is contained in:
Bryan W. Weber 2014-01-02 22:23:38 +00:00
parent d5a9da2b57
commit f8850963a0
3 changed files with 70 additions and 47 deletions

View file

@ -51,14 +51,17 @@ Arrhenius function
.. math::
k_f(T) = A T^n \exp(-E/\hat{R}T)
k_f(T) = A T^b \exp(-E/\hat{R}T)
which is defined with an :class:`Arrhenius` entry::
rate_coeff = Arrhenius(A=1.0e13, n=0, E=(7.3, 'kcal/mol'))
rate_coeff = Arrhenius(A=1.0e13, b=0, E=(7.3, 'kcal/mol'))
rate_coeff = Arrhenius(1.0e13, 0, (7.3, 'kcal/mol'))
As a shorthand, if the ``rate_coeff`` field is assigned a sequence of three numbers, these are assumed to be :math:`(A, n, E)` in the modified Arrhenius function::
Note: the usage of ``n`` as the temperature exponent has been deprecated. It is
still available in version 2.2 but will be removed.
As a shorthand, if the ``rate_coeff`` field is assigned a sequence of three numbers, these are assumed to be :math:`(A, b, E)` in the modified Arrhenius function::
rate_coeff = [1.0e13, 0, (7.3, 'kcal/mol')] # equivalent to above
@ -71,11 +74,11 @@ units of the rate of progress (different for homogeneous and heterogeneous
reactions), it is usually best not to specify units for *A*, in which case they
will be computed taking all of these factors into account.
Note: if :math:`n \ne 0`, then the term :math:`T^n` should have units of
:math:`K^n`, which would change the units of *A*. This is not done, however, so
Note: if :math:`b \ne 0`, then the term :math:`T^b` should have units of
:math:`K^b`, which would change the units of *A*. This is not done, however, so
the units associated with A are really the units for :math:`k_f` . One way to
formally express this is to replace :math:`T^n` by the non-dimensional quantity
:math:`[T/(1 K)]^n`.
formally express this is to replace :math:`T^b` by the non-dimensional quantity
:math:`[T/(1 K)]^b`.
The ID String
-------------
@ -147,9 +150,9 @@ combustion mechanism [#Smith1997]_ are shown below::
reaction( "O + HO2 <=> OH + O2", [2.00000E+13, 0.0, 0])
reaction( "O + H2O2 <=> OH + HO2", [9.63000E+06, 2.0, 4000])
reaction( "O + HCCO <=> H + 2 CO", [1.00000E+14, 0.0, 0])
reaction( "H + O2 + AR <=> HO2 + AR", [7.00000E+17, -0.8, 0])
reaction( "HO2 + C3H7 <=> O2 + C3H8", [2.55000E+10, 0.255, -943])
reaction( "HO2 + C3H7 => OH + C2H5 + CH2O", [2.41000E+13, 0.0, 0])
reaction( "H + O2 + AR <=> HO2 + AR", kf=Arrhenius(A=7.00000E+17, b=-0.8, E=0))
reaction( equation = "HO2 + C3H7 <=> O2 + C3H8", kf=Arrhenius(2.55000E+10, 0.255, -943))
reaction( equation = "HO2 + C3H7 => OH + C2H5 + CH2O", kf=[2.41000E+13, 0.0, 0])
Three-Body Reactions
====================

View file

@ -367,9 +367,9 @@ class Arrhenius(KineticsModel):
Represent a set of modified Arrhenius kinetics. The kinetic expression has
the form
.. math:: k(T) = A \\left( \\frac{T}{T_0} \\right)^n \\exp \\left( - \\frac{E_\\mathrm{a}}{RT} \\right)
.. math:: k(T) = A \\left( \\frac{T}{T_0} \\right)^b \\exp \\left( - \\frac{E_\\mathrm{a}}{RT} \\right)
where :math:`A`, :math:`n`, :math:`E_\\mathrm{a}`, and :math:`T_0` are the
where :math:`A`, :math:`b`, :math:`E_\\mathrm{a}`, and :math:`T_0` are the
parameters to be set, :math:`T` is absolute temperature, and :math:`R` is
the gas law constant. The attributes are:
@ -378,17 +378,17 @@ class Arrhenius(KineticsModel):
=============== =================== ========================================
`A` :class:`Quantity` The preexponential factor in s^-1, m^3/mol*s, etc.
`T0` :class:`Quantity` The reference temperature in K
`n` :class:`Quantity` The temperature exponent
`b` :class:`Quantity` The temperature exponent
`Ea` :class:`Quantity` The activation energy in J/mol
=============== =================== ========================================
"""
def __init__(self, A=0.0, n=0.0, Ea=0.0, T0=1.0, **kwargs):
def __init__(self, A=0.0, b=0.0, Ea=0.0, T0=1.0, **kwargs):
KineticsModel.__init__(self, **kwargs)
self.A = A
self.T0 = T0
self.n = n
self.b = b
self.Ea = Ea
def isPressureDependent(self):
@ -408,7 +408,7 @@ class Arrhenius(KineticsModel):
else:
Ea = "({0}, '{1}')".format(*self.Ea)
return '[{0}, {1}, {2}]'.format(A, self.n, Ea)
return '[{0}, {1}, {2}]'.format(A, self.b, Ea)
def to_cti(self, reactantstr, arrow, productstr, indent=0):
rxnstring = reactantstr + arrow + productstr
@ -420,7 +420,7 @@ class PDepArrhenius(KineticsModel):
A kinetic model of a phenomenological rate coefficient k(T, P) using the
expression
.. math:: k(T,P) = A(P) T^{n(P)} \\exp \\left[ \\frac{-E_\\mathrm{a}(P)}{RT} \\right]
.. math:: k(T,P) = A(P) T^{b(P)} \\exp \\left[ \\frac{-E_\\mathrm{a}(P)}{RT} \\right]
where the modified Arrhenius parameters are stored at a variety of pressures
and interpolated between on a logarithmic scale. The attributes are:
@ -452,7 +452,7 @@ class PDepArrhenius(KineticsModel):
rxnstring = reactantstr + arrow + productstr
lines = ['pdep_arrhenius({0!r},'.format(rxnstring)]
prefix = ' '*(indent+15)
template = '[({0}, {1!r}), {2.A[0]:e}, {2.n}, {2.Ea[0]}],'
template = '[({0}, {1!r}), {2.A[0]:e}, {2.b}, {2.Ea[0]}],'
for pressure,arrhenius in zip(self.pressures[0], self.arrhenius):
lines.append(prefix + template.format(pressure,
self.pressures[1],
@ -1046,7 +1046,7 @@ class Parser(object):
# The first line contains the reaction equation and a set of modified Arrhenius parameters
tokens = lines[0].split()
A = float(tokens[-3])
n = float(tokens[-2])
b = float(tokens[-2])
Ea = float(tokens[-1])
reaction = ''.join(tokens[:-3])
@ -1136,7 +1136,7 @@ class Parser(object):
# The rest of the first line contains Arrhenius parameters
arrhenius = Arrhenius(
A=(A,kunits),
n=n,
b=b,
Ea=(Ea, energy_units),
T0=(1,"K"),
parser=self
@ -1163,7 +1163,7 @@ class Parser(object):
tokens = tokens[1].split()
arrheniusLow = Arrhenius(
A=(float(tokens[0].strip()),klow_units),
n=float(tokens[1].strip()),
b=float(tokens[1].strip()),
Ea=(float(tokens[2].strip()),energy_units),
T0=(1,"K"),
parser=self
@ -1175,7 +1175,7 @@ class Parser(object):
tokens = tokens[1].split()
arrheniusHigh = Arrhenius(
A=(float(tokens[0].strip()),kunits),
n=float(tokens[1].strip()),
b=float(tokens[1].strip()),
Ea=(float(tokens[2].strip()),energy_units),
T0=(1,"K"),
parser=self
@ -1194,7 +1194,7 @@ class Parser(object):
tokens = tokens[1].split()
revReaction.kinetics = Arrhenius(
A=(float(tokens[0].strip()),klow_units),
n=float(tokens[1].strip()),
b=float(tokens[1].strip()),
Ea=(float(tokens[2].strip()),energy_units),
T0=(1,"K"),
parser=self
@ -1276,7 +1276,7 @@ class Parser(object):
tokens = tokens[1].split()
pdepArrhenius.append([float(tokens[0].strip()), Arrhenius(
A=(float(tokens[1].strip()),kunits),
n=float(tokens[2].strip()),
b=float(tokens[2].strip()),
Ea=(float(tokens[3].strip()),energy_units),
T0=(1,"K"),
parser=self

View file

@ -958,22 +958,42 @@ class rate_expression(object):
class Arrhenius(rate_expression):
def __init__(self,
A = 0.0,
n = 0.0,
b = 0.0,
E = 0.0,
coverage = [],
rate_type = ''):
rate_type = '',
n = None):
"""
:param A:
The pre-exponential coefficient. Required input. If entered without
units, the units will be computed considering all factors that
affect the units. The resulting units string is written to the CTML
file individually for each reaction pre-exponential coefficient.
:param n:
:param b:
The temperature exponent. Dimensionless. Default: 0.0.
:param E:
Activation energy. Default: 0.0.
:param coverage:
:param rate_type:
:param n:
The temperature exponent. Dimensionless. Default: 0.0. Deprecated usage
provided for compatibility.
"""
self._c = [A, n, E]
if n is not None and b != 0.0:
raise CTI_Error("n and b cannot both be specified for the "
"temperature exponent. Specify one or the other.")
elif n is not None and b == 0.0:
b = n
print("Warning: Usage of n to specify the temperature exponent is "
"deprecated and will be removed in a future version. Use b "
"to specify the temperature exponent by keyword. Please check "
"your cti file for places where the temperature exponent of "
"the reaction rate is set by n = XXX and change them to "
"b = XXX.")
self._c = [A, b, E]
self._type = rate_type
if coverage:
@ -1033,8 +1053,8 @@ reactant, but this reaction has """+str(ngas)+': '+str(gas_species))
c.addChild('m', repr(cov[2]))
addFloat(c, 'e', cov[3], fmt = '%f', defunits = _ue)
def stick(A = 0.0, n = 0.0, E = 0.0, coverage = []):
return Arrhenius(A = A, n = n, E = E, coverage = coverage, rate_type = 'stick')
def stick(A = 0.0, b = 0.0, E = 0.0, coverage = []):
return Arrhenius(A = A, b = b, E = E, coverage = coverage, rate_type = 'stick')
def getPairs(s):
@ -1059,10 +1079,10 @@ class reaction(object):
"""
:param equation:
A string specifying the chemical equation.
:param rate_coeff:
:param kf:
The rate coefficient for the forward direction. If a sequence of
three numbers is given, these will be interpreted as [A, n,E] in
the modified Arrhenius function :math:`A T^n exp(-E/\hat{R}T)`.
three numbers is given, these will be interpreted as [A, b, E] in
the modified Arrhenius function :math:`A T^b exp(-E/\hat{R}T)`.
:param id:
An optional identification string. If omitted, it defaults to a
four-digit numeric string beginning with 0001 for the first
@ -1224,7 +1244,7 @@ class reaction(object):
if isinstance(kf, rate_expression):
k = kf
else:
k = Arrhenius(A = kf[0], n = kf[1], E = kf[2])
k = Arrhenius(A = kf[0], b = kf[1], E = kf[2])
k.build(kfnode, self.unit_factor(), gas_species = self._igspecies,
name = nm, rxn_phase = self._rxnphase)
@ -1265,9 +1285,9 @@ class three_body_reaction(reaction):
A string specifying the chemical equation. The reaction can be
written in either the association or dissociation directions, and
may be reversible or irreversible.
:param rate_coeff:
:param kf:
The rate coefficient for the forward direction. If a sequence of
three numbers is given, these will be interpreted as [A,n,E] in
three numbers is given, these will be interpreted as [A, b, E] in
the modified Arrhenius function.
:param efficiencies:
A string specifying the third-body collision efficiencies.
@ -1346,14 +1366,14 @@ class falloff_reaction(pdep_reaction):
"""
:param equation:
A string specifying the chemical equation.
:param rate_coeff_inf:
:param kf:
The rate coefficient for the forward direction in the high-pressure
limit. If a sequence of three numbers is given, these will be
interpreted as [A, n,E] in the modified Arrhenius function.
:param rate_coeff_0:
interpreted as [A, b, E] in the modified Arrhenius function.
:param kf0:
The rate coefficient for the forward direction in the low-pressure
limit. If a sequence of three numbers is given, these will be
interpreted as [A, n,E] in the modified Arrhenius function.
interpreted as [A, b, E] in the modified Arrhenius function.
:param efficiencies:
A string specifying the third-body collision efficiencies. The
efficiency for unspecified species is set to 1.0.
@ -1392,11 +1412,11 @@ class chemically_activated_reaction(pdep_reaction):
:param kLow:
The rate coefficient for the forward direction in the low-pressure
limit. If a sequence of three numbers is given, these will be
interpreted as [A, n,E] in the modified Arrhenius function.
interpreted as [A, b, E] in the modified Arrhenius function.
:param kHigh:
The rate coefficient for the forward direction in the high-pressure
limit. If a sequence of three numbers is given, these will be
interpreted as [A, n,E] in the modified Arrhenius function.
interpreted as [A, b, E] in the modified Arrhenius function.
:param efficiencies:
A string specifying the third-body collision efficiencies. The
efficiency for unspecified species is set to 1.0.
@ -1436,9 +1456,9 @@ class pdep_arrhenius(reaction):
def __init__(self, equation='', *args, **kwargs):
self.pressures = []
self.arrhenius = []
for p, A, n, Ea in args:
for p, A, b, Ea in args:
self.pressures.append(p)
self.arrhenius.append((A, n, Ea))
self.arrhenius.append((A, b, Ea))
reaction.__init__(self, equation, self.arrhenius, **kwargs)
self._type = 'plog'
@ -1522,15 +1542,15 @@ class surface_reaction(reaction):
"""
:param equation:
A string specifying the chemical equation.
:param rate_coeff:
:param kf:
The rate coefficient for the forward direction. If a sequence of
three numbers is given, these will be interpreted as [A, n,E] in
three numbers is given, these will be interpreted as [A, b, E] in
the modified Arrhenius function.
:param sticking_prob:
The reactive sticking probability for the forward direction. This
can only be specified if there is only one bulk-phase reactant and
it belongs to an ideal gas phase. If a sequence of three numbers is
given, these will be interpreted as [A, n,E] in the modified
given, these will be interpreted as [A, b, E] in the modified
Arrhenius function.
:param id:
An optional identification string. If omitted, it defaults to a