Re: [Kwant] site value is changing after finalizing the system

Dear Sudin, Your code seems to work fine for me. Why don't you just use an onsite function as below? (you can put a condition as you wish) sys_2[site] returns a function so you need to add the argument of hat function: sys_2[site](site) (be careful, this will not work if the leads add some sites to the central system: in the lead, the potential is given by scalars, in the system by a function. a small modification is required) I hope this helps, Adel ############################################################################# def make_system(W, L, lim): ## scattering region ## def Onsite(site): x,y=site.pos if y< lim: return x else: return 0 sys = kwant.Builder() sys[lat.shape(cross(W,L), (0,0))] = Onsite sys[lat.neighbors(1)] = -1. leads = [create_lead_h(W, xsym1,axis=(0,0)),create_lead_h(W, xsym2,axis=(0,0))] for lead in leads: sys.attach_lead(lead) return sys def main(): sys_2 = make_system(W=3.5, L=3, lim=-1) kwant.plotter.plot(sys_2,site_color=lambda site:sys_2[site](site),colorbar=True, cmap=None) if __name__ == '__main__': main() On Fri, Apr 17, 2020 at 7:06 AM SUDIN GANGULY <sudinganguly@gmail.com> wrote:
Dear Sir,
Thank you for your reply. The problem I am facing is that if I assign the site values like (1,2,3,...) along the bottom line, the colormap of the site values are changing whenever I compile the code. ############################ import kwant from pylab import * import matplotlib.pyplot as plt from random import * import numpy as np
class Honeycomb(kwant.lattice.Polyatomic): def __init__(self, name=''): prim_vecs = [[0.5, sqrt(3)/2], [1, 0]] # bravais lattice vectors # offset the lattice so that it is symmetric around x and y axes basis_vecs = [[-0.5, -1/sqrt(12)], [-0.5, 1/sqrt(12)]] super(Honeycomb, self).__init__(prim_vecs, basis_vecs, name) self.a, self.b = self.sublattices
sys=kwant.Builder() lat = Honeycomb() a,b= lat.sublattices
def cross(W, L): def shape(pos): return ((-W <= pos[1] <= W and -L <= pos[0] <= L)) return shape
pv1, pv2 = lat.prim_vecs
xsym1 = kwant.TranslationalSymmetry((-pv2)) # lattice symmetry in -x direction xsym1.add_site_family(lat.sublattices[0], other_vectors=[(-2, 1)]) xsym1.add_site_family(lat.sublattices[1], other_vectors=[(-2, 1)])
xsym2=kwant.TranslationalSymmetry((pv2)) xsym2.add_site_family(lat.sublattices[0], other_vectors=[(-2, 1)]) xsym2.add_site_family(lat.sublattices[1], other_vectors=[(-2, 1)])
def create_lead_h(W, symmetry, axis): lead = kwant.Builder(symmetry) lead[lat.wire(axis, W)] = 0. lead[lat.neighbors(1)] = -1. return lead
def make_system(W, L, no_of_line):
## scattering region ## sys = kwant.Builder() sys[lat.shape(cross(W,L), (0,0))] = 0 sys[lat.neighbors(1)] = -1.
line=[] for site in sys.expand(lat.shape(cross(W,L), (0, 0))): line.append(site.pos[1])
line=set(line) line=list(line) line=sort(line) my_list=[] i=1 for site in sys.expand(lat.shape(cross(W,L), (0, 0))): for j in range(0,no_of_line+1,2): line_no=j if (site.pos[1]==line[line_no] or site.pos[1]==line[line_no+1]): my_list.append(site) sys[site]=i i=i+1
## leads ##
leads = [create_lead_h(W, xsym1,axis=(0,0))] leads += [create_lead_h(W, xsym2,axis=(0,0))]
for lead in leads: sys.attach_lead(lead)
#============================================================================= return {'sys': sys }
def main(): sys_2 = make_system(W=3.5, L=5, no_of_line=1) kwant.plotter.plot(sys_2['sys'],site_color=lambda site:sys_2['sys'][site],colorbar=True, cmap=None)
if __name__ == '__main__': main() #################################
I can resolve this issue by collecting the site positions from the array named my_list in the given code and then assign the site values accordingly. However, this procedure is a bit lengthy. If there is any other way to do that with less coding, that will be very helpful. With Regards, Sudin
On Fri, Apr 17, 2020 at 1:36 AM Abbout Adel <abbout.adel@gmail.com> wrote:
Dear Sudin,
Please post the code giving the error or explain better your concern.
Could you just do it by defining an on site function?
def Onsite(site): x,y=site.pos() i,_=site.tag if y=y0: return Values[i] else: return V0
sys[(........)]=Onsite
I hope this helps, Adel
On Wed, Apr 15, 2020 at 3:45 PM SUDIN GANGULY <sudinganguly@gmail.com> wrote:
Dear Sir,
I want to assign a particular sequence of site values on a particular line (a number of lines) of a zigzag graphene nanoribbon. For example, the bottom zigzag line.
let's say, from the left to right there are 10 sites and I want to put the onsite values as [1,2,3,...].
I was able to get the information about the sites that are in the bottom line and have assigned the site values accordingly. But the problem is that each time I finalize the system, I get different onsite values along the bottom line. Is there any way to resolve this? Or maybe this approach is not the right way to do that.
A part of my code is given below ======================== def make_system(W, L, no_of_line):
## scattering region ## sys = kwant.Builder() sys[lat.shape(cross(W,L), (0,0))] = 0 sys[lat.neighbors(1)] = -1. #######INFO of the line######### line=[] for site in sys.expand(lat.shape(cross(W,L), (0, 0))): #print (site.pos[0],site.pos[1]) line.append(site.pos[1])
line=set(line) line=list(line) line=sort(line)
i=1 for site in sys.expand(lat.shape(cross(W,L), (0, 0))): for j in range(0,no_of_line+1,2): line_no=j if (site.pos[1]==line[line_no] or site.pos[1]==line[line_no+1]): sys[site]=i i=i+1 ########################
With Regards, Sudin
-- Abbout Adel
-- সুদিন
-- Abbout Adel
participants (1)
-
Abbout Adel