! ! Copyright (C) 2003 PWSCF group ! This file is distributed under the terms of the ! GNU General Public License. See the file `License' ! in the root directory of the present distribution, ! or http://www.gnu.org/copyleft/gpl.txt . ! ! !---------------------------------------------------------------------- subroutine rhod2vkb(dyn0) !---------------------------------------------------------------------- ! ! calculate the electronic term: of the dynamical matrix ! #include "f_defs.h" USE ions_base, ONLY : nat, tau, ityp, ntyp => nsp use pwcom USE wavefunctions_module, ONLY: evc, psic USE uspp_param, only: nh use cgcom ! implicit none real(kind=DP) :: dyn0(3*nat,3*nat) ! integer :: i, ih, ibnd, na, nt, nu_i,nu_j,mu_i,mu_j, ir, ng, jkb, kpoint, & ipol, jpol, ijpol real(kind=DP) :: weight, fac, gtau real(kind=DP), allocatable :: dynloc(:,:), dynkb(:,:) complex(kind=DP), allocatable :: dvkb(:,:) real (kind=DP), allocatable :: becp(:,:), becp1(:,:,:), becp2(:,:,:) ! call start_clock('rhod2vkb') ! ! contribution from local potential ! allocate ( dynloc( 3*nat, nmodes)) dynloc (:,:) = 0.d0 do ir = 1,nrxx psic(ir) = rho(ir,current_spin) end do call cft3(psic,nr1,nr2,nr3,nrx1,nr2,nr3,-1) do nu_i = 1,nmodes if (has_equivalent( (nu_i-1)/3+1).eq.1 ) go to 10 do na = 1, nat mu_i = 3*(na-1) if ( u(mu_i+1,nu_i) .eq. 0.0 .and. & u(mu_i+2,nu_i) .eq. 0.0 .and. & u(mu_i+3,nu_i) .eq. 0.0 ) go to 11 do nu_j = 1,nmodes if ( u(mu_i+1,nu_j) .eq. 0.0 .and. & u(mu_i+2,nu_j) .eq. 0.0 .and. & u(mu_i+3,nu_j) .eq. 0.0 ) go to 12 do ng = 1,ngm gtau = tpi * ( g(1,ng)*tau(1,na) + & g(2,ng)*tau(2,na) + & g(3,ng)*tau(3,na) ) fac = omega * vloc(igtongl(ng),ityp(na)) * tpiba2 * & ( real(psic(nl(ng)))*cos(gtau) - & DIMAG(psic(nl(ng)))*sin(gtau) ) dynloc(nu_i,nu_j) = dynloc(nu_i,nu_j) + fac * & ( g(1,ng) * u(mu_i+1,nu_i) + & g(2,ng) * u(mu_i+2,nu_i) + & g(3,ng) * u(mu_i+3,nu_i) ) * & ( g(1,ng) * u(mu_i+1,nu_j) + & g(2,ng) * u(mu_i+2,nu_j) + & g(3,ng) * u(mu_i+3,nu_j) ) end do 12 continue end do 11 continue end do 10 continue end do #define GAMMA #ifdef GAMMA dynloc(:,:) = 2.d0 * dynloc(:,:) #endif #ifdef __PARA call reduce(3*nat*nmodes,dynloc) #endif ! ! contribution from nonlocal (Kleinman-Bylander) potential ! allocate (dynkb(3*nat,3*nat)) dynkb=0.d0 allocate ( dvkb( npwx, nkb)) allocate ( becp ( nkb, nbnd)) allocate ( becp1( nkb, nbnd, 3)) allocate ( becp2( nkb, nbnd, 6)) ! do kpoint = 1,nks ! the sum has four terms which can be reduced to two (note factor 2 in weight): ! ! sum_G sum_G' sum_j sum_l [ psi_j*(G) V_na,l(G)(-iGu_ipol) V^*_na,l(G')( iG'u_jpol) psi_j(G') ! sum_G sum_G' sum_j sum_l [ psi_j*(G) V_na,l(G) V^*_na,l(G') ( iG'u_ipol)( iG'u_jpol) psi_j(G') ! weight = 2.0*wk(kpoint) call gk_sort(xk(1,kpoint),ngm,g,ecutwfc/tpiba2,npw,igk,psic) if (nks.gt.1) call davcio(evc,lrwfc,iuwfc,kpoint,-1) ! call pw_gemm ('Y', nkb, nbnd, npw, vkb, npwx, evc, npwx, becp, nkb) ! ! becp(j,n) = sum_G [ V_n*(G) psi_j(G) ] n=(na,l) ! do ipol = 1, 3 do jkb = 1, nkb do i = 1,npw dvkb(i,jkb) = vkb(i,jkb) * cmplx(0.d0,-tpiba) * g(ipol,igk(i)) end do end do ! call pw_gemm ('Y', nkb, nbnd, npw, dvkb, npwx, evc, npwx, & becp1(1,1,ipol), nkb) ! ! becp1(j,n,ipol) = sum_G [ V_n*(G) (iG_ipol) psi_j(G) ] ! end do ijpol=0 do ipol = 1, 3 do jpol = ipol, 3 do jkb = 1, nkb do i = 1,npw dvkb(i,jkb) = vkb(i,jkb) * tpiba2 * g(ipol,igk(i))* g(jpol,igk(i)) end do end do ! ijpol=ijpol+1 call pw_gemm ('Y', nkb, nbnd, npw, dvkb, npwx, evc, npwx, & becp2(1,1,ijpol), nkb) ! ! becp2(j,n,ijpol) = sum_G [ V_n*(G) (-iG_ipol) (iG_jpol) psi_j(G) ] ! end do end do ! jkb = 0 do nt = 1, ntyp do na =1, nat if (ityp(na).eq.nt) then if (has_equivalent(na).eq.1 ) go to 20 ijpol = 0 do ipol = 1, 3 nu_i = 3*(na-1) + ipol do jpol = ipol, 3 nu_j = 3*(na-1) + jpol ijpol = ijpol + 1 do ibnd=1,nbnd do ih=1,nh(nt) dynkb(nu_i,nu_j) = dynkb(nu_i,nu_j) + & (-becp1(jkb+ih,ibnd,ipol)*becp1(jkb+ih,ibnd,jpol) & +becp2(jkb+ih,ibnd,ijpol)*becp(jkb+ih,ibnd) ) & * dvan(ih,ih,nt) * weight end do end do end do do jpol = 1, ipol-1 nu_j = 3*(na-1) + jpol dynkb(nu_i,nu_j) = dynkb(nu_j,nu_i) end do end do 20 continue jkb = jkb + nh(nt) end if end do end do end do ! deallocate ( becp2) deallocate ( becp1) deallocate ( becp ) deallocate ( dvkb) ! dyn0 (:,:) = 0.d0 ! do nu_i = 1,nmodes if (has_equivalent( (nu_i-1)/3+1).eq.0 ) then do nu_j=1,nmodes do mu_i=1,3*nat do mu_j=1,3*nat dyn0(nu_i,nu_j) = dyn0(nu_i,nu_j) + & dynkb(mu_i,mu_j)*u(mu_i,nu_i)*u(mu_j,nu_j) end do end do end do do nu_j=1,nmodes dyn0(nu_i,nu_j) = dyn0(nu_i,nu_j) + dynloc(nu_i,nu_j) end do end if end do deallocate(dynkb) deallocate(dynloc) ! call stop_clock('rhod2vkb') ! return end subroutine rhod2vkb