# Tools for working with tight-binding models

I would like to analyze a Slater-Koster tight binding model for some materials. I have the data for both the Hamiltonian as a matrix-valued map on the reciprocal lattice $$H_{mn}(\vec{T})$$ and the overlap matrix $$S_{mn}(\vec{T})$$. My question is: what are the tools available that generate the band structure and calculate topological indices? I know that several tools exist, such as Z2Pack and Wanniertools. Can these tools work with Slater-Koster models? For example, in Slater-Koster models, one has to deal with non orthonormal basis vectors. In this case, one needs to supply the overlap matrices, but I am not sure if these tools automatically assume that the overlap matrices are unity.

The sisl Python package can deal with Hamiltonians (and other physical matrices) in orthogonal and non-orthogonal basis sets.

A simple example for graphene would be something like:

import sisl

# graphene with bond-length 1.42
graphene = sisl.geom.graphene()
H = sisl.Hamiltonian(graphene, orthogonal=False)
H[0, 0] = (0, 1) # on-site value, overlap element
H[0, 1] = (-2.7, 0.11) # hopping element, overlap element
...


sisl provides other extensive tools and constructs to make these things easier and faster.

Once you have a Hamiltonian you can create the band-structures. The below routines automatically determines whether it is non-orthogonal or orthogonal and calls the appropriate routine.

band = BandStructure(H, [[0, 0, 0], [0, 0.5, 0],
[1/3, 2/3, 0], [0, 0, 0]], 400,
[r'$$\Gamma$$', r'$$M$$',
r'$$K$$', r'$$\Gamma$$'])

# calculate all eigenvalues for the bands
eigs = band.apply.array.eigh()
# get linear band-structure (so the distances between special points
# are correctly calculated in reciprocal space)
lk, kt, kl = band.lineark(True)
import matplotlib.pyplot as plt
plt.xticks(kt, kl)
plt.xlim(0, lk[-1])
plt.ylim([-3, 3])
plt.ylabel('$$E-E_F$$ [eV]')
for bk in bs.T:
plt.plot(lk, bk)
plt.show()


disclaimer: I am the author of sisl