Remove SRLDA functional

- LibXC has the same functional with higher derivatives available
This commit is contained in:
Frederick Stein 2021-05-13 20:58:48 +02:00 committed by Frederick Stein
parent 4c6b92ed24
commit 779b36c4d2
10 changed files with 49 additions and 1059 deletions

View file

@ -84,8 +84,8 @@ MODULE bibliography
Brieuc2016, Barca2018, Scheiber2018, Huang2011, Heaton_Burgess2007, &
Schuett2018, Holmberg2018, Togo2018, Staub2019, Grimme2013, Grimme2016, &
Grimme2017, Kondov2007, Clabaut2020, &
Ren2011, Ren2013, Cohen2000, Rogers2002, Filippetti2000, Paziani2006, &
Toulouse2004, Limpanuparb2011, Martin2003, Yin2017, Goerigk2017, &
Ren2011, Ren2013, Cohen2000, Rogers2002, Filippetti2000, &
Limpanuparb2011, Martin2003, Yin2017, Goerigk2017, &
Wilhelm2016a, Wilhelm2016b, Wilhelm2017, Wilhelm2018, Lass2018, cp2kqs2020, &
Behler2007, Behler2011, Schran2020a, Schran2020b, &
Rycroft2009, Thomas2015, Brehm2018, Brehm2020, Shigeta2001, Heinecke2016, &
@ -4306,77 +4306,6 @@ CONTAINS
"ER"), &
DOI="10.1103/PhysRevB.61.8433")
CALL add_reference(key=Paziani2006, ISI_record=s2a( &
"AU Paziani, S", &
" Moroni, S", &
" Gori-Giorgi, P", &
" Bachelet, GB", &
"AF Paziani, S", &
" Moroni, S", &
" Gori-Giorgi, P", &
" Bachelet, GB", &
"TI Local-spin-density functional for multideterminant density functional", &
" theory", &
"SO PHYSICAL REVIEW B", &
"NR 62", &
"TC 64", &
"Z9 64", &
"PU AMER PHYSICAL SOC", &
"PI COLLEGE PK", &
"PA ONE PHYSICS ELLIPSE, COLLEGE PK, MD 20740-3844 USA", &
"SN 2469-9950", &
"EI 2469-9969", &
"J9 PHYS REV B", &
"JI Phys. Rev. B", &
"PD APR", &
"PY 2006", &
"VL 73", &
"IS 15", &
"AR 155111", &
"DI 10.1103/PhysRevB.73.155111", &
"PG 9", &
"SC Materials Science; Physics", &
"GA 037OA", &
"UT WOS:000237155100035", &
"ER"), &
DOI="10.1103/PhysRevB.73.155111")
CALL add_reference(key=Toulouse2004, ISI_record=s2a( &
"AU Toulouse, J", &
" Savin, A", &
" Flad, HJ", &
"AF Toulouse, J", &
" Savin, A", &
" Flad, HJ", &
"TI Short-range exchange-correlation energy of a uniform electron gas with", &
" modified electron-electron interaction", &
"SO INTERNATIONAL JOURNAL OF QUANTUM CHEMISTRY", &
"CT 43rd International Symposium on Theory and Computations in Molecular and", &
" Materials Sciences, Biology, and Pharmacology", &
"RP Savin, A (reprint author), CNRS, Chim Theor Lab, 4 Pl Jussieu, F-75252 Paris, France.", &
"NR 28", &
"TC 90", &
"Z9 90", &
"PU WILEY-BLACKWELL", &
"PI HOBOKEN", &
"PA 111 RIVER ST, HOBOKEN 07030-5774, NJ USA", &
"SN 0020-7608", &
"EI 1097-461X", &
"J9 INT J QUANTUM CHEM", &
"JI Int. J. Quantum Chem.", &
"PD DEC 20", &
"PY 2004", &
"VL 100", &
"IS 6", &
"BP 1047", &
"EP 1056", &
"DI 10.1002/qua.20259", &
"PG 10", &
"GA 866QS", &
"UT WOS:000224788600025", &
"ER"), &
DOI="10.1002/qua.20259")
CALL add_reference(key=Limpanuparb2011, ISI_record=s2a( &
"AU Limpanuparb, Taweetham", &
" Gill, Peter M. W.", &

View file

@ -14,9 +14,8 @@
MODULE input_cp2k_xc
USE bibliography, ONLY: &
Becke1988, Becke1997, BeckeRoussel1989, Goedecker1996, Grimme2006, Grimme2010, Grimme2011, &
Heyd2004, Kruse2012, Lee1988, Lehtola2018, Marques2012, Ortiz1994, Paziani2006, &
Perdew1981, Perdew1996, Perdew2008, Proynov2007, Tao2003, Toulouse2004, Tran2013, &
Vosko1980, Wellendorff2012, Zhang1998
Heyd2004, Kruse2012, Lee1988, Lehtola2018, Marques2012, Ortiz1994, Perdew1981, Perdew1996, &
Perdew2008, Proynov2007, Tao2003, Tran2013, Vosko1980, Wellendorff2012, Zhang1998
USE cp_output_handling, ONLY: add_last_numeric,&
cp_print_key_section_create,&
high_print_level
@ -731,45 +730,6 @@ CONTAINS
CALL section_add_subsection(section, subsection)
CALL section_release(subsection)
CALL section_create(subsection, __LOCATION__, name="SRLDA", &
description="Uses the short-range LDA functional", &
n_keywords=0, n_subsections=0, repeats=.FALSE., &
citations=(/Paziani2006, Toulouse2004/))
CALL keyword_create(keyword, __LOCATION__, name="_SECTION_PARAMETERS_", &
description="activates the functional", &
lone_keyword_l_val=.TRUE., default_l_val=.FALSE.)
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="scale_x", &
description="scales the exchange part of the functional", &
default_r_val=1._dp)
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="scale_c", &
description="scales the correlation part of the functional", &
default_r_val=1._dp)
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="omega", &
description="provide the range-separation parameter of the functional", &
default_r_val=1._dp)
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="PARAMETRIZATION", &
description="Which one parametrizations of the underlying PW92 functional should be used", &
usage="PARAMETRIZATION DMC", &
enum_c_vals=(/ &
"ORIGINAL", &
"DMC ", &
"VMC "/), &
enum_i_vals=(/c_pw92, c_pw92dmc, c_pw92vmc/), &
default_i_val=c_pw92)
CALL section_add_keyword(subsection, keyword)
CALL keyword_release(keyword)
CALL section_add_subsection(section, subsection)
CALL section_release(subsection)
END SUBROUTINE create_xc_fun_section
! **************************************************************************************************

View file

@ -67,9 +67,6 @@ MODULE xc_derivatives
xc_rho_cflags_type
USE xc_rho_set_types, ONLY: xc_rho_set_get,&
xc_rho_set_type
USE xc_sr_lda, ONLY: sr_lda_eval,&
sr_lda_info,&
sr_lsd_eval
USE xc_tfw, ONLY: tfw_lda_eval,&
tfw_lda_info,&
tfw_lsd_eval,&
@ -320,8 +317,6 @@ CONTAINS
ELSE
CALL xbr_pbe_lda_hole_tc_lr_lda_info(reference, shortform, needs, max_deriv)
END IF
CASE ("SRLDA")
CALL sr_lda_info(reference, shortform, lsd, needs, max_deriv)
CASE default
! If the functional has not been implemented internally, it's from LibXC
IF (lsd) THEN
@ -549,12 +544,6 @@ CONTAINS
CALL xbr_pbe_lda_hole_tc_lr_lda_eval(rho_set, deriv_set, deriv_order, &
functional)
END IF
CASE ("SRLDA")
IF (lsd) THEN
CALL sr_lsd_eval(rho_set, deriv_set, deriv_order, functional)
ELSE
CALL sr_lda_eval(rho_set, deriv_set, deriv_order, functional)
END IF
CASE default
! If functional not natively supported, ask LibXC
IF (lsd) THEN

View file

@ -1,917 +0,0 @@
!--------------------------------------------------------------------------------------------------!
! CP2K: A general program to perform molecular dynamics simulations !
! Copyright 2000-2021 CP2K developers group <https://cp2k.org> !
! !
! SPDX-License-Identifier: GPL-2.0-or-later !
!--------------------------------------------------------------------------------------------------!
! **************************************************************************************************
!> \brief Calculates the short range correlation LDA energy (Improved version of Paola Gori-Giorgi's Code
!> \par History
!> 18-MAR-2002, TCH, working version
!> fawzi (04.2004) : adapted to the new xc interface
!> \see functionals_utilities
! **************************************************************************************************
MODULE xc_sr_lda
#:include "xc_perdew_wang.fypp"
USE bibliography, ONLY: Paziani2006, &
Toulouse2004, &
cite_reference
USE input_section_types, ONLY: section_vals_type, &
section_vals_val_get
USE kinds, ONLY: dp
USE mathconstants, ONLY: pi
USE xc_input_constants, ONLY: pw_dmc, &
pw_orig, &
pw_vmc
USE xc_derivative_set_types, ONLY: xc_derivative_set_type, &
xc_dset_get_derivative
USE xc_derivative_types, ONLY: xc_derivative_get, &
xc_derivative_type
USE xc_rho_cflags_types, ONLY: xc_rho_cflags_type
USE xc_rho_set_types, ONLY: xc_rho_set_get, &
xc_rho_set_type
USE xc_functionals_utilities, ONLY: set_util
#include "../base/base_uses.f90"
IMPLICIT NONE
PRIVATE
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xc_sr_lda'
@:global_var_pw92()
REAL(KIND=dp), PARAMETER, PRIVATE :: &
Acoul = 2._dp*(LOG(2._dp) - 1._dp)/pi**2, &
aQ2 = 5.84605_dp, &
cQ2 = 3.91744_dp, &
dQ2 = 3.44851_dp, &
bQ2 = dQ2 - 3._dp/(2._dp*pi*Acoul)*(4._dp/(9._dp*pi))**(1._dp/3._dp), &
f02 = 4._dp/(9._dp*(2._dp**(1._dp/3._dp) - 1._dp)), &
alpha = (4._dp/9._dp/pi)**(1._dp/3._dp), &
cf = (9._dp*pi/4._dp)**(1._dp/3._dp), &
p2p = 0.04_dp, &
p3p = 0.4319_dp, &
Cg0 = 0.0819306_dp, &
Fg0 = 0.752411_dp, &
Dg0 = -0.0127713_dp, &
Eg0 = 0.00185898_dp, &
Bg0 = 0.7317_dp - Fg0, &
adib = 0.784949_dp, &
q1a = -0.388_dp, &
q2a = 0.676_dp, &
q3a = 0.547_dp, &
t1a = -4.95_dp, &
t2a = 1._dp, &
t3a = 0.31_dp
PUBLIC :: sr_lda_info, sr_lda_eval, sr_lsd_eval
CONTAINS
! **************************************************************************************************
!> \brief Return some info on the functionals.
!> \param reference full reference
!> \param shortform short reference
!> \param lsd ...
!> \param needs ...
!> \param max_deriv ...
! **************************************************************************************************
SUBROUTINE sr_lda_info(reference, shortform, lsd, needs, max_deriv)
CHARACTER(LEN=*), INTENT(OUT), OPTIONAL :: reference, shortform
LOGICAL, INTENT(IN), OPTIONAL :: lsd
TYPE(xc_rho_cflags_type), INTENT(INOUT), OPTIONAL :: needs
INTEGER, INTENT(OUT), OPTIONAL :: max_deriv
CALL cite_reference(Toulouse2004)
CALL cite_reference(Paziani2006)
IF (PRESENT(reference)) THEN
reference = "J. Toulouse, A. Savin, and H.-J. Flad," &
//" Int. J. Quantum Chem. 100, 1074-1056 (2004)"
END IF
IF (PRESENT(shortform)) THEN
shortform = "J. Toulouse et al., IJQC 100, 1074-1056 (2004)"
END IF
IF (PRESENT(needs)) THEN
IF (lsd) THEN
needs%rho_spin = .TRUE.
ELSE
needs%rho = .TRUE.
END IF
END IF
IF (PRESENT(max_deriv)) max_deriv = 1
END SUBROUTINE sr_lda_info
@:init_pw92()
! **************************************************************************************************
!> \brief Calculate the correlation energy and its derivatives
!> wrt to rho (the electron density) up to 3rd order. This
!> is the short-range LDA version of the Perdew-Wang correlation energy
!> If no order argument is given, then the routine calculates
!> just the energy.
!> \param rho_set ...
!> \param deriv_set ...
!> \param order order of derivatives to calculate
!> order must lie between -2 and 2. If it is negative then only
!> that order will be calculated, otherwise all derivatives up to
!> that order will be calculated.
!> \param sr_section ...
! **************************************************************************************************
SUBROUTINE sr_lda_eval(rho_set, deriv_set, order, sr_section)
TYPE(xc_rho_set_type), POINTER :: rho_set
TYPE(xc_derivative_set_type), POINTER :: deriv_set
INTEGER, INTENT(in) :: order
TYPE(section_vals_type), POINTER :: sr_section
CHARACTER(len=*), PARAMETER :: routineN = 'sr_lda_eval'
INTEGER :: npoints, handle, method
INTEGER, DIMENSION(:, :), POINTER :: bo
REAL(KIND=dp) :: omega, rho_cutoff, sc, sx
REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: dummy, e_0, e_rho, rho
TYPE(xc_derivative_type), POINTER :: deriv
CALL timeset(routineN, handle)
CALL section_vals_val_get(sr_section, 'SCALE_X', r_val=sx)
CALL section_vals_val_get(sr_section, 'SCALE_C', r_val=sc)
CALL section_vals_val_get(sr_section, 'OMEGA', r_val=omega)
CALL section_vals_val_get(sr_section, 'PARAMETRIZATION', i_val=method)
NULLIFY (bo, rho, e_0, e_rho, dummy)
CPASSERT(ASSOCIATED(rho_set))
CPASSERT(rho_set%ref_count > 0)
CPASSERT(ASSOCIATED(deriv_set))
CPASSERT(deriv_set%ref_count > 0)
CALL xc_rho_set_get(rho_set, rho=rho, &
local_bounds=bo, rho_cutoff=rho_cutoff)
CALL perdew_wang_init(method, rho_cutoff)
npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
dummy => rho
e_0 => dummy
e_rho => dummy
IF (order >= 0) THEN
deriv => xc_dset_get_derivative(deriv_set, "", &
allocate_deriv=.TRUE.)
CALL xc_derivative_get(deriv, deriv_data=e_0)
END IF
IF (order >= 1 .OR. order == -1) THEN
deriv => xc_dset_get_derivative(deriv_set, "(rho)", &
allocate_deriv=.TRUE.)
CALL xc_derivative_get(deriv, deriv_data=e_rho)
END IF
IF (order > 1 .OR. order < -1) THEN
CPABORT("derivatives bigger than 1 not implemented")
END IF
CALL sr_lda_calc(rho, omega, rho_cutoff, e_0, e_rho, &
npoints, order, sx, sc)
CALL timestop(handle)
END SUBROUTINE sr_lda_eval
! **************************************************************************************************
!> \brief ...
!> \param rho ...
!> \param omega ...
!> \param rho_cutoff ...
!> \param e_0 ...
!> \param e_rho ...
!> \param npoints ...
!> \param order ...
!> \param sx ...
!> \param sc ...
! **************************************************************************************************
SUBROUTINE sr_lda_calc(rho, omega, rho_cutoff, e_0, e_rho, npoints, order, sx, sc)
!FM low level calc routine
REAL(KIND=dp), DIMENSION(*), INTENT(IN) :: rho
REAL(KIND=dp), INTENT(IN) :: omega, rho_cutoff
REAL(KIND=dp), DIMENSION(*), INTENT(INOUT) :: e_0, e_rho
INTEGER, INTENT(IN) :: npoints, order
REAL(KIND=dp), INTENT(IN) :: sx, sc
CHARACTER(len=*), PARAMETER :: routineN = 'sr_lda_calc'
INTEGER :: handle, k
REAL(KIND=dp) :: my_rho, rs
REAL(KIND=dp), DIMENSION(0:1) :: ed
CALL timeset(routineN, handle)
IF (sc /= 0.0_dp .OR. sx /= 0.0_dp) THEN
!$OMP PARALLEL DO PRIVATE (k, ed, my_rho, rs) DEFAULT(NONE)&
!$OMP SHARED(npoints,rho,rho_cutoff,omega,e_0,e_rho,order,sc,sx)
DO k = 1, npoints
my_rho = rho(k)
IF (rho(k) > rho_cutoff) THEN
rs = (3.0_dp/4.0_dp/pi/my_rho)**(1.0_dp/3.0_dp)
CALL ldasr(rs, omega, ed(0), ed(1), sx, sc)
IF (order >= 0) THEN
e_0(k) = e_0(k) + ed(0)*my_rho
END IF
IF (order >= 1 .OR. order == -1) THEN
e_rho(k) = e_rho(k) + ed(1)
END IF
END IF
END DO
!$OMP END PARALLEL DO
END IF
CALL timestop(handle)
END SUBROUTINE sr_lda_calc
! **************************************************************************************************
!> \brief Calculate the correlation energy and its derivatives
!> wrt to rho (the electron density) up to 3rd order. This
!> is the short-range LSD version of the Perdew-Wang correlation energy
!> If no order argument is given, then the routine calculates
!> just the energy.
!> \param rho_set ...
!> \param deriv_set ...
!> \param order order of derivatives to calculate
!> order must lie between -3 and 3. If it is negative then only
!> that order will be calculated, otherwise all derivatives up to
!> that order will be calculated.
!> \param sr_section ...
! **************************************************************************************************
SUBROUTINE sr_lsd_eval(rho_set, deriv_set, order, sr_section)
TYPE(xc_rho_set_type), POINTER :: rho_set
TYPE(xc_derivative_set_type), POINTER :: deriv_set
INTEGER, INTENT(IN), OPTIONAL :: order
TYPE(section_vals_type), POINTER :: sr_section
CHARACTER(len=*), PARAMETER :: routineN = 'sr_lsd_eval'
INTEGER :: npoints, handle, method
INTEGER, DIMENSION(:, :), POINTER :: bo
REAL(KIND=dp) :: omega, rho_cutoff, sc, sx
REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: a, b, dummy, e_0, ea, eb
TYPE(xc_derivative_type), POINTER :: deriv
CALL timeset(routineN, handle)
CALL section_vals_val_get(sr_section, 'SCALE_X', r_val=sx)
CALL section_vals_val_get(sr_section, 'SCALE_C', r_val=sc)
CALL section_vals_val_get(sr_section, 'OMEGA', r_val=omega)
CALL section_vals_val_get(sr_section, 'PARAMETRIZATION', i_val=method)
NULLIFY (bo, a, b, e_0, ea, eb)
CPASSERT(ASSOCIATED(rho_set))
CPASSERT(rho_set%ref_count > 0)
CPASSERT(ASSOCIATED(deriv_set))
CPASSERT(deriv_set%ref_count > 0)
CALL xc_rho_set_get(rho_set, rhoa=a, rhob=b, &
local_bounds=bo, rho_cutoff=rho_cutoff)
CALL perdew_wang_init(method, rho_cutoff)
npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
! meaningful default for the arrays we don't need: let us make compiler
! and debugger happy...
dummy => a
e_0 => dummy
ea => dummy; eb => dummy
IF (order >= 0) THEN
deriv => xc_dset_get_derivative(deriv_set, "", &
allocate_deriv=.TRUE.)
CALL xc_derivative_get(deriv, deriv_data=e_0)
END IF
IF (order >= 1 .OR. order == -1) THEN
deriv => xc_dset_get_derivative(deriv_set, "(rhoa)", &
allocate_deriv=.TRUE.)
CALL xc_derivative_get(deriv, deriv_data=ea)
deriv => xc_dset_get_derivative(deriv_set, "(rhob)", &
allocate_deriv=.TRUE.)
CALL xc_derivative_get(deriv, deriv_data=eb)
END IF
IF (order > 1 .OR. order < -1) THEN
CPABORT("derivatives bigger than 1 not implemented")
END IF
CALL sr_lsd_calc(a, b, omega, rho_cutoff, e_0, ea, eb, npoints, order, sx, sc)
CALL timestop(handle)
END SUBROUTINE sr_lsd_eval
! **************************************************************************************************
!> \brief ...
!> \param rhoa ...
!> \param rhob ...
!> \param omega ...
!> \param rho_cutoff ...
!> \param e_0 ...
!> \param ea ...
!> \param eb ...
!> \param npoints ...
!> \param order ...
!> \param sx ...
!> \param sc ...
! **************************************************************************************************
SUBROUTINE sr_lsd_calc(rhoa, rhob, omega, rho_cutoff, e_0, ea, eb, npoints, order, sx, sc)
!FM low-level computation routine
REAL(KIND=dp), DIMENSION(*), INTENT(IN) :: rhoa, rhob
REAL(KIND=dp), INTENT(IN) :: omega, rho_cutoff
REAL(KIND=dp), DIMENSION(*), INTENT(INOUT) :: e_0, ea, eb
INTEGER, INTENT(IN) :: npoints, order
REAL(KIND=dp), INTENT(IN) :: sx, sc
CHARACTER(len=*), PARAMETER :: routineN = 'sr_lsd_calc'
INTEGER :: handle, k
REAL(KIND=dp) :: my_rhoa, my_rhob, rho, rs, zeta
REAL(KIND=dp), DIMENSION(0:5) :: ed
CALL timeset(routineN, handle)
IF (sc /= 0.0_dp .OR. sx /= 0.0_dp) THEN
!$OMP PARALLEL DO PRIVATE (k, rho, ed, my_rhoa, my_rhob, rs, zeta) DEFAULT(NONE)&
!$OMP SHARED(npoints,rhoa,rhob,rho_cutoff,omega,order,e_0,ea,eb,sx,sc)
DO k = 1, npoints
my_rhoa = rhoa(k)
my_rhob = rhob(k)
rho = my_rhoa + my_rhob
IF (rho > rho_cutoff) THEN
rs = (3.0_dp/4.0_dp/pi/rho)**(1.0_dp/3.0_dp)
zeta = (my_rhoa - my_rhob)/rho
CALL lsdsr(rs, zeta, omega, ed(0), ed(1), ed(2), sx, sc)
IF (order >= 0) THEN
e_0(k) = e_0(k) + ed(0)*rho
END IF
IF (order >= 1 .OR. order == -1) THEN
ea(k) = ea(k) + ed(1)
eb(k) = eb(k) + ed(2)
END IF
END IF
END DO
!$OMP END PARALLEL DO
CALL timestop(handle)
END IF
END SUBROUTINE sr_lsd_calc
! **************************************************************************************************
!> \brief ...
!> \param rs ...
!> \param mu ...
!> \param excsr ...
!> \param vxcsr ...
!> \param sx ...
!> \param sc ...
! **************************************************************************************************
ELEMENTAL SUBROUTINE ldasr(rs, mu, excsr, vxcsr, sx, sc)
REAL(KIND=dp), INTENT(IN) :: rs, mu
REAL(KIND=dp), INTENT(OUT) :: excsr, vxcsr
REAL(KIND=dp), INTENT(IN) :: sx, sc
REAL(KIND=dp) :: ec, ecd, eclr, ex, exlr, vc, vclr, vx, &
vxlr
IF (sx /= 0.0_dp) THEN
ex = -3._dp*cf/rs/4._dp/pi
vx = -(3._dp/2._dp/pi)**(2._dp/3._dp)/rs
CALL exchangelr_lda(rs, mu, exlr, vxlr)
ELSE
ex = 0.0_dp
vx = 0.0_dp
exlr = 0.0_dp
vxlr = 0.0_dp
END IF
IF (sc /= 0.0_dp) THEN
CALL ecPW_lda(rs, ec, ecd)
vc = ec - rs/3._dp*ecd
CALL ecorrlr_lda(rs, mu, eclr, vclr, ec, ecd)
ELSE
ec = 0.0_dp
vc = 0.0_dp
eclr = 0.0_dp
vclr = 0.0_dp
END IF
excsr = sx*ex + sc*ec - (sx*exlr + sc*eclr)
vxcsr = sx*vx + sc*vc - (sx*vxlr + sc*vclr)
END SUBROUTINE
! **************************************************************************************************
!> \brief ...
!> \param rs ...
!> \param mu ...
!> \param eclr ...
!> \param vclr ...
!> \param ec ...
!> \param ecd ...
! **************************************************************************************************
ELEMENTAL SUBROUTINE ecorrlr_lda(rs, mu, eclr, vclr, ec, ecd)
REAL(KIND=dp), INTENT(IN) :: rs, mu
REAL(KIND=dp), INTENT(OUT) :: eclr, vclr
REAL(KIND=dp), INTENT(IN) :: ec, ecd
REAL(KIND=dp) :: a1, a1rs, a2, a2rs, a3, a3rs, a4, a4rs, a5, a5rs, b0, coe2, coe2rs, coe3, &
coe3rs, coe4, coe4rs, coe5, coe5rs, d2anti, d2antid, d3anti, d3antid, eclrrs, x, z
b0 = adib*rs
z = 0._dp
d2anti = (q1a + q2a*rs)*EXP(-q3a*rs)/rs
d3anti = (t1a + t2a*rs)*EXP(-t3a*rs)/rs**2
d2antid = -((q1a + q1a*q3a*rs + q2a*q3a*rs**2)/rs**2)*EXP(-q3a*rs)
d3antid = -((rs*t2a*(1._dp + rs*t3a) + t1a*(2._dp + rs*t3a))/rs**3)*EXP(-rs*t3a)
coe2 = -3._dp/8._dp/rs**3*(g0(rs) - 0.5_dp)
coe2rs = -3._dp/8._dp/rs**3*g0d(rs) + 9._dp/8._dp/rs**4*(g0(rs) - 0.5_dp)
coe3 = -g0(rs)/SQRT(2._dp*pi)/rs**3
coe3rs = -g0d(rs)/SQRT(2._dp*pi)/rs**3 + 3._dp*g0(rs)/SQRT(2._dp*pi)/rs**4
coe4 = -9._dp/64._dp/rs**3*(.5_dp*dpol(rs*2._dp**(1._dp/3._dp)) + d2anti - cf**2/5._dp/rs**2)
coe4rs = -3._dp/rs*coe4 - 9._dp/64._dp/rs**3*(((1._dp + z)/2._dp)**(5._dp/3._dp)*dpold(rs*(2._dp/(1._dp + z))** &
(1._dp/3._dp)) + ((1._dp - z)/2._dp)**(5._dp/3._dp)* &
dpold(rs*(2._dp/(1._dp - z))**(1._dp/3._dp)) + (1._dp - z**2)*d2antid &
+ cf**2/5._dp*((1._dp + z)**(8._dp/3._dp) + (1._dp - z)**(8._dp/3._dp))/rs**3)
coe5 = -9._dp/40._dp/SQRT(2._dp*pi)/rs**3*(((1._dp + z)/2._dp)**2*dpol(rs*(2._dp/(1._dp + z))**(1._dp/3._dp)) &
+ ((1._dp - z)/2._dp)**2*dpol(rs*(2._dp/(1._dp - z))**(1._dp/3._dp)) &
+ (1._dp - z**2)*d3anti)
coe5rs = -3._dp/rs*coe5 - 9._dp/(40._dp*SQRT(2._dp*pi)*rs**3)*( &
((1._dp + z)/2._dp)**(5._dp/3._dp)*dpold(rs*(2._dp/(1._dp + z))**(1._dp/3._dp)) &
+ ((1._dp - z)/2._dp)**(5._dp/3._dp)*dpold(rs*(2._dp/(1._dp - z))**(1._dp/3._dp)) + (1._dp - z**2)*d3antid)
a1 = 4._dp*b0**6*coe3 + b0**8*coe5
a1rs = 24._dp*adib*b0**5*coe3 + 4._dp*b0**6*coe3rs + 8._dp*adib*b0**7*coe5 + b0**8*coe5rs
a2 = 4._dp*b0**6*coe2 + b0**8*coe4 + 6._dp*b0**4*ec
a2rs = 24._dp*adib*b0**5*coe2 + 4._dp*b0**6*coe2rs + 8._dp*adib*b0**7*coe4 + b0**8*coe4rs &
+ 24._dp*adib*b0**3*ec + 6._dp*b0**4*ecd
a3 = b0**8*coe3
a3rs = 8._dp*adib*b0**7*coe3 + b0**8*coe3rs
a4 = b0**6*(b0**2*coe2 + 4._dp*ec)
a4rs = 8._dp*adib*b0**7*coe2 + b0**8*coe2rs + 24._dp*adib*b0**5*ec + 4._dp*b0**6*ecd
a5 = b0**8*ec
a5rs = 8._dp*adib*b0**7*ec + b0**8*ecd
x = mu*SQRT(rs)
eclr = (Qrpa(x) + mu**3*(a1 + mu*(a2 + mu*(a3 + mu*(a4 + a5*mu**2)))))/((1._dp + b0**2*mu**2)**4)
eclrrs = -8._dp*adib/(1._dp + b0**2*mu**2)*b0*mu**2*eclr + &
1._dp/((1._dp + b0**2*mu**2)**4)*(mu/(2._dp*SQRT(rs))*Qrpad(x) + &
mu**3*(a1rs + mu*(a2rs + mu*(a3rs + mu*(a4rs + a5rs*mu**2)))))
vclr = eclr - rs/3._dp*eclrrs
END SUBROUTINE
! **************************************************************************************************
!> \brief ...
!> \param rs ...
!> \param z ...
!> \param mu ...
!> \param vxlrup ...
!> \param vxlrdown ...
! **************************************************************************************************
ELEMENTAL SUBROUTINE exchangelr_lda(rs, mu, exlr, vxlr)
REAL(KIND=dp), INTENT(IN) :: rs, mu
REAL(KIND=dp), INTENT(OUT) :: exlr, vxlr
REAL(KIND=dp) :: derrs, fx, fx1, y
y = alpha/2._dp*mu*rs
fx = -((y*(-3._dp + 4._dp*y**2 + (2._dp - 4._dp*y**2)*EXP(-.25_dp/y**2)) + SQRT(pi)*ERF(.5_dp/y))/pi)
exlr = mu*fx
fx1 = (3._dp*(1._dp + (-4._dp + 4._dp*EXP(-.25_dp/y**2))*y**2))/pi
derrs = alpha/4._dp*mu**2*fx1
vxlr = 2._dp/3._dp*rs*derrs
vxlr = exlr - vxlr
END SUBROUTINE
! **************************************************************************************************
!> \brief PW92 energy functional
!> \param rs ...
!> \param ec ...
!> \param ecd ...
! **************************************************************************************************
ELEMENTAL SUBROUTINE ecPW_lda(rs, ec, ecd)
REAL(KIND=dp), INTENT(IN) :: rs
REAL(KIND=dp), INTENT(OUT) :: ec, ecd
REAL(KIND=dp) :: G(0:1)
CALL calc_g(rs, 0, G, 1)
ec = G(0)
ecd = G(1)
END SUBROUTINE
! **************************************************************************************************
!> \brief ...
!> \param rs ...
!> \param z ...
!> \param mu ...
!> \param excsr ...
!> \param vxcsrup ...
!> \param vxcsrdown ...
!> \param sx ...
!> \param sc ...
! **************************************************************************************************
ELEMENTAL SUBROUTINE lsdsr(rs, z, mu, excsr, vxcsrup, vxcsrdown, sx, sc)
REAL(KIND=dp), INTENT(IN) :: rs, z, mu
REAL(KIND=dp), INTENT(OUT) :: excsr, vxcsrup, vxcsrdown
REAL(KIND=dp), INTENT(IN) :: sx, sc
REAL(KIND=dp) :: ec, ecd, eclr, ecz, ex, exlr, vcdown, &
vclrdown, vclrup, vcup, vxdown, &
vxlrdown, vxlrup, vxup
IF (sx /= 0.0_dp) THEN
ex = -3._dp*cf/rs/8._dp/pi*((1._dp + z)**(4._dp/3._dp) + &
(1._dp - z)**(4._dp/3._dp))
vxup = -(1._dp + z)**(1._dp/3._dp)*(3._dp/2._dp/pi)**(2._dp/3._dp)/rs
vxdown = -(1._dp - z)**(1._dp/3._dp)*(3._dp/2._dp/pi)**(2._dp/3._dp)/rs
CALL exchangelr_lsd(rs, z, mu, exlr, vxlrup, vxlrdown)
ELSE
ex = 0.0_dp
vxup = 0.0_dp
vxdown = 0.0_dp
exlr = 0.0_dp
vxlrup = 0.0_dp
vxlrdown = 0.0_dp
END IF
IF (sc /= 0.0_dp) THEN
CALL ecPW_lsd(rs, z, ec, ecd, ecz)
vcup = ec - rs/3._dp*ecd - (z - 1._dp)*ecz
vcdown = ec - rs/3._dp*ecd - (z + 1._dp)*ecz
CALL ecorrlr_lsd(rs, z, mu, eclr, vclrup, vclrdown, ec, ecd, ecz)
ELSE
ec = 0.0_dp
vcup = 0.0_dp
vcdown = 0.0_dp
eclr = 0.0_dp
vclrup = 0.0_dp
vclrdown = 0.0_dp
END IF
excsr = sx*ex + sc*ec - (sx*exlr + sc*eclr)
vxcsrup = sx*vxup + sc*vcup - (sx*vxlrup + sc*vclrup)
vxcsrdown = sx*vxdown + sc*vcdown - (sx*vxlrdown + sc*vclrdown)
END SUBROUTINE
! **************************************************************************************************
!> \brief ...
!> \param rs ...
!> \param z ...
!> \param mu ...
!> \param eclr ...
!> \param ec ...
! **************************************************************************************************
ELEMENTAL SUBROUTINE ecorrlr_lsd(rs, z, mu, eclr, vclrup, vclrdown, ec, ecd, ecz)
REAL(KIND=dp), INTENT(IN) :: rs, z, mu
REAL(KIND=dp), INTENT(OUT) :: eclr, vclrup, vclrdown
REAL(KIND=dp), INTENT(IN) :: ec, ecd, ecz
REAL(KIND=dp) :: a1, a1rs, a1z, a2, a2rs, a2z, a3, a3rs, a3z, a4, a4rs, a4z, a5, a5rs, a5z, &
b0, coe2, coe2rs, coe2z, coe3, coe3rs, coe3z, coe4, coe4rs, coe4z, coe5, coe5rs, coe5z, &
d2anti, d2antid, d3anti, d3antid, eclrrs, eclrz, phi, x
phi = ((1._dp + z)**(2._dp/3._dp) + (1._dp - z)**(2._dp/3._dp))/2._dp
b0 = adib*rs
d2anti = (q1a + q2a*rs)*EXP(-q3a*rs)/rs
d3anti = (t1a + t2a*rs)*EXP(-t3a*rs)/rs**2
d2antid = -((q1a + q1a*q3a*rs + q2a*q3a*rs**2)/rs**2)*EXP(-q3a*rs)
d3antid = -((rs*t2a*(1._dp + rs*t3a) + t1a*(2._dp + rs*t3a))/rs**3)*EXP(-rs*t3a)
coe2 = -3._dp/8._dp/rs**3*(1._dp - z**2)*(g0(rs) - 0.5_dp)
coe2rs = -3._dp/8._dp/rs**3*(1._dp - z**2)*g0d(rs) + 9._dp/8._dp/rs**4*(1._dp - z**2)*(g0(rs) - 0.5_dp)
coe2z = -3._dp/8._dp/rs**3*(-2._dp*z)*(g0(rs) - 0.5_dp)
coe3 = -(1._dp - z**2)*g0(rs)/SQRT(2._dp*pi)/rs**3
coe3rs = -(1._dp - z**2)*g0d(rs)/SQRT(2._dp*pi)/rs**3 + 3._dp*(1._dp - z**2)*g0(rs)/SQRT(2._dp*pi)/rs**4
coe3z = 2._dp*z*g0(rs)/(SQRT(2._dp*pi)*rs**3)
IF (ABS(z) >= 1._dp) THEN
coe4 = -9._dp/64._dp/rs**3*(dpol(rs) - cf**2*2**(5._dp/3._dp)/5._dp/rs**2)
coe4rs = -3._dp/rs*coe4 - 9._dp/64._dp/rs**3*(dpold(rs) + 2._dp*cf**2*2**(5._dp/3._dp)/5._dp/rs**3)
coe4z = -9._dp/64._dp/rs**3*(dpol(rs) - rs/6._dp*dpold(rs) - 2._dp*d2anti &
- 4._dp/15._dp*cf**2*2._dp**(5._dp/3._dp)/rs**2)*z
coe5 = -9._dp/40._dp/SQRT(2._dp*pi)/rs**3*dpol(rs)
coe5rs = -3._dp/rs*coe5 - 9._dp/40._dp/SQRT(2._dp*pi)/rs**3*dpold(rs)
coe5z = -9._dp/40._dp/SQRT(2._dp*pi)/rs**3*(dpol(rs) - rs/6._dp*dpold(rs) - 2._dp*d3anti)*z
ELSE
coe4 = -9._dp/64._dp/rs**3*(((1._dp + z)/2._dp)**2* &
dpol(rs*(2._dp/(1._dp + z))**(1._dp/3._dp)) + ((1._dp - z)/2._dp)**2 &
*dpol(rs*(2._dp/(1._dp - z))**(1._dp/3._dp)) + &
(1._dp - z**2)*d2anti - cf**2/10._dp*((1._dp + z)**(8._dp/3._dp) &
+ (1._dp - z)**(8._dp/3._dp))/rs**2)
coe4rs = -3._dp/rs*coe4 - 9._dp/64._dp/rs**3*(((1._dp + z)/2._dp)**(5._dp/3._dp)*dpold(rs*(2._dp/(1._dp + z))** &
(1._dp/3._dp)) + ((1._dp - z)/2._dp)**(5._dp/3._dp)* &
dpold(rs*(2._dp/(1._dp - z))**(1._dp/3._dp)) + (1._dp - z**2)*d2antid &
+ cf**2/5._dp*((1._dp + z)**(8._dp/3._dp) + (1._dp - z)**(8._dp/3._dp))/rs**3)
coe4z = -9._dp/64._dp/rs**3*(1._dp/2._dp*(1._dp + z)*dpol(rs*(2._dp/(1._dp + z))**(1._dp/3._dp)) &
- 1._dp/2._dp*(1._dp - z)*dpol(rs*(2._dp/(1._dp - z))**(1._dp/3._dp)) &
- rs/6._dp*((1._dp + z)/2._dp)**(2._dp/3._dp)*dpold(rs*(2/(1._dp + z))**(1._dp/3._dp)) &
+ rs/6._dp*((1._dp - z)/2._dp)**(2._dp/3._dp)*dpold(rs*(2._dp/(1._dp - z))**(1._dp/3._dp)) &
- 2._dp*z*d2anti - 4._dp/15._dp*cf**2/rs**2*((1._dp + z)**(5._dp/3._dp) &
- (1._dp - z)**(5._dp/3._dp)))
coe5 = -9._dp/40._dp/SQRT(2._dp*pi)/rs**3*(((1._dp + z)/2._dp)**2*dpol(rs*(2._dp/(1._dp + z))**(1._dp/3._dp)) &
+ ((1._dp - z)/2._dp)**2*dpol(rs*(2._dp/(1._dp - z))**(1._dp/3._dp)) &
+ (1._dp - z**2)*d3anti)
coe5rs = -3._dp/rs*coe5 - 9._dp/(40._dp*SQRT(2._dp*pi)*rs**3)*( &
((1._dp + z)/2._dp)**(5._dp/3._dp)*dpold(rs*(2._dp/(1._dp + z))**(1._dp/3._dp)) &
+ ((1._dp - z)/2._dp)**(5._dp/3._dp)*dpold(rs*(2._dp/(1._dp - z))**(1._dp/3._dp)) + (1._dp - z**2)*d3antid)
coe5z = -9._dp/40._dp/SQRT(2._dp*pi)/rs**3*(1._dp/2._dp*(1._dp + z)*dpol(rs*(2/(1._dp + z))**(1._dp/3._dp)) &
- 1._dp/2._dp*(1._dp - z)*dpol(rs*(2/(1._dp - z))**(1._dp/3._dp)) &
- rs/6._dp*((1._dp + z)/2._dp)**(2._dp/3._dp)*dpold(rs*(2/(1._dp + z)) &
**(1._dp/3._dp)) + rs/6._dp*((1._dp - z)/2._dp)**(2._dp/3._dp) &
*dpold(rs*(2/(1._dp - z))**(1._dp/3._dp)) - 2._dp*z*d3anti)
END IF
a1 = 4._dp*b0**6*coe3 + b0**8*coe5
a1rs = 24._dp*adib*b0**5*coe3 + 4._dp*b0**6*coe3rs + 8._dp*adib*b0**7*coe5 + b0**8*coe5rs
a1z = 4._dp*b0**6*coe3z + b0**8*coe5z
a2 = 4._dp*b0**6*coe2 + b0**8*coe4 + 6._dp*b0**4*ec
a2rs = 24._dp*adib*b0**5*coe2 + 4._dp*b0**6*coe2rs + 8._dp*adib*b0**7*coe4 + b0**8*coe4rs &
+ 24._dp*adib*b0**3*ec + 6._dp*b0**4*ecd
a2z = 4._dp*b0**6*coe2z + b0**8*coe4z + 6._dp*b0**4*ecz
a3 = b0**8*coe3
a3rs = 8._dp*adib*b0**7*coe3 + b0**8*coe3rs
a3z = b0**8*coe3z
a4 = b0**6*(b0**2*coe2 + 4._dp*ec)
a4rs = 8._dp*adib*b0**7*coe2 + b0**8*coe2rs + 24._dp*adib*b0**5*ec + 4._dp*b0**6*ecd
a4z = b0**6*(b0**2*coe2z + 4._dp*ecz)
a5 = b0**8*ec
a5rs = 8._dp*adib*b0**7*ec + b0**8*ecd
a5z = b0**8*ecz
x = mu*SQRT(rs)/phi
eclr = (phi**3*Qrpa(x) + mu**3*(a1 + mu*(a2 + mu*(a3 + mu*(a4 + a5*mu**2)))))/((1._dp + b0**2*mu**2)**4)
eclrrs = -8._dp*adib/(1._dp + b0**2*mu**2)*b0*mu**2*eclr + &
1._dp/((1._dp + b0**2*mu**2)**4)*(phi**2*mu/(2._dp*SQRT(rs))*Qrpad(x) + &
mu**3*(a1rs + mu*(a2rs + mu*(a3rs + mu*(a4rs + a5rs*mu**2)))))
IF (z >= 1._dp) THEN
vclrup = eclr - rs/3._dp*eclrrs
vclrdown = 0._dp
ELSE IF (z <= -1._dp) THEN
vclrup = 0._dp
vclrdown = eclr - rs/3._dp*eclrrs
ELSE
eclrz = (phi**2*((1._dp + z)**(-1._dp/3._dp) - (1._dp - z)**(-1._dp/3._dp)) &
*Qrpa(x) - phi*Qrpad(x)*mu*SQRT(rs)*((1._dp + z)**(-1._dp/3._dp) &
- (1._dp - z)**(-1._dp/3._dp))/3._dp + &
mu**3*(a1z + mu*(a2z + mu*(a3z + mu*(a4z + a5z*mu**2)))))/((1._dp + b0**2*mu**2)**4)
vclrup = eclr - rs/3._dp*eclrrs - (z - 1._dp)*eclrz
vclrdown = eclr - rs/3._dp*eclrrs - (z + 1._dp)*eclrz
END IF
END SUBROUTINE
! **************************************************************************************************
!> \brief ...
!> \param rs ...
!> \return ...
! **************************************************************************************************
ELEMENTAL FUNCTION g0(rs)
REAL(KIND=dp), INTENT(IN) :: rs
REAL(KIND=dp) :: g0
g0 = (1._dp - (0.7317_dp - Fg0)*rs + Cg0*rs**2 + Dg0*rs**3 + Eg0*rs**4)*EXP(-ABS(Fg0)*rs)/2._dp
END FUNCTION
! **************************************************************************************************
!> \brief ...
!> \param rs ...
!> \return ...
! **************************************************************************************************
ELEMENTAL FUNCTION g0d(rs)
REAL(KIND=dp), INTENT(IN) :: rs
REAL(KIND=dp) :: g0d
g0d = (-Bg0 + 2.0_dp*Cg0*rs + 3.0_dp*Dg0*rs**2 + 4.0_dp*Eg0*rs**3)/2._dp*EXP(-Fg0*rs) &
- (Fg0*(1.0_dp - Bg0*rs + Cg0*rs**2 + Dg0*rs**3 + Eg0*rs**4))/ &
2._dp*EXP(-Fg0*rs)
END FUNCTION
! **************************************************************************************************
!> \brief ...
!> \param rs ...
!> \return ...
! **************************************************************************************************
ELEMENTAL FUNCTION dpol(rs)
REAL(KIND=dp), INTENT(IN) :: rs
REAL(KIND=dp) :: dpol
dpol = 2._dp**(5._dp/3._dp)/5._dp*cf**2/rs**2*(1._dp + (p3p - 0.454555_dp)*rs) &
/(1._dp + p3p*rs + p2p*rs**2)
END FUNCTION
! **************************************************************************************************
!> \brief ...
!> \param rs ...
!> \return ...
! **************************************************************************************************
ELEMENTAL FUNCTION dpold(rs)
REAL(KIND=dp), INTENT(IN) :: rs
REAL(KIND=dp) :: dpold
dpold = 2._dp**(5._dp/3._dp)/5._dp*cf**2* &
(-2._dp + (0.454555 - 4._dp*p3p)*rs + &
(-4._dp*p2p + (0.90911 - 2.*p3p)*p3p)*rs**2 &
+ p2p*(1.363665 - 3._dp*p3p)*rs**3)/ &
(rs**3*(1._dp + p3p*rs + p2p*rs**2)**2)
END FUNCTION
! **************************************************************************************************
!> \brief ...
!> \param x ...
!> \return ...
! **************************************************************************************************
ELEMENTAL FUNCTION Qrpa(x)
REAL(KIND=dp), INTENT(IN) :: x
REAL(KIND=dp) :: Qrpa
Qrpa = Acoul*LOG((1._dp + aQ2*x + bQ2*x**2 + cQ2*x**3)/(1._dp + aQ2*x + dQ2*x**2))
END FUNCTION
! **************************************************************************************************
!> \brief ...
!> \param x ...
!> \return ...
! **************************************************************************************************
ELEMENTAL FUNCTION Qrpad(x)
REAL(KIND=dp), INTENT(IN) :: x
REAL(KIND=dp) :: Qrpad
Qrpad = Acoul*((x*(bQ2*(2._dp + aQ2*x) + cQ2*x*(3._dp + 2._dp*aQ2*x) + dQ2*(-2._dp - aQ2*x + cQ2*x**3)))/ &
((1._dp + aQ2*x + dQ2*x**2)*(1._dp + aQ2*x + bQ2*x**2 + cQ2*x**3)))
END FUNCTION
! **************************************************************************************************
!> \brief ...
!> \param rs ...
!> \param z ...
!> \param mu ...
!> \param vxlrup ...
!> \param vxlrdown ...
! **************************************************************************************************
ELEMENTAL SUBROUTINE exchangelr_lsd(rs, z, mu, exlr, vxlrup, vxlrdown)
REAL(KIND=dp), INTENT(IN) :: rs, z, mu
REAL(KIND=dp), INTENT(OUT) :: exlr, vxlrup, vxlrdown
REAL(KIND=dp) :: derrs, derz, fx, fx1, x, y
IF (z >= 1._dp) THEN
x = rs*alpha*mu
y = .5_dp**(4._dp/3._dp)*x
fx = -((y*(-3._dp + 4._dp*y**2 + (2._dp - 4._dp*y**2)*EXP(-.25/y**2)) + SQRT(pi)*ERF(.5_dp/y))/pi)
exlr = mu*fx
vxlrup = mu*(x/(2._dp**(1._dp/3._dp)*pi) - x/(2._dp**(1._dp/3._dp)*pi)* &
EXP(-2._dp**(2._dp/3._dp)/x**2) - &
ERF(2._dp**(1._dp/3._dp)/x)/SQRT(pi))
vxlrdown = 0._dp
ELSE IF (z <= -1._dp) THEN
x = rs*alpha*mu
y = .5_dp**(4._dp/3._dp)*x
fx = -((y*(-3._dp + 4._dp*y**2 + (2._dp - 4._dp*y**2)*EXP(-.25/y**2)) + SQRT(pi)*ERF(.5_dp/y))/pi)
exlr = mu*fx
vxlrdown = mu*(x/(2._dp**(1._dp/3._dp)*pi) - x/(2._dp**(1._dp/3._dp)*pi)* &
EXP(-2._dp**(2._dp/3._dp)/x**2) - &
ERF(2._dp**(1._dp/3._dp)/x)/SQRT(pi))
vxlrup = 0._dp
ELSE
y = alpha/2._dp/(1.+z)**(1._dp/3._dp)*mu*rs
fx = -((y*(-3._dp + 4._dp*y**2 + (2._dp - 4._dp*y**2)*EXP(-.25_dp/y**2)) + &
SQRT(pi)*ERF(.5_dp/y))/pi)
exlr = (1._dp + z)*mu*fx/2._dp
fx1 = (3._dp*(1._dp + (-4._dp + 4._dp*EXP(-.25_dp/y**2))*y**2))/pi
derrs = alpha/4._dp*(1._dp + z)**(2._dp/3._dp)*mu**2*fx1
derz = 1._dp/2._dp*mu*fx - 1._dp/6._dp*fx1*mu*y
vxlrup = rs/3._dp*derrs + (z - 1._dp)*derz
vxlrdown = rs/3._dp*derrs + (z + 1._dp)*derz
y = alpha/2._dp/(1.-z)**(1._dp/3._dp)*mu*rs
fx = -((y*(-3._dp + 4._dp*y**2 + (2._dp - 4._dp*y**2)*EXP(-.25_dp/y**2)) + &
SQRT(pi)*ERF(.5_dp/y))/pi)
exlr = exlr + (1._dp - z)*mu*fx/2._dp
fx1 = (3._dp*(1._dp + (-4._dp + 4._dp*EXP(-.25_dp/y**2))*y**2))/pi
derrs = alpha/4._dp*(1._dp - z)**(2._dp/3._dp)*mu**2*fx1
derz = -1._dp/2._dp*mu*fx + 1._dp/6._dp*fx1*mu*y
vxlrup = vxlrup + rs/3._dp*derrs + (z - 1._dp)*derz
vxlrdown = vxlrdown + rs/3._dp*derrs + (z + 1._dp)*derz
vxlrup = exlr - vxlrup
vxlrdown = exlr - vxlrdown
ENDIF
END SUBROUTINE
! **************************************************************************************************
!> \brief PW92 energy functional
!> \param rs ...
!> \param z ...
!> \param ec ...
!> \param ecd ...
!> \param ecz ...
! **************************************************************************************************
ELEMENTAL SUBROUTINE ecPW_lsd(rs, z, ec, ecd, ecz)
REAL(KIND=dp), INTENT(IN) :: rs, z
REAL(KIND=dp), INTENT(OUT) :: ec, ecd, ecz
REAL(KIND=dp) :: alfac(0:1), ec0(0:1), ec1(0:1), ff
IF (ABS(z) >= 1._dp) THEN
CALL calc_g(rs, 0, ec0, 0)
CALL calc_g(rs, 1, ec1, 1)
CALL calc_g(rs, -1, alfac, 0)
alfac = -alfac
ec = ec1(0)
ecd = ec1(1)
ecz = SIGN(-4._dp/f02*alfac(0) + (ec1(0) - ec0(0))*(4._dp + 2._dp**(4._dp/3._dp)/3._dp/ &
(2._dp**(1._dp/3._dp) - 1._dp)), z)
ELSE
ff = ((1._dp + z)**(4._dp/3._dp) + (1._dp - z)**(4._dp/3._dp) - &
2._dp)/(2._dp**(4._dp/3._dp) - 2._dp)
CALL calc_g(rs, 0, ec0, 1)
CALL calc_g(rs, 1, ec1, 1)
CALL calc_g(rs, -1, alfac, 1)
alfac = -alfac
ec = ec0(0) + alfac(0)*ff/f02*(1._dp - z**4) + (ec1(0) - ec0(0))*ff*z**4
ecd = ec0(1) + alfac(1)*ff/f02*(1._dp - z**4) + (ec1(1) - ec0(1))*ff*z**4
ecz = alfac(0)*(-4._dp*z**3)*ff/f02 + alfac(0)*(1._dp - z**4)/f02* &
4._dp/3._dp*((1._dp + z)**(1._dp/3._dp) - (1._dp - z)**(1._dp/3._dp))/ &
(2._dp**(4._dp/3._dp) - 2._dp) + (ec1(0) - ec0(0))*(4._dp*z**3*ff + &
4._dp/3._dp*((1._dp + z)**(1._dp/3._dp) - (1._dp - z)**(1._dp/3._dp))/ &
(2._dp**(4._dp/3._dp) - 2._dp)*z**4)
END IF
END SUBROUTINE
@:calc_g()
END MODULE xc_sr_lda

View file

@ -1,3 +1,5 @@
@SET MY_OMEGA 0.5
&FORCE_EVAL
METHOD Quickstep
&DFT
@ -28,8 +30,17 @@
&END SCF
&XC
&XC_FUNCTIONAL
&SRLDA
OMEGA 0.5
&LDA_X
&END LDA_X
&LDA_X_ERF
_OMEGA ${MY_OMEGA}
SCALE -1.0
&END
&LDA_C_PMGB06
_OMEGA ${MY_OMEGA}
SCALE -1.0
&END
&LDA_C_PW
&END
&END XC_FUNCTIONAL
&HF
@ -43,7 +54,7 @@
&END
&INTERACTION_POTENTIAL
POTENTIAL_TYPE LONGRANGE
OMEGA 0.5
OMEGA ${MY_OMEGA}
&END
FRACTION 1.0
&END

View file

@ -7,7 +7,7 @@ CH3-PBE0_TC.inp 1 1e-13
CH4-HSE06.inp 1 2e-13 -8.07752172778785
CH4-HSE06_2.inp 1 2e-13 -8.07752172778785
CH4-HSE06_TC_2.inp 1 2e-13 -8.07752172778785
CH4-rsLDA.inp 1 6e-13 -8.07876568953425
CH4-rsLDA.inp 1 6e-13 -8.48091146595489
CH4-PBE0.inp 1 2e-13 -8.07859057522753
CH4-PBE0_TC.inp 1 2e-13 -8.06493647354302
#EOF

View file

@ -31,10 +31,19 @@
MAX_SCF 100
&END SCF
&XC
&XC_FUNCTIONAL NONE
&SRLDA
OMEGA ${MY_OMEGA}
&END SRLDA
&XC_FUNCTIONAL
&LDA_X
&END LDA_X
&LDA_X_ERF
_OMEGA ${MY_OMEGA}
SCALE -1.0
&END
&LDA_C_PMGB06
SCALE -1.0
_OMEGA ${MY_OMEGA}
&END
&LDA_C_PW
&END
&END XC_FUNCTIONAL
&HF
FRACTION 1.0000000

View file

@ -32,10 +32,19 @@
! ADDED_MOS 15000 15000
&END SCF
&XC
&XC_FUNCTIONAL NONE
&SRLDA
OMEGA ${MY_OMEGA}
&END SRLDA
&XC_FUNCTIONAL
&LDA_X
&END LDA_X
&LDA_X_ERF
_OMEGA ${MY_OMEGA}
SCALE -1.0
&END
&LDA_C_PMGB06
SCALE -1.0
_OMEGA ${MY_OMEGA}
&END
&LDA_C_PW
&END
&END XC_FUNCTIONAL
&HF
FRACTION 1.0000000

View file

@ -1,3 +1,3 @@
CH3-rsLDAlrMP2.inp 11 1e-8 -6.235769997143416
H2O-srLDAlrMP2.inp 11 1e-8 -14.953293495365880
CH3-rsLDAlrMP2.inp 11 1e-8 -7.724767496356234
H2O-rsLDAlrMP2.inp 11 1e-8 -16.899255585036251
#EOF

View file

@ -6,7 +6,7 @@
QS/regtest-grid
QS/regtest-corr_dipm
QS/regtest-admm-gapw libint
QS/regtest-rs-dhft libint
QS/regtest-rs-dhft libint libxc
QS/regtest-sos-mp2-lr libint
QS/regtest-rpa-lr libint
QS/regtest-mp2-lr libint
@ -77,7 +77,7 @@ QS/regtest-hfx-block libint
QS/regtest-ls-rtp
QMMM/SE/regtest-force-mixing
QS/regtest-xc
QS/regtest-hfx-wfn-fitting libint
QS/regtest-hfx-wfn-fitting libint libxc
QS/regtest-tddfpt
QS/regtest-tddfpt-stda libint
QS/regtest-libxc libxc libint