This notebook contains calculations showing how Gaussian disorder affects current-voltage curves of unipolar organic diodes. The plots are in agreement with a reference.
In [1]:
%matplotlib inline
import matplotlib.pylab as plt
import numpy as np
from oedes.fvm import mesh1d
from oedes import *
from oedes.models import *
from oedes.models.egdm import GaussianDOS, EGDMMobility, egdm_params_simple
init_notebook()
In [2]:
def make_params(nsigma, voltage, Vbi=0., T=298.):
params = {
'electrode0.voltage': voltage,
'electrode0.workfunction': 0,
'electrode1.voltage': 0,
'electrode1.workfunction': -Vbi,
'T': T,
'hole.energy': 0.,
'epsilon_r': 3.
}
egdm_params_simple(params, 'hole', nsigma, 1e-9, 1e-10)
params['hole.mu'] = 1e-10
params['hole.N0'] = 4.25e26
return params
def make_model(L, level='full_egdm'):
assert level in ['no_egdm', 'diffusion_egdm', 'full_egdm']
m = mesh1d(L, dx_boundary=1e-12, epsilon_r=3.)
poisson = Poisson(m)
poisson.bc = [ AppliedVoltage(b,calculate_current=True) for b in m.boundaries ]
thermal = ConstTemperature()
if level == 'no_egdm':
dos = BoltzmannDOS()
else:
impl = functions.gdos.UnivariateInterpolatedGaussFermiFactory(
functions.gdos.defaultImpl)
dos = GaussianDOS(impl)
if level == 'full_egdm':
mobility = EGDMMobility()
else:
mobility = MobilityFromParams()
hole = BandTransport(name='hole',z=1,poisson=poisson,thermal=thermal,dos=dos,mobility_model=mobility)
hole.bc = [ FermiLevelEqualElectrode(b) for b in m.boundaries ]
model = CompositeModel([thermal, poisson, hole, RamoShockleyCurrentCalculation([poisson])])
model.setUp()
return model
In [3]:
def ivcurve(model, nsigma, voltages, current_key='J',
xguess=None, label='', **kwargs):
# Use continuation in voltage
J = []
c=context(model)
for v in progressbar(voltages,desc='V'):
params = make_params(nsigma, v, **kwargs)
c.solve(params, maxiter=60, xguess=xguess)
xguess=None
J, = c.teval(current_key)
testing.store(J, rtol=5e-2)
plt.plot(voltages, J, label=label)
def ivcurves(L, nsigmas, voltages, level='full_egdm', current_key='J', **kwargs):
# Use continuation in nsigma
model = make_model(L, level=level)
xguess = np.asarray(model.X, np.longdouble)
for nsigma in nsigmas:
params = make_params(nsigma, voltages[0], **kwargs)
xguess = solve(model, xguess, params, maxiter=60)
ivcurve(model, nsigma, voltages, xguess=xguess,
label=nsigma, current_key=current_key, **kwargs)
plt.legend(loc=0)
plt.xlim([np.amin(voltages), np.amax(voltages)])
ivaxes(plt)
def ivaxes(plt):
plt.xscale('log')
plt.yscale('log')
plt.xlabel('V')
plt.ylabel('$A/m^2$')
In [4]:
voltages = 10**np.linspace(-2, np.log(20) / np.log(10), 50)
for nsigma in [3., 6.]:
for level, label in [('full_egdm', 'full EGDM'),
('diffusion_egdm', 'diffusion enhancement only'),
('no_egdm', 'constant mobility and diffusion')]:
ivcurve(make_model(100e-9, level=level), nsigma, voltages, label=label)
ivaxes(plt)
plt.legend(loc=0, frameon=False)
plt.xlim([1e-2, 20])
plt.title('$\sigma / kT$=%s' % nsigma)
plt.show()
In [5]:
voltages = 10**np.linspace(-2, np.log(20) / np.log(10), 50)
for L in [50e-9, 400e-9]:
ivcurves(L, [3., 4., 5., 6.], 10 **
np.linspace(-2, np.log(20) / np.log(10), 50))
plt.title('L=%s nm' % (L * 1e9))
plt.show()
In [6]:
voltages = 10**np.linspace(np.log(1e-3) / np.log(10),
np.log(20) / np.log(10), 50)
ivcurves(100e-9, [3., 4., 5., 6.], voltages, Vbi=1., current_key='electrode1.Jboundary')
ivcurve(make_model(100e-9,level='no_egdm'),
0., voltages, Vbi=1., current_key='electrode1.Jboundary', label='constant mobility')
S. L. M. van Mensfoort and R. Coehoorn Effect of Gaussian disorder on the voltage dependence of the current density in sandwich-type devices based on organic semiconductors, Phys Rev B 78, 085207 (2008)
This file is a part of oedes, an open source organic electronic device simulator. For more information, see https://www.github.com/mzszym/oedes.