# Solcore: QW Absorption¶

The objective of this tutorial is to compute absorption coefficient of InGaAs QW of fixed thickness for five different material compositions. The following code produces Fig. 7 of Ref. [1].

[1] Alonso-Álvarez, D., Wilson, T., Pearce, P. et al. J Comput Electron (2018) 17: 1099. https://doi.org/10.1007/s10825-018-1171-3

Notebook developed at Solcore Boot Camp 2018, Imperial College London

We start by importing the modules needed in the tutorial

In [ ]:
import matplotlib
import matplotlib.pyplot as plt
# Show the plots in the notebook
# %matplotlib inline
# Set the font size in the plots
matplotlib.rcParams.update({'font.size': 22})
import numpy as np

from solcore import si, material
from solcore.structure import Layer, Structure
import solcore.quantum_mechanics as QM
from solcore.constants import vacuum_permittivity, q


## Definition of materials and structure¶

The materials for bulk and barrier are GaAs and GaAs$_{1-x}$P$_x$, respectively. We also set the quantum well thickness $L_z$ here and the different layers with which the solar cell structure is constructed.

In [ ]:
# First we create the materials we need
bulk = material("GaAs")(T=293, strained=False)
barrier = material("GaAsP")(T=293, P=0.1, strained=True)

# QW thickness
Lz = si("7.2nm")

# As well as some of the layers
top_layer = Layer(width=si("30nm"), material=bulk)
inter     = Layer(width=Lz, material=bulk)
barrier_layer = Layer(width=si("15nm"), material=barrier)
bottom_layer  = top_layer


## Computational details¶

We define here the compositions to be explored, the spectral range and the 2D Exciton details. The well width is used for computing the 2D DOS. Theta is the polar angle to compute the matrix elements. hwhm is the full width at half maximum and dimensionality is 0.5 for pure 2D and 1 for 3D. In general, it is considered a fitting parameter.

In [ ]:
comp = np.linspace(0.05, 0.25, 5)
E = np.linspace(1.15, 1.5, 300) * q
alpha_params = {
"well_width": Lz,
"theta": 0,
"eps": 12.9 * vacuum_permittivity,
"espace": E,
"hwhm": si("6meV"),
"dimensionality": 0.16,
"line_shape": "Gauss"
}


## Absorption without exciton contribution¶

Here we run the main loop to compute the absorption. The quantum well material is In$_x$Ga$_{1-x}$As. Solcore always computes the absorption of the QW with the exciton correction. To remove its effect on the spectrum, we need to modify the parameters. A very large dielectric function completely screens the Coulomb interaction.

In [ ]:
alpha_params['eps'] = 1.0E20

plt.figure(figsize=(18,10))
for j, i in enumerate(comp[0:2]):
# We create the QW material at the given composition
QW = material("InGaAs")(T=293, In=i, strained=True)

# And the layer
well_layer = Layer(width=Lz, material=QW)

# The following lines create the QW structure, with different number of QWs and interlayers
test_structure = Structure([barrier_layer, inter, well_layer, inter, barrier_layer], substrate=bulk)

# Finally, the quantum properties are claculated here
output = QM.schrodinger(test_structure, quasiconfined=0, num_eigenvalues=20, alpha_params=alpha_params,
calculate_absorption=True)

alfa = output[0]['alphaE'](E)
plt.plot(1240 / (E / q), alfa / 100, label='{}%'.format(int(i * 100)))

plt.xlim(826, 1100)
plt.ylim(0, 23000)
plt.xlabel('Wavelength (nm)')
plt.ylabel('$\\alpha$ cm$^{-1}$')
plt.legend(loc='upper right', frameon=False)
plt.tight_layout()

plt.show()


## Absorption with exciton contribution¶

To recover the excitonic effects, it is enough to set the dielectric constant to a realistic value.

In [ ]:
alpha_params['eps'] = 12.9 * vacuum_permittivity

plt.figure(figsize=(18,10))
for j, i in enumerate(comp):
# We create the QW material at the given composition
QW = material("InGaAs")(T=293, In=i, strained=True)

# And the layer
well_layer = Layer(width=Lz, material=QW)

# The following lines create the QW structure, with different number of QWs and interlayers
test_structure = Structure([barrier_layer, inter, well_layer, inter, barrier_layer], substrate=bulk)

# Finally, the quantum properties are claculated here
output = QM.schrodinger(test_structure, quasiconfined=0, num_eigenvalues=20, alpha_params=alpha_params,
calculate_absorption=True)

alfa = output[0]['alphaE'](E)
plt.plot(1240 / (E / q), alfa / 100, label='{}%'.format(int(i * 100)))

plt.xlim(826, 1100)
plt.ylim(0, 23000)
plt.xlabel('Wavelength (nm)')
plt.ylabel('$\\alpha$ cm$^{-1}$')
plt.legend(loc='upper right', frameon=False)
plt.tight_layout()

plt.show()

In [ ]: