Ivano E. Castelli, Kristian S. Thygesen, and Karsten W. Jacobsen
Calculated optical absorption of different perovskite phases.
Journal of Materials Chemistry A, printed online.
We calculate the optical properties of a set of oxides, oxynitrides, and organometal halide cubic and layered perovskites with a bandgap in the visible part of the solar spectrum.
Ivano E. Castelli, Kristian S. Thygesen, and Karsten W. Jacobsen
Calculated optical absorption of different perovskite phases.
Journal of Materials Chemistry A, printed online.
key |
description |
unit |
---|---|---|
|
Name of the structure |
|
|
Perovskite phase |
|
|
Direct bandgap GLLB-SC |
eV |
|
Indirect bandgap GLLB-SC |
eV |
|
Derivative discontinuity GLLB-SC |
eV |
|
Calculated efficiency (thickness 1 nm) |
eV |
|
Calculated efficiency (infinite thickness) |
eV |
# creates: spectrum.svg
"""Plot the absorption spectrum along the x direction for a given
perovskite"""
import matplotlib.pyplot as plt
import ase.db
# Connect to database:
c = ase.db.connect('absorption_perovskites.db')
# Select cubic symmetry containing Sn:
for n in c.select('name=AgNbO3'):
name = n.name
energy = n.data.energy
im_eps_x = n.data.im_eps[0]
plt.plot(energy, im_eps_x)
plt.arrow(n.gllbsc_dir_gap,
2,
0.0,
-1,
fc="g",
ec="g",
head_width=0.2,
head_length=0.3,
head_starts_at_zero=False)
plt.text(n.gllbsc_dir_gap,
2.1,
'gap_d',
rotation=90,
horizontalalignment='center',
verticalalignment='bottom',
color='g')
if (n.gllbsc_dir_gap != n.gllbsc_ind_gap):
plt.arrow(n.gllbsc_ind_gap,
2,
0.0,
-1,
fc="r",
ec="r",
head_width=0.2,
head_length=0.3,
head_starts_at_zero=False)
plt.text(n.gllbsc_ind_gap,
2.1,
'gap_i',
rotation=90,
horizontalalignment='center',
verticalalignment='bottom',
color='r')
plt.ylabel('Abs. Spectrum [arb. units]')
plt.xlabel('Energy [eV]')
plt.text(7, 0.5, name)
plt.savefig('spectrum.svg')
This script requires the perfect absorption limit:
# creates: efficiency.svg
"""Plot the efficiencies of a perovskite phase (cubic in the example
here)"""
import matplotlib.pyplot as plt
import ase.db
# Connect to database:
c = ase.db.connect('absorption_perovskites.db')
o = open('perfect_abs.txt', 'r')
lines = o.readlines()
o.close()
en = []
perf_abs = []
for line in lines:
line = line.split()
en.append(float(line[0]))
perf_abs.append(float(line[2]) / 4.30E+21)
for n in c.select('phase=cubic'):
if 'O3' in n.name:
color = 'black'
symb = 'o'
if 'O2N' in n.name or 'ON2' in n.name:
color = 'red'
symb = 's'
if 'O2F' in n.name:
color = 'blue'
symb = 'D'
plt.plot([n.gllbsc_ind_gap, n.gllbsc_ind_gap],
[n.eff, n.eff_max],
'-' + symb,
color=color)
plt.text(n.gllbsc_ind_gap - 0.025, n.eff, n.name,
color=color,
fontsize=12,
rotation=90,
horizontalalignment='center',
verticalalignment='bottom')
plt.plot(en, perf_abs, '--', color='green')
plt.plot(2.5, 0.32, 'o', color='black')
plt.plot(2.5, 0.29, 's', color='red')
plt.plot(2.5, 0.26, 'D', color='blue')
plt.text(2.55,
0.32,
'Oxides',
color='black',
fontsize=16,
horizontalalignment='left',
verticalalignment='center')
plt.text(2.55,
0.29,
'Oxynitrides',
color='red',
fontsize=16,
horizontalalignment='left',
verticalalignment='center')
plt.text(2.55,
0.26,
'Oxyfluorides',
color='blue',
fontsize=16,
horizontalalignment='left',
verticalalignment='center')
plt.text(1.3,
0.33,
'Cubic',
color='black',
fontsize=16,
horizontalalignment='left',
verticalalignment='center')
plt.xlim(1.2, 3.1)
plt.ylim(0, 0.35)
plt.xlabel('Bandgap [eV]', fontsize=18)
plt.ylabel('Absorbed Photons [%]', fontsize=18)
plt.xticks([1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0],
['1.4', '1.6', '1.8', '2.0', '2.2', '2.4', '2.6', '2.8', '3.0'],
fontsize=16)
plt.yticks([0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3],
['0', '5', '10', '15', '20', '25', '30'],
fontsize=16)
plt.savefig('efficiency.svg')