{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from solcore import siUnits, material, si\n", "from solcore.solar_cell import SolarCell\n", "from solcore.structure import Junction, Layer\n", "from solcore.solar_cell_solver import solar_cell_solver, default_options\n", "from solcore.light_source import LightSource\n", "from solcore.state import State" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "incidence_angle = 45 # should be in degrees\n", "wl = np.linspace(290, 1900, 400) * 1e-9\n", "concX=566 # the light concentration\n", "light_source = LightSource(source_type='standard', version='AM1.5d', x=default_options.wavelength,\n", " output_units='photon_flux_per_m', concentration=concX) # define the input light source as AM1.5G" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "all_materials = []" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Al2O3 = material('Al2O3')\n", "TiO2 = material('TiO2')\n", "AlInP = material(\"AlInP\")\n", "GaInP = material(\"GaInP\")\n", "GaAs = material('GaAs')\n", "Ge = material(\"Ge\")\n", "Al02Ga08As = material('AlGaAs')\n", "Al08Ga02As = material('AlGaAs')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "TOP CELL - GaInP" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ARC1= Al2O3()\n", "ARC2 = TiO2()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "top_window_material = AlInP(Al=0.5)\n", "top_cell_n_material = GaInP(In=0.51,Nd=siUnits(2e18, \"cm-3\"), hole_diffusion_length=si(\"300nm\"))\n", "top_cell_p_material = GaInP(In=0.51,Na=siUnits(1.5e17, \"cm-3\"), electron_diffusion_length=si(\"2um\"))\n", "top_cell_TJ_material = Al08Ga02As(Al=0.8)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for mat in [top_cell_n_material, top_cell_p_material]:\n", " mat.band_gap = material('GaInP')(In=0.51).band_gap\n", " mat.eff_mass_hh_z = material('GaInP')(In=0.51).eff_mass_hh_z\n", " mat.eff_mass_electron = material('GaInP')(In=0.51).eff_mass_electron\n", " mat.relative_permittivity = 11.75" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "all_materials.append(ARC1)\n", "all_materials.append(ARC2)\n", "all_materials.append(top_window_material)\n", "all_materials.append(top_cell_n_material)\n", "all_materials.append(top_cell_p_material)\n", "all_materials.append(top_cell_TJ_material)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "MID CELL - InGaAs" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mid_window_material = GaInP(In=0.51)\n", "mid_cell_n_material = GaAs(Nd=siUnits(2e18, \"cm-3\"), hole_diffusion_length=si(\"300nm\"))\n", "mid_cell_p_material = GaAs(Na=siUnits(1.5e17, \"cm-3\"), electron_diffusion_length=si(\"3um\"))\n", "mid_BSF_material = GaInP(In=0.51)\n", "mid_cell_TJ_material = Al08Ga02As(Al=0.8)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for mat in [mid_cell_n_material, mid_cell_p_material]:\n", " mat.band_gap = material('GaAs')(In=0.01).band_gap\n", " mat.eff_mass_hh_z = material('GaAs')(In=0.01).eff_mass_hh_z\n", " mat.eff_mass_electron = material('GaAs')(In=0.01).eff_mass_electron\n", " mat.relative_permittivity = 13.1" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "all_materials.append(mid_window_material)\n", "all_materials.append(mid_cell_n_material)\n", "all_materials.append(mid_cell_p_material)\n", "all_materials.append(mid_BSF_material)\n", "all_materials.append(mid_cell_TJ_material)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "DBR1 = Al02Ga08As(Al=0.2)\n", "DBR2 = Al08Ga02As(Al=0.8)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "all_materials.append(DBR1)\n", "all_materials.append(DBR2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "BOTTOM CELL - Ge" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "bot_buffer_material = GaAs()\n", "bot_nucleation_material = GaInP(In=0.51)\n", "bot_cell_n_material = Ge(Nd=siUnits(2e18, \"cm-3\"), hole_diffusion_length=si(\"800nm\"))\n", "bot_cell_p_material = Ge(Na=siUnits(1e17, \"cm-3\"), electron_diffusion_length=si(\"50um\"))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for mat in [bot_cell_n_material, bot_cell_p_material]:\n", " mat.band_gap = material('Ge')().band_gap\n", " mat.eff_mass_hh_z = material('Ge')().eff_mass_hh_z\n", " mat.eff_mass_electron = material('Ge')().eff_mass_electron\n", " mat.relative_permittivity = 16" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "all_materials.append(bot_buffer_material)\n", "all_materials.append(bot_nucleation_material)\n", "all_materials.append(bot_cell_n_material)\n", "all_materials.append(bot_cell_p_material)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We add some other properties to the materials, assumed the same in all cases, for simplicity.
\n", "If different, we should have added them above in the definition of the materials." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for mat in all_materials:\n", " mat.hole_mobility = 3.4e-3\n", " mat.electron_mobility = 5e-2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ARC = [Layer(si('80nm'), material = ARC1), Layer(si('33nm'), material = ARC2)]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "top_junction = [Junction([Layer(si(\"18nm\"), material=top_window_material, role='window'),\n", " Layer(si(\"100nm\"), material=top_cell_n_material, role='emitter'),\n", " Layer(si(\"891.248nm\"), material=top_cell_p_material, role='base'),\n", " Layer(si(\"111.445nm\"), material = top_cell_TJ_material, role = 'TJ')\n", " ], sn=1, sp=1, kind='DA')]\n", "middle_junction = [Junction([Layer(si(\"18nm\"), material=mid_window_material, role='window'),\n", " Layer(si(\"100nm\"), material=mid_cell_n_material, role='emitter'),\n", " Layer(si(\"1632.091nm\"), material=mid_cell_p_material, role='base'),\n", " Layer(si(\"10nm\"), material = mid_BSF_material, role = 'BSF'),\n", " Layer(si(\"91.084nm\"), material=mid_cell_TJ_material, role='TJ')\n", " ], sn=1, sp=1, kind='DA')]\n", "DBRa = 16 * [Layer(width=si(\"62.638nm\"), material=DBR1), Layer(width=si(\"71.980nm\"), material=DBR2)]\n", "DBRb = 16 * [Layer(width=si(\"68.919nm\"), material=DBR1), Layer(width=si(\"78.725nm\"), material=DBR2)]\n", "DBRc = 16 * [Layer(width=si(\"75.838nm\"), material=DBR1), Layer(width=si(\"86.805nm\"), material=DBR2)]\n", " # the 4* here makes the two layers given repeat 4 times (so 8 layers total)\n", "bottom_junction = [Junction([Layer(si(\"405.048nm\"), material=bot_buffer_material, role='window'),\n", " Layer(si(\"14.369nm\"), material=bot_nucleation_material, role='window'),\n", " Layer(si(\"200nm\"), material=bot_cell_n_material, role='emitter'),\n", " Layer(si(\"29800nm\"), material = bot_cell_p_material, role = 'base')\n", " ], sn=1, sp=1, kind='DA')]\n", "# And, finally, we put everything together, adding also the surface recombination velocities sn and sp.\n", "# setting kind = 'DA' in the Junction definition tells the electrical solver later to use the depletion approximation\n", "optical_struct = SolarCell(ARC + top_junction + middle_junction + DBRa + DBRb + DBRc + bottom_junction,\n", " shading = 0.05)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "wl = np.linspace(250, 1700, 400)*1e-9" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "options = State()\n", "options.wavelength = wl\n", "options.optics_method = 'TMM'\n", "options.no_back_reflection = False\n", "options.pol = 'p'\n", "options.BL_correction = True\n", "options.coherency_list = 111*['c']\n", "options.theta = 30\n", "solar_cell_solver(optical_struct, 'qe', options)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.figure()\n", "plt.plot(wl*1e9, optical_struct[0].layer_absorption+optical_struct[1].layer_absorption)\n", "plt.plot(wl*1e9, optical_struct[2].layer_absorption)\n", "plt.plot(wl*1e9, optical_struct[3].layer_absorption)\n", "plt.plot(wl*1e9, optical_struct[100].layer_absorption)\n", "plt.plot(wl*1e9, optical_struct.absorbed, '--')\n", "plt.plot(wl*1e9, optical_struct.transmitted, '--')\n", "plt.plot(wl*1e9, optical_struct.reflected, '--')\n", "plt.legend(['ARC', 'top', 'middle', 'bottom', 'A', 'T', 'R'])\n", "plt.ylim(0,1)\n", "plt.ylabel('Absorption/Transmission/Reflection')\n", "plt.xlabel('Wavelength (nm)')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.figure()\n", "plt.plot(wl*1e9, 100*optical_struct[2].eqe(wl))\n", "plt.plot(wl*1e9, 100*optical_struct[3].eqe(wl))\n", "plt.plot(wl*1e9, 100*optical_struct[100].eqe(wl))\n", "plt.plot(wl*1e9, 100*optical_struct.absorbed, '--')\n", "plt.legend(['top', 'middle', 'bottom', 'A'])\n", "plt.ylim(0,100)\n", "plt.ylabel('EQE (%)')\n", "plt.xlabel('Wavelength (nm)')\n", "plt.show()" ] } ], "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.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }