ccu.workflows.hubbard_u

This module defines the get_hubbard_u function.

This function can be used to calculate the Hubbard U parameter using linear response theory as outlined in Phys. Rev. B 71, 035105 (2005).

ccu.workflows.hubbard_u._configure_for_hubbard(calc: Vasp, atoms: Atoms, index: int = 0, enforce_strict: bool = True)[source]

Configures a calculator for a linear response calculation.

ccu.workflows.hubbard_u._response_calculation(calc: Vasp, atoms: Atoms, shifting_potential: float, index: int, scf: bool = False) float[source]
ccu.workflows.hubbard_u._verify_hubbard_parameters(calc: Vasp)[source]
ccu.workflows.hubbard_u.archive_results(grid: list[float], chi_ij0: list[float], chi_ij: list[float], *, data_file: str = 'hubbard') None[source]

Save hubbard calculation data to a .csv file in a plot-friendly format.

Parameters:
  • grid – A list of numbers representing perturbations (e.g., the x-axis).

  • chi_ij0 – The list values for the non-self consistent response function.

  • chi_ij – The list values for the self consistent response function.

  • data_file – The filename under which to save the data. Defaults to “hubbard”.

ccu.workflows.hubbard_u.get_hubbard_u(calc, atoms: Atoms, index: int = 0, grid: Iterable[float] | None = None, enforce_strict: bool = True, data_file: str = 'hubbard') float[source]

Calculates the Hubbard \(U\) parameter of an atom according to [4].

Parameters:
  • calc – A pre-configured Vasp calculator set up to run the calculation.

  • atoms – An ase.Atoms instance for which the calculation will be performed.

  • index – An int denoting the index of the atom for which the Hubbard parameter is to be calculated.

  • grid – An iterable of integers specifying the shifting potentials (in eV) that will be applied for the SCF and non-SCF calculations. Defaults to [-0.2, -0.15, -0.1, -0.05, 0, 0.05, 0.1, 0.15, 0.2].

  • enforce_strict – If True, then calculator parameters will be verified against the following checks:

    • ICHARG < 10

    • LDAU, LDAUU, LDAUJ, LDAUL are not (and won’t be) set

    • LORBIT >= 11

    • LMAXMIX >= 4

    • NSW < 1

  • data_file – A string indicating the file name to save the raw data used to calculate the response function.

Returns:

The Hubbard \(U\) parameter in eV.

Example

Calculate the Hubbard \(U\) parameter for nickel (without magnetization) in NiO similar to the tutorial here:

>>> from ase import Atoms
>>> from ase.build import bulk
>>> from ase.calculators.vasp.vasp import Vasp
>>> from ase.cell import Cell
>>> positions = [
...     [0.0, 0.0, 0.0],
...     [4.035, 4.035, 4.035],
...     [2.0175, 2.0175, 4.035],
...     [6.0525, 6.0525, 8.07],
...     [2.0175, 4.035, 2.0175],
...     [6.0525, 8.07, 6.0525],
...     [4.035, 6.0525, 6.0525],
...     [8.07, 10.0875, 10.0875],
...     [4.035, 2.0175, 2.0175],
...     [8.07, 6.0525, 6.0525],
...     [6.0525, 4.035, 6.0525],
...     [10.0875, 8.07, 10.0875],
...     [6.0525, 6.0525, 4.035],
...     [10.0875, 10.0875, 8.07],
...     [8.07, 8.07, 8.07],
...     [12.105, 12.105, 12.105],
...     [2.0175, 2.0175, 2.0175],
...     [6.0525, 6.0525, 6.0525],
...     [4.035, 4.035, 6.0525],
...     [8.07, 8.07, 10.0875],
...     [4.035, 6.0525, 4.035],
...     [8.07, 10.0875, 8.07],
...     [6.0525, 8.07, 8.07],
...     [10.0875, 12.105, 12.105],
...     [6.0525, 4.035, 4.035],
...     [10.0875, 8.07, 8.07],
...     [8.07, 6.0525, 8.07],
...     [12.105, 10.0875, 12.105],
...     [8.07, 8.07, 6.0525],
...     [12.105, 12.105, 10.0875],
...     [10.0875, 10.0875, 10.0875],
...     [14.1225, 14.1225, 14.1225],
... ]
>>> cell = Cell([[8.07, 4.035, 4.035], [4.035, 8.07, 4.035], [4.035, 4.035, 8.07]])
>>> nio = Atoms("Ni16O16", positions=positions, cell=cell, pbc=True)
>>> magmoms = []
>>> for i, atom in enumerate(nio):
...     if atom.symbol == "Ni":
...         factor = 1 if i % 2 == 0 else -1
...         magmoms.append(factor)
...     else:
...         magmoms.append(0)
>>>
>>> nio.set_initial_magnetic_moments(magmoms)
>>> calc = Vasp(  
...     prec="Accurate",
...     ediff=1e-6,
...     ismear=0,
...     sigma=0.2,
...     ispin=2,
...     lorbit=11,
...     lmaxmix=4,
...     magmoms=magmoms,
...     atoms=atoms,
... )
>>> index = nio.get_chemical_symbols().index("Ni")
>>> perturbations = [x / 100 for x in range(-20, 25, 5)]
>>> get_hubbard_u(calc, nio, index, perturbations)  
    5....
ccu.workflows.hubbard_u.get_ionic_charges(directory: Path | None) list[source]

Parses an OUTCAR directory for the charges.

Parameters:

directory – A string or pathlib.Path instance representing the directory containing the OUTCAR. Defaults to the current working directory.

Returns:

A list of dictionaries containing the s, p, and d orbital occupancies. The occupancies are ordered consistent with the POSCAR and POTCAR files. For example:

[{"s": 0.1, "d": 0.32, "f": 0.812}]