|
21 | 21 | "\n",
|
22 | 22 | "def haldane(w=20, boundary='zigzag'):\n",
|
23 | 23 | " def ribbon_shape_zigzag(pos):\n",
|
24 |
| - " fac = np.sqrt(3) / 2\n", |
25 |
| - " (x, y) = pos\n", |
26 |
| - " return (-0.5 / np.sqrt(3) - 0.1 <= y < fac * w + 0.01)\n", |
| 24 | + " return (-0.5 / np.sqrt(3) - 0.1 <= pos[1] < np.sqrt(3) * w / 2 + 0.01)\n", |
27 | 25 | "\n",
|
28 | 26 | " def ribbon_shape_armchair(pos):\n",
|
29 |
| - " fac = np.sqrt(3) / 2\n", |
30 |
| - " (x, y) = pos\n", |
31 |
| - " return (-1 <= x < w)\n", |
| 27 | + " return (-1 <= pos[0] < w)\n", |
32 | 28 | "\n",
|
33 | 29 | " def onsite(site, p):\n",
|
34 | 30 | " if site.family == a:\n",
|
|
84 | 80 | "\n",
|
85 | 81 | "\n",
|
86 | 82 | "def berry_curvature(sys, p, ks, num_filled_bands=1):\n",
|
| 83 | + " \"\"\"Berry curvature of a system.\n", |
| 84 | + " \n", |
| 85 | + " Parameters:\n", |
| 86 | + " -----------\n", |
| 87 | + " sys : kwant.Builder\n", |
| 88 | + " A 2D infinite system.\n", |
| 89 | + " p : SimpleNamespace\n", |
| 90 | + " The arguments expected by the system.\n", |
| 91 | + " ks : 1D array-like\n", |
| 92 | + " Values of momentum grid to be used for Berry curvature calculation.\n", |
| 93 | + " num_filled_bands : int\n", |
| 94 | + " The number of filled bands.\n", |
| 95 | + "\n", |
| 96 | + " Returns:\n", |
| 97 | + " --------\n", |
| 98 | + " bc : 2D array\n", |
| 99 | + " Berry curvature on each square in a `ks x ks` grid.\n", |
| 100 | + " \"\"\"\n", |
| 101 | + " # Calculate an array of eigenvectors.\n", |
87 | 102 | " B = np.array(sys.symmetry.periods).T\n",
|
88 | 103 | " A = B.dot(np.linalg.inv(B.T.dot(B)))\n",
|
89 | 104 | "\n",
|
|
97 | 112 | " \n",
|
98 | 113 | " vectors = np.array([[energy(kx, ky)[:, :num_filled_bands] for kx in ks] for ky in ks])\n",
|
99 | 114 | " \n",
|
| 115 | + " # The actual Berry curvature calculation\n", |
100 | 116 | " vectors_x = np.roll(vectors, 1, 0)\n",
|
101 | 117 | " vectors_xy = np.roll(vectors_x, 1, 1)\n",
|
102 | 118 | " vectors_y = np.roll(vectors, 1, 1)\n",
|
|
269 | 285 | "source": [
|
270 | 286 | "It's important to note that time-reversal symmetry sends $\\mathbf{K}$ into $\\mathbf{K}'$ and therefore it exchanges the two Dirac cones.\n",
|
271 | 287 | "\n",
|
272 |
| - "The product of (approximate) sublattice and time-reversal symmetries yields a further discrete symmetry - a particle-hole symmetry, $\\sigma_z H^*(-\\mathbf{k})\\,\\sigma_z = -H_0(\\mathbf{k})$." |
| 288 | + "The product of (approximate) sublattice and time-reversal symmetries yields a further discrete symmetry, a particle-hole symmetry $\\sigma_z H^*(-\\mathbf{k})\\,\\sigma_z = -H_0(\\mathbf{k})$." |
273 | 289 | ]
|
274 | 290 | },
|
275 | 291 | {
|
|
329 | 345 | "* they are purely imaginary and, furthermore, they all have the same chirality, in the sense that they all follow the orientation of your right hand, if the thumb points out from the screen.\n",
|
330 | 346 | "* they couple sites of same type: $A$ with $A$ and $B$ with $B$.\n",
|
331 | 347 | "\n",
|
332 |
| - "These characteristics tell us that in this way we break both time-reversal symmetry and sublattice symmetry. In fact, the full Hamiltonian becomes\n", |
| 348 | + "These characteristics tell us that the new hoppings break both time-reversal symmetry and sublattice symmetry. Now the full Hamiltonian becomes\n", |
333 | 349 | "\n",
|
334 | 350 | "$$\n",
|
335 | 351 | "H(\\mathbf{k}) = H_0(\\mathbf{k})+ M\\sigma_z + 2t_2\\sum_i\\,\\sigma_z\\,\\sin(\\mathbf{k}\\cdot\\mathbf{b}_i)\\,.\n",
|
|
450 | 466 | "\n",
|
451 | 467 | "Our pumping argument involved putting our system on a cylinder and adiabatically pumping a magnetic flux $\\Phi$ through the cylinder so that the Hamiltonian returns to itself. The flux enters the Hamiltonian through minimal substitution as $H(\\mathbf{k})\\rightarrow H(\\mathbf{k}+e\\mathbf{A})$ where ${\\bf A}=\\hat{\\mathbf{y}}\\,\\Phi/L$.\n",
|
452 | 468 | "\n",
|
453 |
| - "Thus we can understand the effects of flux pumping on the Hamiltonian in terms of a change in momentum. When the flux is changed by the appropriate number of quanta, the momentum $\\mathbf{k}$ changes by a reciprocal lattice vector and, hence the Bloch Hamiltonian returns to its original value. To simplify the discussion, in the following we will use a square Brillouin zone, with $k_x$ and $k_y$ defined in an interval $[0, 2\\pi]$ - all our arguments also apply for the hexagonal Brillouin zone of graphene." |
| 469 | + "Thus we can understand the effects of flux pumping on the Hamiltonian in terms of a change in momentum. When the flux is changed by the appropriate number of quanta, the momentum $\\mathbf{k}$ changes by a reciprocal lattice vector and, hence the Bloch Hamiltonian returns to its original value. To simplify the discussion, in the following we will use a square Brillouin zone, with $k_x$ and $k_y$ defined in an interval $[0, 2\\pi]$, but all our arguments also apply for the hexagonal Brillouin zone of graphene." |
454 | 470 | ]
|
455 | 471 | },
|
456 | 472 | {
|
457 | 473 | "cell_type": "markdown",
|
458 | 474 | "metadata": {},
|
459 | 475 | "source": [
|
460 |
| - "Let's now consider the adiabatic time-evolution of an eigenstate $\\left|\\psi(\\mathbf{k})\\right\\rangle$ of this Hamiltonian, with energy $E(\\mathbf{k})$, as $\\mathbf{k}$ is changed slowly. Suppose the Hamiltonian is such that $\\left|\\psi(\\mathbf{k})\\right\\rangle$ remains non-degenerate as in the case of the Haldane model. We can then adiabatically explore an energy band by moving $\\mathbf{k}$, without the risk of encountering a level crossing. After a while, let's say a time $T$, we bring $\\mathbf{k}$ back to its initial value after going around the entire Brillouin Zone. For instance, we can consider the following closed path $C$, where $k_y$ changes by $2\\pi$ at a fixed $k_x$, starting from $k_y=0$:\n", |
| 476 | + "Let's imagine the adiabatic time-evolution of an eigenstate $\\left|\\psi(\\mathbf{k})\\right\\rangle$ of this Hamiltonian, with energy $E(\\mathbf{k})$, as $\\mathbf{k}$ is changed slowly. Suppose the Hamiltonian is such that $\\left|\\psi(\\mathbf{k})\\right\\rangle$ remains non-degenerate as in the case of the Haldane model. We can then adiabatically explore an energy band by moving $\\mathbf{k}$, without the risk of encountering a level crossing. After a while, let's say a time $T$, we bring $\\mathbf{k}$ back to its initial value after going around the entire Brillouin Zone. For instance, we can consider the following closed path $C$, where $k_y$ changes by $2\\pi$ at a fixed $k_x$, starting from $k_y=0$:\n", |
461 | 477 | "\n",
|
462 | 478 | "\n",
|
463 | 479 | "\n",
|
|
481 | 497 | "cell_type": "markdown",
|
482 | 498 | "metadata": {},
|
483 | 499 | "source": [
|
484 |
| - "We have made explicit the fact that $\\gamma$ in our case may depend on $k_x$. We will not derive the formula for the Berry phase, something which can be done directly from the Schrödinger equation, see for instance [here](http://arxiv.org/abs/0907.2021). What is important to know about $\\gamma$ is that it is a **geometric phase**: its value depends on the path $C$ but not on how the path is performed in time, that is on the particular expression for $\\mathbf{k}(t)$. We'll soon see that sometimes it can have an even stronger, topological character. " |
| 500 | + "We have made explicit the fact that $\\gamma$ in our case may depend on $k_x$. We will not derive the formula for the Berry phase, something which can be done directly from the Schrödinger equation, see for instance [here](http://arxiv.org/abs/0907.2021). What is important to know about $\\gamma$ is that it is a **geometric phase**: its value depends on the path $C$ but not on how the path is performed in time, so not on the particular expression for $\\mathbf{k}(t)$. We'll soon see that sometimes it can have an even stronger, topological character. " |
485 | 501 | ]
|
486 | 502 | },
|
487 | 503 | {
|
|
490 | 506 | "source": [
|
491 | 507 | "## Flux pumping\n",
|
492 | 508 | "\n",
|
493 |
| - "The phase $\\gamma(k_x)$ must bear information about the charge pumped during an adiabatic cycle over $k_y$. Now we take advantage of the fact that the pumped charge is invariant as long as the energy gap is preserved. This means that we have the freedom to change the energy dispersion $E(k_x,k_y)$ arbitrarily, as long as we do not close the gap.\n", |
| 509 | + "The phase $\\gamma(k_x)$ must bear information about the charge pumped during an adiabatic cycle over $k_y$. Now we take advantage of pumped charge being invariant as long as the energy gap is preserved. This means that we have the freedom to change the energy dispersion $E(k_x,k_y)$ arbitrarily, as long as we do not close the gap.\n", |
494 | 510 | "\n",
|
495 | 511 | "It is convenient to make the energy dispersion completely flat along the $k_x$ direction for $k_y=0$, analogous to the case of Landau levels. In this way, since at fixed $k_y$ all the wave functions have the same energy, we can choose our initial quantum state to be localized in a single unit cell in the $x$ direction,\n",
|
496 | 512 | "\n",
|
|
0 commit comments