GWR flow with convergence studies

This script shows how to compute the G0W0 corrections in silicon. More specifically, we build a flow to analyze the convergence of the QP corrections wrt to the number of bands in the self-energy. More complicated convergence studies can be implemented on the basis of this example.

run gwr g0w0
Downloading repository from: https://github.com/PseudoDojo/ONCVPSP-PBE-PDv0.4/archive/refs/heads/master.zip ...
Installing ONCVPSP-PBE-SR-PDv0.4 in: /home/runner/.abinit/pseudos/ONCVPSP-PBE-SR-PDv0.4

  0%|          | 0.00/95.5M [00:00<?, ?iB/s]
  2%|▏         | 2.10M/95.5M [00:00<00:04, 18.8MiB/s]
 24%|██▍       | 23.1M/95.5M [00:00<00:00, 120MiB/s]
 48%|████▊     | 46.1M/95.5M [00:00<00:00, 161MiB/s]
 70%|███████   | 67.1M/95.5M [00:00<00:00, 179MiB/s]
 94%|█████████▍| 90.2M/95.5M [00:00<00:00, 190MiB/s]
100%|██████████| 95.5M/95.5M [00:00<00:00, 169MiB/s]

Validating md5 checksums of ONCVPSP-PBE-SR-PDv0.4...
Checksum test: OK
Installation completed successfully in 2.15 [s]

import os
import sys
import abipy.data as data
import abipy.abilab as abilab

from abipy import flowtk
from abipy.flowtk.gwr_works import DirectDiagoWork, GWRSigmaConvWork


def build_flow(options):
    # Working directory (default is the name of the script with '.py' removed and "run_" replaced by "flow_")
    if not options.workdir:
        options.workdir = os.path.basename(sys.argv[0]).replace(".py", "").replace("run_","flow_")

    # IMPORTANT: Note stringent table to have semi-core states.
    from abipy.flowtk.psrepos import get_oncvpsp_pseudos
    pseudos = get_oncvpsp_pseudos(xc_name="PBE", version="0.4",
                                  relativity_type="SR", accuracy="stringent")

    scf_input = abilab.AbinitInput(structure=data.cif_file("si.cif"), pseudos=pseudos)

    num_ele = scf_input.num_valence_electrons

    # Global variables.
    scf_input.set_vars(
        ecut=6,
        nband=num_ele // 2,
        tolvrs=1e-8,
        paral_kgb=1,
    )

    # IMPORTANT: k-grid for GWR must be Gamma-centered.
    scf_input.set_kmesh(ngkpt=[2, 2, 2], shiftk=[0.0, 0.0, 0.0])

    flow = flowtk.Flow(workdir=options.workdir)

    # GS-SCF run to get the DEN, followed by direct diago to obtain green_nband bands.
    green_nband = -1  # -1 this means full diago
    diago_work = DirectDiagoWork.from_scf_input(scf_input, green_nband)
    flow.register_work(diago_work)

    # Build template for GWR.
    gwr_template = scf_input.make_gwr_qprange_input(gwr_ntau=6, nband=8, ecuteps=4, ecutwfn=2)

    # Two possibilities:
    # 1) To change the value of one variable, use:

    varname_values = ("nband", [8, 12, 14])

    # 2) To take the Cartesian product of two or more variables use e.g.:
    #
    #varname_values = [
    #   ("nband", [50, 100]),
    #   ("ecuteps", [2, 4]),
    #]

    # Can also use strings with path to files for den_node and wfk_node
    # so that one does not need to recompute these files.

    gwr_work = GWRSigmaConvWork.from_varname_values(
            varname_values,
            gwr_template,
            den_node=diago_work.scf_task,
            wfk_node=diago_work.diago_task,
    )
    flow.register_work(gwr_work)

    return flow


# This block generates the thumbnails in the AbiPy gallery.
# You can safely REMOVE this part if you are using this script for production runs.
if os.getenv("READTHEDOCS", False):
    __name__ = None
    import tempfile
    options = flowtk.build_flow_main_parser().parse_args(["-w", tempfile.mkdtemp()])
    build_flow(options).graphviz_imshow()


@flowtk.flow_main
def main(options):
    return build_flow(options)


if __name__ == "__main__":
    sys.exit(main())

Total running time of the script: (0 minutes 2.521 seconds)

Gallery generated by Sphinx-Gallery