BAND: NiO with DFT+U

The hubbard method is a way to calculate band gaps for metal oxides for which a normal GGA fails to predict a band gap.

Example usage: (Download BAND_NiO_HubbardU.py)

#!/usr/bin/env amspython
import scm.plams as plams

""" Run as: $AMSBIN/amspython BAND_NiO_HubbardU.py """


def main():

    # this line is not required in AMS2025+
    plams.init()

    d = 2.085
    mol = plams.Molecule()
    mol.add_atom(plams.Atom(symbol="Ni", coords=(0, 0, 0)))
    mol.add_atom(plams.Atom(symbol="O", coords=(d, d, d)))
    mol.lattice = [[0.0, d, d], [d, 0.0, d], [d, d, 0.0]]

    ams_settings = plams.Settings()
    ams_settings.input.ams.task = "SinglePoint"
    ams_settings.input.band.Unrestricted = "yes"
    ams_settings.input.band.XC.GGA = "BP86"
    ams_settings.input.band.Basis.Type = "DZP"
    ams_settings.input.band.KSpace.Quality = "Basic"
    ams_settings.input.band.NumericalQuality = "Normal"
    ams_settings.input.band.DOS.CalcPDOS = "Yes"
    ams_settings.input.band.HubbardU.Enabled = "Yes"
    ams_settings.input.band.HubbardU.UValue = "0.6 0.0"
    ams_settings.input.band.HubbardU.LValue = "2 -1"

    job = plams.AMSJob(settings=ams_settings, molecule=mol, name="NiO")
    job.run()

    toeV = plams.Units.convert(1.0, "hartree", "eV")
    topvb = job.results.readrkf("BandStructure", "TopValenceBand", file="engine") * toeV
    bottomcb = job.results.readrkf("BandStructure", "BottomConductionBand", file="engine") * toeV
    gap = bottomcb - topvb

    plams.log("Results:")
    plams.log(f"Top of valence band:       {topvb:7.2f} eV")
    plams.log(f"Bottom of conduction band: {bottomcb:7.2f} eV")
    plams.log(f"Band gap:                  {gap:7.2f} eV")


if __name__ == "__main__":
    main()

Results

Top of valence band:       -6.21 eV
Bottom of conduction band: -4.30 eV
Band gap:                  1.91 eV