mirror of https://gitlab.com/QEF/q-e.git
libxc hybrid inclusion improved
This commit is contained in:
parent
9550cec5d2
commit
bd4a3c8864
|
@ -346,14 +346,14 @@ CONTAINS
|
||||||
! ... local variables
|
! ... local variables
|
||||||
!
|
!
|
||||||
INTEGER :: len, l, i
|
INTEGER :: len, l, i
|
||||||
CHARACTER(len=150) :: dftout
|
CHARACTER(len=150) :: dftout, dftout_loc
|
||||||
LOGICAL :: dft_defined
|
LOGICAL :: dft_defined
|
||||||
LOGICAL :: check_libxc
|
LOGICAL :: check_libxc
|
||||||
!
|
!
|
||||||
CHARACTER(LEN=1), EXTERNAL :: capital
|
CHARACTER(LEN=1), EXTERNAL :: capital
|
||||||
CHARACTER(LEN=4) :: lda_exch, lda_corr, gga_exch, gga_corr
|
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
|
INTEGER :: iexch, icorr, igcx, igcc, imeta
|
||||||
!
|
!
|
||||||
! Exit if set to discard further input dft
|
! Exit if set to discard further input dft
|
||||||
|
@ -510,7 +510,7 @@ CONTAINS
|
||||||
! Case for old RRKJ format, containing indices instead of label
|
! Case for old RRKJ format, containing indices instead of label
|
||||||
CASE DEFAULT
|
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
|
READ( dftout(7:18), '(6i2)') iexch, icorr, igcx, igcc, inlc, imeta
|
||||||
dft_defined = xclib_set_dft_IDs(iexch, icorr, igcx, igcc, imeta, 0)
|
dft_defined = xclib_set_dft_IDs(iexch, icorr, igcx, igcc, imeta, 0)
|
||||||
CALL xclib_get_name('LDA','EXCH', lda_exch)
|
CALL xclib_get_name('LDA','EXCH', lda_exch)
|
||||||
|
@ -523,9 +523,19 @@ CONTAINS
|
||||||
TRIM(gga_exch) //'-'// &
|
TRIM(gga_exch) //'-'// &
|
||||||
TRIM(gga_corr) //'-'// nonlocc(inlc)
|
TRIM(gga_corr) //'-'// nonlocc(inlc)
|
||||||
ELSE
|
ELSE
|
||||||
CALL xclib_set_dft_from_name( TRIM(dftout) )
|
!
|
||||||
|
dftout_loc = ''
|
||||||
inlc = matching( dftout, ncnl, nonlocc )
|
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.
|
dft_defined = .TRUE.
|
||||||
|
!
|
||||||
ENDIF
|
ENDIF
|
||||||
!
|
!
|
||||||
END SELECT
|
END SELECT
|
||||||
|
|
|
@ -1273,10 +1273,10 @@ MODULE pw_restart_new
|
||||||
CALL dftd3_set_functional(dftd3, func = dft_, version = dftd3_version, tz=.FALSE.)
|
CALL dftd3_set_functional(dftd3, func = dft_, version = dftd3_version, tz=.FALSE.)
|
||||||
END IF
|
END IF
|
||||||
IF ( xclib_dft_is('hybrid') ) THEN
|
IF ( xclib_dft_is('hybrid') ) THEN
|
||||||
ecutvcut=ecutvcut*e2
|
ecutvcut = ecutvcut*e2
|
||||||
ecutfock=ecutfock*e2
|
ecutfock = ecutfock*e2
|
||||||
CALL xclib_set_exx_fraction( exx_fraction )
|
CALL xclib_set_exx_fraction( exx_fraction )
|
||||||
CALL set_screening_parameter ( screening_parameter )
|
CALL set_screening_parameter( screening_parameter )
|
||||||
CALL start_exx ()
|
CALL start_exx ()
|
||||||
END IF
|
END IF
|
||||||
!! Band structure section
|
!! Band structure section
|
||||||
|
|
|
@ -492,12 +492,20 @@ CONTAINS
|
||||||
islda, isgradient, ismeta, exx_fraction, &
|
islda, isgradient, ismeta, exx_fraction, &
|
||||||
screening_parameter, gau_parameter, &
|
screening_parameter, gau_parameter, &
|
||||||
ishybrid, has_finite_size_correction, is_libxc
|
ishybrid, has_finite_size_correction, is_libxc
|
||||||
|
#if defined(__LIBXC)
|
||||||
|
USE xc_f03_lib_m
|
||||||
|
#endif
|
||||||
!
|
!
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
!
|
!
|
||||||
LOGICAL, INTENT(IN) :: isnonlocc
|
LOGICAL, INTENT(IN) :: isnonlocc
|
||||||
!! The non-local part, for now, is not included in xc_lib, but this variable
|
!! The non-local part, for now, is not included in xc_lib, but this variable
|
||||||
!! is needed to establish 'isgradient'.
|
!! 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
|
LOGICAL :: is_libxc13, is_libxc12
|
||||||
!
|
!
|
||||||
ismeta = (imeta+imetac > 0)
|
ismeta = (imeta+imetac > 0)
|
||||||
|
@ -530,12 +538,12 @@ CONTAINS
|
||||||
screening_parameter = 0.106_DP
|
screening_parameter = 0.106_DP
|
||||||
ENDIF
|
ENDIF
|
||||||
! AH-CROSStest-SERIES PBE-AH (at 34), PBESOL-AH (at 35)
|
! 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
|
exx_fraction = 0.20_DP
|
||||||
screening_parameter = 0.106_DP
|
screening_parameter = 0.106_DP
|
||||||
ENDIF
|
ENDIF
|
||||||
! gau-pbe
|
! 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
|
exx_fraction = 0.24_DP
|
||||||
gau_parameter = 0.150_DP
|
gau_parameter = 0.150_DP
|
||||||
ENDIF
|
ENDIF
|
||||||
|
@ -543,9 +551,32 @@ CONTAINS
|
||||||
IF ( iexch==4 .AND. .NOT.is_libxc(1)) exx_fraction = 1.0_DP
|
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
|
IF ( iexch==5 .AND. .NOT.is_libxc(1)) exx_fraction = 1.0_DP
|
||||||
! B3LYP or B3LYP-VWN-1-RPA
|
! 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
|
! 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 )
|
ishybrid = ( exx_fraction /= 0.0_DP )
|
||||||
!
|
!
|
||||||
|
@ -676,16 +707,23 @@ CONTAINS
|
||||||
SUBROUTINE set_screening_parameter( scrparm_ )
|
SUBROUTINE set_screening_parameter( scrparm_ )
|
||||||
!! Impose input parameter as screening parameter (for pbexsr)
|
!! Impose input parameter as screening parameter (for pbexsr)
|
||||||
USE kind_l, ONLY: DP
|
USE kind_l, ONLY: DP
|
||||||
USE dft_setting_params, ONLY: igcx, is_libxc, screening_parameter
|
USE dft_setting_params
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
REAL(DP):: scrparm_
|
REAL(DP):: scrparm_
|
||||||
!! Value to impose as screening parameter
|
!! Value to impose as screening parameter
|
||||||
IF (ABS(scrparm_)>0.d0.AND.(igcx/=12.AND.(igcx<32.OR.igcx>35) &
|
INTEGER :: fkind
|
||||||
.AND.igcx/=47).AND. .NOT.is_libxc(3)) THEN
|
LOGICAL :: lxc_cond4 = .FALSE.
|
||||||
CALL xclib_infomsg( 'set_screening_parameter', 'WARNING: the screening &
|
#if defined(__LIBXC)
|
||||||
¶meter seems inconsistent with the chosen inpu&
|
lxc_cond4 = (igcx==0 .AND.is_libxc(4) .AND. fkind==XC_EXCHANGE_CORRELATION)
|
||||||
&t dft and will be set to zero.' )
|
#endif
|
||||||
screening_parameter = 0.d0
|
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 &
|
||||||
|
¶meter seems inconsistent with the chosen inpu&
|
||||||
|
&t dft and will be set to zero.' )
|
||||||
|
screening_parameter = 0.d0
|
||||||
|
ENDIF
|
||||||
ELSE
|
ELSE
|
||||||
screening_parameter = scrparm_
|
screening_parameter = scrparm_
|
||||||
ENDIF
|
ENDIF
|
||||||
|
@ -1012,8 +1050,7 @@ CONTAINS
|
||||||
#if defined(__LIBXC)
|
#if defined(__LIBXC)
|
||||||
USE xclib_utils_and_para,ONLY: nowarning
|
USE xclib_utils_and_para,ONLY: nowarning
|
||||||
USE dft_setting_params, ONLY: n_ext_params, xc_func, xc_info, par_list, &
|
USE dft_setting_params, ONLY: n_ext_params, xc_func, xc_info, par_list, &
|
||||||
libxc_flags, n_ext_params, exx_fraction, &
|
libxc_flags, n_ext_params
|
||||||
ishybrid
|
|
||||||
#endif
|
#endif
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
INTEGER, INTENT(IN) :: xclib_nspin
|
INTEGER, INTENT(IN) :: xclib_nspin
|
||||||
|
@ -1053,11 +1090,6 @@ CONTAINS
|
||||||
flags_tot = flags_tot-2**iflag
|
flags_tot = flags_tot-2**iflag
|
||||||
ENDDO
|
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) )
|
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
|
p0 = 0 ; pn = n_ext_params(iid)-1 ; ips = 1
|
||||||
!
|
!
|
||||||
|
@ -1160,7 +1192,7 @@ CONTAINS
|
||||||
REAL(DP), INTENT(IN) :: param
|
REAL(DP), INTENT(IN) :: param
|
||||||
!! Input value of the parameter
|
!! Input value of the parameter
|
||||||
#if defined(__LIBXC)
|
#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,:) )
|
CALL xc_f03_func_set_ext_params( xc_func(sid), par_list(sid,:) )
|
||||||
#else
|
#else
|
||||||
CALL xclib_infomsg( 'set_libxc_ext_param', 'WARNING: an external parameter&
|
CALL xclib_infomsg( 'set_libxc_ext_param', 'WARNING: an external parameter&
|
||||||
|
@ -1186,7 +1218,7 @@ CONTAINS
|
||||||
REAL(DP) :: get_libxc_ext_param
|
REAL(DP) :: get_libxc_ext_param
|
||||||
!! Value of the parameter
|
!! Value of the parameter
|
||||||
#if defined(__LIBXC)
|
#if defined(__LIBXC)
|
||||||
get_libxc_ext_param = par_list(sid,i_param)
|
get_libxc_ext_param = par_list(sid,i_param+1)
|
||||||
#else
|
#else
|
||||||
CALL xclib_infomsg( 'get_libxc_ext_param', 'WARNING: an external parameter&
|
CALL xclib_infomsg( 'get_libxc_ext_param', 'WARNING: an external parameter&
|
||||||
&was sought in Libxc, but Libxc is not linked' )
|
&was sought in Libxc, but Libxc is not linked' )
|
||||||
|
|
|
@ -25,7 +25,7 @@ PROGRAM xc_infos
|
||||||
USE xclib_utils_and_para, ONLY: stdout, nowarning
|
USE xclib_utils_and_para, ONLY: stdout, nowarning
|
||||||
#if defined(__LIBXC)
|
#if defined(__LIBXC)
|
||||||
USE xc_f03_lib_m
|
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
|
par_list, libxc_flags
|
||||||
#endif
|
#endif
|
||||||
!
|
!
|
||||||
|
@ -35,7 +35,7 @@ PROGRAM xc_infos
|
||||||
CHARACTER(LEN=150) :: dft_r
|
CHARACTER(LEN=150) :: dft_r
|
||||||
CHARACTER(LEN=100) :: dft_w
|
CHARACTER(LEN=100) :: dft_w
|
||||||
CHARACTER(LEN=10) :: dft_n
|
CHARACTER(LEN=10) :: dft_n
|
||||||
INTEGER :: n_ext, id(6), idfull
|
INTEGER :: n_ext, id(6), idfull, fkind
|
||||||
INTEGER :: i, ii
|
INTEGER :: i, ii
|
||||||
!
|
!
|
||||||
!-------- Input var -----------------------
|
!-------- Input var -----------------------
|
||||||
|
@ -107,11 +107,11 @@ PROGRAM xc_infos
|
||||||
WRITE(stdout,*) " "
|
WRITE(stdout,*) " "
|
||||||
WRITE(stdout,*) "============== "
|
WRITE(stdout,*) "============== "
|
||||||
!
|
!
|
||||||
|
CALL xclib_set_auxiliary_flags( .FALSE. )
|
||||||
|
!
|
||||||
#if defined(__LIBXC)
|
#if defined(__LIBXC)
|
||||||
IF (xclib_dft_is_libxc('ANY')) CALL xclib_init_libxc( 1, .FALSE. )
|
IF (xclib_dft_is_libxc('ANY')) CALL xclib_init_libxc( 1, .FALSE. )
|
||||||
#endif
|
#endif
|
||||||
!
|
|
||||||
CALL xclib_set_auxiliary_flags( .FALSE. )
|
|
||||||
!
|
!
|
||||||
DO i = 1, 6
|
DO i = 1, 6
|
||||||
idx = id(i)
|
idx = id(i)
|
||||||
|
@ -187,7 +187,8 @@ PROGRAM xc_infos
|
||||||
!
|
!
|
||||||
ELSEIF (is_libxc(i)) THEN
|
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 )
|
CASE( XC_EXCHANGE )
|
||||||
WRITE(lxc_kind, '(a)') 'EXCHANGE'
|
WRITE(lxc_kind, '(a)') 'EXCHANGE'
|
||||||
CASE( XC_CORRELATION )
|
CASE( XC_CORRELATION )
|
||||||
|
@ -204,6 +205,8 @@ PROGRAM xc_infos
|
||||||
SELECT CASE( xc_f03_func_info_get_family(xc_info(i)) )
|
SELECT CASE( xc_f03_func_info_get_family(xc_info(i)) )
|
||||||
CASE( XC_FAMILY_LDA )
|
CASE( XC_FAMILY_LDA )
|
||||||
WRITE(lxc_family,'(a)') "LDA"
|
WRITE(lxc_family,'(a)') "LDA"
|
||||||
|
CASE( XC_FAMILY_HYB_LDA )
|
||||||
|
WRITE(lxc_family,'(a)') "Hybrid LDA"
|
||||||
CASE( XC_FAMILY_GGA )
|
CASE( XC_FAMILY_GGA )
|
||||||
WRITE(lxc_family,'(a)') "GGA"
|
WRITE(lxc_family,'(a)') "GGA"
|
||||||
CASE( XC_FAMILY_HYB_GGA )
|
CASE( XC_FAMILY_HYB_GGA )
|
||||||
|
@ -222,6 +225,9 @@ PROGRAM xc_infos
|
||||||
WRITE(stdout, '(" - Family: ",a)') TRIM(lxc_family)
|
WRITE(stdout, '(" - Family: ",a)') TRIM(lxc_family)
|
||||||
WRITE(stdout, '(" - Kind: ",a)') TRIM(lxc_kind)
|
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
|
IF ( n_ext_params(i)/=0 ) THEN
|
||||||
WRITE(stdout, '(" - External parameters: ",i3)') n_ext_params(i)
|
WRITE(stdout, '(" - External parameters: ",i3)') n_ext_params(i)
|
||||||
DO ii = 0, n_ext_params(i)-1
|
DO ii = 0, n_ext_params(i)-1
|
||||||
|
|
|
@ -60,7 +60,8 @@ SUBROUTINE dgcxc_( length, sp, r_in, g_in, dvxc_rr, dvxc_sr, dvxc_ss )
|
||||||
USE constants_l, ONLY: e2
|
USE constants_l, ONLY: e2
|
||||||
USE kind_l, ONLY: DP
|
USE kind_l, ONLY: DP
|
||||||
USE dft_setting_params, ONLY: igcx, igcc, is_libxc, rho_threshold_gga, &
|
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
|
USE qe_drivers_d_gga
|
||||||
#if defined(__LIBXC)
|
#if defined(__LIBXC)
|
||||||
#include "xc_version.h"
|
#include "xc_version.h"
|
||||||
|
@ -99,7 +100,7 @@ SUBROUTINE dgcxc_( length, sp, r_in, g_in, dvxc_rr, dvxc_sr, dvxc_ss )
|
||||||
#endif
|
#endif
|
||||||
!
|
!
|
||||||
INTEGER :: k, length_dlxc
|
INTEGER :: k, length_dlxc
|
||||||
REAL(DP) :: rht, zeta
|
REAL(DP) :: rht, zeta, xcoef
|
||||||
REAL(DP), ALLOCATABLE :: sigma(:)
|
REAL(DP), ALLOCATABLE :: sigma(:)
|
||||||
REAL(DP), PARAMETER :: small = 1.E-10_DP, rho_trash = 0.5_DP
|
REAL(DP), PARAMETER :: small = 1.E-10_DP, rho_trash = 0.5_DP
|
||||||
REAL(DP), PARAMETER :: epsr=1.0d-6, epsg=1.0d-6
|
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) )
|
v2rhosigma_x(1), v2sigma2_x(1) )
|
||||||
!$acc data copyin( v2rho2_x, v2rhosigma_x, v2sigma2_x )
|
!$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
|
IF (sp==1) THEN
|
||||||
!$acc parallel loop
|
!$acc parallel loop
|
||||||
DO k = 1, length
|
DO k = 1, length
|
||||||
IF ( rho_lxc(k)>small .AND. SQRT(ABS(sigma(k)))>small ) THEN
|
IF ( rho_lxc(k)>small .AND. SQRT(ABS(sigma(k)))>small ) THEN
|
||||||
IF ( rho_lxc(k)>rho_threshold_lda ) THEN
|
IF ( rho_lxc(k)>rho_threshold_lda ) THEN
|
||||||
dvxc_rr(k,1,1) = dvxc_rr(k,1,1) + e2 * v2rho2_x(k)
|
dvxc_rr(k,1,1) = xcoef * e2 * v2rho2_x(k)
|
||||||
dvxc_sr(k,1,1) = dvxc_sr(k,1,1) + e2 * v2rhosigma_x(k)*2._DP
|
dvxc_sr(k,1,1) = xcoef * e2 * v2rhosigma_x(k)*2._DP
|
||||||
ENDIF
|
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
|
ENDIF
|
||||||
ENDDO
|
ENDDO
|
||||||
ELSEIF (sp==2) THEN
|
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
|
DO k = 1, length
|
||||||
IF ( (r_in(k,1)>epsr .AND. SQRT(ABS(sigma(3*k-2)))>epsg) .AND. &
|
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
|
(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_rr(k,1,1) = xcoef * 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_ss(k,1,1) = xcoef * e2 * v2sigma2_x(6*k-5)*4._DP
|
||||||
dvxc_rr(k,2,2) = dvxc_rr(k,2,2) + e2 * v2rho2_x(3*k)
|
dvxc_rr(k,2,2) = xcoef * e2 * v2rho2_x(3*k)
|
||||||
dvxc_ss(k,2,2) = dvxc_ss(k,2,2) + e2 * v2sigma2_x(6*k)*4._DP
|
dvxc_ss(k,2,2) = xcoef * e2 * v2sigma2_x(6*k)*4._DP
|
||||||
dvxc_rr(k,1,2) = dvxc_rr(k,1,2) + e2 * v2rho2_x(3*k-1)
|
dvxc_rr(k,1,2) = xcoef * 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_sr(k,1,1) = xcoef * 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_rr(k,2,1) = xcoef * e2 * v2rho2_x(3*k-1)
|
||||||
dvxc_sr(k,2,2) = dvxc_sr(k,2,2) + e2 * v2rhosigma_x(6*k)*2._DP
|
dvxc_sr(k,2,2) = xcoef * e2 * v2rhosigma_x(6*k)*2._DP
|
||||||
ENDIF
|
ENDIF
|
||||||
ENDDO
|
ENDDO
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
|
@ -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 kind_l, ONLY: DP
|
||||||
USE xclib_utils_and_para, ONLY: error_msg, nowarning
|
USE xclib_utils_and_para, ONLY: error_msg, nowarning
|
||||||
USE dft_setting_params, ONLY: igcx, igcc, is_libxc, rho_threshold_gga, &
|
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
|
USE qe_drivers_gga
|
||||||
!
|
!
|
||||||
IMPLICIT NONE
|
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(:)
|
REAL(DP), ALLOCATABLE :: vc_rho(:), vc_sigma(:)
|
||||||
!
|
!
|
||||||
INTEGER :: fkind_x, np
|
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
|
REAL(DP), PARAMETER :: pi34 = 0.6203504908994_DP
|
||||||
!
|
!
|
||||||
LOGICAL :: POLARIZED
|
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
|
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
|
!$acc parallel loop
|
||||||
DO k = 1, length
|
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 )
|
CALL xc_f03_func_set_dens_threshold( xc_func(4), small )!rho_threshold_gga )
|
||||||
IF (libxc_flags(4,0)==1) THEN
|
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
|
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
|
ec_lxc = 0.d0
|
||||||
ENDIF
|
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
|
ex(k) = 0.d0 ; v1x(k,1) = 0.d0 ; v2x(k,1) = 0.d0
|
||||||
CYCLE
|
CYCLE
|
||||||
ENDIF
|
ENDIF
|
||||||
ex(k) = ex_lxc(k) * rho_lxc(k) * SIGN(1.0_DP, rho(k,1))
|
ex(k) = xcoef * ex_lxc(k) * rho_lxc(k) * SIGN(1.0_DP, rho(k,1))
|
||||||
v1x(k,1) = vx_rho(k)
|
v1x(k,1) = xcoef * vx_rho(k)
|
||||||
IF ( rho_lxc(k) <= rho_threshold_gga .OR. &
|
IF ( rho_lxc(k) <= rho_threshold_gga .OR. &
|
||||||
SQRT(ABS(sigma(k))) <= grho_threshold_gga) THEN
|
SQRT(ABS(sigma(k))) <= grho_threshold_gga) THEN
|
||||||
v2x(k,1) = 0.d0
|
v2x(k,1) = 0.d0
|
||||||
CYCLE
|
CYCLE
|
||||||
ENDIF
|
ENDIF
|
||||||
v2x(k,1) = vx_sigma(k)*2.d0
|
v2x(k,1) = xcoef * vx_sigma(k)*2.d0
|
||||||
ENDDO
|
ENDDO
|
||||||
ELSE
|
ELSE
|
||||||
!$acc parallel loop
|
!$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
|
v2x(k,1) = 0.d0 ; v2x(k,2) = 0.d0
|
||||||
CYCLE
|
CYCLE
|
||||||
ENDIF
|
ENDIF
|
||||||
ex(k) = ex_lxc(k) * (rho_up+rho_dw)
|
ex(k) = xcoef * ex_lxc(k) * (rho_up+rho_dw)
|
||||||
v1x(k,1) = vx_rho(2*k-1)
|
v1x(k,1) = xcoef * vx_rho(2*k-1)
|
||||||
v1x(k,2) = vx_rho(2*k)
|
v1x(k,2) = xcoef * vx_rho(2*k)
|
||||||
IF ( rho_up <= rho_threshold_gga .OR. rho_dw <= rho_threshold_gga .OR. &
|
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
|
grho_up<=grho_threshold_gga .OR. grho_dw<=grho_threshold_gga ) THEN
|
||||||
v2x(k,1) = 0.d0 ; v2x(k,2) = 0.d0
|
v2x(k,1) = 0.d0 ; v2x(k,2) = 0.d0
|
||||||
CYCLE
|
CYCLE
|
||||||
ENDIF
|
ENDIF
|
||||||
v2x(k,1) = vx_sigma(3*k-2)*2.d0
|
v2x(k,1) = xcoef * vx_sigma(3*k-2)*2.d0
|
||||||
v2x(k,2) = vx_sigma(3*k)*2.d0
|
v2x(k,2) = xcoef * vx_sigma(3*k)*2.d0
|
||||||
ENDDO
|
ENDDO
|
||||||
ENDIF
|
ENDIF
|
||||||
!
|
!
|
||||||
|
|
|
@ -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 kind_l, ONLY: DP
|
||||||
USE dft_setting_params, ONLY: imeta, imetac, is_libxc, rho_threshold_mgga,&
|
USE dft_setting_params, ONLY: imeta, imetac, is_libxc, rho_threshold_mgga,&
|
||||||
grho2_threshold_mgga, tau_threshold_mgga, &
|
grho2_threshold_mgga, tau_threshold_mgga, &
|
||||||
scan_exx, exx_started, exx_fraction
|
ishybrid, exx_started, exx_fraction
|
||||||
USE qe_drivers_mgga
|
USE qe_drivers_mgga
|
||||||
!
|
!
|
||||||
IMPLICIT NONE
|
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 :: vc_rho(:), vc_sigma(:), vc_tau(:)
|
||||||
REAL(DP), ALLOCATABLE :: lapl_rho(:), vlapl_rho(:) ! not used in QE
|
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)
|
#if (XC_MAJOR_VERSION > 4)
|
||||||
INTEGER(8) :: lengthxc
|
INTEGER(8) :: lengthxc
|
||||||
#else
|
#else
|
||||||
|
@ -243,6 +243,9 @@ SUBROUTINE xc_metagcx_( length, ns, np, rho, grho, tau, ex, ec, v1x, v2x, v3x, v
|
||||||
ex_lxc = 0.d0
|
ex_lxc = 0.d0
|
||||||
ENDIF
|
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 )
|
!$acc data copyin( ex_lxc, vx_rho, vx_sigma, vx_tau )
|
||||||
IF ( ns==1 ) THEN
|
IF ( ns==1 ) THEN
|
||||||
!$acc parallel loop
|
!$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
|
v2x(k,1) = 0.d0 ; v3x(k,1) = 0.d0
|
||||||
CYCLE
|
CYCLE
|
||||||
ENDIF
|
ENDIF
|
||||||
ex(k) = ex_lxc(k) * rho_lxc(k)
|
ex(k) = xcoef * ex_lxc(k) * rho_lxc(k)
|
||||||
v1x(k,1) = vx_rho(k)
|
v1x(k,1) = xcoef * vx_rho(k)
|
||||||
v2x(k,1) = vx_sigma(k) * 2.0_DP
|
v2x(k,1) = xcoef * vx_sigma(k) * 2.0_DP
|
||||||
v3x(k,1) = vx_tau(k)
|
v3x(k,1) = xcoef * vx_tau(k)
|
||||||
ENDDO
|
ENDDO
|
||||||
ELSE
|
ELSE
|
||||||
!$acc parallel loop
|
!$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
|
v1x(k,2) = 0.d0 ; v2x(k,2) = 0.d0 ; v3x(k,2) = 0.d0
|
||||||
CYCLE
|
CYCLE
|
||||||
ENDIF
|
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. &
|
IF ( ABS(rho_lxc(2*k-1))>rho_threshold_mgga .AND. &
|
||||||
sigma(3*k-2)>grho2_threshold_mgga .AND. &
|
sigma(3*k-2)>grho2_threshold_mgga .AND. &
|
||||||
ABS(tau_lxc(2*k-1))>tau_threshold_mgga ) THEN
|
ABS(tau_lxc(2*k-1))>tau_threshold_mgga ) THEN
|
||||||
v1x(k,1) = vx_rho(2*k-1)
|
v1x(k,1) = xcoef * vx_rho(2*k-1)
|
||||||
v2x(k,1) = vx_sigma(3*k-2)*2.d0
|
v2x(k,1) = xcoef * vx_sigma(3*k-2)*2.d0
|
||||||
v3x(k,1) = vx_tau(2*k-1)
|
v3x(k,1) = xcoef * vx_tau(2*k-1)
|
||||||
ELSE
|
ELSE
|
||||||
v1x(k,1) = 0.d0 ; v2x(k,1) = 0.d0 ; v3x(k,1) = 0.d0
|
v1x(k,1) = 0.d0 ; v2x(k,1) = 0.d0 ; v3x(k,1) = 0.d0
|
||||||
ENDIF
|
ENDIF
|
||||||
IF ( ABS(rho_lxc(2*k))>rho_threshold_mgga .AND. &
|
IF ( ABS(rho_lxc(2*k))>rho_threshold_mgga .AND. &
|
||||||
sigma(3*k)>grho2_threshold_mgga .AND. &
|
sigma(3*k)>grho2_threshold_mgga .AND. &
|
||||||
ABS(tau_lxc(2*k))>tau_threshold_mgga ) THEN
|
ABS(tau_lxc(2*k))>tau_threshold_mgga ) THEN
|
||||||
v1x(k,2) = vx_rho(2*k)
|
v1x(k,2) = xcoef * vx_rho(2*k)
|
||||||
v2x(k,2) = vx_sigma(3*k)*2.d0
|
v2x(k,2) = xcoef * vx_sigma(3*k)*2.d0
|
||||||
v3x(k,2) = vx_tau(2*k)
|
v3x(k,2) = xcoef * vx_tau(2*k)
|
||||||
ELSE
|
ELSE
|
||||||
v1x(k,2) = 0.d0 ; v2x(k,2) = 0.d0 ; v3x(k,2) = 0.d0
|
v1x(k,2) = 0.d0 ; v2x(k,2) = 0.d0 ; v3x(k,2) = 0.d0
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
|
@ -48,7 +48,7 @@ PROGRAM xclib_test
|
||||||
#if defined(__LIBXC)
|
#if defined(__LIBXC)
|
||||||
#include "xc_version.h"
|
#include "xc_version.h"
|
||||||
USE xc_f03_lib_m
|
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
|
#endif
|
||||||
USE dft_setting_params, ONLY: is_libxc
|
USE dft_setting_params, ONLY: is_libxc
|
||||||
USE dft_setting_routines, ONLY: capital
|
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 (xclib_dft_is_libxc( 'ANY' )) CALL xclib_init_libxc( ns, .FALSE. )
|
||||||
!
|
!
|
||||||
IF ( igcc1==428 .AND. is_libxc(4) ) THEN
|
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
|
! Example of how to change an external parameter in a Libxc
|
||||||
! functional (HYB_GGA_XC_HSE06).
|
! functional (HYB_GGA_XC_HSE06).
|
||||||
! Arguments:
|
! Arguments:
|
||||||
|
|
Loading…
Reference in New Issue