Added Engel-Vosko XC, courtesy of Guido Roma

git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@10800 c92efa57-630b-4861-b058-cf58834340f0
This commit is contained in:
giannozz 2014-03-13 17:37:20 +00:00
parent b02439b842
commit 13a55144da
2 changed files with 42 additions and 8 deletions

View File

@ -113,6 +113,7 @@ module funct
! "vdw-df3"="sla+pw+obk8+vdw1" = vdW-DF3
! "vdw-df4"="sla+pw+ob86+vdw1" = vdW-DF4
! "optbk88"="sla+pw+obk8" = optB88
! "ev93" = "sla+pw+evx+nogc" = Engel-Vosko
!
! Any nonconflicting combination of the following keywords is acceptable:
!
@ -164,6 +165,7 @@ module funct
! "b86b" Becke (1986) exchange igcx =22
! "obk8" optB88 exchange igcx =23
! "ob86" optB86b exchange igcx =24
! "evx" Engel-Vosko exchange igc = 25
!
! Gradient Correction on Correlation:
! "nogc" none igcc =0 (default)
@ -230,6 +232,7 @@ module funct
! m06l Y. Zhao and D. G. Truhlar, JCP 125, 194101 (2006)
! gau-pbe J.-W. Song, K. Yamashita, K. Hirao JCP 135, 071103 (2011)
! rVV10 R. Sabatini et al. Phys. Rev. B 87, 041108(R) (2013)
! ev93 Engel-Vosko, Phys. Rev. B 47, 13164 (1993)
!
! NOTE ABOUT HSE: there are two slight deviations with respect to the HSE06
! functional as it is in Gaussian code (that is considered as the reference
@ -279,7 +282,7 @@ module funct
!
! data
integer :: nxc, ncc, ngcx, ngcc, ncnl
parameter (nxc = 8, ncc =10, ngcx =24, ngcc = 12, ncnl=3)
parameter (nxc = 8, ncc =10, ngcx =25, ngcc = 12, ncnl=3)
character (len=4) :: exc, corr
character (len=4) :: gradx, gradc, nonlocc
dimension exc (0:nxc), corr (0:ncc), gradx (0:ngcx), gradc (0: ngcc), nonlocc (0: ncnl)
@ -291,7 +294,7 @@ module funct
data gradx / 'NOGX', 'B88', 'GGX', 'PBX', 'RPB', 'HCTH', 'OPTX',&
'TPSS', 'PB0X', 'B3LP','PSX', 'WCX', 'HSE', 'RW86', 'PBE', &
'META', 'C09X', 'SOX', 'M6LX', 'Q2DX', 'GAUP', 'PW86', 'B86B', &
'OBK8','OB86' /
'OBK8','OB86', 'EVX' /
data gradc / 'NOGC', 'P86', 'GGC', 'BLYP', 'PBC', 'HCTH', 'TPSS',&
'B3LP', 'PSC', 'PBE', 'META', 'M6LC', 'Q2DC' /
@ -642,6 +645,16 @@ CONTAINS
call set_dft_value (inlc,0) ! Default
dft_defined = .true.
! special case : Engel-Vosko
else if ( matches( 'EV93', dftout ) ) THEN
!
CALL set_dft_value( iexch, 1 ) !
CALL set_dft_value( icorr, 4 ) !
CALL set_dft_value( igcx, 25 )
CALL set_dft_value( igcc, 0)
call set_dft_value (inlc,0) ! Default
dft_defined = .true.
END IF
!
@ -1102,6 +1115,8 @@ CONTAINS
shortname_ = 'M06L'
else if (iexch_==1.and.icorr_==4.and.igcx_==17.and.igcc_==4) then
shortname_ = 'SOGGA'
else if (iexch_==1.and.icorr_==4.and.igcx_==25.and.igcc_==0) then
shortname_ = 'EV93'
else
shortname_ = ' '
end if
@ -1505,6 +1520,8 @@ subroutine gcxc (rho, grho, sx, sc, v1x, v2x, v1c, v2c)
call pbex (rho, grho, 5, sx, v1x, v2x)
elseif (igcx == 24) then ! 'optB86b'
call pbex (rho, grho, 6, sx, v1x, v2x)
elseif (igcx == 25) then ! 'ev93'
call pbex (rho, grho, 7, sx, v1x, v2x)
else
sx = 0.0_DP
v1x = 0.0_DP
@ -1616,13 +1633,15 @@ subroutine gcx_spin (rhoup, rhodw, grhoup2, grhodw2, &
v2xup = 2.0_DP * v2xup
v2xdw = 2.0_DP * v2xdw
elseif (igcx == 3 .or. igcx == 4 .or. igcx == 8 .or. &
igcx == 10 .or. igcx == 12 .or. igcx == 20) then
igcx == 10 .or. igcx == 12 .or. igcx == 20 .or. igcx == 25) then
! igcx=3: PBE, igcx=4: revised PBE, igcx=8: PBE0, igcx=10: PBEsol
! igcx=12: HSE, igcx=20: gau-pbe
! igcx=12: HSE, igcx=20: gau-pbe, igcx=25: ev93
if (igcx == 4) then
iflag = 2
elseif (igcx == 10) then
iflag = 3
elseif (igcx == 25) then
iflag = 7
else
iflag = 1
endif
@ -1844,12 +1863,15 @@ subroutine gcx_spin_vec(rhoup, rhodw, grhoup2, grhodw2, &
sx = 0.5_DP * (sxup + sxdw)
v2xup = 2.0_DP * v2xup
v2xdw = 2.0_DP * v2xdw
case(3,4,8,10,12)
! igcx=3: PBE, igcx=4: revised PBE, igcx=8 PBE0, igcx=10: PBEsol
case(3,4,8,10,12,25)
! igcx=3: PBE, igcx=4: revised PBE, igcx=8 PBE0, igcx=10: PBEsol,
! igcx=25: EV93
if (igcx == 4) then
iflag = 2
elseif (igcx == 10) then
iflag = 3
elseif (igcx == 25) then
iflag = 7
else
iflag = 1
endif

View File

@ -807,6 +807,7 @@ subroutine pbex (rho, grho, iflag, sx, v1x, v2x)
! iflag=4 PBEQ2D: L. Chiodo et al., PRL 108, 126402 (2012)
! iflag=5 optB88: Klimes et al., J. Phys. Cond. Matter, 22, 022201 (2010)
! iflag=6 optB86b: Klimes et al., Phys. Rev. B 83, 195131 (2011)
! iflag=7 ev: Engel and Vosko, PRB 47, 13164 (1991)
!
USE kinds, ONLY : DP
USE constants, ONLY : pi
@ -833,11 +834,13 @@ subroutine pbex (rho, grho, iflag, sx, v1x, v2x)
c2 = 3.093667726280136_DP, c5 = 4._DP * third, &
c6 = c2*2.51984210, c7=5._DP/6._DP, c8=0.8_DP ! (3pi^2)^(1/3)*2^(4/3)
! parameters of the functional
real(DP) :: k (6), mu(6)
real(DP) :: k (6), mu(6), ev(6)
! pbe rpbe pbesol pbeq2d optB88 optB86b
data k / 0.804_DP, 1.2450D0, 0.804_DP , 0.804_DP , 0.0 , 0.0 /, &
mu/ 0.21951_DP, 0.21951_DP, 0.12345679012345679012_DP, &
0.12345679012345679, 0.22 , 0.1234/
0.12345679012345679, 0.22 , 0.1234/, &
ev / 1.647127_DP, 0.980118_DP, 0.017399_DP, 1.523671_DP, 0.367229_DP, &
0.011282_DP / ! a and b parameters of Engel and Vosko
agrho = sqrt (grho)
kf = c2 * rho**third
dsg = 0.5_DP / kf
@ -866,6 +869,11 @@ subroutine pbex (rho, grho, iflag, sx, v1x, v2x)
elseif ( iflag == 6) then
p=mu(iflag)*s1*s1
fx = p / ( 1 + p )**c8
elseif ( iflag == 7) then
s=s2*s2
f1 = 1 + ev(1)*s2 + ev(2)*s + ev(3)*s*s2
f2 = 1 + ev(4)*s2 + ev(5)*s + ev(6)*s*s2
fx = f1 / f2 - 1
else
f1 = s2 * mu(iflag) / k (iflag)
f2 = 1._DP + f1
@ -894,6 +902,10 @@ subroutine pbex (rho, grho, iflag, sx, v1x, v2x)
dfx=2*fx/s1-fx/dfx1*(ab*c+ab*s1/sqrt(p*p+1)*c6)
elseif (iflag == 6) then
dfx=2*mu(iflag)*s1*fx*(1+(1-c8)*p)/(p*(1+p))
elseif (iflag == 7) then
dfx = ev(1) + 2*ev(2)*s2 + 3*ev(3)*s
dfx1 = ev(4) + 2*ev(5)*s2 + 3*ev(6)*s
dfx = 2 * s1 * ( dfx - f1*dfx1/f2 ) / f2
else
dfx1 = f2 * f2
dfx = 2._DP * mu(iflag) * s1 / dfx1