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.
"""

from pythtb import tb_model
from tbmodels import Model

import numpy as np

[docs] def kane_mele_pythtb(rashba, esite, spin_orb): # From http://www.physics.rutgers.edu/pythtb/examples.html#kane-mele-model-using-spinor-features # define lattice vectors lat=[[1.0,0.0],[0.5,np.sqrt(3.0)/2.0]] # define coordinates of orbitals orb=[[0.0,0.0],[1./3.,1./3.]] # make two dimensional tight-binding Kane-Mele model km_model=tb_model(2,2,lat,orb,nspin=2) # 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.,1.,0.,0]) sigma_y=np.array([0.,0.,1.,0]) sigma_z=np.array([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.j*spin_orb*sigma_z, 0, 0, lvec) for lvec in ([-1, 0], [ 1,-1], [ 0, 1]): km_model.set_hop(1.j*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.j*rashba*( 0.5*sigma_x-r3h*sigma_y), 0, 1, [ 0, 0], mode="add") km_model.set_hop(1.j*rashba*(-1.0*sigma_x ), 0, 1, [ 0,-1], mode="add") km_model.set_hop(1.j*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): 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./3.,1./3.],[1./3.,1./3.]] #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.j*spin_orb, 0,0,lvec) km_model.add_hop(-1.j*spin_orb, 1,1,lvec) for lvec in ([-1,0],[1,-1],[0,1]): km_model.add_hop(1.j*spin_orb,2,2,lvec) km_model.add_hop(-1.j*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.j*r*(0.5-1.j*r3h), 1, 2, [ 0, 0]) km_model.add_hop(1.j*r*(0.5+1.j*r3h), 0, 3, [ 0, 0]) km_model.add_hop(-1.j*r, 1, 2, [ 0, -1]) km_model.add_hop(-1.j*r, 0, 3, [ 0, -1]) km_model.add_hop(1.j*r*(0.5+1.j*r3h), 1, 2, [ -1, 0]) km_model.add_hop(1.j*r*(0.5-1.j*r3h), 0, 3, [ -1, 0]) return km_model