Chapter 3
18 min read
Section 25 of 70

Bloch's Theorem

Reciprocal Space and Diffraction

Learning Objectives

Sections 3.1–3.4 built the geometry of reciprocal space: why we need it, how to construct it, what the Brillouin zone looks like, and how to label its high-symmetry points. This section turns the geometry into physics. We ask the most consequential question in solid-state theory:

What does the periodicity of the crystal do to the wavefunctions of electrons inside it?

The answer — Bloch's theorem — is the single fact from which every band-structure picture, every density of states, every metal/semiconductor distinction, and every plane-wave DFT code (VASP included) descends. By the end of this section you should be able to:

  1. State Bloch's theorem in both equivalent forms and explain why they are saying the same thing in two languages.
  2. Derive the theorem from the single observation that lattice translations commute with the Hamiltonian.
  3. Distinguish the three actors — ψk(r)\psi_{\mathbf{k}}(\mathbf{r}) (the Bloch state), eikre^{i\mathbf{k}\cdot\mathbf{r}} (the plane-wave envelope), and uk(r)u_{\mathbf{k}}(\mathbf{r}) (the cell-periodic part) — and say in one sentence what each does.
  4. Explain the difference between true momentum and crystal momentum, and why k\mathbf{k} can always be reduced to the first Brillouin zone.
  5. Recognise a Bloch wavefunction in the wild, including its instantly recognisable signature: the probability density ψk2|\psi_{\mathbf{k}}|^2 has the full periodicity of the lattice, but ψk\psi_{\mathbf{k}} itself only repeats up to a phase.
  6. Connect the Bloch form directly to the plane-wave expansion VASP uses internally — and predict from that connection how VASP's ENCUT and KPOINTS tags relate to the mathematics.

The Question Bloch's Theorem Answers

Imagine an electron inside an infinite, perfect crystal. Wherever it sits, it sees the same potential it would have seen one lattice vector R\mathbf{R} away — the next cell looks identical. Two questions immediately arise:

  1. Is the electron a plane wave eikre^{i\mathbf{k}\cdot\mathbf{r}}, like a free particle? It can't be — a plane wave has constant ψ2|\psi|^2, but a real crystal has nuclei that attract electrons more strongly at some places than others, so the density must wobble.
  2. Is the electron localised on a single atom? It can't be either — by translation symmetry, the cell next door is just as attractive, so why would the electron be stuck on one particular nucleus and not the others?

Bloch's theorem (Felix Bloch, 1928, in his Leipzig PhD thesis under Heisenberg) is the elegant resolution: every stationary electron state in a periodic potential is a plane wave times a periodic function — delocalised globally, but modulated locally to feel the atoms. One formula does both jobs. Let us derive it from first principles.


The Setup — Periodic Potentials

Inside a crystal, the (effective single-particle) potential satisfies

V(r+R)  =  V(r)for every direct lattice vector R=n1a1+n2a2+n3a3.V(\mathbf{r} + \mathbf{R}) \;=\; V(\mathbf{r}) \qquad \text{for every direct lattice vector } \mathbf{R} = n_1\mathbf{a}_1 + n_2\mathbf{a}_2 + n_3\mathbf{a}_3.

That is the entire physics: identical unit cells, repeated forever. The single-particle Hamiltonian is then

H^  =  p^22m+V(r),V(r+R)=V(r).\hat{H} \;=\; \frac{\hat{\mathbf{p}}^2}{2m} + V(\mathbf{r}), \qquad V(\mathbf{r} + \mathbf{R}) = V(\mathbf{r}).

What "single-particle" means here

In a real crystal the electrons interact with each other. DFT (Chapter 4) replaces this by an effective single-particle problem in which each electron moves in a self-consistent mean-field potential built from all the others. That effective potential inherits the same translation symmetry as the nuclei, so Bloch's theorem applies unchanged. Everything we derive here is exactly what VASP solves at each step of the SCF cycle.


The Translation Operator

Define an operator T^R\hat{T}_{\mathbf{R}} that translates a wavefunction by the lattice vector R\mathbf{R}:

(T^Rψ)(r)    ψ(rR).(\hat{T}_{\mathbf{R}} \psi)(\mathbf{r}) \;\equiv\; \psi(\mathbf{r} - \mathbf{R}).

(The minus sign is conventional — it makes T^R\hat{T}_{\mathbf{R}} shift the wavefunction forward by R\mathbf{R}, the way you would expect.) Two facts follow immediately from the definition:

  1. Composition. T^RT^R=T^R+R\hat{T}_{\mathbf{R}}\hat{T}_{\mathbf{R}'} = \hat{T}_{\mathbf{R}+\mathbf{R}'}. Translating by R\mathbf{R}' and then by R\mathbf{R} is the same as translating by their sum.
  2. Unitarity. T^RT^R=1\hat{T}_{\mathbf{R}}^{\dagger}\hat{T}_{\mathbf{R}} = \mathbb{1} — translation preserves inner products and norms.

These two facts make the set {T^R}\{\hat{T}_{\mathbf{R}}\} a unitary representation of the abelian translation group of the lattice. Group theory will now do the heavy lifting.


Why T̂_R Commutes with the Hamiltonian

Apply T^RH^\hat{T}_{\mathbf{R}}\hat{H} to a test function ψ(r)\psi(\mathbf{r}):

(T^RH^ψ)(r)=(H^ψ)(rR)=[22m2+V(rR)]ψ(rR).(\hat{T}_{\mathbf{R}}\hat{H}\psi)(\mathbf{r}) = (\hat{H}\psi)(\mathbf{r}-\mathbf{R}) = \left[-\tfrac{\hbar^2}{2m}\nabla^2 + V(\mathbf{r}-\mathbf{R})\right]\psi(\mathbf{r}-\mathbf{R}).

The Laplacian is translation-invariant — 2\nabla^2 doesn't care where the origin is — and crucially V(rR)=V(r)V(\mathbf{r}-\mathbf{R}) = V(\mathbf{r}) because R\mathbf{R} is a lattice vector. So

(T^RH^ψ)(r)=H^ψ(rR)=(H^T^Rψ)(r).(\hat{T}_{\mathbf{R}}\hat{H}\psi)(\mathbf{r}) = \hat{H}\,\psi(\mathbf{r}-\mathbf{R}) = (\hat{H}\hat{T}_{\mathbf{R}}\psi)(\mathbf{r}).

Since this holds for any test function:

  [T^R,H^]  =  0for every lattice vector R.  \boxed{\;[\hat{T}_{\mathbf{R}},\,\hat{H}] \;=\; 0 \quad \text{for every lattice vector } \mathbf{R}.\;}

Why this single line is the whole game

Two operators that commute share a common eigenbasis. So the eigenstates of H^\hat{H} can be chosen to also be eigenstates of every T^R\hat{T}_{\mathbf{R}} simultaneously. The rest of Bloch's theorem is just figuring out what those simultaneous eigenstates look like.


Eigenvalues of T̂_R Are Pure Phases

Let ψ\psi be a simultaneous eigenstate. Call its eigenvalue under T^R\hat{T}_{\mathbf{R}} the number c(R)c(\mathbf{R}):

T^Rψ  =  c(R)ψ.\hat{T}_{\mathbf{R}}\psi \;=\; c(\mathbf{R})\,\psi.

Two constraints fix c(R)c(\mathbf{R}) almost completely:

  1. Unitarity says c(R)=1|c(\mathbf{R})| = 1. Translation does not change the norm, so the eigenvalue of a unitary operator must lie on the unit circle. Write c(R)=eiϕ(R)c(\mathbf{R}) = e^{i\phi(\mathbf{R})}.
  2. Composition demands c(R)c(R)=c(R+R)c(\mathbf{R})\,c(\mathbf{R}') = c(\mathbf{R}+\mathbf{R}'), i.e. ϕ(R)+ϕ(R)=ϕ(R+R)\phi(\mathbf{R}) + \phi(\mathbf{R}') = \phi(\mathbf{R}+\mathbf{R}'). So ϕ\phi is a linear function of R\mathbf{R}.

A linear scalar function of a 3-vector is a dot product with some other vector. Call that vector k\mathbf{k}:

ϕ(R)  =  kRc(R)  =  eikR.\phi(\mathbf{R}) \;=\; \mathbf{k}\cdot\mathbf{R} \quad\Longrightarrow\quad c(\mathbf{R}) \;=\; e^{i\mathbf{k}\cdot\mathbf{R}}.

Group theory has just delivered, for free, the central object: every joint eigenstate of H^\hat{H} and T^R\hat{T}_{\mathbf{R}} is labeled by a wavevector k\mathbf{k}, and that wavevector determines the phase factor eikRe^{i\mathbf{k}\cdot\mathbf{R}} the state picks up under translation by R\mathbf{R}.

Where this k comes from

Notice we did not assume k\mathbf{k} was a momentum. We got it for free as the quantum number that labels translation eigenstates. The fact that, in the free-electron limit, this k\mathbf{k} coincides with p/\mathbf{p}/\hbar is a special case — in a crystal, k\mathbf{k} is crystal momentum, a related but distinct concept that we unpack below.


Bloch's Theorem — Two Equivalent Forms

Combining the two facts — eigenstates of H^\hat{H} can be chosen as eigenstates of T^R\hat{T}_{\mathbf{R}}, and those eigenvalues are exactly eikRe^{i\mathbf{k}\cdot\mathbf{R}} — gives the theorem in its first form:

  ψk(r+R)  =  eikRψk(r).  (Form I)\boxed{\;\psi_{\mathbf{k}}(\mathbf{r}+\mathbf{R}) \;=\; e^{i\mathbf{k}\cdot\mathbf{R}}\,\psi_{\mathbf{k}}(\mathbf{r}).\;}\qquad \text{(Form I)}

Translating the wavefunction by one lattice vector multiplies it by a phase. Now define a new function by stripping out the plane-wave envelope:

uk(r)    eikrψk(r).u_{\mathbf{k}}(\mathbf{r}) \;\equiv\; e^{-i\mathbf{k}\cdot\mathbf{r}}\,\psi_{\mathbf{k}}(\mathbf{r}).

Under translation by R\mathbf{R}:

uk(r+R)=eik(r+R)ψk(r+R)=eikreikReikRψk(r)=uk(r).u_{\mathbf{k}}(\mathbf{r}+\mathbf{R}) = e^{-i\mathbf{k}\cdot(\mathbf{r}+\mathbf{R})}\,\psi_{\mathbf{k}}(\mathbf{r}+\mathbf{R}) = e^{-i\mathbf{k}\cdot\mathbf{r}} e^{-i\mathbf{k}\cdot\mathbf{R}} \cdot e^{i\mathbf{k}\cdot\mathbf{R}}\,\psi_{\mathbf{k}}(\mathbf{r}) = u_{\mathbf{k}}(\mathbf{r}).

The two phase factors cancel exactly. Therefore:

  ψk(r)  =  eikruk(r),uk(r+R)=uk(r).  (Form II)\boxed{\;\psi_{\mathbf{k}}(\mathbf{r}) \;=\; e^{i\mathbf{k}\cdot\mathbf{r}}\,u_{\mathbf{k}}(\mathbf{r}), \quad u_{\mathbf{k}}(\mathbf{r}+\mathbf{R}) = u_{\mathbf{k}}(\mathbf{r}).\;}\qquad \text{(Form II)}

Forms I and II are mathematically equivalent — given one, you can derive the other by the calculation above. They emphasise different aspects:

FormWhat it makes obvious
I — phase under translationHow the wavefunction transforms cell-to-cell. Best for symmetry analysis, group representations, and the proof that |ψ|² is lattice-periodic.
II — plane wave × periodic partWhat the wavefunction LOOKS like. Best for visualisation, plane-wave expansions in DFT codes, and the connection to free electrons.
One sentence summary: a Bloch state is a plane wave whose amplitude has been "painted" with the periodicity of the crystal — an unbounded carrier of crystal momentum, modulated locally by the atomic landscape.

Interactive — A 1D Bloch State

The cleanest place to feel Bloch's theorem is 1D. The diagram below plots a model 1D Bloch state ψk(x)=eikxuk(x)\psi_k(x) = e^{ikx}\,u_k(x) with uk(x)=1+αcos(2πx/a)u_k(x) = 1 + \alpha\cos(2\pi x/a) — a constant plus a single Fourier component at the smallest reciprocal lattice vector G=2π/aG = 2\pi/a. By construction uk(x+a)=uk(x)u_k(x+a) = u_k(x), so this is a legitimate Bloch state.

Three things to play with:

  • Slide kk. Watch the cyan Reψ\mathrm{Re}\,\psi and purple Imψ\mathrm{Im}\,\psi oscillate at different rates as the plane-wave envelope twists in the complex plane. At k=0k=0 (Γ) the imaginary part vanishes; at the zone edge k=π/ak = \pi/a (X) the wavefunction flips sign every cell.
  • Slide α\alpha. At α=0\alpha = 0 the wavefunction is a pure plane wave (free electron) — its ψ2|\psi|^2 is constant. As you crank α\alpha up, the pink ψ2|\psi|^2 develops bumps locked to the atoms — the lattice is "squeezing" electron density into the cells.
  • Read the table. The phase column shows argψ(na)\arg\psi(na) at successive lattice sites. The increment per row is exactly kaka, independent of α\alpha — the visual fingerprint of Form I of the theorem.

A 1D Bloch state — drag k and the periodic part

interactive

Blue dots are atoms at x = na. We plot the Bloch state ψ_k(x) = e^(ikx)·u_k(x) with u_k(x) = 1 + α cos(2π x / a) — a clean toy model that captures the theorem. Toggle curves below to peel the wavefunction apart.

01a2a3a4a5a6acurves: amplitude (vertical), real-space x (horizontal)
Bloch phase per cell e^(ika) = 0.000 + 1.000 i
ψ(x + a) = e^(ika) · ψ(x) ⇒ phase increment ka = 90.0° per cell
Look at the pink curve |ψ|² — it has the same period as the lattice for any k. Now compare the cyan Re ψ at sites 0a, 1a, 2a, … — its magnitude repeats but its sign/phase rotates by 90.0° each step. That is Bloch's theorem in one picture.
siteRe ψIm ψ|ψ|²phase
01.4500.0002.1030.0°
1a0.0001.4502.10390.0°
2a-1.4500.0002.103180.0°
3a-0.000-1.4502.103-90.0°
4a1.450-0.0002.1030.0°
5a0.0001.4502.10390.0°
6a-1.4500.0002.103180.0°

The pink curve is the hero

Notice that no matter how you set kk, the pink ψ2|\psi|^2 trace has the period of the lattice. That is because the phase factor eikRe^{i\mathbf{k}\cdot\mathbf{R}} has magnitude 1 and disappears when you take ψ2=ψψ|\psi|^2 = \psi^*\psi. The cyan and purple curves do not repeat from cell to cell — only their squared magnitude does. This is exactly why VASP plots and reports the charge density (which lives on the unit cell) rather than the wavefunction itself.


The Cell-Periodic Part u_k(r)

Form II isolates the "atomic" ingredient of the Bloch state. Because uku_{\mathbf{k}} has the periodicity of the lattice, it is fully described by its values inside one unit cell — a finite chunk of space. And any periodic function can be expanded in the natural basis on a lattice: a Fourier series whose wavevectors are the reciprocal lattice vectors G\mathbf{G}.

uk(r)  =  Gck,GeiGr.u_{\mathbf{k}}(\mathbf{r}) \;=\; \sum_{\mathbf{G}} c_{\mathbf{k},\mathbf{G}}\,e^{i\mathbf{G}\cdot\mathbf{r}}.

Substituting back into Form II:

ψk(r)  =  Gck,Gei(k+G)r.\psi_{\mathbf{k}}(\mathbf{r}) \;=\; \sum_{\mathbf{G}} c_{\mathbf{k},\mathbf{G}}\,e^{i(\mathbf{k}+\mathbf{G})\cdot\mathbf{r}}.

That is one of the most consequential identities in solid-state physics. It says the Bloch state at wavevector k\mathbf{k} is a superposition of plane waves whose wavevectors form a single set: {k+G}\{\mathbf{k}+\mathbf{G}\}. No other plane waves contribute. The full Hilbert space, infinite in principle, is block-diagonal in k\mathbf{k}, with each block spanned only by plane waves shifted by some reciprocal lattice vector.

This is the foundation of plane-wave DFT

When VASP says it solves the Kohn–Sham equations "in a plane-wave basis," it means: at each k\mathbf{k} in the Brillouin-zone mesh, the Bloch state is expanded as the finite sum above. The basis size is set by ENCUT — the kinetic energy cutoff that selects which G\mathbf{G} shells are kept (Section 4.9). Without Bloch's theorem you would need every plane wave in R3\mathbb{R}^3; with it, you only need those tied to the chosen k\mathbf{k}.


Crystal Momentum and Why k Lives in the BZ

The label k\mathbf{k} looks like a momentum, but there is a subtle redundancy. Replace k\mathbf{k} by k=k+G\mathbf{k}' = \mathbf{k} + \mathbf{G} for any reciprocal lattice vector G\mathbf{G}. The phase factor under translation becomes

eikR=ei(k+G)R=eikReiGR=eikR,e^{i\mathbf{k}'\cdot\mathbf{R}} = e^{i(\mathbf{k}+\mathbf{G})\cdot\mathbf{R}} = e^{i\mathbf{k}\cdot\mathbf{R}}\,e^{i\mathbf{G}\cdot\mathbf{R}} = e^{i\mathbf{k}\cdot\mathbf{R}},

because eiGR=1e^{i\mathbf{G}\cdot\mathbf{R}} = 1 for every reciprocal-lattice / direct-lattice pair (this was the entire point of Section 3.2). So Bloch states at k\mathbf{k} and k+G\mathbf{k}+\mathbf{G} transform identically under every translation — k\mathbf{k} is only defined modulo G\mathbf{G}.

The natural fundamental domain is the first Brillouin zone (Section 3.3). Every physically distinct Bloch wavevector can be reduced into the first BZ by adding or subtracting some G\mathbf{G}. This is the famous reduced-zone scheme: instead of plotting bands over all of R3\mathbb{R}^3, plot them only over the BZ — the rest is redundant.

Crystal momentum is NOT true momentum

A free-electron plane wave eikre^{i\mathbf{k}\cdot\mathbf{r}} is an eigenstate of the momentum operator p^=i\hat{\mathbf{p}} = -i\hbar\nabla with eigenvalue k\hbar\mathbf{k}. A Bloch state is not: applying p^\hat{\mathbf{p}} to eikruk(r)e^{i\mathbf{k}\cdot\mathbf{r}}u_{\mathbf{k}}(\mathbf{r}) generates terms that involve uk\nabla u_{\mathbf{k}}. Thus k\mathbf{k} is called crystal momentum: it labels translation eigenvalues but is conserved only modulo a reciprocal lattice vector. In phonon-mediated scattering and electron diffraction, the missing or extra G\hbar\mathbf{G} is taken up by the lattice as a whole — a phenomenon known as umklapp.


Worked Example — The Free-Electron Limit

Suppose V(r)=0V(\mathbf{r}) = 0 everywhere. Then the eigenstates are plane waves ψ(r)eiqr\psi(\mathbf{r}) \propto e^{i\mathbf{q}\cdot\mathbf{r}} with energies E=2q2/2mE = \hbar^2 q^2/2m. Are these Bloch states? Yes — set u(r)=constantu(\mathbf{r}) = \text{constant} and k=q\mathbf{k} = \mathbf{q}. The cell-periodic part is just a constant (the trivially periodic function) and the entire structure is in the plane-wave envelope.

But q\mathbf{q} can be anywhere in R3\mathbb{R}^3, not just the first BZ. The reduced-zone scheme handles this gracefully: write q=k+G\mathbf{q} = \mathbf{k} + \mathbf{G} with k\mathbf{k} in the first BZ. Then

ψq(r)  =  ei(k+G)r  =  eikreiGruk(r),\psi_{\mathbf{q}}(\mathbf{r}) \;=\; e^{i(\mathbf{k}+\mathbf{G})\cdot\mathbf{r}} \;=\; e^{i\mathbf{k}\cdot\mathbf{r}}\,\underbrace{e^{i\mathbf{G}\cdot\mathbf{r}}}_{u_{\mathbf{k}}(\mathbf{r})},

and indeed eiGre^{i\mathbf{G}\cdot\mathbf{r}} is cell-periodic because eiG(r+R)=eiGre^{i\mathbf{G}\cdot(\mathbf{r}+\mathbf{R})} = e^{i\mathbf{G}\cdot\mathbf{r}} (again, eiGR=1e^{i\mathbf{G}\cdot\mathbf{R}}=1). Each free-electron plane wave is a Bloch state at the BZ-folded k\mathbf{k}, with cell-periodic part equal to the leftover plane wave indexed by G\mathbf{G}.

The free-electron parabola, folded

Plot the free-electron energies E=2k+G2/2mE = \hbar^2 |\mathbf{k}+\mathbf{G}|^2/2m for k\mathbf{k} running through the BZ and G\mathbf{G} ranging over the reciprocal lattice. You get a tower of parabolas, one per G\mathbf{G}, all crammed into the BZ. Turn on a small periodic potential and these parabolas hybridise where they cross — opening band gaps. This is the entire content of Chapter 4's "nearly-free electron" model. Bloch's theorem is the scaffolding it hangs on.


Bloch's Theorem in VASP — The Plane-Wave Expansion

Putting Bloch's theorem and Fourier expansion together gives the equation that VASP, Quantum ESPRESSO, ABINIT, and every other plane-wave DFT code is built around:

ψn,k(r)  =  1VGcn,k,Gei(k+G)r,\psi_{n,\mathbf{k}}(\mathbf{r}) \;=\; \frac{1}{\sqrt{V}}\sum_{\mathbf{G}}\,c_{n,\mathbf{k},\mathbf{G}}\,e^{i(\mathbf{k}+\mathbf{G})\cdot\mathbf{r}},

where nn is the band index and the sum runs over all reciprocal lattice vectors G\mathbf{G} within a chosen energy cutoff:

22mk+G2    Ecut.\frac{\hbar^2}{2m}\,|\mathbf{k}+\mathbf{G}|^2 \;\le\; E_{\text{cut}}.

This is the ENCUT tag in your VASP INCAR file. The variational unknowns in the calculation are the complex coefficients cn,k,Gc_{n,\mathbf{k},\mathbf{G}}. For each band nn and each k-point sampled in the BZ, VASP solves a generalised eigenvalue problem in a basis of order NPWVEcut3/2N_{\text{PW}} \sim V \cdot E_{\text{cut}}^{3/2} plane waves.

VASP tag / fileWhat it setsConnection to Bloch's theorem
ENCUT (INCAR)Plane-wave kinetic energy cutoffDecides which G-shells are kept in the expansion of u_k. Larger ENCUT → finer u_k.
KPOINTS fileMesh of k-points sampled in the first BZEach k labels an independent Bloch state. The mesh discretises the integral over the BZ for total energies and densities.
WAVECAR (binary output)Stores the c_{n,k,G} coefficients for every band and k-pointDirect dump of the Bloch-expansion coefficients. Post-processing tools (band structure plots, charge density) all read this file.
ISYM (INCAR)Whether to use crystal symmetry to reduce the k-point setTranslation symmetry already built in via Bloch; ISYM > 0 also exploits point-group symmetry to map equivalent k-points onto each other.

Code — Building and Verifying a Bloch State

Theorems are easier to trust once you have built one with your hands. The snippet below constructs a Bloch state by definition — ψk(x)=eikxuk(x)\psi_k(x) = e^{ikx} u_k(x) with a cell-periodic uku_k — and then verifies the defining identity ψk(x+a)=eikaψk(x)\psi_k(x+a) = e^{ika}\psi_k(x) numerically. Every line carries an explanation card; click any line in the right panel to see it.

Construct a Bloch state and verify Bloch's theorem
🐍bloch_1d.py
1import numpy as np

NumPy is the workhorse for numerical arrays in Python. We need it for vectorised math: building the position grid x, computing complex exponentials e^(ikx) element-wise, and array multiplication. Aliased as np by universal convention.

EXECUTION STATE
numpy = Library providing ndarray (N-dimensional array), complex-number support, FFTs, linear algebra. Math runs as compiled C, not Python loops.
as np = Standard alias so we write np.exp(...) instead of numpy.exp(...).
4Comment — what we are about to build

We will build a single Bloch state psi_k(x) in a 1D crystal and then verify its defining property: psi_k(x + a) = e^(ika) · psi_k(x). No quantum mechanics solver is needed — we are constructing a wavefunction that ALREADY has Bloch form by design.

5a = 1.0 — the lattice constant

The spacing between identical unit cells. We pick a = 1 (arbitrary length unit) so distances are measured in units of a. In a real VASP run, a would be the lattice parameter from POSCAR (e.g. 5.43 Å for silicon).

EXECUTION STATE
a = 1.0 — lattice constant. Sets the period of the crystal: V(x + a) = V(x).
6N_cells = 6 — how many cells to plot

We will visualise 6 unit cells side-by-side so the periodic structure of |psi|^2 is obvious by eye. This is purely cosmetic; one cell is enough mathematically since u_k repeats.

EXECUTION STATE
N_cells = 6 — number of unit cells in the simulation box.
7N_per_cell = 200 — sampling resolution

Number of grid points within each cell. Higher = smoother curves. Total grid size will be N_cells * N_per_cell = 1200 points.

EXECUTION STATE
N_per_cell = 200 — sample density per cell. Total points = 6 × 200 = 1200.
8x = np.linspace(0, N_cells * a, N_cells * N_per_cell)

Build a uniformly spaced 1D position grid covering 0 ≤ x ≤ 6a. np.linspace(start, stop, num) returns num evenly spaced numbers between start and stop (inclusive on both ends).

EXECUTION STATE
📚 np.linspace(start, stop, num) = NumPy function: builds a 1D array of num evenly-spaced floats from start to stop. Example: np.linspace(0, 1, 5) → [0.0, 0.25, 0.5, 0.75, 1.0]
⬇ arg 1: start = 0 = Left edge of the simulation box.
⬇ arg 2: stop = N_cells * a = 6.0 = Right edge — six lattice constants from the origin.
⬇ arg 3: num = 1200 = Total number of sample points. With endpoint included, the spacing is dx = 6.0 / (1200 − 1) ≈ 0.005a — fine enough to resolve the cosine modulation.
⬆ result: x = [0.0000, 0.0050, 0.0100, …, 5.9950, 6.0000] — a 1D array of 1200 floats, our position grid.
10Comment — the cell-periodic part

Bloch's theorem says psi_k(x) = e^(ikx) · u_k(x) where u_k is cell-periodic. We must define such a u explicitly, so we choose the simplest non-trivial example: a constant plus a single Fourier component at G = 2π/a.

11def u_periodic(x, a, alpha=0.45) — the cell-periodic function

Defines u(x) = 1 + alpha · cos(2π x / a). Adding cos(Gx) with G a reciprocal lattice vector guarantees u(x + a) = u(x), because cos(G(x + a)) = cos(Gx + 2π) = cos(Gx).

EXECUTION STATE
⬇ input: x = Position grid (1D NumPy array, length 1200). Will be evaluated element-wise.
⬇ input: a = 1.0 — lattice constant. Sets the period of the cosine.
⬇ input: alpha = 0.45 = Modulation depth. alpha = 0 ⇒ u(x) = 1 (free electron, flat). alpha = 0.45 ⇒ u oscillates between 0.55 and 1.45 — moderate binding.
⬆ returns = 1D NumPy array of length 1200, each element u(x_i) ∈ [1 − α, 1 + α] = [0.55, 1.45].
12G = 2 * np.pi / a

G is a reciprocal lattice vector — the smallest non-zero one in 1D. From Section 3.2: the 1D reciprocal lattice is the set of points G_m = 2πm/a. Choosing G = G_1 = 2π/a gives the lowest non-trivial Fourier component of u.

EXECUTION STATE
G = 2π / a = 2π / 1.0 ≈ 6.2832 — the smallest non-zero reciprocal lattice vector.
→ physical meaning = G is the unique wavevector for which e^(iGa) = 1, i.e. the wave fits ONE full period inside one unit cell.
13return 1.0 + alpha * np.cos(G * x)

Element-wise: builds the array u where u[i] = 1 + alpha · cos(G · x[i]). NumPy broadcasts the scalar 1.0, scalar alpha, and the np.cos(...) array all in one vectorised line.

EXECUTION STATE
📚 np.cos(array) = Element-wise cosine. Input: array of N floats. Output: array of N floats, each cos(input[i]).
G * x = Scalar × array → array of length 1200. Each element is the phase Gx_i ∈ [0, 12π].
alpha * np.cos(G*x) = Modulation term, oscillates between −0.45 and +0.45.
⬆ return: u(x) = Array of length 1200. At x = 0: u = 1.45. At x = a/2: u = 0.55. At x = a: u = 1.45 (period restored ✓).
16k = 0.25 * (2 * np.pi / a)

Pick a wavevector inside the first Brillouin zone, which in 1D is k ∈ (−π/a, π/a]. We set k = (1/4) · (2π/a) = π/(2a) — exactly halfway between the zone centre Γ (k = 0) and the zone edge X (k = π/a).

EXECUTION STATE
k = 0.25 · 2π / a = π/(2a) ≈ 1.5708. In units of π/a: k = 0.5 · (π/a). In units of (2π/a): k = 0.25.
→ why this k? = ka = π/2 ⇒ phase factor e^(ika) = e^(iπ/2) = i. The wavefunction picks up a factor of i (a 90° rotation in the complex plane) every time we cross one cell — easy to recognise visually.
19psi = np.exp(1j * k * x) * u_periodic(x, a)

The full Bloch state. This single line implements psi_k(x) = e^(ikx) · u_k(x). We multiply two arrays of length 1200 element-wise; the result is a complex array of length 1200.

EXECUTION STATE
📚 np.exp(complex_array) = Element-wise complex exponential. Input element z = a + bi → output e^z = e^a · (cos b + i sin b). For pure-imaginary input ix: returns cos(x) + i·sin(x).
1j = Python literal for the imaginary unit i. So 1j * k * x is a pure-imaginary array.
1j * k * x = Imaginary array, element i is i·k·x_i. Magnitudes range over [0, i·6π].
np.exp(1j * k * x) = Complex array of length 1200. At x=0: e^0 = 1+0i. At x=a: e^(iπ/2) = 0+1i. At x=2a: e^(iπ) = −1+0i. The plane wave e^(ikx).
u_periodic(x, a) = Real array of length 1200, each element u(x_i) ∈ [0.55, 1.45]. Lattice-periodic.
⬆ result: psi = Complex array of length 1200 — the Bloch state psi_k(x) sampled at every grid point.
→ why two factors? = e^(ikx) carries the long-wavelength 'crystal momentum' label k; u_k(x) carries the short-wavelength atomic structure that varies inside each cell. Their product is the actual electron wavefunction in the crystal.
22phase_factor = np.exp(1j * k * a)

The Bloch phase per unit cell. By Bloch's theorem, translating x by one lattice vector multiplies psi by exactly this scalar — independent of x.

EXECUTION STATE
1j * k * a = i · π/(2a) · a = iπ/2 — pure imaginary scalar.
⬆ phase_factor = e^(iπ/2) = cos(π/2) + i sin(π/2) = 0 + 1i ≈ 0.0000 + 1.0000i. A 90° rotation in the complex plane.
23i0 = 0

Index of x = 0 in the grid. We will use this to read psi(0).

EXECUTION STATE
i0 = 0 — first element of x.
24i_a = N_per_cell # index corresponding to x = a

Since the grid contains 200 points per cell, the index 200 corresponds to x = a (the start of the second cell). We will read psi(a) here and verify it equals e^(ika) · psi(0).

EXECUTION STATE
i_a = 200 — index where x[i_a] = a.
→ check = x[200] = (200/1199) · 6 ≈ 1.001 ≈ a ✓ (exact match would need np.linspace(..., endpoint=False); the 0.1% discrepancy here is the only numerical cost of using endpoint=True).
26print(f"psi(0) = {psi[i0]: .4f}")

Reads psi at the origin. Computed: e^0 · u(0) = 1 · 1.45 = 1.45 + 0i.

EXECUTION STATE
psi[i0] = 1.4500 + 0.0000i — purely real because the phase factor e^(0) = 1.
27print(f"psi(a) = {psi[i_a]: .4f}")

Reads psi one lattice constant away. Computed: e^(iπ/2) · u(a) = i · 1.45 = 0 + 1.45i.

EXECUTION STATE
psi[i_a] = 0.0000 + 1.4500i — purely imaginary, exactly i × psi(0).
28print(f"e^(ika) * psi(0) = {phase_factor * psi[i0]: .4f}")

The Bloch-theorem prediction. We multiply the on-site value psi(0) by the phase factor e^(ika) computed above. If Bloch's theorem holds, this MUST match psi(a) line-for-line.

EXECUTION STATE
phase_factor * psi[i0] = i · (1.45 + 0i) = 0.0000 + 1.4500i ✓ identical to psi[i_a] above.
→ conclusion = The constructed wavefunction satisfies psi(x + a) = e^(ika) · psi(x) by design. Any quantum-mechanical eigenstate in a periodic potential is forced into exactly this form — that is Bloch's theorem.
29print(f"|psi(0)|^2 = {abs(psi[i0])**2: .4f}")

Probability density at x = 0. |psi(0)|^2 = 1.45^2 = 2.1025.

EXECUTION STATE
abs(psi[i0])**2 = |1.45 + 0i|^2 = 1.45^2 + 0^2 = 2.1025.
30print(f"|psi(a)|^2 = {abs(psi[i_a])**2: .4f}")

Probability density at x = a. The phase factor e^(ika) has magnitude 1, so |psi(a)|^2 = |psi(0)|^2 — the probability density is lattice-periodic, even though psi itself is not.

EXECUTION STATE
abs(psi[i_a])**2 = |0 + 1.45i|^2 = 0^2 + 1.45^2 = 2.1025 — identical to |psi(0)|^2.
→ physical takeaway = The phase of psi rotates by ka per cell, but the electron density |psi|^2 carries the full periodicity of the lattice. This is what makes electron density (not the wavefunction itself) the natural thing to plot in VASP output.
9 lines without explanation
1import numpy as np
2
3# Lattice setup: a single Bloch state in 1D
4a = 1.0           # lattice constant (arbitrary units)
5N_cells = 6
6N_per_cell = 200
7x = np.linspace(0, N_cells * a, N_cells * N_per_cell)
8
9# Cell-periodic part u(x) — must satisfy u(x + a) = u(x)
10def u_periodic(x, a, alpha=0.45):
11    G = 2 * np.pi / a
12    return 1.0 + alpha * np.cos(G * x)
13
14# Pick a wavevector inside the first Brillouin zone
15k = 0.25 * (2 * np.pi / a)   # k = pi / (2a), midway between Gamma and X
16
17# Construct the Bloch wavefunction
18psi = np.exp(1j * k * x) * u_periodic(x, a)
19
20# Verify the Bloch property: psi(x + a) = exp(ika) * psi(x)
21phase_factor = np.exp(1j * k * a)
22i0 = 0
23i_a = N_per_cell  # index corresponding to x = a
24
25print(f"psi(0)            = {psi[i0]: .4f}")
26print(f"psi(a)            = {psi[i_a]: .4f}")
27print(f"e^(ika) * psi(0)  = {phase_factor * psi[i0]: .4f}")
28print(f"|psi(0)|^2        = {abs(psi[i0])**2: .4f}")
29print(f"|psi(a)|^2        = {abs(psi[i_a])**2: .4f}")

Running this prints (rounded to 4 decimals):

psi(0) = 1.4500 + 0.0000j
psi(a) = 0.0000 + 1.4500j
e^(ika) * psi(0) = 0.0000 + 1.4500j
|psi(0)|^2 = 2.1025
|psi(a)|^2 = 2.1025

Three observations to lock in:

  1. The middle two lines match exactly. Translating ψ\psi by aa is identical to multiplying the on-site value by eikae^{ika}. This is Form I of the theorem, numerically.
  2. The last two lines are equal. The probability density ψ2|\psi|^2 is lattice-periodic — Form I forces this because eika=1|e^{ika}|=1.
  3. We never solved a Schrödinger equation. We chose a uku_k and got Bloch form for free. In a real DFT calculation, uku_k is determined by the self-consistent Kohn–Sham equation — but it is forced into this same Bloch shape by the symmetry argument we made earlier. The code is instructive precisely because it isolates the kinematics (Bloch form) from the dynamics (which uku_k is the right one).

Common Pitfalls

PitfallSymptomFix
Confusing crystal momentum with true momentumTrying to compute average velocity as ℏk/m and getting wrong answers near band edges.Use group velocity v = (1/ℏ) ∂E/∂k. True momentum requires evaluating ⟨ψ_k|p̂|ψ_k⟩, which is generally not ℏk.
Forgetting that ψ ≠ |ψ|² in periodicityPlotting Re ψ across cells and being puzzled why it does not repeat.Only |ψ|² has lattice periodicity. The wavefunction itself differs from cell to cell by a phase factor e^(ik·R).
Using k outside the BZ without foldingApparent duplicate bands or k-paths that should agree but do not.Reduce all wavevectors to the first BZ before comparing. ψ at k+G is the same physical state as ψ at k (different label, identical content).
Treating u_k as k-independentAssuming the Bloch state is a fixed periodic function modulated by an envelope; getting wrong symmetry assignments at high-symmetry points.u_k(r) generally depends on k. At Γ and at the zone boundary it can differ qualitatively (e.g. node patterns shift). Only in the free-electron toy limit is u trivially constant.
Confusing Form I sign conventionOff-by-sign Bloch phase in derivations.T̂_R ψ(r) ≡ ψ(r − R) is the standard convention here. Some texts use T̂_R ψ(r) ≡ ψ(r + R), which flips the sign of the phase factor. Pick one and be consistent.

Summary

  • A periodic potential makes lattice translations T^R\hat{T}_{\mathbf{R}} commute with the Hamiltonian. Eigenstates can therefore be chosen as joint eigenstates of H^\hat{H} and every T^R\hat{T}_{\mathbf{R}}.
  • The eigenvalues of T^R\hat{T}_{\mathbf{R}} are pure phases eikRe^{i\mathbf{k}\cdot\mathbf{R}}; the continuous label k\mathbf{k} is the crystal momentum.
  • Bloch's theorem (Form I): ψk(r+R)=eikRψk(r)\psi_{\mathbf{k}}(\mathbf{r}+\mathbf{R}) = e^{i\mathbf{k}\cdot\mathbf{R}}\psi_{\mathbf{k}}(\mathbf{r}).
  • Bloch's theorem (Form II): ψk(r)=eikruk(r)\psi_{\mathbf{k}}(\mathbf{r}) = e^{i\mathbf{k}\cdot\mathbf{r}}\,u_{\mathbf{k}}(\mathbf{r}) with uku_{\mathbf{k}} cell-periodic.
  • The probability density ψk2|\psi_{\mathbf{k}}|^2 has the full periodicity of the lattice; the wavefunction itself only repeats up to the phase eikRe^{i\mathbf{k}\cdot\mathbf{R}}.
  • k\mathbf{k} is defined modulo any reciprocal lattice vector G\mathbf{G}; the natural fundamental domain is the first Brillouin zone.
  • Fourier-expanding uku_{\mathbf{k}} on the reciprocal lattice gives ψk=Gck,Gei(k+G)r\psi_{\mathbf{k}} = \sum_{\mathbf{G}} c_{\mathbf{k},\mathbf{G}}\,e^{i(\mathbf{k}+\mathbf{G})\cdot\mathbf{r}} — the plane-wave expansion VASP uses internally. ENCUT picks the number of G\mathbf{G}; KPOINTS picks the set of k\mathbf{k}.
Section 3.5 Core Insight
"Translation symmetry forces every electronic state in a crystal into the form plane wave × periodic part. The plane wave carries the crystal momentum; the periodic part carries the atoms. Everything VASP computes lives in this single equation."
Coming next: Section 3.6 — Structure Factor and Diffraction — where we use the Fourier-on-the-reciprocal- lattice machinery developed here to compute X-ray diffraction intensities, derive the Laue condition, and predict which Bragg peaks are systematically absent for a given crystal structure.
Loading comments...