Chadi-Cohen Tight Binding Program

Originally written in 12/1999. Updated 10/2017.

This program is the tight-binding program for Diamond/Zincblende structures that is presented in Chadi and Cohen's paper "Tight-Binding Calculations of the Valence Bands of Diamond and Zincblende Crystals", Phys. Stat. Soli. (b) 68, 405 (1975). This program is written for diamond and zincblende structures only.

Here are some sample band gaps (from Kittel) that may aid in fitting:

Material Type Gap (eV)
C i 5.4
Si i 1.17
Ge i 0.744
Sn d 0.00
GaAs d 1.52
GaP i 2.32
InP d 1.42
InAs d 0.43

In [38]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import eigvalsh
from collections import namedtuple
import itertools

from TB import get_kpoints, band_labels

In [26]:
from collections import namedtuple
Material = namedtuple('Material',['Esc','Esa','Epc','Epa','Vss','Vscp','Vsap','Vxx','Vxy'])
C = Material(0.,0.,7.40,7.40,-15.2,10.25,10.25,3.,8.3)
Si = Material(0,0,7.2,7.2,-8.13,5.88,5.88,3.17,7.51)
Ge = Material(0,0,8.41,8.41,-6.78,5.31,5.31,2.62,6.82)
GaAs = Material(-6.01,-4.79,0.19,4.59,-7.00,7.28,3.70,0.93,4.72)
ZnSe = Material(-8.92,-0.28,0.12,7.42,-6.14,5.47,4.73,0.96,4.38)

In [27]:
def get_H(kx,ky,kz,structure=Si):
    from math import sin,cos,pi
    e_s_c,e_s_a,e_p_c,e_p_a,v_ss,v_sc_p,v_sa_p,v_xx,v_xy = structure 
    kxp,kyp,kzp = kx*pi/2.,ky*pi/2.,kz*pi/2.# The a's cancel here

    g0_real = cos(kxp)*cos(kyp)*cos(kzp)
    g0_imag = -sin(kxp)*sin(kyp)*sin(kzp)
    g1_real = -cos(kxp)*sin(kyp)*sin(kzp)
    g1_imag = sin(kxp)*cos(kyp)*cos(kzp)
    g2_real = -sin(kxp)*cos(kyp)*sin(kzp)
    g2_imag = cos(kxp)*sin(kyp)*cos(kzp)
    g3_real = -sin(kxp)*sin(kyp)*cos(kzp)
    g3_imag = cos(kxp)*cos(kyp)*sin(kzp)
      
    # "s" stands for "star": the complex conjugate
    g0,g0s = g0_real+g0_imag*1j,g0_real-g0_imag*1j
    g1,g1s = g1_real+g1_imag*1j,g1_real-g1_imag*1j
    g2,g2s = g2_real+g2_imag*1j,g2_real-g2_imag*1j
    g3,g3s = g3_real+g3_imag*1j,g3_real-g3_imag*1j
        
    H = np.zeros((8,8),'D')

    # Make the diagonal elements
    H[0,0] = e_s_c
    H[1,1] = e_s_a
    H[2,2] = H[3,3] = H[4,4] = e_p_c
    H[5,5] = H[6,6] = H[7,7] = e_p_a

    # Make the off-diagonal parts
    H[1,0] = v_ss*g0s
    H[0,1] = v_ss*g0

    H[2,1] = -v_sa_p*g1
    H[1,2] = -v_sa_p*g1s
    H[3,1] = -v_sa_p*g2
    H[1,3] = -v_sa_p*g2s
    H[4,1] = -v_sa_p*g3
    H[1,4] = -v_sa_p*g3s

    H[5,0] = v_sc_p*g1s
    H[0,5] = v_sc_p*g1
    H[6,0] = v_sc_p*g2s
    H[0,6] = v_sc_p*g2
    H[7,0] = v_sc_p*g3s
    H[0,7] = v_sc_p*g3

    H[5,2] = v_xx*g0s
    H[2,5] = v_xx*g0
    H[6,2] = v_xy*g3s
    H[2,6] = v_xy*g3
    H[7,2] = v_xy*g2s
    H[2,7] = v_xy*g2

    H[5,3] = v_xy*g3s
    H[3,5] = v_xy*g3
    H[6,3] = v_xx*g0s
    H[3,6] = v_xx*g0
    H[7,3] = v_xy*g1s
    H[3,7] = v_xy*g1

    H[5,4] = v_xy*g2s
    H[4,5] = v_xy*g2
    H[6,4] = v_xy*g1s
    H[4,6] = v_xy*g1
    H[7,4] = v_xx*g0s
    H[4,7] = v_xx*g0
    return H

In [33]:
def get_data(n=10,structure=Si):
    data = []
    for kx,ky,kz in get_kpoints(n):
        H = get_H(kx,ky,kz,structure)
        E = eigvalsh(H).real
        data.append(E)
    return np.array(data)

In [46]:
def band(n=25,structure=Si):
    data = get_data(n,structure)
    nk,nplot = data.shape
    for i in range(nplot):
        plt.plot(data[:,i])
    band_labels(n)
    plt.axis(xmax=3*n+1)
    plt.title("Chadi-Cohen band structure")
    plt.ylabel("E (eV)")
    return

In [48]:
band()



In [ ]: