switch to xcf03 - lda

This commit is contained in:
fabrizio22 2020-04-21 23:19:23 +02:00
parent 4ab5727c5a
commit 4ba02dc5ce
2 changed files with 33 additions and 27 deletions

View File

@ -38,6 +38,7 @@ MODULE funct
#if defined(__LIBXC)
USE xc_f90_types_m
USE xc_f90_lib_m
USE xc_f03_lib_m
#endif
!
#if defined(use_beef)
@ -906,7 +907,8 @@ CONTAINS
CHARACTER(LEN=256) :: name
INTEGER :: i, l, prev_len(6), fkind, fkind_v(3), family
INTEGER, PARAMETER :: ID_MAX_LIBXC=600
TYPE(xc_f90_pointer_t) :: xc_func, xc_info
TYPE(xc_f03_func_t) :: xc_func
TYPE(xc_f03_func_info_t) :: xc_info
LOGICAL, EXTERNAL :: matches
CHARACTER(LEN=1), EXTERNAL :: capital
!
@ -914,7 +916,7 @@ CONTAINS
!
DO i = 1, ID_MAX_LIBXC
!
CALL xc_f90_functional_get_name( i, name )
name = xc_f03_functional_get_name( i )
!
DO l = 1, LEN_TRIM(name)
name(l:l) = capital( name(l:l) )
@ -927,10 +929,11 @@ CONTAINS
!WRITE(*, '("matches libxc",i2,2X,A,2X,A)') i, TRIM(name), TRIM(dft)
!
fkind=-100 ; family=-100
CALL xc_f90_func_init( xc_func, xc_info, i, 1 )
fkind = xc_f90_info_kind( xc_info )
family = xc_f90_info_family( xc_info )
CALL xc_f90_func_end( xc_func )
CALL xc_f03_func_init( xc_func, i, 1 )
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 )
CALL xc_f03_func_end( xc_func )
!
SELECT CASE( family )
CASE( XC_FAMILY_LDA )
@ -1061,7 +1064,7 @@ CONTAINS
nlxc = 0
DO i = 1, 6
IF (is_libxc(i)) THEN
CALL xc_f90_functional_get_name( id_vec(i), lxc_name )
lxc_name = xc_f03_functional_get_name( id_vec(i) )
DO l = 1, LEN_TRIM(lxc_name)
lxc_name(l:l) = capital( lxc_name(l:l) )
ENDDO
@ -1351,13 +1354,15 @@ CONTAINS
REAL(DP) :: get_exx_fraction
#if defined(__LIBXC)
INTEGER :: family
TYPE(xc_f90_pointer_t) :: xc_func, xc_info
TYPE(xc_f03_func_t) :: xc_func
TYPE(xc_f03_func_info_t) :: xc_info
!
IF ( is_libxc(3) ) THEN
CALL xc_f90_func_init( xc_func, xc_info, igcx, 1 )
family = xc_f90_info_family( xc_info )
IF (family == XC_FAMILY_HYB_GGA) CALL xc_f90_hyb_exx_coef( xc_func, exx_fraction )
CALL xc_f90_func_end( xc_func )
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 )
CALL xc_f03_func_end( xc_func )
ENDIF
#endif
get_exx_fraction = exx_fraction
@ -1426,10 +1431,10 @@ CONTAINS
SUBROUTINE get_libxc_flags_exc( xc_info, eflag )
! Checks whether Exc is present or not in the output of a libxc
! functional (e.g. TB09)
TYPE(xc_f90_pointer_t) :: xc_info
TYPE(xc_f03_func_info_t) :: xc_info
INTEGER :: ii, flags_tot
INTEGER, INTENT(OUT) :: eflag
flags_tot = xc_f90_info_flags(xc_info)
flags_tot = xc_f03_func_info_get_flags(xc_info)
eflag = 0
DO ii = 15, 0, -1
IF ( flags_tot-2**ii<0 ) CYCLE

View File

@ -54,8 +54,7 @@ SUBROUTINE xc( length, sr_d, sv_d, rho_in, ex_out, ec_out, vx_out, vc_out )
!! between q-e and libxc.
!
#if defined(__LIBXC)
USE xc_f90_types_m
USE xc_f90_lib_m
USE xc_f03_lib_m
#endif
!
IMPLICIT NONE
@ -80,8 +79,8 @@ SUBROUTINE xc( length, sr_d, sv_d, rho_in, ex_out, ec_out, vx_out, vc_out )
! ... local variables
!
#if defined(__LIBXC)
TYPE(xc_f90_pointer_t) :: xc_func
TYPE(xc_f90_pointer_t) :: xc_info1, xc_info2
TYPE(xc_f03_func_t) :: xc_func
TYPE(xc_f03_func_info_t) :: xc_info1, xc_info2
INTEGER :: fkind_x
REAL(DP) :: amag
REAL(DP), ALLOCATABLE :: rho_lxc(:)
@ -137,19 +136,21 @@ 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_f90_func_init( xc_func, xc_info1, iexch, sv_d )
CALL xc_f90_func_set_dens_threshold( xc_func, rho_threshold )
fkind_x = xc_f90_info_kind( xc_info1 )
CALL xc_f90_lda_exc_vxc( xc_func, length, rho_lxc(1), ex_out(1), vx_lxc(1) )
CALL xc_f90_func_end( xc_func )
CALL xc_f03_func_init( xc_func, iexch, sv_d )
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_func_end( xc_func )
ENDIF
!
! ... CORRELATION
IF ( is_libxc(2) ) THEN
CALL xc_f90_func_init( xc_func, xc_info2, icorr, sv_d )
CALL xc_f90_func_set_dens_threshold( xc_func, rho_threshold )
CALL xc_f90_lda_exc_vxc( xc_func, length, rho_lxc(1), ec_out(1), vc_lxc(1) )
CALL xc_f90_func_end( xc_func )
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_func_end( xc_func )
ENDIF
!
IF ( ((.NOT.is_libxc(1)) .OR. (.NOT.is_libxc(2))) &