This practical is based on the concepts introduced for optimising electrical contacts in photovoltaic cells. The procedure was published in J. Mater. Chem. C (2016).
In this practical we screen electrical contact materials for CH$_3$NH$_3$PbI$_3$. There are three main steps:
Effective charge extraction requires a low barrier to electron or hole transport accross an the interface. This barrier is exponential in the discontinuity of the band energies across the interface. To a first approximation the offset or discontinuity can be estimated by comparing the ionisation potentials (IPs) or electron affinities (EAs) of the two materials, this is known as Anderson's rule.
Here we have collected a database of 173 measured or estimated semiconductor IPs and EAs (CollatedData.txt
). We use it as the first step in our screening. The screening is performed by the script scan_energies.py
. We enforce several criteria:
-i
and -e
-w
. The window is the full width so the max offset is 0.5*window-g
In [ ]:
%%bash
cd Electronic/
python scan_energies.py -h
In [ ]:
%%bash
cd Electronic/
python scan_energies.py -i 5.7 -e 4.0 -w 0.5 -g 4.0
For stable interfaces there should be an integer relation between the lattice constants of the two surfaces in contact, which allows for perfect matching, with minimal strain. Generally a strain value of ~ 3% is considered acceptable, above this the interface will be incoherent.
This section uses the ASE package to construct the low index surfaces of the materials identified in the electronic step, as well as those of the target material. The code LatticeMatch.py
to identify optimal matches.
First we need .cif
files of the materials obtained from the electronic matching. These are obtained from the Materials Project website. Most of the .cif
files are there already, but we should add Cu$_2$O and GaN, just for practice.
The lattice matching routine involves obtaining reduced cells for each surface and looking for multiples of each side which match. The procedure is described in more detail in our paper.
The actual clever stuff of the algorithm comes from a paper from Zur and McGill in J. Appl. Physics (1984).
The work is done by a python script called LatticeMatch.py
. As input it reads .cif
files. It takes a number of flags:
-a
the file containing the crystallographic information of the first material-b
the file containing the crystallographic information of the second material -s
the strain threshold above which to cutoff, defaults to 0.05-l
the maximum number of times to expand either surface to find matching conditions, defaults to 5We will run the script in a bash loop to iterate over all interfaces of our contact materials with the (100) and (110) surfaces of pseudo-cubic CH$_3$NH$_3$PbI$_3$. Note that I have made all lattice parameters of CH$_3$NH$_3$PbI$_3$ exactly equal, this is to facilitate the removal of duplicate surfaces by the script.
In [ ]:
%%bash
cd Lattice/
for file in *.cif; do python LatticeMatch.py -a MAPI/CH3NH3PbI3.cif -b $file -s 0.03; done
So far the interface matching considered only the magnitude of the lattice vectors. It would be nice to be able to include some measure of how well the dangling bonds can passivate one another. We do this by calculating the site overlap. Basically, we determine the undercoordinated surface atoms on each side and project their positions into a 2D plane.
We then lay the planes over each other and slide them around until there is the maximum coincidence. We calculate the overlap factor from
$$ ASO = \frac{2S_C}{S_A + S_B}$$where $S_C$ is the number of overlapping sites in the interface, and $S_A$ and $S_B$ are the number of sites in each surface.
This section can be run in a stand-alone script called csl.py
. It relies on a library of the 2D projections of lattice sites from different surfaces, which is called surface_points.py
. Currently this contains a number of common materials types, but sometimes must be expanded as new materials are identified from the electronic and lattice steps.
csl.py
takes the following input parameters:
-a
The first material to consider-b
The second material to consider-x
The first materials miller index to consider, format : 001-y
The second materials miller index to consider, format : 001-u
The first materials multiplicity, format : 2,2-v
The second materials multiplicity, format : 2,2We can run it for one example from the previous step, let's say GaN (010)x(2,5) with CH$_3$NH$_3$PbI$_3$ (110)x(1,3)
In [ ]:
%%bash
cd Site/
python csl.py -a CH3NH3PbI3 -b GaN -x 110 -y 010 -u 1,3 -v 2,5
The lattice and site examples above give a a feel for what is going on. For a proper screening procedure it would be nice to be able to run them together. That's exactly what happens with the LatticeSite.py
script. It uses a new class Pair
to store and pass information about the interface pairings. This includes the materials names, miller indices of matching surfaces, strians, multiplicities etc.
The LatticeSite.py
script takes the same variables as LatticeMatch.py
. It just takes a little longer to run, so a bit of patience is required.
This script outputs the standard pair information as well as the site matching factor, which is calculated as
$$ \frac{100\times ASO}{1 + |\epsilon|}$$where the $ASO$ was defined above, and $\epsilon$ in the average of the $u$ and $v$ strains. The number is a measure of the mechanical stability of an interface. A perfect interface of a material with itself would have a fator of 100.
Where lattices match but no information on the structure of the surface exists it is flagged up. You can always add new surfaces as required.
In [ ]:
%%bash
cd Site/
for file in *cif; do python LatticeSite.py -a MAPI/CH3NH3PbI3.cif -b $file -s 0.03; done
In [ ]: