[Wannier] position matrix (dipole transition matrix) printed out in wannier

Ivo Souza ivo_souza at ehu.es
Thu Jan 16 09:43:10 CET 2014


Dear Liping,

  There is one other place in the wannier90 package where the
Wannier-basis position matrix elements <0m|r|Rn> are calculated: the
subroutine get_AA_R in src/postw90/get_oper.F90

  (Those matrix elements are extensively used in the "berry" module of
postw90, because their Fourier transform gives the so-called "Berry
connection matrix" A_{mn}(k).)

  You might want to take a look into that subroutine, and see if you can
re-use it for your purposes.

  Best,

  Ivo

On Wed, 15 Jan 2014, Liping Chen wrote:

> Dear Wannier users,
>
> I need to get the info of dipole transition matrix <i|er|j>=e<i|r|j>. So I just need to get the position matrix <i|r|j>. But it seems that there is no way to ask wannier to print out the position matrix in seedname.win. I find that the matrix elements of r2 between WF can be printed out by setting WRITE_R2MN = T. And the codes for writing the matrix elements of r2 are like this:
> ###########################################################################
>     open(r2mnunit,file=trim(seedname)//'.r2mn',form='formatted',err=158)
>     do nw1 = 1, num_wann
>        do nw2 = 1, num_wann
>           r2ave_mn = 0.0_dp
>           delta = 0.0_dp
>           if (nw1.eq.nw2) delta = 1.0_dp
>           do nkp = 1, num_kpts
>              do nn = 1, nntot
>                 r2ave_mn = r2ave_mn + wb(nn) * &
>                      ! [GP-begin, Apr13, 2012: corrected sign inside "real"]
>                      ( 2.0_dp * delta - real(m_matrix(nw1,nw2,nn,nkp) + &
>                      conjg(m_matrix(nw2,nw1,nn,nkp)),kind=dp) )
>                      ! [GP-end]
>              enddo
>           enddo
>           r2ave_mn = r2ave_mn / real(num_kpts,dp)
>           write (r2mnunit, '(2i6,f20.12)') nw1, nw2, r2ave_mn
>        enddo
>     enddo
>     close(r2mnunit)
> ###########################################################################
>
> There should be some similarities for calculating r2ave and the above r2. I've found the codes to calculate rave, rave2 and r2ave in subroutine wann_omega.
> ##########################################################################################
>     do nkp = 1, num_kpts
>        do nn = 1, nntot
>           do n = 1, num_wann
>              ! Note that this ln_tmp is defined differently wrt the one in wann_domega
>              ln_tmp(n,nn,nkp)=( aimag(log(csheet(n,nn,nkp) &
>                      * m_matrix(n,n,nn,nkp))) - sheet(n,nn,nkp) )
>           end do
>       end do
>     end do
>
>
>     rave  = 0.0_dp
>     do iw = 1, num_wann
>        do ind = 1, 3
>           do nkp = 1, num_kpts
>              do nn = 1, nntot
>                 rave(ind,iw) = rave(ind,iw) + wb(nn) * bk(ind,nn,nkp) &
>                       *ln_tmp(iw,nn,nkp)
>              enddo
>           enddo
>        enddo
>     enddo
>     rave = -rave/real(num_kpts,dp)
>
>     rave2 = 0.0_dp
>     do iw = 1, num_wann
>        rave2(iw) = sum(rave(:,iw)*rave(:,iw))
>     enddo
>
>     r2ave = 0.0_dp
>     do iw = 1, num_wann
>        do nkp = 1, num_kpts
>           do nn = 1, nntot
>              mnn2 = real(m_matrix(iw,iw,nn,nkp)*conjg(m_matrix(iw,iw,nn,nkp)),kind=dp)
>              r2ave(iw) = r2ave(iw) + wb(nn) * ( 1.0_dp - mnn2 + ln_tmp(iw,nn,nkp)**2 )
>           enddo
>        enddo
>     enddo
>     r2ave = r2ave/real(num_kpts,dp)
> ##########################################################################################
> It's true the calculation of r2ave and r2 are similar. But why there is an extra term of "ln_tmp(iw,nn,nkp)**2" for r2ave but not for r2?
>
> What should I do to calculate r?
> ###########################################################################
>     open(rmnunit,file=trim(seedname)//'.rmn',form='formatted',err=158)
>     do nw1 = 1, num_wann
>        do nw2 = 1, num_wann
>           rave_mn = 0.0_dp
>           delta = 0.0_dp
>           if (nw1.eq.nw2) delta = 1.0_dp
>           do nkp = 1, num_kpts
>              do nn = 1, nntot
>                 rave_mn = rave_mn + wb(nn) * ?????? (What should I put here?)
>              enddo
>           enddo
>           rave_mn = rave_mn / real(num_kpts,dp)
>           write (rmnunit, '(2i6,f20.12)') nw1, nw2, rave_mn
>        enddo
>     enddo
>     close(rmnunit)
> ###########################################################################
>
> Thanks,
>
> Liping Chen
> Department of Chemistry
> University of Rochester
> _______________________________________________
> Wannier mailing list
> Wannier at quantum-espresso.org
> http://www.democritos.it/mailman/listinfo/wannier
>



More information about the Wannier mailing list