getelec.transmission_solutions

Closed-form and semiclassical transmission.

These are the solutions you can write down, as opposed to the numerical integration in getelec.transmission_solver. Three of them:

  • AiryTriangular -- the exact solution for a pure triangular barrier, in terms of Airy functions. No image charge, so it is not the barrier a real metal presents, but it is the one case where the Schrodinger equation has a closed form, which makes it the natural check on a numerical solver.
  • WKB -- the semiclassical result for the Schottky-Nordheim barrier. The turning points are roots of a quadratic, so the Gamow exponent needs only a quadrature, and Gauss-Chebyshev matches its endpoint behaviour exactly.
  • calculate_gamow_numeric() -- the same semiclassical physics for a barrier of any shape, where the turning points have to be found numerically. Used as the reference function for the learned solvers, whose job is to correct it.

All of them are cheap. None of them is exact for a real barrier: WKB is accurate to a factor of order unity deep in the tunnelling regime, which is fine for exploration and for use as a reference, and not fine for a published number.

Semiclassical (WKB) transmission for the Schottky-Nordheim barrier.

The Gamow exponent is

G = sqrt(2m)/hbar * integral from x1 to x2 of sqrt(V(x) - E) dx,

with V(x) = E_F + phi - F x - k_e / (4x) and x1, x2 the classical turning points, i.e. the roots of F x^2 + (E - E_F - phi) x + k_e / 4. Transmission then follows from the Kemble form, T = 1 / (1 + exp(2G)).

The integrand is sqrt(F (x2 - x)(x - x1) / x), which vanishes like a square root at both turning points. Gauss-Chebyshev quadrature of the second kind carries exactly that weight, so it converges geometrically where an adaptive general-purpose rule fights the endpoint behaviour: 64 nodes give about 12 significant figures. It is also fully vectorised over energy, with no Python-level loop.

Above the barrier top the turning points become complex. There the exponent is continued using the inverted-parabola (Kemble) approximation at the barrier maximum, so T -> 1 smoothly instead of the formula breaking down.

Parameters

fermi_level, work_function, electric_field : float Barrier parameters (eV, eV, V/nm). n_nodes : int, default 64 Quadrature nodes. 64 is converged to round-off for typical parameters.

WKB( fermi_level: float = 9.5, work_function: float = 4.5, electric_field: float = 3.0, n_nodes: int = 64)
fermi_level
work_function
electric_field
n_nodes
def get_gamow_exponent(self, energies: numpy.ndarray, potential=None) -> numpy.ndarray:

Gamow exponent G at each energy (dimensionless).

Exposed separately because G, not T, is the quantity that appears in Fowler-Nordheim analysis and in slope/intercept fitting.

Parameters

energies : np.ndarray potential : potential_barrier.Barrier, optional If given, its parameters take precedence over the ones stored on this solver.

def calculate_transmission(self, potential, energies: numpy.ndarray) -> numpy.ndarray:

Transmission probability at each energy, via the Kemble form.

Exact transmission through a pure triangular barrier, via Airy functions.

For V(x) = E_F + phi - F x outside the metal and V = 0 inside, with no image term -- the barrier of ~getelec.potential_barrier.TriangularPotential -- the Schrodinger equation outside is Airy's equation, so the transmission has a closed form. A plane wave in the metal, matched at the surface to the outgoing wave Bi + i Ai outside, gives

T = (4k / (pi beta)) / [ (k/beta)^2 (Ai^2 + Bi^2) + Ai'^2 + Bi'^2 + 2k / (pi beta) ]

with k the wavevector in the metal, beta = (F / (hbar^2/2m))^(1/3), and the Airy functions evaluated at the surface, zeta = beta (E_F + phi - E) / F. The last term is the Wronskian Ai Bi' - Ai' Bi = 1/pi. It is negligible in deep tunnelling, where Bi is exponentially large, and it is what takes the result to the step-barrier value 4 k q / (k + q)^2 far above the barrier, q being the wavevector just outside the surface.

This is not the barrier a metal presents -- dropping the image charge removes the Schottky lowering, so it overestimates the barrier and underestimates emission. Its value is as a check: it is the one case where an exact answer exists, so it pins the numerical solver against something that is not another numerical solver.

Parameters

fermi_level, work_function, electric_field : float eV, eV, V/nm. Read from the barrier when one is passed.

AiryTriangular(fermi_level=9.5, work_function=4.5, electric_field=3.0)
fermi_level
work_function
electric_field
def calculate_transmission(self, potential, energies) -> numpy.ndarray:

Transmission probability at each energy.

def calculate_gamow_numeric(potential, energies, n_scan=1024, n_nodes=24):

Gamow exponent for an arbitrary barrier, by numerical quadrature.

Parameters

potential : potential_barrier.Barrier energies : array_like Energies in eV. n_scan : int Points used to bracket the turning points. n_nodes : int Quadrature nodes. 24 is ample for a reference function.

Returns

np.ndarray G at each energy. Negative above the barrier top, where it is continued with the inverted parabola at the maximum so that G passes smoothly through zero instead of jumping.

def calculate_log_kemble_numeric(potential, energies, **kwargs):

ln D from the Kemble form, using the numerical Gamow exponent.

Evaluated as -logaddexp(0, 2G), exact in both tails; taking log of the probability would bottom out near -745 and then return -inf, which is exactly where the residual is needed.

def get_log_kemble_schottky(W, F, energies):

ln D from the semiclassical Kemble form, evaluated stably.

ln(1/(1+exp(2G))) is -logaddexp(0, 2G), which is exact in both tails. Taking log of the probability instead bottoms out at about -745 and then returns -inf, which would make the residual undefined exactly where the table is most useful.