Releases: PerovskiteSCModelling/IonMonger
IonMonger v2.0
The second major iteration of IonMonger includes the following (optional) additions to the charge transport model:
- Non-Boltzmann statistical models for carriers in the transport layers, including Fermi-Dirac, Gauss-Fermi, and the ability to define one's own model, and
- Limitation of the ion vacancy density to model steric effects, through either a modified drift or nonlinear diffusion term in the ion vacancy flux.
In addition to these extensions of the model, the following new abilities have been added to the solver:
- Impedance spectroscopy simulations. In addition to transient voltage protocols, users can now easily model a full impedance spectrum from the fully coupled drift-diffusion model, benefiting from the efficiency and accuracy of IonMonger's numerical scheme.
- IonMonger Lite, an intuitive interface from which users can run current-voltage sweep and impedance simulations and process the output without the need to edit raw MATLAB code.
The following analysis and post-processing tools have also been added:
plot_IS.m
, a function that generates Nyquist, Bode, and frequency plots from impedance spectroscopy simulations.animate_sections.m
, a function that generates a video displaying the evolution of key simulation variables over part or all of a simulation.IonMonger_import.py
, a Python function for importing an IonMonger solution file into a Python environment and unpacking the data for plotting or further analysis.
Detailed descriptions of these additions will be made available in the v2.0 code release paper.
IonMonger v1.5
This is the final stable version of IonMonger v1. This version fixes a bug in the SRH interface recombination rates that was causing non-zero open-circuit voltages in the dark. There are also two new abilities:
- calculation and plotting of energy levels via
plot_bands.m
, and - smooth Beer-Lambert generation profiles for light that includes a range of wavelengths, created in
generation_profile.m
by integrating an absorption coefficient spectrum versus photon energy and designed to replace the default generation rate which models a single wavelength of light.
IonMonger v1.4
This update includes:
- adjustment of the dimensionless model equations to improve performance, and
- two tests for developers.
In this version, the charge carrier densities in the perovskite layer (n
and p
) are rescaled with the intention of improving the performance of the code at low light intensities. Previously, as stated in the release paper, the electron concentrations in both the electron transport layer (ETL) and the perovskite layer were nondimensionalised with respect to the effective doping density in the ETL dE
and, similarly, the hole concentrations in the hole transport layer (HTL) and the perovskite layer were nondimensionalised with respect to the effective doping density in the HTL dH
. To address numerical issues associated with small values of the carrier concentrations in the perovskite layer, the electron concentration n
is now nondimensionalised with respect to n0 = kE*dE
and the hole concentration p
with respect to p0 = kH*dH
. The scaling of the carrier concentrations in the transport layers (nE
and pH
) remains unchanged. Corresponding changes are required in the definitions of the following dimensionless parameters: delta
, chi
, Tion
, sigma
, Kp
, Kn
, and all of those that specify the dimensionless recombination rates. These changes do not require the user to modify the input parameters, because the nondimensionalisation is handled automatically by nondimensionalise.m
, and the solution variables are rescaled prior to output in numericalsolver.m
.
In addition, two tests are added to assist developers in checking compatibility and consistency between the original version of the code and future versions. The first is a regression test that compares the output of an example simulation with data produced by the original code. The second is an integration test that checks that the current code runs successfully for two different experimental protocols that make use of different subroutines.
IonMonger v1.3
This version adds:
- the ability to simulate external series and shunt (or parallel) resistance to the model, and
- analytic Jacobians to speed up the computations.
To include series and/or shunt resistance in a simulation, the user needs to specifiy values for the series resistance Rs
and/or shunt resistance Rp
as well as the cell area Acell
in parameters.m
. If these values are not specified, they are set equal to their ideal values: Rs = 0
and Rp = Inf
.
To take account of the parasitic resistances, two adjustments to the drift-diffusion model are necessary. Firstly, the potential difference across the PSC, imposed via the boundary conditions on the electric potential, must be made to take account of the voltage across the resistor in series. We choose to make the adjustment to the boundary condition at the right-hand contact, therefore the boundary condition on the dimensionless electric potential at the HTL/metal contact is modified from:
phiH = -(Vbi-Vap)/2
to phiH = -(Vbi-Vap)/2-V_Rs
where V_Rs denotes the voltage across the resistor in series. Note that V_Rs = 0
at open-circuit. Secondly, the current losses due to shunt resistance must be subtracted from the output current density J(t). This modification is applied in both calculate_currents.m
and find_Voc.m
and corresponds to changing:
J = J_PSC
to J = J_PSC - V_Rp / (Acell * Rp)
where J_PSC is the current density across the PSC and V_Rp is the voltage across the PSC. Note that the expression used to compute J_PSC neglects the displacement current, however the displacement current can be expected to be very small at the contacts because the electric potential is almost flat. The small contribution from the ionic current is now included in the calculation.
The addition of explicit functions for the Jacobian enables Matlab's ode15s
and fsolve
to run more efficiently. All expressions are given exactly except the derivatives of the nonlinear recombination rates (R
, Rl
and Rr
) which are replaced with finite difference approximations of these derivatives. Matlab's ode15s
typically uses finite difference approximations to estimate all the derivatives in the Jacobian (flagged by JPattern). So, by using finite difference approximations only for the recombination rates and the exact expressions for all the other entries, the code with the analytic Jacobian is faster than before, the same accuracy, and can still cope with any functional form for each of the recombination rates (as specified in nondimensionalise.m).
IonMonger v1.2
This version adds the ability to simulate energy band offsets between the TLs and metal contacts, by changing the outer boundary conditions on the majority carrier densities in the TLs. This change introduces the new (optional) parameters Ect
and Ean
, namely the cathode and anode workfunctions, which may now be varied independently.
Only one modification of the model is required and this is to switch the outer boundary conditions on the majority carrier density in each transport layer to:
n = gcE * exp((Ect - EcE) / VT)
at the cathode/ETL contact, andp = gvH * exp((EvH - Ean) / VT)
at the HTL/anode contact.
where gcE
is the effective conduction band DoS in the ETL, Ect
is the workfunction of the cathode, EcE
is the conduction band edge in the ETL, gvH
is the effective valence band DoS in the HTL, EvH
is the valence band edge in the HTL, Ean
is the workfunction of the anode, and VT
is the thermal voltage. So, the only new parameters are the metal workfunctions Ect
and Ean
which need to be specified in the parameters file, otherwise they are set to EfE
and EfH
, respectively, for backwards compatibility.
The built-in voltage is then set equal to the difference between the metal workfunctions Ect-Ean
, rather than EfE-EfH
.
This model can be expected to be valid provided that:
- the majority carrier densities in the TLs remain low enough that the use of Boltzmann statistics is valid (approximately, this requires n < gcE/20 and p < gvH/20, or a gap of more than 3kBT between the quasi-Fermi level and the band edge),
- the minority carrier densities in the TLs have a negligible effect on the potential, and
- there are negligible losses due to recombination occurring at the metal/TL interfaces.
This version also adds one new plotting script called plot_dstrbns.m
.
IonMonger v1.1
This version makes the following updates to the code:
-
Split calculation of SRH recombination rates --- Calculation of the SRH recombination rates is improved by separating the calculation into three parts to ensure that the denominator is always well-behaved (never too small) and hence preventing numerical errors relating to division by very small numbers.
-
Add ability to simulate cell with immobile ions --- Allow the user to set the ion diffusion coefficient
DI
equal to zero, in order to simulate a cell in which the ions are immobile. -
Update the
Jac
matrix to allowR
to depend onP
--- Update the dependencies inJac
to allow the bulk recombination rateR
to depend on the ion vacancy densityP
, as well as the carrier concentrationsn
andp
. -
Update the way that the open-circuit voltage (Voc) is located --- This update aims to improve the way in which initial conditions for simulations starting from open-circuit are computed, particularly for simulations that begin in the dark. When the protocol starts with no illumination, open-circuit is assumed to be located at 0V. Under illumination,
find_Voc
now searches for the Voc by increasing the voltage from 0V, rather than decreasing the voltage from the built-in voltageVbi
. A second attempt is then made to refine the solution subject to a stricterAbsTol
. -
Add Auger recombination term --- Add a term for Auger recombination to the bulk recombination rate in the perovskite, along with an extra plotting script which can be used to check and compare the rates of the different types of bulk recombination. The Auger recombination rate is implemented as:
R_Auger(n,p) = Augn * n * (n * p - n_i^2) + Augp * p * (n * p - n_i^2) = (Augn * n+Augp * p)(n * p - n_i^2)
where Augn
and Augp
are the Auger coefficients in m^6/s. This choice ensures that R = 0 when n * p = n_i^2. The values of the new parameters Augn
and Augp
need to be specified in the parameters file, otherwise they are set to zero for backwards compatibility.
IonMonger v1.0
This is the first open-source release of the perovskite solar cell simulation tool IonMonger.