diff --git a/Modules/dgcxc_drivers.f90 b/Modules/dgcxc_drivers.f90 index 63c94dab3..3f0136991 100644 --- a/Modules/dgcxc_drivers.f90 +++ b/Modules/dgcxc_drivers.f90 @@ -41,6 +41,7 @@ SUBROUTINE dgcxc( length, sp, r_in, g_in, dvxc_rr, dvxc_sr, dvxc_ss ) REAL(DP), ALLOCATABLE :: rho_lbxc(:) REAL(DP), ALLOCATABLE :: v2rho2_x(:), v2rhosigma_x(:), v2sigma2_x(:) REAL(DP), ALLOCATABLE :: v2rho2_c(:), v2rhosigma_c(:), v2sigma2_c(:) + INTEGER(8) :: length8 #endif ! INTEGER :: igcx, igcc @@ -54,6 +55,8 @@ SUBROUTINE dgcxc( length, sp, r_in, g_in, dvxc_rr, dvxc_sr, dvxc_ss ) igcc = get_igcc() ! #if defined(__LIBXC) + ! + length8 = length ! IF ( (is_libxc(3) .OR. igcx==0) .AND. (is_libxc(4) .OR. igcc==0)) THEN ! @@ -104,7 +107,7 @@ SUBROUTINE dgcxc( length, sp, r_in, g_in, dvxc_rr, dvxc_sr, dvxc_ss ) CALL xc_f03_func_init( xc_func, igcx, sp ) xc_info1 = xc_f03_func_get_info( xc_func ) fkind = xc_f03_func_info_get_kind( xc_info1 ) - CALL xc_f03_gga_fxc( xc_func, length, rho_lbxc(1), sigma(1), v2rho2_x(1), v2rhosigma_x(1), v2sigma2_x(1) ) + CALL xc_f03_gga_fxc( xc_func, length8, rho_lbxc(1), sigma(1), v2rho2_x(1), v2rhosigma_x(1), v2sigma2_x(1) ) CALL xc_f03_func_end( xc_func ) ENDIF ! @@ -113,7 +116,7 @@ SUBROUTINE dgcxc( length, sp, r_in, g_in, dvxc_rr, dvxc_sr, dvxc_ss ) IF (igcc /= 0) THEN CALL xc_f03_func_init( xc_func, igcc, sp ) xc_info2 = xc_f03_func_get_info( xc_func ) - CALL xc_f03_gga_fxc( xc_func, length, rho_lbxc(1), sigma(1), v2rho2_c(1), v2rhosigma_c(1), v2sigma2_c(1) ) + CALL xc_f03_gga_fxc( xc_func, length8, rho_lbxc(1), sigma(1), v2rho2_c(1), v2rhosigma_c(1), v2sigma2_c(1) ) CALL xc_f03_func_end( xc_func ) ENDIF ! diff --git a/Modules/dmxc_drivers.f90 b/Modules/dmxc_drivers.f90 index 7493fef84..3611b14c2 100644 --- a/Modules/dmxc_drivers.f90 +++ b/Modules/dmxc_drivers.f90 @@ -43,6 +43,7 @@ SUBROUTINE dmxc( length, sr_d, rho_in, dmuxc ) REAL(DP), ALLOCATABLE :: rho_lxc(:) REAL(DP), ALLOCATABLE :: dmxc_lxc(:), dmex_lxc(:), dmcr_lxc(:) LOGICAL :: exch_lxc_avail, corr_lxc_avail + INTEGER(8) :: length8 #endif ! INTEGER :: iexch, icorr @@ -53,6 +54,8 @@ SUBROUTINE dmxc( length, sr_d, rho_in, dmuxc ) icorr = get_icorr() ! #if defined(__LIBXC) + ! + length8 = length ! IF ( (is_libxc(1) .OR. iexch==0) .AND. (is_libxc(2) .OR. icorr==0)) THEN ! @@ -98,7 +101,7 @@ SUBROUTINE dmxc( length, sr_d, rho_in, dmuxc ) IF (iexch /= 0) THEN CALL xc_f03_func_init( xc_func, iexch, pol_unpol ) xc_info1 = xc_f03_func_get_info( xc_func ) - CALL xc_f03_lda_fxc( xc_func, length, rho_lxc(1), dmex_lxc(1) ) + CALL xc_f03_lda_fxc( xc_func, length8, rho_lxc(1), dmex_lxc(1) ) CALL xc_f03_func_end( xc_func ) ENDIF ! @@ -107,7 +110,7 @@ SUBROUTINE dmxc( length, sr_d, rho_in, dmuxc ) IF (icorr /= 0) THEN CALL xc_f03_func_init( xc_func, icorr, pol_unpol ) xc_info2 = xc_f03_func_get_info( xc_func ) - CALL xc_f03_lda_fxc( xc_func, length, rho_lxc(1), dmcr_lxc(1) ) + CALL xc_f03_lda_fxc( xc_func, length8, rho_lxc(1), dmcr_lxc(1) ) CALL xc_f03_func_end( xc_func ) ENDIF ! diff --git a/Modules/funct.f90 b/Modules/funct.f90 index 18e1fd068..d70795e32 100644 --- a/Modules/funct.f90 +++ b/Modules/funct.f90 @@ -402,6 +402,8 @@ MODULE funct INTEGER :: libxc_major=0, libxc_minor=0, libxc_micro=0 PUBLIC :: libxc_major, libxc_minor, libxc_micro, get_libxc_version PUBLIC :: get_libxc_flags_exc + LOGICAL :: lxc_hyb = .FALSE. + PRIVATE :: lxc_hyb #endif ! CONTAINS @@ -931,6 +933,7 @@ CONTAINS xc_info = xc_f03_func_get_info( xc_func ) fkind = xc_f03_func_info_get_kind( xc_info ) family = xc_f03_func_info_get_family( xc_info ) + IF ( matches(TRIM(name), '_HYB') ) lxc_hyb = .TRUE. CALL xc_f03_func_end( xc_func ) ! SELECT CASE( family ) @@ -946,7 +949,7 @@ CONTAINS ENDIF fkind_v(1) = fkind ! - CASE( XC_FAMILY_GGA, XC_FAMILY_HYB_GGA ) + CASE( XC_FAMILY_GGA ) !, XC_FAMILY_HYB_GGA ) IF (fkind==XC_EXCHANGE .OR. fkind==XC_EXCHANGE_CORRELATION) THEN IF ( LEN(TRIM(name)) > prev_len(3) ) igcx = i is_libxc(3) = .TRUE. @@ -958,7 +961,7 @@ CONTAINS ENDIF fkind_v(2) = fkind ! - CASE( XC_FAMILY_MGGA, XC_FAMILY_HYB_MGGA ) + CASE( XC_FAMILY_MGGA ) !, XC_FAMILY_HYB_MGGA ) IF (fkind==XC_EXCHANGE .OR. fkind==XC_EXCHANGE_CORRELATION) THEN IF ( LEN(TRIM(name)) > prev_len(5) ) imeta = i is_libxc(5) = .TRUE. @@ -1342,15 +1345,15 @@ CONTAINS FUNCTION get_exx_fraction() REAL(DP) :: get_exx_fraction #if defined(__LIBXC) - INTEGER :: family + !INTEGER :: family TYPE(xc_f03_func_t) :: xc_func - TYPE(xc_f03_func_info_t) :: xc_info + !TYPE(xc_f03_func_info_t) :: xc_info ! IF ( is_libxc(3) ) THEN CALL xc_f03_func_init( xc_func, igcx, 1 ) - xc_info = xc_f03_func_get_info( xc_func ) - family = xc_f03_func_info_get_family( xc_info ) - IF (family == XC_FAMILY_HYB_GGA) exx_fraction = xc_f03_hyb_exx_coef( xc_func ) + !xc_info = xc_f03_func_get_info( xc_func ) + !family = xc_f03_func_info_get_family( xc_info ) + IF ( lxc_hyb ) exx_fraction = xc_f03_hyb_exx_coef( xc_func ) CALL xc_f03_func_end( xc_func ) ENDIF #endif diff --git a/Modules/xc_gga_drivers.f90 b/Modules/xc_gga_drivers.f90 index 1d589c9c0..2203a8ebe 100644 --- a/Modules/xc_gga_drivers.f90 +++ b/Modules/xc_gga_drivers.f90 @@ -97,6 +97,7 @@ SUBROUTINE xc_gcx( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud ) ! LOGICAL :: POLARIZED INTEGER :: ildax, ildac, pol_unpol + INTEGER(8) :: length8 #endif REAL(DP), ALLOCATABLE :: arho(:,:) REAL(DP), ALLOCATABLE :: rh(:), zeta(:) @@ -119,6 +120,8 @@ SUBROUTINE xc_gcx( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud ) IF ( PRESENT(v2c_ud) ) v2c_ud = 0.0_DP ! #if defined(__LIBXC) + ! + length8 = length ! POLARIZED = .FALSE. IF (ns == 2) THEN @@ -182,7 +185,7 @@ SUBROUTINE xc_gcx( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud ) xc_info1 = xc_f03_func_get_info( xc_func ) CALL xc_f03_func_set_dens_threshold( xc_func, rho_threshold ) fkind_x = xc_f03_func_info_get_kind( xc_info1 ) - CALL xc_f03_gga_exc_vxc( xc_func, length, rho_lxc(1), sigma(1), ex_lxc(1), vx_rho(1), vx_sigma(1) ) + CALL xc_f03_gga_exc_vxc( xc_func, length8, rho_lxc(1), sigma(1), ex_lxc(1), vx_rho(1), vx_sigma(1) ) CALL xc_f03_func_end( xc_func ) ! IF (.NOT. POLARIZED) THEN @@ -226,7 +229,7 @@ SUBROUTINE xc_gcx( length, ns, rho, grho, ex, ec, v1x, v2x, v1c, v2c, v2c_ud ) CALL xc_f03_func_init( xc_func, igcc, pol_unpol ) xc_info2 = xc_f03_func_get_info( xc_func ) CALL xc_f03_func_set_dens_threshold( xc_func, rho_threshold ) - CALL xc_f03_gga_exc_vxc( xc_func, length, rho_lxc(1), sigma(1), ec_lxc(1), vc_rho(1), vc_sigma(1) ) + CALL xc_f03_gga_exc_vxc( xc_func, length8, rho_lxc(1), sigma(1), ec_lxc(1), vc_rho(1), vc_sigma(1) ) CALL xc_f03_func_end( xc_func ) ! IF (.NOT. POLARIZED) THEN diff --git a/Modules/xc_lda_lsda_drivers.f90 b/Modules/xc_lda_lsda_drivers.f90 index 3de67bce7..ffdf3423c 100644 --- a/Modules/xc_lda_lsda_drivers.f90 +++ b/Modules/xc_lda_lsda_drivers.f90 @@ -85,6 +85,7 @@ SUBROUTINE xc( length, sr_d, sv_d, rho_in, ex_out, ec_out, vx_out, vc_out ) REAL(DP) :: amag REAL(DP), ALLOCATABLE :: rho_lxc(:) REAL(DP), ALLOCATABLE :: vx_lxc(:), vc_lxc(:) + INTEGER(8) :: length8 #endif ! REAL(DP), ALLOCATABLE :: arho(:), zeta(:) @@ -98,6 +99,8 @@ SUBROUTINE xc( length, sr_d, sv_d, rho_in, ex_out, ec_out, vx_out, vc_out ) ec_out = 0.0_DP ; vc_out = 0.0_DP ! #if defined(__LIBXC) + ! + length8 = length ! IF ( ANY(is_libxc(1:2)) ) THEN ! @@ -140,7 +143,7 @@ SUBROUTINE xc( length, sr_d, sv_d, rho_in, ex_out, ec_out, vx_out, vc_out ) xc_info1 = xc_f03_func_get_info( xc_func ) CALL xc_f03_func_set_dens_threshold( xc_func, rho_threshold ) fkind_x = xc_f03_func_info_get_kind( xc_info1 ) - CALL xc_f03_lda_exc_vxc( xc_func, length, rho_lxc(1), ex_out(1), vx_lxc(1) ) + CALL xc_f03_lda_exc_vxc( xc_func, length8, rho_lxc(1), ex_out(1), vx_lxc(1) ) CALL xc_f03_func_end( xc_func ) ENDIF ! @@ -149,7 +152,7 @@ SUBROUTINE xc( length, sr_d, sv_d, rho_in, ex_out, ec_out, vx_out, vc_out ) CALL xc_f03_func_init( xc_func, icorr, sv_d ) xc_info2 = xc_f03_func_get_info( xc_func ) CALL xc_f03_func_set_dens_threshold( xc_func, rho_threshold ) - CALL xc_f03_lda_exc_vxc( xc_func, length, rho_lxc(1), ec_out(1), vc_lxc(1) ) + CALL xc_f03_lda_exc_vxc( xc_func, length8, rho_lxc(1), ec_out(1), vc_lxc(1) ) CALL xc_f03_func_end( xc_func ) ENDIF ! diff --git a/Modules/xc_mgga_drivers.f90 b/Modules/xc_mgga_drivers.f90 index 0cf470973..3b1157595 100644 --- a/Modules/xc_mgga_drivers.f90 +++ b/Modules/xc_mgga_drivers.f90 @@ -102,6 +102,9 @@ SUBROUTINE xc_metagcx( length, ns, np, rho, grho, tau, ex, ec, v1x, v2x, v3x, v1 REAL(DP) :: exx_fraction INTEGER :: k, ipol, pol_unpol, eflag LOGICAL :: POLARIZED + INTEGER(8) :: length8 + ! + length8 = length ! imeta = get_meta() imetac = get_metac() @@ -181,10 +184,10 @@ SUBROUTINE xc_metagcx( length, ns, np, rho, grho, tau, ex, ec, v1x, v2x, v3x, v1 CALL xc_f03_func_set_dens_threshold( xc_func, rho_threshold ) CALL get_libxc_flags_exc( xc_info1, eflag ) IF (eflag==1) THEN - CALL xc_f03_mgga_exc_vxc( xc_func, length, rho_lxc(1), sigma(1), lapl_rho(1), tau_lxc(1), & + CALL xc_f03_mgga_exc_vxc( xc_func, length8, rho_lxc(1), sigma(1), lapl_rho(1), tau_lxc(1), & ex_lxc(1), vx_rho(1), vx_sigma(1), vlapl_rho(1), vx_tau(1) ) ELSE - CALL xc_f03_mgga_vxc( xc_func, length, rho_lxc(1), sigma(1), lapl_rho(1), tau_lxc(1), & + CALL xc_f03_mgga_vxc( xc_func, length8, rho_lxc(1), sigma(1), lapl_rho(1), tau_lxc(1), & vx_rho(1), vx_sigma(1), vlapl_rho(1), vx_tau(1) ) ENDIF CALL xc_f03_func_end( xc_func ) @@ -228,7 +231,7 @@ SUBROUTINE xc_metagcx( length, ns, np, rho, grho, tau, ex, ec, v1x, v2x, v3x, v1 CALL xc_f03_func_init( xc_func, imetac, pol_unpol ) xc_info1 = xc_f03_func_get_info( xc_func ) CALL xc_f03_func_set_dens_threshold( xc_func, rho_threshold ) - CALL xc_f03_mgga_exc_vxc( xc_func, length, rho_lxc(1), sigma(1), lapl_rho(1), tau_lxc(1), & + CALL xc_f03_mgga_exc_vxc( xc_func, length8, 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) ) CALL xc_f03_func_end( xc_func ) ! diff --git a/install/make.inc.in b/install/make.inc.in index 5e8403de1..32be325bd 100644 --- a/install/make.inc.in +++ b/install/make.inc.in @@ -121,7 +121,7 @@ FFLAGS_NOMAIN = @fflags_nomain@ # Linker, linker-specific flags (if any) # Typically LD coincides with F90 or MPIF90, LD_LIBS is empty -# for libxc, set LD_LIBS=-L/path/to/libxc/lib/ -lxcf03 -lxc +# for libxc, set LD_LIBS=-L/path/to/libxc/lib/ -lxcf90 -lxc LD = @ld@ LDFLAGS = @ldflags@