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 <sudingang...@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.a...@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 <sudingang...@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

Reply via email to