Hi Adel, It was very helpful, thank you for the comments!
Regards Patrik On 9 July 2017 at 10:39, Abbout Adel <abbout.a...@gmail.com> wrote: > Dear Patrik, > > Your program has some mistakes: > > 1) When you define a site, you need to use its coordinates, so no need to > multiply by the lattice constant > ie sys[lat(0,0,11)]=3 and not sys[lat(0,0,11*a]=3 > 2) You should not use the loop "for" when you define the lead. This means > that you added more than one site to your cell. Just define one site. > > 3) No need to add 2 extra sites to your system in order to attach the > leads. one site is sufficient. This is not a mistake but it makes your > program simpler. > > 4) You are using a 1D lead and your energies are starting from 0. So, in > order to have a conducting mode, you need to change the potential from 4t > to 2t. > > 5) Avoid energy 0 (the bottom of the band) when you calculate the > scattering matrix otherwise you will get an error ValueError: Input a > needs to be a square matrix. > start from 0.0001 for example. > > Now I want to make a comment on your problem. In kwant, the hamiltonian is > a graph. The position of the sites in your case are not important. only the > onsite potentials and the hoppings are relevent. In your case, you can put > all the sites in a line and this will change nothing since you do not have > a field which depend on space. Your geometry is not relevent. So, if you do > not intend to put an electric field or magnetic field which will add a > space dependence to your hoppings, your problem boils down to 1D uniform > chain and you will get conductance equal to 1 for all the energies (check > the program below.) > > Here is your program with the corrections: > I hope this helps. > Adel > ------------------------------------------------------------ > ----------------------------------- > > > import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D > from scipy.spatial import * from matplotlib import rcParams from numpy > import * from numpy.linalg import * import pickle import sys import os > import string import heapq import kwant import tinyarray > #pb.pltutils.use_style() from matplotlib import pyplot cl_1dl3=True if > cl_1dl3: a = 0.34 t = 1.0 N = 31 class > Amorphous(kwant.builder.SimpleSiteFamily): > def normalize_tag(self, tag): return tinyarray.array(tag, float) def > pos(self, tag): return tag atoms = Amorphous() syst = kwant.Builder() > #coordinates of a chiral chain imported manually sites=atoms(0.0, 0.0, > 0.0), atoms(-0.1336881039, 0.4114496766, 0.3400000000), > atoms(-0.4836881039, 0.6657395614, 0.6800000000), atoms(-0.9163118961, > 0.6657395614, 1.0200000000), atoms(-1.2663118961, 0.4114496766, > 1.3600000000), atoms(-1.4000000000, 0.0000000000, 1.7000000000), > atoms(-1.2663118961, -0.4114496766, 2.0400000000), atoms(-0.9163118961, > -0.6657395614, 2.3800000000), atoms(-0.4836881039, -0.6657395614, > 2.7200000000), atoms(-0.1336881039, -0.4114496766, 3.0600000000), > atoms(0.0000000000, -0.0000000000, 3.4000000000), atoms(-0.1336881039, > 0.4114496766, 3.7400000000), atoms(-0.4836881039, 0.6657395614, > 4.0800000000), atoms(-0.9163118961, 0.6657395614, 4.4200000000), > atoms(-1.2663118961, 0.4114496766, 4.7600000000), atoms(-1.4000000000, > 0.0000000000, 5.1000000000), atoms(-1.2663118961, -0.4114496766, > 5.4400000000), atoms(-0.9163118961, -0.6657395614, 5.7800000000), > atoms(-0.4836881039, -0.6657395614, 6.1200000000), atoms(-0.1336881039, > -0.4114496766, 6.4600000000), atoms(0.0000000000, -0.0000000000, > 6.8000000000), atoms(-0.1336881039, 0.4114496766, 7.1400000000), > atoms(-0.4836881039, 0.6657395614, 7.4800000000), atoms(-0.9163118961, > 0.6657395614, 7.8200000000), atoms(-1.2663118961, 0.4114496766, > 8.1600000000), atoms(-1.4000000000, 0.0000000000, 8.5000000000), > atoms(-1.2663118961, -0.4114496766, 8.8400000000), atoms(-0.9163118961, > -0.6657395614, 9.1800000000), atoms(-0.4836881039, -0.6657395614, > 9.5200000000), atoms(-0.1336881039, -0.4114496766, 9.8600000000), > atoms(0.0, 0.0, 10.2) #adding the onsite and hopping to the system for i in > range(N): syst[sites[i]] = 2 * t if i > 0: syst[sites[i], sites[i-1]] = -t > #syst[sites[N-1], sites[0]] = -t kwant.plot(syst) # If we want to attach to > vertical 1D chains to the system # we first add a slice of the down lead to > the scattering region lat=kwant.lattice.cubic(a) syst[lat(0, 0, -1)] = 2 * > t # now we add the hopping to the chiral chain syst[sites[0], lat(0, 0, > -1)] = -t # fWe make a regular down lead and attach it to the system > dn_lead = kwant.Builder(kwant.TranslationalSymmetry((0, 0, -a))) #for i > in range(2): dn_lead[lat(0, 0, -2)] = 2 * t dn_lead[lat.neighbors()] = -t > syst.attach_lead(dn_lead) syst[lat(0, 0, N)] = 2 * t syst[lat(0, 0, N), > sites[N-1]] = -t # finally we make a regular lead and attach it to the top > up_lead = kwant.Builder(kwant.TranslationalSymmetry((0, 0, a))) #for i in > range(N, N+2): up_lead[lat(0, 0, 11)] = 2 * t up_lead[lat.neighbors()] = -t > syst.attach_lead(up_lead) kwant.plot(syst) trans=True if trans: syst = > syst.finalized() energies = [] data = [] for ie in range(1,100): energy = > ie * 0.01 smatrix = kwant.smatrix(syst, energy=energy) > energies.append(energy) data.append(smatrix.transmission(1, 0)) > pyplot.figure() pyplot.plot(energies, data) pyplot.ylim([0,1.2]) > pyplot.xlabel("energy [t]") pyplot.ylabel("conductance [e^2/h]") > pyplot.show() > > On Fri, Jul 7, 2017 at 6:01 PM, Patrik Arvoy <arv...@gmail.com> wrote: > >> >> Hi Anton, >> >> Thank you for the reply! >> I used your suggestion to attach two 1D leads along the z axis to a >> chiral 1D chain. >> >> I inserted my code in the following and added comments to each part. >> >> I have two questions: >> 1- I successfully add a 1D chain to the lower part of the chiral system >> but >> when I try to add a 1D chain as the upper lead to the top of the system, >> it is automatically added >> somewhere in the middle, which is not clear to me why. >> >> 2- How can I avoid zero conductance? >> >> Thanks in advance >> Patrik >> >> >> ---------------------------------------------------------- >> import matplotlib.pyplot as plt >> from mpl_toolkits.mplot3d import Axes3D >> from scipy.spatial import * >> from matplotlib import rcParams >> from numpy import * >> from numpy.linalg import * >> import pickle >> import sys >> import os >> import string >> import heapq >> import kwant >> import tinyarray >> pb.pltutils.use_style() >> >> >> >> cl_1dl3=True >> if cl_1dl3: >> a = 0.34 >> t = 1.0 >> N = 31 >> >> >> class Amorphous(kwant.builder.SimpleSiteFamily): >> def normalize_tag(self, tag): >> return tinyarray.array(tag, float) >> >> def pos(self, tag): >> return tag >> >> >> atoms = Amorphous() >> syst = kwant.Builder() >> #coordinates of a chiral chain imported manually >> sites=atoms(0.0, 0.0, 0.0), atoms(-0.1336881039, 0.4114496766, >> 0.3400000000), atoms(-0.4836881039, 0.6657395614, 0.6800000000), >> atoms(-0.9163118961, 0.6657395614, 1.0200000000), atoms(-1.2663118961, >> 0.4114496766, 1.3600000000), atoms(-1.4000000000, 0.0000000000, >> 1.7000000000), atoms(-1.2663118961, -0.4114496766, 2.0400000000), >> atoms(-0.9163118961, -0.6657395614, 2.3800000000), atoms(-0.4836881039, >> -0.6657395614, 2.7200000000), atoms(-0.1336881039, -0.4114496766, >> 3.0600000000), atoms(0.0000000000, -0.0000000000, 3.4000000000), >> atoms(-0.1336881039, 0.4114496766, 3.7400000000), atoms(-0.4836881039, >> 0.6657395614, 4.0800000000), atoms(-0.9163118961, 0.6657395614, >> 4.4200000000), atoms(-1.2663118961, 0.4114496766, 4.7600000000), >> atoms(-1.4000000000, 0.0000000000, 5.1000000000), atoms(-1.2663118961, >> -0.4114496766, 5.4400000000), atoms(-0.9163118961, -0.6657395614, >> 5.7800000000), atoms(-0.4836881039, -0.6657395614, 6.1200000000), >> atoms(-0.1336881039, -0.4114496766, 6.4600000000), atoms(0.0000000000, >> -0.0000000000, 6.8000000000), atoms(-0.1336881039, 0.4114496766, >> 7.1400000000), atoms(-0.4836881039, 0.6657395614, 7.4800000000), >> atoms(-0.9163118961, 0.6657395614, 7.8200000000), atoms(-1.2663118961, >> 0.4114496766, 8.1600000000), atoms(-1.4000000000, 0.0000000000, >> 8.5000000000), atoms(-1.2663118961, -0.4114496766, 8.8400000000), >> atoms(-0.9163118961, -0.6657395614, 9.1800000000), atoms(-0.4836881039, >> -0.6657395614, 9.5200000000), atoms(-0.1336881039, -0.4114496766, >> 9.8600000000), atoms(0.0, 0.0, 10.2) >> >> #adding the onsite and hopping to the system >> for i in range(N): >> syst[sites[i]] = 4 * t >> if i > 0: >> syst[sites[i], sites[i-1]] = -t >> syst[sites[N-1], sites[0]] = -t >> kwant.plot(syst) >> >> # If we want to attach to vertical 1D chains to the system >> # we first add a slice of the down lead to the scattering region >> lat=kwant.lattice.cubic(a) >> >> for i in range(2): #number of atoms added to the bottom of the >> chiral chain >> syst[lat(0, 0, -(i+1)*a)] = 4 * t >> syst[lat.neighbors()] = -t >> # now we add the hopping to the chiral chain >> syst[sites[0], lat(0, 0, -a)] = -t >> kwant.plot(syst) >> >> # fWe make a regular down lead and attach it to the system >> dn_lead = kwant.Builder(kwant.TranslationalSymmetry((0, 0, -a))) >> for i in range(2): >> dn_lead[lat(0, 0, -(i+1)*a)] = 4 * t >> dn_lead[lat.neighbors()] = -t >> syst.attach_lead(dn_lead) >> kwant.plot(syst) >> >> >> >> #Here is wwhere the problem arises!!! >> #I want to add a similar 1D chain to the top of the chiral system >> #but instead it is automatically added somewhere in the middle. >> >> >> >> for i in range(N, N+2): #number of atoms added to the top >> syst[lat(0, 0, i*a)] = 4 * t >> syst[lat.neighbors()] = -t >> # now we add the hopping to the systeml >> syst[lat(0, 0, N*a), sites[N-1]] = -t >> kwant.plot(syst) >> >> # finally we make a regular lead and attach it to the top >> up_lead = kwant.Builder(kwant.TranslationalSymmetry((0, 0, a))) >> for i in range(N, N+2): >> up_lead[lat(0, 0, i*a)] = 4 * t >> up_lead[lat.neighbors()] = -t >> syst.attach_lead(up_lead) >> >> kwant.plot(syst) >> >> trans=True >> if trans: >> syst = syst.finalized() >> energies = [] >> data = [] >> >> for ie in range(0,100): >> energy = ie * 0.01 >> smatrix = kwant.smatrix(syst, energy) >> energies.append(energy) >> data.append(smatrix.transmission(1, 0)) >> pyplot.figure() >> pyplot.plot(energies, data) >> pyplot.xlabel("energy [t]") >> pyplot.ylabel("conductance [e^2/h]") >> pyplot.show() >> >> >> On 6 July 2017 at 18:13, Anton Akhmerov <anton.akhmerov...@gmail.com> >> wrote: >> >>> Hi Patrik, >>> >>> You can use site coordinates that don't belong to any lattice. For >>> that you need to define your own SiteFamily, see for example the >>> script below that achieves this goal. >>> >>> ------------------- >>> from matplotlib import pyplot >>> import kwant >>> import tinyarray >>> >>> class Amorphous(kwant.builder.SimpleSiteFamily): >>> def normalize_tag(self, tag): >>> return tinyarray.array(tag, float) >>> >>> def pos(self, tag): >>> return tag >>> >>> >>> atoms = Amorphous() >>> >>> syst = kwant.Builder() >>> sites = atoms(0.01, 0.05), atoms(1.01, -.5) >>> syst[sites[0]] = syst[sites[1]] = 2 >>> syst[sites[1], sites[0]] = 1 >>> >>> kwant.plot(syst) >>> --------------------- >>> >>> Of course it's now your responsibility to specify the Hamiltonian, >>> leads, attaching leads, etc. >>> >>> Best, >>> Anton >>> >>> On Thu, Jul 6, 2017 at 4:12 PM, Patrik Arvoy <arv...@gmail.com> wrote: >>> > >>> > Dear users and developers, >>> > >>> > I was wondering if I can import the coordinates of a scattering region >>> > without any particular symmetry and compute the conductance via kwant. >>> > If yes, how does one do that? >>> > Let's say the scattering region does not have any symmetry after >>> optimizing >>> > the structure via MD or ... and I have a list of coordinates of all the >>> > sites. >>> > I appreciate any help. >>> > >>> > Regards >>> > Patrik >>> >> >> > > > -- > Abbout Adel >