Upper limit of hot carrier solar cells efficiency is solved by solving both particle balance and energy balance models with consideration of carrier cooling rate, energy selective contact energy level and optical phonon bottleneck effect. Realization of hot carrier solar cells depends on finding absorber materials with slow carrier cooling rate. As a part of research project, this code was made. Below left shows the upper limit of conversion efficiency with respect to band gap and carrier thermalization time for single barrier structure, where carriers are extracted via thermionic emission. If carrier cooling is very rapid, which is typically the case, the upper limit reaches the Shockley-Queisser limit. Below right shows the case with extraction of carrier with resonant tunneling. These results vary with extraction energy level. Optimization will be necessary. Slow carrier thermalization time is a very important factor realizing hot carrier solar cells. Those parameters can be explored in this project. Note that figures below are produced separately using this solver, compilation of results.
Make sure you have ASTMG173.csv available by downloading from NREL web site.
Import hcsc module
>>> import hcsc
First run init() function in hcsc module. It will define 3 boolean global variables and set up fonts and errors.
>>> hcsc.init()
Then create a hcsc object.
>>> scell = hcsc.hcsc()
Material properties are defined in hcscAttribute class in hcscAttribute.py. Some properties are in bulk class in bulk.py and contacts class in contacts.py those are loaded into hcscAttribute class. Carrier extraction methods are also defined as functions.
Then create a Photon_in object.
>>> ph_in = photon_in.Photon_in()
By default, it will assume AM15 spectrum. You might want to set a concentration factor, e.g. 10 (default 1)
>>> ph_in.c = 10
Shine the light spectrum,
>>> scell.shine(ph_in)
This will tell the solar cell how much photon particles and energy can be absorbed. Quantum efficiency is 1 for above band gap and 0 for below.
Almost ready. At this moment, you might want to display current properties of the cell.
>>> scell.display_attributes()
Band gap (eV): 0.354
ESC(right) extraction energy (eV): 0.37170000000000003
ESC(right) extraction energy width (eV): 0.001
Thermalization time (ps): 1.0
Electron phonon balance model (bool): False
Optical phonon decay time (ps): 8.0
Effective mass (electron mass): 0.023
To show hot carrier solar cell current (A/m2) at 0.2V bias,
>>> print("Jout:{:.3f}(A/m^2)".format(scell.Jouthc(0.2/2*nu.eV)[0]))
Jout:5100.802(A/m^2)
The parameter is the half the bias multiplied by q (elemntary charge). Jouthc method returns 2 variables, current flux and boolean value telling solution is found or not. Note that the solar cell is under 10 suns concentration. Short circuit current of typical solar cells is about 700 A/m2 under 1 sun concentration.
To show hot carrier solar cell power output (W/m2) at 0.2V bias,
>>> print("Pout:{:.3f}(A/m^2)".format(scell.Pouthc(0.2/2*nu.eV)[0]))
Pout:1020.160(W/m^2)
To show the max power under the given condition, use maxPouthc() method. First it will search through to find open circuit voltage Voc, then it will tell the max power.
>>> print("MaxPout:{:.3f}(W/m^2)".format(scell.maxPouthc()[0]))
Solving Voc
Count:0 Tc:551.68 mue(eV):0.000 Bias(V):0.000 J(A/m^2):6786.75 P(W/m^2):0.00
Count:1 Tc:556.21 mue(eV):0.002 Bias(V):0.004 J(A/m^2):6786.75 P(W/m^2):27.15
.......
Count:59 Tc:300.62 mue(eV):0.118 Bias(V):0.236 J(A/m^2):738.11 P(W/m^2):174.19
Count:60 Tc:300.61 mue(eV):0.120 Bias(V):0.240 J(A/m^2):-195.59 P(W/m^2):-46.94
Stop iteration at mue(eV):1.200000e-01
maxP (W/m^2):1083.2
If you want to plot current voltage (IV) characteristics, you can try using test module (test.py). Use IV function. To plot power voltage (PV) characteristics, use PV function. Note this is under 10 suns concentration.
>>> import test
>>> test.IV(scell)
>>> test.PV(scell)
To find optimized extraction energy level at energy selective contact, use maxPouthc_opt_ESC function. It will scan through max powers and show the list of max powers and carrier temperatures. The second parameter tells number of trials between 50% band gap energy and 300% band gap energy. It will also scan energy width (currently set at 1 meV and 5 meV). If carrier extraction is via thermionic emission, it won't affect.
>>> test.maxPouthc_opt_ESC(scell, 50)
cnt1:0/9 cnt2:0/1
deltaEesc:0.35(eV) Ewesc:5.000e+00(meV)
Solving Voc
Count:0 Tc:311.94 mue(eV):0.000 Bias(V):0.000 J(A/m^2):6786.15 P(W/m^2):0.00
Count:1 Tc:311.06 mue(eV):0.002 Bias(V):0.004 J(A/m^2):6786.05 P(W/m^2):27.14
......
Count:65 Tc:300.63 mue(eV):0.130 Bias(V):0.260 J(A/m^2):0.06 P(W/m^2):0.02
Count:66 Tc:300.63 mue(eV):0.132 Bias(V):0.264 J(A/m^2):-0.01 P(W/m^2):-0.00
Stop iteration at mue(eV):1.320000e-01
less than before. skip optimization
Max Power (W/m^2) [[1.10025840e+03]
[1.11097004e+03]
[1.06870710e+03]
[7.05822553e+02]
[6.85471318e+00]
[1.26748304e-01]
[0.00000000e+00]
[0.00000000e+00]
[0.00000000e+00]]
Carrier Temperature (K) [[ 303.30276712]
[ 302.87446135]
[ 301.47017415]
[1756.70678502]
[ 300.65141722]
[ 300.62030558]
[ 0. ]
[ 0. ]
[ 0. ]]
maxP:1110.97 (W/m^2)
T:302.874(K)
dEesc:0.55(eV) Ewesc:5.000e+00(meV)
Note that band gap energy is 0.354eV (InAs). The optimization found that the extraction energy is 0.55eV wide (or 0.098eV above the band edge) for thermionic emission (default).
Some class attributes and methods are omitted for readability.
class hcsc(hcscAttribute):
""" A class used to calculate hot carrier solar cell characteristics
Methods
-------
shine(self, ph_in)
do this first so that photons are absorbed in the cell
set light source defined by photon_in class
Calculate photon flux, energy flux, etc
Jouthc(self, mue)
Current output of the hot carrier
Vochc(self, fmaxP=False, dsp_msg=True)
solve open circuit voltage Voc
Pouthc(self, mue)
return power output at given mue
maxPouthc(self)
solve max power at given Eg, ESC E and Ew
"""
class Photon_in(object):
""" defining spectrum
default spectrum is AM15 if n=2
attributes
----------
c : float
concentration factor
"""
test.py:
def IV(scell):
"""Plot IV characteristics
parameters
----------
scell : class hcsc
Returns
-------
none
"""
def PV(scell):
"""Plot PV characteristics
parameters
----------
scell : class hcsc
Returns
-------
none
"""
def maxPouthc_opt_ESC(scell, numEesc=50, g_skip=False):
"""solve maxpower at given Eg optimizing ESC E and Ew
Energy level of ESC are between 50% of Eg to 300% of Eg
Parameters
----------
scell : class hcsc
numEesc : int
number of trials for ESC energy level
g_skip : bool
if g_skip is True, scan all possible values during optimization process possibly more accurate, but significantly increase process time
Returns
-------
maxP : float
W/m^2
maxT : float
K
optEesc : float
J
optEwesc : float
J
"""
class hcscAttribute:
def __init__(self):
"""
Attributes
----------
Trm : float
solar cell temperature
tau_th : float
carrier thermalization time
tau_pp : float
optical phonon decay time
NM : float
number of phonon modes
Tph : float
optical phonon temperature
EP : bool
if true, solve electron phonon balance equations
d : float
thickness of the cell if bulk structure is assumed
Ephn : float
dominant phonon energy (only used in polar optical (POP) scattering)
hw0 : float
dominant longitudinal optical (LO) phonon energy
absb : class
absorber class object defined in a separate file
lcnt : class
left electrical contact defined in a separate file
rcnt : class
right electrical contacts defined in a separate file
lesc : class
left energy selective contact defined in a separate file
resc :class
right energy selective contact defined in a separate file
Jext : function
current through energy selective contact
Uext : function
energy through energy selective contact
Uth : function
carrier energy thermalization rate
_c1 : float
constant variables
_cJ : float
constant variables
_cS : float
constant variables
Methods
-------
display_attributes(self):
print attributes
JextTherm(muc, mue)
current flux extraction via thermionic emission
UextTherm(muc, mue)
energy flux extraction via thermionic emission
JextESC(self, muc, mue)
extracted current through tunneling
assume carrier selective contact
electron current flows from absb to right contact (absb->resc->rcnt)
UextESC(self, muc, mue)
extracted energy flux
JextRN(self, muc, mue)
unused
UextRN(self, muc, mue)
unused
Uthstandard(self, muc):
standard thermalization
consider dimension
try 3D
parameter is tau_th thermalization time
"""
hcsc.py <-
hcscAttribute.py
recombination.py
photon_in.py
nu.py
myutil.py
hcscAttribute.py <-
bulk.py
contacts.py
extraction_via_ESC.py
nu.py
Hot carrier solar cell is a third generation solar cell aiming to overcome Shockley-Queisser limit by utilizing excess energy above band gap which is normally lost in standard solar cells.
Ross and Nozik [1], as well as Wurfel [2] suggested the hot carrier solar cell (see figure below). The structure introduces the energy selective contact (ESC) in which carriers in the absorber are extracted at elevated energy Eesc, e.g. electrons are extracted above the conduction band edge. The ESCs are located between the absorber and the regular contacts. The extraction energy has an energy band, wesc. In Ross and Nozik model, it is assumed to be a single energy level. ESC needs to be carrier selective. In the figure, electrons are extracted in the right hand side contact at energy Eesc and holes are extracted at energy -Eesc in the left hand side contact.
Chemical potential, or quasi-Fermi level in the absorber is μc and that in contacts is denoted as μe. If the carriers are extracted before thermalization to the band edges but after electron electron scattering which is super fast process, the carrier distributions can be described as heated Fermi-Dirac distribution with its own carrier temperature Tc, which is higher than the room temperature Trm. For hot carrier solar cells to be effective, it is desirable to have narrow band gap materials (although Wurfel suggests Auger recombinations are imminent). In Ross and Nozik model, non-radiative recombinations are not considered. The figure bottom right shows the upper limit derived in Ross and Nozik model with various carrier temperatures (very artificial rersults, nevertheless). If the hot carriers are significantly utilized, it can go beyond the Shockley-Queisser limit.
Here are the two equations to solve.
Photon flux from the sun will be absorbed with quantum efficiency of 1 above energy band gap, and 0 below the band gap. Because there are always radiative recombinations, some photon flux will escape described by generalized Planck law, assuming one electron hole pair will generate one photon. Without considering any other non-radiative path, net carriers should be extracted through energy selective contacts.
Energy extracted through energy selective contacts should balance to the amount of energy absorbed subtracted by radiative recombinations and carrier thermalization. This is what is described in the equation below.
References:
[1] Robert T. Ross and Arthur J. Nozik. Efficiency of hot-carrier solar energy converters. Journal of Applied Physics, 53(5):3813{3818, 1982.
[2] Peter Wurfel. Solar energy conversion with hot electrons from impact ionization. Solar Energy Materials and Solar Cells, 46(1):43{52, 1997.
[3] Yasuhiko Takeda, Akihisa Ichiki, Yuya Kusano, Noriaki Sugimoto, and Tomoyoshi Motohiro. Resonant tunneling diodes as energy-selective contacts used in hot-carrier solar cells. Journal of Applied Physics, 118(12):124510, 2015.
[4] Steven Limpert, Stephen Goodnick, Christiana Honsberg, Gavin Conibeer, and Stephen Bremner. A hot carrier solar cell device model using a coupled electron phonon energy balance model. In 2013 IEEE 39th Photovoltaic Specialists Conference (PVSC), pages 1054{1059. IEEE, 2013.
and more. Let me know if you need more references.
It will solve both equations decently. But sometimes solution is not so smooth as can be seen in IV and PV curves.
3 pyx files and setup.py file are ready for Cython. It will cut the process time in half.
If anyone can figure out use of scipy.LowLevelCallable to speed up scipy.integrate.quad, it will be great.
Solver can be improved. For example, considering differential in each points, it can skip lots of computation along flat IV curve.
Confirmed working with Python 3.7 on Windows 10
It also requires:
- Numpy
- Scipy
- MatPlotLib.
- ASTMG173.csv (available by downloading from NREL web site. "Text Files in Compressed Format" is the one needs to be unpacked.)
Download files into a folder.