diff --git a/XClib/xc_infos.f90 b/XClib/xc_infos.f90 index b86b4bfdc..ce6a87d3e 100644 --- a/XClib/xc_infos.f90 +++ b/XClib/xc_infos.f90 @@ -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') diff --git a/XClib/xc_wrapper_gga.f90 b/XClib/xc_wrapper_gga.f90 index 86d9689ee..d3e98c8d5 100644 --- a/XClib/xc_wrapper_gga.f90 +++ b/XClib/xc_wrapper_gga.f90 @@ -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 diff --git a/XClib/xc_wrapper_lda_lsda.f90 b/XClib/xc_wrapper_lda_lsda.f90 index 9f0578500..237d8cb3e 100644 --- a/XClib/xc_wrapper_lda_lsda.f90 +++ b/XClib/xc_wrapper_lda_lsda.f90 @@ -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))) & diff --git a/XClib/xc_wrapper_mgga.f90 b/XClib/xc_wrapper_mgga.f90 index 6ccbcebd7..c2839acab 100644 --- a/XClib/xc_wrapper_mgga.f90 +++ b/XClib/xc_wrapper_mgga.f90 @@ -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 diff --git a/XClib/xclib_test.f90 b/XClib/xclib_test.f90 index 9e2dc5c5c..af2a37742 100644 --- a/XClib/xclib_test.f90 +++ b/XClib/xclib_test.f90 @@ -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