Coordination measures#
The coordination number is the simplest and most widely used local descriptor of an atom’s environment. pyscal exposes three variants that progressively relax the assumption of a sharp cutoff.
Coordination number#
Given a neighbor list, the coordination number \(\mathrm{CN}(i)\) is just the number of neighbors of atom \(i\). It is meaningful when neighbors come from a well-defined criterion such as a cutoff at the first \(g(r)\) minimum.
import pyscal
from ase.io import read
atoms = read('conf.dump', format='lammps-dump-text')
pyscal.find_neighbors(atoms, method='cutoff', cutoff=3.5)
cn = pyscal.coordination_number(atoms)
Per-atom values are stored as atoms.arrays['pyscal_cn'].
Effective coordination number#
Hoppe [1] introduced an effective coordination number that smoothly weights each neighbor by its distance, removing the discontinuity of a hard cutoff. With \(r_{ij}\) the bond length to neighbor \(j\) and a self-consistently defined weighted average distance \(\bar{r}(i)\),
with
iterated to convergence. ECoN reproduces the integer coordination number for ideal lattices and varies smoothly otherwise.
econ = pyscal.effective_coordination_number(atoms)
Per-atom values are stored as atoms.arrays['pyscal_econ'].
Generalized coordination number#
The generalized coordination number \(\overline{\mathrm{CN}}(i)\) of Calle-Vallejo et al. [2] weights each neighbor by its own coordination,
where \(\mathrm{CN}_{\max}\) is the bulk coordination of the underlying lattice (12 for fcc, 8 for bcc, etc.). It is widely used as a descriptor for catalytic activity at metal surfaces.
gcn = pyscal.generalized_coordination_number(atoms, cn_max=12)
Per-atom values are stored as atoms.arrays['pyscal_gcn'].
References#
Hoppe, R. The Coordination Number – an “Inorganic Chameleon”. Angewandte Chemie International Edition 9, 25–34 (1970).
Calle-Vallejo, F. et al. Finding optimal surface sites on heterogeneous catalysts by counting nearest neighbors. Science 350, 185–189 (2015).