Adsorbate-adsorbate interactionsΒΆ

Adsorbate-adsorbate interactions are implemented by checking site-occupations dynamically in the get_rate() methods of the events. As an example, here we define a method get_repulsion() in to return the repulsion between species 1 and 2, represented as a list of lists:

def get_repulsion(cov_self, cov_NN, stype):

    stype_factor = 0.5 if stype in [0, 1] else 1.0
    repulsion = 0.
    ECOCO = 0.19  #  How CO affects CO (eV).
    EOO = 0.32  # How O affects O (eV) - double since it is called from get barrier of O2.

    ECOO = 0.3  # How CO affects O (eV).
    EOCO = 0.3  # How O affects CO (eV).

    HInttwo = [[0., 0., 0.], [0., ECOCO, EOCO],
               [0., ECOO, EOO]]  # Two body interaction Hamiltonian 3x3 because 0 = empty.

    for j in cov_NN:  # For each covered Neighbor, give a repulsion:
        repulsion += HInttwo[cov_self][j]

    repulsion *= stype_factor  # Half the repulsion if edge/corner.

    return repulsion

Here, if stype is 0 or 1 (corner or edge), the repulsions are halved in strength. The repulsions can be implemented in the get_rate() methods of the events as

class COOxEvent(EventBase):
    def get_rate(self, system, site, other_site):
        stype = system.sites[site].stype
        stype_other = system.sites[other_site].stype

        ECO = EadsCO[stype]
        EO = EadsO[stype_other]

        # Find the repulsion
        # from the site-occupations:
        Ncovs = [system.sites[n].covered for n in
        Nothercovs = [system.sites[n].covered for n
                      in system.neighbors[other_site]]

        # Subtract repulsion from binding energies:
        ECO -= get_repulsion(1, Ncovs, stype)
        EO -= get_repulsion(2, Nothercovs, stype_other)

        # Get activation energy from BEP relation:
        Ea = max(0., get_Ea(ECO, EO)) # not < 0.

        return self.alpha * self.Zratio * np.exp(-Ea /
                    (kB * self.params['T'])) * kB * self.params['T'] / h

If next nearest neighbor interactions are to be implemented, this example should be extended to access the neighbors of the neighbors. If this is done, remember to change nninteractions in kMC_options.cfg to update newly enabled events properly after each event execution.