openmaterials.ai / codes / AtomisticSkills mat-surface-adsorption
An AtomisticSkills skill that cuts a slab from a bulk crystal, places an adsorbate on every ontop, bridge and hollow site and relaxes each with a machine-learned potential.
AdsorptionCalc relaxes the bulk, cuts the slab at the given Miller index, relaxes the clean slab and the gas-phase molecule, then relaxes the adsorbate on each site. Each site's adsorption energy is the difference in eV.
Models trained on Open Catalyst data come first: EquiformerV2 S2EF-OC20, UMA uma-s-1p1 and MACE-OMAT-0. MPtrj-only models are discouraged for their force errors.
The slab is at least 10 A thick and the vacuum at least 20 A by default. The adsorbate starts 0.9 A above the surface. --adsorption_sites picks ontop, bridge or hollow.
By default ASE BFGS relaxes the bulk, the clean slab and the adsorbate to fmax 0.05 eV/A within 500 steps. Each of the three relaxations has a flag to switch it off.
Inputs are a bulk CIF or POSCAR, an adsorbate XYZ or SMILES string and a Miller index such as [1,1,1]. adsorption_results.json lists every site and the most stable one.
The worked example relaxes CO on the ontop, bridge and hollow sites of a Cu(111) slab with MACE-OMAT-0-small. The README gives -0.5 to -1.5 eV as typical, ontop usually most stable. CO on Cu(111) example README
Choose an OC-trained model and a Miller index. Supply the bulk and adsorbate files.
calculate_adsorption.py relaxes the bulk and cuts a slab, 10 A of material, 20 A vacuum.
The adsorbate is set 0.9 A above each ontop, bridge and hollow site and relaxed.
adsorption_results.json gives E_ads per site and names the most stable site.