Non self-consistent calculations: Band structures and Density Of States

From Wiki Max
Jump to navigation Jump to search

Prev: LabQSM#Module 1: Basic DFT calculations and Convergences (9h)

Non self-consistent calculations: Intro

Silicon band structure. Originals from [ Thermodynamics and Kinetics II, Dr. J. Carstensen, Univ. Kiel]

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


   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.


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.out

where a typical input file contains the following information:

 $>  cat
     prefix = 'diamond'
     outdir = './SCRATCH/'
     degauss=0.01  !  [Ry]  broadening parameter
  [  Emin=val      !  min/max/step of the energy grid
     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 and calculation="bands" needs to be set.

The conventions to define and label high symmetry k-points for different lattices can be found here: MaterialsCloud SeekPath

Input example (pw.x) to produce the required KS data:

 K_POINTS {crystal_b}
 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}
 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.out

where looks like:

    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


Note that in order to have all eigenvalues printed in the pw.x output file, you may need to set the variable


(which can useful also in a number of other cases when you want extended info about the system studied).

Examples and Exercises


Band structure and DOS of Diamond

  • Plot the DOS and the band structure of diamond along high-symmetry k-point lines
  • Use the converged parameters and lattice constant obtained in previous calculations to run scf and nscf calculations



Band structure and DOS of Aluminium

  • Plot the DOS and the band structure of Aluminium along high-symmetry k-point lines
  • Al is a FCC crystal, 1 atom per cell, Exp lattice parameter: 4.0495 Ang
  • Hint: high symmetry kpts can be found in the Seek-path of materialscoulud:



Band structure and DOS of GaAs

  • Plot the DOS and the band structure of GaAs along high-symmetry k-point lines
  • GaAs is a zinc-blende structure (fcc with 2 atoms per cell)
  • Hint: high symmetry kpts can be found in the Seek-path of materialscoulud: