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 |
---|---|---|
data.energy |
Grid used to calculate the Re and Im part of epsilon |
eV |
data.im_eps |
Im(epsilon) in xyz direction |
|
data.re_eps |
Re(epsilon) in xyz direction |
|
eff |
Calculated efficiency (thickness 1 nm) |
eV |
eff_max |
Calculated efficiency (infinite thickness) |
eV |
gllbsc_dir_gap |
Direct bandgap calculated with GLLB-SC |
eV |
gllbsc_disc |
Derivative discontinuity calculated with GLLB-SC |
eV |
gllbsc_ind_gap |
Indirect bandgap calculated with GLLB-SC |
eV |
name |
Name of the structure |
|
phase |
Perovskite phase (cubic halides (cubic tetragonal orthorhombic) RP DJ) |
|
project |
project |
# 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')