Electron paramagnetic resonance

Note

The files for this section of the tutorial can be found in li_mgo/5_li-mgo_epr. The input files in this directory were obtained using a Py-ChemShell geometry optimisation on the optimised Li doped MgO cluster where the electron hole is localised on one oxygen.

This section of the tutorial will illustrate how to calculate the electron paramagnetic resonance (EPR) g tensor of the Li doped MgO cluster. The g tensor is a spin-Hamiltonian parameter, which arises from the electron spin interacting with an external magnetic field.

The EPR calculation is set up using NWChem. This is done by modifying the _nwchem.inp file. First, any current task dft options are removed and the following settings are added to the end of the file:

task dft
task dft property

Next, the settings required to calculate the g tensor are defined by inserting the following settings underneath the end keyword of the dft section:

relativistic
zora on
zora:cutoff 1d-30
end

property
gshift
end

This requests a property analysis to calculate the g shift tensor using the the zeroth order approximation (ZORA) to the Dirac equation. This approximation is convenient as it supports a wide range of density functionals and is computationally tractable. The calculation can now be run using NWChem. On a local machine, the command for this is simply nwchem _nwchem.inp.

Note

If there are any issues running this, please use the _nwchem.inp.reference file. Additionally, this calculation should be run in a clean directory to avoid any potential issues.

Once the calculation has finished, under the heading ‘Total g shift Tensor’ in the NWChem output, there will be a 3x3 matrix, corresponding to the g shift tensor:

   Total g shift Tensor
27.9973     -0.0002     -0.0022
-0.0002     27.8769     -0.0032
-0.0022     -0.0032     11.0372

To obtain the g values, matrix operations must be applied. This can be done using the numpy Python module. In the script g_calc.py, numpy is imported using import numpy. Next the g value of a free electron in a vacuum is specified and the g shift tensor is defined as a numpy matrix array.

# g value of a free electron in a vacuum is defined
ge = 2.002319304

# defines g shift tensor matrix
GShiftTensor = numpy.matrix([[27.9973, -0.0002, -0.0022], 
                             [-0.0002, 27.8769, -0.0032], 
                             [-0.0022, -0.0032, 11.0372]])

Using these parameters, the g tensor can then be obtained. Here, the eye3 variable corresponds to a 3x3 identity matrix and the multiplication constant converts the tensor from units of parts per thousand to parts per million.

# calculates the g tensor
GTensor = 0.001*GShiftTensor + (ge*eye3)

To obtain the g values from the g tensor, the g.g T eigenvalues are calculated and the square root of these are taken.

# obtains and prints the gx, gy, gz values
g = numpy.sqrt(numpy.linalg.eigvals(GTensor*GTensor.transpose()))

This script can then be run using the command python g_calc.py. You should find that the theoretical g values are 2.013 and 2.030. Compared to the experimental values of 2.004 and 2.054, the agreement is sufficient. It is worth highlighting that these results are sensitive to the functional and basis set quality, so using a higher quality basis set could lead to better agreement.