This tutorial can be downloaded link.
Intro Tutorial 9: GW Calculations with Hybrid Functionals
This tutorial describes how to carry out \(G_0W_0\) calculations with hybrid exchange-correlation functionals. The general steps are the same as those needed for \(G_0W_0\) calculations with semi-local functionals, introduced in Tutorial 1.
Exact exchange operator without approximation
We first perform the mean-field electronic structure calculation within DFT using the Quantum ESPRESSO code. Download the following files to your working directory:
[ ]:
%%bash
wget -N -q https://west-code.org/doc/training/exx/pw.in
wget -N -q http://www.quantum-simulation.org/potentials/sg15_oncv/upf/H_ONCV_PBE-1.2.upf
wget -N -q http://www.quantum-simulation.org/potentials/sg15_oncv/upf/Si_ONCV_PBE-1.2.upf
Let’s inspect the pw.in file, input for pw.x.
[1]:
%%bash
cat pw.in
&control
calculation = 'scf'
restart_mode = 'from_scratch'
pseudo_dir = './'
outdir = './'
prefix = 'silane'
wf_collect = .TRUE.
/
&system
ibrav = 1
celldm(1) = 20
nat = 5
ntyp = 2
ecutwfc = 25.0
nbnd = 10
assume_isolated = 'mp'
input_dft = 'pbe0'
/
&electrons
diago_full_acc = .TRUE.
/
ATOMIC_SPECIES
Si 28.0855 Si_ONCV_PBE-1.2.upf
H 1.00794 H_ONCV_PBE-1.2.upf
ATOMIC_POSITIONS bohr
Si 10.000000 10.000000 10.000000
H 11.614581 11.614581 11.614581
H 8.385418 8.385418 11.614581
H 8.385418 11.614581 8.385418
H 11.614581 8.385418 8.385418
K_POINTS {gamma}
Compared to the pw.in file used in Tutorial 1, here we only have one additional keyword, input_dft = 'pbe0', which instructs the code to use the PBE0 hybrid functional.
We run pw.x on 2 cores.
[ ]:
%%bash
mpirun -n 2 pw.x -i pw.in > pw.out
The static dielectric screening is computed using the projective dielectric eigendecomposition (PDEP) technique. Download the following file to your working directory:
[ ]:
%%bash
wget -N -q https://west-code.org/doc/training/exx/wstat.in
Let’s inspect the wstat.in file.
[2]:
%%bash
cat wstat.in
input_west:
qe_prefix: silane
west_prefix: silane
outdir: ./
wstat_control:
wstat_calculation: S
n_pdep_eigen: 50
It’s identical to the wstat.in file used in Tutorial 1.
We run wstat.x on 2 cores.
[ ]:
%%bash
mpirun -n 2 wstat.x -i wstat.in > wstat.out
The GW electronic structure is computed by treating the frequency integration of the correlation part of the self-energy with the contour deformation technique and by computing the dielectric screening at multipole frequencies with Lanczos iterations. Download the following file to your working directory:
[ ]:
%%bash
wget -N -q https://west-code.org/doc/training/exx/wfreq.in
Let’s inspect the wfreq.in file.
[3]:
%%bash
cat wfreq.in
input_west:
qe_prefix: silane
west_prefix: silane
outdir: ./
wstat_control:
wstat_calculation: S
n_pdep_eigen: 50
wfreq_control:
wfreq_calculation: XWGQ
n_pdep_eigen_to_use: 50
qp_bandrange: [1,5]
n_refreq: 300
ecut_refreq: 2.0
It’s identical to the wfreq.in file used in Tutorial 1.
We run wfreq.x on 2 cores.
[ ]:
%%bash
mpirun -n 2 wfreq.x -i wfreq.in > wfreq.out
We save the output file silane.wfreq.save/wfreq.json.
[ ]:
%%bash
mv silane.wfreq.save/wfreq.json wfreq_exx.json
If the reader does NOT have the computational resources to run the calculations, the output file can be directly downloaded as:
[ ]:
%%bash
wget -N -q https://west-code.org/doc/training/exx/wfreq_exx.json
Adaptively compressed exchange (ACE) operator
Now let’s use the adaptively compressed exchange (ACE) operator to speed up the calculations. Download the following files to your working directory:
[ ]:
%%bash
wget -N -q https://west-code.org/doc/training/exx/pw.in
wget -N -q https://west-code.org/doc/training/exx/nscf.in
wget -N -q http://www.quantum-simulation.org/potentials/sg15_oncv/upf/H_ONCV_PBE-1.2.upf
wget -N -q http://www.quantum-simulation.org/potentials/sg15_oncv/upf/Si_ONCV_PBE-1.2.upf
We run pw.x on 2 cores, and make a copy of the save directory generated by pw.x.
[ ]:
%%bash
mpirun -n 2 pw.x -i pw.in > pw.out
cp -r silane.save silane_copy.save
We run a non-self-consistent calculation to construct the ACE operator with a bit more empty bands. The content of nscf.in is almost identical to that of pw.in, except that in nscf.in we request a non-self-consistent calculation with a larger value of nbnd.
We run pw.x again on 2 cores, and copy the file that stores the ACE operator to the directory saved in the previous self-consistent pw.x run.
[ ]:
%%bash
mpirun -n 2 pw.x -i nscf.in > nscf.out
cp silane.save/ace* silane_copy.save
rm -rf silane.save
mv silane_copy.save silane.save
By doing this, in the silane.save directory, we have the wavefunctions generated in the first, self-consistent pw.x run and the ACE operator generated in the second, non-self-consistent pw.x run. Now we do the GW calculation. Download the following file to your working directory:
[ ]:
%%bash
wget -N -q https://west-code.org/doc/training/exx/wstat_ace.in
wget -N -q https://west-code.org/doc/training/exx/wfreq_ace.in
Let’s inspect the wstat_ace.in and wfreq_ace.in files.
[4]:
%%bash
cat wstat_ace.in
cat wfreq_ace.in
input_west:
qe_prefix: silane
west_prefix: silane
outdir: ./
wstat_control:
wstat_calculation: S
n_pdep_eigen: 50
n_exx_lowrank: 30
input_west:
qe_prefix: silane
west_prefix: silane
outdir: ./
wstat_control:
wstat_calculation: S
n_pdep_eigen: 50
n_exx_lowrank: 30
wfreq_control:
wfreq_calculation: XWGQ
n_pdep_eigen_to_use: 50
qp_bandrange: [1,5]
n_refreq: 300
ecut_refreq: 2.0
The new keyword, n_exx_lowrank: 30, activates the use of the ACE operator constructed from 30 KS wavefunctions. In production runs, n_exx_lowrank and therefore nbnd used on the non-self-consistent pw.x run should be converged.
We run wstat.x and wfreq.x on 2 cores.
[ ]:
%%bash
mpirun -n 2 wstat.x -i wstat_ace.in > wstat_ace.out
mpirun -n 2 wfreq.x -i wfreq_ace.in > wfreq_ace.out
We save the output file silane.wfreq.save/wfreq.json.
[ ]:
%%bash
mv silane.wfreq.save/wfreq.json wfreq_ace.json
If the reader does NOT have the computational resources to run the calculations, the output file can be directly downloaded as:
[ ]:
%%bash
wget -N -q https://west-code.org/doc/training/ace/wfreq_ace.json
We compare the quasiparticle corrections obtained with and without using the ACE operator.
[5]:
import json
import numpy as np
def read_qp(filename):
with open(filename) as f:
data = json.load(f)
return np.array(data['output']['Q']['K000001']['eqpSec'],dtype='f8')
qp_exx = read_qp('wfreq_exx.json')
qp_ace = read_qp('wfreq_ace.json')
print('QP energy [eV]')
print('State EXX ACE Diff')
for i in range(5):
print(f' {i+1} {qp_exx[i]:7.3f} {qp_ace[i]:7.3f} {qp_ace[i]-qp_exx[i]:7.3f}')
QP energy [eV]
State EXX ACE Diff
1 -17.363 -17.366 -0.003
2 -12.365 -12.359 0.006
3 -12.365 -12.359 0.006
4 -12.367 -12.362 0.005
5 0.383 0.380 -0.003
In this case, the difference between the EXX and ACE results is at most 6 meV.
In addition to \(G_0W_0\) calculations, the ACE operator can also be used in Bethe-Salpeter equation (BSE), quantum defect embedding theory (QDET), and time-dependent density functional theory (TDDFT) calculations with hybrid functionals.