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
|
||||
!
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 &
|
||||
¶meter 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 &
|
||||
¶meter 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' )
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
!
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue