Name

TransmissionSpectrum — Class for representing the transmission spectrum for a given configuration and calculator.

Synopsis

Namespace: NanoLanguage
TransmissionSpectrum(
configuration,
energies,
kpoints,
kpoints_weights,
self_energy_calculator,
energy_zero_parameter,
infinitesimal
)

Description

Constructor for the TransmissionSpectrum object.

TransmissionSpectrum Arguments

configuration

The two-probe configuration with attached calculator for which the transmission spectrum should be calculated.

Type: A DeviceConfiguration or a BulkConfiguration as the electrode.

Default: None
energies

The energies for which the transmission spectrum should be calculated.

Type: List containing elements of the type PhysicalQuantity of with energy unit.

Default: energy range that covers the bias window as specified by the DoubleContourIntegralParameters.
kpoints

The k-points for which the transmission spectrum should be calculated.

Type: MonkhorstPackGrid or list of floats with shape (:,3), i.e. [[ 0.0, 0.0, 0.0], [0.5,0.0,0.0]].

Default: MonkhorstPackGrid(nx,ny), where nx, ny is the sampling used for the self consistent calculation.
kpoints_weights

The weight of each k-point for which the transmission spectrum should be calculated.

Type: A list of floats.

Default: The weights corresponding to the MonkhorstPackGrid, or list of [1.,1.,..] if k-points are specified as floats.
self_energy_calculator

The SelfEnergyCalculator to be used for the transmission spectrum.

Type: DirectSelfEnergy | RecursionSelfEnergy | KrylovSelfEnergy.

Default: KrylovSelfEnergy.
energy_zero_parameter

Specifies the choice for the energy zero.

Type: AverageFermiLevel | AbsoluteEnergy .

Default: AverageFermiLevel.
infinitesimal

Small energy, used to move the transmission calculation away from the real axis. This is only relevant for recursion-style self-energy calculators.

Type: PhysicalQuantity with energy unit.

Default: 1.0e-6*eV.

TransmissionSpectrum Methods

A TransmissionSpectrum object provides the following methods:

  • bias(): Return the applied bias

  • conductance(electrode_voltages, electrode_temperatures, coupling_rates, spin): Calculate the differential conductance

    electrode_voltages

    The electrode voltages to be used for defining the bias window for the conductance calculation. If no voltage is specified it will use the voltages in the self-consistent calculation. If voltages are specified the current will be obtained non-self-consistent.

    Type: Must be given as 2 voltages - for example, [-0.5, 0.5]*Volt.

    Default: None
    electrode_temperatures

    The electrode temperatures to be used the current calculation.

    Type: Must be given as 2 temperatures - for example, [100, 200]*Kelvin.

    Default: The temperature used for the self-consistent calculation.
    coupling_rates

    Two fractions (alfa_L, alfa_R) with alfa_L+ alfa_R=1, which specifies the fraction of the differential voltage, alfa_L*dV, added to the left electrode_voltage, and alfa_R*dV, added to the right electrode voltage. See also note below.

    Type: Two fractions (alfa_L, alfa_R) with alfa_L+ alfa_R=1 - for example, [0.3, 0.7]

    Default: Default [0.5,0.5]
    spin

    The spin of the Conductance

    Type: Spin.Up | Spin.Down | Spin.Sum

    Default: Spin.Sum
  • current(electrode_voltages, electrode_temperatures, spin): Calculate the current with positive direction from left to right

    electrode_voltages

    The electrode voltages to be used for defining the bias window for the current calculation. If no voltage is specified it will use the voltages in the self-consistent calculation. If voltages are specified the current will be obtained non-self-consistent.

    Type: Must be given as 2 voltages - for example, [-0.5, 0.5]*Volt.

    Default: None
    electrode_temperatures

    The electrode temperatures to be used the current calculation.

    Type: Must be given as 2 temperatures - for example, [100, 200]*Kelvin.

    Default: The temperature used for the self-consistent calculation.
    spin

    The spin of the current

    Type: Spin.Up | Spin.Down | Spin.Sum

    Default: Spin.Sum
  • electrodeFermiLevels(): Return the electrodes Fermi levels in absolute energies

  • electrodeFermiTemperatures(): Return the electrodes Fermi temperature used in this transmission spectrum

  • electrodeVoltages(): Return the electrode_voltages used in this transmission spectrum

  • energies(): Return the energies used in this transmission spectrum

  • energyZero(): Return the energy zero used for the energy scale in this transmission spectrum

  • evaluate(kpoints, spin): Return the k-point averaged transmission spectrum.

    kpoints

    The set of k-points to average over. If none is given, the transmission is averaged over all k-points.

    Type: MonkhorstPackGrid or list of floats with shape (:,3), i.e. [[ 0.0, 0.0, 0.0], [0.5,0.0,0.0]].

    Default: None
    spin

    The spin to select for.

    Type: Spin.Up | Spin.Down

    Default: Spin.Up
  • infinitesimal(): Return the infinitesimal used in for calculating the transmission

  • kpoints(): Return the k-points used in this transmission spectrum

  • kpointsWeights(): Return the weights of the k-points used in this transmission spectrum

  • nlprint(stream): Print a string containing an ASCII table useful for plotting the transmission spectrum.

    stream

    The stream the transmission spectrum should be written to.

    Type: A stream that supports strings being written to using 'write'.

    Default: sys.stdout
  • spins(): Return the spins used in this transmission spectrum

  • transmission(): Return the transmission coefficients of the transmission spectrum. The data is returned as a list with spin, energy and kpoint index, data[s][e][k], where s, e, k are integers looping over the number of spins, energies and kpoints

Usage Examples

Calculate the transmission spectrum and for each energy print out all k-dependent coefficients

# Define A,B directions of lattice
vector_a = [5.0, 0.0, 0.0]*Angstrom
vector_b = [0.0, 5.0, 0.0]*Angstrom

# Setup a device configuration
electrode = BulkConfiguration(
    bravais_lattice=UnitCell(vector_a, vector_b,
                             [0.0, 0.0, 9.0]*Angstrom),
    elements=[Lithium, Lithium, Lithium],
    cartesian_coordinates=[[ 2.5,  2.5,  1.5],
                           [ 2.5,  2.5,  4.5],
                           [ 2.5,  2.5,  7.5]]*Angstrom
    )
central_region = BulkConfiguration(
    bravais_lattice= UnitCell(vector_a, vector_b,
                             [0.0, 0.0, 22.0]*Angstrom),
    elements=[Lithium, Lithium, Lithium, Hydrogen, Hydrogen,
              Lithium, Lithium,  Lithium],
    cartesian_coordinates=[[  2.5,   2.5,   1.5],
                           [  2.5,   2.5,   4.5],
                           [  2.5,   2.5,   7.5],
                           [  2.5,   2.5,  10.5],
                           [  2.5,   2.5,  11.5],
                           [  2.5,   2.5,  14.5],
                           [  2.5,   2.5,  17.5],
                           [  2.5,   2.5,  20.5]]*Angstrom
     )
device_configuration = DeviceConfiguration(
    central_region,
    [electrode, electrode]
    )

# Setup calculators
numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(1, 1, 100))

electrode_calculator = HuckelCalculator(
    numerical_accuracy_parameters=numerical_accuracy_parameters)

calculator = DeviceHuckelCalculator(
    numerical_accuracy_parameters=numerical_accuracy_parameters,
    electrode_calculators=[electrode_calculator, electrode_calculator])

device_configuration.setCalculator(calculator)

# Calculate the transmission coefficient
transmission_spectrum = TransmissionSpectrum(
    configuration=device_configuration,
    energies=numpy.linspace(-0.5,0.5,10)*eV,
    kpoints=MonkhorstPackGrid(3,3,1),
    energy_zero_parameter=AverageFermiLevel,
    infinitesimal=1e-06*Units.eV
    )

# Print out all k-dependent transmission coefficients
data = transmission_spectrum.transmission()
energies = transmission_spectrum.energies()
kpoints = transmission_spectrum.kpoints()
spins = ["Up", "Down"]
print data
for s in range(len(data)):
    print "Transmission coefficient of spin component ", spins[s]
    for i in range(data[s].shape[0]):
        print 'Transmission at energy = %12.6f eV' % (energies[i].inUnitsOf(eV))
        print '      kx         ky      transmission '
        for j in range(data[s].shape[1]):
            print '%10.4f %10.4f %16.6e' % \
                  (kpoints[j][0],kpoints[j][1],data[s][i][j])
        print

li_h2_li_trans.py

Alternatively to using the MonkHorstPackGrid class, we can also specify the k-points and weights directly. The k-points are specified in units of the reciprocal lattice vectors. Note that except for the Gamma point, the k-points have weight 2 due to use of time-reversal symmetry, i.e  T(k)=T(-k).

transmission_spectrum = TransmissionSpectrum(
    configuration=device_configuration,
    energies=numpy.linspace(-0.5,0.5,10)*eV,
    kpoints=[[0.0,0.0,0.0],[0.0,1./3.,0.0],[1./3.,-1./3.,0.0],
    [1./3.,0.0,0.0],[1./3.,1./3.,0.0]],
    kpoints_weights = [1.,2.,2.,2.,2.],
    energy_zero_parameter=AverageFermiLevel,
    infinitesimal=1e-06*Units.eV
    )

li_h2_li_trans1.py

Calculate the current and differential conductance for different electron temperatures in the electrodes.

temp = numpy.linspace(0,1000,21)
currents = []
conductances = []

for t in temp:
    current = transmission_spectrum.current(
                   electrode_temperatures=[200.,t]*Kelvin
		   )
    currents.append(current)

    conductance = transmission_spectrum.conductance(
                       electrode_temperatures=[200.,t]*Kelvin
		       )
    conductances.append(conductance)

print "Temperature[Left]   Temperature[Right]"\
      + "     Current     Differential-Conductance "
output_format = "      %6.0f K          %6.0f K     %s  %s"
for i in range(len(temp)):
    print output_format%(200., temp[i], currents[i], conductances[i])

current.py

Notes

To export the data of a transmission spectrum, use the method nlsave.

Unit of transmission

A fully transmitting channel contributes 1 per spin.

See also, TransmissionEigenvalues.

Current

The current is calculated from the transmission coefficient using

\displaystyle

      I(V_L, V_R, T_L, T_R) = \frac{e}{h} \sum_\sigma \int T_\sigma(E) [f(\frac{E-E_F^L+e V_R}{k_b T_R}) - f(\frac{E-E_F^L+e V_L}{k_b T_L}) ] dE,

where  f is the Fermi function, and  T_L and  T_R are the electron temperatures of the left and right electrodes, respectively. In this equation, T_\sigma(E) is the transmission coefficient for spin \sigma.

A positive current flows when the applied voltage for the left electrode is higher than that of the right one. A positive current corresponds to the flow of charge from left to right, meaning that the flow of electrons is right-to-left, (since electrons have a negative charge).

The chemical potentials of the left electrode,  \mu_L
      =E_F^L-e V_L and the right electrode,  \mu_R =E_F^L-e V_R are defined relative to the Fermi level of the left electrode, and related to the applied bias through

\displaystyle

      \mu_L-\mu_R = e V_{bias}.

The current is independent of how the voltages were applied, it only depends on their difference (i.e. on  V_{bias} ).

The transmission spectrum itself is usually rather insensitive to the temperatures  T_L and  T_R used in the self-consistent calculation, but often depends strongly on the electrode voltages V_L and  V_R . Thus, for an accurate estimate of the current, the transmission spectrum should be calculated self-consistently for each desired bias. It is, however, possible to obtain an approximation for the current at a different bias than that used in the self-consistent calculation, by giving a new set of voltages to the current() method. This will simply modify the integration range on the existing transmission spectrum. The temperature-dependence of the current can, on the other hand, in most cases be rather accurately estimated by only changing the electrode temperatures in the current calculation.

Differential conductance

The differential conductance is calculated from the transmission spectrum using

\displaystyle

      \sigma(V_L, V_R, T_L, T_R, \alpha_L, \alpha_R) =\lim_{\delta V \rightarrow 0} \frac{I(V_L+\alpha_L \delta V, V_R- \alpha_R \delta V,T_L, T_R )}{\delta V}.

The coupling constants  \alpha_L + \alpha_R = 1.0 models how the transmission spectrum couples with the left and right electrode. For a molecule strongly bound to the left electrode we must have  \alpha_L=0 and  \alpha_R=1 .

A more accurate estimate of the differential conductance which avoid introducing  \alpha_L, \alpha_R is obtained by calculating the self-consistent current at a number of applied biases, V_{bias}^1, V_{bias}^2, \ldots , and performing numerical differentiation

\displaystyle

      \sigma(V_{bias}, T_L, T_R) = \frac{I(V_{bias}^1,T_L, T_R)-I(V_{bias}^2,T_L, T_R))}{V_{bias}^1-V_{bias}^2}.