XClib - Libxc dfts with no Exc included

This commit is contained in:
fabrizio22 2021-09-28 14:37:38 +02:00
parent 001fe34adf
commit b8a537d66d
5 changed files with 61 additions and 30 deletions

View File

@ -65,9 +65,11 @@ PROGRAM xc_infos
!
CALL xclib_set_dft_from_name( dft )
!
IF ( xc_kind_error ) WRITE(stdout,*) 'WARNING: This functional includes terms &
&that are currently not usable in QE (kin&
&etic) and they will be ignored.'
#if defined(__LIBXC)
IF ( xc_kind_error ) WRITE(stdout,*) 'WARNING: This functional includes Libxc &
&terms that are currently not usable in &
&QE (kinetic) and they will be ignored.'
#endif
!
iexch = xclib_get_ID('LDA','EXCH')
is_libxc(1) = xclib_dft_is_libxc('LDA','EXCH')

View File

@ -18,6 +18,7 @@ SUBROUTINE xc_gcx_( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud )
#include "xc_version.h"
USE xc_f03_lib_m
USE dft_setting_params, ONLY: xc_func, xc_info
USE dft_setting_routines, ONLY: get_libxc_flags_exc
#endif
!
USE kind_l, ONLY: DP
@ -63,7 +64,7 @@ SUBROUTINE xc_gcx_( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud )
REAL(DP), PARAMETER :: pi34 = 0.6203504908994_DP
!
LOGICAL :: POLARIZED
INTEGER :: ildax, ildac, pol_unpol
INTEGER :: ildax, ildac, pol_unpol, eflag
#if (XC_MAJOR_VERSION > 4)
INTEGER(8) :: lengthxc
#else
@ -151,11 +152,18 @@ SUBROUTINE xc_gcx_( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud )
!
! ---- GGA CORRELATION
!
IF (is_libxc(4)) fkind_x = xc_f03_func_info_get_kind( xc_info(4) )
!
IF ( is_libxc(4) ) THEN !lda part of LYP not present in libxc (still so? - check)
!
CALL xc_f03_func_set_dens_threshold( xc_func(4), rho_threshold_gga )
fkind_x = xc_f03_func_info_get_kind( xc_info(4) )
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 get_libxc_flags_exc( xc_info(4), eflag )
IF (eflag==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) )
ELSE
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
!
IF (.NOT. POLARIZED) THEN
DO k = 1, length
@ -221,7 +229,7 @@ SUBROUTINE xc_gcx_( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud )
IF ( igcc/=14 ) CALL gcc_spin( length, rh, zeta, grho2(:,1), ec, v1c, v2c(:,1) )
IF ( igcc==14 ) CALL gcc_spin_beef( length, rh, zeta, grho2(:,1), ec, v1c, v2c(:,1) )
!
v2c(:,2) = v2c(:,1)
v2c(:,2) = v2c(:,1)
IF ( PRESENT(v2c_ud) ) v2c_ud(:) = v2c(:,1)
!
DEALLOCATE( rh, zeta )
@ -239,7 +247,13 @@ SUBROUTINE xc_gcx_( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud )
IF ( is_libxc(3) ) THEN
!
CALL xc_f03_func_set_dens_threshold( xc_func(3), rho_threshold_gga )
CALL xc_f03_gga_exc_vxc( xc_func(3), lengthxc, rho_lxc(1), sigma(1), ex_lxc(1), vx_rho(1), vx_sigma(1) )
CALL get_libxc_flags_exc( xc_info(3), eflag )
IF (eflag==1) THEN
CALL xc_f03_gga_exc_vxc( xc_func(3), lengthxc, rho_lxc(1), sigma(1), ex_lxc(1), vx_rho(1), vx_sigma(1) )
ELSE
CALL xc_f03_gga_vxc( xc_func(3), lengthxc, rho_lxc(1), sigma(1), vx_rho(1), vx_sigma(1) )
ex_lxc = 0.d0
ENDIF
!
IF (.NOT. POLARIZED) THEN
DO k = 1, length

View File

@ -14,7 +14,8 @@ SUBROUTINE xc( length, sr_d, sv_d, rho_in, ex_out, ec_out, vx_out, vc_out )
#if defined(__LIBXC)
#include "xc_version.h"
USE xc_f03_lib_m
USE dft_setting_params, ONLY: xc_func, xc_info
USE dft_setting_params, ONLY: xc_func, xc_info
USE dft_setting_routines, ONLY: get_libxc_flags_exc
#endif
!
USE kind_l, ONLY: DP
@ -44,7 +45,7 @@ SUBROUTINE xc( length, sr_d, sv_d, rho_in, ex_out, ec_out, vx_out, vc_out )
! ... local variables
!
#if defined(__LIBXC)
INTEGER :: fkind_x
INTEGER :: fkind_x, eflag
REAL(DP) :: amag
REAL(DP), ALLOCATABLE :: rho_lxc(:)
REAL(DP), ALLOCATABLE :: vx_lxc(:), vc_lxc(:)
@ -104,15 +105,25 @@ SUBROUTINE xc( length, sr_d, sv_d, rho_in, ex_out, ec_out, vx_out, vc_out )
!
! ... EXCHANGE
IF ( is_libxc(1) ) THEN
CALL xc_f03_func_set_dens_threshold( xc_func(1), rho_threshold_lda )
CALL xc_f03_lda_exc_vxc( xc_func(1), lengthxc, rho_lxc(1), ex_out(1), vx_lxc(1) )
CALL xc_f03_func_set_dens_threshold( xc_func(1), rho_threshold_lda )
CALL get_libxc_flags_exc( xc_info(1), eflag )
IF (eflag==1) THEN
CALL xc_f03_lda_exc_vxc( xc_func(1), lengthxc, rho_lxc(1), ex_out(1), vx_lxc(1) )
ELSE
CALL xc_f03_lda_vxc( xc_func(1), lengthxc, rho_lxc(1), vx_lxc(1) )
ENDIF
ENDIF
!
! ... CORRELATION
IF ( is_libxc(2) ) THEN
CALL xc_f03_func_set_dens_threshold( xc_func(2), rho_threshold_lda )
fkind_x = xc_f03_func_info_get_kind( xc_info(2) )
CALL xc_f03_lda_exc_vxc( xc_func(2), lengthxc, rho_lxc(1), ec_out(1), vc_lxc(1) )
CALL get_libxc_flags_exc( xc_info(2), eflag )
IF (eflag==1) THEN
CALL xc_f03_lda_exc_vxc( xc_func(2), lengthxc, rho_lxc(1), ec_out(1), vc_lxc(1) )
ELSE
CALL xc_f03_lda_vxc( xc_func(2), lengthxc, rho_lxc(1), vc_lxc(1) )
ENDIF
ENDIF
!
IF ( ((.NOT.is_libxc(1)) .OR. (.NOT.is_libxc(2))) &

View File

@ -18,10 +18,10 @@ SUBROUTINE xc_metagcx( length, ns, np, rho, grho, tau, ex, ec, v1x, v2x, v3x, v1
USE dft_setting_params, ONLY: xc_func, xc_info
#endif
!
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
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
USE qe_drivers_mgga
!
IMPLICIT NONE
@ -155,6 +155,7 @@ SUBROUTINE xc_metagcx( length, ns, np, rho, grho, tau, ex, ec, v1x, v2x, v3x, v1
ELSE
CALL xc_f03_mgga_vxc( xc_func(5), lengthxc, rho_lxc(1), sigma(1), lapl_rho(1), tau_lxc(1), &
vx_rho(1), vx_sigma(1), vlapl_rho(1), vx_tau(1) )
ex_lxc = 0.d0
ENDIF
!
IF (.NOT. POLARIZED) THEN
@ -193,8 +194,15 @@ SUBROUTINE xc_metagcx( length, ns, np, rho, grho, tau, ex, ec, v1x, v2x, v3x, v1
IF ( is_libxc(6) ) THEN
!
CALL xc_f03_func_set_dens_threshold( xc_func(6), rho_threshold_mgga )
CALL xc_f03_mgga_exc_vxc( xc_func(6), lengthxc, rho_lxc(1), sigma(1), lapl_rho(1), tau_lxc(1), &
CALL get_libxc_flags_exc( xc_info(6), eflag )
IF (eflag==1) THEN
CALL xc_f03_mgga_exc_vxc( xc_func(6), lengthxc, rho_lxc(1), sigma(1), lapl_rho(1), tau_lxc(1), &
ec_lxc(1), vc_rho(1), vc_sigma(1), vlapl_rho(1), vc_tau(1) )
ELSE
CALL xc_f03_mgga_vxc( xc_func(6), lengthxc, rho_lxc(1), sigma(1), lapl_rho(1), tau_lxc(1), &
vc_rho(1), vc_sigma(1), vlapl_rho(1), vc_tau(1) )
ec_lxc = 0.d0
ENDIF
!
IF (.NOT. POLARIZED) THEN
DO k = 1, length

View File

@ -390,9 +390,6 @@ PROGRAM xclib_test
!
DO id = 1, n_qe_func
!
if (id==160 .or.id==182) cycle
CALL xclib_reset_dft()
!
IF ( dft_init=='all_terms' ) THEN
@ -445,18 +442,17 @@ PROGRAM xclib_test
CALL print_test_status( skipped )
CYCLE
ENDIF
#endif
! libxc id=576 segfault.. Libxc5.1.5 bug (same name of id(575))
IF ( dft_init=='all_libxc' .AND. id==576 ) THEN
CALL print_test_status( skipped )
CYCLE
ENDIF
#else
! libxc id=576 -> Libxc5.1.5 bug (same name of id=575)
IF ( dft_init=='all_libxc' ) THEN
#if defined(__LIBXC)
IF ( id==576 ) THEN
CALL print_test_status( skipped )
CYCLE
ENDIF
dft = xc_f03_functional_get_name( id )
IF ( TRIM(dft) == '' ) CYCLE
#endif
ENDIF
#endif
!
CALL xclib_set_dft_from_name( dft )
!
@ -580,7 +576,7 @@ PROGRAM xclib_test
IF (.NOT.xc_derivative) THEN
IF (LDA ) naver = 2
IF (GGA ) naver = 3
IF (MGGA) naver = 4
IF (MGGA) naver = 8
ELSE
IF (LDA ) naver = 1
IF (GGA ) naver = 3