import numpy as np
import matplotlib.pyplot as plt
from solcore import siUnits, material, si
from solcore.solar_cell import SolarCell
from solcore.structure import Junction, Layer
from solcore.solar_cell_solver import solar_cell_solver
from solcore.light_source import LightSource
from pathlib import Path
def this_dir_file(f):
= Path.cwd()
file_path return file_path / "data" / f
= np.loadtxt(this_dir_file("QT1405R.csv"), unpack=True, delimiter=",")
qeData
# Define the solar spectrum we wish to use for Light-IV calculations
= np.linspace(300, 900, 400) * 1e-9 # Define the wavelength range of interest
wl = LightSource(source_type='standard',version='AM1.5g',x=wl,output_units='photon_flux_per_m')
am15spectrum
# Define the materials we use for the calculation
= material("Si3N4")()
ARC = material("AlGaAs")
AlGaAs = AlGaAs(Al=0.80)
window_material = material("GaAs")
GaAs
# Configure the GaAs materials, n & p type.
= GaAs(Nd=siUnits(3e18, "cm-3"),
gaas_n_material =si("500nm"),
hole_diffusion_length=5e-2
hole_mobility
)= GaAs(Na=siUnits(1e17, "cm-3"),
gaas_p_material =si("5um"),
electron_diffusion_length=5e-2
electron_mobility )
Section 5b: GaAs solar cell
Fitting the EQE of a GaAs solar cell
First we need to set up the calculation, so we import the libraries we need and some semiconductor material properties. Our solar cell has a single layer SiN anti-reflection coating, an Al\(_{0.8}\)GaAs window layer and GaAs p/n absorber regions.
We now want to build the solar cell from these layers. We start with the MgF2/ZnS AR coating, then the window layer, then GaAs p-doped emitter and finally the GaAs n-doped base. It is here, in the solar cell structure that we specify the layer thicknesses.
The default thicknesses below are not optimum and do not fit the EQE data at all! Try adjusting the thicknesses for the AR coating and the component layers to better fit the EQE data.
# Configure the solar cell layer stack
= SolarCell(
solar_cell "200nm"), ARC),
[Layer(si("55nm"), material=window_material, role='window'),
Junction([Layer(si("800nm"), material=gaas_p_material, role='emitter'),
Layer(si("3000nm"), material=gaas_n_material, role='base'),
Layer(si(=1, sp=1, kind='DA')
], sn=0.02, cell_area=1 / 1e4)
], shading
# Calculate the solar cell QE
'qe', user_options={'wavelength': wl,'optics_method': 'TMM'})
solar_cell_solver(solar_cell,
# Plot the QE - model and data
1)
plt.figure(* 1e9, solar_cell[1].eqe(wl) * 100, 'k', label='Model')
plt.plot(wl 0],qeData[1]*100,marker="o",markeredgecolor="red", label='Data')
plt.plot(qeData[* 1e9, solar_cell.reflected*100, label='Reflection')
plt.plot(wl
plt.legend()0, 100)
plt.ylim('EQE (%)')
plt.ylabel('Wavelength (nm)')
plt.xlabel(
plt.show()
# Plot the QE - contributions of the base, SCR (space charge region), and emitter
1)
plt.figure(* 1e9, solar_cell[1].eqe(wl) * 100, 'k', label='Model (total)')
plt.plot(wl * 1e9, solar_cell[1].eqe_emitter(wl) * 100, '--g', label='Emitter')
plt.plot(wl * 1e9, solar_cell[1].eqe_scr(wl) * 100, '--r', label='SCR')
plt.plot(wl * 1e9, solar_cell[1].eqe_base(wl) * 100, '--b', label='Base')
plt.plot(wl
plt.legend()0, 100)
plt.ylim('EQE (%)')
plt.ylabel('Wavelength (nm)')
plt.xlabel(
plt.show()
Calculating RAT...
Calculating absorption profile...
Solving QE of the solar cell...
Is there a better design for this solar GaAs cell?
Now that you have fitted the EQE, let’s calculate the efficiency under AM1.5G. Start with the same values you used above for the layer thicknesses. Can you design a better GaAs solar cell ?!
# Configure the solar cell layer stack
= SolarCell(
solar_cell "200nm"), ARC),
[Layer(si("55nm"), material=window_material, role='window'),
Junction([Layer(si("800nm"), material=gaas_p_material, role='emitter'),
Layer(si("3000nm"), material=gaas_n_material, role='base'),
Layer(si(=1, sp=1, kind='DA')
], sn=0.02, cell_area=1 / 1e4)
], shading
# Calculate the solar cell QE
'qe', user_options={'wavelength': wl,'optics_method': 'TMM'})
solar_cell_solver(solar_cell,
# Plot the QE
1)
plt.figure(* 1e9, solar_cell[1].eqe(wl) * 100, 'b', label='GaAs')
plt.plot(wl 0],qeData[1]*100,marker="o",markeredgecolor="red")
plt.plot(qeData[* 1e9, solar_cell.reflected*100, label='Reflection')
plt.plot(wl
plt.legend()0, 100)
plt.ylim('EQE (%)')
plt.ylabel('Wavelength (nm)')
plt.xlabel(
# Plot the Light-IV
= np.linspace(0, 1.2, 200)
V 'iv', user_options={'voltages': V, 'light_iv': True, 'wavelength': wl,
solar_cell_solver(solar_cell, 'optics_method': 'TMM','light_source':am15spectrum,
'mpp':True})
2)
plt.figure('IV'][1]/10, 'k', linewidth=3, label='GaAs')
plt.plot(V, solar_cell.iv[
plt.legend()0, 35)
plt.ylim(0, 1.2)
plt.xlim('Current (mA/cm$^2$)')
plt.ylabel('Voltage (V)')
plt.xlabel(0.1,20,f'Jsc {solar_cell.iv.Isc:.2f}')
plt.text(0.1,18,f'Voc {solar_cell.iv.Voc:.2f}')
plt.text(0.1,16,f'Eta {solar_cell.iv.Eta:.2f}')
plt.text(
plt.show()
Calculating RAT...
Calculating absorption profile...
Solving QE of the solar cell...
Solving IV of the junctions...
Solving IV of the tunnel junctions...
Solving IV of the total solar cell...