08. I–V characteristics — Landauer integration and the symmetric bias window
Chapter 07 produced the transmission of the C19N chain. This chapter feeds that into the Landauer formula to compute the I–V curve. The calculation itself is a Python integration, but a single convention — where the bias window is placed — governs the physical interpretation of the result. Why the symmetric window is standard, and what artificial rectification signal an asymmetric window creates, are the core of this chapter.
Learning objectives
- Understand the meaning of the zero-bias approximation — integrating a fixed over a bias window — and the limits of its applicability.
- Explain the rationale for the symmetric bias window .
- Identify the mechanism by which an asymmetric window produces an artificial rectification signal in a symmetric junction.
- Read from
trans.TBT.ncwith sisl and obtain the I–V curve by trapezoidal integration. - Know the form of the finite-temperature extension (Fermi–Dirac weighting).
Theory — the zero-bias approximation and the Landauer integral
In the zero-temperature Landauer formula the Fermi-function difference becomes a step: 1 between the two chemical potentials and 0 outside. The current is therefore the integral of over the bias window.
Using as the transmission of the Hamiltonian converged at 0 V is the zero-bias approximation. It is the low-voltage approximation of the Landauer picture [1] and assumes that does not change when a bias is applied. It is therefore valid only for systems with small bias and good screening. To include the deformation of with bias, a self-consistent calculation must be redone at every bias — that is the finite-bias TranSIESTA of Chapter 09.
The symmetric bias window
The two ends of the window are placed symmetrically.
This choice is equivalent to assuming that "when a bias is applied, the electrostatic potential drop is split evenly between the two sides of the junction, and the levels of the scattering region stay at the mean potential of the two electrodes." For a symmetric junction whose left and right are equivalent, this is the only self-consistent choice. An immediate consequence of the symmetric window is that, whatever the shape of the fixed ,
holds exactly. That is, under the zero-bias approximation with a symmetric window the I–V curve is always antisymmetric about the origin, and rectification cannot appear in principle.

Figure 1. The symmetric bias window (schematic) — the current is the integral under the curve over the interval (shaded), and the width of the integration window is .
Some legacy scripts use the asymmetric convention , , which pins one electrode to ground. Performing the zero-bias-approximation integral with this convention gives
so that positive bias integrates only the below and negative bias only the above . If is asymmetric about (as almost every real system is), then , and this looks like a rectification ratio. But it is not physics — it is an artifact created by the integration convention. In the zero-bias approximation is bias-invariant, so rectification in a symmetric junction is impossible in principle.
- If asymmetry appears in the I–V curve of a symmetric junction, suspect the window convention of the integration script before the result itself.
- Discussing rectification or NDC (negative differential conductance) requires a self-consistent finite-bias calculation (Chapter 09) in which actually deforms with bias.
For reference, in a self-consistent finite-bias calculation and are gauge choices differing only in the overall potential reference, so the physics is the same. What matters is the window position in the zero-bias approximation, where a fixed is integrated after the fact.
Finite temperature
At finite temperature the step is smoothed by the Fermi–Dirac distribution.
The effect is a spreading of the window edges over a width (about at ). The difference between the two results is largest when a window edge crosses a sharp feature of (a resonance or antiresonance).
Prerequisites
The 0bias/trans.TBT.nc produced by the TBtrans calculation of Chapter 07 is required. Following the tutorial standard, the energy grid is with TBT.Contours.Eta 0.001 eV, and the grid spacing equals at 1 meV. The resolution of the window integral is tied directly to this grid, so if I–V is the goal it is best to make the grid sufficiently fine.
is always read from trans.TBT.nc with sisl. The AVTRANS-family text output that TBtrans also writes requires separately verifying the energy alignment and k-averaging, so it is not parsed — the netCDF path handles the energy origin () and the k-averaging consistently.
Integration code
"""zero-bias approximation I-V: integrate T(E) from trans.TBT.nc over a symmetric bias window."""
import numpy as np
import sisl
from scipy.constants import e, h
tbt = sisl.get_sile("0bias/trans.TBT.nc")
E = np.asarray(tbt.E) # E - E_F (eV)
T = np.asarray(tbt.transmission()) # first two electrodes (Left -> Right)
def current_zero_bias(E, T, V, Ef=0.0):
"""Current (A) from integrating a fixed T(E) over the symmetric window [Ef - |V|/2, Ef + |V|/2].
For a symmetric window the integration interval depends only on |V|, so the sign is applied last.
I(-V) = -I(V) then holds automatically by convention.
"""
if V == 0.0:
return 0.0
mu_L = Ef + 0.5 * abs(V)
mu_R = Ef - 0.5 * abs(V)
mask = (E >= mu_R) & (E <= mu_L)
integral = np.trapz(T[mask], E[mask]) # integral in eV
I = (2.0 * e / h) * integral * e # trailing e: eV -> J conversion
return np.sign(V) * I
bias = np.round(np.arange(-1.0, 1.001, 0.1), 3)
I = np.array([current_zero_bias(E, T, V) for V in bias])
np.savetxt("iv_zerobias.dat",
np.column_stack([bias, I * 1e6]),
header="V (V) I (uA)")
import matplotlib.pyplot as plt
plt.plot(bias, I * 1e6, "o-")
plt.axhline(0.0, color="gray", lw=0.5)
plt.axvline(0.0, color="gray", lw=0.5)
plt.xlabel("V (V)")
plt.ylabel(r"I ($\mu$A)")
plt.savefig("iv_zerobias.png", dpi=200, bbox_inches="tight")
Line-by-line notes:
tbt.E— the energy grid stored in the netCDF file. It is (eV) by TBtrans output convention, soEf=0.0is the Fermi level.tbt.transmission()— with arguments omitted, returns the k-averaged transmission between the first two electrodes (Left, Right).mask— selects only the grid points inside the window and integrates withnp.trapz(trapezoidal rule). If a window edge falls between grid points the edge sliver is truncated, so the finer the grid the smaller the error (Exercise 3). From NumPy 2.0 on, usenp.trapezoidinstead ofnp.trapz.- Units — in the integral was computed in eV, so multiplying once more by to convert to J gives the result in A. Multiply by
1e6for A and1e9for nA.
Running
cd 03_transport
python iv_zerobias.py
head iv_zerobias.dat
Output analysis

Figure 2. I–V obtained by integrating the TB-model over a symmetric window — it is antisymmetric, , and the low-bias slope matches the dashed line. (Actual TB-model calculation, _scripts/fig_examples_batch.py)
For the C19N chain (a symmetric junction with a single N atom at the center), the expected shape of the curve is as follows.
- Antisymmetry about the origin. must hold exactly within numerical error. If it is broken, check the window convention and the integration code first.
- Linear region at low bias. As the slope is . For a pristine cumulene chain the two channels near give (), but the N substitution scatters both channels so is smaller than that. Check that the slope agrees with the value obtained in Chapter 07. For a sense of magnitude: a channel with carries about at .
- Slope changes. Whenever the window edges cross a peak or valley of (the resonance structure created by the N impurity), the differential conductance changes. Mapping the kinks of the I–V curve by drawing the window on the plot makes the structure of the zero-bias approximation clear.
- Limits of the zero-bias approximation. This curve has neither rectification nor NDC — it is a monotonic integral of a fixed . Whether it agrees with the finite-bias calculation (Chapter 09) at low bias, and how far the two diverge at high bias, tells you the validity range of the approximation.
Finite-T extension
Adding Fermi–Dirac weighting only smooths the window function; the structure is the same.
def current_finite_T(E, T, V, kT=0.02585, Ef=0.0):
"""Landauer current (A) including Fermi-Dirac weighting. Unit of kT: eV."""
mu_L = Ef + 0.5 * V
mu_R = Ef - 0.5 * V
fL = 1.0 / (np.exp((E - mu_L) / kT) + 1.0)
fR = 1.0 / (np.exp((E - mu_R) / kT) + 1.0)
return (2.0 * e / h) * np.trapz(T * (fL - fR), E) * e
Since handles the sign automatically, no sign/abs treatment is needed, and the expression converges to the step window as . The only caveat is that the integration range must extend a few beyond the window — the tutorial grid is sufficient for a scan (window edges ).
Exercises
-
Confirm the artificial rectification signal. Rewrite
current_zero_biasfor the asymmetric window (, ) and recompute the I–V curve from the same . Compute as a "rectification ratio", and explain which property of it comes from and why it is not physical rectification. -
Temperature effect. Overlay the and I–V curves on the same plot. At which bias is the difference between the two curves largest, and what feature of is the window edge crossing at that point?
-
Grid convergence. Recompute the I–V curve from data thinned to every fifth point (
E[::5], T[::5]) and plot the relative error against the original as a function of bias. Explain why the error is especially large at low bias in terms of the number of grid points inside the window.
Ref: S. Datta, Quantum Transport: Atom to Transistor (Cambridge UP, 2005); Chapter 07 (obtaining T(E)), Chapter 09 (self-consistent finite bias).