Absorption spectra of perovskites

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-value pairs

key

description

unit

name

Name of the structure

phase

Perovskite phase

gllbsc_dir_gap

Direct bandgap GLLB-SC

eV

gllbsc_ind_gap

Indirect bandgap GLLB-SC

eV

gllbsc_disc

Derivative discontinuity GLLB-SC

eV

eff

Calculated efficiency (thickness 1 nm)

eV

eff_max

Calculated efficiency (infinite thickness)

eV

Absorption spectrum of AgNbO3

# 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')
../_images/spectrum.svg

Calculated efficiencies of the cubic phase perovskites

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')
../_images/efficiency.svg