Skip to main content
`Ctrl`+`K`

# Activity 3: Adsorbates and the single scattering approach

Photoelectron diffraction is widely used to study the adsorption of atoms or molecules on a crystalline surface. Photoelectrons from adsorbates are scattered by the underlying surface, carrying information about the adsorption site, bond length and/or molecule orientation…. Thanks to a simulation, such information becomes quantitative with a high degree of accuracy.

Calculations of the multiple scattering using matrix inversion have the great advantage of being exact, including all scattering paths. On the other hand, memory consumption soon becomes a problem as the kinetic energy and number of atoms to be considered increase. As an approximation, it is possible to only consider a single scattering from the emitter to any atom in the cluster. This approximation is extremely computationally fast and can give satisfactory results for adsorbates. We’ll see later that this approach is rather too simplistic for most cases.

## Oxygen on Rh(001)

In a paper published in 1998, T. Gerber et al. used the quite high backscattering factor of Rhodium atoms to probe the distance of Oxygen atoms adsorbed on a Rhodium surface. Some electrons coming from Oxygen atoms are ejected toward the Rhodium surface. They are then backscattered and interfere with the direct signal comming from Oxygen atoms (see the figure below). They demonstrated both experimentally and numerically with a sinle scattering computation that this lead to a very accurate probe of adsorbed species that can be sensitive to bond length changes of the order of \(\pm 0.02 \mathring{A}\).

See also

based on this paper from T. Greber et al. Phys. Rev. Lett. 81(8) p1654 (1998)

Interferences produced by the backscattering effect

### Computing the scattering factor

To illustrate that photoelectrons emitted by Oxygen adsorbates towards the Rhodium surface can be backscattered, we will start by computing the scattering factor for both O and Rh atoms.

Quiz

By using the `Atoms` class of the `ase` package, try to build a O-Rh chain where atoms are 4 Å apart. Here is the begining of the script. Try to complete the line of code and view your two-atoms chain.

    from ase import Atoms
    from ase.visualize import view

    # Create an atomic chain O-Rh
    cluster = Atoms(... # Fill this line

ASE atomic visualization

As previously, we create a calculator, we attach our 2 atoms cluster to this calculator and we define the first atom in the chain as the emitter

    calc = MSSPEC(spectroscopy='PED')
    calc.set_atoms(cluster)
    cluster.emitter = 0

Quiz

We use the `get_scattering_factors` method (see its documentation) to compute the scattering factors at 723 eV.

How large is the backscattering factor of Rhodium with respect to that of Oxygen ?

### Interferences due to backscattering

Let an Oxygen atom (in red) being adsorbed at a distance \(z_0\) of an fcc site of the Rh(111) surface.

Small cluster used for the calculation.

We will compute for different values of the adsorption height \(z_0\).

Quiz

Complete the script below to compute the (\(\theta,\phi\)) scan of the photodiffraction of O(1s) adsorbed on a fcc site on Rh(111) surface.

     1from msspec.calculator import MSSPEC
     2from ase.build import fcc111, add_adsorbate
     3import numpy as np
     4
     5data = None
     6all_z = ... # -> Define a list of z values for the adsorbate
     7
     8for ... # -> Complete this for-loop over z values
     9    # construct the cluster
    10    cluster = fcc111('Rh', size = (2,2,1))
    11    cluster.pop(3)
    12    add_adsorbate(... # -> Put the oxygen atom on the fcc site
    13    cluster.emitter = ... # -> Oxygen is the last atom we added, so the indice is...
    14
    15    # Define a calculator for single scattering calculations
    16    calc = MSSPEC(spectroscopy='PED', algorithm='expansion')
    17    calc.calculation_parameters.scattering_order = 1
    18    calc.set_atoms(cluster)
    19
    20    # Compute
    21    data = calc.get_theta_phi_scan(level='1s', kinetic_energy=723, data=data)
    22
    23data.view()

As proposed in the comments, add a loop to vary the adsorption height of Oxygen between 1.10 and 1.65 Å. What is the bond length difference between to intensity maxima ?