{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Solcore: QW Absorption\n", "\n", "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].\n", "\n", "[1] Alonso-Alvarez, D., Wilson, T., Pearce, P. et al. J Comput Electron (2018) 17: 1099. https://doi.org/10.1007/s10825-018-1171-3\n", "\n", "*Notebook developed at Solcore Boot Camp 2018, Imperial College London*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We start by importing the modules needed in the tutorial" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import matplotlib\n", "import matplotlib.pyplot as plt\n", "# Show the plots in the notebook\n", "# %matplotlib inline\n", "# Set the font size in the plots\n", "matplotlib.rcParams.update({'font.size': 22})\n", "import numpy as np\n", "\n", "from solcore import si, material\n", "from solcore.structure import Layer, Structure\n", "import solcore.quantum_mechanics as QM\n", "from solcore.constants import vacuum_permittivity, q" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Definition of materials and structure\n", "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# First we create the materials we need\n", "bulk = material(\"GaAs\")(T=293, strained=False)\n", "barrier = material(\"GaAsP\")(T=293, P=0.1, strained=True)\n", "\n", "# QW thickness\n", "Lz = si(\"7.2nm\")\n", "\n", "# As well as some of the layers\n", "top_layer = Layer(width=si(\"30nm\"), material=bulk)\n", "inter = Layer(width=Lz, material=bulk)\n", "barrier_layer = Layer(width=si(\"15nm\"), material=barrier)\n", "bottom_layer = top_layer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Computational details\n", "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "comp = np.linspace(0.05, 0.25, 5)\n", "E = np.linspace(1.15, 1.5, 300) * q\n", "alpha_params = {\n", " \"well_width\": Lz, \n", " \"theta\": 0,\n", " \"eps\": 12.9 * vacuum_permittivity,\n", " \"espace\": E,\n", " \"hwhm\": si(\"6meV\"),\n", " \"dimensionality\": 0.16,\n", " \"line_shape\": \"Gauss\"\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Absorption without exciton contribution\n", "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "alpha_params['eps'] = 1.0E20\n", "\n", "plt.figure(figsize=(18,10))\n", "for j, i in enumerate(comp[0:2]):\n", " # We create the QW material at the given composition\n", " QW = material(\"InGaAs\")(T=293, In=i, strained=True)\n", "\n", " # And the layer\n", " well_layer = Layer(width=Lz, material=QW)\n", "\n", " # The following lines create the QW structure, with different number of QWs and interlayers\n", " test_structure = Structure([barrier_layer, inter, well_layer, inter, barrier_layer], substrate=bulk)\n", "\n", " # Finally, the quantum properties are claculated here\n", " output = QM.schrodinger(test_structure, quasiconfined=0, num_eigenvalues=20, alpha_params=alpha_params,\n", " calculate_absorption=True)\n", "\n", " alfa = output[0]['alphaE'](E)\n", " plt.plot(1240 / (E / q), alfa / 100, label='{}%'.format(int(i * 100)))\n", "\n", "plt.xlim(826, 1100)\n", "plt.ylim(0, 23000)\n", "plt.xlabel('Wavelength (nm)')\n", "plt.ylabel('$\\\\alpha$ cm$^{-1}$')\n", "plt.legend(loc='upper right', frameon=False)\n", "plt.tight_layout()\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Absorption with exciton contribution\n", "To recover the excitonic effects, it is enough to set the dielectric constant to a realistic value." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "alpha_params['eps'] = 12.9 * vacuum_permittivity\n", "\n", "plt.figure(figsize=(18,10))\n", "for j, i in enumerate(comp):\n", " # We create the QW material at the given composition\n", " QW = material(\"InGaAs\")(T=293, In=i, strained=True)\n", "\n", " # And the layer\n", " well_layer = Layer(width=Lz, material=QW)\n", "\n", " # The following lines create the QW structure, with different number of QWs and interlayers\n", " test_structure = Structure([barrier_layer, inter, well_layer, inter, barrier_layer], substrate=bulk)\n", "\n", " # Finally, the quantum properties are claculated here\n", " output = QM.schrodinger(test_structure, quasiconfined=0, num_eigenvalues=20, alpha_params=alpha_params,\n", " calculate_absorption=True)\n", "\n", " alfa = output[0]['alphaE'](E)\n", " plt.plot(1240 / (E / q), alfa / 100, label='{}%'.format(int(i * 100)))\n", "\n", "plt.xlim(826, 1100)\n", "plt.ylim(0, 23000)\n", "plt.xlabel('Wavelength (nm)')\n", "plt.ylabel('$\\\\alpha$ cm$^{-1}$')\n", "plt.legend(loc='upper right', frameon=False)\n", "plt.tight_layout()\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 4 }