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

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

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