Source code for pythtb.models.haldane

from pythtb import TBModel, Lattice
import numpy as np


[docs] def haldane(delta: float, t1: float, t2: float, phi: float = np.pi / 2) -> TBModel: r"""Haldane tight-binding model. .. versionadded:: 2.0.0 This function creates a Haldane tight-binding model with the specified hopping parameters and on-site energy. The model is defined on a 2D honeycomb lattice with two sublattices. The lattice vectors are given by, .. math:: \mathbf{a}_1 = (1, 0), \quad \mathbf{a}_2 = \left(\frac{1}{2}, \frac{\sqrt{3}}{2}\right) and the orbital positions are given by, .. math:: \mathbf{\tau}_1 = \frac{1}{3} \mathbf{a}_1 + \frac{1}{3} \mathbf{a}_2, \quad \mathbf{\tau}_2 = \frac{2}{3} \mathbf{a}_1 + \frac{2}{3} \mathbf{a}_2 The second-quantized Hamiltonian can be written as: .. math:: H = \Delta \sum_i (-)^i c_i^\dagger c_i + t_1 \sum_{\langle i,j \rangle} (c_i^\dagger c_j + \text{h.c.}) + t_2 \sum_{\langle\langle i,j \rangle\rangle} (ic_i^\dagger c_j + \text{h.c.}) Parameters ---------- delta : float Onsite mass term. Opposite sign for the two sublattices. t1 : float Nearest neighbor hopping amplitude. t2 : float Next-nearest neighbor hopping amplitude. Peierls phase is included. Returns ------- TBModel An instance of the model. Notes ----- The Haldane model describes a two-dimensional topological insulator with a non-trivial band structure. It is characterized by a finite Chern number and exhibits edge states that are protected by time-reversal symmetry [haldane]_. References ---------- .. [haldane] Haldane, F. D. M. (1988). O(3) Nonlinear :math:`\sigma` Model and the Quantum Hall Effect in Two Dimensions. *Physical Review Letters*, 61(20), 2015–2018. """ lat_vecs = [[1, 0], [1 / 2, np.sqrt(3) / 2]] orb_vecs = [[1 / 3, 1 / 3], [2 / 3, 2 / 3]] lat = Lattice(lat_vecs, orb_vecs, periodic_dirs=[0, 1]) model = TBModel(lattice=lat, spinful=False) model.set_onsite([-delta, delta], mode="set") for lvec in ([0, 0], [-1, 0], [0, -1]): model.set_hop(t1, 0, 1, lvec, mode="set") for lvec in ([1, 0], [-1, 1], [0, -1]): model.set_hop(t2 * np.exp(1j * phi), 0, 0, lvec, mode="set") for lvec in ([-1, 0], [1, -1], [0, 1]): model.set_hop(t2 * np.exp(1j * phi), 1, 1, lvec, mode="set") return model