From 14b014ef78484ebec27b2c8f95031689c22d496a Mon Sep 17 00:00:00 2001 From: Sevy Harris Date: Thu, 16 Apr 2026 12:54:19 -0400 Subject: [PATCH] Add surface sensitivity to uncertainty tool --- rmgpy/tools/uncertainty.py | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/rmgpy/tools/uncertainty.py b/rmgpy/tools/uncertainty.py index a23c314362..38576dca8c 100644 --- a/rmgpy/tools/uncertainty.py +++ b/rmgpy/tools/uncertainty.py @@ -961,7 +961,8 @@ def assign_intermediate_uncertainties(self, g_param_engine=None, k_param_engine= self.kinetic_intermediate_uncertainties.append(dlnkdq) def sensitivity_analysis(self, initial_mole_fractions, sensitive_species, T, P, termination_time, - sensitivity_threshold=1e-3, number=10, fileformat='.png'): + sensitivity_threshold=1e-3, number=10, fileformat='.png', initial_surface_coverages=None, + surface_volume_ratio=None, surface_site_density=2.72e-5): """ Run sensitivity analysis using the RMG solver in a single ReactionSystem object @@ -970,7 +971,7 @@ def sensitivity_analysis(self, initial_mole_fractions, sensitive_species, T, P, number is the number of top species thermo or reaction kinetics desired to be plotted """ - from rmgpy.solver import SimpleReactor, TerminationTime + from rmgpy.solver import SimpleReactor, SurfaceReactor, TerminationTime from rmgpy.quantity import Quantity from rmgpy.rmg.listener import SimulationProfileWriter, SimulationProfilePlotter from rmgpy.rmg.settings import ModelSettings, SimulatorSettings @@ -978,12 +979,29 @@ def sensitivity_analysis(self, initial_mole_fractions, sensitive_species, T, P, P = Quantity(P) termination = [TerminationTime(Quantity(termination_time))] - reaction_system = SimpleReactor(T=T, - P=P, - initial_mole_fractions=initial_mole_fractions, - termination=termination, - sensitive_species=sensitive_species, - sensitivity_threshold=sensitivity_threshold) + surface_mech = any([x.contains_surface_site() for x in self.species_list]) + if surface_mech: + assert surface_volume_ratio is not None, 'Must provide surface_volume_ratio for sensitivity analysis of surface mechanisms' + surface_volume_ratio = Quantity(surface_volume_ratio) + + if not surface_mech: + reaction_system = SimpleReactor(T=T, + P=P, + initial_mole_fractions=initial_mole_fractions, + termination=termination, + sensitive_species=sensitive_species, + sensitivity_threshold=sensitivity_threshold) + else: + reaction_system = SurfaceReactor(T=T, + P_initial=P, + initial_gas_mole_fractions=initial_mole_fractions, + initial_surface_coverages=initial_surface_coverages, + surface_volume_ratio=surface_volume_ratio, + surface_site_density=surface_site_density, + n_sims=1, + termination=termination, + sensitive_species=sensitive_species, + sensitivity_threshold=sensitivity_threshold) # Create the csv worksheets for logging sensitivity util.make_output_subdirectory(self.output_directory, 'solver')