@@ -3621,9 +3621,12 @@ def make_bm_rules_from_template_rxn_map(self, template_rxn_map, nprocs=1, Tref=1
36213621 inds = inds .tolist ()
36223622 revinds = [inds .index (x ) for x in np .arange (len (inputs ))]
36233623
3624- pool = mp .Pool (nprocs )
3624+ if nprocs > 1 :
3625+ pool = mp .Pool (nprocs )
3626+ kinetics_list = np .array (pool .map (_make_rule , inputs [inds ]))
3627+ else :
3628+ kinetics_list = np .array (list (map (_make_rule , inputs [inds ])))
36253629
3626- kinetics_list = np .array (pool .map (_make_rule , inputs [inds ]))
36273630 kinetics_list = kinetics_list [revinds ] # fix order
36283631
36293632 for i , kinetics in enumerate (kinetics_list ):
@@ -4670,3 +4673,61 @@ def _child_make_tree_nodes(family, child_conn, template_rxn_map, obj, T, nprocs,
46704673 extension_iter_max = extension_iter_max , extension_iter_item_cap = extension_iter_item_cap )
46714674
46724675 child_conn .send (list (family .groups .entries .values ()))
4676+
4677+ def average_kinetics (kinetics_list ):
4678+ """
4679+ Based on averaging log k.
4680+ Hence we average n, Ea, arithmetically, but we
4681+ average log A (geometric average)
4682+ """
4683+ logA = 0.0
4684+ n = 0.0
4685+ Ea = 0.0
4686+ count = 0
4687+ for kinetics in kinetics_list :
4688+ count += 1
4689+ logA += np .log10 (kinetics .A .value_si )
4690+ n += kinetics .n .value_si
4691+ Ea += kinetics .Ea .value_si
4692+
4693+ logA /= count
4694+ n /= count
4695+ Ea /= count
4696+
4697+ ## The above could be replaced with something like:
4698+ # logA, n, Ea = np.mean([[np.log10(k.A.value_si),
4699+ # k.n.value_si,
4700+ # k.Ea.value_si] for k in kinetics_list], axis=1)
4701+
4702+ Aunits = kinetics_list [0 ].A .units
4703+ if Aunits in {'cm^3/(mol*s)' , 'cm^3/(molecule*s)' , 'm^3/(molecule*s)' }:
4704+ Aunits = 'm^3/(mol*s)'
4705+ elif Aunits in {'cm^6/(mol^2*s)' , 'cm^6/(molecule^2*s)' , 'm^6/(molecule^2*s)' }:
4706+ Aunits = 'm^6/(mol^2*s)'
4707+ elif Aunits in {'s^-1' , 'm^3/(mol*s)' , 'm^6/(mol^2*s)' }:
4708+ # they were already in SI
4709+ pass
4710+ elif Aunits in {'m^2/(mol*s)' , 'cm^2/(mol*s)' , 'm^2/(molecule*s)' , 'cm^2/(molecule*s)' }:
4711+ # surface: bimolecular (Langmuir-Hinshelwood)
4712+ Aunits = 'm^2/(mol*s)'
4713+ elif Aunits in {'m^5/(mol^2*s)' , 'cm^5/(mol^2*s)' , 'm^5/(molecule^2*s)' , 'cm^5/(molecule^2*s)' }:
4714+ # surface: dissociative adsorption
4715+ Aunits = 'm^5/(mol^2*s)'
4716+ elif Aunits == '' :
4717+ # surface: sticking coefficient
4718+ pass
4719+ else :
4720+ raise Exception (f'Invalid units { Aunits } for averaging kinetics.' )
4721+
4722+ if type (kinetics ) not in [Arrhenius ,]:
4723+ raise Exception (f'Invalid kinetics type { type (kinetics )!r} for { self !r} .' )
4724+
4725+ if False :
4726+ pass
4727+ else :
4728+ averaged_kinetics = Arrhenius (
4729+ A = (10 ** logA , Aunits ),
4730+ n = n ,
4731+ Ea = (Ea * 0.001 , "kJ/mol" ),
4732+ )
4733+ return averaged_kinetics
0 commit comments