CoCalc Public Filesw4_haldane / ComputingChern.ipynb
Compute Environment: Ubuntu 18.04 (Deprecated)

Additional notes on computing Chern number

Computing the Chern number from the Berry connection $\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 $u_n({\bf k})$ are continuous.

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

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

as

$\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

$\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 $\Phi_n=i\oint_{\Gamma_n} d{\bf k}\cdot {\langle u(\bf{k})|\bf{\nabla}(|u(\bf{k})\rangle)}.$

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

$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

$\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({\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

$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 $s$ labels the band index.

What Vanderbilt and coworkers pointed out is that this expression can be written as $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 $\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)$ invariant for any unitary transformation of the $N$ 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 $n$

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

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

In [1]: