Finding and Integrating Maxima of the ELF

In this example we will see how to use the basin integration methods (YT and BADER) to: a) find and visualize the maxima of the electron localization function (ELF) in solids and molecules, and b) integrate the electron density in the basins associated to the ELF maxima.

ELF basins in molecules

We start with a simple example of a molecular calculation. The following Gaussian input calculates the pyridine molecule using B3LYP/6-31+G**. We ask Gaussian to generate a wavefunction file (with extension .wfx; the old extension .wfn is also accepted by critic2) containing the converged Kohn-Sham orbitals:

#p b3lyp 6-31+G** output=wfx int=(grid=ultrafine)
0 1
N       0.000000 0.000000 1.417497
C       0.000000 0.000000 -1.382528
C       0.000000 1.139575 0.720388
C       0.000000 -1.139575 0.720388
C       0.000000 -1.195555 -0.671305
C       0.000000 1.195555 -0.671305
H       0.000000 0.000000 -2.467674
H       0.000000 2.056798 1.305138
H       0.000000 -2.056798 1.305138
H       0.000000 -2.153584 -1.179452
H       0.000000 2.153584 -1.179452


Running this input generates a pyridine.wfx file that we now use to calculate the ELF and find its maxima.

The wfx file contains both structural information and the exponents and coefficients for the Kohn-Sham orbitals and the electron density. We load this information in critic by first reading the structure:

molecule pyridine.wfx

and then loading the same file as a scalar field:

load pyridine.wfx id wfx

Using the keyword id, we indicate that we are going to refer to this field using the wfx label in the rest of the input.

In order to use YT to find and integrate the maxima of the ELF, we first need to transform the analytical representation of the wavefunction into a grid of values. This is done by loading new scalar fields as transformation of the wfx field, with the LOAD keyword. For instance, we define a grid with 150 points in each direction containing the electron density from the wfx file with:

load as "$wfx" 150 150 150 id rho

This loads a new field (with identifier rho) that is a grid in real space instead of a sum of Gaussians. We now do the same with the ELF:

load as "elf(wfx)" sizeof rho id elf

In this case, the expression elf(wfx) has critic2 calculate the ELF from the data in wfx at every point in the grid. Because we used sizeof rho, the new grid will have the same number of points and dimensions as the rho grid. Finally, we attach the identifier elf to it.

These newly created scalar fields can be written to .cube files for later use (in larger systems, it may take a while to generate them). This is done with the CUBE keyword:

cube grid file rho.cube field rho
cube grid file elf.cube field elf

These two commands write new cube files containing the density (rho.cube) and the ELF (elf.cube) represented by the corresponding fields rho and elf. The grid keyword is used to tell critic to use the same number of points and grid dimensions as contained in those fields (it is possible to create smaller or bigger grids using CUBE as well). Once these cube files have been written, subsequent runs of the same input can simply start with:

molecule pyridine.wfx
load rho.cube id rho
load elf.cube id elf

which avoids having to recalculate the grid values.

To find the ELF maxima with YT, first we declare the elf grid as the reference field:

reference elf

then, since we want to calculate the average number of electrons in each ELF basin, we declare the rho field as an integrable quantity:

integrable rho

Finally, we run the integration:

yt nnm discard "$elf < 0.1"

The ELF has maxima at the bonds, and these maxima are non-nuclear, since they are not associated to any particular atom. Therefore, we need to use the nnm keyword. In addition, the DISCARD keyword is used to disregard any maxima whose ELF value is lower than 0.1 (and, therefore, not associated to any covalent bond or electron pair). These may appear due to numerical inaccuracies in the interstitial, and they would simply contaminate the output. The result of the integration is:

* Integrated atomic properties
# (See key above for interpretation of column headings.)
# Integrable properties 1 to 3
# Id   cp   ncp   Name  Z   mult       Pop             Lap            $rho
  1    1    1      N1   7   --   1.69040343E-01 -3.36536386E-01  4.23168042E+00
  2    2    2      C2   6   --   3.16018270E-01 -6.60711404E-04  2.06332022E+00
  3    3    3      C3   6   --   3.20914232E-01  2.06364439E-02  2.37972397E+00
  4    4    4      C4   6   --   3.20914232E-01  2.06364439E-02  2.37972397E+00
  5    5    5      C5   6   --   3.19010120E-01 -1.22013954E-02  2.14206761E+00
  6    6    6      C6   6   --   3.19010120E-01 -1.22013954E-02  2.14206761E+00
  7    7    7      H7   1   --   5.34770421E+01 -6.97244745E-02  2.14582136E+00
  8    8    8      H8   1   --   5.26774462E+01 -1.29172804E-01  2.16747255E+00
  9    9    9      H9   1   --   5.26774462E+01 -1.29172804E-01  2.16747255E+00
  10   10   10    H10   1   --   5.21464355E+01 -1.83461044E-01  2.13683564E+00
  11   11   11    H11   1   --   5.21464355E+01 -1.83461044E-01  2.13683564E+00
  12    --   --    ??   --  --   4.87705842E+01  4.30200995E-01  2.78846605E+00
  13    --   --    ??   --  --   2.57120833E+01  4.73765512E-01  2.90356132E+00
  14    --   --    ??   --  --   2.57120833E+01  4.73765512E-01  2.90356132E+00
  15    --   --    ??   --  --   2.09584586E+01  8.29195352E-03  2.71656580E+00
  16    --   --    ??   --  --   2.09584586E+01  8.29195352E-03  2.71656580E+00
  17    --   --    ??   --  --   9.54503695E+00 -1.89498378E-01  2.31494522E+00
  18    --   --    ??   --  --   9.54503695E+00 -1.89498378E-01  2.31494522E+00
  Sum                            4.26091455E+02 -6.92668145E-12  4.47516323E+01

There are several things to note. First, the column labeled “Pop” represents the integral of the ELF in its own basins, and therefore is not a very interesting quantity. The “Lap” field is the integral of the Laplacian of the ELF; its use is only to make sure that the integration is giving reasonable values (the integrated Laplacian should be close to zero). The last column (“$rho”) is the integral of the electron density in the basins of the ELF. Note that the total integrated number of electrons is 44.7 but should be 42 for this molecule. This is because grids cannot represent very well the electron density close to the nuclei. However, the electron populations in the valence basins, labeled in the output with “??”, should be more or less correct.

YT has determined the position of the maxima and now we would like to make a graphical representation to find where they are. This is done using the CPREPORT keyword:

cpreport pyridine_elf_basins.cml

This writes a .cml file that can be read by avogadro. The cml file contains the atoms but also the position of the maxima labeled as “Xn”. To have avogadro understand

** pyridine_elf_basins.cri

From the wfx file for a pyridine molecule, calculate the density and the ELF in a cube file spanning the molecule, then integrate its basins and plot the positions of the maxima

** pyridine_elf_colormap.cri

Plot the ELF from the pyridine wfx file on the molecular plane.

to file

  • elf_basins ** Source: Gaussian wfx, abinit, VASP. ** System: gas-phase pyridine, urea molecular crystal, ice-packed graphene bilayer. ** Description

Calculate the ELF and integrate its attractor basins. Three examples are provided: i) the ELF calculated by critic2 from a Gaussian wfx file, ii) the integration of the ELF basins in the urea crystal, from the ELF calculated by abinit, and iii) the integration of the charge inside the ELF basins in a slab model of a graphene bilayer with ice between the two layers (icecake).

** urea_crystal_elf_basins.cri

Load the ELF and the density for the urea crystal calculated by abinit, then integrate the ELF basins and represent the ELF maxima in a three-dimensional plot.

** icecake.cri

Load the ELF and the density for the ice-filled graphene bilayer (“icecake”). Then, integrate the ELF basins and represent the ELF maxima in a three-dimensional plot. The spurious ELF maxima in the vacuum, caused by numerical noise, are discarded using the DISCARD option to YT. All ELF maxima are found, together with two spurious maxima that would probably disappear if one used a finer grid.