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
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#kw...
On Sat, 14 Aug 2021 at 16:08, Adel Belayadi
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
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
sublattices with different orbitals. Let us say for instance metal-like(3d-orbitals with spin up and down). I can resume my lattice as follow
lat = kwant.lattice.general(prim_vecs, basis=[ [...], [...], [...]] ,
metal-like_sub, C-like_sub1, C-like_sub2 = lat.sublattices
According to my understanding the conservation law would be something
norbs=[6, 2, 2]) 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