Density of states tutorial
Requirements
Software components
nanotools
RESCU+
Pseudopotentials
I will need the following pseudopotentials.
Ga_AtomicData.mat
As_AtomicData.mat
Let’s copy them from the pseudo database to the current working directory and export RESCUPLUS_PSEUDO=$PWD
.
References
Briefing
In this tutorial, I show how to calculate the density of states of the GaAs crystal.
Setup
Create the Python script etot.py
with the following content (see the tutorial on TotalEnergy)
from nanotools import Atoms, Cell, System, TotalEnergy
a = 2.818
cell = Cell(avec=[[0.,a,a],[a,0.,a],[a,a,0.]], resolution=0.12)
fxyz = [[0.00,0.00,0.00],[0.25,0.25,0.25]]
atoms = Atoms(fractional_positions=fxyz, formula="GaAs")
sys = System(cell=cell, atoms=atoms)
calc = TotalEnergy(sys)
calc.solve()
and dos.py
from nanotools import DensityOfStates as DOS
calc = DOS.from_totalenergy("nano_scf_out.json")
calc.system.kpoint.set_grid([10,10,10])
calc.system.pop.set_type("tm")
calc.solve()
fig = calc.plot_dos(filename="gaas_dos.png")
Explanations
Here is a high level view of the calculation workflow:
Initialize the DOS calculator from a ground state calculation (
TotalEnergy
).Perform a density of states calculation (non-self-consistently) on a finer k-point grid and compute the density of states (and optionally the projected density of states).
Use
the DOS calculator
’s method to plot the density of states.
Initialize the DOS calculator
Upon completing the total energy calculation, the results are saved in nano_scf_out.json
.
I will initialize a DOS
calculator using the class method from_totalenergy
.
calc = DOS.from_totalenergy("nano_scf_out.json")
calc.system.kpoint.set_grid([10,10,10])
calc.system.pop.set_type("tm")
The method from_totalenergy
will copy the system information and initialize the DOS
calculator.
I then increase the k-sampling resetting the kpoint grid with set_grid
.
Finally, I change the population function (or smearing) from the default Gaussian to tm
which stands for tetrahedron method.
Density of states calculation
RESCU+’s solvers are invoked calling the solve
method
calc.solve()
The method writes all parameters to a JSON file, then calls the relevant (Fortran) program, then loads the data back into the calculator.
The output of rescuplus
goes to nano_dos_out.h5
and nano_dos_out.json
.
Important data is stored in
calc.dos.energy
, the energies at which the DOS is calculated.calc.dos.dos
, the DOS.
Plot the density of states
I call the plot_dos
method to plot the density of states.
fig = calc.plot_dos(filename="gaas_dos.png")
plot_dos
is a function that returns a Pyplot figure handle.
You can use the handle to modify the figure or save it to a file.
You should see something similar to
Partial density of states
The partial density of states is a very useful analysis tool.
To compute the partial density of states, one must set dos.pdos_return
to True
and then call solve
.
calc.dos.pdos_return = True
calc.solve()
fig = calc.plot_pdos(sumA=[0,1], filename="gaas_pdos.png")
Upon exit, rescuplus
will save the fully decomposed DOS to nano_dos_out.h5
.
The partial DOS can be visualized with plot_pdos
which has the optional arguments:
sumA Plot the density of states for specific atoms, as given by
sumA
. For example,plot_pdos(sumA=[0,1])
will plot the partial density of states of atom 1 and 2.sumL Plot the density of states for specific orbital angular momentum, as given by
sumL
. For example,plot_pdos(sumL=[0])
will plot the partial density of states of s-orbitals.sumM Plot the density of states for specific z-orbital angular momentum, as given by
sumM
. For example,plot_pdos(sumM=[0])
will plot the partial density of states of (z=0)-orbitals.
If several sum-parameters are specified, plot_pdos
will plot all combinations of the parameters.
For instance, if one wishes to plot the partial density of states of \(p_z\)-orbitals, he may type
fig = calc.dos.plot_pdos(sumL=[1],sumM=[0])
Let’s now take a look at the partial density of states of each atom in GaAs
fig = calc.dos.plot_pdos(sumA=[0,1])
You should see