Name

calculateDensityOfStates Calculates the Density Of States (DOS) for a two-probe system.

Synopsis

Namespace: ATK.TwoProbe
DensityOfStates calculateDensityOfStates(
self_consistent_calculation,
energies,
brillouin_zone_integration_parameters,
green_function_infinitesimal
)

Description

The function calculateDensityOfStates() calculates and returns the density of states (DOS) as a function of energy for a two-probe system.

List of arguments

self_consistent_calculation

An object returned from a previously performed self-consistent calculation for a TwoProbeConfiguration.

Default: None

energies

A list of the energies for which the DOS should be calculated, e.g. [0.0*eV,0.5*eV,1.0*eV]. Must be specified.

Default: None

brillouin_zone_integration_parameters

The k-point sampling used for integrating over the 2D Brillouin zone transverse to the transport direction.

Default: brillouinZoneIntegrationParameters((1,1))

green_function_infinitesimal

The imaginary infinitesimal added to the energy of the retarded Green's function.

Default: 1.0e-5*eV

Returned object methods

The returned object has the following query method:

  • Array densityOfStates(): Returns the Density Of States (DOS) as a NumPy array with dimensionality

    • (2, n_E) for spin-polarized calculations.

    • (n_E) for spin-unpolarized calculations.

    where n_E is the number of energy points. Use the shape property to check if the calculation is spin-polarized or not (see examples below).

  • Array energies(): Returns the corresponding energies of the Density Of States (DOS) in a NumPy array.

Usage examples

Calculate and print the DOS (cf. the similar script for the transmission spectrum):

from ATK.TwoProbe import *
import numpy

# scf = restoreSelfConsistentCalculation ('lih2li-scf.nc')

density_of_states = calculateDensityOfStates(
    self_consistent_calculation = scf,
    energies = [0.*electronVolt]
    )
energies = density_of_states.energies()
dos = density_of_states.densityOfStates()
if len(dos.shape)==2:
    # spin-polarized
    print '                   Density of states'
    print 'Energy (eV)     Spin-up       Spin-down'
    print '------------------------------------------'
    for i in range(len(energies)):
        print "%g\t%g\t%g" % ( energies[i].inUnitsOf(eV),
            dos[0,i].inUnitsOf(eV**(-1)),dos[1,i].inUnitsOf(eV**(-1)) )
else:
    print 'Energy (eV)     Density of states'
    print '-----------------------------------'
    for i in range(len(energies)):
        print "%g\t%g" % ( energies[i].inUnitsOf(eV),dos[i].inUnitsOf(eV**(-1)) )

Notes

The zero-point energy for the DOS is the average Fermi level of the two electrodes.

The default k-point sampling (Γ point only) is a crude approximation if the electrodes are three-dimensional (e.g. Au fcc), but on the other hand completely sufficient if the electrodes are effectively one-dimensional (atomic chain, carbon nanotube, etc).

The transmission coefficient can be larger than unity if multiple transmission channels are available for a certain energy. Also, a transmission coefficient less than unity, does not imply that the state is not transmitted - only that the probability of the incoming wave function to be transmitted is smaller than one (quantum mechanics is inherently statistical).

To obtain the individual k-point resolved transmission coefficients T_E(k_x,k_y), use the function calculateTransmissionCoefficients().