Lattices

Our goal in this section is to start understanding solids. Solids consist of atoms arranged in a periodic way. So to understand solids we need to start by understanding periodic arangements.

We will start with one-dimensional solids and then move to two-dimension.

Let us start by consider two different chains of Hydrogen atoms:

  • Hydrogen Chain: all the hydrogen atoms are the same distance apart.

  • Distorted Hydrogen Chain: 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.

HChain

Now there are a couple things to notice:

  1. In a real solid, we should think of it essentially being infinitely long. Our computers don’t like to hold an infinite amount of information. To best emulate this what we do is use periodic boundary conditions. Assume we want to only hold six atoms. Then we say that atom 6 is actually adjacent to atom 1.

  2. We see that there is a chunk of the material that can be translated by a1 and you get back the same system. We call that chunk of material the unit cell and a1 the lattice vector. In the Hydrogen chain we see that the unit cell contains one Hydrogen atom and that a1=1 unit in the x direction. In the distorted Hydrogen chain we see that the unit cell contains two Hydrogen atoms and that a1=2 units in the x direction.

  3. The center of all our unit cells are at ma1 where m is an integer between 0 and N (the number of unit cells). This defines our real-space lattice.

  4. We can specify the location of the atoms within the unit cell by saying how far it is displaced from the center of the unit cell. For example, for the distorted Hydrogen lattice, this is τ0=0.0;τ1=0.8 units in the x direction. This set is called the basis.

Labeling our lattice sites: Now, we might want to label our hydrogen atoms. We could label them by their position (i.e. the Hydrogen atom at spot 2.8) but that turns out to be less convenient then labeling them by (unit cell, atom number). Then we can talk about the Hydrogen atom labelled (3,b) which is the “b” Hydrogen atom in the 3rd unit cell.

For both the Hydrogen and distorted Hydrogen lattice, write a function def Labels(N) which takes the number of unit cells and returns a list of site labels. (i.e. myLabels = Labels(3) should return the list [(1,a),(1,b),(2,a),(2,b),(3,a),(3,b)] for the distorted Hydrogen lattice)

Now, each lattice site has three things: a label, a location, and an index (i.e. which spot on the list it’s in). It will be useful to have functions which convert between these. Write python functions (for both lattices):

  • LabelToR(myLabel) Let the (1,1) atom be at location 0. For the distorted Hydrogen chain, LabelToR( (2,b)) should return 2.8

  • LabelToIndex(myLabel)

Momentum Space

We have a real space lattice of unit cells each of which contain some number of types of atoms. We can also have a momentum space lattice (called the reciprocal lattice) again each of which contains some number of types of atoms (so 2 in the distorted Hydrogen lattice)

The reciprocal lattice is defined (in 1d) as mbi where 0m<N is an integer where N is the number of unit cells and b1=2π/(N|a1|) (the key property that b must obey is that b1Na1=2π). We will have a list of labels that consist of (m, atom type).

  • Write momentumLabels(N) which takes the number of unit cells N and generates labels for the reciprocal lattice vectors.

  • Write momentumLabelToK(myLabel) which takes a momentum label (m, atom type) and tells you the location in the reciprocal lattice which corresponds to that label. Notice that these are the same for the Hydrogen chain and distorted Hydrogen chain.

Testing

There are a couple of things to test.

  • Loop over your labels and use LabelToR to plot out all your points (you should also do this for your k-points)

  • Check LabelToIndex by checking for an arbitrary label that myLabels[LabelToIndex(label)]==label

Graphene

Now we are going to move to two-dimensions and work with graphene. Graphene is a bunch of Carbon atoms sitting on a honeycomb lattice.

graphene1

Our first goal will to be again to figure out what chunk of material we can outline so that we can translate it by a certain amount and get back the same material. Because we are in two dimensions, actually there are two different directions that we can translate our points and get back the same configuration. graphene1

Therefore, we have two lattice vectors a1=(1,0) and a2=(1/2,3/2) so that if we translate by either a1 or a2 (or actually any ma1+na2 with integers m and n) we get back the same material. The vector τ1=(0,1/3) connects an “a” site to a “b” site in the same unit cell.

Notice that in this picture, we have a number of unit cells N1=3 and N2=4 in the a1 and a2 directions.

Our real-space lattice can be created by taking all points of the form ma1+na2 for 0m<N1 and 0n<N2.

Labeling our lattice sites: Again, we’d like to label our lattice sites. It will still be convenient to label them by the unit cell and then the atom within that unit cell. Now, to label the unit cell it’s easiest to use two numbers (p,q) which tells us that the unit cell we are talking about is p unit cells in the a1 direction and q unit cells in the a2 direction. We can then use an additional number to say which atom within the unit cell it is.

write a function def Labels(N1,N2) which takes the number of unit cells N1 and N2 in the two directions (so N1N2 cells total) and returns a list of site labels.

Then again write functions

  • LabelToR(myLabel) Let the ((1,1),a) atom be at location 0. To check this you should just plot all the points generated by [LabelToR(i) for i in myList]

  • LabelToIndex(myLabel) Make sure you check this too.

Momentum Space

The reciprocal lattice for graphene will also be two-dimensional. We need to define b1,b2 which have the property that aibj=δij2π/Ni This will give us b1=(1,13)2πN1 and b2=(0,23)2πN2. Then we can define our reciprocal lattice as all points mb1+nb2 where 0m<N1 and 0n<N2 are integers. Like the real space lattice, we will label the momentum lattice sites by the tuple ((m,n), atom type )

  • Write momentumLabels(N) which takes the number of unit cells N and generates labels for the reciprocal lattice vectors.

  • Write momentumLabelToK(myLabel) which takes a momentum label and tells you the location in the reciprocal lattice which corresponds to that label. BrillouinZone

This is what my Brillouin zone looks like for 9x9.

Testing

There are a couple of things to test.

  • Loop over your labels and use LabelToR to plot out all your points (you should also do this for your k-points)

  • Check LabelToIndex by checking for an arbitrary label that myLabels[LabelToIndex(label)]==label

Tangeant: First Brillouin Zone

Like the real space lattice, the k-points are periodic. All points in the set {k+ib1N1+jb2N2} for all integers (i,j) are equivalent. Therefore, we could choose any k point from each equivalent set. There is a special Brillouin zone where you choose, from each set of equivalent k-points, the one closest to the origin. This is called the first Brillouin zone.

This is what I get for the first Brillouin zone: