libxc hybrid inclusion improved

This commit is contained in:
fabrizio22 2023-01-27 14:57:31 +01:00
parent 9550cec5d2
commit bd4a3c8864
8 changed files with 134 additions and 74 deletions

View File

@ -346,14 +346,14 @@ CONTAINS
! ... local variables
!
INTEGER :: len, l, i
CHARACTER(len=150) :: dftout
CHARACTER(len=150) :: dftout, dftout_loc
LOGICAL :: dft_defined
LOGICAL :: check_libxc
!
CHARACTER(LEN=1), EXTERNAL :: capital
CHARACTER(LEN=4) :: lda_exch, lda_corr, gga_exch, gga_corr
!
INTEGER :: save_inlc
INTEGER :: save_inlc, lnt, ln_nlc
INTEGER :: iexch, icorr, igcx, igcc, imeta
!
! Exit if set to discard further input dft
@ -510,7 +510,7 @@ CONTAINS
! Case for old RRKJ format, containing indices instead of label
CASE DEFAULT
!
IF ('INDEX:' == dftout(1:6)) THEN
IF ('INDEX:' == dftout(1:6)) THEN
READ( dftout(7:18), '(6i2)') iexch, icorr, igcx, igcc, inlc, imeta
dft_defined = xclib_set_dft_IDs(iexch, icorr, igcx, igcc, imeta, 0)
CALL xclib_get_name('LDA','EXCH', lda_exch)
@ -523,9 +523,19 @@ CONTAINS
TRIM(gga_exch) //'-'// &
TRIM(gga_corr) //'-'// nonlocc(inlc)
ELSE
CALL xclib_set_dft_from_name( TRIM(dftout) )
!
dftout_loc = ''
inlc = matching( dftout, ncnl, nonlocc )
IF ( inlc/=0 .AND. dftout(1:3) == 'XC-' ) THEN
lnt = LEN_TRIM(dftout)
ln_nlc = LEN_TRIM(nonlocc(inlc))
dftout_loc(1:lnt-ln_nlc) = dftout(1:lnt-ln_nlc)
ELSE
dftout_loc = dftout
ENDIF
CALL xclib_set_dft_from_name( TRIM(dftout_loc) )
dft_defined = .TRUE.
!
ENDIF
!
END SELECT

View File

@ -1273,10 +1273,10 @@ MODULE pw_restart_new
CALL dftd3_set_functional(dftd3, func = dft_, version = dftd3_version, tz=.FALSE.)
END IF
IF ( xclib_dft_is('hybrid') ) THEN
ecutvcut=ecutvcut*e2
ecutfock=ecutfock*e2
ecutvcut = ecutvcut*e2
ecutfock = ecutfock*e2
CALL xclib_set_exx_fraction( exx_fraction )
CALL set_screening_parameter ( screening_parameter )
CALL set_screening_parameter( screening_parameter )
CALL start_exx ()
END IF
!! Band structure section

View File

@ -492,12 +492,20 @@ CONTAINS
islda, isgradient, ismeta, exx_fraction, &
screening_parameter, gau_parameter, &
ishybrid, has_finite_size_correction, is_libxc
#if defined(__LIBXC)
USE xc_f03_lib_m
#endif
!
IMPLICIT NONE
!
LOGICAL, INTENT(IN) :: isnonlocc
!! The non-local part, for now, is not included in xc_lib, but this variable
!! is needed to establish 'isgradient'.
#if defined(__LIBXC)
TYPE(xc_f03_func_t) :: xc_func
TYPE(xc_f03_func_info_t) :: xc_info
INTEGER :: iid, family, id_vec(6)
#endif
LOGICAL :: is_libxc13, is_libxc12
!
ismeta = (imeta+imetac > 0)
@ -530,12 +538,12 @@ CONTAINS
screening_parameter = 0.106_DP
ENDIF
! AH-CROSStest-SERIES PBE-AH (at 34), PBESOL-AH (at 35)
IF ( (igcx ==34 .OR. igcx==35) .AND. .NOT.is_libxc(3) ) THEN
IF ( (igcx==34 .OR. igcx==35) .AND. .NOT.is_libxc(3) ) THEN
exx_fraction = 0.20_DP
screening_parameter = 0.106_DP
ENDIF
! gau-pbe
IF ( igcx ==20 .AND. .NOT.is_libxc(3) ) THEN
IF ( igcx==20 .AND. .NOT.is_libxc(3) ) THEN
exx_fraction = 0.24_DP
gau_parameter = 0.150_DP
ENDIF
@ -543,9 +551,32 @@ CONTAINS
IF ( iexch==4 .AND. .NOT.is_libxc(1)) exx_fraction = 1.0_DP
IF ( iexch==5 .AND. .NOT.is_libxc(1)) exx_fraction = 1.0_DP
! B3LYP or B3LYP-VWN-1-RPA
IF ( iexch == 7 .AND. .NOT.is_libxc(3) ) exx_fraction = 0.2_DP
IF ( iexch==7 .AND. .NOT.is_libxc(3)) exx_fraction = 0.2_DP
! X3LYP
IF ( iexch == 9 .AND. .NOT.is_libxc(3) ) exx_fraction = 0.218_DP
IF ( iexch==9 .AND. .NOT.is_libxc(3)) exx_fraction = 0.218_DP
!
#if defined(__LIBXC)
id_vec(1)=iexch ; id_vec(2)=icorr
id_vec(3)=igcx ; id_vec(4)=igcc
id_vec(5)=imeta ; id_vec(6)=imetac
!
DO iid = 3, 6
IF ( is_libxc(iid) ) THEN
CALL xc_f03_func_init( xc_func, id_vec(iid), 1 )
xc_info = xc_f03_func_get_info( xc_func )
family = xc_f03_func_info_get_family( xc_info )
IF ( family==XC_FAMILY_HYB_LDA .OR. family==XC_FAMILY_HYB_GGA .OR. family==XC_FAMILY_HYB_MGGA ) THEN
exx_fraction = xc_f03_hyb_exx_coef( xc_func )
! .. workaround for Libxc glitch in HSE06
IF (id_vec(iid)==428) THEN
exx_fraction = xc_f03_func_info_get_ext_params_default_value( xc_info, 0 )
screening_parameter = xc_f03_func_info_get_ext_params_default_value( xc_info, 1 )
ENDIF
ENDIF
CALL xc_f03_func_end( xc_func )
ENDIF
ENDDO
#endif
!
ishybrid = ( exx_fraction /= 0.0_DP )
!
@ -676,16 +707,23 @@ CONTAINS
SUBROUTINE set_screening_parameter( scrparm_ )
!! Impose input parameter as screening parameter (for pbexsr)
USE kind_l, ONLY: DP
USE dft_setting_params, ONLY: igcx, is_libxc, screening_parameter
USE dft_setting_params
IMPLICIT NONE
REAL(DP):: scrparm_
!! Value to impose as screening parameter
IF (ABS(scrparm_)>0.d0.AND.(igcx/=12.AND.(igcx<32.OR.igcx>35) &
.AND.igcx/=47).AND. .NOT.is_libxc(3)) THEN
CALL xclib_infomsg( 'set_screening_parameter', 'WARNING: the screening &
&parameter seems inconsistent with the chosen inpu&
&t dft and will be set to zero.' )
screening_parameter = 0.d0
INTEGER :: fkind
LOGICAL :: lxc_cond4 = .FALSE.
#if defined(__LIBXC)
lxc_cond4 = (igcx==0 .AND.is_libxc(4) .AND. fkind==XC_EXCHANGE_CORRELATION)
#endif
IF ((ABS(scrparm_)>0.d0.AND.(igcx/=0.AND.igcx/=12.AND.(igcx<32.OR.igcx>35) &
.AND.igcx/=47).AND..NOT.is_libxc(3))) THEN
IF (.NOT.lxc_cond4) THEN
CALL xclib_infomsg( 'set_screening_parameter', 'WARNING: the screening &
&parameter seems inconsistent with the chosen inpu&
&t dft and will be set to zero.' )
screening_parameter = 0.d0
ENDIF
ELSE
screening_parameter = scrparm_
ENDIF
@ -1012,8 +1050,7 @@ CONTAINS
#if defined(__LIBXC)
USE xclib_utils_and_para,ONLY: nowarning
USE dft_setting_params, ONLY: n_ext_params, xc_func, xc_info, par_list, &
libxc_flags, n_ext_params, exx_fraction, &
ishybrid
libxc_flags, n_ext_params
#endif
IMPLICIT NONE
INTEGER, INTENT(IN) :: xclib_nspin
@ -1053,11 +1090,6 @@ CONTAINS
flags_tot = flags_tot-2**iflag
ENDDO
!
IF ( family==XC_FAMILY_HYB_GGA .OR. family==XC_FAMILY_HYB_MGGA ) THEN
exx_fraction = xc_f03_hyb_exx_coef( xc_func(iid) )
ishybrid = ( exx_fraction /= 0.d0 )
ENDIF
!
n_ext_params(iid) = xc_f03_func_info_get_n_ext_params( xc_info(iid) )
p0 = 0 ; pn = n_ext_params(iid)-1 ; ips = 1
!
@ -1160,7 +1192,7 @@ CONTAINS
REAL(DP), INTENT(IN) :: param
!! Input value of the parameter
#if defined(__LIBXC)
par_list(sid,i_param) = param
par_list(sid,i_param+1) = param
CALL xc_f03_func_set_ext_params( xc_func(sid), par_list(sid,:) )
#else
CALL xclib_infomsg( 'set_libxc_ext_param', 'WARNING: an external parameter&
@ -1186,7 +1218,7 @@ CONTAINS
REAL(DP) :: get_libxc_ext_param
!! Value of the parameter
#if defined(__LIBXC)
get_libxc_ext_param = par_list(sid,i_param)
get_libxc_ext_param = par_list(sid,i_param+1)
#else
CALL xclib_infomsg( 'get_libxc_ext_param', 'WARNING: an external parameter&
&was sought in Libxc, but Libxc is not linked' )

View File

@ -25,7 +25,7 @@ PROGRAM xc_infos
USE xclib_utils_and_para, ONLY: stdout, nowarning
#if defined(__LIBXC)
USE xc_f03_lib_m
USE dft_setting_params, ONLY: xc_info, xc_kind_error, n_ext_params, &
USE dft_setting_params, ONLY: xc_func, xc_info, xc_kind_error, n_ext_params, &
par_list, libxc_flags
#endif
!
@ -35,7 +35,7 @@ PROGRAM xc_infos
CHARACTER(LEN=150) :: dft_r
CHARACTER(LEN=100) :: dft_w
CHARACTER(LEN=10) :: dft_n
INTEGER :: n_ext, id(6), idfull
INTEGER :: n_ext, id(6), idfull, fkind
INTEGER :: i, ii
!
!-------- Input var -----------------------
@ -107,11 +107,11 @@ PROGRAM xc_infos
WRITE(stdout,*) " "
WRITE(stdout,*) "============== "
!
CALL xclib_set_auxiliary_flags( .FALSE. )
!
#if defined(__LIBXC)
IF (xclib_dft_is_libxc('ANY')) CALL xclib_init_libxc( 1, .FALSE. )
#endif
!
CALL xclib_set_auxiliary_flags( .FALSE. )
!
DO i = 1, 6
idx = id(i)
@ -187,7 +187,8 @@ PROGRAM xc_infos
!
ELSEIF (is_libxc(i)) THEN
!
SELECT CASE( xc_f03_func_info_get_kind(xc_info(i)) )
fkind = xc_f03_func_info_get_kind(xc_info(i))
SELECT CASE( fkind )
CASE( XC_EXCHANGE )
WRITE(lxc_kind, '(a)') 'EXCHANGE'
CASE( XC_CORRELATION )
@ -204,6 +205,8 @@ PROGRAM xc_infos
SELECT CASE( xc_f03_func_info_get_family(xc_info(i)) )
CASE( XC_FAMILY_LDA )
WRITE(lxc_family,'(a)') "LDA"
CASE( XC_FAMILY_HYB_LDA )
WRITE(lxc_family,'(a)') "Hybrid LDA"
CASE( XC_FAMILY_GGA )
WRITE(lxc_family,'(a)') "GGA"
CASE( XC_FAMILY_HYB_GGA )
@ -222,6 +225,9 @@ PROGRAM xc_infos
WRITE(stdout, '(" - Family: ",a)') TRIM(lxc_family)
WRITE(stdout, '(" - Kind: ",a)') TRIM(lxc_kind)
!
IF (lxc_family(1:6)=="Hybrid" .AND. (i==1 .OR. i==3 .OR. &
((i==2.OR.i==4).AND.fkind==XC_EXCHANGE_CORRELATION))) &
WRITE(stdout,*) '- Default exx fraction: ', exx_fraction
IF ( n_ext_params(i)/=0 ) THEN
WRITE(stdout, '(" - External parameters: ",i3)') n_ext_params(i)
DO ii = 0, n_ext_params(i)-1

View File

@ -60,7 +60,8 @@ SUBROUTINE dgcxc_( length, sp, r_in, g_in, dvxc_rr, dvxc_sr, dvxc_ss )
USE constants_l, ONLY: e2
USE kind_l, ONLY: DP
USE dft_setting_params, ONLY: igcx, igcc, is_libxc, rho_threshold_gga, &
grho_threshold_gga, rho_threshold_lda
grho_threshold_gga, rho_threshold_lda, &
ishybrid, exx_started, exx_fraction
USE qe_drivers_d_gga
#if defined(__LIBXC)
#include "xc_version.h"
@ -99,7 +100,7 @@ SUBROUTINE dgcxc_( length, sp, r_in, g_in, dvxc_rr, dvxc_sr, dvxc_ss )
#endif
!
INTEGER :: k, length_dlxc
REAL(DP) :: rht, zeta
REAL(DP) :: rht, zeta, xcoef
REAL(DP), ALLOCATABLE :: sigma(:)
REAL(DP), PARAMETER :: small = 1.E-10_DP, rho_trash = 0.5_DP
REAL(DP), PARAMETER :: epsr=1.0d-6, epsg=1.0d-6
@ -177,15 +178,18 @@ SUBROUTINE dgcxc_( length, sp, r_in, g_in, dvxc_rr, dvxc_sr, dvxc_ss )
v2rhosigma_x(1), v2sigma2_x(1) )
!$acc data copyin( v2rho2_x, v2rhosigma_x, v2sigma2_x )
!
xcoef = 1.d0
IF ( ishybrid .AND. exx_started .AND. exx_fraction>0.d0) xcoef = 1.d0-exx_fraction
!
IF (sp==1) THEN
!$acc parallel loop
DO k = 1, length
IF ( rho_lxc(k)>small .AND. SQRT(ABS(sigma(k)))>small ) THEN
IF ( rho_lxc(k)>rho_threshold_lda ) THEN
dvxc_rr(k,1,1) = dvxc_rr(k,1,1) + e2 * v2rho2_x(k)
dvxc_sr(k,1,1) = dvxc_sr(k,1,1) + e2 * v2rhosigma_x(k)*2._DP
dvxc_rr(k,1,1) = xcoef * e2 * v2rho2_x(k)
dvxc_sr(k,1,1) = xcoef * e2 * v2rhosigma_x(k)*2._DP
ENDIF
dvxc_ss(k,1,1) = dvxc_ss(k,1,1) + e2 * v2sigma2_x(k)*4._DP
dvxc_ss(k,1,1) = xcoef * e2 * v2sigma2_x(k)*4._DP
ENDIF
ENDDO
ELSEIF (sp==2) THEN
@ -193,14 +197,14 @@ SUBROUTINE dgcxc_( length, sp, r_in, g_in, dvxc_rr, dvxc_sr, dvxc_ss )
DO k = 1, length
IF ( (r_in(k,1)>epsr .AND. SQRT(ABS(sigma(3*k-2)))>epsg) .AND. &
(r_in(k,2)>epsr .AND. SQRT(ABS(sigma(3*k))) >epsg) ) THEN
dvxc_rr(k,1,1) = dvxc_rr(k,1,1) + e2 * v2rho2_x(3*k-2)
dvxc_ss(k,1,1) = dvxc_ss(k,1,1) + e2 * v2sigma2_x(6*k-5)*4._DP
dvxc_rr(k,2,2) = dvxc_rr(k,2,2) + e2 * v2rho2_x(3*k)
dvxc_ss(k,2,2) = dvxc_ss(k,2,2) + e2 * v2sigma2_x(6*k)*4._DP
dvxc_rr(k,1,2) = dvxc_rr(k,1,2) + e2 * v2rho2_x(3*k-1)
dvxc_sr(k,1,1) = dvxc_sr(k,1,1) + e2 * v2rhosigma_x(6*k-5)*2._DP
dvxc_rr(k,2,1) = dvxc_rr(k,2,1) + e2 * v2rho2_x(3*k-1)
dvxc_sr(k,2,2) = dvxc_sr(k,2,2) + e2 * v2rhosigma_x(6*k)*2._DP
dvxc_rr(k,1,1) = xcoef * e2 * v2rho2_x(3*k-2)
dvxc_ss(k,1,1) = xcoef * e2 * v2sigma2_x(6*k-5)*4._DP
dvxc_rr(k,2,2) = xcoef * e2 * v2rho2_x(3*k)
dvxc_ss(k,2,2) = xcoef * e2 * v2sigma2_x(6*k)*4._DP
dvxc_rr(k,1,2) = xcoef * e2 * v2rho2_x(3*k-1)
dvxc_sr(k,1,1) = xcoef * e2 * v2rhosigma_x(6*k-5)*2._DP
dvxc_rr(k,2,1) = xcoef * e2 * v2rho2_x(3*k-1)
dvxc_sr(k,2,2) = xcoef * e2 * v2rhosigma_x(6*k)*2._DP
ENDIF
ENDDO
ENDIF

View File

@ -103,7 +103,8 @@ SUBROUTINE xc_gcx_( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud )
USE kind_l, ONLY: DP
USE xclib_utils_and_para, ONLY: error_msg, nowarning
USE dft_setting_params, ONLY: igcx, igcc, is_libxc, rho_threshold_gga, &
grho_threshold_gga, rho_threshold_lda
grho_threshold_gga, rho_threshold_lda, &
ishybrid, exx_started, exx_fraction
USE qe_drivers_gga
!
IMPLICIT NONE
@ -129,7 +130,7 @@ SUBROUTINE xc_gcx_( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud )
REAL(DP), ALLOCATABLE :: vc_rho(:), vc_sigma(:)
!
INTEGER :: fkind_x, np
REAL(DP) :: rs, rtot, zet, vc_2(2), arho_k
REAL(DP) :: rs, rtot, zet, vc_2(2), arho_k, xcoef
REAL(DP), PARAMETER :: pi34 = 0.6203504908994_DP
!
LOGICAL :: POLARIZED
@ -206,7 +207,8 @@ SUBROUTINE xc_gcx_( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud )
!
IF ( ns==1 .AND. ANY(.NOT.is_libxc(3:4)) ) THEN
!
CALL gcxc( length, rho_lxc, sigma, ex, ec, v1x(:,1), v2x(:,1), v1c(:,1), v2c(:,1), ierr )
CALL gcxc( length, rho_lxc, sigma, ex, ec, v1x(:,1), v2x(:,1), v1c(:,1), &
v2c(:,1), ierr )
!
!$acc parallel loop
DO k = 1, length
@ -227,9 +229,11 @@ SUBROUTINE xc_gcx_( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud )
!
CALL xc_f03_func_set_dens_threshold( xc_func(4), small )!rho_threshold_gga )
IF (libxc_flags(4,0)==1) THEN
CALL xc_f03_gga_exc_vxc( xc_func(4), lengthxc, rho_lxc(1), sigma(1), ec_lxc(1), vc_rho(1), vc_sigma(1) )
CALL xc_f03_gga_exc_vxc( xc_func(4), lengthxc, rho_lxc(1), sigma(1), &
ec_lxc(1), vc_rho(1), vc_sigma(1) )
ELSE
CALL xc_f03_gga_vxc( xc_func(4), lengthxc, rho_lxc(1), sigma(1), vc_rho(1), vc_sigma(1) )
CALL xc_f03_gga_vxc( xc_func(4), lengthxc, rho_lxc(1), sigma(1), &
vc_rho(1), vc_sigma(1) )
ec_lxc = 0.d0
ENDIF
!
@ -357,14 +361,14 @@ SUBROUTINE xc_gcx_( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud )
ex(k) = 0.d0 ; v1x(k,1) = 0.d0 ; v2x(k,1) = 0.d0
CYCLE
ENDIF
ex(k) = ex_lxc(k) * rho_lxc(k) * SIGN(1.0_DP, rho(k,1))
v1x(k,1) = vx_rho(k)
ex(k) = xcoef * ex_lxc(k) * rho_lxc(k) * SIGN(1.0_DP, rho(k,1))
v1x(k,1) = xcoef * vx_rho(k)
IF ( rho_lxc(k) <= rho_threshold_gga .OR. &
SQRT(ABS(sigma(k))) <= grho_threshold_gga) THEN
v2x(k,1) = 0.d0
CYCLE
ENDIF
v2x(k,1) = vx_sigma(k)*2.d0
v2x(k,1) = xcoef * vx_sigma(k)*2.d0
ENDDO
ELSE
!$acc parallel loop
@ -379,16 +383,16 @@ SUBROUTINE xc_gcx_( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud )
v2x(k,1) = 0.d0 ; v2x(k,2) = 0.d0
CYCLE
ENDIF
ex(k) = ex_lxc(k) * (rho_up+rho_dw)
v1x(k,1) = vx_rho(2*k-1)
v1x(k,2) = vx_rho(2*k)
ex(k) = xcoef * ex_lxc(k) * (rho_up+rho_dw)
v1x(k,1) = xcoef * vx_rho(2*k-1)
v1x(k,2) = xcoef * vx_rho(2*k)
IF ( rho_up <= rho_threshold_gga .OR. rho_dw <= rho_threshold_gga .OR. &
grho_up<=grho_threshold_gga .OR. grho_dw<=grho_threshold_gga ) THEN
v2x(k,1) = 0.d0 ; v2x(k,2) = 0.d0
CYCLE
ENDIF
v2x(k,1) = vx_sigma(3*k-2)*2.d0
v2x(k,2) = vx_sigma(3*k)*2.d0
v2x(k,1) = xcoef * vx_sigma(3*k-2)*2.d0
v2x(k,2) = xcoef * vx_sigma(3*k)*2.d0
ENDDO
ENDIF
!

View File

@ -88,7 +88,7 @@ SUBROUTINE xc_metagcx_( length, ns, np, rho, grho, tau, ex, ec, v1x, v2x, v3x, v
USE kind_l, ONLY: DP
USE dft_setting_params, ONLY: imeta, imetac, is_libxc, rho_threshold_mgga,&
grho2_threshold_mgga, tau_threshold_mgga, &
scan_exx, exx_started, exx_fraction
ishybrid, exx_started, exx_fraction
USE qe_drivers_mgga
!
IMPLICIT NONE
@ -135,7 +135,7 @@ SUBROUTINE xc_metagcx_( length, ns, np, rho, grho, tau, ex, ec, v1x, v2x, v3x, v
REAL(DP), ALLOCATABLE :: vc_rho(:), vc_sigma(:), vc_tau(:)
REAL(DP), ALLOCATABLE :: lapl_rho(:), vlapl_rho(:) ! not used in QE
!
REAL(DP) :: rh, ggrho2, atau
REAL(DP) :: rh, ggrho2, atau, xcoef
#if (XC_MAJOR_VERSION > 4)
INTEGER(8) :: lengthxc
#else
@ -243,6 +243,9 @@ SUBROUTINE xc_metagcx_( length, ns, np, rho, grho, tau, ex, ec, v1x, v2x, v3x, v
ex_lxc = 0.d0
ENDIF
!
xcoef = 1.d0
IF ( ishybrid .AND. exx_started .AND. exx_fraction>0.d0) xcoef = 1.d0-exx_fraction
!
!$acc data copyin( ex_lxc, vx_rho, vx_sigma, vx_tau )
IF ( ns==1 ) THEN
!$acc parallel loop
@ -254,10 +257,10 @@ SUBROUTINE xc_metagcx_( length, ns, np, rho, grho, tau, ex, ec, v1x, v2x, v3x, v
v2x(k,1) = 0.d0 ; v3x(k,1) = 0.d0
CYCLE
ENDIF
ex(k) = ex_lxc(k) * rho_lxc(k)
v1x(k,1) = vx_rho(k)
v2x(k,1) = vx_sigma(k) * 2.0_DP
v3x(k,1) = vx_tau(k)
ex(k) = xcoef * ex_lxc(k) * rho_lxc(k)
v1x(k,1) = xcoef * vx_rho(k)
v2x(k,1) = xcoef * vx_sigma(k) * 2.0_DP
v3x(k,1) = xcoef * vx_tau(k)
ENDDO
ELSE
!$acc parallel loop
@ -268,22 +271,22 @@ SUBROUTINE xc_metagcx_( length, ns, np, rho, grho, tau, ex, ec, v1x, v2x, v3x, v
v1x(k,2) = 0.d0 ; v2x(k,2) = 0.d0 ; v3x(k,2) = 0.d0
CYCLE
ENDIF
ex(k) = ex_lxc(k) * (rho_lxc(2*k-1)+rho_lxc(2*k))
ex(k) = xcoef * ex_lxc(k) * (rho_lxc(2*k-1)+rho_lxc(2*k))
IF ( ABS(rho_lxc(2*k-1))>rho_threshold_mgga .AND. &
sigma(3*k-2)>grho2_threshold_mgga .AND. &
ABS(tau_lxc(2*k-1))>tau_threshold_mgga ) THEN
v1x(k,1) = vx_rho(2*k-1)
v2x(k,1) = vx_sigma(3*k-2)*2.d0
v3x(k,1) = vx_tau(2*k-1)
v1x(k,1) = xcoef * vx_rho(2*k-1)
v2x(k,1) = xcoef * vx_sigma(3*k-2)*2.d0
v3x(k,1) = xcoef * vx_tau(2*k-1)
ELSE
v1x(k,1) = 0.d0 ; v2x(k,1) = 0.d0 ; v3x(k,1) = 0.d0
ENDIF
IF ( ABS(rho_lxc(2*k))>rho_threshold_mgga .AND. &
sigma(3*k)>grho2_threshold_mgga .AND. &
ABS(tau_lxc(2*k))>tau_threshold_mgga ) THEN
v1x(k,2) = vx_rho(2*k)
v2x(k,2) = vx_sigma(3*k)*2.d0
v3x(k,2) = vx_tau(2*k)
v1x(k,2) = xcoef * vx_rho(2*k)
v2x(k,2) = xcoef * vx_sigma(3*k)*2.d0
v3x(k,2) = xcoef * vx_tau(2*k)
ELSE
v1x(k,2) = 0.d0 ; v2x(k,2) = 0.d0 ; v3x(k,2) = 0.d0
ENDIF

View File

@ -48,7 +48,7 @@ PROGRAM xclib_test
#if defined(__LIBXC)
#include "xc_version.h"
USE xc_f03_lib_m
USE dft_setting_params, ONLY: xc_info, xc_kind_error, libxc_flags
USE dft_setting_params, ONLY: xc_func, xc_info, xc_kind_error, libxc_flags
#endif
USE dft_setting_params, ONLY: is_libxc
USE dft_setting_routines, ONLY: capital
@ -584,6 +584,7 @@ PROGRAM xclib_test
IF (xclib_dft_is_libxc( 'ANY' )) CALL xclib_init_libxc( ns, .FALSE. )
!
IF ( igcc1==428 .AND. is_libxc(4) ) THEN
! IF ( igcx1==426 .AND. is_libxc(3) ) THEN
! Example of how to change an external parameter in a Libxc
! functional (HYB_GGA_XC_HSE06).
! Arguments: