Quasi-particle spectrum in the GW approximation from LCAO wave functions: tutorial

For a brief introduction to the GW theory and the details of its implementation in GPAW, see Quasi-particle spectrum in the GW approximation: theory.

More information can be found here:

F. Hüser, T. Olsen, and K. S. Thygesen

Quasiparticle GW calculations for solids, molecules, and two-dimensional materials

Physical Review B, Vol. 87, 235132 (2013)

Additionally, before getting started using LCAO wave functions in the GW approximation, it would be beneficial to become familiar with G0W0 using GPAW, see Quasi-particle spectrum in the GW approximation: tutorial.

Quasi-particle spectrum of bulk diamond

Groundstate LCAO calculation

First, we need to do a regular LCAO groundstate calculation, and save all of the wave functions. The basis-set is chosen using the basis keyword, and nbands is set to nao, reflecting the maximum nbands value that can be used in LCAO, which is the same number of bands as there are atomic orbitals.

from ase.build import bulk
from gpaw import GPAW, FermiDirac

a = 3.567
atoms = bulk('C', 'diamond', a=a)

calc = GPAW(mode='lcao',
            basis='dzp',
            kpts={'size': (8, 8, 8), 'gamma': True},
            xc='LDA',
            nbands='nao',
            occupations=FermiDirac(0.0),
            txt='C_lcao_groundstate.txt')

atoms.calc = calc
atoms.get_potential_energy()
calc.write('C_lcao_groundstate.gpw', mode='all')

G0W0 calculation using LCAO basis functions

We can now set up the G0W0 calculation similar to the PW case, passing the LCAO groundstate calculation C_lcao_groundstate.gpw to the G0W0 calculator, which is then internally converted to PW. However, there are a few major differences. ecut_extrapolation is disabled, because the convergence wrt. G-bands and chi0 bands is unknown with LCAO-basis set, whereas in PW mode, the number of bands can be just directly chosen from the plane wave cut off.

import numpy as np
from gpaw.dft import DFT
from gpaw.response.g0w0 import G0W0

dft = DFT.from_gpw_file('C_lcao_groundstate.gpw')
dft.change_mode('pw')
dft.write_gpw_file('C_pw_from_lcao_groundstate.gpw', include_wfs=True)

gw = G0W0('C_pw_from_lcao_groundstate.gpw',
          integrate_gamma='WS',
          ecut=200,
          nbands=26,
          kpts=[0],
          eta=0.1,
          bands=(3, 5),
          evaluate_sigma=np.linspace(-50, 75, 500),
          filename='C-g0w0-lcao')

gw.calculate()

The results are stored in C-g0w0-lcao_results.pckl.

GW self-energy for Diamond (C)

We plot the results stored in C-g0w0-lcao_results.pckl as the imaginary and real part of the GW self-energy \(\Sigma(\omega)\) depending on the frequency using the script plot_C_lcao_gw.py. We compare the LCAO results to PW ones computed using C_pw_groundstate.py and C_pw_gw.py.

../../../_images/C_Im.png
../../../_images/C_Re.png