Hi all,

I am somewhat new to Kwant and am trying to achieve the following:
I have a 2D 3-band continuum model that I want to see edge states of using band 
and density diagrams via a 1D real-space strip. I make the system finite in the 
x direction (implying translational symmetry in the y direction, making k_y a 
good quantum number and so constant). I setup the domain wall by choosing 
between two values for a potential, dependent on whether the site is before 
length/2 or after. I use kwant.continuum.discretize() for builder().

However, I am having trouble with the setup in general. For one, I cannot seem 
to apply translational symmetry to builder() because I am not sure what vector 
to use (I tried (0,1) and (1,0)), but to no avail. Second, if I proceed without 
translational symmetry, kwant.plotter.bands(syst, show=False) gives me 
"TypeError: Expecting an instance of InfiniteSystem." When I browsed the email 
archives, people suggested syst.leads[0], etc: but the issue is that I don't 
have these leads explicitly and that gives me an error. My understanding is 
that I can get a proper band diagram showing edge states if I plot eigenvalues 
from looping through different values of k_y that I fixed earlier. However, I 
don't think I saw examples of the Kwant examples doing it this way. 

So, it seems as if I have confused some basic applications in Kwant. Would 
someone mind clarifying my confusions for me? All I want to see is the a 
typical band structure diagram for this 3-band continuum model in a domain wall 
setup. Following is my code (I know that the given Hamiltonian will not give 
edge states, but I just want to get the code working for starters). Thank you 
for your time!


# Minimal example
import kwant.continuum
import kwant
import numpy as np
import matplotlib.pyplot as plt 
import tinyarray 
import scipy

lat_const = 3.19 # lattice constant

hami = """
[[2* t0 * 
((1-(2*((1/2)*k_x*a))**2/2)+2*(1-(((1/2)*k_x*a))**2/2)*(1-((momentumY*a*sqrt(3)/2))**2/2))+e1,
 
  M1(x,y)-2*sqrt(3)*t2*(((1/2)*k_x*a))*((momentumY*a*sqrt(3)/2)) + 
2*1j*t1*((2*((1/2)*k_x*a)) + 
(((1/2)*k_x*a))*(1-((momentumY*a*sqrt(3)/2))**2/2)), 
  2*t2*((1-(2*((1/2)*k_x*a))**2/2) - 
(1-(((1/2)*k_x*a))**2/2)*(1-((momentumY*a*sqrt(3)/2))**2/2)) + 
2*sqrt(3)*1j*t1*(1-(((1/2)*k_x*a))**2/2)*((momentumY*a*sqrt(3)/2))],
    [-M1(x,y)-2*sqrt(3)*t2*(((1/2)*k_x*a))*((momentumY*a*sqrt(3)/2)) - 
2*1j*t1*((2*((1/2)*k_x*a)) + 
(((1/2)*k_x*a))*(1-((momentumY*a*sqrt(3)/2))**2/2)), 
     2*t11*(1-(2*((1/2)*k_x*a))**2/2) + 
(t11+3*t22)*(1-(((1/2)*k_x*a))**2/2)*(1-((momentumY*a*sqrt(3)/2))**2/2)+e2, 
      
-M2(x,y)+sqrt(3)*(t22-t11)*(((1/2)*k_x*a))*((momentumY*a*sqrt(3)/2))+4*1j*t12*(((1/2)*k_x*a))*((1-(((1/2)*k_x*a))**2/2)-(1-((momentumY*a*sqrt(3)/2))**2/2))],
    [2*t2*((1-(2*((1/2)*k_x*a))**2/2) - 
(1-(((1/2)*k_x*a))**2/2)*(1-((momentumY*a*sqrt(3)/2))**2/2)) - 
2*sqrt(3)*1j*t1*(1-(((1/2)*k_x*a))**2/2)*((momentumY*a*sqrt(3)/2)), 
     
M2(x,y)+sqrt(3)*(t22-t11)*(((1/2)*k_x*a))*((momentumY*a*sqrt(3)/2))-4*1j*t12*(((1/2)*k_x*a))*((1-(((1/2)*k_x*a))**2/2)-(1-((momentumY*a*sqrt(3)/2))**2/2)),
 
     2*t22*(1-(2*((1/2)*k_x*a))**2/2) + (3*t11+ 
t22)*(1-(((1/2)*k_x*a))**2/2)*(1-((momentumY*a*sqrt(3)/2))**2/2)+e2]]
"""  

template = kwant.continuum.discretize(hami, grid = lat_const)
#print(template)

L = 100
def wire_shape(site):
    (x, ) = site.pos
    return (0<=x<L)

val1 = 10.07822923*1j
val2 = 12.42088476*1j

def pot1(x,y=0):
    return[0,val1][x<L/2]

def pot2(x,y=0):
    return[0,val2][x<L/2]

syst = kwant.Builder();
syst.fill(template, wire_shape,(0,));
syst = syst.finalized();

def get_ham(momY):
    ham = syst.hamiltonian_submatrix(params=dict(M1=pot1,M2=pot2, momentumY = 
momY, y=0, a = 3.19, e1 = 1.046, e2 =  2.104, t0 = -0.184, t1 = 0.401, t2 = 
0.507, t11 =  0.218, t12 = 0.338, t22 =  0.057),sparse = False)
    return ham
    #plt.spy(ham) #block off-diagonal
    #plt.show()

# Band structure diagram???
# different momentumY's to iterate over
v1=-2*np.pi; v2=2*np.pi; v_segs=10;
vary_range = np.linspace(v1, v2, num=v_segs) # np.linspace(kx0_1, kx0_2, 
num=kx_segs, retstep=True)

plt.figure()
for i in range(v_segs):
    ham = get_ham(vary_range[i])
    ev,evecs = scipy.linalg.eigh(ham)
    plt.plot(ev) # plot eigenvalues
plt.show()

# Wavefunction density diagram??? Should show peak at edge states, if there are 
any.
plt.figure()
for i in range(v_segs):
    ham = get_ham(vary_range[i])
    ev,evecs = scipy.linalg.eigh(ham)
    wavefunction = evecs[:, len(ham)-1]
    up,middle,down = wavefunction[::3],wavefunction[1::3],wavefunction[2::3]
    density = np.abs(up)**2 + np.abs(middle)**2 + np.abs(down)**2
    plt.plot(density)
    ##kwant.plotter.map(syst, density, show=False)
plt.show()

Best,
Tharindu

Reply via email to