Hi,

On 2/15/19 6:42 PM, Srilok Srinivasan wrote:
Dear Kwant users and developers,

Is there a way to calculate the integral(< u_nk | d_k(u_nk)>dk)  across the 1D BZ of a system periodic in one direction. Here u_nk is the periodic part of the Bloch wave function corresponding to band n. I am trying to compute this for a simple system of graphene nanoribbon.

I am trying compute the gauge independent value of the above integral using a "1D Wilsoon loop" where the integral is approximately equal to the product of <u_nk|u_n(k+1) >  for all k across the BZ.  I defined the unit cell of the nanoribbon as a lead and tried to get the u_nk as the propagating modes using leads.modes() method (I have pasted the code below) but the resolution in k is too large - only 4 momenta across the BZ.

'lead.modes' computes all the modes at a given energy (0 by default). This is probably not what you want. What you really want is to compute the eigenvectors of H(k) for different k. 'kwant.physics.Bands' does this internally, but in Kwant 1.3 it doesn't give you access to the eigenvectors (just an oversight on our part).

We're in the process of releasing Kwant 1.4, where Bands has been modified to also return the eigenvectors, so you could wait to use that (you can track our progress here: https://gitlab.kwant-project.org/kwant/kwant/issues/275). Alternatively you can just construct H(k) = h + v exp(ik) + v^dagger exp(-ik) where h is 'lead.cell_hamiltonian()' and v is 'lead.inter_cell_hopping()' and diagonalize it yourself for different values of k.

Having said that, you need to be careful. To the best of my knowledge numerical eigensolvers will typically give you the eigenvectors in different gauges at different k values (i.e. there will be an arbitrary phase factor), so  naively calculating the derivative using some finite difference scheme might give nonsense (I'm not sure about this, though).


Happy Kwanting,


Joe