It calculates the theoretical solar cell parameters with options to change temperature, light intensity, and radiative efficiency, provides visualization tools.
The calculation is based on the radiative limit or the Shockley Queisser limit
[Wikipedia: Shockley–Queisser limit] (https://en.wikipedia.org/wiki/Shockley–Queisser_limit)
Create a SQlim
object, which calculates all the parameters and then call the method plot('PCE')
to generate the bandgap vs efficiency plot. PCE: power conversion efficiency.
SQ = SQlim()
SQ.plot('PCE')
The efficiencies will be in the SQ.PCE
attribute, an numpy array. There's also a dictionary SQ.paras
that stores all the characteristics as a key (string): characteristics (numpy array) pairs.
Calling the method plotall()
will generate a plot containing the 4 most important characteristics of a solar cell in the subplots
SQ.plotall()
- Voc: Open-circuit voltage,
- Jsc: Short-circuit current density,
- FF: Fill factor
A method get_paras(self, Eg, toPrint=True)
can be used to look up the results. For example, the following call would print the theoretical parameters for a 1.337 eV solar cell.
SQ.get_paras(Eg=1.337)
would print the following lines like these in the colsole:
"""
Bandgap: 1.337 eV ; J0 = 2.64e-17 mA/cm^2
Voc = 1.079 V
Jsc = 35.14 mA/cm^2
FF = 88.88 %
PCE = 33.703 %
"""
The plot(para)
method can be used to generate different plots. Valid input para
are "Voc"
, "Jsc"
, ``"FF",
"PCE"`, and `J0` (dark saturation current)
SQ.plot('J0') # dark saturation current
SQ.plot('Voc')
The simulate_JV()
method can be used to calculate the J-V curve with an option to plot it.
SQ.simulate_JV(Eg=1.337, plot=True) # calculate the J-V curve of solar cell, plot it, and return the J-V data
The data (Voc, Jsc, FF, PCE, J0 as a function of bandgap) can be saved as a single .csv file
SQ.saveall(savename="SQ lim") # save data as "SQ lim.csv"
The data can be accessed here: SQ limit data
The method SQ.E_loss(Eg)
, which takes bandgap Eg
as an input, can be used to visualize the break down of energy loss.
SQ.E_loss(Eg=1.337)
Shown here are the break down for a 1.337 eV solar cell, which has the maximum theoretical efficiency of 33.7 %.
The mathod SQ.available_E(Egs) can be used to calculate and plot theoretical maximum available energies from a series of (mechanically stacked) solar cells with different Egs.
SQ.available_E(Egs=1.337)
This is the similar to the one above but without the break down of energy loss.
The theoretical efficiencies of multijunction solar cells can be higher than single junction solar cells. The method SQ.available_E
can actually take a list of different bandgaps and calculate the maximum possible efficiencies by using materials with these bandgaps.
Note : In this calculation, we ignore the fact that the bottom cells (lower bandgaps) could absorb the 'excess' emission from the top cells (higher bandgaps)--when the top cells are operated at their maximum power point with finite voltage, there would be some excess emission. This phenomenon has a very minor effect on the calculated efficiencies for multi-junction cells.
SQ.available_E(Egs=[1.1, 1.8])
The sum of the two sub-cells are higher than any single-junction solar cells.
SQ.available_E(Egs=[0.95, 1.37, 1.90])
The sum of the efficiency are even higher.
This bandgap-material combination is the example you can find on [Wikipedia's Multi-Junction Solar Cell] (https://en.wikipedia.org/wiki/Multi-junction_solar_cell) page
The theoretical limit for tandem cells with a infinite number of junctions is about ~68%. (This number may be derived analytically, see [Wikipedia's page] (https://en.wikipedia.org/wiki/Multi-junction_solar_cell#Theoretical_Limiting_Efficiency) and the references therein.) But we can also use this SQ.available_E()
method to numerically approximate it. And we don't actually need an "infinite" amount of junctions. 50 junctions is close enough to get the job done:
# 50 subcells, 0.496 eV (2500nm) to 4.2 eV with equal energy spacing
SQ.available_E(np.linspace(0.496, 4.2, 50), legend=False)
Its overall power conversion efficiency is 67.1%
The default conditions for calculating the theoretical limits are the standard conditions : Temperature T = 300
K, 1-sun condition intensity = 1.0
, and radiative efficiency EQE_EL = 1.0
(100% external quantum efficiency for electroluminescence).
class SQlim(object):
def __init__(self, T=300, EQE_EL=1.0, intensity=1.0):
"""
T: temperature in K
EQE_EL: radiative efficiency (EL quantum yield)
intensity: light concentration, 1.0 = one Sun, 100 mW/cm^2
"""
We can calculate the efficiencies in different conditions by simply changing the input.
Because of this flexibility, we can easily get an idea of how the change of these factors affect the theoretical efficiencies (or other characteristics fo interest).
The classmethod vary_temp()
can do this calculation and plot the results.
SQlim.vary_temp(T=[150, 200, 250, 300, 350, 400])
The classmethod vary_suns
does that caculation.
SQlim.vary_suns(Suns=[1, 10, 100, 1000])
SQlim.vary_EQE_EL(EQE_EL=[1, 1E-2, 1E-4, 1E-6])