2. Creating the Energetics Model
The EnergeticsModel stores information about each cluster included in the cluster expansion.
Properties
cluster_eng(float): Cluster formation energy (eV).lattice_state(list[str]): Cluster configuration (e.g.,['1 CO* 1', '2 CO* 1']).site_types(str, optional): Site types (required iflattice_type='periodic_cell').neighboring(str, optional): Connectivity between sites (e.g.,'1-2'; default =None).angles(str, optional): Angle constraints (e.g.,'1-2-3:180'; default =None).graph_multiplicity(int, optional): Graph multiplicity (default =None).
How to create it
You can provide a dictionary where each key is a cluster name and each value is a dictionary of cluster properties:
from zacrostools.energetics_model import EnergeticsModel
clusters_data = {
'CO_point': {
'cluster_eng': 0.230,
'site_types': 'top',
'lattice_state': ['1 CO* 1']
},
'O_point': {
'cluster_eng': -1.326,
'site_types': 'top',
'lattice_state': ['1 O* 1']
},
'CO2_point': {
'cluster_eng': -1.571,
'site_types': 'top',
'lattice_state': ['1 CO2* 1']
},
'C_point': {
'cluster_eng': 2.442,
'site_types': 'top',
'lattice_state': ['1 C* 1']
},
'CO+O_pair': {
'cluster_eng': -0.032,
'site_types': 'top top',
'lattice_state': ['1 CO* 1', '2 O* 1'],
'neighboring': '1-2'
},
'O+O_pair': {
'cluster_eng': 0.033,
'site_types': 'top top',
'lattice_state': ['1 O* 1', '2 O* 1'],
'neighboring': '1-2',
'graph_multiplicity': 2.0
}
}
energetics_model = EnergeticsModel.from_dict(clusters_data)
Alternatively, it can also be created from a CSV file. In this case, the indexes must correspond to the cluster names:
from zacrostools.energetics_model import EnergeticsModel
energetics_model = EnergeticsModel.from_csv('energetics_data.csv')
Finally, it can also be created from a Pandas dataframe:
import pandas as pd
from zacrostools.energetics_model import EnergeticsModel
df = pd.read_csv("energetics_data.csv") # or create dataframe directly
energetics_model = EnergeticsModel.from_df(df)
Adding and removing clusters
Use the add_cluster method to add a new cluster:
new_cluster = {
'cluster_name': 'new_cluster',
'cluster_eng': 1.0,
'site_types': 'top top',
'lattice_state': ['1 CO* 1', '2 C* 1'],
'neighboring': '1-2'
}
energetics_model.add_cluster(cluster_info=new_cluster)
Use the remove_clusters method to remove clusters by name:
energetics_model.remove_clusters(['CO2_point'])
Writing the energetics_input.dat file
The EnergeticsModel can generate the energetics_input.dat file required by Zacros:
Required parameters:
output_dir(strorPath): Directory where the file will be written.sig_figs_energies(int, optional): Number of significant figures for cluster energies.
energetics_model.write_energetics_input(output_dir='kmc_simulation', sig_figs_energies=3)
This will generate a file named energetics_input.dat in the kmc_simulation directory.
Accessing energetics data
The cluster data is stored internally as a Pandas DataFrame, accessible via the df attribute.
print(energetics_model.df)
Full example
Below is an example demonstrating the creation and modification of an EnergeticsModel:
from zacrostools.energetics_model import EnergeticsModel
# Initial cluster data
clusters_data = {
'CO_point': {
'cluster_eng': 0.230,
'site_types': 'top',
'lattice_state': ['1 CO* 1']
},
'O_point': {
'cluster_eng': -1.326,
'site_types': 'top',
'lattice_state': ['1 O* 1']
}
}
# Create the EnergeticsModel instance
energetics_model = EnergeticsModel.from_dict(clusters_data)
# Add a new cluster
energetics_model.add_cluster(cluster_info={
'cluster_name': 'CO2_point',
'cluster_eng': -1.571,
'site_types': 'top',
'lattice_state': ['1 CO2* 1']
})
# Remove an existing cluster
energetics_model.remove_clusters(['O_point'])
# Write the energetics input file
energetics_model.write_energetics_input(output_dir='kmc_simulation')
# Access the DataFrame
print(energetics_model.df)