Device Structure

This module contains the functions necessary to build a sample structure that can be read by the PDD solver. Typically, you will not need to use any of these except in the case of including quantum wells in the solar cell. In this case, you will need to use this methods to solve the quantum properties and create an effective medium before executing the PDD solver.

Main functions

CreateDeviceStructure(name[, role='device', T=293, layers=[], comments='', repeat=1, substrate=DefaultMaterial, reflection=None])

Creates a dictionary with subdctionaries and lists storing all the parameters and material information necessary to solve the Poisson - Drift-Diffusion equations. It might be useful, also, to get all the properties of a given material that will be used in the PDD solver.

Layers is a list of objects of class solcore.Layer. A solcore.Structure or a solcore.Junction are also valid inputs since all of them are made of a list of layers. Any property not defined explicitly in the definition of the materials for the layers and that can not be calculated by Solcore is taken from the default material (see section Default material). substrate must be a solcore.material, otherwise the default material is used.

Output: dictionary with all the information of the structure.

# This example illustrates the creation of a p-i-n Junction including AlGaAs window and back surface field layers.
# A custom absorption coefficient for the GaAs of the intrinsic layer is used.

import solcore.poisson_drift_diffusion as PDD
from solcore.structure import Layer, Junction
from solcore.import material

# First, we create the materials, overriding any default property we want, such as the doping or the absorption coefficient
window      = material('AlGaAs')    (T=300, Na = 1e24, Al=0.8)
p_GaAs      = material('GaAs')      (T=300, Na = 1e24)
i_GaAs      = material('GaAs')      (T=300)
n_GaAs      = material('GaAs')      (T=300, Nd = 1e23)
bsf         = material('AlGaAs')    (T=300, Nd = 1e24, Al=0.4)

# We put everything together in a Junction. We include the surface recombination velocities,
# sn and sp, although they are not necessary in this case.
MyJunction = Junction([ Layer(width = 30e-9,         material = window,           role="Window"),
                        Layer(width = 400e-9,        material = p_GaAs,           role="Emitter"),
                        Layer(width = 400e-9,        material = i_GaAs,           role="Intrinsic"),
                        Layer(width = 2000e-9,       material = n_GaAs,           role="Base"),
                        Layer(width = 200e-9,        material = bsf,              role="BSF")],
                        sn=1e3, sp=1e3, T=300, kind='PDD')

# Then, we create the structure. What actually this "creation" does is getting all the information of the materials
# from the materials database relevant for the PDD solver and storing them in a dictionary.
MyDevice = PDD.CreateDeviceStructure( 'TestDevice', T = MyJunction.T, layers = MyJunction)

Now “MyDevice” is a dictionary with several entries with the specific information that will be used by the PDD solver (if required). For example MyDevice['layers'][1]['properties'] will contain the following (the order might be different):

{'composition': {'material': 'GaAs'},
'width': 4e-07,
'band_gap': 2.279067404056071e-19,
'electron_affinity': 6.62903371354393e-19,
'eff_mass_electron_Gamma': 0.067,
'eff_mass_hh_z': 0.34129421032745344,
'eff_mass_lh_z': 0.0879370668050916,
'electron_mobility': 0.9399999990563772,
'hole_mobility': 0.017374281562790292,
'ni': 1767480124457.733,
'Nc': 4.3519622483962564e+23,
'Nv': 5.657793654818883e+24,
'electron_minority_lifetime': 3e-06,
'hole_minority_lifetime': 2.5e-07,
'permittivity': 12.9,
'electron_auger_recombination': 1e-42,
'hole_auger_recombination': 1e-42,
'radiative_recombination': 2.8744203894058427e-17,
'Nd': 1, 'Na': 1e+24,
'sn': 1000000.0,
'sp': 1000000.0}

The information for layers 2 and 3 wil be similar since we have GaAs in all cases, except for the mobilities as these depend on the doping, which is different.

Default material

The default material is GaAs at 293K. In general, all the intrinsic properties of the materials are taken from the literature and calculated by the Solcore material system. If not found there (for example if the material or alloy is not in the database) or if they are extrinsic, the default values below are used. The extrinsic properties, that depend on the quality of the material or its doping, are just asigned a ‘reasonable’ value. The user must make sure that this ‘reasonable’ value is indeed resonable for the intended application and override it with his/her own, otherwise.

The total list of parameters and the default values are:

Parameter Default value Units Notes
band_gap Calculated for GaAs at 293K J -
electron_affinity Calculated for GaAs at 293K J -
eff_mass_electron_Gamma Calculated for GaAs at 293K relative to m0 -
eff_mass_hh_z Calculated for GaAs at 293K relative to m0 -
eff_mass_lh_z Calculated for GaAs at 293K relative to m0 -
permittivity 12.9 relative to epsilon0 -
electron_mobility Calculated for GaAs at 293K m2 V-1 s-1 -
hole_mobility Calculated for GaAs at 293K m2 V-1 s-1 -
electron_minority_lifetime 3e-6 s SRH [1] recombination time for electrons
hole_minority_lifetime 2.5e-7 s SRH recombination time for holes
electron_auger_recombination 1e-42 m6 s-1 -
hole_auger_recombination 1e-42 m6 s-1 -
radiative_recombination Calculated for GaAs m3 s-1 Derived from the absorption coefficient
Nd 1 m-3 Density of donors
Na 1 m-3 Density of acceptors
[1]Shockley-Read-Hall

All functions description

solcore.poisson_drift_diffusion.DeviceStructure.CreateDeviceStructure(name=None, role='device', T=293, layers=None, comments='', repeat=1, substrate=<'GaAs' material>, reflection=None)[source]

Creates the structure of a device to be used in drift diffusion calculations.

Parameters:
  • name – Name of the structure
  • role – Role of the structure (eg. “device”, “MQW”, etc)
  • T – Temperature
  • layers – List containing all the layers of the structure. It can also be a Structure or a Junction.
  • comments – A string with comments
  • repeat – If the structure is actually something that is repeated many times, for example a quantum well
  • substrate – A Solcore material defining the substrate of the structure.
  • reflection – The reflection of the structure -> Not use from Solcore v4
Returns:

A dictionary-like object with all the information related to the device

solcore.poisson_drift_diffusion.DeviceStructure.AddLayers(device, layers)[source]

Add layers to the structure

Parameters:
  • device – The device structure
  • layers – A list with the layers to add
Returns:

None

solcore.poisson_drift_diffusion.DeviceStructure.RemoveLayer(device, i)[source]

Remove a layer from the device structure

Parameters:
  • device – the device structure
  • i – the index of the layer to remove
Returns:

None

solcore.poisson_drift_diffusion.DeviceStructure.GetLayerProperties(layer, T)[source]

Given a layer, get all the properties of that layer and the material it is made of at the given temperature

Parameters:
  • layer – The layer of interest
  • T – The temperature
Returns:

Dictionary with all the properties

solcore.poisson_drift_diffusion.DeviceStructure.LoadAbsorption(layer, T, wavelengths, use_Adachi=False)[source]

Loads the absorption coefficient for the material of a given layer. It is only useful when solving QWs, since it is necessary to calculate an effective absorption coefficient before solving the opticalproperties of the structure using the BL, TMM or RCWA solvers.

Parameters:
  • layer – The layer we want to get the absorption coefficient from.
  • T – The temperature
  • wavelengths – The wavelength we want the absorption at
  • use_Adachi – If we should use the Adachi method to get the absorption coeficient.
Returns:

A list with two columns, the wavelengths and the absorption coeficient.

solcore.poisson_drift_diffusion.DeviceStructure.SolveQWproperties(device, calculate_absorption=True, WLsteps=(3e-07, 1.1e-06, 201), wavelengths=None, periodic=True, filter_strength=0.0, blur=None, blurmode='left', mode='kp8x8_bulk', use_Adachi=False, alpha_params=None)[source]

Considers the device as a QW and solves its properties, including the modification of the bandeges due to strain, the efective mases and the absorption coefficient. Without calling this function, the structure is just a colection of layers with bulk-like properties.

Parameters:
  • device – The device structure
  • calculate_absorption – If absorption must be calculated
  • WLsteps – wavelengths in which to calculate the absorption (input for np.linspace function)
  • wavelengths – An array with the waveengths
  • periodic – If it has to be assumed that the structure is perdiodic
  • filter_strength
  • blur
  • blurmode
  • mode
  • use_Adachi
  • alpha_params
Returns:

A dictionary with the output of the Schrodinger solver.

solcore.poisson_drift_diffusion.DeviceStructure.CalculateAbsorptionProfile(z, wl, absorption)[source]