Source code for strawberrypy.example_models.kane_mele

r"""
This module contains two equivalent functions that create an instance of the `Kane-Mele
model <https://doi.org/10.1103/PhysRevLett.95.226801>`_ with PythTB or TBmodels. The Kane-Mele
model is a tight-binding model describing spinful electrons hopping on a 2D honeycomb
lattice with spin-orbit coupling and a Rashba term (breaking :math:`S_z`-symmetry). The
parameters of the model are the intensity of the diagonal spin-orbit coupling :math:`\lambda_{SO}`,
the Rashba term :math:`\lambda_{R}`. The Hamiltonian of the model reads:

.. math::

    \mathcal{H} = \Delta\sum_{i}(-1)^{\tau_i}c_{i}^{\dagger}c_{i} + t
    \sum_{\langle ij\rangle}c_i^{\dagger}c_j+i\lambda_{SO}\sum_{\langle\langle ij\rangle\rangle}
    \nu_{ij}c_i^{\dagger}\sigma_zc_j + i\lambda_R\sum_{\langle ij\rangle}c_i^{\dagger}
    (\hat{\mathbf e}_{\langle ij\rangle}\cdot\boldsymbol\sigma)c_j + \mathrm{h.c.}

where :math:`\tau_i\in\{0,1\}` is an index which distinguishes the two sublattices,
:math:`\nu_{ij}=\pm 1` accounts for the direction of the hoppings and
:math:`\hat{\mathbf e}_{\langle ij\rangle}=\hat{\mathbf d}_{\langle ij\rangle}\times\hat{\mathbf z}`
where :math:`\hat{\mathbf d}_{\langle ij\rangle}` is the unit vector in the direction from
site :math:`i` to site :math:`j`. In the Hamiltonian, the double sum on the spin indices is
implied in each term, with the convention that if no spin matrices appear, they are
contracted over the identity.
"""

import pythtb
from tbmodels import Model

import numpy as np


[docs] def kane_mele_pythtb(rashba, esite, spin_orb, ptb_version=pythtb.__version__): r""" The Kane-Mele model with PythTB. """ # From http://www.physics.rutgers.edu/pythtb/examples.html#kane-mele-model-using-spinor-features # define lattice vectors lat_cell = [[1.0, 0.0], [0.5, np.sqrt(3.0) / 2.0]] # define coordinates of orbitals orb = [[0.0, 0.0], [1.0 / 3.0, 1.0 / 3.0]] # make two dimensional tight-binding Kane-Mele model if ptb_version < "2.0.0": km_model = pythtb.tb_model(2, 2, lat_cell, orb, nspin=2) else: lat = pythtb.Lattice(lat_cell, orb, periodic_dirs=[0, 1]) km_model = pythtb.TBModel(lattice=lat, spinful=True) # set other parameters of the model thop = 1.0 rashba = rashba * spin_orb esite = esite * spin_orb # set on-site energies km_model.set_onsite([esite, -esite]) # set hoppings (one for each connected pair of orbitals) # (amplitude, i, j, [lattice vector to cell containing j]) # useful definitions sigma_x = np.array([0.0, 1.0, 0.0, 0]) sigma_y = np.array([0.0, 0.0, 1.0, 0]) sigma_z = np.array([0.0, 0.0, 0.0, 1]) # spin-independent first-neighbor hops for lvec in ([0, 0], [-1, 0], [0, -1]): km_model.set_hop(thop, 0, 1, lvec) # spin-dependent second-neighbor hops for lvec in ([1, 0], [-1, 1], [0, -1]): km_model.set_hop(1.0j * spin_orb * sigma_z, 0, 0, lvec) for lvec in ([-1, 0], [1, -1], [0, 1]): km_model.set_hop(1.0j * spin_orb * sigma_z, 1, 1, lvec) # Rashba first-neighbor hoppings: (s_x)(dy)-(s_y)(d_x) r3h = np.sqrt(3.0) / 2.0 # bond unit vectors are (r3h,half) then (0,-1) then (-r3h,half) km_model.set_hop( 1.0j * rashba * (0.5 * sigma_x - r3h * sigma_y), 0, 1, [0, 0], mode="add" ) km_model.set_hop(1.0j * rashba * (-1.0 * sigma_x), 0, 1, [0, -1], mode="add") km_model.set_hop( 1.0j * rashba * (0.5 * sigma_x + r3h * sigma_y), 0, 1, [-1, 0], mode="add" ) return km_model
[docs] def kane_mele_tbmodels(rashba, esite, spin_orb): r""" The Kane-Mele model with TBmodels. """ t_hop = 1.0 r = rashba * spin_orb e = esite * spin_orb primitive_cell = [[1.0, 0.0], [0.5, np.sqrt(3.0) / 2.0]] orb = [[0.0, 0.0], [0.0, 0.0], [1.0 / 3.0, 1.0 / 3.0], [1.0 / 3.0, 1.0 / 3.0]] # set energy on site km_model = Model(on_site=[e, e, -e, -e], dim=2, occ=2, pos=orb, uc=primitive_cell) # spin-independent first-neighbor hops for lvec in ([0, 0], [-1, 0], [0, -1]): km_model.add_hop(t_hop, 0, 2, lvec) km_model.add_hop(t_hop, 1, 3, lvec) # spin-dependent second-neighbor hops for lvec in ([1, 0], [-1, 1], [0, -1]): km_model.add_hop(1.0j * spin_orb, 0, 0, lvec) km_model.add_hop(-1.0j * spin_orb, 1, 1, lvec) for lvec in ([-1, 0], [1, -1], [0, 1]): km_model.add_hop(1.0j * spin_orb, 2, 2, lvec) km_model.add_hop(-1.0j * spin_orb, 3, 3, lvec) # Rashba first neighbor hoppings : (s_x)(dy)-(s_y)(dx) r3h = np.sqrt(3.0) / 2.0 # bond unit vectors are (r3h,half) then (0,-1) then (-r3h,half) km_model.add_hop(1.0j * r * (0.5 - 1.0j * r3h), 1, 2, [0, 0]) km_model.add_hop(1.0j * r * (0.5 + 1.0j * r3h), 0, 3, [0, 0]) km_model.add_hop(-1.0j * r, 1, 2, [0, -1]) km_model.add_hop(-1.0j * r, 0, 3, [0, -1]) km_model.add_hop(1.0j * r * (0.5 + 1.0j * r3h), 1, 2, [-1, 0]) km_model.add_hop(1.0j * r * (0.5 - 1.0j * r3h), 0, 3, [-1, 0]) return km_model