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.zhou@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