XClib - lda - scratch

This commit is contained in:
fabrizio22 2020-05-04 13:51:13 +02:00
parent c31896f5cc
commit 2f933d101e
42 changed files with 1419 additions and 897 deletions

View File

@ -114,7 +114,7 @@ makov_payne.o
LOBJS = \
entropy.o
QEMODS=../../Modules/libqemod.a ../../upflib/libupf.a ../../FFTXlib/libqefft.a ../../LAXlib/libqela.a ../../UtilXlib/libutil.a
QEMODS=../../Modules/libqemod.a ../../upflib/libupf.a ../../FFTXlib/libqefft.a ../../LAXlib/libqela.a ../../UtilXlib/libutil.a ../../XClib/libqeldaxc.a
TLDEPS= bindir libs mods

View File

@ -80,7 +80,7 @@ PWOBJS = ../../PW/src/libpw.a
W90LIB = ../../wannier90-3.1.0/libwannier.a
LRMODS = ../../LR_Modules/liblrmod.a
PWOBJS = ../../PW/src/libpw.a
QEMODS = ../../Modules/libqemod.a ../../KS_Solvers/libks_solvers.a \
QEMODS = ../../Modules/libqemod.a ../../KS_Solvers/libks_solvers.a ../../XClib/libqeldaxc.a \
../../upflib/libupf.a ../../FFTXlib/libqefft.a ../../dft-d3/libdftd3qe.a
LIBOBJS =../../LAXlib/libqela.a ../../UtilXlib/libutil.a ../../clib/clib.a

View File

@ -47,7 +47,7 @@ qpcorrections.o
QEMODS = ../../Modules/libqemod.a ../../FFTXlib/libqefft.a \
../../upflib/libupf.a ../../KS_Solvers/libks_solvers.a \
../../LAXlib/libqela.a ../../UtilXlib/libutil.a
../../LAXlib/libqela.a ../../UtilXlib/libutil.a ../../XClib/libqeldaxc.a
PWOBJS = ../../PW/src/libpw.a
PW4GWWOBJ = ../pw4gww/fft_custom.o ../pw4gww/stop_pp.o ../pw4gww/mp_wave_parallel.o
GWWOBJ = ../gww/libgww.a ../minpack/minpacklib.a

View File

@ -44,7 +44,7 @@ vcprim.o
QEMODS = ../../Modules/libqemod.a ../../FFTXlib/libqefft.a \
../../KS_Solvers/libks_solvers.a \
../../KS_Solvers/libks_solvers.a ../../XClib/libqeldaxc.a \
../../LAXlib/libqela.a ../../UtilXlib/libutil.a
LIBMIN= ../minpack/minpacklib.a

View File

@ -20,7 +20,7 @@ phq_readin.o \
solve_head.o
QEMODS = ../../Modules/libqemod.a ../../upflib/libupf.a \
../../KS_Solvers/libks_solvers.a \
../../KS_Solvers/libks_solvers.a ../../XClib/libqeldaxc.a \
../../FFTXlib/libqefft.a ../../LAXlib/libqela.a ../../UtilXlib/libutil.a \
../../dft-d3/libdftd3qe.a
LIBPWPH = ../../PHonon/PH/libph.a ../..//LR_Modules/liblrmod.a ../../PW/src/libpw.a

View File

@ -50,7 +50,7 @@ operator_1_vp.o \
operator_debug.o
QEMODS = ../../Modules/libqemod.a ../../upflib/libupf.a \
../../KS_Solvers/libks_solvers.a \
../../KS_Solvers/libks_solvers.a ../../XClib/libqeldaxc.a \
../../FFTXlib/libqefft.a ../../LAXlib/libqela.a \
../../UtilXlib/libutil.a ../../dft-d3/libdftd3qe.a
# dft-d3 required by xlf for obscure reasons

View File

@ -25,7 +25,7 @@ SIMPLEOBJS = \
QEMODS = ../../Modules/libqemod.a ../../FFTXlib/libqefft.a \
../../upflib/libupf.a ../../KS_Solvers/libks_solvers.a \
../../LAXlib/libqela.a ../../UtilXlib/libutil.a \
../../dft-d3/libdftd3qe.a
../../dft-d3/libdftd3qe.a ../../XClib/libqeldaxc.a
# dft-d3 required by xlf for obscure reasons
PWOBJS = ../../PW/src/libpw.a

View File

@ -56,7 +56,7 @@ LRMODS = ../../LR_Modules/liblrmod.a
PWOBJS = ../../PW/src/libpw.a
QEMODS = ../../Modules/libqemod.a ../../KS_Solvers/libks_solvers.a \
../../upflib/libupf.a ../../FFTXlib/libqefft.a ../../LAXlib/libqela.a\
../../UtilXlib/libutil.a ../../dft-d3/libdftd3qe.a
../../UtilXlib/libutil.a ../../dft-d3/libdftd3qe.a ../../XClib/libqeldaxc.a
TLDEPS= hplibs

View File

@ -175,7 +175,7 @@ pw4gwwlib : phlibs
if test -d GWW ; then \
( cd GWW ; $(MAKE) pw4gwwa || exit 1 ) ; fi
mods : libfox libutil libla libfft libupf libbeef libmbd
mods : libfox libutil libla libfft libupf libbeef libmbd librxc
( cd Modules ; $(MAKE) TLDEPS= all || exit 1 )
libks_solvers : libs libutil libla
@ -187,6 +187,9 @@ libla : liblapack libutil libcuda
libfft :
( cd FFTXlib ; $(MAKE) TLDEPS= all || exit 1 )
librxc :
( cd XClib ; $(MAKE) TLDEPS= all || exit 1 )
libutil :
( cd UtilXlib ; $(MAKE) TLDEPS= all || exit 1 )
@ -277,7 +280,7 @@ install :
clean :
touch make.inc
for dir in \
CPV LAXlib FFTXlib UtilXlib upflib Modules PP PW EPW KS_Solvers \
CPV LAXlib FFTXlib XClib UtilXlib upflib Modules PP PW EPW KS_Solvers \
NEB ACFDT COUPLE GWW XSpectra PWCOND dft-d3 \
atomic clib LR_Modules pwtools upflib \
dev-tools extlibs Environ TDDFPT PHonon HP GWW Doc GUI \

View File

@ -1,7 +1,8 @@
!
MODULE corr_gga !<GPU:corr_gga=>corr_gga_gpu>
!
USE corr_lda, ONLY : pw, pw_spin !<GPU:pw_spin=>pw_spin_d,pw=>pw_d,corr_lda=>corr_lda_gpu>
USE ldaxc_interfaces, ONLY: pw
USE corr_lda, ONLY : pw_spin !<GPU:pw_spin=>pw_spin_d,pw=>pw_d,corr_lda=>corr_lda_gpu>
!
CONTAINS
!

View File

@ -8,475 +8,10 @@
MODULE corr_lda !<GPU:corr_lda=>corr_lda_gpu>
USE ldaxc_interfaces, ONLY: pz
CONTAINS
!-------------------------------------------------------------------------
SUBROUTINE pz( rs, iflag, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! LDA parametrization from Monte Carlo DATA:
!
!! * iflag=1: J.P. Perdew and A. Zunger, PRB 23, 5048 (1981);
!! * iflag=2: G. Ortiz and P. Ballone, PRB 50, 1391 (1994).
!
USE kinds, ONLY: DP
!
IMPLICIT NONE
!
INTEGER, INTENT(IN) :: iflag !<GPU:VALUE>
!! see routine comments
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP) :: a(2), b(2), c(2), d(2), gc(2), b1(2), b2(2)
REAL(DP) :: lnrs, rs12, ox, dox
!
DATA a / 0.0311d0, 0.031091d0 /, b / -0.048d0, -0.046644d0 /, &
c / 0.0020d0, 0.00419d0 /, d / -0.0116d0, -0.00983d0 /
!
DATA gc / -0.1423d0, -0.103756d0 /, b1 / 1.0529d0, 0.56371d0 /, &
b2 / 0.3334d0, 0.27358d0 /
!
IF ( rs < 1.0d0 ) THEN
!
! high density formula
lnrs = LOG(rs)
!
ec = a(iflag)*lnrs + b(iflag) + c(iflag)*rs*lnrs + d(iflag)*rs
!
vc = a(iflag)*lnrs + ( b(iflag) - a(iflag)/3.d0 ) + 2.d0/3.d0 * &
c(iflag)*rs*lnrs + ( 2.d0*d(iflag) - c(iflag) )/3.d0*rs
ELSE
!
! interpolation formula
rs12 = SQRT(rs)
!
ox = 1.d0 + b1(iflag)*rs12 + b2(iflag)*rs
dox = 1.d0 + 7.d0/6.d0*b1(iflag)*rs12 + 4.d0/3.d0*b2(iflag)*rs
!
ec = gc(iflag)/ox
vc = ec*dox/ox
!
ENDIF
!
RETURN
!
END SUBROUTINE pz
!
!
!-----------------------------------------------------------------------
SUBROUTINE pzKZK( rs, ec, vc, vol ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! LDA parametrization from Monte Carlo DATA:
!
!! * iflag=1: J.P. Perdew and A. Zunger, PRB 23, 5048 (1981)
!! * iflag=2: G. Ortiz and P. Ballone, PRB 50, 1391 (1994)
!
USE kinds, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
REAL(DP) :: vol !<GPU:VALUE>
!! volume element
!
! ... local variables
!
INTEGER :: iflag, kr
REAL(DP) :: ec0(2), vc0(2), ec0p
REAL(DP) :: a(2), b(2), c(2), d(2), gc(2), b1(2), b2(2)
REAL(DP) :: lnrs, rs12, ox, dox, lnrsk, rsk
REAL(DP) :: a1, grs, g1, g2, g3, g4, dL, gh, gl, grsp
REAL(DP) :: f3, f2, f1, f0, pi
REAL(DP) :: D1, D2, D3, P1, P2, ry2h
!
DATA a / 0.0311_DP, 0.031091_DP /, b / -0.048_DP, -0.046644_DP /, &
c / 0.0020_DP, 0.00419_DP /, d / -0.0116_DP, -0.00983_DP /
!
DATA gc / -0.1423_DP, -0.103756_DP /, b1 / 1.0529_DP, 0.56371_DP /, &
b2 / 0.3334_DP, 0.27358_DP /
!
DATA a1 / -2.2037_DP /, g1 / 0.1182_DP/, g2 / 1.1656_DP/, g3 / -5.2884_DP/, &
g4 / -1.1233_DP /
!
DATA ry2h / 0.5_DP /
!
iflag = 1
pi = 4.d0 * ATAN(1.d0)
dL = vol**(1.d0/3.d0)
gh = 0.5d0 * dL / (2.d0 * pi)**(1.d0/3.d0)
gl = dL * (3.d0 / 2.d0 / pi)**(1.d0/3.d0)
!
rsk = gh
!
DO kr = 1, 2
!
lnrsk = LOG(rsk)
IF (rsk < 1.0d0) THEN
! high density formula
ec0(kr) = a(iflag) *lnrsk + b(iflag) + c(iflag) * rsk * lnrsk + d(iflag) * rsk
vc0(kr) = a(iflag) * lnrsk + (b(iflag) - a(iflag) / 3.d0) + 2.d0 / &
3.d0 * c (iflag) * rsk * lnrsk + (2.d0 * d (iflag) - c (iflag) ) &
/ 3.d0 * rsk
!
ELSE
! interpolation formula
rs12 = SQRT(rsk)
ox = 1.d0 + b1 (iflag) * rs12 + b2 (iflag) * rsk
dox = 1.d0 + 7.d0 / 6.d0 * b1 (iflag) * rs12 + 4.d0 / 3.d0 * &
b2 (iflag) * rsk
ec0(kr) = gc (iflag) / ox
vc0(kr) = ec0(kr) * dox / ox
!
ENDIF
!
grs = g1 * rsk * lnrsk + g2 * rsk + g3 * rsk**1.5d0 + g4 * rsk**2.d0
grsp = g1 * lnrsk + g1 + g2 + 1.5d0 * g3 * rsk**0.5d0 + 2.d0 * g4 * rsk
!
ec0(kr) = ec0(kr) + (-a1 * rsk / dL**2.d0 + grs / dL**3.d0) * ry2h
vc0(kr) = vc0(kr) + (-2.d0 * a1 * rsk / dL**2.d0 / 3.d0 + &
grs / dL**3.d0 - grsp * rsk / 3.d0 / dL**3.d0) * ry2h
!
rsk = rs
!
ENDDO
!
lnrs = LOG(rs)
!
IF (rs <= gh) THEN
ec = ec0(2)
vc = vc0(2)
ELSE
IF ( rs <= gl ) THEN
ec0p = 3.d0 * (ec0(1) - vc0(1)) / gh
P1 = 3.d0 * ec0(1) - gh * ec0p
P2 = ec0p
D1 = gl - gh
D2 = gl**2.d0 - gh**2.d0
D3 = gl**3.d0 - gh**3.d0
f2 = 2.d0 * gl**2.d0 * P2 * D1 + D2 * P1
f2 = f2 / (-(2.d0*gl*D1)**2.d0 + 4.d0*gl*D1*D2 - D2**2.d0 )
f3 = - (P2 + 2.d0*D1*f2) / (3.d0 * D2)
f1 = - (P1 + D2 * f2) / (2.d0 * D1)
f0 = - gl * (gl * f2 + 2.d0 * f1) / 3.d0
!
ec = f3 * rs**3.d0 + f2 * rs**2.d0 + f1 * rs + f0
vc = f2 * rs**2.d0 / 3.d0 + f1 * 2.d0 * rs / 3.d0 + f0
ELSE
ec = 0.d0
vc = 0.d0
ENDIF
ENDIF
!
!
RETURN
!
END SUBROUTINE pzKZK
!
!
!-----------------------------------------------------------------------
SUBROUTINE vwn( rs, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! S.H. Vosko, L. Wilk, and M. Nusair, Can. J. Phys. 58, 1200 (1980).
!
USE kinds, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP), PARAMETER :: a = 0.0310907d0, b = 3.72744d0, &
c = 12.9352d0, x0 = -0.10498d0
REAL(DP) :: q, f1, f2, f3, rs12, fx, qx, tx, tt
!
!
q = SQRT( 4.d0*c - b*b )
f1 = 2.d0*b/q
f2 = b*x0 / ( x0*x0 + b*x0 + c )
f3 = 2.d0*( 2.d0 * x0 + b ) / q
!
rs12 = SQRT(rs)
fx = rs + b*rs12 + c
qx = ATAN( q / (2.d0*rs12 + b) )
!
ec = a * ( LOG( rs/fx ) + f1*qx - f2*( LOG( (rs12 - x0)**2 / fx) &
+ f3*qx) )
!
tx = 2.d0*rs12 + b
tt = tx*tx + q*q
!
vc = ec - rs12*a / 6.d0*( 2.d0 / rs12 - tx/fx - 4.d0*b/tt - f2 * &
(2.d0 / (rs12 - x0) - tx/fx - 4.d0*(2.d0 * x0 + b)/tt) )
!
RETURN
!
END SUBROUTINE vwn
!
!
!-----------------------------------------------------------------------
SUBROUTINE vwn1_rpa( rs, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! S.H. Vosko, L. Wilk, and M. Nusair, Can. J. Phys. 58, 1200 (1980).
!
USE kinds, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP), PARAMETER :: a = 0.0310907_DP, b = 13.0720_DP, &
c = 42.7198_DP, x0 = -0.409286_DP
REAL(DP) :: q, f1, f2, f3, rs12, fx, qx, tx, tt
!
q = SQRT(4.d0*c - b*b)
f1 = 2.d0*b/q
f2 = b*x0 / (x0*x0 + b*x0 + c)
f3 = 2.d0 * (2.d0 * x0 + b) / q
!
rs12 = SQRT(rs)
fx = rs + b * rs12 + c
qx = ATAN(q / (2.d0 * rs12 + b) )
!
ec = a*( LOG(rs/fx) + f1*qx - f2*(LOG((rs12 - x0)**2/fx) + f3*qx) )
!
tx = 2.d0*rs12 + b
tt = tx*tx + q*q
!
vc = ec - rs12*a/6.d0*( 2.d0/rs12 - tx/fx - 4.d0*b/tt - f2 * &
(2.d0/(rs12 - x0) - tx/fx - 4.d0*(2.d0*x0 + b)/tt) )
!
!
RETURN
!
END SUBROUTINE vwn1_rpa
!
!
!-----------------------------------------------------------------------
SUBROUTINE lyp( rs, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! C. Lee, W. Yang, and R.G. Parr, PRB 37, 785 (1988).
!! LDA part only.
!
USE kinds, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP), PARAMETER :: a=0.04918d0, b=0.132d0*2.87123400018819108d0
REAL(DP), PARAMETER :: pi43=1.61199195401647d0
! pi43=(4pi/3)^(1/3)
REAL(DP), PARAMETER :: c=0.2533d0*pi43, d=0.349d0*pi43
REAL(DP) :: ecrs, ox
!
!
ecrs = b*EXP( -c*rs )
ox = 1.d0 / (1.d0 + d*rs)
!
ec = - a*ox*(1.d0 + ecrs)
vc = ec - rs/3.d0*a*ox*( d*ox + ecrs*(d*ox + c) )
!
RETURN
!
END SUBROUTINE lyp
!
!
!-----------------------------------------------------------------------
SUBROUTINE pw( rs, iflag, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! * iflag=1: J.P. Perdew and Y. Wang, PRB 45, 13244 (1992)
!! * iflag=2: G. Ortiz and P. Ballone, PRB 50, 1391 (1994)
!
USE kinds, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
INTEGER, INTENT(IN) :: iflag !<GPU:VALUE>
!! see routine comments
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP), PARAMETER :: a=0.031091d0, b1=7.5957d0, b2=3.5876d0, c0=a, &
c1=0.046644d0, c2=0.00664d0, c3=0.01043d0, d0=0.4335d0, &
d1=1.4408d0
REAL(DP) :: lnrs, rs12, rs32, rs2, om, dom, olog
REAL(DP) :: a1(2), b3(2), b4(2)
DATA a1 / 0.21370d0, 0.026481d0 /, b3 / 1.6382d0, -0.46647d0 /, &
b4 / 0.49294d0, 0.13354d0 /
!
! high- and low-density formulae implemented but not used in PW case
! (reason: inconsistencies in PBE/PW91 functionals).
!
IF ( rs < 1d0 .AND. iflag == 2 ) THEN
!
! high density formula
lnrs = LOG(rs)
ec = c0 * lnrs - c1 + c2 * rs * lnrs - c3 * rs
vc = c0 * lnrs - (c1 + c0 / 3.d0) + 2.d0 / 3.d0 * c2 * rs * &
lnrs - (2.d0 * c3 + c2) / 3.d0 * rs
!
ELSEIF ( rs > 100.d0 .AND. iflag == 2 ) THEN
!
! low density formula
ec = - d0 / rs + d1 / rs**1.5d0
vc = - 4.d0 / 3.d0 * d0 / rs + 1.5d0 * d1 / rs**1.5d0
!
ELSE
!
! interpolation formula
rs12 = SQRT(rs)
rs32 = rs * rs12
rs2 = rs**2
om = 2.d0*a*( b1*rs12 + b2*rs + b3(iflag) * rs32 + b4(iflag)*rs2 )
dom = 2.d0*a*( 0.5d0 * b1 * rs12 + b2 * rs + 1.5d0 * b3(iflag) * &
rs32 + 2.d0 * b4(iflag) * rs2 )
olog = LOG( 1.d0 + 1.0d0 / om )
!
ec = - 2.d0 * a * (1.d0 + a1(iflag) * rs) * olog
vc = - 2.d0 * a * (1.d0 + 2.d0 / 3.d0 * a1(iflag) * rs) &
* olog - 2.d0 / 3.d0 * a * (1.d0 + a1(iflag) * rs) * dom / &
(om * (om + 1.d0) )
!
ENDIF
!
!
RETURN
!
END SUBROUTINE pw
!
!
!-----------------------------------------------------------------------
SUBROUTINE wignerc( rs, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! Wigner correlation.
!
USE kinds, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP) :: rho13 !rho13=rho^(1/3)
REAL(DP), PARAMETER :: pi34 = 0.6203504908994d0
! pi34 = (3/4pi)^(1/3)
!
!
rho13 = pi34 / rs
vc = - rho13 * ( (0.943656d0 + 8.8963d0 * rho13) / (1.d0 + &
12.57d0 * rho13)**2 )
ec = - 0.738d0 * rho13 * ( 0.959d0 / (1.d0 + 12.57d0 * rho13) )
!
RETURN
!
END SUBROUTINE wignerc
!
!
!-----------------------------------------------------------------------
SUBROUTINE hl( rs, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! L. Hedin and B.I. Lundqvist, J. Phys. C 4, 2064 (1971).
!
USE kinds, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP) :: a, x
!
!
a = LOG(1.0d0 + 21.d0/rs)
x = rs / 21.0d0
ec = a + (x**3 * a - x*x) + x/2.d0 - 1.0d0/3.0d0
ec = - 0.0225d0 * ec
vc = - 0.0225d0 * a
!
RETURN
!
END SUBROUTINE hl
!
!
!-----------------------------------------------------------------------
SUBROUTINE gl( rs, ec, vc ) !<GPU:DEVICE>
!---------------------------------------------------------------------
!! O. Gunnarsson and B. I. Lundqvist, PRB 13, 4274 (1976).
!
USE kinds, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP) :: x
REAL(DP), PARAMETER :: c=0.0333d0, r=11.4d0
! c=0.0203, r=15.9 for the paramagnetic case
!
x = rs / r
vc = - c * LOG(1.d0 + 1.d0 / x)
ec = - c * ( (1.d0 + x**3) * LOG(1.d0 + 1.d0 / x) - 1.0d0 / &
3.0d0 + x * (0.5d0 - x) )
!
RETURN
!
END SUBROUTINE gl
!
!
! ... LSDA

View File

@ -18,7 +18,8 @@ SUBROUTINE dmxc( length, sr_d, rho_in, dmuxc )
!
USE kinds, ONLY: DP
USE funct, ONLY: get_iexch, get_icorr, is_libxc
USE xc_lda_lsda, ONLY: xc_lda, xc_lsda
USE ldaxc_interfaces, ONLY: xc_lda
USE xc_lda_lsda, ONLY: xc_lsda !xc_lda
#if defined(__LIBXC)
#include "xc_version.h"
USE xc_f03_lib_m
@ -182,8 +183,9 @@ SUBROUTINE dmxc_lda( length, rho_in, dmuxc )
!! Computes the derivative of the xc potential with respect to the
!! local density.
!
USE xc_lda_lsda, ONLY: xc_lda
USE exch_lda, ONLY: slater
!USE xc_lda_lsda, ONLY: xc_lda
!USE exch_lda, ONLY: slater
USE ldaxc_interfaces, ONLY: xc_lda, slater, pz
USE funct, ONLY: get_iexch, get_icorr
USE kinds, ONLY: DP
!
@ -309,7 +311,8 @@ SUBROUTINE dmxc_lsda( length, rho_in, dmuxc )
USE kinds, ONLY: DP
USE funct, ONLY: get_iexch, get_icorr
USE xc_lda_lsda, ONLY: xc_lsda
USE exch_lda, ONLY: slater
!USE exch_lda, ONLY: slater
USE ldaxc_interfaces, ONLY: slater
USE corr_lda, ONLY: pz, pz_polarized
!
IMPLICIT NONE

View File

@ -14,166 +14,6 @@ MODULE exch_lda !<GPU:exch_lda=>exch_lda_gpu>
!
CONTAINS
!-----------------------------------------------------------------------
SUBROUTINE slater( rs, ex, vx ) !<GPU:DEVICE>
!---------------------------------------------------------------------
!! Slater exchange with alpha=2/3
!
USE kinds, ONLY: DP
!
IMPLICIT NONE
!!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ex
!! Exchange energy (per unit volume)
REAL(DP), INTENT(OUT) :: vx
!! Exchange potential
!
! ... local variables
!
REAL(DP), PARAMETER :: f = -0.687247939924714_DP, alpha = 2.0_DP/3.0_DP
! f = -9/8*(3/2pi)^(2/3)
ex = f * alpha / rs
vx = 4._DP / 3._DP * f * alpha / rs
!
RETURN
!
END SUBROUTINE slater
!
!
!-----------------------------------------------------------------------
SUBROUTINE slater1( rs, ex, vx ) !<GPU:DEVICE>
!---------------------------------------------------------------------
!! Slater exchange with alpha=1, corresponding to -1.374/r_s Ry.
!! Used to recover old results.
!
USE kinds, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ex
!! Exchange energy (per unit volume)
REAL(DP), INTENT(OUT) :: vx
!! Exchange potential
!
! ... local variables
!
REAL(DP), PARAMETER :: f = -0.687247939924714d0, alpha = 1.0d0
!
ex = f * alpha / rs
vx = 4.d0 / 3.d0 * f * alpha / rs
!
RETURN
!
END SUBROUTINE slater1
!
!
!-----------------------------------------------------------------------
SUBROUTINE slater_rxc( rs, ex, vx ) !<GPU:DEVICE>
!---------------------------------------------------------------------
!! Slater exchange with alpha=2/3 and Relativistic exchange.
!
USE kinds, ONLY: DP
USE constants, ONLY: pi, c_au
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ex
!! Exchange energy (per unit volume)
REAL(DP), INTENT(OUT) :: vx
!! Exchange potential
!
! ... local variables
!
REAL(DP), PARAMETER :: zero=0.d0, one=1.d0, pfive=0.5d0, &
opf=1.5d0 !, C014=0.014D0
REAL(DP) :: trd, ftrd, tftm, a0, alp, z, fz, fzp, vxp, xp, &
beta, sb, alb, c014
!
trd = one/3.d0
ftrd = 4.d0*trd
tftm = 2**ftrd-2.d0
A0 = (4.d0/(9.d0*PI))**trd
C014 = 1.0_DP/a0/c_au
! --- X-alpha PARAMETER:
alp = 2.d0 * trd
!
z = zero
fz = zero
fzp= zero
!
vxp = -3.d0*alp/( 2.d0*PI*A0*rs )
xp = 3.d0*vxp/4.d0
beta= C014 / rs
sb = SQRT(1.d0+beta*beta)
alb = LOG(beta+sb)
vxp = vxp * ( -pfive + opf * alb / (beta*sb) )
xp = xp * ( one-opf*((beta*sb-alb)/beta**2)**2 )
! vxf = 2**trd*vxp
! exf = 2**trd*xp
vx = vxp
ex = xp
!
RETURN
!
END SUBROUTINE slater_rxc
!
!
!-----------------------------------------------------------------------
SUBROUTINE slaterKZK( rs, ex, vx, vol ) !<GPU:DEVICE>
!---------------------------------------------------------------------
!! Slater exchange with alpha=2/3, Kwee, Zhang and Krakauer KE
!! correction.
!
USE kinds, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ex
!! Exchange energy (per unit volume)
REAL(DP), INTENT(OUT) :: vx
!! Exchange potential
REAL(DP) :: vol !<GPU:VALUE>
!! Finite size volume element
!
! ... local variables
!
REAL(DP) :: dL, ga, pi, a0
REAL(DP), PARAMETER :: a1 = -2.2037d0, &
a2 = 0.4710d0, a3 = -0.015d0, ry2h = 0.5d0
REAL(DP), PARAMETER :: f = -0.687247939924714d0, alpha = 2.0d0/3.0d0
! f = -9/8*(3/2pi)^(2/3)
!
pi = 4.d0 * ATAN(1.d0)
a0 = f * alpha * 2.d0
!
dL = vol**(1.d0/3.d0)
ga = 0.5d0 * dL *(3.d0 /pi)**(1.d0/3.d0)
!
IF ( rs < ga ) THEN
ex = a0 / rs + a1 * rs / dL**2.d0 + a2 * rs**2.d0 / dL**3.d0
vx = (4.d0 * a0 / rs + 2.d0 * a1 * rs / dL**2.d0 + &
a2 * rs**2.d0 / dL**3.d0 ) / 3.d0
ELSE
ex = a0 / ga + a1 * ga / dL**2.d0 + a2 * ga**2.d0 / dL**3.d0 ! solids
vx = ex
! ex = a3 * dL**5.d0 / rs**6.d0 ! molecules
! vx = 3.d0 * ex
ENDIF
!
ex = ry2h * ex ! Ry to Hartree
vx = ry2h * vx
!
RETURN
!
END SUBROUTINE slaterKZK
!
!
! ... LSDA
!

View File

@ -411,6 +411,11 @@ CONTAINS
!-----------------------------------------------------------------------
!! Translates a string containing the exchange-correlation name
!! into internal indices iexch, icorr, igcx, igcc, inlc, imeta.
!
USE ldaxc_interfaces, ONLY: get_ldaxc_indexes, get_ldaxc_param
#if defined(__LIBXC)
USE xc_f03_lib_m
#endif
!
IMPLICIT NONE
!
@ -851,6 +856,25 @@ CONTAINS
CALL errore( 'set_dft_from_name', ' conflicting values for inlc', 1 )
ENDIF
!
IF ( iexch==8 .OR. icorr==10 ) THEN ! 'sla+kzk'
!
IF ( .NOT. finite_size_cell_volume_set) CALL errore('XC', &
'finite size corrected exchange used w/o initialization',1)
!
CALL get_ldaxc_indexes( iexch, icorr )
CALL get_ldaxc_param( finite_size_cell_volume ) !...to set properly...
!
ELSE
!
CALL get_ldaxc_indexes( iexch, icorr )
!
ENDIF
RETURN
!
END SUBROUTINE set_dft_from_name

View File

@ -60,8 +60,10 @@ constraints_module.o : kind.o
control_flags.o : kind.o
control_flags.o : parameters.o
correlation_gga.o : correlation_lda_lsda.o
correlation_gga.o : ../XClib/ldaxc_interfaces.o
correlation_gga.o : kind.o
correlation_lda_lsda.o : kind.o
correlation_lda_lsda.o : ../XClib/ldaxc_interfaces.o
cryst_to_car.o : kind.o
deviatoric.o : io_global.o
deviatoric.o : kind.o
@ -79,6 +81,7 @@ dmxc_drivers.o : correlation_lda_lsda.o
dmxc_drivers.o : exchange_lda_lsda.o
dmxc_drivers.o : funct.o
dmxc_drivers.o : kind.o
dmxc_drivers.o : ../XClib/ldaxc_interfaces.o
dmxc_drivers.o : xc_lda_lsda_drivers.o
dylmr2.o : kind.o
electrons_base.o : constants.o
@ -122,6 +125,7 @@ fox_init_module.o : mp_images.o
funct.o : beef_interface.o
funct.o : io_global.o
funct.o : kind.o
funct.o : ../XClib/ldaxc_interfaces.o
funct.o : xc_rVV10.o
funct.o : xc_vdW_DF.o
generate_function.o : ../FFTXlib/fft_types.o
@ -184,6 +188,7 @@ mbdlib.o : tsvdw.o
mdiis.o : ../UtilXlib/mp.o
mdiis.o : kind.o
metagga.o : constants.o
metagga.o : ../XClib/ldaxc_interfaces.o
metagga.o : correlation_gga.o
metagga.o : correlation_lda_lsda.o
metagga.o : exchange_lda_lsda.o
@ -416,6 +421,7 @@ xc_gga_drivers.o : funct.o
xc_gga_drivers.o : kind.o
xc_lda_lsda_drivers.o : correlation_lda_lsda.o
xc_lda_lsda_drivers.o : exchange_lda_lsda.o
xc_lda_lsda_drivers.o : ../XClib/ldaxc_interfaces.o
xc_lda_lsda_drivers.o : funct.o
xc_lda_lsda_drivers.o : kind.o
xc_mgga_drivers.o : funct.o
@ -433,6 +439,7 @@ xc_rVV10.o : mp_bands.o
xc_rVV10.o : recvec.o
xc_vdW_DF.o : ../FFTXlib/fft_interfaces.o
xc_vdW_DF.o : ../UtilXlib/mp.o
xc_vdW_DF.o : ../XClib/ldaxc_interfaces.o
xc_vdW_DF.o : cell_base.o
xc_vdW_DF.o : constants.o
xc_vdW_DF.o : control_flags.o

View File

@ -20,8 +20,9 @@
!
MODULE metagga !<GPU:metagga=>metagga_gpu>
!
USE exch_lda, ONLY : slater !<GPU:slater=>slater_d,exch_lda=>exch_lda_gpu>
USE corr_lda, ONLY : pw, pw_spin !<GPU:pw=>pw_d,pw_spin=>pw_spin_d,corr_lda=>corr_lda_gpu>
USE ldaxc_interfaces, ONLY: slater, pw
!USE exch_lda, ONLY : slater !<GPU:slater=>slater_d,exch_lda=>exch_lda_gpu>
USE corr_lda, ONLY : pw_spin !<GPU:pw=>pw_d,pw_spin=>pw_spin_d,corr_lda=>corr_lda_gpu>
USE corr_gga, ONLY : pbec, pbec_spin !<GPU:pbec=>pbec_d,pbec_spin=>pbec_spin_d,corr_gga=>corr_gga_gpu>
!
CONTAINS

View File

@ -12,6 +12,7 @@ USE kinds, ONLY: DP
USE funct, ONLY: get_iexch, get_icorr, is_libxc, &
exx_is_active, get_exx_fraction, &
get_finite_size_cell_volume
USE ldaxc_interfaces, ONLY: xc_lda
!
IMPLICIT NONE
!
@ -19,7 +20,7 @@ PRIVATE
SAVE
!
! LDA and LSDA exchange-correlation drivers
PUBLIC :: xc, xc_lda, xc_lsda
PUBLIC :: xc, xc_lsda !xc_lda
PUBLIC :: change_threshold_lda
!
! density threshold (set to default value)
@ -267,244 +268,6 @@ END SUBROUTINE xc
!------- LDA-LSDA DRIVERS --------------------------------------------------
!----------------------------------------------------------------------------
!
!----------------------------------------------------------------------------
SUBROUTINE xc_lda( length, rho_in, ex_out, ec_out, vx_out, vc_out )
!--------------------------------------------------------------------------
!! LDA exchange and correlation functionals - Hartree a.u.
!
!! * Exchange:
!! * Slater;
!! * relativistic Slater.
!! * Correlation:
!! * Ceperley-Alder (Perdew-Zunger parameters);
!! * Vosko-Wilk-Nusair;
!! * Lee-Yang-Parr;
!! * Perdew-Wang;
!! * Wigner;
!! * Hedin-Lundqvist;
!! * Ortiz-Ballone (Perdew-Zunger formula);
!! * Ortiz-Ballone (Perdew-Wang formula);
!! * Gunnarsson-Lundqvist.
!
!! NOTE:
!! $$ E_x = \int E_x(\text{rho}) dr, E_x(\text{rho}) =
!! \text{rho}\epsilon_c(\text{rho})\ . $$
!! Same for correlation.
!
USE exch_lda
USE corr_lda
!
IMPLICIT NONE
!
INTEGER, INTENT(IN) :: length
!! length of the I/O arrays
REAL(DP), INTENT(IN), DIMENSION(length) :: rho_in
!! Charge density
REAL(DP), INTENT(OUT), DIMENSION(length) :: ex_out
!! \(\epsilon_x(rho)\) ( NOT \(E_x(\text{rho})\) )
REAL(DP), INTENT(OUT), DIMENSION(length) :: vx_out
!! \(dE_x(\text{rho})/d\text{rho}\) ( NOT \(d\epsilon_x(\text{rho})/d\text{rho}\) )
REAL(DP), INTENT(OUT), DIMENSION(length) :: ec_out
!! \(\epsilon_c(rho)\) ( NOT \(E_c(\text{rho})\) )
REAL(DP), INTENT(OUT), DIMENSION(length) :: vc_out
!! \(dE_c(\text{rho})/d\text{rho}\) ( NOT \(d\epsilon_c(\text{rho})/d\text{rho}\) )
!
! ... local variables
!
INTEGER :: ir, iexch, icorr
REAL(DP) :: rho, rs
REAL(DP) :: ex, ec, ec_
REAL(DP) :: vx, vc, vc_
REAL(DP) :: exx_fraction
REAL(DP) :: finite_size_cell_volume
LOGICAL :: exx_started, is_there_finite_size_corr
REAL(DP), PARAMETER :: third = 1.0_DP/3.0_DP, &
pi34 = 0.6203504908994_DP, e2 = 2.0_DP
! pi34 = (3/4pi)^(1/3)
!
#if defined(_OPENMP)
INTEGER :: ntids
INTEGER, EXTERNAL :: omp_get_num_threads
!
ntids = omp_get_num_threads()
#endif
!
iexch = get_iexch()
icorr = get_icorr()
exx_started = exx_is_active()
exx_fraction = get_exx_fraction()
IF (iexch==8 .OR. icorr==10) THEN
CALL get_finite_size_cell_volume( is_there_finite_size_corr, &
finite_size_cell_volume )
!
IF (.NOT. is_there_finite_size_corr) CALL errore( 'XC',&
'finite size corrected exchange used w/o initialization', 1 )
ENDIF
!
!$omp parallel if(ntids==1)
!$omp do private( rho, rs, ex, ec, ec_, vx, vc, vc_ )
DO ir = 1, length
!
rho = ABS(rho_in(ir))
!
! ... RHO THRESHOLD
!
IF ( rho > rho_threshold ) THEN
rs = pi34 / rho**third
ELSE
ex_out(ir) = 0.0_DP ; ec_out(ir) = 0.0_DP
vx_out(ir) = 0.0_DP ; vc_out(ir) = 0.0_DP
CYCLE
ENDIF
!
! ... EXCHANGE
!
SELECT CASE( iexch )
CASE( 1 ) ! 'sla'
!
CALL slater( rs, ex, vx )
!
CASE( 2 ) ! 'sl1'
!
CALL slater1( rs, ex, vx )
!
CASE( 3 ) ! 'rxc'
!
CALL slater_rxc( rs, ex, vx )
!
CASE( 4, 5 ) ! 'oep','hf'
!
IF ( exx_started ) THEN
ex = 0.0_DP
vx = 0.0_DP
ELSE
CALL slater( rs, ex, vx )
ENDIF
!
CASE( 6, 7 ) ! 'pb0x' or 'DF-cx-0', or 'DF2-0',
! ! 'B3LYP'
CALL slater( rs, ex, vx )
IF ( exx_started ) THEN
ex = (1.0_DP - exx_fraction) * ex
vx = (1.0_DP - exx_fraction) * vx
ENDIF
!
CASE( 8 ) ! 'sla+kzk'
!
CALL slaterKZK( rs, ex, vx, finite_size_cell_volume )
!
CASE( 9 ) ! 'X3LYP'
!
CALL slater( rs, ex, vx )
IF ( exx_started ) THEN
ex = (1.0_DP - exx_fraction) * ex
vx = (1.0_DP - exx_fraction) * vx
ENDIF
!
CASE DEFAULT
!
ex = 0.0_DP
vx = 0.0_DP
!
END SELECT
!
!
! ... CORRELATION
!
SELECT CASE( icorr )
CASE( 1 )
!
CALL pz( rs, 1, ec, vc )
!
CASE( 2 )
!
CALL vwn( rs, ec, vc )
!
CASE( 3 )
!
CALL lyp( rs, ec, vc )
!
CASE( 4 )
!
CALL pw( rs, 1, ec, vc )
!
CASE( 5 )
!
CALL wignerc( rs, ec, vc )
!
CASE( 6 )
!
CALL hl( rs, ec, vc )
!
CASE( 7 )
!
CALL pz( rs, 2, ec, vc )
!
CASE( 8 )
!
CALL pw( rs, 2, ec, vc )
!
CASE( 9 )
!
CALL gl( rs, ec, vc )
!
CASE( 10 )
!
CALL pzKZK( rs, ec, vc, finite_size_cell_volume )
!
CASE( 11 )
!
CALL vwn1_rpa( rs, ec, vc )
!
CASE( 12 ) ! 'B3LYP'
!
CALL vwn( rs, ec, vc )
ec = 0.19_DP * ec
vc = 0.19_DP * vc
!
CALL lyp( rs, ec_, vc_ )
ec = ec + 0.81_DP * ec_
vc = vc + 0.81_DP * vc_
!
CASE( 13 ) ! 'B3LYP-V1R'
!
CALL vwn1_rpa ( rs, ec, vc )
ec = 0.19_DP * ec
vc = 0.19_DP * vc
!
CALL lyp( rs, ec_, vc_ )
ec = ec + 0.81_DP * ec_
vc = vc + 0.81_DP * vc_
!
CASE( 14 ) ! 'X3LYP'
!
CALL vwn1_rpa( rs, ec, vc )
ec = 0.129_DP * ec
vc = 0.129_DP * vc
!
CALL lyp( rs, ec_, vc_ )
ec = ec + 0.871_DP * ec_
vc = vc + 0.871_DP * vc_
!
CASE DEFAULT
!
ec = 0.0_DP
vc = 0.0_DP
!
END SELECT
!
ex_out(ir) = ex ; ec_out(ir) = ec
vx_out(ir) = vx ; vc_out(ir) = vc
!
ENDDO
!$omp end do
!$omp end parallel
!
!
RETURN
!
END SUBROUTINE xc_lda
!
!
!-----------------------------------------------------------------------------
SUBROUTINE xc_lsda( length, rho_in, zeta_in, ex_out, ec_out, vx_out, vc_out )

View File

@ -723,6 +723,8 @@ CONTAINS
SUBROUTINE get_q0_on_grid (total_rho, grad_rho, q0, dq0_drho, dq0_dgradrho, thetas)
USE ldaxc_interfaces, ONLY: pw
IMPLICIT NONE
REAL(DP), INTENT(IN) :: total_rho(:), grad_rho(:,:) ! Input variables needed.

View File

@ -39,7 +39,8 @@ stop_run_path.o
PWOBJS= ../../PW/src/libpw.a
QEMODS = ../../Modules/libqemod.a ../../KS_Solvers/libks_solvers.a ../../upflib/libupf.a \
../../FFTXlib/libqefft.a ../../LAXlib/libqela.a ../../UtilXlib/libutil.a ../../dft-d3/libdftd3qe.a
../../FFTXlib/libqefft.a ../../LAXlib/libqela.a ../../UtilXlib/libutil.a ../../dft-d3/libdftd3qe.a \
../../XClib/libqeldaxc.a
TLDEPS=pwlibs
all : tldeps neb.x path_interpolation.x

View File

@ -12,7 +12,7 @@ FDOBJS = \
QEMODS = ../../Modules/libqemod.a ../../FFTXlib/libqefft.a ../../upflib/libupf.a \
../../KS_Solvers/libks_solvers.a \
../../KS_Solvers/libks_solvers.a ../../XClib/libqeldaxc.a \
../../LAXlib/libqela.a ../../UtilXlib/libutil.a ../../dft-d3/libdftd3qe.a
PWOBJS = ../../PW/src/libpw.a

View File

@ -35,7 +35,7 @@ solve_ph.o \
writedyn.o
PWOBJS = ../../PW/src/libpw.a
QEMODS = ../../Modules/libqemod.a ../../KS_Solvers/libks_solvers.a ../../upflib/libupf.a \
QEMODS = ../../Modules/libqemod.a ../../KS_Solvers/libks_solvers.a ../../upflib/libupf.a ../../XClib/libqeldaxc.a \
../../FFTXlib/libqefft.a ../../LAXlib/libqela.a ../../UtilXlib/libutil.a ../../dft-d3/libdftd3qe.a ../../LR_Modules/liblrmod.a
TLDEPS= pwlibs

View File

@ -200,7 +200,7 @@ write_eigenvectors.o
LRMODS = ../../LR_Modules/liblrmod.a
PWOBJS = ../../PW/src/libpw.a
QEMODS = ../../Modules/libqemod.a ../../KS_Solvers/libks_solvers.a ../../upflib/libupf.a \
QEMODS = ../../Modules/libqemod.a ../../KS_Solvers/libks_solvers.a ../../upflib/libupf.a ../../XClib/libqeldaxc.a \
../../FFTXlib/libqefft.a ../../LAXlib/libqela.a ../../UtilXlib/libutil.a ../../dft-d3/libdftd3qe.a
TLDEPS= phlibs

View File

@ -56,7 +56,7 @@ xc_vdW_scale_mod.o # added by Yang Jiao
PWOBJS = ../../PW/src/libpw.a
QEMODS = ../../Modules/libqemod.a ../../upflib/libupf.a ../../KS_Solvers/libks_solvers.a \
../../FFTXlib/libqefft.a ../../LAXlib/libqela.a ../../UtilXlib/libutil.a \
../../dft-d3/libdftd3qe.a
../../dft-d3/libdftd3qe.a ../../XClib/libqeldaxc.a
MODULES = $(PWOBJS) $(QEMODS)

View File

@ -90,6 +90,25 @@ bands.o : ../../Modules/wavefunctions.o
bands.o : ../../PW/src/pwcom.o
bands.o : ../../UtilXlib/mp.o
bands.o : ../../upflib/uspp.o
<<<<<<< HEAD
=======
<<<<<<< HEAD
xctest_qe_libxc.o : ../../Modules/correlation_lda_lsda.o
xctest_qe_libxc.o : ../../Modules/funct.o
xctest_qe_libxc.o : ../../Modules/xc_gga_drivers.o
xctest_qe_libxc.o : ../../Modules/xc_lda_lsda_drivers.o
xctest_qe_libxc.o : ../../Modules/xc_mgga_drivers.o
xctest_qe_libxc.o : ../../Modules/kind.o
=======
benchmark_libxc.o : ../../Modules/correlation_lda_lsda.o
benchmark_libxc.o : ../../Modules/funct.o
benchmark_libxc.o : ../../Modules/libxc.o
benchmark_libxc.o : ../../Modules/xc_gga_drivers.o
benchmark_libxc.o : ../../Modules/xc_lda_lsda_drivers.o
benchmark_libxc.o : ../../XClib/ldaxc_interfaces.o
benchmark_libxc.o : ../../Modules/xc_mgga_drivers.o
>>>>>>> XClib - lda - scratch
>>>>>>> XClib - lda - scratch
chdens_bspline.o : ../../Modules/bspline.o
chdens_bspline.o : ../../Modules/cell_base.o
chdens_bspline.o : ../../Modules/fft_base.o

View File

@ -56,7 +56,8 @@ PROGRAM do_ppacf
USE funct, ONLY : get_iexch, get_icorr, get_igcx, get_igcc
USE funct, ONLY : set_exx_fraction, set_auxiliary_flags, &
enforce_input_dft
USE exch_lda, ONLY : slater, slater_spin
USE exch_lda, ONLY : slater_spin
USE ldaxc_interfaces, ONLY : slater
USE xc_gga, ONLY : gcxc, gcx_spin, gcc_spin
USE xc_lda_lsda, ONLY : xc
USE wvfct, ONLY : npw, npwx

View File

@ -367,7 +367,8 @@ CONTAINS
SUBROUTINE get_q0cc_on_grid (cc,lecnl_qx,total_rho, grad_rho, q0, thetas)
USE vdW_DF, ONLY : spline_interpolation
USE corr_lda, ONLY : pw
!USE corr_lda, ONLY : pw
use ldaxc_interfaces, only : pw
implicit none

View File

@ -266,7 +266,7 @@ wannier_check.o \
wannier_clean.o \
wannier_occ.o
QEMODS=../../Modules/libqemod.a ../../KS_Solvers/libks_solvers.a ../../upflib/libupf.a \
QEMODS=../../Modules/libqemod.a ../../KS_Solvers/libks_solvers.a ../../upflib/libupf.a ../../XClib/libqeldaxc.a \
../../FFTXlib/libqefft.a ../../LAXlib/libqela.a ../../UtilXlib/libutil.a ../../dft-d3/libdftd3qe.a
TLDEPS= bindir libs mods libks_solvers dftd3

View File

@ -49,7 +49,7 @@ transmit.o
PWOBJS = ../../PW/src/libpw.a
QEMODS = ../../Modules/libqemod.a ../../KS_Solvers/libks_solvers.a ../../upflib/libupf.a \
../../FFTXlib/libqefft.a ../../LAXlib/libqela.a ../../UtilXlib/libutil.a \
../../dft-d3/libdftd3qe.a
../../dft-d3/libdftd3qe.a ../../XClib/libqeldaxc.a
TLDEPS= pwlibs

View File

@ -9,7 +9,7 @@ MODFLAGS= $(BASEMOD_FLAGS) \
$(MOD_FLAG)../../LR_Modules
QEMODS = ../../Modules/libqemod.a ../../FFTXlib/libqefft.a \
../../upflib/libupf.a ../../KS_Solvers/libks_solvers.a \
../../upflib/libupf.a ../../KS_Solvers/libks_solvers.a ../../XClib/libqeldaxc.a \
../../LAXlib/libqela.a ../../UtilXlib/libutil.a ../../dft-d3/libdftd3qe.a
PWOBJS = ../../PW/src/libpw.a
LRMODS = ../../LR_Modules/liblrmod.a

34
XClib/Makefile Normal file
View File

@ -0,0 +1,34 @@
# Makefile for XClib
include ../make.inc
MODFLAGS= $(BASEMOD_FLAGS)
LDAL = \
kind_l.o \
constants_l.o \
dft_par_mod.o \
ldaxc_interfaces.o \
correlation_lda.o \
get_ldaxc.o \
exchange_lda.o \
xc_lda.o
all: libqeldaxc.a
libqeldaxc.a: $(LDAL)
$(AR) $(ARFLAGS) $@ $?
$(RANLIB) $@
clean :
- /bin/rm -f *.o *.a *.d *.i *~ *_tmp.f90 *.mod *.L
# .PHONY forces execution of a rule irrespective of the presence of an
# updated file with the same name of the rule. In this way, the script
# that generates version.f90 always runs, updating the version if you
# execute "svn update". The update_version script takes care of not
# changing the file if the svn version did not change
.PHONY: all clean
include make.depend

155
XClib/constants_l.f90 Normal file
View File

@ -0,0 +1,155 @@
!
! Copyright (C) 2002-2006 Quantum ESPRESSO 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 .
!
!----------------------------------------------------------------------------
MODULE constants_l
!----------------------------------------------------------------------------
!
USE kind_l, ONLY : DP
!
! ... The constants needed everywhere
!
IMPLICIT NONE
!
SAVE
!
! ... Mathematical constants
!
REAL(DP), PARAMETER :: pi = 3.14159265358979323846_DP
REAL(DP), PARAMETER :: tpi = 2.0_DP * pi
REAL(DP), PARAMETER :: fpi = 4.0_DP * pi
REAL(DP), PARAMETER :: sqrtpi = 1.77245385090551602729_DP
REAL(DP), PARAMETER :: sqrtpm1= 1.0_DP / sqrtpi
REAL(DP), PARAMETER :: sqrt2 = 1.41421356237309504880_DP
!
! ... Physical constants, SI (NIST 2018)
! http://physics.nist.gov/constants
!
REAL(DP), PARAMETER :: H_PLANCK_SI = 6.62607015E-34_DP ! J s
REAL(DP), PARAMETER :: K_BOLTZMANN_SI = 1.380649E-23_DP ! J K^-1
REAL(DP), PARAMETER :: ELECTRON_SI = 1.602176634E-19_DP ! C
REAL(DP), PARAMETER :: ELECTRONVOLT_SI = 1.602176634E-19_DP ! J
REAL(DP), PARAMETER :: ELECTRONMASS_SI = 9.1093837015E-31_DP ! Kg
REAL(DP), PARAMETER :: HARTREE_SI = 4.3597447222071E-18_DP ! J
REAL(DP), PARAMETER :: RYDBERG_SI = HARTREE_SI/2.0_DP ! J
REAL(DP), PARAMETER :: BOHR_RADIUS_SI = 0.529177210903E-10_DP ! m
REAL(DP), PARAMETER :: AMU_SI = 1.66053906660E-27_DP ! Kg
REAL(DP), PARAMETER :: C_SI = 2.99792458E+8_DP ! m sec^-1
REAL(DP), PARAMETER :: MUNOUGHT_SI = fpi*1.0E-7_DP ! N A^-2
REAL(DP), PARAMETER :: EPSNOUGHT_SI = 1.0_DP / (MUNOUGHT_SI * &
C_SI**2) ! F m^-1
!
! ... Physical constants, atomic units:
! ... AU for "Hartree" atomic units (e = m = hbar = 1)
! ... RY for "Rydberg" atomic units (e^2=2, m=1/2, hbar=1)
!
REAL(DP), PARAMETER :: K_BOLTZMANN_AU = K_BOLTZMANN_SI / HARTREE_SI
REAL(DP), PARAMETER :: K_BOLTZMANN_RY = K_BOLTZMANN_SI / RYDBERG_SI
!
! ... Unit conversion factors: energy and masses
!
REAL(DP), PARAMETER :: AUTOEV = HARTREE_SI / ELECTRONVOLT_SI
REAL(DP), PARAMETER :: RYTOEV = AUTOEV / 2.0_DP
REAL(DP), PARAMETER :: AMU_AU = AMU_SI / ELECTRONMASS_SI
REAL(DP), PARAMETER :: AMU_RY = AMU_AU / 2.0_DP
!
! ... Unit conversion factors: atomic unit of time, in s and ps
!
REAL(DP), PARAMETER :: AU_SEC = H_PLANCK_SI/tpi/HARTREE_SI
REAL(DP), PARAMETER :: AU_PS = AU_SEC * 1.0E+12_DP
!
! ... Unit conversion factors: pressure (1 Pa = 1 J/m^3, 1GPa = 10 Kbar )
!
REAL(DP), PARAMETER :: AU_GPA = HARTREE_SI / BOHR_RADIUS_SI ** 3 &
/ 1.0E+9_DP
REAL(DP), PARAMETER :: RY_KBAR = 10.0_DP * AU_GPA / 2.0_DP
!
! ... Unit conversion factors: 1 debye = 10^-18 esu*cm
! ... = 3.3356409519*10^-30 C*m
! ... = 0.208194346 e*A
! ... ( 1 esu = (0.1/c) Am, c=299792458 m/s)
!
REAL(DP), PARAMETER :: DEBYE_SI = 3.3356409519_DP * 1.0E-30_DP ! C*m
REAL(DP), PARAMETER :: AU_DEBYE = ELECTRON_SI * BOHR_RADIUS_SI / &
DEBYE_SI
!
REAL(DP), PARAMETER :: eV_to_kelvin = ELECTRONVOLT_SI / K_BOLTZMANN_SI
REAL(DP), PARAMETER :: ry_to_kelvin = RYDBERG_SI / K_BOLTZMANN_SI
!
! .. Unit conversion factors: Energy to wavelength
!
REAL(DP), PARAMETER :: EVTONM = 1E+9_DP * H_PLANCK_SI * C_SI / &
&ELECTRONVOLT_SI
REAL(DP), PARAMETER :: RYTONM = 1E+9_DP * H_PLANCK_SI * C_SI / RYDBERG_SI
!
! Speed of light in atomic units
!
REAL(DP), PARAMETER :: C_AU = C_SI / BOHR_RADIUS_SI * AU_SEC
!
! ... zero up to a given accuracy
!
REAL(DP), PARAMETER :: eps4 = 1.0E-4_DP
REAL(DP), PARAMETER :: eps6 = 1.0E-6_DP
REAL(DP), PARAMETER :: eps8 = 1.0E-8_DP
REAL(DP), PARAMETER :: eps12 = 1.0E-12_DP
REAL(DP), PARAMETER :: eps14 = 1.0E-14_DP
REAL(DP), PARAMETER :: eps16 = 1.0E-16_DP
REAL(DP), PARAMETER :: eps24 = 1.0E-24_DP
REAL(DP), PARAMETER :: eps32 = 1.0E-32_DP
!
REAL(DP), PARAMETER :: gsmall = 1.0E-12_DP
!
REAL(DP), PARAMETER :: e2 = 2.0_DP ! the square of the electron charge
REAL(DP), PARAMETER :: degspin = 2.0_DP ! the number of spins per level
!
!!!!!! COMPATIBIILITY
!
REAL(DP), PARAMETER :: BOHR_RADIUS_CM = BOHR_RADIUS_SI * 100.0_DP
REAL(DP), PARAMETER :: BOHR_RADIUS_ANGS = BOHR_RADIUS_CM * 1.0E8_DP
REAL(DP), PARAMETER :: ANGSTROM_AU = 1.0_DP/BOHR_RADIUS_ANGS
REAL(DP), PARAMETER :: DIP_DEBYE = AU_DEBYE
REAL(DP), PARAMETER :: AU_TERAHERTZ = AU_PS
REAL(DP), PARAMETER :: AU_TO_OHMCMM1 = 46000.0_DP ! (ohm cm)^-1
REAL(DP), PARAMETER :: RY_TO_THZ = 1.0_DP / AU_TERAHERTZ / FPI
REAL(DP), PARAMETER :: RY_TO_GHZ = RY_TO_THZ*1000.0_DP
REAL(DP), PARAMETER :: RY_TO_CMM1 = 1.E+10_DP * RY_TO_THZ / C_SI
!
REAL(DP), PARAMETER :: AVOGADRO = 6.02214076D+23
END MODULE constants_l
! perl script to create a program to list the available constants:
! extract with: grep '^!XX!' constants.f90 | sed 's,!XX!,,' > mkconstlist.pl
! then run: perl mkconstlist.pl constants.f90 > testme.f90
! and compile and run: testme.f90
!XX!#!/usr/bin/perl -w
!XX!
!XX!use strict;
!XX!
!XX!print <<EOF
!XX!! list all available constants and derived values
!XX!
!XX!PROGRAM list_constants
!XX!
!XX! USE kinds, ONLY : DP
!XX! USE constants
!XX!
!XX!EOF
!XX!;
!XX!
!XX!while(<>) {
!XX! if ( /REAL\s*\(DP\)\s*,\s*PARAMETER\s*::\s*([a-zA-Z_0-9]+)\s*=.*$/ ) {
!XX! print " WRITE (*,'(A18,G24.17)') '$1:',$1\n";
!XX! }
!XX!}
!XX!
!XX!print <<EOF
!XX!
!XX!END PROGRAM list_constants
!XX!EOF
!XX!;
!XX!

482
XClib/correlation_lda.f90 Normal file
View File

@ -0,0 +1,482 @@
!
! Copyright (C) 2001-2014 Quantum ESPRESSO 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 .
!
! MODULE corr_lda !<GPU:corr_lda=>corr_lda_gpu>
! CONTAINS
!-------------------------------------------------------------------------
SUBROUTINE pz_l( rs, iflag, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! LDA parametrization from Monte Carlo DATA:
!
!! * iflag=1: J.P. Perdew and A. Zunger, PRB 23, 5048 (1981);
!! * iflag=2: G. Ortiz and P. Ballone, PRB 50, 1391 (1994).
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!
INTEGER, INTENT(IN) :: iflag !<GPU:VALUE>
!! see routine comments
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP) :: a(2), b(2), c(2), d(2), gc(2), b1(2), b2(2)
REAL(DP) :: lnrs, rs12, ox, dox
!
DATA a / 0.0311d0, 0.031091d0 /, b / -0.048d0, -0.046644d0 /, &
c / 0.0020d0, 0.00419d0 /, d / -0.0116d0, -0.00983d0 /
!
DATA gc / -0.1423d0, -0.103756d0 /, b1 / 1.0529d0, 0.56371d0 /, &
b2 / 0.3334d0, 0.27358d0 /
!
IF ( rs < 1.0d0 ) THEN
!
! high density formula
lnrs = LOG(rs)
!
ec = a(iflag)*lnrs + b(iflag) + c(iflag)*rs*lnrs + d(iflag)*rs
!
vc = a(iflag)*lnrs + ( b(iflag) - a(iflag)/3.d0 ) + 2.d0/3.d0 * &
c(iflag)*rs*lnrs + ( 2.d0*d(iflag) - c(iflag) )/3.d0*rs
ELSE
!
! interpolation formula
rs12 = SQRT(rs)
!
ox = 1.d0 + b1(iflag)*rs12 + b2(iflag)*rs
dox = 1.d0 + 7.d0/6.d0*b1(iflag)*rs12 + 4.d0/3.d0*b2(iflag)*rs
!
ec = gc(iflag)/ox
vc = ec*dox/ox
!
ENDIF
!
RETURN
!
END SUBROUTINE pz_l
!
!
!-----------------------------------------------------------------------
SUBROUTINE pzKZK_l( rs, ec, vc, vol ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! LDA parametrization from Monte Carlo DATA:
!
!! * iflag=1: J.P. Perdew and A. Zunger, PRB 23, 5048 (1981)
!! * iflag=2: G. Ortiz and P. Ballone, PRB 50, 1391 (1994)
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
REAL(DP) :: vol !<GPU:VALUE>
!! volume element
!
! ... local variables
!
INTEGER :: iflag, kr
REAL(DP) :: ec0(2), vc0(2), ec0p
REAL(DP) :: a(2), b(2), c(2), d(2), gc(2), b1(2), b2(2)
REAL(DP) :: lnrs, rs12, ox, dox, lnrsk, rsk
REAL(DP) :: a1, grs, g1, g2, g3, g4, dL, gh, gl, grsp
REAL(DP) :: f3, f2, f1, f0, pi
REAL(DP) :: D1, D2, D3, P1, P2, ry2h
!
DATA a / 0.0311_DP, 0.031091_DP /, b / -0.048_DP, -0.046644_DP /, &
c / 0.0020_DP, 0.00419_DP /, d / -0.0116_DP, -0.00983_DP /
!
DATA gc / -0.1423_DP, -0.103756_DP /, b1 / 1.0529_DP, 0.56371_DP /, &
b2 / 0.3334_DP, 0.27358_DP /
!
DATA a1 / -2.2037_DP /, g1 / 0.1182_DP/, g2 / 1.1656_DP/, g3 / -5.2884_DP/, &
g4 / -1.1233_DP /
!
DATA ry2h / 0.5_DP /
!
iflag = 1
pi = 4.d0 * ATAN(1.d0)
dL = vol**(1.d0/3.d0)
gh = 0.5d0 * dL / (2.d0 * pi)**(1.d0/3.d0)
gl = dL * (3.d0 / 2.d0 / pi)**(1.d0/3.d0)
!
rsk = gh
!
DO kr = 1, 2
!
lnrsk = LOG(rsk)
IF (rsk < 1.0d0) THEN
! high density formula
ec0(kr) = a(iflag) *lnrsk + b(iflag) + c(iflag) * rsk * lnrsk + d(iflag) * rsk
vc0(kr) = a(iflag) * lnrsk + (b(iflag) - a(iflag) / 3.d0) + 2.d0 / &
3.d0 * c (iflag) * rsk * lnrsk + (2.d0 * d (iflag) - c (iflag) ) &
/ 3.d0 * rsk
!
ELSE
! interpolation formula
rs12 = SQRT(rsk)
ox = 1.d0 + b1 (iflag) * rs12 + b2 (iflag) * rsk
dox = 1.d0 + 7.d0 / 6.d0 * b1 (iflag) * rs12 + 4.d0 / 3.d0 * &
b2 (iflag) * rsk
ec0(kr) = gc (iflag) / ox
vc0(kr) = ec0(kr) * dox / ox
!
ENDIF
!
grs = g1 * rsk * lnrsk + g2 * rsk + g3 * rsk**1.5d0 + g4 * rsk**2.d0
grsp = g1 * lnrsk + g1 + g2 + 1.5d0 * g3 * rsk**0.5d0 + 2.d0 * g4 * rsk
!
ec0(kr) = ec0(kr) + (-a1 * rsk / dL**2.d0 + grs / dL**3.d0) * ry2h
vc0(kr) = vc0(kr) + (-2.d0 * a1 * rsk / dL**2.d0 / 3.d0 + &
grs / dL**3.d0 - grsp * rsk / 3.d0 / dL**3.d0) * ry2h
!
rsk = rs
!
ENDDO
!
lnrs = LOG(rs)
!
IF (rs <= gh) THEN
ec = ec0(2)
vc = vc0(2)
ELSE
IF ( rs <= gl ) THEN
ec0p = 3.d0 * (ec0(1) - vc0(1)) / gh
P1 = 3.d0 * ec0(1) - gh * ec0p
P2 = ec0p
D1 = gl - gh
D2 = gl**2.d0 - gh**2.d0
D3 = gl**3.d0 - gh**3.d0
f2 = 2.d0 * gl**2.d0 * P2 * D1 + D2 * P1
f2 = f2 / (-(2.d0*gl*D1)**2.d0 + 4.d0*gl*D1*D2 - D2**2.d0 )
f3 = - (P2 + 2.d0*D1*f2) / (3.d0 * D2)
f1 = - (P1 + D2 * f2) / (2.d0 * D1)
f0 = - gl * (gl * f2 + 2.d0 * f1) / 3.d0
!
ec = f3 * rs**3.d0 + f2 * rs**2.d0 + f1 * rs + f0
vc = f2 * rs**2.d0 / 3.d0 + f1 * 2.d0 * rs / 3.d0 + f0
ELSE
ec = 0.d0
vc = 0.d0
ENDIF
ENDIF
!
!
RETURN
!
END SUBROUTINE pzKZK_l
!
!
!-----------------------------------------------------------------------
SUBROUTINE vwn_l( rs, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! S.H. Vosko, L. Wilk, and M. Nusair, Can. J. Phys. 58, 1200 (1980).
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP), PARAMETER :: a = 0.0310907d0, b = 3.72744d0, &
c = 12.9352d0, x0 = -0.10498d0
REAL(DP) :: q, f1, f2, f3, rs12, fx, qx, tx, tt
!
!
q = SQRT( 4.d0*c - b*b )
f1 = 2.d0*b/q
f2 = b*x0 / ( x0*x0 + b*x0 + c )
f3 = 2.d0*( 2.d0 * x0 + b ) / q
!
rs12 = SQRT(rs)
fx = rs + b*rs12 + c
qx = ATAN( q / (2.d0*rs12 + b) )
!
ec = a * ( LOG( rs/fx ) + f1*qx - f2*( LOG( (rs12 - x0)**2 / fx) &
+ f3*qx) )
!
tx = 2.d0*rs12 + b
tt = tx*tx + q*q
!
vc = ec - rs12*a / 6.d0*( 2.d0 / rs12 - tx/fx - 4.d0*b/tt - f2 * &
(2.d0 / (rs12 - x0) - tx/fx - 4.d0*(2.d0 * x0 + b)/tt) )
!
RETURN
!
END SUBROUTINE vwn_l
!
!
!-----------------------------------------------------------------------
SUBROUTINE vwn1_rpa_l( rs, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! S.H. Vosko, L. Wilk, and M. Nusair, Can. J. Phys. 58, 1200 (1980).
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP), PARAMETER :: a = 0.0310907_DP, b = 13.0720_DP, &
c = 42.7198_DP, x0 = -0.409286_DP
REAL(DP) :: q, f1, f2, f3, rs12, fx, qx, tx, tt
!
q = SQRT(4.d0*c - b*b)
f1 = 2.d0*b/q
f2 = b*x0 / (x0*x0 + b*x0 + c)
f3 = 2.d0 * (2.d0 * x0 + b) / q
!
rs12 = SQRT(rs)
fx = rs + b * rs12 + c
qx = ATAN(q / (2.d0 * rs12 + b) )
!
ec = a*( LOG(rs/fx) + f1*qx - f2*(LOG((rs12 - x0)**2/fx) + f3*qx) )
!
tx = 2.d0*rs12 + b
tt = tx*tx + q*q
!
vc = ec - rs12*a/6.d0*( 2.d0/rs12 - tx/fx - 4.d0*b/tt - f2 * &
(2.d0/(rs12 - x0) - tx/fx - 4.d0*(2.d0*x0 + b)/tt) )
!
!
RETURN
!
END SUBROUTINE vwn1_rpa_l
!
!
!-----------------------------------------------------------------------
SUBROUTINE lyp_l( rs, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! C. Lee, W. Yang, and R.G. Parr, PRB 37, 785 (1988).
!! LDA part only.
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP), PARAMETER :: a=0.04918d0, b=0.132d0*2.87123400018819108d0
REAL(DP), PARAMETER :: pi43=1.61199195401647d0
! pi43=(4pi/3)^(1/3)
REAL(DP), PARAMETER :: c=0.2533d0*pi43, d=0.349d0*pi43
REAL(DP) :: ecrs, ox
!
!
ecrs = b*EXP( -c*rs )
ox = 1.d0 / (1.d0 + d*rs)
!
ec = - a*ox*(1.d0 + ecrs)
vc = ec - rs/3.d0*a*ox*( d*ox + ecrs*(d*ox + c) )
!
RETURN
!
END SUBROUTINE lyp_l
!
!
!-----------------------------------------------------------------------
SUBROUTINE pw_l( rs, iflag, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! * iflag=1: J.P. Perdew and Y. Wang, PRB 45, 13244 (1992)
!! * iflag=2: G. Ortiz and P. Ballone, PRB 50, 1391 (1994)
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
INTEGER, INTENT(IN) :: iflag !<GPU:VALUE>
!! see routine comments
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP), PARAMETER :: a=0.031091d0, b1=7.5957d0, b2=3.5876d0, c0=a, &
c1=0.046644d0, c2=0.00664d0, c3=0.01043d0, d0=0.4335d0, &
d1=1.4408d0
REAL(DP) :: lnrs, rs12, rs32, rs2, om, dom, olog
REAL(DP) :: a1(2), b3(2), b4(2)
DATA a1 / 0.21370d0, 0.026481d0 /, b3 / 1.6382d0, -0.46647d0 /, &
b4 / 0.49294d0, 0.13354d0 /
!
! high- and low-density formulae implemented but not used in PW case
! (reason: inconsistencies in PBE/PW91 functionals).
!
IF ( rs < 1d0 .AND. iflag == 2 ) THEN
!
! high density formula
lnrs = LOG(rs)
ec = c0 * lnrs - c1 + c2 * rs * lnrs - c3 * rs
vc = c0 * lnrs - (c1 + c0 / 3.d0) + 2.d0 / 3.d0 * c2 * rs * &
lnrs - (2.d0 * c3 + c2) / 3.d0 * rs
!
ELSEIF ( rs > 100.d0 .AND. iflag == 2 ) THEN
!
! low density formula
ec = - d0 / rs + d1 / rs**1.5d0
vc = - 4.d0 / 3.d0 * d0 / rs + 1.5d0 * d1 / rs**1.5d0
!
ELSE
!
! interpolation formula
rs12 = SQRT(rs)
rs32 = rs * rs12
rs2 = rs**2
om = 2.d0*a*( b1*rs12 + b2*rs + b3(iflag) * rs32 + b4(iflag)*rs2 )
dom = 2.d0*a*( 0.5d0 * b1 * rs12 + b2 * rs + 1.5d0 * b3(iflag) * &
rs32 + 2.d0 * b4(iflag) * rs2 )
olog = LOG( 1.d0 + 1.0d0 / om )
!
ec = - 2.d0 * a * (1.d0 + a1(iflag) * rs) * olog
vc = - 2.d0 * a * (1.d0 + 2.d0 / 3.d0 * a1(iflag) * rs) &
* olog - 2.d0 / 3.d0 * a * (1.d0 + a1(iflag) * rs) * dom / &
(om * (om + 1.d0) )
!
ENDIF
!
!
RETURN
!
END SUBROUTINE pw_l
!
!
!-----------------------------------------------------------------------
SUBROUTINE wignerc_l( rs, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! Wigner correlation.
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP) :: rho13 !rho13=rho^(1/3)
REAL(DP), PARAMETER :: pi34 = 0.6203504908994d0
! pi34 = (3/4pi)^(1/3)
!
!
rho13 = pi34 / rs
vc = - rho13 * ( (0.943656d0 + 8.8963d0 * rho13) / (1.d0 + &
12.57d0 * rho13)**2 )
ec = - 0.738d0 * rho13 * ( 0.959d0 / (1.d0 + 12.57d0 * rho13) )
!
RETURN
!
END SUBROUTINE wignerc_l
!
!
!-----------------------------------------------------------------------
SUBROUTINE hl_l( rs, ec, vc ) !<GPU:DEVICE>
!-----------------------------------------------------------------------
!! L. Hedin and B.I. Lundqvist, J. Phys. C 4, 2064 (1971).
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP) :: a, x
!
!
a = LOG(1.0d0 + 21.d0/rs)
x = rs / 21.0d0
ec = a + (x**3 * a - x*x) + x/2.d0 - 1.0d0/3.0d0
ec = - 0.0225d0 * ec
vc = - 0.0225d0 * a
!
RETURN
!
END SUBROUTINE hl_l
!
!
!-----------------------------------------------------------------------
SUBROUTINE gl_l( rs, ec, vc ) !<GPU:DEVICE>
!---------------------------------------------------------------------
!! O. Gunnarsson and B. I. Lundqvist, PRB 13, 4274 (1976).
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ec
!! correlation energy
REAL(DP), INTENT(OUT) :: vc
!! correlation potential
!
! ... local variables
!
REAL(DP) :: x
REAL(DP), PARAMETER :: c=0.0333d0, r=11.4d0
! c=0.0203, r=15.9 for the paramagnetic case
!
x = rs / r
vc = - c * LOG(1.d0 + 1.d0 / x)
ec = - c * ( (1.d0 + x**3) * LOG(1.d0 + 1.d0 / x) - 1.0d0 / &
3.0d0 + x * (0.5d0 - x) )
!
RETURN
!
END SUBROUTINE gl_l
!
!
! END MODULE

15
XClib/dft_par_mod.f90 Normal file
View File

@ -0,0 +1,15 @@
!
! ... LDAlib
!
MODULE dft_par_mod
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!
INTEGER :: iexch, icorr
LOGICAL :: exx_started !, is_there_finite_size_corr
REAL(DP) :: finite_size_cell_volume, exx_fraction
REAL(DP) :: rho_threshold
!
END MODULE

176
XClib/exchange_lda.f90 Normal file
View File

@ -0,0 +1,176 @@
!
! Copyright (C) 2001-2014 Quantum ESPRESSO 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 .
!
!
! MODULE exch_lda !<GPU:exch_lda=>exch_lda_gpu>
!
! ! Module containing LDA functionals.
!
! CONTAINS
!-----------------------------------------------------------------------
SUBROUTINE slater_l( rs, ex, vx ) !<GPU:DEVICE>
!---------------------------------------------------------------------
!! Slater exchange with alpha=2/3
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ex
!! Exchange energy (per unit volume)
REAL(DP), INTENT(OUT) :: vx
!! Exchange potential
!
! ... local variables
!
REAL(DP), PARAMETER :: f = -0.687247939924714_DP, alpha = 2.0_DP/3.0_DP
! f = -9/8*(3/2pi)^(2/3)
ex = f * alpha / rs
vx = 4._DP / 3._DP * f * alpha / rs
!
RETURN
!
END SUBROUTINE slater_l
!
!
!-----------------------------------------------------------------------
SUBROUTINE slater1_l( rs, ex, vx ) !<GPU:DEVICE>
!---------------------------------------------------------------------
!! Slater exchange with alpha=1, corresponding to -1.374/r_s Ry.
!! Used to recover old results.
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ex
!! Exchange energy (per unit volume)
REAL(DP), INTENT(OUT) :: vx
!! Exchange potential
!
! ... local variables
!
REAL(DP), PARAMETER :: f = -0.687247939924714d0, alpha = 1.0d0
!
ex = f * alpha / rs
vx = 4.d0 / 3.d0 * f * alpha / rs
!
RETURN
!
END SUBROUTINE slater1_l
!
!
!-----------------------------------------------------------------------
SUBROUTINE slater_rxc_l( rs, ex, vx ) !<GPU:DEVICE>
!---------------------------------------------------------------------
!! Slater exchange with alpha=2/3 and Relativistic exchange.
!
USE kind_l, ONLY: DP
USE constants_l, ONLY: pi, c_au
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ex
!! Exchange energy (per unit volume)
REAL(DP), INTENT(OUT) :: vx
!! Exchange potential
!
! ... local variables
!
REAL(DP), PARAMETER :: zero=0.d0, one=1.d0, pfive=0.5d0, &
opf=1.5d0 !, C014=0.014D0
REAL(DP) :: trd, ftrd, tftm, a0, alp, z, fz, fzp, vxp, xp, &
beta, sb, alb, c014
!
trd = one/3.d0
ftrd = 4.d0*trd
tftm = 2**ftrd-2.d0
A0 = (4.d0/(9.d0*PI))**trd
C014 = 1.0_DP/a0/c_au
! --- X-alpha PARAMETER:
alp = 2.d0 * trd
!
z = zero
fz = zero
fzp= zero
!
vxp = -3.d0*alp/( 2.d0*PI*A0*rs )
xp = 3.d0*vxp/4.d0
beta= C014 / rs
sb = SQRT(1.d0+beta*beta)
alb = LOG(beta+sb)
vxp = vxp * ( -pfive + opf * alb / (beta*sb) )
xp = xp * ( one-opf*((beta*sb-alb)/beta**2)**2 )
! vxf = 2**trd*vxp
! exf = 2**trd*xp
vx = vxp
ex = xp
!
RETURN
!
END SUBROUTINE slater_rxc_l
!
!
!-----------------------------------------------------------------------
SUBROUTINE slaterKZK_l( rs, ex, vx, vol ) !<GPU:DEVICE>
!---------------------------------------------------------------------
!! Slater exchange with alpha=2/3, Kwee, Zhang and Krakauer KE
!! correction.
!
USE kind_l, ONLY: DP
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rs
!! Wigner-Seitz radius
REAL(DP), INTENT(OUT) :: ex
!! Exchange energy (per unit volume)
REAL(DP), INTENT(OUT) :: vx
!! Exchange potential
REAL(DP) :: vol !<GPU:VALUE>
!! Finite size volume element
!
! ... local variables
!
REAL(DP) :: dL, ga, pi, a0
REAL(DP), PARAMETER :: a1 = -2.2037d0, &
a2 = 0.4710d0, a3 = -0.015d0, ry2h = 0.5d0
REAL(DP), PARAMETER :: f = -0.687247939924714d0, alpha = 2.0d0/3.0d0
! f = -9/8*(3/2pi)^(2/3)
!
pi = 4.d0 * ATAN(1.d0)
a0 = f * alpha * 2.d0
!
dL = vol**(1.d0/3.d0)
ga = 0.5d0 * dL *(3.d0 /pi)**(1.d0/3.d0)
!
IF ( rs < ga ) THEN
ex = a0 / rs + a1 * rs / dL**2.d0 + a2 * rs**2.d0 / dL**3.d0
vx = (4.d0 * a0 / rs + 2.d0 * a1 * rs / dL**2.d0 + &
a2 * rs**2.d0 / dL**3.d0 ) / 3.d0
ELSE
ex = a0 / ga + a1 * ga / dL**2.d0 + a2 * ga**2.d0 / dL**3.d0 ! solids
vx = ex
! ex = a3 * dL**5.d0 / rs**6.d0 ! molecules
! vx = 3.d0 * ex
ENDIF
!
ex = ry2h * ex ! Ry to Hartree
vx = ry2h * vx
!
RETURN
!
END SUBROUTINE slaterKZK_l
!
!
! END MODULE

59
XClib/get_ldaxc.f90 Normal file
View File

@ -0,0 +1,59 @@
!
! ... LDAlib
!
SUBROUTINE get_ldaxclib( iexch_, icorr_ )
!
USE dft_par_mod
!
IMPLICIT NONE
!
INTEGER, INTENT(IN) :: iexch_, icorr_
!
iexch = iexch_
icorr = icorr_
!
RETURN
!
END SUBROUTINE
SUBROUTINE get_ldaxcparlib( finite_size_cell_volume_, exx_started_, exx_fraction_ )
!
USE kind_l, ONLY: DP
USE dft_par_mod
!
IMPLICIT NONE
!
REAL(DP), OPTIONAL, INTENT(IN) :: finite_size_cell_volume_
LOGICAL, OPTIONAL, INTENT(IN) :: exx_started_
REAL(DP), OPTIONAL, INTENT(IN) :: exx_fraction_
!
finite_size_cell_volume = -1.d0
IF ( present(finite_size_cell_volume_) ) &
finite_size_cell_volume = finite_size_cell_volume_
exx_started = .FALSE.
IF ( present(exx_started_) ) &
exx_started = exx_started_
exx_fraction = 0.d0
IF ( present(exx_fraction_) ) &
exx_fraction = exx_fraction_
!
RETURN
!
END SUBROUTINE
SUBROUTINE get_threshold( rho_threshold_ )
!
USE kind_l, ONLY: DP
USE dft_par_mod
!
IMPLICIT NONE
!
REAL(DP), INTENT(IN) :: rho_threshold_
!
rho_threshold = rho_threshold_
!
RETURN
!
END SUBROUTINE

19
XClib/kind_l.f90 Normal file
View File

@ -0,0 +1,19 @@
!
! ... LDAlib
!
MODULE kind_l
!------------------------------------------------------------------------------!
! #if defined(__MPI)
! #if defined(__MPI_MODULE)
! USE mpi
! #else
! INCLUDE 'mpif.h'
! #endif
! #endif
!
IMPLICIT NONE
SAVE
INTEGER, PARAMETER :: DP = selected_real_kind(14,200)
PUBLIC :: DP
!
END MODULE

120
XClib/ldaxc_interfaces.f90 Normal file
View File

@ -0,0 +1,120 @@
!
! ... LDAlib
!
!=---------------------------------------------------------------------------=!
MODULE ldaxc_interfaces
!
IMPLICIT NONE
PRIVATE
!
PUBLIC :: XC_LDA, SLATER, PZ, PW
PUBLIC :: GET_LDAXC_INDEXES, GET_LDAXC_PARAM, GET_LDA_THRESHOLD
!
!
INTERFACE GET_LDAXC_INDEXES
!
SUBROUTINE get_ldaxclib( iexch_, icorr_ )
!
!USE dft_par_mod
USE kind_l, ONLY: DP
IMPLICIT NONE
INTEGER, INTENT(IN) :: iexch_, icorr_
!
END SUBROUTINE
!
END INTERFACE
!
INTERFACE GET_LDAXC_PARAM
!
SUBROUTINE get_ldaxcparlib( finite_size_cell_volume_, exx_started_, exx_fraction_ )
!
!USE dft_par_mod
USE kind_l, ONLY: DP
IMPLICIT NONE
REAL(DP), OPTIONAL, INTENT(IN) :: finite_size_cell_volume_
LOGICAL , OPTIONAL, INTENT(IN) :: exx_started_
REAL(DP), OPTIONAL, INTENT(IN) :: exx_fraction_
!
END SUBROUTINE
!
END INTERFACE
!
INTERFACE GET_LDA_THRESHOLD
!
SUBROUTINE get_threshold( rho_threshold_ )
!
!USE dft_par_mod
USE kind_l, ONLY: DP
IMPLICIT NONE
REAL(DP), INTENT(IN) :: rho_threshold_
!
END SUBROUTINE
!
END INTERFACE
!--------------------------------------------------------
!
INTERFACE XC_LDA
!
SUBROUTINE xc_lda_l( length, rho_in, ex_out, ec_out, vx_out, vc_out )
!
USE dft_par_mod
USE kind_l, ONLY: DP
IMPLICIT NONE
INTEGER, INTENT(IN) :: length
REAL(DP), INTENT(IN) :: rho_in(length)
REAL(DP), INTENT(OUT) :: ec_out(length), vc_out(length), &
ex_out(length), vx_out(length)
!
END SUBROUTINE xc_lda_l
!
END INTERFACE
!
!--------------------------------------------------------
!
INTERFACE SLATER
!
SUBROUTINE slater_l( rs, ex, vx )
!
USE kind_l, ONLY: DP
IMPLICIT NONE
REAL(DP), INTENT(IN) :: rs
REAL(DP), INTENT(OUT) :: ex
REAL(DP), INTENT(OUT) :: vx
!
END SUBROUTINE slater_l
!
END INTERFACE
!
!
INTERFACE PZ
!
SUBROUTINE pz_l( rs, iflag, ec, vc )
!
USE kind_l, ONLY: DP
IMPLICIT NONE
REAL(DP), INTENT(IN) :: rs
REAL(DP), INTENT(OUT) :: ec, vc
INTEGER, INTENT(IN) :: iflag
!
END SUBROUTINE pz_l
!
END INTERFACE
!
!
INTERFACE PW
!
SUBROUTINE pw_l( rs, iflag, ec, vc )
!
USE kind_l, ONLY: DP
IMPLICIT NONE
REAL(DP), INTENT(IN) :: rs
REAL(DP), INTENT(OUT) :: ec, vc
INTEGER, INTENT(IN) :: iflag
!
END SUBROUTINE pw_l
!
END INTERFACE
!
!
END MODULE ldaxc_interfaces
!=---------------------------------------------------------------------------=!

14
XClib/make.depend Normal file
View File

@ -0,0 +1,14 @@
xc_lda.o : kind_l.o
xc_lda.o : dft_par_mod.o
xc_lda.o : correlation_lda.o
xc_lda.o : exchange_lda.o
ldaxc_interfaces.o : dft_par_mod.o
ldaxc_interfaces.o : kind_l.o
correlation_lda.o : kind_l.o
exchange_lda.o : kind_l.o
exchange_lda.o : constants_l.o
get_ldaxc.o : kind_l.o
get_ldaxc.o : dft_par_mod.o
constants_l.o : kind_l.o
dft_par_mod.o : kind_l.o
kind_l.o :

242
XClib/xc_lda.f90 Normal file
View File

@ -0,0 +1,242 @@
!----------------------------------------------------------------------------
SUBROUTINE xc_lda_l( length, rho_in, ex_out, ec_out, vx_out, vc_out )
!--------------------------------------------------------------------------
!! LDA exchange and correlation functionals - Hartree a.u.
!
!! * Exchange:
!! * Slater;
!! * relativistic Slater.
!! * Correlation:
!! * Ceperley-Alder (Perdew-Zunger parameters);
!! * Vosko-Wilk-Nusair;
!! * Lee-Yang-Parr;
!! * Perdew-Wang;
!! * Wigner;
!! * Hedin-Lundqvist;
!! * Ortiz-Ballone (Perdew-Zunger formula);
!! * Ortiz-Ballone (Perdew-Wang formula);
!! * Gunnarsson-Lundqvist.
!
!! NOTE:
!! $$ E_x = \int E_x(\text{rho}) dr, E_x(\text{rho}) =
!! \text{rho}\epsilon_c(\text{rho})\ . $$
!! Same for correlation.
!
USE kind_l, ONLY: DP
USE dft_par_mod
! USE exch_lda !-gpu
! USE corr_lda !-gpu
!
IMPLICIT NONE
!
INTEGER, INTENT(IN) :: length
!! length of the I/O arrays
REAL(DP), INTENT(IN), DIMENSION(length) :: rho_in
!! Charge density
REAL(DP), INTENT(OUT), DIMENSION(length) :: ex_out
!! \(\epsilon_x(rho)\) ( NOT \(E_x(\text{rho})\) )
REAL(DP), INTENT(OUT), DIMENSION(length) :: vx_out
!! \(dE_x(\text{rho})/d\text{rho}\) ( NOT \(d\epsilon_x(\text{rho})/d\text{rho}\) )
REAL(DP), INTENT(OUT), DIMENSION(length) :: ec_out
!! \(\epsilon_c(rho)\) ( NOT \(E_c(\text{rho})\) )
REAL(DP), INTENT(OUT), DIMENSION(length) :: vc_out
!! \(dE_c(\text{rho})/d\text{rho}\) ( NOT \(d\epsilon_c(\text{rho})/d\text{rho}\) )
!
! ... local variables
!
INTEGER :: ir
REAL(DP) :: rho, rs
REAL(DP) :: ex, ec, ec_
REAL(DP) :: vx, vc, vc_
!REAL(DP) :: exx_fraction
!REAL(DP) :: finite_size_cell_volume
!LOGICAL :: exx_started, is_there_finite_size_corr
REAL(DP), PARAMETER :: third = 1.0_DP/3.0_DP, &
pi34 = 0.6203504908994_DP, e2 = 2.0_DP
! pi34 = (3/4pi)^(1/3)
!
#if defined(_OPENMP)
INTEGER :: ntids
INTEGER, EXTERNAL :: omp_get_num_threads
!
ntids = omp_get_num_threads()
#endif
!
!exx_started = exx_is_active() !....to adjust...
!exx_fraction = get_exx_fraction()
rho_threshold = 1.E-10_DP !....out
!IF (iexch==8 .OR. icorr==10) THEN
! CALL get_finite_size_cell_volume( is_there_finite_size_corr, &
! finite_size_cell_volume )
!
! IF (.NOT. is_there_finite_size_corr) CALL errore( 'XC',&
! 'finite size corrected exchange used w/o initialization', 1 )
!ENDIF
!
!$omp parallel if(ntids==1)
!$omp do private( rho, rs, ex, ec, ec_, vx, vc, vc_ )
DO ir = 1, length
!
rho = ABS(rho_in(ir))
!
! ... RHO THRESHOLD
!
IF ( rho > rho_threshold ) THEN
rs = pi34 / rho**third
ELSE
ex_out(ir) = 0.0_DP ; ec_out(ir) = 0.0_DP
vx_out(ir) = 0.0_DP ; vc_out(ir) = 0.0_DP
CYCLE
ENDIF
!
! ... EXCHANGE
!
SELECT CASE( iexch )
CASE( 1 ) ! 'sla'
!
CALL slater_l( rs, ex, vx )
!
CASE( 2 ) ! 'sl1'
!
CALL slater1_l( rs, ex, vx )
!
CASE( 3 ) ! 'rxc'
!
CALL slater_rxc_l( rs, ex, vx )
!
CASE( 4, 5 ) ! 'oep','hf'
!
IF ( exx_started ) THEN
ex = 0.0_DP
vx = 0.0_DP
ELSE
CALL slater_l( rs, ex, vx )
ENDIF
!
CASE( 6, 7 ) ! 'pb0x' or 'DF-cx-0', or 'DF2-0',
! ! 'B3LYP'
CALL slater_l( rs, ex, vx )
IF ( exx_started ) THEN
ex = (1.0_DP - exx_fraction) * ex
vx = (1.0_DP - exx_fraction) * vx
ENDIF
!
CASE( 8 ) ! 'sla+kzk'
!
CALL slaterKZK_l( rs, ex, vx, finite_size_cell_volume )
!
CASE( 9 ) ! 'X3LYP'
!
CALL slater_l( rs, ex, vx )
IF ( exx_started ) THEN
ex = (1.0_DP - exx_fraction) * ex
vx = (1.0_DP - exx_fraction) * vx
ENDIF
!
CASE DEFAULT
!
ex = 0.0_DP
vx = 0.0_DP
!
END SELECT
!
!
! ... CORRELATION
!
SELECT CASE( icorr )
CASE( 1 )
!
CALL pz_l( rs, 1, ec, vc )
!
CASE( 2 )
!
CALL vwn_l( rs, ec, vc )
!
CASE( 3 )
!
CALL lyp_l( rs, ec, vc )
!
CASE( 4 )
!
CALL pw_l( rs, 1, ec, vc )
!
CASE( 5 )
!
CALL wignerc_l( rs, ec, vc )
!
CASE( 6 )
!
CALL hl_l( rs, ec, vc )
!
CASE( 7 )
!
CALL pz_l( rs, 2, ec, vc )
!
CASE( 8 )
!
CALL pw_l( rs, 2, ec, vc )
!
CASE( 9 )
!
CALL gl_l( rs, ec, vc )
!
CASE( 10 )
!
CALL pzKZK_l( rs, ec, vc, finite_size_cell_volume )
!
CASE( 11 )
!
CALL vwn1_rpa_l( rs, ec, vc )
!
CASE( 12 ) ! 'B3LYP'
!
CALL vwn_l( rs, ec, vc )
ec = 0.19_DP * ec
vc = 0.19_DP * vc
!
CALL lyp_l( rs, ec_, vc_ )
ec = ec + 0.81_DP * ec_
vc = vc + 0.81_DP * vc_
!
CASE( 13 ) ! 'B3LYP-V1R'
!
CALL vwn1_rpa_l( rs, ec, vc )
ec = 0.19_DP * ec
vc = 0.19_DP * vc
!
CALL lyp_l( rs, ec_, vc_ )
ec = ec + 0.81_DP * ec_
vc = vc + 0.81_DP * vc_
!
CASE( 14 ) ! 'X3LYP'
!
CALL vwn1_rpa_l( rs, ec, vc )
ec = 0.129_DP * ec
vc = 0.129_DP * vc
!
CALL lyp_l( rs, ec_, vc_ )
ec = ec + 0.871_DP * ec_
vc = vc + 0.871_DP * vc_
!
CASE DEFAULT
!
ec = 0.0_DP
vc = 0.0_DP
!
END SELECT
!
ex_out(ir) = ex ; ec_out(ir) = ec
vx_out(ir) = vx ; vc_out(ir) = vc
!
ENDDO
!$omp end do
!$omp end parallel
!
!
RETURN
!
END SUBROUTINE xc_lda_l

View File

@ -39,7 +39,7 @@ GIPAWOBJS=./paw_gipaw.o \
MANIP_XS_OBJ=./gaunt_mod.o
QEMODS = ../../Modules/libqemod.a ../../upflib/libupf.a \
../../FFTXlib/libqefft.a ../../KS_Solvers/libks_solvers.a \
../../FFTXlib/libqefft.a ../../KS_Solvers/libks_solvers.a ../../XClib/libqeldaxc.a \
../../LAXlib/libqela.a ../../UtilXlib/libutil.a ../../dft-d3/libdftd3qe.a
PWOBJS = ../../PW/src/libpw.a

View File

@ -59,6 +59,7 @@ MOD_FLAG = @imod@
# Each Makefile can add directories to MODFLAGS and libraries to QEMODS
BASEMOD_FLAGS= $(MOD_FLAG)$(TOPDIR)/upflib \
$(MOD_FLAG)$(TOPDIR)/XClib \
$(MOD_FLAG)$(TOPDIR)/Modules \
$(MOD_FLAG)$(TOPDIR)/FFTXlib \
$(MOD_FLAG)$(TOPDIR)/LAXlib \

View File

@ -18,7 +18,7 @@ then
dirs=" LAXlib FFTXlib UtilXlib clib \
KS_Solvers/Davidson KS_Solvers/Davidson_RCI KS_Solvers/CG \
KS_Solvers/PPCG KS_Solvers/ParO KS_Solvers/DENSE \
upflib Modules LR_Modules PW/src CPV/src PW/tools PP/src PWCOND/src \
upflib XClib Modules LR_Modules PW/src CPV/src PW/tools PP/src PWCOND/src \
PHonon/Gamma PHonon/PH PHonon/FD HP/src atomic/src \
EPW/src XSpectra/src ACFDT/src NEB/src TDDFPT/src \
GWW/pw4gww GWW/gww GWW/head GWW/bse GWW/simple \
@ -57,10 +57,10 @@ for dir in $dirs; do
# default
DEPENDS="$LEVEL1/include"
# for convenience, used later
DEPEND1="$LEVEL1/include $LEVEL1/FFTXlib $LEVEL1/LAXlib $LEVEL1/UtilXlib \
DEPEND1="$LEVEL1/include $LEVEL1/FFTXlib $LEVEL1/XClib $LEVEL1/LAXlib $LEVEL1/UtilXlib \
$LEVEL1/upflib"
DEPEND3="$LEVEL2/include $LEVEL2/FFTXlib $LEVEL2/LAXlib $LEVEL2/UtilXlib"
DEPEND2="$DEPEND3 $LEVEL2/upflib $LEVEL2/Modules"
DEPEND2="$DEPEND3 $LEVEL2/upflib $LEVEL2/XClib $LEVEL2/Modules"
case $DIR in
Modules )
DEPENDS="$DEPEND1" ;;
@ -140,6 +140,10 @@ for dir in $dirs; do
if test "$DIR" = "Modules"
then
sed '/@mbd@/d' make.depend > tmp; mv tmp make.depend
if test "$DIR" = "XClib"
then
sed '/@elpa1@/d' make.depend > tmp; mv tmp make.depend
fi
if test "$DIR" = "PW/src" || test "$DIR" = "TDDFPT/src"