Query about transmission matrices always vanishing

Dear Sir, I am trying to reproduce the Hall conductance in a Graphene-hexagonal boron-nitride structure by using Kwant, referring to (https://arxiv.org/abs/1401.4401). The five-terminal Hall bar geometry is considered to study the Hall conductance. My problem is that the smatrix.transmission always vanishes in my code. How can I fix the problem? I pasted my KWANT code. Any suggestions will be greatly appreciated. Thanks Yinhan # Physical background #------------------------------------- # Calculate the Hofstadter's Butterfly of G-BN from __future__ import division # so that 1/2==0.5, and not 0 from math import pi, sqrt,cos,sin from cmath import exp import numpy as np import kwant #For plotting from matplotlib import pyplot #Define the graphnee lattice sin_30, cos_30=(1 / 2, sqrt(3) / 2) #Define the scale a_tb=1.0 gamma=5 L=20*gamma W=5*gamma*sqrt(3) ab=4*(pi/sqrt(3))*gamma En=0.05 graphene=kwant.lattice.general([(1, 0),(sin_30, cos_30)],\ [(0, -1/(4*cos_30)),(0, 1/(4*cos_30))]) a, b = graphene.sublattices class SimpleNamespace(object): def __init__(self, **kwargs): self.__dict__.update(kwargs) def make_system(L, W, mu_lead=2): #### Define the scattering region. ########### # slab scattering region def slab_shape(pos): (x, y)=pos return 0 <= x <= L and 0 <= y <= W # Define on-site energy def potentiala(site): (x, y)=site.pos da1=cos((-sqrt(3)*x/2+y/2)*ab)+cos(-y*ab)+\ cos((sqrt(3)*x/2+y/2)*ab) da2=sin((-sqrt(3)*x/2+y/2)*ab)+sin(-y*ab)+\ sin((sqrt(3)*x/2+y/2)*ab) return (2*pi/gamma)*(da1-sqrt(3)*da2)*En def potentialb(site): (x, y)=site.pos da1=cos((-sqrt(3)*x/2+y/2)*ab)+cos(-y*ab)+\ cos((sqrt(3)*x/2+y/2)*ab) da2=sin((-sqrt(3)*x/2+y/2)*ab)+sin(-y*ab)+\ sin((sqrt(3)*x/2+y/2)*ab) return (2*pi/gamma)*(da1+sqrt(3)*da2)*En def onsitea(site,p): return potentiala(site)-p.mu def onsiteb(site,p): return potentialb(site)-p.mu sys = kwant.Builder() sys[a.shape(slab_shape,(1,1))]=onsitea sys[b.shape(slab_shape,(1,1))]=onsiteb # specify the hoppings of the graphene lattice in the # fomat expected by builder.HoppingKind def Ax(x,y): result=-En*2*(pi/gamma)*(cos((-sqrt(3)*x/2+y/2)*ab)+\ cos((sqrt(3)*x/2+y/2)*ab)-2*cos(-y*ab)) return result def Ay(x,y): result=-En*2*sqrt(3)*(pi/gamma)*(cos((-sqrt(3)*x/2+y/2)*ab)\ -cos((sqrt(3)*x/2+y/2)*ab)) return result def hopping1(site1,site2,p): (x1,y1)=site1.pos result=(-p.t+2*Ax(x1,y1)/3)\ *exp(1j * 2 * pi * 0.4 * x1/(gamma * gamma)) return result def hopping2(site1,site2,p): (x1,y1)=site2.pos result=-p.t+Ay(x1-0.25,y1-sqrt(3)/4)/sqrt(3)\ -Ax(x1-0.25,y1-sqrt(3)/4)/3 return result def hopping3(site1,site2,p): (x1,y1)=site2.pos result=-p.t-Ay(x1+0.25,y1-sqrt(3)/4)/sqrt(3)\ -Ax(x1+0.25,y1-sqrt(3)/4)/3 return result kind1=kwant.builder.HoppingKind((0,0),a,b) sys[kind1]=hopping1 kind2=kwant.builder.HoppingKind((0,1),a,b) sys[kind2]=hopping2 kind3=kwant.builder.HoppingKind((-1,1),a,b) sys[kind3]=hopping3 #### Define the leads. #### # left lead0 sym0 = kwant.TranslationalSymmetry(graphene.vec((1, 0))) def lead0_shape(pos): x, y = pos return (W/2-2.5*gamma <= y <= W/2+2.5*gamma) def lead_hopping(site1,site2,p): return -p.t def lead_onsite(site1,p): return mu_lead lead0 = kwant.Builder(sym0) hoppings = (((0, 0), a, b), ((0, 1), a, b), ((-1, 1), a, b)) lead0[graphene.shape(lead0_shape, (0, W/2))] = lead_onsite lead0[[kwant.builder.HoppingKind(*hopping) for hopping in hoppings]] =lead_hopping #sys.attach_lead(lead0) # down lead1 sym1 = kwant.TranslationalSymmetry(graphene.vec((1, -2))) def lead1_shape(pos): x, y= pos return (L/4-2.5*gamma <= x <= L/4 + 2.5*gamma ) lead1 =kwant.Builder(sym1) lead1[graphene.shape(lead1_shape, (L/4-2.5*gamma+1,0))] = lead_onsite lead1[[kwant.builder.HoppingKind(*hopping) for hopping in hoppings]] = lead_hopping #sys.attach_lead(lead1) # right lead2 lead2=lead0.reversed() #sys.attach_lead(lead2) # right-up lead3 sym3= kwant.TranslationalSymmetry(graphene.vec((-1,2))) def lead3_shape(pos): x, y = pos return (0.75*L-2.5*gamma <= x <= 0.75*L +2.5*gamma) lead3=kwant.Builder(sym3) lead3[graphene.shape(lead3_shape,(0.75*L-2.5*gamma+1,0))] = lead_onsite lead3[[kwant.builder.HoppingKind(*hopping) for hopping in hoppings]]= lead_hopping #sys.attach_lead(lead3) # left-up lead4 lead4=lead1.reversed() #sys.attach_lead(lead4) #print("ab",ab) return sys, [lead0,lead1,lead2,lead3,lead4] def calculate_sigmas(G): # reduce by one dimension G -> G[temp, temp] temp = [0, 1, 3, 4] G = G[temp, :] G = G[:, temp] # invert R = G^-1 # find out whether it is a numpy object r = np.linalg.inv(G) # Voltages follow: V = R I[temp] V = r.dot(np.array([1, -1, 0, 0])) # Completely solved ihe six terminal system. # Consider the 2x2 conductance now: Use I = sigma U #E_x = V[1] - V[0] E_x=(V[3]-V[2]) #print("V=",V) #print("V[0]=",V[0],"V[1]=",V[1],"V[2]=",V[2],"V[3]=",V[3]) #E_x=(V[3]-V[2])/L #E_y = V[1] - V[3] E_y=V[3] #E_y=V[3]/W # formula above sigma_xx = E_x / (E_x**2 + E_y**2) sigma_xy = E_y / (E_x**2 + E_y**2) return sigma_xx, sigma_xy def plot_Hallconductance(sys,p): # Compute conductance Bs = np.linspace(0.5, 1, 10) num_leads=len(sys.leads) def G(sys, p): smatrix = kwant.smatrix(sys, args=[p]) print("trans",smatrix.transmission(0,1)) Bs = np.linspace(0.5, 1, 10) G = [[smatrix.transmission(i, j) for i in range(num_leads)] for j in range(num_leads)] print(G) G -= np.diag(np.sum(G, axis=0)) return calculate_sigmas(G) sigmasxx, sigmasxy = np.array([G(sys, p) for p.B in Bs]).T pyplot.figure() pyplot.plot(Bs,sigmasxy) pyplot.xlabel("B [t]") pyplot.ylabel("sigma_{xy} [e^2/h]") pyplot.show() def main(): t0=2/(sqrt(3)*ab) p=SimpleNamespace(t=t0, mu=0.25, B=None) sys, leads = make_system(L, W, mu_lead=2) # To highlight the two sublattices of graphene, we plot one with # a filled, and the other one with an open circle: def family_colors(site): return 0 if site.family == a else 1 # Then, plot the system with leads. #kwant.plot(sys, site_color=family_colors, site_lw=0.1, # lead_site_lw=0, colorbar=False) # Attach the leads to the system. for lead in leads: sys.attach_lead(lead) # Then, plot the system with leads. #kwant.plot(sys, site_color=family_colors, site_lw=0.1, # lead_site_lw=0, colorbar=False) # Finized the system sys=sys.finalized() # Plot conductance # Compute conductance plot_Hallconductance(sys,p) if __name__ == '__main__': main()

Dear Yinhan, The reason that you obtain 0 is because there are no modes open at the energy at which you are calculating the scattering matrix. When I take your code and plot the bandstructure for the different leads, I see that the bands are in a range of energies between 1.9 and 2.1, however you calculate the scattering matrix at 0 energy (you do not provide an explicit energy value, and the default value is 0). To solve your problem you should either select the energy that you want by providing an explicit value to `kwant.smatrix`, or modify your model so that the bands are open at 0 energy. Happy Kwanting, Joe On 2 June 2016 at 18:36, 张银寒 <zhangyinhan2008@gmail.com> wrote:
Dear Sir,
I am trying to reproduce the Hall conductance in a Graphene-hexagonal boron-nitride structure by using Kwant, referring to ( https://arxiv.org/abs/1401.4401).
The five-terminal Hall bar geometry is considered to study the Hall conductance. My problem is that the smatrix.transmission always vanishes in my code.
How can I fix the problem? I pasted my KWANT code. Any suggestions will be greatly appreciated.
Thanks
Yinhan
# Physical background #------------------------------------- # Calculate the Hofstadter's Butterfly of G-BN
from __future__ import division # so that 1/2==0.5, and not 0 from math import pi, sqrt,cos,sin from cmath import exp import numpy as np import kwant
#For plotting from matplotlib import pyplot
#Define the graphnee lattice sin_30, cos_30=(1 / 2, sqrt(3) / 2)
#Define the scale a_tb=1.0 gamma=5 L=20*gamma W=5*gamma*sqrt(3) ab=4*(pi/sqrt(3))*gamma En=0.05 graphene=kwant.lattice.general([(1, 0),(sin_30, cos_30)],\ [(0, -1/(4*cos_30)),(0, 1/(4*cos_30))])
a, b = graphene.sublattices
class SimpleNamespace(object): def __init__(self, **kwargs): self.__dict__.update(kwargs)
def make_system(L, W, mu_lead=2):
#### Define the scattering region. ########### # slab scattering region def slab_shape(pos): (x, y)=pos return 0 <= x <= L and 0 <= y <= W
# Define on-site energy def potentiala(site): (x, y)=site.pos da1=cos((-sqrt(3)*x/2+y/2)*ab)+cos(-y*ab)+\ cos((sqrt(3)*x/2+y/2)*ab) da2=sin((-sqrt(3)*x/2+y/2)*ab)+sin(-y*ab)+\ sin((sqrt(3)*x/2+y/2)*ab) return (2*pi/gamma)*(da1-sqrt(3)*da2)*En
def potentialb(site): (x, y)=site.pos da1=cos((-sqrt(3)*x/2+y/2)*ab)+cos(-y*ab)+\ cos((sqrt(3)*x/2+y/2)*ab) da2=sin((-sqrt(3)*x/2+y/2)*ab)+sin(-y*ab)+\ sin((sqrt(3)*x/2+y/2)*ab) return (2*pi/gamma)*(da1+sqrt(3)*da2)*En def onsitea(site,p): return potentiala(site)-p.mu
def onsiteb(site,p): return potentialb(site)-p.mu
sys = kwant.Builder() sys[a.shape(slab_shape,(1,1))]=onsitea sys[b.shape(slab_shape,(1,1))]=onsiteb
# specify the hoppings of the graphene lattice in the # fomat expected by builder.HoppingKind def Ax(x,y): result=-En*2*(pi/gamma)*(cos((-sqrt(3)*x/2+y/2)*ab)+\
cos((sqrt(3)*x/2+y/2)*ab)-2*cos(-y*ab))
return result
def Ay(x,y):
result=-En*2*sqrt(3)*(pi/gamma)*(cos((-sqrt(3)*x/2+y/2)*ab)\
-cos((sqrt(3)*x/2+y/2)*ab)) return result
def hopping1(site1,site2,p): (x1,y1)=site1.pos result=(-p.t+2*Ax(x1,y1)/3)\ *exp(1j * 2 * pi * 0.4 * x1/(gamma * gamma)) return result def hopping2(site1,site2,p): (x1,y1)=site2.pos result=-p.t+Ay(x1-0.25,y1-sqrt(3)/4)/sqrt(3)\ -Ax(x1-0.25,y1-sqrt(3)/4)/3 return result def hopping3(site1,site2,p): (x1,y1)=site2.pos result=-p.t-Ay(x1+0.25,y1-sqrt(3)/4)/sqrt(3)\ -Ax(x1+0.25,y1-sqrt(3)/4)/3 return result
kind1=kwant.builder.HoppingKind((0,0),a,b) sys[kind1]=hopping1 kind2=kwant.builder.HoppingKind((0,1),a,b) sys[kind2]=hopping2 kind3=kwant.builder.HoppingKind((-1,1),a,b) sys[kind3]=hopping3
#### Define the leads. #### # left lead0 sym0 = kwant.TranslationalSymmetry(graphene.vec((1, 0)))
def lead0_shape(pos): x, y = pos return (W/2-2.5*gamma <= y <= W/2+2.5*gamma) def lead_hopping(site1,site2,p): return -p.t def lead_onsite(site1,p): return mu_lead
lead0 = kwant.Builder(sym0)
hoppings = (((0, 0), a, b), ((0, 1), a, b), ((-1, 1), a, b))
lead0[graphene.shape(lead0_shape, (0, W/2))] = lead_onsite lead0[[kwant.builder.HoppingKind(*hopping) for hopping in hoppings]] =lead_hopping
#sys.attach_lead(lead0)
# down lead1
sym1 = kwant.TranslationalSymmetry(graphene.vec((1, -2)))
def lead1_shape(pos): x, y= pos return (L/4-2.5*gamma <= x <= L/4 + 2.5*gamma )
lead1 =kwant.Builder(sym1)
lead1[graphene.shape(lead1_shape, (L/4-2.5*gamma+1,0))] = lead_onsite
lead1[[kwant.builder.HoppingKind(*hopping) for hopping in hoppings]] = lead_hopping
#sys.attach_lead(lead1)
# right lead2 lead2=lead0.reversed() #sys.attach_lead(lead2)
# right-up lead3
sym3= kwant.TranslationalSymmetry(graphene.vec((-1,2))) def lead3_shape(pos): x, y = pos return (0.75*L-2.5*gamma <= x <= 0.75*L +2.5*gamma) lead3=kwant.Builder(sym3)
lead3[graphene.shape(lead3_shape,(0.75*L-2.5*gamma+1,0))] = lead_onsite lead3[[kwant.builder.HoppingKind(*hopping) for hopping in hoppings]]= lead_hopping #sys.attach_lead(lead3)
# left-up lead4 lead4=lead1.reversed() #sys.attach_lead(lead4) #print("ab",ab) return sys, [lead0,lead1,lead2,lead3,lead4]
def calculate_sigmas(G): # reduce by one dimension G -> G[temp, temp] temp = [0, 1, 3, 4] G = G[temp, :] G = G[:, temp] # invert R = G^-1 # find out whether it is a numpy object r = np.linalg.inv(G) # Voltages follow: V = R I[temp] V = r.dot(np.array([1, -1, 0, 0])) # Completely solved ihe six terminal system. # Consider the 2x2 conductance now: Use I = sigma U #E_x = V[1] - V[0] E_x=(V[3]-V[2]) #print("V=",V) #print("V[0]=",V[0],"V[1]=",V[1],"V[2]=",V[2],"V[3]=",V[3])
#E_x=(V[3]-V[2])/L #E_y = V[1] - V[3] E_y=V[3] #E_y=V[3]/W # formula above sigma_xx = E_x / (E_x**2 + E_y**2) sigma_xy = E_y / (E_x**2 + E_y**2) return sigma_xx, sigma_xy
def plot_Hallconductance(sys,p): # Compute conductance Bs = np.linspace(0.5, 1, 10) num_leads=len(sys.leads) def G(sys, p): smatrix = kwant.smatrix(sys, args=[p]) print("trans",smatrix.transmission(0,1)) Bs = np.linspace(0.5, 1, 10) G = [[smatrix.transmission(i, j) for i in range(num_leads)] for j in range(num_leads)] print(G) G -= np.diag(np.sum(G, axis=0)) return calculate_sigmas(G)
sigmasxx, sigmasxy = np.array([G(sys, p) for p.B in Bs]).T pyplot.figure() pyplot.plot(Bs,sigmasxy) pyplot.xlabel("B [t]") pyplot.ylabel("sigma_{xy} [e^2/h]") pyplot.show()
def main(): t0=2/(sqrt(3)*ab) p=SimpleNamespace(t=t0, mu=0.25, B=None) sys, leads = make_system(L, W, mu_lead=2) # To highlight the two sublattices of graphene, we plot one with # a filled, and the other one with an open circle: def family_colors(site): return 0 if site.family == a else 1
# Then, plot the system with leads. #kwant.plot(sys, site_color=family_colors, site_lw=0.1, # lead_site_lw=0, colorbar=False)
# Attach the leads to the system. for lead in leads: sys.attach_lead(lead)
# Then, plot the system with leads. #kwant.plot(sys, site_color=family_colors, site_lw=0.1, # lead_site_lw=0, colorbar=False)
# Finized the system sys=sys.finalized() # Plot conductance
# Compute conductance plot_Hallconductance(sys,p)
if __name__ == '__main__': main()
participants (2)
-
Joseph Weston
-
张银寒