Dear Anton; Thank you for your reply
I have used the conservation_law as you have suggested. In fact, a dictionary or function definition of the conservation law is working fine now. I am not getting an error while defining the conservation law. However, when calling smatrix.transmission((1, 1), (0, 1)) which stands for spin up-up transmittance it raises: *index 2 is out of bounds for axis 0 with size 2.* Please see for example the following script which have two site families, one with 2 orbitals and the second with 6 orbitals Cheers, Adel import kwant from matplotlib import pyplot import numpy as np from math import sqrt lat = kwant.lattice.honeycomb(a=1, norbs=[2, 6] , name=["a", "b"]) a, b =lat.sublattices def make_sys(l, w, cons_law): def rect(pos): x, y = pos return abs(x) < l and abs(y) < w sys=kwant.Builder() sys[a.shape(rect, (0, 0))] = np.eye(2) sys[b.shape(rect, (0, 0))] = np.eye(6) ab_hopps= (((0, 0), a, b), ((0, 1), a, b), ((-1, 1), a, b)) sys[[kwant.builder.HoppingKind(*hopping) for hopping in ab_hopps]] = np.eye(2,6) sys.eradicate_dangling() sys[a.neighbors(1)] = np.eye(2) sys[b.neighbors(1)] = np.eye(6) ### creating leads def lead_shape(pos): x, y = pos return abs(y)< w sym = kwant.TranslationalSymmetry(lat.vec((-1, 0))) sym.add_site_family(lat.sublattices[0], other_vectors=[(-1, 2)]) sym.add_site_family(lat.sublattices[1], other_vectors=[(-1, 2)]) lead = kwant.Builder(sym, conservation_law=cons_law) lead[a.shape(rect, (0, 0))] = np.eye(2) lead[b.shape(rect, (0, 0))] = np.eye(6) lead[[kwant.builder.HoppingKind(*hopping) for hopping in ab_hopps]] = np.eye(2,6) lead.eradicate_dangling() lead[a.neighbors(1)] = np.eye(2) lead[b.neighbors(1)] = np.eye(6) sys.attach_lead(lead) sys.attach_lead(lead.reversed()) return sys syst = make_sys(l=3, w=2, cons_law= None) kwant.plot(syst ,fig_size=(8, 8)) pyplot.show() print('************ calling the conservation law **************') sigma_z = np.array([[1, 0], [0, -1]]) cons_law = {a: -sigma_z , b: -np.kron(sigma_z, np.eye(3))} syst = make_sys(l=3, w=2, cons_law=cons_law) smatrix = kwant.smatrix(syst.finalized(), 0.01) total_trans = smatrix.transmission(1, 0) up_up_trans = smatrix.transmission((1, 0), (0, 0)) dn_dn_trans = smatrix.transmission((1, 1), (0, 1)) up_dn_trans = smatrix.transmission((1, 1), (0, 0)) dn_up_trans = smatrix.transmission((1, 0), (0, 1)) print(total_trans) print(up_up_trans) print(dn_dn_trans) print(up_dn_trans) print(dn_up_trans) print(round(total_trans, 3)==round(up_up_trans+dn_dn_trans+up_dn_trans+dn_up_trans, 3)) Le sam. 14 août 2021 à 17:06, Anton Akhmerov <anton.akhmerov...@gmail.com> a écrit : > Hi Adel, > > Please check the documentation [1]. Since you have multiple site > families, you need to specify the conservation law as a dictionary, so > {metal_like_sub: -np.kron(sigma_z, np.eye(3)), C_like_sub1: -sigma_z, > C_like_sub2: -sigma_z}. > > Best, > Anton > > > https://kwant-project.org/doc/1/reference/generated/kwant.builder.Builder#kwant.builder.Builder > > On Sat, 14 Aug 2021 at 16:08, Adel Belayadi <adelp...@gmail.com> wrote: > > > > Dear Kwant user, > > Good day and I hope this email finds you well. > > Using conservation law was fully explained, in the Kwant mailing list, > while we are having sublattices with the same degree of freedom (same > number of orbitals). For instance, if we have two sites with 3 orbitals in > the case of a spin full Hamiltonian, the onsite matrix is > (onsite_matrix(6*6) for each site ). So in this case, the conservation law > will be straightforward: conservation_law=-np.kron(sigma_z, np.eye(3)).But > what would be the case if we are dealing with sublattices which have > different numbers of orbitals? > > > > In my case, I am interested in spin conductance. I am using 3 > sublattices with different orbitals. Let us say for instance > > sublattice0 has (6-orbitals), sublattice1 with (2-orbitals) and > sublattice2 with (2-orbitals). In fact I am working on hetero-structure > with two sites of C-like(pz with spin up and down) and one site of > metal-like(3d-orbitals with spin up and down). I can resume my lattice as > follow > > > > lat = kwant.lattice.general(prim_vecs, basis=[ [...], [...], [...]] , > norbs=[6, 2, 2]) > > metal-like_sub, C-like_sub1, C-like_sub2 = lat.sublattices > > > > According to my understanding the conservation law would be something > like > > conservation_law=-np.kron(sigma_z, np.eye(5)). However Kwant raises an > error with my choice of the conservation law. > > > > Is there something missing with my understanding of the conservation > law!. Or in the case of different orbitals per site, we need to define two > lattices (lattice1 for spin up and lattice2 for spindown). > > Thanks in advance, > > Best > > > > > > >