Skip to content

Commit 23f3962

Browse files
mjohnson541ssun30
authored andcommitted
handle kinetics averaging for Marcus
1 parent d72cbc5 commit 23f3962

1 file changed

Lines changed: 50 additions & 34 deletions

File tree

rmgpy/data/kinetics/family.py

Lines changed: 50 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4772,36 +4772,9 @@ def average_kinetics(kinetics_list):
47724772
Hence we average n, Ea, arithmetically, but we
47734773
average log A (geometric average)
47744774
"""
4775-
logA = 0.0
4776-
n = 0.0
4777-
Ea = 0.0
4778-
alpha = 0.5
4779-
electrons = None
4780-
if isinstance(kinetics_list[0], (SurfaceChargeTransfer, ArrheniusChargeTransfer)):
4781-
if electrons is None:
4782-
electrons = kinetics_list[0].electrons.value_si
4783-
if not all(np.abs(k.V0.value_si) < 0.0001 for k in kinetics_list):
4784-
raise ValueError(f"Trying to average charge transfer rates with non-zero V0 values: {[k.V0.value_si for k in kinetics_list]}")
4785-
if not all(np.abs(k.alpha.value_si - 0.5) < 0.001 for k in kinetics_list):
4786-
raise ValueError(f"Trying to average charge transfer rates with alpha values not equal to 0.5: {[k.alpha for k in kinetics_list]}")
4787-
V0 = 0.0
4788-
count = 0
4789-
for kinetics in kinetics_list:
4790-
count += 1
4791-
logA += np.log10(kinetics.A.value_si)
4792-
n += kinetics.n.value_si
4793-
Ea += kinetics.Ea.value_si
4794-
4795-
logA /= count
4796-
n /= count
4797-
alpha /= count
4798-
Ea /= count
4799-
4800-
## The above could be replaced with something like:
4801-
# logA, n, Ea = np.mean([[np.log10(k.A.value_si),
4802-
# k.n.value_si,
4803-
# k.Ea.value_si] for k in kinetics_list], axis=1)
4804-
4775+
if type(kinetics_list[0]) not in [Arrhenius,SurfaceChargeTransfer,ArrheniusChargeTransfer,Marcus]:
4776+
raise Exception('Invalid kinetics type {0!r} for {1!r}.'.format(type(kinetics), self))
4777+
48054778
Aunits = kinetics_list[0].A.units
48064779
if Aunits in {'cm^3/(mol*s)', 'cm^3/(molecule*s)', 'm^3/(molecule*s)'}:
48074780
Aunits = 'm^3/(mol*s)'
@@ -4820,12 +4793,55 @@ def average_kinetics(kinetics_list):
48204793
# surface: sticking coefficient
48214794
pass
48224795
else:
4823-
raise ValueError(f'Invalid units {Aunits} for averaging kinetics.')
4796+
raise Exception('Invalid units {0} for averaging kinetics.'.format(Aunits))
4797+
4798+
logA = 0.0
4799+
n = 0.0
4800+
Ea = 0.0
4801+
alpha = 0.5
4802+
lmbd_i_coefs = np.zeros(4)
4803+
beta = 0.0
4804+
wr = 0.0
4805+
wp = 0.0
4806+
electrons = None
4807+
if isinstance(kinetics_list[0], SurfaceChargeTransfer) or isinstance(kinetics_list[0], ArrheniusChargeTransfer):
4808+
if electrons is None:
4809+
electrons = kinetics_list[0].electrons.value_si
4810+
assert all(np.abs(k.V0.value_si) < 0.0001 for k in kinetics_list), [k.V0.value_si for k in kinetics_list]
4811+
assert all(np.abs(k.alpha.value_si - 0.5) < 0.001 for k in kinetics_list), [k.alpha for k in kinetics_list]
4812+
V0 = 0.0
4813+
count = 0
4814+
for kinetics in kinetics_list:
4815+
count += 1
4816+
logA += np.log10(kinetics.A.value_si)
4817+
n += kinetics.n.value_si
4818+
if hasattr(kinetics,"Ea"):
4819+
Ea += kinetics.Ea.value_si
4820+
if hasattr(kinetics,"lmbd_i_coefs"):
4821+
lmbd_i_coefs += kinetics.lmbd_i_coefs.value_si
4822+
beta += kinetics.beta.value_si
4823+
wr += kinetics.wr.value_si
4824+
wp += kinetics.wp.value_si
48244825

4825-
if type(kinetics) not in {Arrhenius, SurfaceChargeTransfer, ArrheniusChargeTransfer}:
4826-
raise TypeError(f'Invalid kinetics type {type(kinetics)!r} for {self!r}.')
4826+
logA /= count
4827+
n /= count
4828+
Ea /= count
4829+
lmbd_i_coefs /= count
4830+
beta /= count
4831+
wr /= count
4832+
wp /= count
48274833

4828-
if isinstance(kinetics, SurfaceChargeTransfer):
4834+
if isinstance(kinetics, Marcus):
4835+
averaged_kinetics = Marcus(
4836+
A=(10 ** logA, Aunits),
4837+
n=n,
4838+
lmbd_i_coefs=lmbd_i_coefs,
4839+
beta=(beta,"1/m"),
4840+
wr=(wr * 0.001, "kJ/mol"),
4841+
wp=(wp * 0.001, "kJ/mol"),
4842+
comment="Averaged from {} reactions.".format(len(kinetics_list)),
4843+
)
4844+
elif isinstance(kinetics, SurfaceChargeTransfer):
48294845
averaged_kinetics = SurfaceChargeTransfer(
48304846
A=(10 ** logA, Aunits),
48314847
n=n,

0 commit comments

Comments
 (0)