-
Anton Akhmerov authoredAnton Akhmerov authored
import matplotlib
from matplotlib import pyplot
import numpy as np
from common import draw_classic_axes, configure_plotting
configure_plotting()
pi = np.pi
More complex systems
!!! summary "Learning goals"
After this lecture you will be able to:
- formulate equations of motion for electrons or phonons in 1D for systems with more than one degree of freedom per unit cell.
- solve these equations to arrive at the dispersion relation.
- derive the group velocity, effective mass, and density of states.
- explain what happens with the band structure when the periodicity of the lattice is increased or reduced.
More hoppings in LCAO
Consider electrons in a 1D atomic chain again
Let's relax the assumption that there is no hopping between atoms that are further than nearest neighbors:
We now have more terms in the Schrödinger equation:
but the same Ansatz as before should work: $ c_n = c_0 \exp(ikna) $.
Indeed, after substituting we get:
(check that!)
Therefore including more hopping terms works out of the box using the same Ansatz.
More degrees of freedom per unit cell:
Before we used that all atoms are similar, but this doesn't work anymore. We need to generalize our anzatz. We label all degrees of freedom in each unit cell (a repeated element of the system).
For two atoms in a unit cell we have displacements
Having the degrees of freedom let's write down the equations of motion:
The new Ansatz is conceptually the same as before: all unit cells should be the same up to a phase factor:
Substituting this ansatz into the equations of motion we end up with an eigenvalue problem:
Looking at the eigenvectors we see that for every
def dispersion_2m(k, kappa=1, M=1.4, m=1, acoustic=True):
Mm = M*m
m_harm = (M + m) / Mm
root = kappa * np.sqrt(m_harm**2 - 4*np.sin(k/2)**2 / Mm)
if acoustic:
root *= -1
return np.sqrt(kappa*m_harm + root)
# TODO: Add panels with eigenvectors
k = np.linspace(-2*pi, 6*pi, 300)
fig, ax = pyplot.subplots()
ax.plot(k, dispersion_2m(k, acoustic=False), label='optical')
ax.plot(k, dispersion_2m(k), label='acoustic')
ax.set_xlabel('$ka$')
ax.set_ylabel(r'$\omega$')
pyplot.xticks([-pi, 0, pi], [r'$-\pi$', '$0$', r'$\pi$'])
pyplot.yticks([], [])
pyplot.vlines([-pi, pi], 0, 2.2, linestyles='dashed')
pyplot.legend()
pyplot.xlim(-1.75*pi, 3.5*pi)
pyplot.ylim(bottom=0)
draw_classic_axes(ax, xlabeloffset=.2)
The lower branch is called acoustic because its linear dispersion near
Important concept: density of states (DOS):
The quantity
When plotted, the DOS may look something like this:
matplotlib.rcParams['font.size'] = 24
k = np.linspace(-.25*pi, 1.5*pi, 300)
k_dos = np.linspace(0, pi, 20)
fig, (ax, ax2) = pyplot.subplots(ncols=2, sharey=True, figsize=(10, 5))
ax.plot(k, dispersion_2m(k, acoustic=False), label='optical')
ax.plot(k, dispersion_2m(k), label='acoustic')
ax.vlines(k_dos, 0, dispersion_2m(k_dos, acoustic=False),
colors=(0.5, 0.5, 0.5, 0.5))
ax.hlines(
np.hstack((dispersion_2m(k_dos, acoustic=False), dispersion_2m(k_dos))),
np.hstack((k_dos, k_dos)),
1.8*pi,
colors=(0.5, 0.5, 0.5, 0.5)
)
ax.set_xlabel('$ka$')
ax.set_ylabel(r'$\omega$')
ax.set_xticks([0, pi])
ax.set_xticklabels(['$0$', r'$\pi$'])
ax.set_yticks([], [])
ax.set_xlim(-pi/4, 2*pi)
ax.set_ylim((0, dispersion_2m(0, acoustic=False) + .2))
draw_classic_axes(ax, xlabeloffset=.2)
k = np.linspace(0, pi, 1000)
omegas = np.hstack((
dispersion_2m(k, acoustic=False), dispersion_2m(k)
))
ax2.hist(omegas, orientation='horizontal', bins=75)
ax2.set_xlabel(r'$g(\omega)$')
ax2.set_ylabel(r'$\omega$')
# Truncate the singularity in the DOS
max_x = ax2.get_xlim()[1]
ax2.set_xlim((0, max_x/2))
draw_classic_axes(ax2, xlabeloffset=.1)
matplotlib.rcParams['font.size'] = 16
Note that normally
Consistency check with 1 atom per cell
But what if we take
The reason why we get two bands is because we have
For
To reconsile the two pictures let's plot two unit cells in the reciprocal space. (Definition: each of these unit cells is called a Brillouin zone, a concept that will come up later.)
k = np.linspace(0, 2*pi, 300)
k_dos = np.linspace(0, pi, 20)
fig, ax = pyplot.subplots()
ax.plot(k, dispersion_2m(k, acoustic=False), label='optical')
ax.plot(k, dispersion_2m(k), label='acoustic')
omega_max = dispersion_2m(0, acoustic=False)
ax.plot(k, omega_max * np.sin(k/4), label='equal masses')
ax.set_xlabel('$ka$')
ax.set_ylabel(r'$\omega$')
ax.set_xticks([0, pi, 2*pi])
ax.set_xticklabels(['$0$', r'$\pi/2a$', r'$\pi/a$'])
ax.set_yticks([], [])
ax.set_xlim(-pi/8, 2*pi+.4)
ax.set_ylim((0, dispersion_2m(0, acoustic=False) + .2))
ax.legend(loc='lower right')
pyplot.vlines([pi, 2*pi], 0, 2.2, linestyles='dashed')
draw_classic_axes(ax, xlabeloffset=.2)
Doubling the lattice constant "folds" the band structure on itself, doubling all the bands.
Total number of states
Which values of
Assume closed boundary conditions
For open boundary conditions
Summary
- By using plane waves in real space as an Ansatz we found all normal modes and eigenvectors
- Dispersion relation of a system with period in real space is periodic with periodin-space
- Computing dispersions explains all the problems we listed before (need for cutoff, lack of scattering with every single atom, existence of insulators).
- Electrons and phonons have a complicated nonlinear relation between momentum and velocity (group velocity), effective mass, and density of states
- In a system with more than one degree of freedom per unit cell we need to consider independent amplitudes for each degree of freedom, and get multiple bands.