{
"cells": [
{
"cell_type": "markdown",
"id": "e8684d75",
"metadata": {},
"source": [
"# Additional notes on computing Chern number\n",
"\n",
"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.\n",
"\n",
"On the other hand, the Chern number is really the integral of the Berry curvature\n",
"\n",
"$$\n",
"{\\bf{b}(k)}={\\bf\\nabla\\times a(k)}\n",
"$$\n",
"\n",
"as\n",
"\n",
"$$\n",
"\\Phi=\\oint d^2\\bf{k}\\bf{z}\\cdot \\bf{b}(\\bf{k}).\n",
"$$\n",
"\n",
"Numerically it is more convenient to compute the integral $\\Phi$ by breaking them down into small plaquettes. So that\n",
"\n",
"$$\n",
"\\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)},\n",
"$$\n",
"\n",
"is broken down into chunks\n",
"\n",
"$$\n",
"\\Phi_n=i\\oint_{\\Gamma_n} d{\\bf k}\\cdot {\\langle u(\\bf{k})|\\bf{\\nabla}(|u(\\bf{k})\\rangle)}.\n",
"$$\n",
"\n",
"For sufficiently small chunks $\\Phi_n$ is small and one can get away with computing the exponential\n",
"\n",
"$$\n",
"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.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "188b92df",
"metadata": {},
"source": [
"The flux on the small plaquette can be computed as\n",
"\n",
"$$\n",
"\\Phi_n=\\textrm{Arg}(\\prod_p \\langle u({\\bf k}_{n,p})|u({\\bf k}_{n,p+1})\\rangle).\n",
"$$\n",
"\n",
"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$.\n",
"\n",
"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\n",
"\n",
"$$\n",
"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],\n",
"$$\n",
"\n",
"where $s$ labels the band index.\n",
"\n",
"What Vanderbilt and coworkers pointed out is that this expression can be written as\n",
"\n",
"$$\n",
"e^{i\\Phi_n}=\\prod_p Det[\\langle u_s(\\bf{k}_{n,p})|u_{s'}(\\bf{k}_{n,p+1})\\rangle],\n",
"$$\n",
"\n",
"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.\n",
"\n",
"The main advantage of this expression is that it is actually $U(N)$ invariant for any unitary transformation of the $N$ occupied eigenstates.\n",
"\n",
"## Final recipe\n",
"\n",
"So the final recipe to compute the Chern number is as follows:\n",
"\n",
"* grid up the BZ into small plaquettes labelled by $n$\n",
"\n",
"* Compute the flux through each plaquette\n",
"\n",
"$$\n",
"\\Phi_n=Arg[\\prod_p Det[\\langle u_s(\\bf{k}_{n,p})|u_{s'}(\\bf{k}_{n,p+1})\\rangle]],\n",
"$$\n",
"\n",
"where ${\\bf k}_{n,p}$ are momenta on the corners of the lattice.\n",
"\n",
"* The Chern number is calculated as\n",
"\n",
"$$\n",
"\\nu=(2\\pi)^{-1}\\sum_n \\Phi_n.\n",
"$$"
]
}
],
"metadata": {
"jupytext": {
"text_representation": {
"extension": ".md",
"format_name": "myst",
"format_version": 0.13,
"jupytext_version": "1.11.4"
}
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.6"
},
"source_map": [
12,
49
]
},
"nbformat": 4,
"nbformat_minor": 5
}