Dear Zhou,

You question is about the transition of the bulk system which of course
needs to  get the resolved transmission T(E,ky).

To better explain this problem, imagine you have a uniform system with two
leads and width =W. You can get the transmission for each mode T(E,m).
 (the modes do not mix since the system is uniform. The conductance is from
a mode m to the same mode m).
here m actually refers the quantized  wavenumber ky=m pi/W.
When W becomes infinite, ky becomes a continuous variable and hence T(E,m)
becomes T(E, ky),  (with some factor due to the variable change).
So if you want an approximated result just take a system with W very large
and get T(E,m). (Let us suppose there are no edge states)

If you wan the exact result, you need to do as follow:
1) Define a system with a translational symmetry in 2D.
2) wraparound the system to get rid of the symmetry in the y direction.
3) do the sea thing with the leads and then attach them.
4) Now, ky becomes a parameter in your scattering matrix.

The code below give you a simple example, with the theoretical
 verification.

I hope this helps
Adel


################################################################################
from numpy import array,linspace,sqrt,sin,cos,pi,exp,trapz,arccos
import kwant
from matplotlib import pyplot
lat=kwant.lattice.square()
sym1=kwant.TranslationalSymmetry((0,1))
sys=kwant.Builder(sym1)
def sys_pot(site,vg):
    return vg
sys[lat(0,0)]=sys_pot
sys[lat.neighbors()]=-1
# in the following put (0,1) first like for sys.
sym2=kwant.TranslationalSymmetry((0,1),(1,0))
lead=kwant.Builder(sym2)
def lead_pot(site,vl):
    return vl
lead[lat(0,0)]=lead_pot
lead[lat.neighbors()]=-1

sys=kwant.wraparound.wraparound(sys,coordinate_names='yxz')
lead=kwant.wraparound.wraparound(lead,keep=1,coordinate_names='yxz')
sys.attach_lead(lead)
sys.attach_lead(lead.reversed())

def Trans(E,vg):
    transmission=[]
    Ky=linspace(0,pi,100)
    params={"k_y": 0,"vg":vg, "vl":0}
    vg,vl=0,0
    for ky in Ky :
        params["k_y"]=ky

        Sm=kwant.smatrix(sys.finalized(),E,params=params)

        transmission.append(Sm.transmission(0,1))
    return trapz(transmission,Ky)

Energies=linspace(-2,2,20)
Result=[]   #for vg=0
for E in Energies:
    Result.append(Trans(E,0))
    #Result.append(Trans(E,0.3)) #if you want vg=0.3

pyplot.plot(Energies,Result,'ro')
# theoretical expected transmission
def T(E):
    return arccos(-1+abs(E/2))
Energies=linspace(-2,2,200)
pyplot.plot(Energies,T(Energies))
pyplot.show()
###############################################################################################################



On Mon, May 25, 2020 at 1:34 AM Zhou Jiaqi <jiaqi.z...@uclouvain.be> wrote:

> Dear all,
>
> We all know that it is easy to realize the energy-resolved transmission
> spectrum using Kwant. I am looking for the method to realize
> kpoint-resolved transmission spectrum using Kwant, like the output of
> non-equilibrium Greens function - density functional theory (NEGF-DFT) in
> the following link :
>
> https://www.researchgate.net/figure/shows-that-the-features-of-k-resolved-transmission-are-different-from-those-of-the_fig4_326818698
>
> I note that we can use “params” to use the selected kpoint in
> 'kwant_model.hamiltonian_submatrix'. Take Gamma (0, 0, 0) as an example :
>
> Input :
> kwant_model.hamiltonian_submatrix(params={'k_x': 0, 'k_y': 0, 'k_z': 0})
>
> Output : (the hamiltonian at Gamma kpoint)
> array([[-0.91848142+0.j        , -3.13863545+0.05174286j,
> 0.01464058-0.12995645j,  5.49753359+1.2518773j ],
>           [-3.13863545-0.05174286j, -0.91858637+0.j,
> -5.63827375-0.00282617j,  0.01464063-0.1299569j  ],
>           [ 0.01464058+0.12995645j, -5.63827375+0.00282617j,
> -0.91851442+0.j             , -3.13862945+0.05174286j],
>           [ 5.49753359-1.2518773j ,  0.01464063+0.1299569j ,
>  -3.13862945-0.05174286j, -0.91857308+0.j               ]])
>
> Then after diagonalization we can get eigenvalues at Gamma point and
> k-resolved band.
>
> I wonder if we can use this method to get k-resolved transmission
> spectrum. I tried the following instruction :
>
> kwant.smatrix(kwant_model, params={'k_x': 0, 'k_y': 0, 'k_z': 0})
>
> However, it does not work, i.e., the output does not vary with different
> kpoint (I am sure it should vary in physics). So here is the question: how
> to (maybe use ‘params’ in SMatrix) study transport at different kpoint
> using Kwant?
>
> Any suggestions will be greatly appreciated, thanks a lot!
>
> Sincerely,
> Jiaqi
>


-- 
Abbout Adel

Reply via email to