Source code for pythtb.models.fu_kane_mele

import numpy as np
from pythtb import TBModel, Lattice


[docs] def fu_kane_mele(t, soc, dt=[0, 0, 0, 0]): r"""Fu-Kane-Mele tight-binding model. This function creates a Fu-Kane-Mele tight-binding model on a diamond lattice. The lattice vectors are given by, .. math:: \mathbf{a}_1 = (0, 1, 1), \quad \mathbf{a}_2 = (1, 0, 1), \quad \mathbf{a}_3 = (1, 1, 0) and the orbital positions are given by, .. math:: \mathbf{\tau}_1 = (0, 0, 0), \quad \mathbf{\tau}_2 = \frac{1}{4} \mathbf{a}_1 + \frac{1}{4} \mathbf{a}_2 + \frac{1}{4} \mathbf{a}_3 The second-quantized Hamiltonian can be written as: .. math:: H = t \sum_{\langle ij \rangle} c_i^{\dagger} c_j + i \lambda_{SO} \sum_{\langle\langle ij \rangle\rangle} c_i^{\dagger} \vec{\sigma} \cdot (\mathbf{d}_{ij}^{1} \times \mathbf{d}_{ij}^{2}) c_j where the first term is a nearest-neighbor hopping term connecting the two fcc sublattices of the diamond lattice, and the second term is a spin-orbit coupling term connecting second-neighbor sites within the same sublattice. Here, :math:`\mathbf{d}_{ij}^{1,2}` are the two nearest-neighbor bond vectors connecting sites :math:`i` and :math:`j`. Due to inversion symmetry, each band is doubly degenerate. The degeneracy is lifted by symmetry lowering perturbations of the four nearest-neighbor hoppings :math:`t \rightarrow t + \delta t_p` with :math:`p = 1, 2, 3, 4` indexing the four bonds connected to each site. .. versionadded:: 2.0.0 Parameters ---------- t : float Spin-independent nearest-neighbor hopping amplitude. soc : float Spin-orbit coupling strength. Modulates next-nearest neighbor hopping amplitudes. dt : list[float, float, float, float], optional Offsets added to the four nearest-neighbor hoppings along the bonds connected to each site. The entries are applied in the following order: - `dt[0]` : bond along ``R = [0, 0, 0]`` - `dt[1]` : bond along ``R = [-1, 0, 0]`` - `dt[2]` : bond along ``R = [0, -1, 0]`` - `dt[3]` : bond along ``R = [0, 0, -1]`` The default is ``[0, 0, 0, 0]``, which corresponds to uniform hopping amplitudes. This parameter allows for symmetry-lowering perturbations to the nearest-neighbor hoppings. Returns ------- TBModel An instance of the model. Notes ----- - The Fu-Kane-Mele model describes a three-dimensional topological insulator with a non-trivial band structure. It is characterized by a strong :math:`\mathbb{Z}_2` invariant and exhibits surface Dirac cones that are protected by time-reversal and inversion symmetry [1]_. References ---------- .. [1] \ L. Fu, C. L. Kane, and E. J. Mele, *Phys. Rev. Lett.*, **98**, 106803 (2007). """ lat_vecs = [[0, 1, 1], [1, 0, 1], [1, 1, 0]] orb_vecs = [[0, 0, 0], [0.25, 0.25, 0.25]] lat = Lattice(lat_vecs, orb_vecs, periodic_dirs=[0, 1, 2]) model = TBModel(lattice=lat, spinful=True) # spin-independent first-neighbor hops for idx, lvec in enumerate([[0, 0, 0], [-1, 0, 0], [0, -1, 0], [0, 0, -1]]): model.set_hop(t + dt[idx], 0, 1, lvec) # spin-dependent second-neighbor hops lvec_list = ([1, 0, 0], [0, 1, 0], [0, 0, 1], [-1, 1, 0], [0, -1, 1], [1, 0, -1]) dir_list = ([0, 1, -1], [-1, 0, 1], [1, -1, 0], [1, 1, 0], [0, 1, 1], [1, 0, 1]) for j in range(6): spin = np.array([0.0] + dir_list[j]) model.set_hop(1j * soc * spin, 0, 0, lvec_list[j]) model.set_hop(-1j * soc * spin, 1, 1, lvec_list[j]) return model