calculateLocalScreenedCoulombCorrectionHubbardU

calculateLocalScreenedCoulombCorrectionHubbardU(configuration, shell_indices)

Calculate Hubbard U values using the Local Screened Coulomb Correction method.

Parameters:
Returns:

A list of tuples (atom_index, u_values) with the atom index and the corresponding calculated Us.

Return type:

list

Notes

The DFT+U method attempts to include the exact onsite interaction energy between electrons in certain selected shells, that is poorly captured by mean-field theories like DFT. This interaction energy is proportional to the term

\[\langle nm_1, nm_2| \hat{V}_\mathrm{sc} | nm_3, n_4 \rangle = \iint \phi_{nm_1}^*(\mathbf{r}) \phi_{nm_2}^*(\mathbf{r}') v_\mathrm{sc}(\mathbf{r}, \mathbf{r}') \phi_{nm_3}(\mathbf{r}) \phi_{nm_4}(\mathbf{r}'') d\mathbf{r} d\mathbf{r}',\]

where \(v_\mathrm{sc}(\mathbf{r}, \mathbf{r}')\) is the effective screened Coulomb potential.

In the Local Screened Coulomb Correction method[1] one approximates the screened Coulomb potential with a simple isotropic Yukawa potential

\[v_\mathrm{sc}(\mathbf{r}, \mathbf{r}') = \frac{e^{-\lambda |\mathbf{r} - \mathbf{r}'|}}{|\mathbf{r} - \mathbf{r}'|},\]

where one takes the screening parameter, \(\lambda\), from the Thomas-Fermi screening model

\[\lambda = 2 \left( \frac{3}{\pi} \rho \right)^{1/6}\]

with \(\rho\) being the valence electron density.

In QuantumATK the U for a given orbital on an atom is calculated using the same screening parameter for the entire atom calculated by averaging the local screening parameter over a small sphere around the atom, weighting it by the local valence density:

\[\bar{\lambda}_i = \frac{\int_{\Omega_i} \lambda(\mathbf{r}) \rho(\mathbf{r}) d\mathbf{r}}{\int_{\Omega_i} \rho(\mathbf{r}) d\mathbf{r}}\]

The radius of the integration spheres are chosen to be the covalent radius for the specific atom.

Note

The Hubbard U values obtained with the LSCC method are not directly comparable to those obtained with other methods and codes as they strongly depend on the chosen pseudopotential and the shape of the basis set orbitals. For instance for the 3d shell of Mn in MnO a U value of 7.3 eV is obtained with the Medium basis set for the PseudoDojo pseudopotential, while with the Double Zeta Polarized basis set for the FHI pseudopotentials a value of 4.9 eV is obtained. The validity and utility of the calculated Hubbard U’s should should mostly be based on their ability to reproduce physical properties in an actual DFT+U calculation.

Attention

The LSCC assumes that Hubbard energy term is based on projection on the local basis set orbitals. Such a projection method is not implemented in QuantumATK, but one can use the Dual which is the closest to such a projection. We do not recommend the Onsite projection with the U’s obtained with the LSCC method, as the projection orbitals do not resemble those the U’s were calculated for.

Usage Examples

The following script snippet calculates and prints the LSCC U value for the 3d shell of Manganese in MnO.

# Calculate LSCC U values for Mn 3d shell

shell_indices = {Manganese: [3]} # 3d orbital has index 3 in the PseudoDojo Medium basis set

lscc_u_per_atom = calculateLocalScreenedCoulombCorrectionHubbardU(
    configuration=manganosite,
    shell_indices=shell_indices
)

for atom_index, u_values_per_shell in lscc_u_per_atom:
    nlprint('{:d}: U for 3d shell: {:.3f} eV'.format(atom_index, u_values_per_shell[0].inUnitsOf(eV)))

For non-isotropic systems with many atoms, one will obtain different U values for different atomic sites. In order to give different U values to different atoms in a DFT calculation one has to use different basis set objects for each different atom, which in practice is done by tagging the atom and adding a specific basis set for that particular tag. This can conveniently be done programmatically with the utility function createLocalDFTUBasisSet() as seen in the following:

# Create a new configuration where the atoms with U values are tagged and create basis sets for
# these tags which sets the U value to the ones calculated above.
configuration_with_tags, basis_set_with_u = createLocalDFTUBasisSet(
    configuration=manganosite,
    basis_set=calculator.basisSet(),
    shell_indices=shell_indices,
    atom_u_values=lscc_u_per_atom
)

# Create the XC functional with +U using the 'Dual' projection method.
xc_with_dftu = ExchangeCorrelation(
    exchange=PerdewBurkeErnzerhofExchange,
    correlation=PerdewBurkeErnzerhofCorrelation,
    hubbard_term=Dual,
    number_of_spins=2
)

# Create a copy of the original calculator but change xc to DFT+U and use the basis set
# with U values.
calculator_with_u = calculator(
    exchange_correlation=xc_with_dftu,
    basis_set=basis_set_with_u)

configuration_with_tags.setCalculator(calculator_with_u)

# Perform the DFT+U calculation
configuration_with_tags.update()

For full calculation example see the script MnO_LSCC_U.py.