Absorption spectra of perovskites

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)  

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