@@ -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