CoCalc Public Filesw4_haldane / ComputingChern.ipynbOpen with one click!
Authors: Irfan , Anton Akhmerov, Bas Nijholt, Tomas Rosdahl, Jay Sau, Bernard van Heck
Compute Environment: Ubuntu 18.04 (Deprecated)

Additional notes on computing Chern number

Computing the Chern number from the Berry connection a(k)=iu(k)(u(k))\bf{a}(\bf {k})=i\langle u(\bf{k})|\bf{\nabla}(|u(\bf{k})\rangle) is annoying because one needs to find a gauge where the Bloch wave-functions un(k)u_n({\bf k}) are continuous.

On the other hand, the Chern number is really the integral of the Berry curvature

b(k)=×a(k){\bf{b}(k)}={\bf\nabla\times a(k)}

as

Φ=d2kzb(k).\Phi=\oint d^2\bf{k}\bf{z}\cdot \bf{b}(\bf{k}).

Numerically it is more convenient to compute the integral Φ\Phi by breaking them down into small plaquettes. So that

Φ=nΓnd2kzb(k)=nΓndka(k),\Phi=\sum_n \oint_{\Gamma_n} d^2\bf{k}\bf{z}\cdot \bf{b}(\bf{k})=\sum_n \oint_{\Gamma_n} d{\bf k}\cdot {\bf a(k)}, is broken down into chunks Φn=iΓndku(k)(u(k)).\Phi_n=i\oint_{\Gamma_n} d{\bf k}\cdot {\langle u(\bf{k})|\bf{\nabla}(|u(\bf{k})\rangle)}.

For sufficiently small chunks Φn\Phi_n is small and one can get away with computing the exponential

eiΦn=eΓndku(k)(u(k))=peδkn,pu(kn,p)(u(kn,p))p(1+δkn,pu(kn,p)(u(kn,p))pu(kn,p)u(kn,p+1).e^{i\Phi_n}=e^{\oint_{\Gamma_n} d{\bf k}\cdot {\langle u(\bf{k})|\bf{\nabla}(|u(\bf{k})\rangle)}}=\prod_p e^{\delta{\bf k}_{n,p}\cdot {\langle u(\bf{k}_{n,p})|\bf{\nabla}(|u(\bf{k}_{n,p})\rangle)}}\approx \prod_p (1+\delta k_{n,p}\langle u(\bf{k}_{n,p})|\bf{\nabla}(|u(\bf{k}_{n,p})\rangle)\approx \prod_p \langle u(\bf{k}_{n,p})|u(\bf{k}_{n,p+1})\rangle.

The flux on the small plaquette can be computed as

Φn=Arg(pu(kn,p)u(kn,p+1)).\Phi_n=\textrm{Arg}(\prod_p \langle u({\bf k}_{n,p})|u({\bf k}_{n,p+1})\rangle).

What is nice about this product is that it is gauge invariant as can be checked by multiplying each wave-function u(kn,p)eiφ(kn,p)u(kn,p)|u({\bf k}_{n,p})\rangle\rightarrow e^{i\varphi({\bf k}_{n,p})}|u({\bf k}_{n,p})\rangle.

The nice thing about this expression is that one can also generalize this to multiband systems to calculate the total Chern number so that the contribution from each plaquette

eiΦnpsus(kn,p)us(kn,p+1)=pDet[us(kn,p)us(kn,p+1)],e^{i\Phi_n}\approx \prod_p\prod_s \langle u_s(\bf{k}_{n,p})|u_s(\bf{k}_{n,p+1})\rangle=\prod_p Det[\langle u_s(\bf{k}_{n,p})|u_s(\bf{k}_{n,p+1})\rangle], where ss labels the band index.

What Vanderbilt and coworkers pointed out is that this expression can be written as eiΦn=pDet[us(kn,p)us(kn,p+1)],e^{i\Phi_n}=\prod_p Det[\langle u_s(\bf{k}_{n,p})|u_{s'}(\bf{k}_{n,p+1})\rangle], is related to determinants of a bunch of matrices us(kn,p)us(kn,p+1)\langle u_s(\bf{k}_{n,p})|u_{s'}(\bf{k}_{n,p+1})\rangle, which in the diagonal basis of eigenstates is nearly diagonal, which takes us back to the previous expression.

The main advantage of this expression is that it is actually U(N)U(N) invariant for any unitary transformation of the NN occupied eigenstates.

Final recipe

So the final recipe to compute the Chern number is as follows:

  • grid up the BZ into small plaquettes labelled by nn

  • Compute the flux through each plaquette Φn=Arg[pDet[us(kn,p)us(kn,p+1)]],\Phi_n=Arg[\prod_p Det[\langle u_s(\bf{k}_{n,p})|u_{s'}(\bf{k}_{n,p+1})\rangle]], where kn,p{\bf k}_{n,p} are momenta on the corners of the lattice.

  • The Chern number is calculated as ν=(2π)1nΦn.\nu=(2\pi)^{-1}\sum_n \Phi_n.

In [1]: