Tight Binding Models
Contents
Tight Binding Models#
In this section we are going to learn how to understand when a material is a metal, semi-metal, or band insulator by getting its band structure.
Let’s start with a chain of Hydrogen atoms in one-dimension. Imagine that we have
We are going to consider two scenarios:
all the hydrogen atoms are the same distance apart.
the hydrogen atoms have distorted themselves so they are in pairs. This is called a Pierls Distortion and is a common thing for a 1d chain of atoms to do.
Each of these materials have a corresponding Hamiltonian
Then, if we have
Hydrogen Chain#
If we are going to do quantum mechanics, we need to start by defining the Hilbert space. The Hilbert space we will use is the
We can write out our Hilbert space as
We are going to get tired of writing this. Instead, we could abreviate this as
Now, it’s possible that some electron is in the quantum state
Hamiltonian#
The Hamiltonian will generically look like this (where I only show 2 of the 36 different matrix elements)
(this image has i,0 where it should have i,a)
I haven’t told you anything yet about what
(this is accidentally for
Make a function which take
Testing
Test that your Hamiltonian is Hermitian.
Do a
pylab.matshow()
on your matrix and make sure that it looks correct.
Fourier Space#
Now, we want to rotate our Hamiltonian from real space to fourier space. To do this we need a unitary matrix (actually the same one you used in your FFT for project 1). There are various ways of constructing this unitary matrix.
First define a momentum basis such that
Then
momentumLabelToK((j,a))
and LabelToR((i,a))
and
Write code that generate the matrix
.Now you can rotate
from real space to space by multiplying (I might have the dagger on the wrong ).At this point,
is written in space and is diagonal. corresponds to the energy of the which corresponds to the k-index i.Graph
vs. .
Now do this again but crank up
Throughout this assignment, we will assume we are at half-filling which means exactly half the total number of possible states are fill (so if you have
The Fermi Level is the line between the lowest
Testing
Test that
is unitary (i.e. )Do a
pylab.matshow()
on your matrix and make sure it looks diagonal.This is essentially the problem of a particle in the box. Think about whether your results match the expected energy from that problem.
Because of this, you should expect your curve to be
Grading
Add to your document a graph of
vs. including a line specifying where the Fermi level is.
Distorted Hydrogen Chain#
Now, let’s consider the distorted Hydrogen chain. Things are a bit more complicated there. We start with a basis which again is labelled by the label of the lattice site. For the 3 unit cell distorted Hydrogen chain this gives us
Again we don’t know anything about the Hamiltonian but the two largest elements are going to be
(which just be choosing the right units we will take to be -1) (which is probably smaller but could be anything. If we were sophisticated we could calculate it but let’s just take it to be
We can assume everything else is small enough to set to 0.
Now, write code to produce the Hamiltian
Again we need to rotate it into momentum space. To do this, we need to construct the unitary matrix
Define a momentum basis such that momentumLabelToK(momentumLabels(N)[j])
, momentumLabels(N)[j][1]
, LabelToR(Labels(N)[i])
and Labels(N)[i][1]
.
(Note, there are 6 Hydrogen atoms but 3 unit cells. This means there are only 3
Now you can again rotate your Hamiltonian np.linalg.eigh
so that you get sorted, real eigenvalues.
Plot
Again increase
Testing
Do a
pylab.matshow()
and make sure your real-space Hamiltonian looks right.Make sure your real-space Hamiltonian is Hermitian.
Test that
is unitary (i.e. )Do a
pylab.matshow()
on your matrix and make sure it looks block diagonal.In the limit where
this should somehow reduce to the non-distorted Hydrogen chain. Does it? Do your results make sense?When
, you expect to see a gap in the system (i.e. there will be 2 bands).
Grading
Add to your document a graph of
Graphene#
Our next step is to do graphene. Again our real space basis is going to be indexed by the labels of our real space lattice and the momentum space basis is indexed by the labels of our reciprocal space lattices.
For our Hamiltonian LabelToIndex(myLabel)
to convert them into their respective index.
Construct your Hamiltonian
Note: You should be identifying the neighbors using the labels. If you’re doing this the simplest way, there should be no if statements
in your constructing of the neighbors (even to get the periodic boundaries right).
Testing
Check that your neighbors are correct. One way to do this is to loop over all the LabelToR(myLabel[i])
and LabelToR(myLabel[j])
You should get something that looks like a honeycomb.
Here are my pictures:
Note Wrapped:
Wrapped:
To rotate to momentum space we construct momentumLabelToK(momentumLabels(N1,N2)[j])
, momentumLabels(N1,N2)[j][1]
, LabelToR(Labels(N1,N2)[i])
and Labels(N1,N2)[i][1]
where
Now you can again rotate your Hamiltonian
At this point you should plot
Plotting them is a bit harder now. Here are three approaches:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(all_kx,all_ky,E)
will plot it in three-dimensions (I actually plotted it once for the energies that are greater then zero and once for the energies less then zero)
I find three-dimensional plots really hard to look at though. So instead I actualy find it more fruitful to loop over all the possible
Finally, it is somewhat instructive just to plot a contour of the gap between the two energy values.
What you should see from these analysis is that the system is gapless at two points. These are “dirac cones” and if you look at the energy around these two dirac points you will find that they are lienar.
This is the band structure of graphene and is called a semi-metal (because the system is gapless but only at two points. You can constrast this against the result you would get if you did this with a square with uniform hopping which is a metal).
Testing
Test that
is unitary (i.e. )Do a
pylab.matshow()
on your matrix and make sure it looks block diagonal (with 2x2 blocks).Check that there are two points with a zero gap. If this is hard to see from your image, subtract the two energies and see.
Grading
Add to your document a pylab.matshow
of your
Boron Nitride#
10% of the grade
In Boron-Nitride you have the same lattice as graphene but the energy of the Boron and Nitrogen atoms are different.
You’ve produced the band structure for a semi-metal. Now, we’d like to learn to open a gap in the system. We are going to see two different ways to go ahead and open up a gap. The first approach will be to add a staggered chemical potentials to the “a” and “b” sites. In other words
Go ahead and implement this Hamiltonian for some value of
Grading
Add to your document a pylab.matshow
of your
Haldane Model#
10% of the grade
This is the final Hamiltonian we will work with. The hops in the direction of the arrow are
First build this Hamiltian with
An easy mistake to make is to get the direction of the arrows on one of the sublattices wrong so one thing to try is to swap the sign of the phase.
Grading
Add to your document a pylab.matshow
of your