Table of Contents
You will in this chapter perform a LSDA+U calculation of the NiO crystal. For the
parameter you will use 4.6 eV for the Nickel d-states, as proposed in
Ref. [1].
To set up the calculation you will need to modify the script generated for the LSDA calculation. Open the script generator tool used in the previous chapter (If you have closed it, redo the steps in the previous chapter).
Change the Default output file to nio2_lsda_u.nc .
Change the Script detail to Show defaults.
Open the New Calculator block.
Select LSDA+U for the exchange-correlation.
Switch to the LCAO basis set tab. Set the Hubbard U for the Ni-3d orbital to 4.6 eV.
Next transfer the script to the Editor using the send to
button
, in order to check that all the parameters
are properly set.
In the editor locate the line where the nickel basis is defined and check that the hubbard U parameter is set to 4.6 eV for the nickel_3d orbital.
|
|
Tip |
|---|---|
|
Hubbard U calculations can have different self-consistent states, and the
state that is obtained from the self consistent iteration may depend on the initial density matrix.
For some systems you may need to change the filling_method from |
Next save the script into the file nio2_lsda_u.py
and run the script by dropping the file onto the job manager.
First inspect the Mulliken population in the log file. You should find the magnetic moment of the nickel atom
which is in good agreement with the experimental result of 1.64-1.70
[3].
To determine the band gap, inspect the Density Of States in the log file. You may find that the Density of States is zero in the range [-0.67, 2.36] eV, corresponding to a band gap of 3.03 eV. This is much higher than the LSDA value of 0.4 eV, and in better agreement with the experimental value of 4.0 eV[3] and in accordance with Ref. [1].
The final step is to compare the LSDA and LSDA+U results for the Density of States projected onto the nickel atom. Instead of using the build in PDOS analyzer introduced in the previous chapter, in this section you will use python scripting to perform the analysis. The scripting is based on the matplotlib. package which is part of the atkpython.
The following script performs the analysis
#read in the dos object
dos = nlread('nio2_lsda.nc',DensityOfStates)[0]
#generate some energies
energies = numpy.linspace(-5,5,400)*eV
#calculate the spectrum
n0_up = dos.tetrahedronSpectrum(energies=energies,
spin=Spin.Up,
projection_list = ProjectionList([0]))
n0_down = dos.tetrahedronSpectrum(energies=energies,
spin=Spin.Down,
projection_list = ProjectionList([0]))
e = dos.energies()
#do the same for LSDA+U
dos_u = nlread('nio2_lsda_u.nc',DensityOfStates)[0]
n0_up_u = dos_u.tetrahedronSpectrum(energies=energies,
spin=Spin.Up,
projection_list = ProjectionList([0]))
n0_down_u = dos_u.tetrahedronSpectrum(energies=energies,
spin=Spin.Down,
projection_list = ProjectionList([0]))
#plot the spectrum using pylab
import pylab
#first plot the up component with dots
pylab.plot(e.inUnitsOf(eV), n0_up.inUnitsOf(eV**-1), 'k:',label = 'LSDA')
#now plot the down component with negative values and dots
pylab.plot(e.inUnitsOf(eV), -1.*n0_down.inUnitsOf(eV**-1), 'k:')
#now plot the LSDA+U up components with solid
pylab.plot(e.inUnitsOf(eV), n0_up_u.inUnitsOf(eV**-1),'k',label = 'LSDA+U')
#now plot the LSDA+U down component with negative values and solid
pylab.plot(e.inUnitsOf(eV), -1.*n0_down_u.inUnitsOf(eV**-1),'k')
#show legends
pylab.legend()
pylab.xlabel("Energy (eV)")
pylab.ylabel("DOS (1/eV)")
pylab.show()
Below is shown the output of the calculation for the projected density of states of the nickel atom
Notice the large difference in band gap between the two calculations.