Exemplo n.º 1
0
def FinalizedSystem(SitesCount_X):
    # lattices
    lat = kwant.lattice.general(((1, ), ))
    # builder
    sys = kwant.Builder()
    # first, define all sites and their onsite energies
    for nx in range(SitesCount_X):
        sys[lat(nx, )] = onsite
    # hoppings
    for nx in range(SitesCount_X - 1):
        sys[lat(nx + 1, ), lat(nx, )] = hop
    # finalize the system
    return sys.finalized()
Exemplo n.º 2
0
def syst_rect(lat, salt, W=3, L=50):
    syst = kwant.Builder()

    ll = L // 2
    ww = W // 2

    def onsite(site):
        return 4 + 0.1 * kwant.digest.gauss(repr(site.tag), salt=salt)

    syst[(lat(i, j) for i in range(-ll, ll + 1)
          for j in range(-ww, ww + 1))] = onsite
    syst[lat.neighbors()] = -1

    sym = kwant.TranslationalSymmetry(lat.vec((-1, 0)))
    lead = kwant.Builder(sym)
    lead[(lat(0, j) for j in range(-ww, ww + 1))] = 4
    lead[lat.neighbors()] = -1

    syst.attach_lead(lead)
    syst.attach_lead(lead.reversed())

    return syst
Exemplo n.º 3
0
def syst_3d(W=3, r1=2, r2=4, a=1, t=1.0):
    lat = kwant.lattice.general(((a, 0, 0), (0, a, 0), (0, 0, a)))
    syst = kwant.Builder()

    def ring(pos):
        (x, y, z) = pos
        rsq = x**2 + y**2
        return (r1**2 < rsq < r2**2) and abs(z) < 2

    syst[lat.shape(ring, (0, -r2 + 1, 0))] = 4 * t
    syst[lat.neighbors()] = -t
    sym_lead0 = kwant.TranslationalSymmetry(lat.vec((-1, 0, 0)))
    lead0 = kwant.Builder(sym_lead0)

    lead_shape = lambda pos: (-W / 2 < pos[1] < W / 2) and abs(pos[2]) < 2

    lead0[lat.shape(lead_shape, (0, 0, 0))] = 4 * t
    lead0[lat.neighbors()] = -t
    lead1 = lead0.reversed()
    syst.attach_lead(lead0)
    syst.attach_lead(lead1)
    return syst
Exemplo n.º 4
0
def test_opposite_hoppings():
    lat = kwant.lattice.square(norbs=1)

    for val in [1j, lambda a, b: 1j]:
        syst = kwant.Builder(kwant.TranslationalSymmetry((1, 1)))
        syst[(lat(x, 0) for x in [-1, 0])] = 0
        syst[lat(0, 0), lat(-1, 0)] = val
        syst[lat(-1, 0), lat(-1, -1)] = val

        fsyst = wraparound(syst).finalized()
        params = dict(k_x=0)
        np.testing.assert_almost_equal(
            fsyst.hamiltonian_submatrix(params=params), 0)
Exemplo n.º 5
0
def test_plot_raises_on_bad_site_spec(engine):
    syst = kwant.Builder()
    lat = kwant.lattice.square(norbs=1)
    syst[(lat(i, j) for i in range(5) for j in range(5))] = None

    # Cannot provide site_size as an array when syst is a Builder
    plotter.set_engine(engine)
    with pytest.raises(TypeError):
        plotter.plot(syst, site_size=[1] * 25)

    # Cannot provide site_size as an array when syst is a Builder
    with pytest.raises(TypeError):
        plotter.plot(syst, site_symbol=['o'] * 25)
Exemplo n.º 6
0
def make_2d_test_system(X=2, Y=2, a=1):
    ham = "(hbar^2 * (k_x^2 + k_y^2) / (2 * m) * c - mu) * sigma_z + Delta * sigma_x"
    template_lead = discretize(ham, grid_spacing=a)
    template = discretize(ham, locals={'Delta': 0}, grid_spacing=a)
    syst = kwant.Builder()
    syst.fill(template, lambda s: 0 <= s.pos[0] < X and 0 <= s.pos[1] < Y,
              (0, 0))
    lat = template.lattice

    # Add 0 self energy lead
    cuts = get_cuts(syst, lat)
    syst = add_vlead(syst, lat, *cuts)

    # Leads
    lead = kwant.Builder(kwant.TranslationalSymmetry((a, 0)))
    lead.fill(template_lead, lambda s: 0 <= s.pos[1] < Y, (0, 0))
    syst.attach_lead(lead)
    syst.attach_lead(lead.reversed())
    syst = syst.finalized()

    hopping = hopping_between_cuts(syst, *cuts)
    return syst, hopping
Exemplo n.º 7
0
def test_find_builder_discrete_symmetries():
    symm_class = ['AI', 'D', 'AIII', 'BDI']
    class_dict = {
        'AI': ['time_reversal'],
        'D': ['particle_hole'],
        'AIII': ['chiral'],
        'BDI': ['time_reversal', 'particle_hole', 'chiral']
    }
    sym_dict = {
        'time_reversal': qsymm.PointGroupElement(np.eye(2), True, False, None),
        'particle_hole': qsymm.PointGroupElement(np.eye(2), True, True, None),
        'chiral': qsymm.PointGroupElement(np.eye(2), False, True, None)
    }
    n = 4
    rng = 11
    for sym in symm_class:
        # Random Hamiltonian in the symmetry class
        h_ons = kwant.rmt.gaussian(n, sym, rng=rng)
        h_hop = 10 * kwant.rmt.gaussian(2 * n, sym, rng=rng)[:n, n:]
        # Make a Kwant builder in the symmetry class and find its symmetries
        lat = kwant.lattice.square(norbs=n)
        bulk = kwant.Builder(TranslationalSymmetry([1, 0], [0, 1]))
        bulk[lat(0, 0)] = h_ons
        bulk[kwant.builder.HoppingKind((1, 0), lat)] = h_hop
        bulk[kwant.builder.HoppingKind((0, 1), lat)] = h_hop

        # We need to specify 'prettify=True' here to ensure that we do not end up with
        # an overcomplete set of symmetries. In some badly conditioned cases sparse=True
        # or sparse=False may affect how many symmetries are found.
        builder_symmetries_default = find_builder_symmetries(
            bulk, spatial_symmetries=True, prettify=True)
        builder_symmetries_sparse = find_builder_symmetries(
            bulk, spatial_symmetries=True, prettify=True, sparse=True)
        builder_symmetries_dense = find_builder_symmetries(
            bulk, spatial_symmetries=True, prettify=True, sparse=False)

        assert len(builder_symmetries_default) == len(
            builder_symmetries_sparse)
        assert len(builder_symmetries_default) == len(builder_symmetries_dense)

        # Equality of symmetries ignores unitary part
        fourfold_rotation = qsymm.PointGroupElement(np.array([[0, 1], [1, 0]]),
                                                    False, False, None)
        assert fourfold_rotation in builder_symmetries_default
        assert fourfold_rotation in builder_symmetries_sparse
        assert fourfold_rotation in builder_symmetries_dense
        class_symmetries = class_dict[sym]
        for class_symmetry in class_symmetries:
            assert sym_dict[class_symmetry] in builder_symmetries_default
            assert sym_dict[class_symmetry] in builder_symmetries_sparse
            assert sym_dict[class_symmetry] in builder_symmetries_dense
Exemplo n.º 8
0
def test_discrete_symmetries():
    lat = builder.SimpleSiteFamily(name='ccc', norbs=2)
    lat2 = builder.SimpleSiteFamily(name='bla', norbs=1)
    lat3 = builder.SimpleSiteFamily(name='dd', norbs=4)

    cons_law = {lat: np.diag([1, 2]), lat2: 0}
    syst = builder.Builder(conservation_law=cons_law,
                           time_reversal=(lambda site, p: np.exp(1j*p) *
                                          np.identity(site.family.norbs)))
    syst[lat(1)] = np.identity(2)
    syst[lat2(1)] = 1

    sym = syst.finalized().discrete_symmetry(args=[0])
    for proj, should_be in zip(sym.projectors, np.identity(3)):
        assert np.allclose(proj.toarray(), should_be.reshape((3, 1)))
    assert np.allclose(sym.time_reversal.toarray(), np.identity(3))
    syst.conservation_law = lambda site, p: cons_law[site.family]
    sym = syst.finalized().discrete_symmetry(args=[0])
    for proj, should_be in zip(sym.projectors, np.identity(3)):
        assert np.allclose(proj.toarray(), should_be.reshape((-1, 1)))

    syst = builder.Builder(conservation_law=np.diag([-1, 1]))
    syst[lat(1)] = np.identity(2)
    sym = syst.finalized().discrete_symmetry()
    for proj, should_be in zip(sym.projectors, np.identity(2)):
        assert np.allclose(proj.toarray(), should_be.reshape((-1, 1)))

    syst = builder.Builder(conservation_law=1)
    syst[lat2(1)] = 0
    sym = syst.finalized().discrete_symmetry()
    [proj] = sym.projectors
    assert np.allclose(proj.toarray(), [[1]])

    syst = kwant.Builder(conservation_law=np.diag([-1, 1, -1, 1]))

    syst[lat3(0)] = np.eye(4)

    sym = syst.finalized().discrete_symmetry()
    p1 = np.zeros((4, 2))
    p1[0, 0] = p1[2, 1] = 1
    assert np.allclose(sym.projectors[0].toarray(), p1)
    p2 = np.zeros((4, 2))
    p2[1, 0] = p2[3, 1] = 1
    assert np.allclose(sym.projectors[1].toarray(), p2)

    # test parameter passing to conservation_law
    syst = builder.Builder(conservation_law=lambda site, b: b)
    syst[lat2(1)] = 0
    sym = syst.finalized().discrete_symmetry(params=dict(a=None, b=1))
    [proj] = sym.projectors
    assert np.allclose(proj.toarray(), [[1]])
Exemplo n.º 9
0
def test_smatrix_shape(smatrix):
    system = kwant.Builder()
    lead0 = kwant.Builder(kwant.TranslationalSymmetry((-1, )))
    lead1 = kwant.Builder(kwant.TranslationalSymmetry((1, )))
    for b, site in [(system, chain(0)), (system, chain(1)),
                    (system, chain(2))]:
        b[site] = 2
    lead0[chain(0)] = lambda site: lead0_val
    lead1[chain(0)] = lambda site: lead1_val

    for b, hopp in [(system, (chain(0), chain(1))),
                    (system, (chain(1), chain(2))),
                    (lead0, (chain(0), chain(1))),
                    (lead1, (chain(0), chain(1)))]:
        b[hopp] = -1
    system.attach_lead(lead0)
    system.attach_lead(lead1)
    fsyst = system.finalized()

    lead0_val = 4
    lead1_val = 4
    s = smatrix(fsyst, 1.0, (), [1], [0]).data
    assert s.shape == (0, 0)

    lead0_val = 2
    lead1_val = 2
    s = smatrix(fsyst, 1.0, (), [1], [0]).data
    assert s.shape == (1, 1)

    lead0_val = 4
    lead1_val = 2
    s = smatrix(fsyst, 1.0, (), [1], [0]).data
    assert s.shape == (1, 0)

    lead0_val = 2
    lead1_val = 4
    s = smatrix(fsyst, 1.0, (), [1], [0]).data
    assert s.shape == (0, 1)
def make_system():
    a = 1
    lat = kwant.lattice.square(a)
    syst = kwant.Builder()
    t = 1.0
    W = 5
    L = 50
    syst[(lat(x, y) for x in range(L) for y in range(W))] = 0
    syst[lat.neighbors()] = -t
    #   几何形状如下所示:
    #               lead2         lead3
    #   lead1(L)                          lead4(R)
    #               lead6         lead5

    move = 0  # the step of leads 2,3,6,5 moving to center

    lead1 = kwant.Builder(kwant.TranslationalSymmetry((-a, 0)))
    lead1[(lat(0, j) for j in range(W))] = 0
    lead1[lat.neighbors()] = -t
    syst.attach_lead(lead1)

    lead2 = kwant.Builder(kwant.TranslationalSymmetry((0, -a)))
    lead2[(lat(move + j, 0) for j in range(W))] = 0
    lead2[lat.neighbors()] = -t
    syst.attach_lead(lead2)

    lead3 = kwant.Builder(kwant.TranslationalSymmetry((0, -a)))
    lead3[(lat(j + (L - W - move), 0) for j in range(W))] = 0
    lead3[lat.neighbors()] = -t
    syst.attach_lead(lead3)

    syst.attach_lead(lead1.reversed())  # lead4
    syst.attach_lead(lead3.reversed())  # lead5
    syst.attach_lead(lead2.reversed())  # lead6

    kwant.plot(syst)
    syst = syst.finalized()
    return syst
Exemplo n.º 11
0
def make_system():
    sys = kwant.Builder(kwant.TranslationalSymmetry(graphene.vec((-Y / 2, Y))))
    sys[graphene.shape(disk, (0, 0))] = onsite
    sys[graphene.neighbors(1)] = hopping1
    sys[[kwant.builder.HoppingKind(*hopping)
         for hopping in nnn_hoppings]] = nnn_hopping
    sys = wraparound.wraparound(sys)
    #kwant.plot(sys, fig_size=(10, 5))

    lead = kwant.Builder(
        kwant.TranslationalSymmetry((1, 0), graphene.vec((-Y / 2, Y))))
    lead[graphene.shape(disk, (0, 0))] = onsite_clean
    lead[graphene.neighbors(1)] = hopping1
    lead[[kwant.builder.HoppingKind(*hopping)
          for hopping in nnn_hoppings]] = nnn_hopping
    lead = wraparound.wraparound(lead, keep=0)

    sys.attach_lead(lead)
    sys.attach_lead(lead.reversed())

    #kwant.plot(lead, fig_size=(10, 5))
    #kwant.plot(sys, fig_size=(10, 5))
    return sys.finalized()
def test_signatures():
    lat = kwant.lattice.square()
    syst = kwant.Builder(kwant.TranslationalSymmetry((-3, 0), (0, 1)))
    # onsites and hoppings that will be bound as sites
    syst[lat(-2, 0)] = 4
    syst[(lat(-2, 0), lat(-2, 1))] = -1
    #
    syst[lat(-1, 0)] = lambda a, E1: E1
    syst[(lat(-1, 0), lat(-1, 1))] = lambda a, b, t1: t1
    #
    syst[lat(0, 0)] = lambda a, E2, **kwargs: E2
    syst[(lat(0, 0), lat(0, 1))] = lambda a, b, t2, **kwargs: t2

    # hoppings that will be bound as hoppings
    syst[(lat(-2, 0), lat(-1, 0))] = -1
    syst[(lat(-2, 0), lat(2, 0))] = -1
    #
    syst[(lat(-2, 0), lat(0, 0))] = -1
    syst[(lat(-2, 0), lat(3, 0))] = lambda a, b, t3: t3

    syst[(lat(-1, 0), lat(0, 0))] = lambda a, b, t4, **kwargs: t4
    syst[(lat(-1, 0), lat(3, 0))] = lambda a, b, t5: t5

    wrapped_syst = wraparound(syst)

    ## testing

    momenta = ['k_x', 'k_y']

    onsites = [
        (lat(-2, 0), momenta, False),
        (lat(-1, 0), ['E1', 't1'] + momenta, False),
        (lat(0, 0), ['E2', 't2'] + momenta, True),
    ]

    for site, params_should_be, should_take_kwargs in onsites:
        params, _, takes_kwargs = get_parameters(wrapped_syst[site])
        assert params[1:] == params_should_be
        assert takes_kwargs == should_take_kwargs

    hoppings = [
        ((lat(-2, 0), lat(-1, 0)), momenta, False),
        ((lat(-2, 0), lat(0, 0)), ['t3'] + momenta, False),
        ((lat(-1, 0), lat(0, 0)), ['t4', 't5'] + momenta, True),
    ]

    for hopping, params_should_be, should_take_kwargs in hoppings:
        params, _, takes_kwargs = get_parameters(wrapped_syst[hopping])
        assert params[2:] == params_should_be
        assert takes_kwargs == should_take_kwargs
Exemplo n.º 13
0
def make_system(p,ppar):

	"""
	Building the different parts by adding onsite/hoppings to sys:
	Since adding lead only to scattering region, I iterate over par.middle first; then I can use just one sys object to attach the leads in the first iteration, and keep the same sys object when continuing on adding the right and left parts.

	Parameters
	----------
	ppar.make_1DNLeft_1DN_2DS_2DSMiddle_No_NRight : 	Boolean.
							If True or 1, a 1D semiconducting wire is constructed with a 2D superconductor connected to it along the whole wire (along the y-direction), with a pincher layer of SC (???given by a 2D hamiltonian but only with one site in width for now ???ok???) at the boundary between the semiconductor and the superconducting lead.

	Notes
	-----
	If 1D pincher is to be added at the edges of the 1D system, this is taken care of in make_1D_system, given that p.pincher==True and a t-value p.t_pincher needs to have been defined.
	"""
	
	print("%s: in make_system()" %str(misc.round_time(datetime.datetime.now(),round_to=60)))

	if ppar.one_D == True:
		if ppar.make_1D_Heff_LR_leads:
			sys = make_1D_system(p,ppar)						# make 1D N-S-N system, where middle S is the effective Hamiltonian of the proximitized semiconductor, and there is no middle S lead, meaning that conductances above the gap obrained in this model are not accurate, as modes should in the real physical system have been able to escape through the middle S lead above the gap (where the middle S has available quasiparticle excitations).
		elif ppar.make_1DNLeft_1DN_2DSMiddle_No_NRight:
			sys = make_1DNLeft_1DN_2DSMiddle_No_NRight_system(p,ppar)
		elif ppar.make_1DNLeft_1DN_2DS_2DSMiddle_No_NRight:
			sys = make_1DNLeft_1DN_2DS_2DSMiddle_No_NRight_system(p,ppar)				# make 1D N-N(S)-N system, where middle N is 1D and middle S is 2D.
		elif ppar.make_1D_NLeft_1D_S_Heff_No_NRight:
			sys = make_1D_NLeft_1D_S_Heff_No_NRight(p,ppar) 	# make 1D N-S junction for calibration, where S has the effective Hamiltonian of the proximitized semiconductor
		elif ppar.make_1D_NLeft_1D_N_2D_S_2D_SMiddle_No_NRight:	# make 1D N-N(S) function to calibrate, where S is a 2D SC Hamiltonian that should induce the gap in the middle N
			sys = make_1D_Nleft_1D_N_2D_S_2D_SMiddle_No_NRight(p,ppar)
		
	else:
		"""Function building superconductor for parameters in SimpleNamespace object p."""
		sys = kwant.Builder()
		par.asymmetric = check_asymm_device(par)	# True/False, to be used when printing last blocks of Hamiltonian

		for i,part_ in zip(('M','L','R'),(p.middle, p.left, p.right)):
			"""Printing which part is being built at the current loop iteration:"""
			print_current_part(part_,i)
			"""Adding parts to the system:"""
			sys[(lat(x,y) for x in part_ for y in range(p.Ny))] = onsite #  Not input phase/gamma explicitly such that may specify variables such as Ez at later point in code after finalizing. I think that Kwant has this particular syntax in sys[lat..]=<function_name> without having to input arguments in the function.
			sys[kwant.builder.HoppingKind((1,0),lat)] = hoppingx
			sys[kwant.builder.HoppingKind((0,1),lat)] = hoppingy

			"""Attaching leads to the middle region, i.e. the scattering region:"""
			if i == 'M':
				lead = make_lead_onesite_wide(p) #make_lead(p)
				sys.attach_lead(lead)
				sys.attach_lead(lead.reversed())

	return sys
def make_lead():
    def lead_shape(pos):
        x,y=pos
        return abs(y)<width 
    sym = kwant.TranslationalSymmetry((1,0))
    sym.add_site_family(graphene.sublattices[0], other_vectors=[(-1, 2)])
    sym.add_site_family(graphene.sublattices[1], other_vectors=[(-1, 2)])
    
    lead = kwant.Builder(sym)
    
    lead[graphene.shape(lead_shape, (0, width-1))] = 0 
    lead[graphene.neighbors()]=1
    lead[[kwant.builder.HoppingKind(*hopping) for hopping in nnn_hoppings]]=1j *m2 
    return lead.finalized()
def make_system(width, length, salt):
    def disk(pos):
        x,y=pos
        return -width<y<width and abs(x)<length   #25.1

    def onsite(site):
        x,y=site.pos
        return (uniform(repr(site),salt)-0.5)*dis

    sys=kwant.Builder()
    sys[graphene.shape(disk,(0,0))]= onsite  #0 #
    sys[graphene.neighbors()]=1      # comment it, when has rashba
    sys[[kwant.builder.HoppingKind(*hopping) for hopping in nnn_hoppings]] = 1j*m2
    return sys
Exemplo n.º 16
0
def test_plot_more_site_families_than_colors(engine):
    # test against regression reported in
    # https://gitlab.kwant-project.org/kwant/kwant/issues/257
    ncolors = len(pyplot.rcParams['axes.prop_cycle'])
    syst = kwant.Builder()
    lattices = [kwant.lattice.square(name=i, norbs=1)
                for i in range(ncolors + 1)]
    for i, lat in enumerate(lattices):
        syst[lat(i, 0)] = None

    plotter.set_engine(engine)
    with tempfile.NamedTemporaryFile('w+b', suffix=plotter_file_suffix(engine)) as out:
        out_filename = out.name
        plotter.plot(syst, file=out_filename, show=False)
def scatter():
    sys[lat.shape(disk, (1, 1))] = onsite
    sys[lat.neighbors()] = -1 / n**2

    lead = kwant.Builder(kwant.TranslationalSymmetry((-1, 0)))
    lead[lat.shape(edge, (0, 1))] = 4 / n1**2
    lead[lat.neighbors()] = -1 / n1**2
    sys.attach_lead(lead)
    sys.attach_lead(lead.reversed())
    #lead=kwant.Builder(kwant.TranslationalSymmetry((1,0)))
    #lead[lat.shape(edge,(0,1))]=4/n2**2
    #lead[lat.neighbors()]=-1/n2**2
    #sys.attach_lead(lead)
    return sys
def make_system0(width, length):
    def disk(pos):
        x, y = pos
        return width - di < y < width and abs(x) < length  #25.1

    sys = kwant.Builder()
    sys[graphene.shape(disk, (0, width - 1))] = 0  #0 #
    sys[graphene.neighbors()] = 1  # comment it, when has rashba

    def lead_shape(pos):
        x, y = pos
        return width - di < y < width

    sym = kwant.TranslationalSymmetry((-1, 0))
    sym.add_site_family(graphene.sublattices[0], other_vectors=[(-1, 2)])
    sym.add_site_family(graphene.sublattices[1], other_vectors=[(-1, 2)])
    lead = kwant.Builder(sym)  #,conservation_law=-sz
    lead[graphene.shape(lead_shape, (0, width - 1))] = 0  #1
    lead[graphene.neighbors()] = 1
    sys.attach_lead(lead)
    sys.attach_lead(lead.reversed())

    return sys
Exemplo n.º 19
0
def make_system_with_less_code():
    a = 1  # 晶格常数
    lat = kwant.lattice.square(a)  # 创建晶格,方格子

    syst = kwant.Builder()  # 建立中心体系
    t = 1.0  # hopping值
    W = 5  # 中心体系宽度
    L = 40  # 中心体系长度

    # 中心区
    syst[(lat(x, y) for x in range(L) for y in range(W))] = 0
    syst[lat.neighbors()] = -t  # 用neighbors()方法

    # 电极
    lead = kwant.Builder(kwant.TranslationalSymmetry((-a, 0)))
    lead[(lat(0, j) for j in range(W))] = 0
    lead[lat.neighbors()] = -t  # 用neighbors()方法
    syst.attach_lead(lead)  # 左电极
    syst.attach_lead(lead.reversed())  # 用reversed()方法得到右电极

    kwant.plot(syst)  # 把电极-中心区-电极图画出来,通过图像可以看出有没有写错
    syst = syst.finalized()  # 结束体系的制作。这个语句不可以省。这个语句是把Builder对象转换成可计算的对象。
    return syst
Exemplo n.º 20
0
def make_system_step1(q):
    L1=tinyarray.array((3/sqrt(3),0));SC1=L1;
    L2=tinyarray.array((0,q));        SC2=L2;
   
    syst = kwant.Builder()
    
    ##primitive graphene,dispersion without B:
#    for i in range(1):
#    #for i in range(q):
#      for j in range(1):
#        # On-site Hamiltonian
#        syst[a(i, j)] =0
#        syst[b(i, j)] =0
#    syst[a(0,0),b(0,0)]=-1-np.exp(1j*k1)-np.exp(1j*k2)
#    
    def rectangle(pos):
        xR, yR = pos
        #print(pos)
        #sys.exit()
        # xR,yR=list(x*v1+y*v2)
        #return (xR <=Lx2)&(yR<=Ly2)&(xR >= Lx1)&(yR>=Ly1)
        return   (-cos_30/3-0.00001<=xR<3/sqrt(3)*Nx-1/sqrt(3))&(0-0.0001<=yR<=Ny*q-0.0001)
    syst[graphene.shape(rectangle, (0, 0))] = 0
    
    
    syst0=syst.finalized()
    N_ToT=syst0.graph.num_nodes;
    print(N_ToT);
    
    
    def neighbors():
        nns=[[] for i in range(N_ToT)];
        for ni in range(N_ToT):
          #print(ni)
          ri=syst0.sites[ni].pos;
        
          for nj in range(N_ToT):
             rj=syst0.sites[nj].pos;
             
             for n1 in range(-1,2):
                for n2 in range(-1,2):
                  rjn=rj+(n1*SC1+n2*SC2);
                  ss=ri-rjn;
                  dis=sqrt(np.dot(ss,ss))
                  if (abs(dis-1/sqrt(3))<10**-5):
                     if not((n1==0)&(n2==0)&(nj==ni)):
                        nns[ni].append((nj,n1,n2))
        return nns
    nns=neighbors();
    return nns,syst,syst0
Exemplo n.º 21
0
def make_system(length, salt):
    def onsite(site):
        return (uniform(repr(site), salt) - 0.5) * 2.5

    sys = kwant.Builder(
        kwant.TranslationalSymmetry(
            *graphene.prim_vecs *
            length))  #kwant.TranslationalSymmetry(*graphene.prim_vecs*20)
    sys[graphene.shape((lambda pos: True), (0, 0))] = onsite
    sys[graphene.neighbors(1)] = -1
    sys[[kwant.builder.HoppingKind(*hopping)
         for hopping in nnn_hoppings]] = .1j
    sys = wraparound(sys).finalized()
    return sys
Exemplo n.º 22
0
def make_syst_staggered(r=30, t=-1, a=1, m=0.1):
    syst = kwant.Builder()
    lat = kwant.lattice.honeycomb(a, norbs=1)

    def circle(pos):
        x, y = pos
        return x**2 + y**2 < r**2

    syst[lat.a.shape(circle, (0, 0))] = m
    syst[lat.b.shape(circle, (0, 0))] = -m
    syst[lat.neighbors()] = t
    syst.eradicate_dangling()

    return syst
Exemplo n.º 23
0
def lead_metalica(hamiltonian, W=W_STD, a=A_STD):

    template = kwant.continuum.discretize(hamiltonian, grid=a)

    def lead_shape(site):
        (x, y) = site.pos
        return (-W / 2 < y < W / 2)

    sigma_z = np.array([[1, 0], [0, -1]])
    tau_z = np.kron(sigma_z, np.eye(3))

    try:
        lead = kwant.Builder(kwant.TranslationalSymmetry([-a, 0]),
                             conservation_law=-tau_z)
    except:
        print(
            "Except in line 674 of 'gasb_hamiltonian.py' located in ./hamiltonians "
        )
        lead = kwant.Builder(kwant.TranslationalSymmetry([-a, 0]))

    lead.fill(template, lead_shape, (-a, 0))

    return lead
Exemplo n.º 24
0
def test_one_lead(smatrix):
    rng = ensure_rng(3)
    system = kwant.Builder()
    lead = kwant.Builder(kwant.TranslationalSymmetry((-1, )))
    for b, site in [(system, chain(0)), (system, chain(1)), (system, chain(2)),
                    (lead, chain(0))]:
        h = rng.random_sample((n, n)) + 1j * rng.random_sample((n, n))
        h += h.conjugate().transpose()
        b[site] = h
    for b, hopp in [(system, (chain(0), chain(1))),
                    (system, (chain(1), chain(2))),
                    (lead, (chain(0), chain(1)))]:
        b[hopp] = (10 * rng.random_sample((n, n)) + 1j * rng.random_sample(
            (n, n)))
    system.attach_lead(lead)
    fsyst = system.finalized()

    for syst in (fsyst, fsyst.precalculate(), fsyst.precalculate(what='all')):
        s = smatrix(syst).data
        assert_almost_equal(np.dot(s.conjugate().transpose(), s),
                            np.identity(s.shape[0]))

    raises(ValueError, smatrix, fsyst.precalculate(what='selfenergy'))
Exemplo n.º 25
0
def test_args_params_equivalence():
    for lat in [
            kwant.lattice.square(),
            kwant.lattice.honeycomb(),
            kwant.lattice.kagome()
    ]:
        syst = kwant.Builder(kwant.TranslationalSymmetry(*lat.prim_vecs))
        syst[lat.shape((lambda pos: True), (0, 0))] = 1
        syst[lat.neighbors(1)] = 0.1
        syst[lat.neighbors(2)] = lambda a, b, param: 0.01
        syst = wraparound(syst).finalized()
        shs = syst.hamiltonian_submatrix
        assert_equal(shs(args=["bla", 1, 2]),
                     shs(params=dict(param="bla", k_x=1, k_y=2)))
Exemplo n.º 26
0
def test_arg_passing(wave_function, ldos, smatrix):

    def onsite(site, a, b):
        return site.pos[0] + site.pos[1] + a + b

    def hopping(site1, site2, a, b):
        return b - a

    square = kwant.lattice.square(norbs=1)
    W = 3
    L = 4

    syst = kwant.Builder()
    syst[(square(i, j) for i in range(L) for j in range(W))] = onsite
    syst[square.neighbors()] = hopping

    lead = kwant.Builder(kwant.TranslationalSymmetry((-1, 0)))
    lead[(square(0, j) for j in range(W))] = onsite
    lead[square.neighbors()] = hopping

    syst.attach_lead(lead)
    syst.attach_lead(lead.reversed())

    fsyst = syst.finalized()

    # compare results to those when we pass `args` only
    args = (1, 3)
    params = dict(a=1, b=3)
    np.testing.assert_array_equal(
        wave_function(fsyst, args=args)(0),
        wave_function(fsyst, params=params)(0))
    np.testing.assert_array_equal(
        ldos(fsyst, args=args),
        ldos(fsyst, params=params))
    np.testing.assert_array_equal(
        smatrix(fsyst, args=args).data,
        smatrix(fsyst, params=params).data)
Exemplo n.º 27
0
def test_band_velocities():
    syst = kwant.Builder(kwant.TranslationalSymmetry((-1, 0)))
    lat = kwant.lattice.square()
    syst[lat(0, 0)] = 1
    syst[lat(0, 1)] = 3
    syst[lat(1, 0), lat(0, 0)] = -1
    syst[lat(1, 1), lat(0, 1)] = 2
    bands = kwant.physics.Bands(syst.finalized())
    eps = 1E-4
    for k in linspace(-pi, pi, 200):
        vel = bands(k, derivative_order=1)[1]
        # higher order formula for first derivative to get required accuracy
        num_vel = (-bands(k + 2 * eps) + bands(k - 2 * eps) + 8 *
                   (bands(k + eps) - bands(k - eps))) / (12 * eps)
        assert_array_almost_equal(vel, num_vel)
def make_system(width, length, salt):
    def disk(pos):
        x, y = pos
        return abs(y) < width and abs(x) < length  #25.1

    def lead_shape(pos):
        x, y = pos
        return abs(y) < width  #width-di<y<width  #

    def nnn(site1, site2):
        x, y = site1.pos
        if abs(x) < length and y > width - di:
            return 1j * m2 * np.sign(uniform(repr(site1.tag), salt) - alpha)
        else:
            return 1j * m2

    sys = kwant.Builder()
    sys[graphene.shape(disk, (0, 0))] = 0
    sys[graphene.neighbors()] = 1  # comment it, when has rashba
    sys[[kwant.builder.HoppingKind(*hopping)
         for hopping in nnn_hoppings]] = nnn  #1j *m2 * sz #

    sym = kwant.TranslationalSymmetry((-1, 0))
    sym.add_site_family(graphene.sublattices[0], other_vectors=[(-1, 2)])
    sym.add_site_family(graphene.sublattices[1], other_vectors=[(-1, 2)])

    lead = kwant.Builder(sym)  #,conservation_law=-sz

    lead[graphene.shape(lead_shape, (0, width - 1))] = 0  #1
    lead[graphene.neighbors()] = 1
    #    lead[[kwant.builder.HoppingKind(*hopping) for hopping in nnn_hoppings]]=1j *m2

    sys.attach_lead(lead)
    sys.attach_lead(lead.reversed())

    return sys.finalized()
def make_system_all(length, width, dis, salt, command='null'):
    def cuboid_shape(pos):
        x, y = pos
        return abs(x) < length and abs(y) < width

    def lead_shape(pos):
        x, y = pos
        return abs(y) < width

    def onsite(site):
        x, y = site.pos
        if command == 'crystal':
            if (x % 2 == 0) & (y % 2 == 0):
                return 2
            else:
                return 0
        else:
            if abs(x) < length:  # add clean region
                return dis * (uniform(repr(site), salt) - .5) + 4
            else:
                return 4

    sys = kwant.Builder()
    sys[lat.shape(cuboid_shape, (0, 0))] = onsite
    sys[lat.neighbors()] = -1

    sym_lead = kwant.TranslationalSymmetry((-1, 0))
    lead = kwant.Builder(sym_lead)

    lead[lat.shape(lead_shape, (0, 0))] = 4
    lead[lat.neighbors()] = -1

    sys.attach_lead(lead)
    sys.attach_lead(lead.reversed())

    return sys.finalized()
def FinalizedSystem_1D(SitesCount_X, p):
    # lattices
    lat = kwant.lattice.general(((p.LatticeSpacing, ), ))
    # builder
    sys = kwant.Builder()
    # first, define all sites and their onsite energies
    for nx in range(SitesCount_X):
        sys[lat(nx, )] = onsite_1D
    # hoppings
    for nx in range(SitesCount_X - 1):
        sys[lat(nx + 1, ), lat(nx, )] = hopNN_1D
    for nx in range(SitesCount_X - 2):
        sys[lat(nx + 2, ), lat(nx, )] = hopNNN_1D
    # finalize the system
    return sys.finalized()