Unable to find all the modes if the lattice constant changes
Problem
kwant.smatrix()
cannot find all the propagating mode if the lattice constant simply changes from 1 to, for example, 2.
a minimal working example
Hamiltonian
The Hamiltonian is the 1d semiconductor-superconductor nanowire,
Discretize H to a tight-binding model with the lattice constant a
, and define , and reduced spin-orbit coupling
Code
import numpy as np
import kwant
import tinyarray
s0 = tinyarray.array([[1, 0], [0, 1]])
sx = tinyarray.array([[0, 1], [1, 0]])
sy = tinyarray.array([[0, -1j], [1j, 0]])
sz = tinyarray.array([[1, 0], [0, -1]])
t0sx = np.kron(s0,sx)
txs0 = np.kron(sx,s0)
tzs0 = np.kron(sz,s0)
tzsy = np.kron(sz,sy)
def make_NS_junction(a=1,vz=0):
t = 25/(a*a)
alpha=5/(2*a)
delta0=0.2
mu=1
muLead=25
wireLength=300
barrierNum=2
barrierE=0
lat=kwant.lattice.chain(a,norbs=4)
junction=kwant.Builder()
for x in range(wireLength):
junction[lat(x)]=(-mu+2*t)*tzs0+delta0*txs0+vz*t0sx
junction[lat.neighbors()]=-t*tzs0-1j*alpha*tzsy
junction[(lat(x) for x in range(barrierNum))]=(2*t-mu+barrierE)*tzs0 + vz*t0sx
symLeft=kwant.TranslationalSymmetry([-a])
lead0=kwant.Builder(symLeft,conservation_law=-tzs0)
lead0[ lat(0) ] = (2*t - muLead)*tzs0 + vz*t0sx
lead0[ lat(0), lat(1) ] = -t*tzs0 - 1j*alpha*tzsy
junction.attach_lead(lead0)
junction[(lat(wireLength-x-1) for x in range(barrierNum))]=(2*t-mu+barrierE)*tzs0 + vz*t0sx
symRight=kwant.TranslationalSymmetry([a])
lead1=kwant.Builder(symRight,conservation_law=-tzs0)
lead1[ lat(0) ] = (2*t - muLead)*tzs0 + vz*t0sx
lead1[ lat(0), lat(1) ] = -t*tzs0 - 1j*alpha*tzsy
junction.attach_lead(lead1)
junction=junction.finalized()
return junction
Now use a=1, and Zeeman field Vz=0.01, we calculate the s-matrix as per,
junction1=make_NS_junction(a=1,vz=0.01)
sm1=kwant.smatrix(junction1, 0.)
The result is a 8 by 8 matrix (2 (particle-hole)* 2(spin)*2 (leads))
sm1.data.shape
(8, 8)
However, if I just change a to a=2, and keep everything else fixed, it cannot find all the modes,
junction2=make_NS_junction(a=2,vz=0.01)
sm2=kwant.smatrix(junction2, 0.)
sm2.data.shape
(4, 4)
Only two modes can be solved in each lead:
sm2.num_propagating(0),sm2.num_propagating(1)
(2, 2)
But if I change Vz=0
, it again can find 4 modes per lead,
junction3=make_NS_junction(a=2,vz=0)
sm3=kwant.smatrix(junction3, 0.)
sm3.data.shape
(8,8)
In principle, from a->2a, the wire is just doubled. I wonder why fewer modes are found in the lead?
Edited by Haining Pan