mirror of https://gitlab.com/QEF/q-e.git
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:
parent
b02439b842
commit
13a55144da
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue