[ase-users] I-V curve from ase.transport
Vincent Pohl
v.pohl at fu-berlin.de
Fri Nov 4 16:10:05 CET 2016
Dear ASE users,
I want to compute I-V curves for an electron transport though a
nanojunction. I have used the transport module of ASE to compute the
transmission function. Afterwards, I wrote a function to evaluate the
current as a function of the bias (See below). I am very new in the field,
and I am not quiet sure, if I have understood everything correctly:
1) Am I right in assuming that the function "T = calc.get_transmission()"
computes the quantum conductance (G(E) in units of G_0 = 2e^2/h) and not
the transmission function which is unitless? If I am right, isn't the name
of the function quiet misleading?
2) Concerning my function to compute the I-V curve (get_current, see
below), can anyone please check its correctness? I am not quiet sure, if I
have used the correct formula, and if I have handled the ase.units
correctly.
If everything is correct, shall I add the function to the ASE transport
module and commit the changes. I think such a function might be very useful.
Thank you very much in advance for your help.
With best regards,
Vincent
----------------------------------
from __future__ import division
from ase.transport.calculators import TransportCalculator
from scipy import integrate
import numpy as np
from ase import units
import pylab as plt
h = np.array((0,)).reshape((1,1))
h1 = np.array((0, -1, -1, 0)).reshape(2,2)
energies = np.arange(-3, 3, 0.1)
tcalc = TransportCalculator(h=h, h1=h1, energies=energies)
G_E = tcalc.get_transmission() # Quantum conductance in units of G_0=2e^2/h
T_E = 2 * G_E # Transmission function (Unitless)
def get_current(bias, E, T_E, T = 0):
'''Returns the current as a function of the
bias voltage.
**Parameters:**
bias : {float, (M,) ndarray}, units: V
Specifies the bias voltage.
E : {(N,) ndarray}, units: eV
Contains energy grid of the transmission function.
T_E {(N,) ndarray}, units: unitless
Contains the transmission function.
T : {float}, units: K, optional
Specifies the temperature.
**Returns:**
I : {float, (M,) ndarray}, units: A
Contains the electric current.
'''
if not isinstance(bias, float):
bias = bias[np.newaxis]
E = E[:, np.newaxis]
T_E = T_E[:, np.newaxis]
assert T >= 0., 'Negative temperature given!'
if T==0:
fl = (E - bias / 2. <= 0).astype(int)
fr = (E + bias / 2. <= 0).astype(int)
else:
beta = 1. / (units.kB * T)
fl = 1. / (1. + np.exp(beta * (E - bias / 2.)))
fr = 1. / (1. + np.exp(beta * (E + bias / 2.)))
E = units._e * E
I = 2. * units._e / units._hplanck * integrate.simps((fl - fr) * T_E,
x=E, axis=0)
return I
bias = np.arange(0, 2, .1)
plt.plot(bias, get_current(bias, energies, T_E, T = 0.))
plt.xlabel('U [V]')
plt.ylabel('I [A]')
plt.show()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listserv.fysik.dtu.dk/pipermail/ase-users/attachments/20161104/23102615/attachment.html>
More information about the ase-users
mailing list