Before we can run bands
calculation, we need to perform single-point selfconsistent field calculation. We have our input scf
file with some newparameters:
src/silicon/pw.scf.silicon_bands.in
&CONTROL
calculation = 'scf',
restart_mode = 'from_scratch',
prefix = 'silicon',
outdir = './tmp/'
pseudo_dir = '../pseudos/'
verbosity = 'high'
/
&SYSTEM
ibrav = 2,
celldm(1) = 10.2076,
nat = 2,
ntyp = 1,
ecutwfc = 50,
ecutrho = 400,
nbnd = 8,
! occupations = 'smearing',
! smearing = 'gaussian',
! degauss = 0.005
/
&ELECTRONS
conv_thr = 1e-8,
mixing_beta = 0.6
/
ATOMIC_SPECIES
Si 28.086 Si.pz-vbc.UPF
ATOMIC_POSITIONS (alat)
Si 0.0 0.0 0.0
Si 0.25 0.25 0.25
K_POINTS (automatic)
8 8 8 0 0 0
Run the scf
calculation:
pw.x < pw.scf.silicon_bands.in > pw.scf.silicon_bands.out
Next step is our band calculation (non-self consistent field) calculation. Thebands
calculation is non self-consistent and reads/uses the ground stateelectron density, Hartree, exchange and correlation potentials obtained in theprevious step (scf calculation). In case of non self-consistent calculation, thepw.x program determines the Kohn-Sham eigenfunction and eigenvalues withoutupdating Kohn-Sham Hamiltonian at every iteration. We need to specify thek-points for which we want to calculate the eigenvalues. You may use theSee-K-path tool by materials cloud to visualize the K-path. Wecan specify nbnd
, by default it calculates half the number of valenceelectrons, i.e., only the occupied ground state bands. Usually we are interestedalso in the unoccupied bands above the Fermi energy. Number of occupied bandscan be found in the scf
output as number of Kohn-Sham states. Below is asample input file for the band calculation:
src/silicon/pw.bands.silicon.in
&control
calculation = 'bands',
restart_mode = 'from_scratch',
prefix = 'silicon',
outdir = './tmp/'
pseudo_dir = '../pseudos/'
verbosity = 'high'
/
&system
ibrav = 2,
celldm(1) = 10.2076,
nat = 2,
ntyp = 1,
ecutwfc = 50,
ecutrho = 400,
nbnd = 8
/
&electrons
conv_thr = 1e-8,
mixing_beta = 0.6
/
ATOMIC_SPECIES
Si 28.086 Si.pz-vbc.UPF
ATOMIC_POSITIONS (alat)
Si 0.00 0.00 0.00
Si 0.25 0.25 0.25
K_POINTS {crystal_b}
5
0.0000 0.5000 0.0000 20 !L
0.0000 0.0000 0.0000 30 !G
-0.500 0.0000 -0.500 10 !X
-0.375 0.2500 -0.375 30 !U
0.0000 0.0000 0.0000 20 !G
Run pw.x
with bands
calculation input file:
pw.x < pw.bands.silicon.in > pw.bands.silicon.out
After the bands calculation is performed, we need some postprocessing usingbands.x
utility in order to obtain the data in more usable format. Input filefor bands.x
postprocessing:
src/silicon/pp.bands.silicon.in
&BANDS
prefix = 'silicon'
outdir = './tmp/'
filband = 'si_bands.dat'
/
Run bands.x
from post processing (PP) module:
bands.x < pp.bands.silicon.in > pp.bands.silicon.out
Finally, we run plotband.x
to visualize bandstructure. We can either run itinteractively (as described below) or provide an input file. In order to runinteractively, type plotband.x
in your terminal.
Input file > si_bands.dat
Reading 8 bands at 91 k-points
Range: -5.8300 16.3420eV Emin, Emax > -6, 16
high-symmetry point: 0.5000 0.5000 0.5000 x coordinate 0.0000
high-symmetry point: 0.0000 0.0000 0.0000 x coordinate 0.8660
high-symmetry point: 1.0000 0.0000 0.0000 x coordinate 1.8660
high-symmetry point: 1.0000 0.2500 0.2500 x coordinate 2.2196
high-symmetry point: 0.0000 0.0000 0.0000 x coordinate 3.2802
output file (gnuplot/xmgr) > si_bands.gnuplot
bands in gnuplot/xmgr format written to file si_bands.gnuplot
output file (ps) > si_bands.ps
Efermi > 6.6416
deltaE, reference E (for tics) 4, 0
bands in PostScript format written to file si_bands.ps
You will have si_bands.ps
with band diagram. Alternatively, you can use yourfavorite plotting program to make the plots. Below is an example of using Pythonmatplotlib.
notebooks/si-bands.ipynb
import matplotlib.pyplot as plt
from matplotlib import rcParamsDefault
import numpy as np
%matplotlib inline
plt.rcParams["figure.dpi"]=150
plt.rcParams["figure.facecolor"]="white"
plt.rcParams["figure.figsize"]=(8, 6)
# load data
data = np.loadtxt('../src/silicon/si_bands.dat.gnu')
k = np.unique(data[:, 0])
bands = np.reshape(data[:, 1], (-1, len(k)))
for band in range(len(bands)):
plt.plot(k, bands[band, :], linewidth=1, alpha=0.5, color='k')
plt.xlim(min(k), max(k))
# Fermi energy
plt.axhline(6.6416, linestyle=(0, (5, 5)), linewidth=0.75, color='k', alpha=0.5)
# High symmetry k-points (check bands_pp.out)
plt.axvline(0.8660, linewidth=0.75, color='k', alpha=0.5)
plt.axvline(1.8660, linewidth=0.75, color='k', alpha=0.5)
plt.axvline(2.2196, linewidth=0.75, color='k', alpha=0.5)
# text labels
plt.xticks(ticks= [0, 0.8660, 1.8660, 2.2196, 3.2802], \
labels=['L', '$\Gamma$', 'X', 'U', '$\Gamma$'])
plt.ylabel("Energy (eV)")
plt.text(2.3, 5.6, 'Fermi energy', fontsize= small)
plt.show()
info
The k
values corresponding to high symmetry points (such as Γ, X, U, L)which we need to label in our band diagram, can be found in the post-processingoutput file (si_bands_pp.out
).
Bandgap value can be determined from the highest occupied, lowest unoccupiedlevel values printed in scf
calculation output.
Usually, band gaps computed using common exchange-correction functionals such asLDA or GGA are severely underestimated compared to actual experimental values.This discrepancy is mainly due to (1) approximations used in the exchangecorrection functional and (2) a derivative discontinuity term, originating fromthe density functional being discontinuous with the total number of electrons inthe system. The second contribution is larger contributor to the error. It canbe partly addressed by a variety of techniques such as the GW approximation.
Strategies to improve band gap prediction at moderate to low computational costnow been developed by several groups, including Chan and Ceder (delta-sol)1,Heyd et al. (hybrid functionals)2, and Setyawan et al. (empirical fits)3.
Resources
- https://docs.materialsproject.org/methodology/materials-methodology/electronic-structure#accuracy-of-band-structures
- See K-pat online tool
M. Chan, G. Ceder, Efficient Band Gap Predictions for Solids, PhysicalReview Letters 19 (2010) https://doi.org/10.1103/PhysRevLett.105.196403 ↩
J. Heyd, J.E. Peralta, G.E. Scuseria, R.L. Martin, Energy band gaps andlattice parameters evaluated with the Heyd-Scuseria-Ernzerhof screened hybridfunctional, Journal of Chemical Physics 123 (2005)https://doi.org/10.1063/1.2085170 ↩
W. Setyawan, R.M. Gaume, S. Lam, R. Feigelson, S. Curtarolo,High-throughput combinatorial database of electronic band structures forinorganic scintillator materials., ACS Combinatorial Science. (2011)https://doi.org/10.1021/co200012w. ↩