[Wannier] position matrix (dipole transition matrix) printed out in wannier
Liping Chen
liping.chen at rochester.edu
Thu Jan 16 15:39:41 CET 2014
Dear Ivo,
Thank you very much for your reply. I've had a look at the subroutine get_AA_R. I want to make sure with you that near the end of the subroutine there are
############################################################
call fourier_q_to_R(AA_q(:,:,:,1),AA_R(:,:,:,1))
call fourier_q_to_R(AA_q(:,:,:,2),AA_R(:,:,:,2))
call fourier_q_to_R(AA_q(:,:,:,3),AA_R(:,:,:,3))
############################################################
AA_R(:,:,:,1), AA_R(:,:,:,2) and AA_R(:,:,:,3) are the position matrix elements <0m|r|Rn> I want, right?
Here, I also have a question about the idir = 1, 2, 3. Are these three directions along the three lattice vectors? If so, what about when the lattice vectors are not orthogonal?
Thanks,
Liping
----- Original Message -----
From: "Ivo Souza" <ivo_souza at ehu.es>
To: "Liping Chen" <liping.chen at rochester.edu>
Cc: wannier at quantum-espresso.org
Sent: Thursday, January 16, 2014 3:43:10 AM
Subject: Re: [Wannier] position matrix (dipole transition matrix) printed out in wannier
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
> https://urldefense.proofpoint.com/v1/url?u=http://www.democritos.it/mailman/listinfo/wannier&k=p4Ly7qpEBiYPBVenR9G2iQ%3D%3D%0A&r=MhxMznMChIKt4IuapbjnvwFAOKg44L9%2FDsTFLScyNxw%3D%0A&m=LrMVtMdPoy5Xhv0RjvETLxTHjF8P6qJE8zOW9sqIC2w%3D%0A&s=d94ca4d5db473173648561905709bdd4b2f1c6d9fdd616d6d14989568372a2ec
>
More information about the Wannier
mailing list