Dispersion Plot of SSH Model with Linearly Varying Chemical Potential

Hi Kwant Users ! I was trying to plot the band structure of the ssh model with linearly varying chemical potential (\mu*x). But it is showing error that "*Expecting an arraylike object or a scalar*" while adding this potential term. Can anyone please tell where I am making mistake and how to rectify it ? _____________________________________ Code is attached below :- import kwant import numpy as np import math ## import matplotlib #matplotlib.use('Agg') ## # For plotting from matplotlib import pyplot as plt # For matrix support import tinyarray I2 = 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]]) Sp = tinyarray.array([[0,2], [0,0]]) Sm = tinyarray.array([[0,0], [2,0]]) def create_system(length=10): t1 = 0.5 ; t2 = 1.0 ; def Onsite(site): (x, ) = site.pos potential = x return x # system building lat = kwant.lattice.square(a=1, norbs=2) syst = kwant.Builder() # central scattering region syst[(lat(x, 0) for x in range(length))] = t1*Sx syst[lat.neighbors()] = (t2*Sx - 1j*t2*Sy)/2 # add leads sym = kwant.TranslationalSymmetry((-1, 0)) lead_left = kwant.Builder(sym) lead_left[lat(0, 0)] = t1*Sx + Onsite*I2 lead_left[lat.neighbors()] = (t2*Sx - 1j*t2*Sy)/2 syst.attach_lead(lead_left) syst.attach_lead(lead_left.reversed()) return syst def main(): # parameters # create system syst = create_system(length=10).finalized() # plot the system and dispersion kwant.plot(syst) kwant.plotter.bands(syst.leads[0], show=False) plt.plot([-np.pi, np.pi], [chemical_potential, chemical_potential], 'k--') plt.show() lead = syst.leads[0] bands = kwant.physics.Bands(lead) momenta = np.linspace(-2*np.pi, 2*np.pi, 401) energies = [bands(k) for k in momenta] plt.plot(momenta, energies,linestyle='--') plt.xlim(-2*np.pi, 2*np.pi) #pyplot.ylim(-5, 5) plt.xlabel("$k$") plt.ylabel("Energy") #pyplot.axhline(y=0.0, color='k', linestyle='-') plt.tight_layout() plt.grid() plt.show() plt.close() if __name__ == '__main__': main() ________________________________________________ Thanks in advance, *_________________________________* *Subhadeep Chakraborty* *_________________________________*

Dear Subhadeep, You can not mix scalars and functions when you define the onsite potential. Put everything in the function: def Onsite(site): x,_ = site.pos return t1*Sx + x*I2 lead_left[lat(0, 0)] = Onsite Define your chemical potential: chemical_potential. With these modifications, it will work. I hope this helps, Adel On Mon, Jun 27, 2022 at 5:43 PM Subhadeep Chakraborty < sc20rs001@iiserkol.ac.in> wrote:
Hi Kwant Users !
I was trying to plot the band structure of the ssh model with linearly varying chemical potential (\mu*x). But it is showing error that "*Expecting an arraylike object or a scalar*" while adding this potential term. Can anyone please tell where I am making mistake and how to rectify it ? _____________________________________ Code is attached below :-
import kwant import numpy as np import math ## import matplotlib #matplotlib.use('Agg') ##
# For plotting from matplotlib import pyplot as plt
# For matrix support import tinyarray
I2 = 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]])
Sp = tinyarray.array([[0,2], [0,0]]) Sm = tinyarray.array([[0,0], [2,0]])
def create_system(length=10):
t1 = 0.5 ; t2 = 1.0 ;
def Onsite(site): (x, ) = site.pos potential = x return x
# system building lat = kwant.lattice.square(a=1, norbs=2) syst = kwant.Builder()
# central scattering region syst[(lat(x, 0) for x in range(length))] = t1*Sx syst[lat.neighbors()] = (t2*Sx - 1j*t2*Sy)/2
# add leads sym = kwant.TranslationalSymmetry((-1, 0)) lead_left = kwant.Builder(sym)
lead_left[lat(0, 0)] = t1*Sx + Onsite*I2 lead_left[lat.neighbors()] = (t2*Sx - 1j*t2*Sy)/2
syst.attach_lead(lead_left) syst.attach_lead(lead_left.reversed())
return syst
def main():
# parameters
# create system syst = create_system(length=10).finalized()
# plot the system and dispersion
kwant.plot(syst) kwant.plotter.bands(syst.leads[0], show=False) plt.plot([-np.pi, np.pi], [chemical_potential, chemical_potential], 'k--') plt.show()
lead = syst.leads[0] bands = kwant.physics.Bands(lead) momenta = np.linspace(-2*np.pi, 2*np.pi, 401) energies = [bands(k) for k in momenta]
plt.plot(momenta, energies,linestyle='--')
plt.xlim(-2*np.pi, 2*np.pi) #pyplot.ylim(-5, 5) plt.xlabel("$k$") plt.ylabel("Energy") #pyplot.axhline(y=0.0, color='k', linestyle='-') plt.tight_layout() plt.grid()
plt.show()
plt.close()
if __name__ == '__main__': main()
________________________________________________ Thanks in advance, *_________________________________* *Subhadeep Chakraborty*
*_________________________________*
-- Abbout Adel
participants (2)
-
Abbout Adel
-
Subhadeep Chakraborty