Skip to main content

Dielectric constant

First we perform self consistent field calculation:

mpirun -np 4 pw.x -i pw.scf.silicon_epsilon.in > pw.scf.silicon_epsilon.out
src/silicon/pw.scf.silicon_epsilon.in
&CONTROL
calculation = 'scf',
prefix = 'silicon',
outdir = './tmp/'
pseudo_dir = '../pseudos/'
verbosity = 'high'
/

&SYSTEM
ibrav = 2,
celldm(1) = 10.26,
nat = 2,
ntyp = 1,
ecutwfc = 40
nbnd = 20
nosym = .TRUE.
noinv = .TRUE.
/

&ELECTRONS
mixing_beta = 0.6
conv_thr = 1.0d-10
/

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
6 6 6 0 0 0

Especially, notice following changes:

  nbnd = 20
nosym = .true.
noinv = .true.

We turn off the automatic reduction of k-points that pw.x does by using crystal symmetries (nosym = .true. and noinv = .true.). This is because epsilon.x does not recognize crystal symmetries, therefore the entire list of k-points in the grid is needed. Secondly, we calculate a larger number of bands (20), since we are interested in interband transitions. Also, note that epsilon.x doesn't support the reduction of the k-points grid into the irreducible Brillouin zone, so the PW runs must be performed with a uniform k-points grid and all k-points weights must be equal to each other, i.e. in the k-points card the k-points coordinates must be given manually in crystal or alat or bohr, but not with the automatic option. However, the automatic k-points option seems to work with nosym = .true. and noinv = .true.. If required, we can perform nscf calculation with finer k-grid.

Next step is to prepare the input file for epsilon.x:

src/silicon/epsilon.si.in
&inputpp
outdir = "./tmp/"
prefix = "silicon"
calculation = "eps"
/

&energy_grid
smeartype = "gauss"
intersmear = 0.15
intrasmear = 0.0
wmin = 0.0
wmax = 30.0
nw = 1000
/

The variables smeartype and intersmear define the numerical approximation used to represent the Dirac delta functions in the expression for ϵ2\epsilon_2 given above. For metals, we also need to use intrasmear broadening parameter, usually 0.1 - 0.2 eV. The variables wmin, wmax and nw define the energy grid for the dielectric function. All the energy variables are in eV.

mpirun -np 4 epsilon.x -i epsilon.si.in > epsilon.si.out

We will see the results are saved in separate .dat files. We can plot the real (ϵ1\epsilon_1) and imaginary (ϵ2\epsilon_2) parts of dielectric constants:

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"

data_r = np.loadtxt('../src/silicon/epsr_silicon.dat')
data_i = np.loadtxt('../src/silicon/epsi_silicon.dat')
energy_r, epsilon_r = data_r[:, 0], data_r[:, 1]
energy_i, epsilon_i = data_i[:, 0], data_i[:, 1]

plt.plot(energy_r, epsilon_r, lw=1, label="$\\epsilon_1$")
plt.plot(energy_i, epsilon_i, lw=1, label="$\\epsilon_2$")
plt.xlim(0, 15)
plt.xlabel("Energy (eV)")
plt.ylabel("$\\epsilon_1~/~\\epsilon_2$")
plt.legend(frameon=False)
plt.show()
silicon-epsilon
warning

Ultra-soft pseudopotentials do not work with epsilon.x. Use norm-conserving pseudopotentials. Also note that the above example is not tested against the k-mesh. We usually need finer k-mesh for ϵ\epsilon to converge. By default the maximum number of k-points is set to 40000 in Quantum Espresso, if we need more k-points, we can change Modules/parameters.f90 and recompile Quantum Espresso.

Joint Density of States

JDOS gives the number of states for a pair of initial and final states as a function of frequency (in eV). A larger intensity indicates a larger absorption in the absorption spectra. Input file for JDOS calculation:

src/silicon/epsilon.jdossi.in
&INPUTPP
outdir = "./tmp/"
prefix = "silicon"
calculation = "jdos"
/

&ENERGY_GRID
smeartype = "gauss"
intersmear = 0.15
intrasmear = 0.0
wmin = 0.0
wmax = 10.0
nw = 1000
shift = 0.0
/

Sequence of steps to run:

mpirun -np 16 pw.x -in pw.scf.silicon_epsilon.in > pw.scf.silicon_epsilon.out
mpirun -np 16 pw.x -in pw.nscf.silicon_epsilon.in > pw.nscf.silicon_epsilon.out
mpirun -np 16 epsilon.x -in epsilon.jdos.si.in > epsilon.jdos.si.out
silicon-epsilon-jdos

Resources