Steady-state space-charge-limited current with traps

This ex­am­ple shows how to sim­u­late ef­fects of a sin­gle trap lev­el on cur­rent-volt­age char­ac­ter­is­tics of a sin­gle car­ri­er de­vice.

%matplotlib inline
import matplotlib.pylab as plt
import oedes
import numpy as np
oedes.init_notebook() # for displaying progress bars

Model and parameters

Elec­tron on­ly de­vice is sim­u­lat­ed, with­out con­tact bar­ri­er. Note that more trap lev­els can be in­clud­ed by mod­i­fy­ing traps= ar­gu­ment be­low. Each trap lev­el should have unique name.

L = 200e-9 # device thickness, m
model = oedes.models.std.electrononly(L, traps=['trap'])
params = {
    'T': 300, # K
    'electrode0.workfunction': 0, # eV
    'electrode1.workfunction': 0, # eV
    'electron.energy': 0, # eV
    'electron.mu': 1e-9, # m2/(Vs)
    'electron.N0': 2.4e26, # 1/m^3
    'electron.trap.energy': 0, # eV
    'electron.trap.trate': 1e-22, # 1/(m^3 s)
    'electron.trap.N0': 6.2e22, # 1/m^3
    'electrode0.voltage': 0, # V
    'electrode1.voltage': 0, # V
    'epsilon_r': 3. # 1
}

Sweep parameters

For sim­plic­i­ty, the case of ab­sent traps is mod­eled by putting trap lev­el 1 eV above trans­port lev­el. This makes trap states ef­fec­tive­ly un­oc­cu­pied.

trapenergy_sweep = oedes.sweep('electron.trap.energy',np.asarray([-0.45, -0.33, -0.21, 1.]))
voltage_sweep = oedes.sweep('electrode0.voltage', np.logspace(-3, np.log10(20.), 100))

Result

c=oedes.context(model)

for tdepth,ct in c.sweep(params, trapenergy_sweep):
    for _ in ct.sweep(ct.params, voltage_sweep):
        pass
    v,j = ct.teval(voltage_sweep.parameter_name,'J')
    oedes.testing.store(j, rtol=1e-3) # for automatic testing
    if tdepth < 0:
        label = 'no traps'
    else:
        label = 'trap depth %s eV' % tdepth
    plt.plot(v,j,label=label)
plt.xscale('log')
plt.yscale('log')
plt.xlabel('V')
plt.ylabel(r'$\mathrm{A/m^2}$')
plt.legend(loc=0,frameon=False);