TransmissionSpectrum — Class for representing the transmission spectrum for a given configuration and calculator.
Constructor for the TransmissionSpectrum object.
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
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.
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.
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.
The SelfEnergyCalculator to be used for the transmission spectrum.
Type: DirectSelfEnergy | RecursionSelfEnergy | KrylovSelfEnergy.
Default:
KrylovSelfEnergy.
Specifies the choice for the energy zero.
Type: AverageFermiLevel | AbsoluteEnergy .
Default:
AverageFermiLevel.
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.
A TransmissionSpectrum object provides the following methods:
bias(): Return the applied bias
conductance(electrode_voltages, electrode_temperatures, coupling_rates, spin): Calculate the differential conductance
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
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.
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]
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
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
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.
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.
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
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.
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
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
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
.
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
)
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])
To export the data of a transmission spectrum, use the method nlsave.
A fully
transmitting channel contributes
per spin.
See also, TransmissionEigenvalues.
The current is calculated from the transmission coefficient using
where
is the Fermi function, and
and
are the electron temperatures of the left and right
electrodes, respectively.
In this equation,
is
the transmission coefficient for spin
.
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,
and the right electrode,
are
defined relative to the Fermi level of the left electrode, and related to the
applied bias through
The current is independent of how the voltages were applied,
it only depends on their difference (i.e. on
).
The transmission spectrum itself is usually rather insensitive to the temperatures
and
used in the self-consistent calculation, but often
depends strongly on the electrode voltages
and
.
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.
The differential conductance is calculated from the transmission spectrum using
The coupling constants
models how the
transmission spectrum couples with the left and right electrode. For a molecule
strongly bound to the left electrode we must have
and
.
A more accurate estimate of the differential conductance which avoid introducing
is obtained by calculating the self-consistent
current at a number of applied biases,
,
and performing numerical differentiation