Devices with Gaussian Disorder: comparison with constant mobility model, simulations of asymmetric devices

This note­book con­tains cal­cu­la­tions show­ing how Gauss­ian dis­or­der af­fects cur­rent-volt­age curves of unipo­lar or­gan­ic diodes. The plots are in agree­ment with a ref­er­ence.

%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()

Model and parameters

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

Calculation and plotting function

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$')

Results

Comparison with constant mobility, constant diffusion model

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()

Varying disorder and sample thickness

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()

Simulation of asymmetric device, varying disorder

The cur­rent-volt­age char­ac­ter­is­tics be­low are cal­cu­lat­ed for asym­met­ric de­vice with 1 V of built-in po­ten­tial. This is re­flect­ed in the work­func­tions of the elec­trodes.

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')

Reference

S. L. M. van Mensfoort and R. Co­ehoorn Ef­fect of Gauss­ian dis­or­der on the volt­age de­pen­dence of the cur­rent den­si­ty in sand­wich-type de­vices based on or­gan­ic se­mi­con­duc­tors, Phys Rev B 78, 085207 (2008)