Berry phase of a system periodic in 1 direction
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_nku_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. How can we get u_n(k) with a good resolution of k, say for 100 points in the BZ ? Is this something which can be easily done in Kwant ? Code: def make_1D_zigzag(N=7,t=1): syst = kwant.Builder(kwant.TranslationalSymmetry(Zigzag.prim_vecs[0])) syst[Zigzag.shape((lambda pos: pos[1] >0 and pos[1] < get_width(N)),(0,0))] = 2*t syst[Zigzag.neighbors()] = t return syst lead = make_1D_zigzag(N=N,t=2); lead = lead.finalized() prop_modes=lead.modes()[0] u_nk = prop_modes.wave_functions Thanks a lot for your help! Srilok Srinivasan Graduate Student Mechanical Engineering Iowa State University, Ames, IA
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_nku_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.kwantproject.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
Thanks Joe, That was very helpful. Regards, Srilok Srinivasan On Fri, Feb 15, 2019 at 1:03 PM Joseph Weston <joseph.weston08@gmail.com> wrote:
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_nku_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.kwantproject.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
 Srilok Srinivasan Graduate Student Mechanical Engineering Iowa State University, Ames, IA
participants (2)

Joseph Weston

Srilok Srinivasan