Self-Consistent NEGF-DFT

This section details the self-consistent procedure combining NEGF and DFT calculations, including density matrix construction, convergence strategies, and practical considerations.

Theory Overview

Basic Procedure

The self-consistent NEGF-DFT cycle:

  1. Initial Guess

    • Start with DFT density

    • Set up contact parameters

    • Define integration grid

  2. NEGF Step

    • Calculate Green’s functions

    • Construct density matrix

    • Update chemical potentials

  3. DFT Step

    • Generate Fock matrix

    • Update electronic structure

    • Check convergence

  4. Iterate until convergence

Implementation Classes

The gauNEGF package provides two main classes for NEGF-DFT calculations:

  1. NEGF Class (scf.py)

    • Energy-independent self-energies [Damle2002]

    • Constant broadening

    • Simple contact models

    • Faster calculations

    • Suitable for quick tests and initial setup

  2. NEGFE Class (scfE.py)

    • Energy-dependent self-energies

    • Temperature effects

    • Advanced contact models (Bethe lattice [Jacob2011], 1D chain)

    • Not approximate

    • Longer calculations (10-100x compute)

Mathematical Details

Density Matrix

The non-equilibrium density matrix has two components:

\[P = P_{eq} + P_{neq}\]

which are given by the definite integrals (assuming T=0):

\[ \begin{align}\begin{aligned}P_{eq} = -\frac{1}{\pi} \Im \int_{-\infty}^{E_F} G^r(E) dE\\P_{neq} = -\frac{1}{2\pi} \int_{E_F}^{E_F+V/2} G^r(E)\Gamma(E)G^a(E) dE + -\frac{1}{2\pi} \int_{E_F}^{E_F-V/2} G^r(E)\Gamma(E)G^a(E) dE\end{aligned}\end{align} \]

For the energy-independent case (NEGF), Γ(E) is constant. For the energy-dependent case (NEGFE), both G(E) and Γ(E) vary with energy.

Implementation

Integration Methods

Energy-Independent Case (NEGF):

from gauNEGF.scf import NEGF

# Initialize with constant self-energies
negf = NEGF('molecule', basis='lanl2dz')
negf.setSigma([1], [6])  # Simple constant self-energy

Energy-Dependent Case (NEGFE):

from gauNEGF.scfE import NEGFE

# Initialize with energy-dependent self-energies
negf = NEGFE('molecule', basis='lanl2dz')
negf.setContactBethe([1,2,3], [4,5,6], latFile='Au', T=300)  # Bethe lattice with temperature

# Set integration parameters
negf.setIntegralLimits(
    N1=100,     # Complex contour points
    N2=50,      # Real axis points
    Emin=-50,   # Lower bound
    T=300       # Temperature in K
)

Convergence Acceleration

Density mixing strategies (applicable to both NEGF and NEGFE):

The Pulay mixing method [Pulay1980] is a powerful convergence acceleration technique that uses information from previous iterations to predict the optimal density matrix. This method is particularly effective for systems with challenging convergence behavior.

# Simple mixing
negf.SCF(damping=0.02, pulay=False)

# Pulay mixing (DIIS)
negf.SCF(damping=0.02, pulay=True, nPulay=4)  # Use 4 previous iterations

Practical Considerations

Choosing Between NEGF and NEGFE

Guidelines for selecting the appropriate class:

  1. Use NEGF when:

    • Quick initial tests are needed

    • System is well-described by constant self-energies

    • Temperature effects are negligible

    • Performance is critical

  2. Use NEGFE when:

    • Accurate transport properties are needed

    • Temperature effects are important

    • Realistic contact models are required

    • Energy-dependent effects are significant

Convergence Issues

Common problems and solutions:

  1. Charge Oscillations

    • Reduce mixing parameter

    • Increase Pulay vectors

    • Check contact parameters

  2. Orbital Occupation Inaccurate

    • Verify integration limits

    • Increase integration Grid

  3. Slow convergence

    • Add broadening (eta) to surfG

    • Change fermi solver

    • Reduce system/basis size

Example Workflows

Basic NEGF Calculation

Quick test with energy-independent self-energies:

from gauNEGF.scfE import NEGFE

# Initialize system
negf = NEGF('molContact', basis='lanl2dz')
negf.setContacts([1], [2], sig=-0.05j)
negf.setVoltage(0.0)

# Run SCF
negf.SCF(conv=1e-4, damping=0.02)

Production NEGFE Calculation

Accurate calculation with temperature effects:

from gauNEGF.scfE import NEGFE

# Initialize system
negf = NEGFE('molecule', basis='lanl2dz')
negf.setContactBethe([1,2,3], [4,5,6], latFile='Au2', T=300)

# Set voltage and run SCF
negf.setVoltage(0.0, fermiMethod='predict')
negf.SCF(conv=1e-4, damping=0.02)

Next Steps

Continue to Transport Calculations for details on calculating transport properties.

[Damle2002]

Damle, P., Ghosh, A. W., & Datta, S. (2002). First-principles analysis of molecular conduction using quantum chemistry software. Chemical Physics, 281(2-3), 171-187. DOI: 10.1016/S0301-0104(02)00496-2

[Pulay1980]

Pulay, P. (1980). Convergence acceleration of iterative sequences. The case of SCF iteration. Chemical Physics Letters, 73(2), 393-398. DOI: 10.1016/0009-2614(80)80396-4

[Jacob2011]

Jacob, D., & Palacios, J. J. (2011). Critical comparison of electrode models in density functional theory based quantum transport calculations. The Journal of Chemical Physics, 134(4), 044118. DOI: 10.1063/1.3526044