Absorption calculator¶
This package contains the tools necessary to claculate the absorption coefficient of either bulk materials or quantum wells. This package also containes the tools needed to import optical data from the SOPRA database and to calculate the optical properties of a stack of materials using a transfer matrix formalism.
Some of these functions can be accessed directly when importing this package:
- create_adachi_alpha (for bulk materials)
- SOPRA_DB (for bulk materials)
- calc_alpha (for QWs)
- calc_emission (for QWs)
- Calculate_absorption_profile, calculate_rat, calculate_ellipsometry, OptiStack, DielectricConstantModel (transfer matrix tools)
Absorption of bulk materials using Adachi’s formulation¶
-
solcore.absorption_calculator.adachi_alpha.
create_adachi_alpha
(material, Esteps=(1.42, 6, 3000), T=300, wl=None)[source]¶ Calculates the n, k.txt and absorption coefficient of a material using Adachi’s formalism of critical points.
Parameters: - material – A solcore material
- Esteps – (1.42, 6, 3000) A tuple with the start, end and step energies in which calculating the optical data
- T –
- Temeprature in kelvin
- wl – (None) Optional array indicating the wavelengths in which calculating the data
Returns: A tuple containing 4 arrays: (Energy, n, k.txt, alpha)
Absorption of bulk materials from the SOPRA database¶
-
class
solcore.absorption_calculator.sopra_db.
sopra_database
(Material)[source]¶ Welcome to the SOPRA DB class for Solcore!
This module gives access to the vast library of optical constant data, made freely available by the SOPRA-SA optoelectronics company founded in 1948. For further detail on the data and SOPRA-SA see the legacy website: http://www.sspectra.com/sopra.html
Import the SOPRA_DB module from the solcore.material_system package and get started by selecting a material from the extensive list that SOPRA-SA compiled;
>>> GaAs = sopra_database('GaAs')
Once imported a number of useful methods can be called to return n, k and alpha data for the desired material.
-
static
material_list
()[source]¶ SOPRA_DB.material_list() :: Loads a list (.pdf file) of all available SOPRA materials.
-
load_n
(Lambda=None)[source]¶ SOPRA_DB.load_n(Lambda) :: Load refractive index (n) data of the requested material. Optional argument Lambda allows user to specify a custom wavelength range. data will be interpolated into
this range before output.Returns: Tuple of (Wavelength, n)
-
load_k
(Lambda=None)[source]¶ SOPRA_DB.load_k(Lambda) :: Load refractive index (n) data of the requested material. Optional argument Lambda allows user to specify a custom wavelength range. data will be interpolated into
this range before output.Returns: Tuple of (Wavelength, k)
-
load_alpha
(Lambda=None)[source]¶ SOPRA_DB.load_alpha(Lambda) :: Load refractive index (n) data of the requested material. Optional argument Lambda allows user to specify a custom wavelength range. data will be interpolated into
this range before output.Returns: Tuple of (Wavelength, alpha)
-
load_temperature
(Lambda, T=300)[source]¶ - SOPRA_DB.load_temperature(T, Lambda) :: Loads n and k.txt data for a set of materials with temperature dependent
- data sets
Optional argument T defaults to 300K Required argument Lambda specifies a wavelength range and the data is interpolated to fit. This is a
required argument here as not all data sets in a group are the same length (will be fixed in a subsequent update).Returns: Tuple of (Wavelength, n, k.txt)
-
load_composition
(Lambda, **kwargs)[source]¶ SOPRA_DB.load_temperature(T, Lambda) :: Loads n and k data for a set of materials with varying composition. Required argument Lambda specifies a wavelength range and the data is interpolated to fit. This is a
required argument here as not all data sets in a group are the same length (will be fixed in a subsequent update).Keyword argument :: Specify the factional material and fraction of the desired alloy.
Returns: Tuple of (Wavelength, n, k)
-
static
Absorption of quantum wells¶
-
solcore.absorption_calculator.absorption_QW.
H
(x)¶
-
solcore.absorption_calculator.absorption_QW.
D
(x, width)¶
-
solcore.absorption_calculator.absorption_QW.
L
(x, centre, hwhm)¶
-
solcore.absorption_calculator.absorption_QW.
Gauss
(x, centre, hwhm)¶
-
solcore.absorption_calculator.absorption_QW.
exciton_rydberg_energy_2d
(me, mh, eps_r)[source]¶ Parameters: - me – electron effective mass (units: kg)
- mh – hole effective mass (units: kg)
- eps_r – dielectic constant (units: SI)
Returns: The exciton Rydberg energy
-
solcore.absorption_calculator.absorption_QW.
exciton_bohr_radius
(me, mh, eps)[source]¶ Parameters: - me – electron effective mass (units: kg)
- mh – hole effective mass (units: kg)
- eps – dielectic constant (units: SI)
Returns: Exciton Borh radius
-
solcore.absorption_calculator.absorption_QW.
alpha_c_hh_TE
(E, z, E_e, E_hh, psi_e, psi_hh, well_width, me, mhh, Ep, nr)[source]¶ Absortion coefficient for incident light forming a transision between hh and c band of a quantum well
NB. Assumes that valence band is a zero energy, might need to manually apply an offset.
Parameters: - E – photon energy (units: J)
- z – mesh points along growth direction (units: m)
- E_e – Electron state energy (units: J)
- E_hh – Heavy hole state energy (units: J)
- psi_e – Electron envelope function (psi_e^2 must be normalised)
- psi_hh – Heavy hole envelope function (psi_hh^2 must be normalised)
- well_width – (units: m)
- me – electron effective mass (units: kg)
- mhh – heavy hole effective mass (units: kg)
- Ep – the Kane parameter “Optical dipole matrix elemet”, sometimes “Momentum matrix element”, e.g. Ep for GaAs ~ 28eV
- nr – refractive index
Returns:
-
solcore.absorption_calculator.absorption_QW.
alpha_c_lh_TE
(E, z, E_e, E_lh, psi_e, psi_lh, well_width, me, mlh, Ep, nr)[source]¶ Absortion coefficient for incident light forming a transision between hh and c band of a quantum well
NB. Assumes that valence band is a zero energy, might need to manually apply an offset.
Parameters: - E – photon energy (units: J)
- z – mesh points along growth direction (units: m)
- E_e – Electron state energy (units: J)
- E_hh – Heavy hole state energy (units: J)
- psi_e – Electron envelope function (psi_e^2 must be normalised)
- psi_hh – Heavy hole envelope function (psi_hh^2 must be normalised)
- well_width – (units: m)
- me – electron effective mass (units: kg)
- mhh – heavy hole effective mass (units: kg)
- Ep – the Kane parameter “Optical dipole matrix elemet”, sometimes “Momentum matrix element”, e.g. Ep for GaAs ~ 28eV
- nr – refractive index
Returns:
-
solcore.absorption_calculator.absorption_QW.
alpha_exciton_ehh_TE
(exciton_index, E, z, E_e, E_hh, psi_e, psi_hh, well_width, me, mhh, Ep, nr, eps, hwhm=9.6e-22, dimensionality=0.15, line_shape='Lorenzian')[source]¶ Parameters: - exciton_index –
- E –
- z –
- E_e –
- E_hh –
- psi_e –
- psi_hh –
- well_width –
- me –
- mhh –
- Ep –
- nr –
- eps –
- hwhm –
- dimensionality –
- line_shape –
Returns:
-
solcore.absorption_calculator.absorption_QW.
alpha_exciton_elh_TE
(exciton_index, E, z, E_e, E_lh, psi_e, psi_lh, well_width, me, mlh, Ep, nr, eps, hwhm=9.6e-22, dimensionality=0.15, line_shape='Lorenzian')[source]¶ Parameters: - exciton_index –
- E –
- z –
- E_e –
- E_lh –
- psi_e –
- psi_lh –
- well_width –
- me –
- mlh –
- Ep –
- nr –
- eps –
- hwhm –
- dimensionality –
- line_shape –
Returns:
-
solcore.absorption_calculator.absorption_QW.
sum_alpha_c_hh_TE
(E, z, E_e, E_hh, psi_e, psi_hh, well_width, me, mh, Ep, nr)[source]¶ Parameters: - E –
- z –
- E_e –
- E_hh –
- psi_e –
- psi_hh –
- well_width –
- me –
- mh –
- Ep –
- nr –
Returns:
-
solcore.absorption_calculator.absorption_QW.
sum_alpha_c_lh_TE
(E, z, E_e, E_lh, psi_e, psi_lh, well_width, me, mh, Ep, nr)[source]¶ Parameters: - E –
- z –
- E_e –
- E_lh –
- psi_e –
- psi_lh –
- well_width –
- me –
- mh –
- Ep –
- nr –
Returns:
-
solcore.absorption_calculator.absorption_QW.
sum_alpha_exciton_c_hh_TE
(E, z, E_e, E_hh, psi_e, psi_hh, well_width, me, mh, Ep, nr, eps, hwhm=9.6e-22, dimensionality=0.5, line_shape='Lorenzian')[source]¶ Parameters: - E –
- z –
- E_e –
- E_hh –
- psi_e –
- psi_hh –
- well_width –
- me –
- mh –
- Ep –
- nr –
- eps –
- hwhm –
- dimensionality –
- line_shape –
Returns:
-
solcore.absorption_calculator.absorption_QW.
sum_alpha_exciton_c_lh_TE
(E, z, E_e, E_lh, psi_e, psi_lh, well_width, me, mlh, Ep, nr, eps, hwhm=9.6e-22, dimensionality=0.5, line_shape='Lorenzian')[source]¶ Parameters: - E –
- z –
- E_e –
- E_lh –
- psi_e –
- psi_lh –
- well_width –
- me –
- mlh –
- Ep –
- nr –
- eps –
- hwhm –
- dimensionality –
- line_shape –
Returns:
-
solcore.absorption_calculator.absorption_QW.
calc_alpha
(QM_result, well_width, kane_parameter=4.48e-18, refractive_index=3.5, hwhm=9.6e-22, dimensionality=0.5, theta=0, eps=1.1421902283930001e-10, espace=None, line_shape='Lorenzian')[source]¶ Calculates the absorption coeficient of a quantum well structure assuming the parabolic approximation for the effective masses.
Parameters: - QM_result – The output of the Schrodinger solver, incldued in the ‘quantum_mechanics’ package
- well_width – The well width
- kane_parameter – The Kane parameter
- refractive_index – Refractive (effective) index of the QW
- hwhm – Full width at half maximum of the excitonic lineshape
- dimensionality –
- theta –
- eps –
- espace –
- line_shape –
Returns:
Optical properties of a stack of materials¶
This module serves as interface between solcore structures (junctions, layers, materials…) and the transfer matrix package developed by Steven Byrnes and included in the PyPi repository.
-
class
solcore.absorption_calculator.transfer_matrix.
OptiStack
(structure=(), no_back_reflexion=False)[source]¶ Class that contains an optical structure: a sequence of layers with a thickness and a complex refractive index.
It serves as an intermediate step between solcore layers and materials and the stack of thicknesses and and n and k.txt values necessary to run calculations involving TMM. When creating an OptiStack object, the thicknesses of all the layers forming the Solcore structure and the optical data of the materials of the layers are extracted and arranged in such a way they can be easily and fastly read by the TMM functions.
In addition to a solcore structure with Layers, it can also take a list where each element represent a layer written as a list and contains the layer thickness and the dielectrical model, the raw n and k data as a function of wavelengths, or a whole Device structure as the type used in the PDD model.
In summary, this class acepts:
- A solcore structure with layers
- A list where each element is [thickness, DielectricModel]
- A list where each element is [thickness, wavelength, n, k]
- A list mixing the above:
- [ [thickness, DielectricModel],
- [thickness, wavelength, n, k], solcore.Layer, solcore.Layer ]
This allows for maximum flexibility when creating the optical model, allowing to construct the stack with experimental data, modelled data and known material properties from the database.
Yet anther way of defining the layers mixes experimental data with a DielectricModel within the same layer but in spectrally distinct regions. The syntaxis for the layer is:
layer = [thickness, wavelength, n, k, DielectricModel, mixing]
where mixing is a list containing three elements: [the mixing point (nm), the mixing width (nm), zero or one] depending if the mixing function should be increasing with the wavelength or decreasing. If increasing (zero), the Dielectric model will be used at long wavelengths and the experimental data at short wavelengths. If decreasing (one) the oposite is done. The mixing point and mixing width control how smooth is the transition between one and the other type of data.
Extra layers such as he semi-infinite, air-like first and last medium, and a back highly absorbing layer are included at runtime to fulfill the requirements of the TMM solver or to solve some of its limitations.
-
get_indices
(wl)[source]¶ Returns the complex refractive index of the stack.
Parameters: wl – Wavelength of the light in nm. Returns: A list with the complex refractive index of each layer, including the semi-infinite front and back layers and, opionally, the back absorbing layer used to suppress back surface relfexion.
-
get_widths
()[source]¶ Returns the widths of the layers of the stack.
Returns: A list with the widths each layer, including the semi-infinite front and back layers and, opionally, the back absorbing layer used to suppress back surface relfexion, defined as 1 mm thick.
-
add_layers
(layers)[source]¶ Generic function to add layers to the OptiStack. Internally, it calls add_solcore_layer, add_modelled_layer or add_raw_nk_layer.
Parameters: layers – A list with the layers to add (even if it is just one layer) It can be one or more and it can mixed, Solcore-based and modelled layers. :return: None
-
solcore.absorption_calculator.transfer_matrix.
calculate_rat
(structure, wavelength, angle=0, pol='u', coherent=True, coherency_list=None, no_back_reflexion=True)[source]¶ Calculates the reflected, absorbed and transmitted intensity of the structure for the wavelengths and angles defined.
Parameters: - structure – A solcore Structure object with layers and materials or a OptiStack object.
- wavelength – Wavelengths (in nm) in which calculate the data.
- angle – Angle (in degrees) of the incident light. Default: 0 (normal incidence).
- pol – Polarisation of the light: ‘s’, ‘p’ or ‘u’. Default: ‘u’ (unpolarised).
- coherent – If the light is coeherent or not. If not, a coherency list must be added.
- coherency_list – A list indicating in which layers light should be treated as coeherent (‘c’) and in which
incoherent (‘i’). It needs as many elements as layers in the structure. :param no_back_reflexion: If reflexion from the back must be supressed. Default=True. :return: A dictionary with the R, A and T at the specified wavelengths and angle.
-
solcore.absorption_calculator.transfer_matrix.
calculate_ellipsometry
(structure, wavelength, angle, no_back_reflexion=True)[source]¶ Calculates the ellipsometric parameters psi and delta. It can only deal with coherent light and the whole stack (including back surface) is considered, so caution must be taken when comparing the simulated results with experiments where the back surface is rough or layers are thick and coherent light propagation makes no sense.
The optional argument no_back_reflexion can be included to add an extra layer on the back absorbing all light that reaches that position without any reflexion, to remove the reflexion from the back surface.
Parameters: - structure – A solcore structure with layers and materials.
- wavelength – Wavelengths (in nm) in which calculate the data.
- angle – A tupple or list with the angles (in degrees) in which to calculate the data.
- no_back_reflexion – If reflexion from the back must be supressed. Default=True.
Returns: A dictionary with psi and delta at the specified wavelengths and angles (2D arrays).
-
solcore.absorption_calculator.transfer_matrix.
calculate_absorption_profile
(structure, wavelength, z_limit=None, steps_size=2, dist=None, no_back_reflexion=True)[source]¶ It calculates the absorbed energy density within the material. From the documentation:
‘In principle this has units of [power]/[volume], but we can express it as a multiple of incoming light power density on the material, which has units [power]/[area], so that absorbed energy density has units of 1/[length].’
Integrating this absorption profile in the whole stack gives the same result that the absorption obtained with calculate_rat as long as the spacial mesh (controlled by steps_thinest_layer) is fine enough. If the structure is very thick and the mesh not thin enough, the calculation might diverege at short wavelengths.
For now, it only works for normal incident, coherent light.
Parameters: - structure – A solcore structure with layers and materials.
- wavelength – Wavelengths in which calculate the data (in nm). An array-like object.
- z_limit – Maximum value in the z direction
Returns: A dictionary containing the positions (in nm) and a 2D array with the absorption in the structure as a
function of the position and the wavelength.
This module contains a collection of mathematical models to calculate the dielectric constant of a material. The modelling is largely based in the equations and naming used by:
- Woollam, Guide to using WVASE: Spectroscopic Ellipsometry Data Acquisition and Analysis Software. 2012, pp. 1–696.
-
class
solcore.absorption_calculator.dielectric_constant_models.
Poles
(A=0.0, Ec=5.0)[source]¶ Basic oscillator model for fitting ellipsometry and RAT data. It a pole without broadening and therefore can only represent non-absorbing materials. Usually, the central energy must lie outside the spectral range of interest.
with:
- An = the amplitud of the oscillator (dimensionless)
- En = the central energy of the pole (in eV)
It is equivalent to Pol.2 in WVASE
-
name
= 'poles'¶
-
var
= 2¶
-
class
solcore.absorption_calculator.dielectric_constant_models.
Lorentz
(An=0.0, En=2.0, Brn=0.1)[source]¶ Classic Lorentz oscillator involving a central energy and a broadening responsible for the absorption.
with:
- An = the amplitud of the oscillator (dimensionless)
- Brn = the broadening (eV)
- En = the central energy (eV)
It is equivalent to Lor.2 in WVASE.
-
name
= 'lorentz'¶
-
var
= 3¶
-
class
solcore.absorption_calculator.dielectric_constant_models.
Gauss
(A=0.0, Ec=2.0, Br=0.1)[source]¶ Gauss oscillator involving a central energy and a broadening responsible for the absorption. It is defined as:
Epsilon_1 is calculated using the Kramers-Kronig relationships
with:
- A = the amplitud of the oscillator (dimensionless)
- Br = the broadening (eV)
- Ec = the central energy (eV)
It is equivalent to Gau.0 in WVASE.
-
name
= 'gauss'¶
-
var
= 3¶
-
class
solcore.absorption_calculator.dielectric_constant_models.
Drude
(An=0.0, Brn=0.1)[source]¶ The classic Drude oscillator describes free carrier effects on the dielectric response. Its form is a Lorentz oscillator with zero center energy.
with:
- An = the amplitud of the oscillator (eV)
- Brn = the broadening (eV)
It is equivalent to Drd.0 in WVASE.
-
name
= 'drude'¶
-
var
= 2¶
-
class
solcore.absorption_calculator.dielectric_constant_models.
Cauchy
(An=0.0, Bn=0.0, Cn=0.0, Ak=0.0, Bk=0.0, Ck=0)[source]¶ Cauchy oscillator model for fitting ellipsometry data. It is generally used to fit non absorbing materials, although an Urbach tail is included to indicate the onset of absorption.
with:
- An, Bn and Cn = the Cauchy coeficients (dimensionless, µm-2 and µm-4, respectively)
- Ak = the amplitud of the Urbach tail (dimensionless)
- Bk = the multiplicative factor of the Urbach tail (eV-1)
- Ck = the energy offset of the Urbach tail (eV) - it is user selected, but redundant with Ak.
with Ak.
It is equivalent to Chy.0 in WVASE.
-
name
= 'cauchy'¶
-
var
= 5¶
-
class
solcore.absorption_calculator.dielectric_constant_models.
PolySegment
(energy, e2)[source]¶ The PolySegment model aims to approximate the dielectric function with a finite number of linear segments. It is similar to a point-by-point fitting but likely using much less free variables. The segments are created for Epsilon_2 and Epsilon_1 is calculated using the Kramers-Kronig relationships.
It allows for a maximum freedom for fitting data while reducing noise, but does not provide any physically relevant information.
The input parameters are the energies of the endpoints of the segments and the corresponding Epsilon_2 values.
-
name
= 'polysegment'¶
-
-
class
solcore.absorption_calculator.dielectric_constant_models.
Oscillator
(oscillator_type, material_parameters=None, **kwargs)[source]¶
-
class
solcore.absorption_calculator.dielectric_constant_models.
DielectricConstantModel
(e_inf=1.0, oscillators=())[source]¶ This class groups together several models for the dielectric constant applicable to a given layer. Based on all of them, it calculates the dielectric constant and the complex refractive index at any energy. It requires as input an offset, offen refered as epsilon_infinity.
-
add_oscillator
(name, **kwargs)[source]¶ Adds an oscillator to the dielectric constant model.
Parameters: - name – The name of the oscillator
- kwargs – The arguments needed to create that oscillator.
Returns:
-
remove_oscillator
(idx)[source]¶ Removes an oscillator from the model.
Parameters: idx – The number of the oscillator (starting in 1) Returns: None
-