2003-01-20 05:58:50 +08:00
|
|
|
!
|
2003-01-28 20:28:11 +08:00
|
|
|
! Copyright (C) 2003 PWSCF group
|
2003-01-20 05:58:50 +08:00
|
|
|
! 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 cg_setupdgc
|
|
|
|
!-----------------------------------------------------------------------
|
|
|
|
! Setup all arrays needed in the gradient correction case
|
|
|
|
! This version requires on input allocated array
|
|
|
|
!
|
2004-01-23 23:08:03 +08:00
|
|
|
USE kinds, only: DP
|
2003-01-20 05:58:50 +08:00
|
|
|
use pwcom
|
|
|
|
use cgcom
|
|
|
|
use funct
|
|
|
|
!
|
|
|
|
implicit none
|
|
|
|
integer k, is
|
|
|
|
real(kind=DP) &
|
|
|
|
& grho2(2), rh, zeta, grh2, epsr, epsg, fac, &
|
|
|
|
& sx,sc,v1x,v2x,v1c,v2c,vrrx,vsrx,vssx, &
|
|
|
|
& vrrc,vsrc,vssc, &
|
|
|
|
& v1xup,v1xdw,v2xup,v2xdw, &
|
|
|
|
& v1cup,v1cdw, &
|
|
|
|
& vrrxup,vrrxdw,vrsxup,vrsxdw,vssxup,vssxdw, &
|
|
|
|
& vrrcup,vrrcdw,vrscup,vrscdw, &
|
|
|
|
& vrzcup,vrzcdw
|
|
|
|
!
|
|
|
|
parameter (epsr=1.0d-6, epsg=1.0d-10)
|
|
|
|
!
|
|
|
|
if (igcx.eq.0 .and. igcc.eq.0) return
|
|
|
|
call start_clock('setup_dgc')
|
|
|
|
!
|
2003-09-18 05:50:03 +08:00
|
|
|
dvxc_rr(:,:,:) = 0.d0
|
|
|
|
dvxc_sr(:,:,:) = 0.d0
|
|
|
|
dvxc_ss(:,:,:) = 0.d0
|
|
|
|
dvxc_s (:,:,:) = 0.d0
|
|
|
|
grho (:,:,:) = 0.d0
|
2003-01-20 05:58:50 +08:00
|
|
|
!
|
|
|
|
! add rho_core
|
|
|
|
!
|
2004-04-03 21:24:17 +08:00
|
|
|
fac=1.d0/dble(nspin)
|
2003-01-20 05:58:50 +08:00
|
|
|
if (nlcc_any) then
|
|
|
|
do is=1,nspin
|
|
|
|
do k=1,nrxx
|
|
|
|
rho(k,is)=rho(k,is)+ rho_core(k)*fac
|
|
|
|
enddo
|
|
|
|
enddo
|
|
|
|
endif
|
|
|
|
do is=1,nspin
|
|
|
|
call gradient (nrx1,nrx2,nrx3,nr1,nr2,nr3,nrxx,rho(1,is), &
|
|
|
|
ngm,g,nl,alat,grho(1,1,is))
|
|
|
|
enddo
|
|
|
|
!
|
|
|
|
if (nspin.eq.1) then
|
|
|
|
do k = 1,nrxx
|
|
|
|
grho2(1)=grho(1,k,1)**2+grho(2,k,1)**2+grho(3,k,1)**2
|
|
|
|
if (abs(rho(k,1)).gt.epsr.and.grho2(1).gt.epsg) then
|
|
|
|
call gcxc(rho(k,nspin),grho2,sx,sc,v1x,v2x,v1c,v2c)
|
|
|
|
call dgcxc(rho(k,nspin),grho2,vrrx,vsrx,vssx,vrrc,vsrc,vssc)
|
|
|
|
dvxc_rr(k,1,1) = e2 * ( vrrx + vrrc )
|
|
|
|
dvxc_sr(k,1,1) = e2 * ( vsrx + vsrc )
|
|
|
|
dvxc_ss(k,1,1) = e2 * ( vssx + vssc )
|
|
|
|
dvxc_s (k,1,1) = e2 * ( v2x + v2c )
|
|
|
|
endif
|
|
|
|
end do
|
|
|
|
else
|
|
|
|
do k = 1,nrxx
|
|
|
|
grho2(2)=grho(1,k,2)**2+grho(2,k,2)**2+grho(3,k,2)**2
|
|
|
|
rh=rho(k,1)+rho(k,2)
|
|
|
|
grh2= (grho(1,k,1)+grho(1,k,2))**2 &
|
|
|
|
+ (grho(2,k,1)+grho(2,k,2))**2 &
|
|
|
|
+ (grho(3,k,1)+grho(3,k,2))**2
|
|
|
|
!
|
|
|
|
call gcx_spin(rho(k,1),rho(k,2),grho2(1),grho2(2),sx, &
|
|
|
|
v1xup,v1xdw,v2xup,v2xdw)
|
|
|
|
!
|
|
|
|
call dgcxc_spin(rho(k,1),rho(k,2),grho(1,k,1),grho(1,k,2), &
|
|
|
|
vrrxup,vrrxdw,vrsxup,vrsxdw,vssxup,vssxdw, &
|
|
|
|
vrrcup,vrrcdw,vrscup,vrscdw,vssc,vrzcup,vrzcdw)
|
|
|
|
!
|
|
|
|
if (rh.gt.epsr) then
|
|
|
|
zeta=(rho(k,1)-rho(k,2))/rh
|
|
|
|
call gcc_spin(rh,zeta,grh2,sc,v1cup,v1cdw,v2c)
|
|
|
|
!
|
|
|
|
dvxc_rr(k,1,1)=e2*(vrrxup+vrrcup+vrzcup*(1.d0-zeta)/rh)
|
|
|
|
dvxc_rr(k,1,2)=e2*(vrrcup-vrzcup*(1.d0+zeta)/rh)
|
|
|
|
dvxc_rr(k,2,1)=e2*(vrrcdw+vrzcdw*(1.d0-zeta)/rh)
|
|
|
|
dvxc_rr(k,2,2)=e2*(vrrxdw+vrrcdw-vrzcdw*(1.d0+zeta)/rh)
|
|
|
|
!
|
|
|
|
dvxc_s(k,1,1)=e2*(v2xup+v2c)
|
|
|
|
dvxc_s(k,1,2)=e2*v2c
|
|
|
|
dvxc_s(k,2,1)=e2*v2c
|
|
|
|
dvxc_s(k,2,2)=e2*(v2xdw+v2c)
|
|
|
|
else
|
|
|
|
dvxc_rr(k,1,1)=0.d0
|
|
|
|
dvxc_rr(k,1,2)=0.d0
|
|
|
|
dvxc_rr(k,2,1)=0.d0
|
|
|
|
dvxc_rr(k,2,2)=0.d0
|
|
|
|
!
|
|
|
|
dvxc_s(k,1,1)=0.d0
|
|
|
|
dvxc_s(k,1,2)=0.d0
|
|
|
|
dvxc_s(k,2,1)=0.d0
|
|
|
|
dvxc_s(k,2,2)=0.d0
|
|
|
|
endif
|
|
|
|
dvxc_sr(k,1,1)=e2*(vrsxup+vrscup)
|
|
|
|
dvxc_sr(k,1,2)=e2*vrscup
|
|
|
|
dvxc_sr(k,2,1)=e2*vrscdw
|
|
|
|
dvxc_sr(k,2,2)=e2*(vrsxdw+vrscdw)
|
|
|
|
!
|
|
|
|
dvxc_ss(k,1,1)=e2*(vssxup+vssc)
|
|
|
|
dvxc_ss(k,1,2)=e2*vssc
|
|
|
|
dvxc_ss(k,2,1)=e2*vssc
|
|
|
|
dvxc_ss(k,2,2)=e2*(vssxdw+vssc)
|
|
|
|
enddo
|
|
|
|
endif
|
|
|
|
if (nlcc_any) then
|
|
|
|
do is=1,nspin
|
|
|
|
do k=1,nrxx
|
|
|
|
rho(k,is)=rho(k,is)- rho_core(k)*fac
|
|
|
|
enddo
|
|
|
|
enddo
|
|
|
|
endif
|
|
|
|
call stop_clock('setup_dgc')
|
|
|
|
!
|
|
|
|
return
|
|
|
|
end subroutine cg_setupdgc
|