This tutorial can be downloaded link.

Intro Tutorial 2: Analyzing the Frequency Dependency in GW Calculations

We analyze the frequency dependency of the GW self-energy, by exploring two ways of solving the quasiparticle (QP) equation:

  • without linearization

\begin{equation} E - \varepsilon_{\mathrm{KS}} = \langle \Sigma(E) - V_{\mathrm{xc}} \rangle \end{equation}

  • with linearization (first-order expansion of self-energy in the frequency domain)

\begin{equation} E - \varepsilon_{\mathrm{KS}} = \langle \Sigma(\varepsilon_{\mathrm{KS}}) - V_{\mathrm{xc}} \rangle + (E - \varepsilon_{\mathrm{KS}}) \langle \frac{\partial \Sigma}{\partial E}(\varepsilon_{\mathrm{KS}}) \rangle \end{equation}

where \(\varepsilon_{\mathrm{KS}}\) is the Kohn-Sham energy, \(\Sigma\) is the real part of the self energy, \(V_{\mathrm{xc}}\) is the exchange-correlation potential, and the solution \(E\) is the QP energy obtained at the \(G_0W_0\) level of theory.

After completing step 1 and step 2 of Tutorial 1, we download the following file:

[ ]:
%%bash
wget -N -q https://west-code.org/doc/training/silane/wfreq_spec.in

Let’s inspect the wfreq_spec.in file, input for wfreq.x.

[1]:
%%bash
cat wfreq_spec.in
input_west:
    qe_prefix: silane
    west_prefix: silane
    outdir: ./

wstat_control:
    wstat_calculation: S
    n_pdep_eigen: 50

wfreq_control:
    wfreq_calculation: XWGQP
    n_pdep_eigen_to_use: 50
    qp_bandrange: [4,5]
    n_refreq: 2000
    ecut_refreq: 2.0
    ecut_spectralf: [-1.5,0.5]
    n_spectralf: 2000

The keyword ecut_spectralf: [-1.5,0.5] activates the computation of the self energy in the frequency range of [-1.5,0.5] Ry.

We run wfreq.x on 2 cores.

[ ]:
%%bash
mpirun -n 2 wfreq.x -i wfreq_spec.in > wfreq_spec.out

The output file wfreq.out contains information about the GW calculation, and the corrected electronic structure can be found in the file <west_prefix>.wfreq.save/wfreq.json.

If the reader does NOT have the computational resources to run the calculation, the WEST output file needed for the next step can be directly downloaded as:

[ ]:
%%bash
mkdir -p silane.wfreq.save
wget -N -q https://west-code.org/doc/training/silane/wfreq_spec.json -O silane.wfreq.save/wfreq.json

Below we show how to load and plot the frequency-dependent QP corrections.

[3]:
import json
import numpy as np

# Load the output data
with open('silane.wfreq.save/wfreq.json') as json_file :
    data = json.load(json_file)

# Extract converged quasiparticle (QP) corrections
k = 1
kindex = f'K{k:06d}'

qp_bands = data['input']['wfreq_control']['qp_bands'][0]
eqp = data['output']['Q'][kindex]

freqlist = np.array(data['output']['P']['freqlist'], dtype='f8')
spf = data['output']['P'][kindex]
[5]:
# Plot
import matplotlib.pyplot as plt

for i, b in enumerate(qp_bands) :

    eks, eqpLin, eqpSec = eqp['eks'][i], eqp['eqpLin'][i], eqp['eqpSec'][i]

    # Print QP corrections
    print (f"{'k':^10} | {'band':^10} | {'eks [eV]':^15} | {'eqpLin [eV]':^15} | {'eqpSec [eV]':^15}")
    print(77*'-')
    print(f'{k:^10} | {b:^10} | {eks:^15.3f} | {eqpLin:^15.3f} | {eqpSec:^15.3f}')

    sigmax, vxcl, vxcnl = eqp['sigmax'][i], eqp['vxcl'][i], eqp['vxcnl'][i]
    sigmac_eks = eqp['sigmac_eks']['re'][i]
    sigmac_eqpLin = eqp['sigmac_eqpLin']['re'][i]
    sigmac_eqpSec = eqp['sigmac_eqpSec']['re'][i]
    z = eqp['z'][i]

    bindex = f'B{b:06d}'
    sigmac = np.array(spf[bindex]['sigmac']['re'], dtype='f8')

    # Left-hand side of QP equation
    plt.plot(freqlist,freqlist-eks,'r-',label=r'$E-\varepsilon_{KS}$')

    # Right-hand side of QP equation without linearization
    plt.plot(freqlist,sigmac+sigmax-vxcl-vxcnl,'b-',label=r'$\Sigma(E)-V_{xc}$')

    # Right-hand side of QP equation with linearization
    plt.plot(freqlist,sigmac_eks+sigmax-vxcl-vxcnl+(1-1/z)*(freqlist-eks),'g-',label=r'$\Sigma^{lin}(E)-V_{xc}$')

    plt.legend()
    plt.title(kindex+" "+bindex)
    plt.xlabel('frequency (eV)')
    plt.ylabel('function (eV)')
    xmin, xmax = min(eks, eqpLin, eqpSec), max(eks, eqpLin, eqpSec)
    ymin, ymax = min(sigmac_eks, sigmac_eqpLin, sigmac_eqpSec), max(sigmac_eks, sigmac_eqpLin, sigmac_eqpSec)
    ymin += sigmax - vxcl -vxcnl
    ymax += sigmax - vxcl -vxcnl
    plt.vlines(x=eks,ymin=ymin-0.2*(ymax-ymin),ymax=ymax+0.2*(ymax-ymin),ls="--")
    plt.vlines(x=eqpLin,ymin=ymin-0.2*(ymax-ymin),ymax=ymax+0.2*(ymax-ymin),ls=":",color="g")
    plt.vlines(x=eqpSec,ymin=ymin-0.2*(ymax-ymin),ymax=ymax+0.2*(ymax-ymin),ls=":",color="b")
    plt.xlim([xmin-0.2*(xmax-xmin),xmax+0.2*(xmax-xmin)])
    plt.ylim([ymin-0.2*(ymax-ymin),ymax+0.2*(ymax-ymin)])
    plt.show()
    k      |    band    |    eks [eV]     |   eqpLin [eV]   |   eqpSec [eV]
-----------------------------------------------------------------------------
    1      |     4      |     -8.232      |     -12.071     |     -11.962
../../_images/tutorials_basic_basic_002_12_1.png
    k      |    band    |    eks [eV]     |   eqpLin [eV]   |   eqpSec [eV]
-----------------------------------------------------------------------------
    1      |     5      |     -0.466      |      0.589      |      0.587
../../_images/tutorials_basic_basic_002_12_3.png

In the above plots, the red, blue, and green solid lines represent \(E - \varepsilon_{\mathrm{KS}}\), \(\Sigma (E) - V_{\mathrm{XC}}\), and \(\Sigma^{\mathrm{lin}} (E) - V_{\mathrm{XC}}\), respectively. The intersection of the red and blue solid lines, marked by the blue dotted line, corresponds to the solution (eqpSec) of the QP equation without linearization of the frequency dependency. Likewise, the intersection of the red and green solid lines, marked by the green dotted line, corresponds to the solution (eqpLin) of the QP equation with linearization.