Non self-consistent calculations: Band structures and Density Of States
Prev: LabQSM#Lecture 1: Basic DFT calculations and Convergences
Non self-consistent calculations: Intro
Once the charge density has been obtained in a scf run, more calculations can be performed at fixed density (non-scf). Among these:
- calculations of Kohn-Sham energies and orbitals on any given set of k-points (i.e. without specific aim of represent a reasonable sampling of the BZ);
- calculations as above, also increasing the number of computed (= diagonalized) bands (incl the calculation of empty Kohn-Sham states);
- Importantly, nscf calculations are typically done to plot KS bands or compute the DOS,
- but also as a preliminary step to other calculations (e.g. uniform k-point samplings and large amounts of empty states are using in GW and other many-body perturbation theory algorithms implemented with sum-over-states techniques)
In the Quantum ESPRESSO input file one has to set:
calculation="nscf" # kpts sampling BZ
or
calculation="bands" # kpts along lines
Some comments:
bands
is also a nscf-calculation strictly speaking (i.e. the charge density is clearly not updated).- It differs from
calculation="nscf"
since there is not even the requirement of a uniform k-sampling (k-points can be computed along special directions, or just at any place in the BZ). - In this perspective,
nscf
runs can evaluate integrated quantities like an update of the Fermi energy. - During nscf (as well as bands) KS eigenvalues are diagonal to full accuracy (
diago_full_acc=.true.
by default), at variance with scf calculations, where accuracy is lowered for empty states (not relevant to compute the density not the total energy). - While one could set
diago_full_acc=.true.
in scf runs, it is anyway highly recommended to run a second nscf calculation to perform BZ refinements or increase the number of state for plotting or inspection. - K-points (and number of bands if relevant) need to be specified according to the specific needs. See below for bands and DOS.
DOS
In this case a uniform k-point sampling is needed, similarly to scf calculations.
A proper sampling of the BZ is then performed, but the density is not updated.
Input example (pw.x
executable) to prepare for DOS calculations:
[...] K_POINTS {automatic} 20 20 20 0 0 0
By doing this we are de fact performing a refinement of the BZ sampling.
Setting calculation="nscf"
is a good choice.
Once the KS data have been produced by using pw.x
, we can take advantage of a post-processing utility of QE,
dos.x
to compute the actual DOS
$> dos.x < dos.in > dos.out
where a typical input file contains the following information:
$> cat dos.in
&DOS prefix = 'diamond' outdir = './SCRATCH/' degauss=0.01 ! [Ry] broadening parameter [ Emin=val ! min/max/step of the energy grid Emax=val deltaE=val ] fildos = 'dos.diamond.dat' /
The output file can then be visualised using some standard tools as described in Plotting and visualization tools.
Band structure
In this case we need to sample the BZ along user-defined segments in reciprocal space.
Such sampling can be either generated by the pw.x
, see below, or provided explicitly by the user
calculation="bands"
needs to be set.
Input example (pw.x
) to produce the required KS data:
[...] K_POINTS {crystal_b} 6 0.500 0.500 0.000 40 # X 0.000 0.000 0.000 40 # G 0.500 0.500 0.500 40 # L 0.750 0.500 0.250 40 # W 0.750 0.375 0.375 40 # K 0.000 0.000 0.000 1 # G
Note that here 6 is the number of line edges (= 5 segments).
Names of k-points are not required and just added to decorate the input file
Alternatively, one can provide the list of k-points explicitly. The input file would look like:
[...] K_POINTS {crystal} 140 0.500 0.500 0.000 1 # X 0.490 0.490 0.000 1 0.480 0.480 0.000 1 [...] 0.010 0.010 0.000 1 0.000 0.000 0.000 1 # G [...]
- The first line provides the total number of input k-points.
- Each line contains the 3 components of the selected k-point (either in cartesian or crystal coords.
- The extra column (filled with 1, here) is a placeholder for k-point weight (not used or
bands
runs)
Once the nscf data have been computed, bands.x
(a post-processing utility of QE) can be used to cast the data in a form ready to be plotted.
$ ./bands.x < bands.in > bands.out
where bands.in looks like:
&BANDS prefix = 'diamond' outdir = './SCRATCH/' filband = 'bands.diamond.dat' /
As for dos.x
, it is not difficult to parse the data directly from the output file of pw.x
and reformat them by using your own tools.
An example of such a tool is provided in
LabQSM/tools/plot_bands.py
Note that in order to have all eigenvalues printed in the pw.x output file, you may need to set the variable
&CONTROL [...] verbosity="high" /
(which can useful also in a number of other cases when you want extended info about the system studied).