5. Assembling the KMC Model and Writing the Input Files
The KMCModel class represents the complete KMC simulation model for Zacros.
Properties
GasModel: Contains gas-phase species definitions, including their molecular weights and energies.ReactionModel: Details elementary reaction steps, including initial/final states, activation energies, and vibrational energies.EnergeticsModel: Lists clusters and their energies, reflecting the cluster expansion used for energy calculations.LatticeModel: Describes the lattice structure, site types, and spatial arrangement of sites.
How to create the KMC Model
Create it in the same way as shown in the example below.
from zacrostools.kmc_model import KMCModel
from zacrostools.gas_model import GasModel
from zacrostools.reaction_model import ReactionModel
from zacrostools.energetics_model import EnergeticsModel
from zacrostools.lattice_model import LatticeModel
# Assume you have already prepared these data files
gas_model = GasModel.from_csv('gas_data.csv')
reaction_model = ReactionModel.from_csv('mechanism_data.csv')
energetics_model = EnergeticsModel.from_csv('energetics_data.csv')
# Define a lattice model
lattice_model = LatticeModel(
lattice_type='periodic_cell',
cell_vectors=((3.27, 0), (0, 3.27)),
sites={'tC': (0.25, 0.25), 'tM': (0.75, 0.75)},
copies=[10, 10],
neighboring_structure='from_distances',
max_distances={'tC-tC': 4.0, 'tC-tM': 4.0, 'tM-tM': 4.0},
)
# Create the KMCModel instance, integrating all components
kmc_model = KMCModel(
gas_model=gas_model,
reaction_model=reaction_model,
energetics_model=energetics_model,
lattice_model=lattice_model
)
Writing the input files
Once the KMCModel is created, you can generate the Zacros input files by calling the create_job_dir method.
Required parameters:
job_path(str): Directory where the input files will be written.temperature(floatorint): Simulation temperature in Kelvin.pressure(dict): Partial pressures of gas species in bar, e.g.,{'CO': 1.0, 'O2': 0.001}.reporting_scheme(dict, optional): Controls how often Zacros writes snapshots, process statistics, and species counts.stopping_criteria(dict, optional): Conditions to end the simulation (max steps, max time, wall time).manual_scaling(dict, optional): Apply scaling factors to specific reaction steps.stiffness_scaling_algorithm(str, optional): Algorithm for handling stiffness scaling ('legacy'or'prats2024').stiffness_scalable_steps(listofstr, optional): Steps that will be marked as'stiffness_scalable'in mechanism_input.dat. Can be provided as a list of step names or the string'all'to indicate that all steps (except those specified in `stiffness_scalable_symmetric_steps) are stiffness scalable.stiffness_scalable_symmetric_steps: (listofstr, optional): Steps that will be marked as'stiffness_scalable_symmetric'inmechanism_input.datstiffness_scaling_tags(dict, optional): Parameters controlling the dynamic scaling algorithm.sig_figs_energies(int, optional): Significant figures for energies written to input files.sig_figs_pe(int, optional): Significant figures for pre-exponential factors.sig_figs_lattice(int, optional): Significant figures for coordinates.random_seed(int, optional): Seed for Zacros’s random number generator.version(floatorint, optional): The Zacros version. Can be a single integer (e.g. 4) or float (e.g. 4.2 or 5.1). Default is 5.0.
kmc_model.create_job_dir(
job_path='kmc_simulation',
temperature=1000.0,
pressure={'CO': 1.0, 'O2': 0.001, 'CO2': 0.0},
reporting_scheme={
'snapshots': 'on event 10000',
'process_statistics': 'on event 10000',
'species_numbers': 'on event 10000'},
stopping_criteria={
'max_steps': 'infinity',
'max_time': 'infinity',
'wall_time': 86400},
manual_scaling={
'CO_diffusion': 1.0e-1,
'O_diffusion': 1.0e-2},
stiffness_scaling_algorithm=None,
sig_figs_energies=8,
sig_figs_pe=8,
)
The specified directory (kmc_simulation) will be created, containing all four Zacros input files.
Looping over pressure and temperature values
for temperature in [600, 700, 800]: # in K
for pCO in [0.01, 0.1, 1.0, 10]: # in bar
for pO2 in [0.01, 0.1, 1.0, 10]: # in bar
kmc_model.create_job_dir(
job_path=f'temp_{temperature}K_pCO_{pCO}bar_pO2_{pO2}bar',
temperature=temperature,
pressure={'CO': pCO, 'O2': pO2, 'CO2': 0.0},
reporting_scheme={
'snapshots': 'on event 100000',
'process_statistics': 'on event 100000',
'species_numbers': 'on event 100000'},
stopping_criteria={
'max_steps': 'infinity',
'max_time': 5.0e+06,
'wall_time': 250000}
)