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

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