Skip to content

Python tight binding

Nick Papior edited this page Oct 28, 2016 · 8 revisions

sisl implements an easy data object for creating tight-binding models.

The easiest way to describe the tight-binding model is showcase its usage.

Graphene bandstructure

The graphene structure is one of the easiest structures to describe and provide tight-binding parameters for.

Nearest neighbour

First we create the geometry with nearest neighbour interactions

import sisl
# Lattice constant
alat = 1.42
length = ( 1.5 ** 2 + 3. / 4. ) ** .5 * alat
C = sisl.Atom(6,R=alat+0.1) # add small number for numerics
sc = sisl.SuperCell([length,length,10,90,90,60],nsc=[3,3,1])
# Rotate supercell as the initial one is x = cartesian
sc = sc.rotate(-30,v=[0,0,1])
gr = sisl.Geometry([[0,0,0],[1,0,0]], atom=C, sc=sc)

which now results in a graphene unit cell with appropriate periodicity for nearest neighbour interactions.

We now proceed to create the Hamiltonian object

tb = sisl.Hamiltonian(gr)

now we have a Hamiltonian/tight-binding object, but no hopping integrals or on-site energies have been set.

# Denote interactions ranges
#     on-site , nearest neighbour
dR = (0.1     , alat + 0.1)
for ia in gr:
    # Get interacting atoms
    idx = gr.close(ia, dR=dR)
    tb[ia,idx[0]] = 0.
    tb[ia,idx[1]] = -2.7

there are a few things going on here:

  1. dR is an array of arbitrary length which can be understood as spherical radiis. The number of elements can be arbitrarily long.

  2. The .close command is a neighbourhood searching function which returns lists of atomic indices close to a position.

    The first argument is a position in the unit cell. If the first argument is an integer it is taken as an atomic index and the position will be the atomic coordinate. The latter form is used in the above code. The dR argument denotes the radii shells where you want to find the closest atoms (in the entire supercell structure).

    In the above code idx returned from close is

    • idx[0] all atoms with distance <= .1 of atom ia
    • idx[1] all atoms 0.1 < distance <= alat + 0.1 of atom ia
  3. tb[ia,idx[0]] = 0. sets the on-site energy to 0. By default the Hamiltonian object is an orthogonal matrix (i.e. the overlap matrix is the unity matrix). Note that the only atom within 0.1 Å is the atom it self.

  4. tb[ia,idx[1]] = -2.7 sets the nearest neighbour hopping integral to -2.7.

To finalise the bandstructure we calculate the bandstructure from \Gamma to K (so not full band-structure).

nk = 200
kpts = np.linspace(0, 1./3, nk)
eigs = np.empty([nk,2],np.float64)
for ik, k in enumerate(kpts):
    eigs[ik,:] = tb.eigh(k=[k,-k,0])

import matplotlib.pyplot as plt
plt.plot(kpts,eigs[:,0])
plt.plot(kpts,eigs[:,1])
plt.show()

Which results in this band-structure

Press this source link to get the complete source.

If you want a more thorough explanation of how to setup the individual hopping integrals you can see this source.

Clone this wiki locally