4
$\begingroup$

I would like to make formate-adsorbed surface on Cu(111). I have prepared the Cu(111) by ASE:

import numpy as np
from ase.build import surface
from ase.io import write, read
from ase.build import molecule
from ase.build import add_adsorbate

# Create the copper surface
slab = surface('Cu', (1, 1, 1), 4)
slab = slab.repeat((4, 4, 1))
slab.center(vacuum=10, axis=2)

How can I put 10 formated ions on the surface (in bidentate form) randomly? I don't know how to specify the ASE code to determine the ion as bidentate form, as well as the position of the adsorbates.

$\endgroup$

2 Answers 2

5
$\begingroup$

ASE doesn't support adding multiple adsorbates. If you use the ase.build.add_adsorbate function multiple times, it will unfortunately add adsorbates to the same pre-defined position. This is a typical situation where you may consider using ACAT. For your example, this can be simply achieved by the following code:

from ase.build import surface
from ase.visualize import view
from acat.build.adlayer import max_dist_coverage_pattern as mdcp
from acat.settings import site_heights

# Create the copper surface
slab = surface('Cu', (1, 1, 1), 4)
slab = slab.repeat((4, 4, 1))
slab.center(vacuum=10, axis=2)
# Add more heights to the CHOO*
heights = {k: v+0.5 for k, v in site_heights.items()}
# Generate a random surface coverage pattern with 10 CHOO*
atoms = mdcp(slab, adsorbate_species='CHOO', coverage=10/64,
             surface='fcc111', heights=heights)
view(atoms)

enter image description here

Now if you want to rotate the bidentate adsorbates, you can use ASE-GUI to do that, or if you want completely random generation, including the rotation of multidentate adsorbate species, you can use acat.build.RandomPatternGenerator. It also allows you to specify which sites are not allowed to adsorb, and the minimum distance between two adsorbates. Below is an example:

from ase.io import read
from ase.build import surface
from ase.visualize import view
from acat.build.adlayer import RandomPatternGenerator as RPG
from acat.settings import site_heights

# Create the copper surface
slab = surface('Cu', (1, 1, 1), 4)
slab = slab.repeat((4, 4, 1))
slab.center(vacuum=10, axis=2)
# Add more heights to the CHOO*
heights = {k: v+0.5 for k, v in site_heights.items()}
gen = RPG(slab, adsorbate_species='CHOO',
          min_adsorbate_distance=1.5,
          surface='fcc111',
          heights=heights,
          species_forbidden_sites={'CHOO': ['ontop','bridge']},
          trajectory='Cu_111_10CHOO.traj')
gen.run(num_gen=1, action='add', num_act=10)
atoms = read('Cu_111_10CHOO.traj')
view(atoms)

enter image description here

Disclaimer: I am the developer of ACAT.

$\endgroup$
2
  • 1
    $\begingroup$ Thank you for your suggestion. I will try using ACAT. $\endgroup$
    – Tommy Wang
    Oct 27, 2023 at 4:18
  • $\begingroup$ This is why there is an cell keyword which takes an (X, Y) offset for the next adsorbate when using ASE. $\endgroup$ Dec 30, 2023 at 15:02
1
$\begingroup$

You can change the "offset" parameter in ase.build.add_adsorbate to add multiple adsorbates. For example,add_adsorbate(slab,ad,adh,site,offset=(2,1)). As explained in the ASE doc site the adsorbate is added in the order of number of unit cells.

offset (default: None): Offsets the adsorbate by a number of unit cells. Mostly useful when adding more than one adsorbate.

ase.build.add_adsorbate(slab, adsorbate, height, position=(0, 0), offset=None, mol_index=0)

$\endgroup$
1
  • 1
    $\begingroup$ Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center. $\endgroup$
    – Community Bot
    Mar 30 at 20:05

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .