mirror of
https://github.com/cp2k/cp2k.git
synced 2026-07-28 22:25:32 -04:00
LIBXC: Upgrade to version 4.0.3 and changes to use Fortran2003 interface. LIBXC versions older than 4.0.x will fail to compile. Slightly changed input syntax.
svn-origin-rev: 18241
This commit is contained in:
parent
1ab0374790
commit
590ec1ed5f
18 changed files with 637 additions and 882 deletions
6
INSTALL
6
INSTALL
|
|
@ -142,13 +142,13 @@ Note Do **NOT** use libinit-1.1.3, which was buggy.
|
|||
* Link to a blas/scalapack library that accelerates large DGEMMs (e.g. libsci_acc)
|
||||
|
||||
==== 2k. libxc (optional, wider choice of xc functionals) ====
|
||||
* The version 2.2.2 (or later) of libxc needs to be downloaded
|
||||
* The version 4.0.3 (or later) of libxc needs to be downloaded
|
||||
(http://www.tddft.org/programs/octopus/wiki/index.php/Libxc) and installed.
|
||||
During the installation, the directory $(LIBXC_DIR)/lib and
|
||||
$(LIBXC_DIR)/include are created.
|
||||
* Note, the deprecated flags -D__LIBXC2 and -D__LIBXC3 are aliases to -D__LIBXC.
|
||||
* Note, the former deprecated flags -D__LIBXC2 and -D__LIBXC3 are ignored.
|
||||
* Add -D__LIBXC to DFLAGS, -I$(LIBXC_DIR)/include to FCFLAGS and
|
||||
-L$(LIBXC_DIR)/lib -lxcf90 -lxc to LIBS.
|
||||
-L$(LIBXC_DIR)/lib -lxcf03 -lxc to LIBS.
|
||||
|
||||
==== 2l. ELPA (optional, improved performance for diagonalization) ====
|
||||
Library ELPA for the solution of the eigenvalue problem
|
||||
|
|
|
|||
|
|
@ -22,8 +22,11 @@ MODULE atom_output
|
|||
do_rhf_atom, do_rks_atom, do_rohf_atom, do_sczoramp_atom, do_uhf_atom, do_uks_atom, &
|
||||
do_zoramp_atom, poly_conf, xc_none
|
||||
USE input_cp2k_check, ONLY: xc_functionals_expand
|
||||
USE input_section_types, ONLY: section_vals_get_subs_vals,&
|
||||
USE input_section_types, ONLY: section_vals_duplicate,&
|
||||
section_vals_get,&
|
||||
section_vals_get_subs_vals,&
|
||||
section_vals_get_subs_vals2,&
|
||||
section_vals_release,&
|
||||
section_vals_type,&
|
||||
section_vals_val_get
|
||||
USE kinds, ONLY: default_string_length,&
|
||||
|
|
@ -469,10 +472,11 @@ CONTAINS
|
|||
CHARACTER(len=10*default_string_length) :: reference
|
||||
CHARACTER(len=160) :: shortform
|
||||
CHARACTER(len=20) :: tmpStr
|
||||
CHARACTER(len=80), DIMENSION(:), POINTER :: func_name
|
||||
INTEGER :: ifun, ifunc_name, il, meth, myfun, reltyp
|
||||
INTEGER :: i_rep, ifun, il, meth, myfun, n_rep, &
|
||||
reltyp
|
||||
LOGICAL :: lsd
|
||||
TYPE(section_vals_type), POINTER :: xc_fun, xc_fun_section, xc_section
|
||||
TYPE(section_vals_type), POINTER :: libxc_fun, xc_fun, xc_fun_section, &
|
||||
xc_section
|
||||
|
||||
NULLIFY (xc_fun, xc_fun_section, xc_section)
|
||||
|
||||
|
|
@ -567,20 +571,24 @@ CONTAINS
|
|||
ifun = ifun+1
|
||||
xc_fun => section_vals_get_subs_vals2(xc_fun_section, i_section=ifun)
|
||||
IF (.NOT. ASSOCIATED(xc_fun)) EXIT
|
||||
CALL xc_functional_get_info(xc_fun, lsd=lsd, reference=reference, &
|
||||
shortform=shortform, ifunc_name=1)
|
||||
IF (TRIM(xc_fun%section%name) == "LIBXC") THEN
|
||||
CALL libxc_version_info(tmpStr)
|
||||
WRITE (iw, fmt="(A,A,A)") ' FUNCTIONAL| LIBXC Vers. ', TRIM(tmpStr(1:5)), &
|
||||
' (Marques, Oliveira, Burnus, CPC 183, 2272 (2012))'
|
||||
WRITE (iw, fmt="(' FUNCTIONAL| ',a,':')") TRIM(shortform)
|
||||
IF (TRIM(xc_fun%section%name) /= "LIBXC") THEN
|
||||
CALL xc_functional_get_info(xc_fun, lsd=lsd, reference=reference, shortform=shortform)
|
||||
WRITE (iw, fmt="(' FUNCTIONAL| ',a,':')") &
|
||||
TRIM(xc_fun%section%name)
|
||||
DO il = 1, LEN_TRIM(reference), 67
|
||||
WRITE (iw, fmt="(' FUNCTIONAL| ',a67)") reference(il:)
|
||||
END DO
|
||||
CALL section_vals_val_get(xc_fun, "functional", c_vals=func_name)
|
||||
DO ifunc_name = 2, SIZE(func_name)
|
||||
CALL xc_functional_get_info(xc_fun, lsd=lsd, reference=reference, &
|
||||
shortform=shortform, ifunc_name=ifunc_name)
|
||||
ELSE
|
||||
! LIBXC is the only repeatable functional section - for each we need
|
||||
! NOT the single values, but the whole section_vals_type independently
|
||||
CALL section_vals_get(xc_fun, n_repetition=n_rep)
|
||||
DO i_rep = 1, n_rep
|
||||
NULLIFY (libxc_fun)
|
||||
CALL section_vals_duplicate(xc_fun, libxc_fun, i_rep_start=i_rep, i_rep_end=i_rep)
|
||||
IF (.NOT. ASSOCIATED(libxc_fun)) EXIT
|
||||
CALL xc_functional_get_info(libxc_fun, lsd=lsd, reference=reference, shortform=shortform)
|
||||
CALL section_vals_release(libxc_fun)
|
||||
CALL libxc_version_info(tmpStr)
|
||||
WRITE (iw, fmt="(A,A,A)") ' FUNCTIONAL| LIBXC Vers. ', TRIM(tmpStr(1:5)), &
|
||||
' (Marques, Oliveira, Burnus, CPC 183, 2272 (2012))'
|
||||
WRITE (iw, fmt="(' FUNCTIONAL| ',a,':')") TRIM(shortform)
|
||||
|
|
@ -588,12 +596,6 @@ CONTAINS
|
|||
WRITE (iw, fmt="(' FUNCTIONAL| ',a67)") reference(il:)
|
||||
END DO
|
||||
END DO
|
||||
ELSE
|
||||
WRITE (iw, fmt="(' FUNCTIONAL| ',a,':')") &
|
||||
TRIM(xc_fun%section%name)
|
||||
DO il = 1, LEN_TRIM(reference), 67
|
||||
WRITE (iw, fmt="(' FUNCTIONAL| ',a67)") reference(il:)
|
||||
END DO
|
||||
END IF
|
||||
END DO
|
||||
END IF
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ MODULE bibliography
|
|||
Kapil2016, Heinzmann1976, Ehrhardt1985, Rybkin2016, West2006, &
|
||||
Bates2013, Andermatt2016, Zhu2016, Schuett2016, Lu2004, &
|
||||
Becke1988b, Migliore2009, Mavros2015, Holmberg2017, Marek2014, &
|
||||
Stoychev2016, Futera2017, Bailey2006, Papior2017
|
||||
Stoychev2016, Futera2017, Bailey2006, Papior2017, Lehtola2018
|
||||
|
||||
CONTAINS
|
||||
|
||||
|
|
@ -2115,6 +2115,28 @@ CONTAINS
|
|||
"ER"), &
|
||||
DOI="10.1016/j.cpc.2012.05.007")
|
||||
|
||||
CALL add_reference(key=Lehtola2018, ISI_record=s2a( &
|
||||
"AU Lehtola, S", &
|
||||
" Steigemann, C", &
|
||||
" Oliveira, MJT", &
|
||||
" Marques, MAL", &
|
||||
"AF Lehtola, Susi", &
|
||||
" Steigemann, Conrad", &
|
||||
" Oliveira, Micael J. T.", &
|
||||
" Marques, Miguel A. L.", &
|
||||
"TI Recent developments in libxc - A comprehensive library of functionals", &
|
||||
" for density functional theory", &
|
||||
"SO SoftwareX", &
|
||||
"SN 2352-7110", &
|
||||
"PD JAN", &
|
||||
"PY 2018", &
|
||||
"VL 7", &
|
||||
"BP 1", &
|
||||
"EP 5", &
|
||||
"DI 10.1016/j.softx.2017.11.002", &
|
||||
"ER"), &
|
||||
DOI="10.1016/j.softx.2017.11.002")
|
||||
|
||||
CALL add_reference(key=Jones2011, ISI_record=s2a( &
|
||||
"AU Jones, Andrew", &
|
||||
" Leimkuhler, Ben", &
|
||||
|
|
|
|||
|
|
@ -102,9 +102,6 @@ CONTAINS
|
|||
#if defined(__FFTW3)
|
||||
flags = TRIM(flags)//" fftw3"
|
||||
#endif
|
||||
#if defined(__LIBXC2) || defined(__LIBXC3)
|
||||
#define __LIBXC
|
||||
#endif
|
||||
#if defined(__LIBXC)
|
||||
flags = TRIM(flags)//" libxc"
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@
|
|||
MODULE input_cp2k_xc
|
||||
USE bibliography, ONLY: &
|
||||
Becke1988, Becke1997, BeckeRoussel1989, Goedecker1996, Grimme2006, Grimme2010, Grimme2011, &
|
||||
Heyd2004, Lee1988, Marques2012, Ortiz1994, Perdew1981, Perdew1996, Perdew2008, &
|
||||
Proynov2007, Tao2003, Tran2013, Vosko1980, Wellendorff2012, Zhang1998
|
||||
Heyd2004, Lee1988, Lehtola2018, Marques2012, Ortiz1994, Perdew1981, Perdew1996, &
|
||||
Perdew2008, Proynov2007, Tao2003, Tran2013, Vosko1980, Wellendorff2012, Zhang1998
|
||||
USE cp_output_handling, ONLY: add_last_numeric,&
|
||||
cp_print_key_section_create,&
|
||||
high_print_level
|
||||
|
|
@ -220,7 +220,7 @@ CONTAINS
|
|||
|
||||
CALL section_create(subsection, name="HCTH", &
|
||||
description="Uses the HCTH class of functionals", &
|
||||
n_keywords=0, n_subsections=0, repeats=.TRUE.)
|
||||
n_keywords=0, n_subsections=0, repeats=.FALSE.)
|
||||
CALL keyword_create(keyword, name="PARAMETER_SET", &
|
||||
description="Which version of the parameters should be used", &
|
||||
usage="PARAMETER_SET 407", &
|
||||
|
|
@ -270,14 +270,14 @@ CONTAINS
|
|||
|
||||
CALL create_libxc_section(subsection, "LIBXC", &
|
||||
"Uses functionals from LIBXC, see also "// &
|
||||
"http://www.tddft.org/programs/octopus/wiki/index.php/Libxc_functionals ", &
|
||||
"FUNCTIONAL GGA_X_PBE GGA_C_PBE")
|
||||
"https://gitlab.com/libxc/libxc/wikis/Functionals-list-4.0.4", &
|
||||
"FUNCTIONAL GGA_X_PBE")
|
||||
CALL section_add_subsection(section, subsection)
|
||||
CALL section_release(subsection)
|
||||
|
||||
CALL create_libxc_section(subsection, "KE_LIBXC", &
|
||||
"To be used for KG runs. Uses kinetic energy functionals from LIBXC, "// &
|
||||
"see also http://www.tddft.org/programs/octopus/wiki/index.php/Libxc_functionals ", &
|
||||
"https://gitlab.com/libxc/libxc/wikis/Functionals-list-4.0.4", &
|
||||
"FUNCTIONAL GGA_K_LLP")
|
||||
CALL section_add_subsection(section, subsection)
|
||||
CALL section_release(subsection)
|
||||
|
|
@ -747,30 +747,31 @@ CONTAINS
|
|||
CPASSERT(name == "LIBXC" .OR. name == "KE_LIBXC")
|
||||
NULLIFY (keyword)
|
||||
CALL section_create(section, name, description, &
|
||||
n_keywords=3, n_subsections=0, repeats=.FALSE., &
|
||||
citations=(/Marques2012/))
|
||||
n_keywords=3, n_subsections=0, repeats=.TRUE., &
|
||||
citations=(/Marques2012, Lehtola2018/))
|
||||
CALL keyword_create(keyword, "_SECTION_PARAMETERS_", &
|
||||
description="activates the functional", &
|
||||
description="activates functionals from libxc library", &
|
||||
lone_keyword_l_val=.TRUE., default_l_val=.FALSE.)
|
||||
CALL section_add_keyword(section, keyword)
|
||||
CALL keyword_release(keyword)
|
||||
CALL keyword_create(keyword, name="FUNCTIONAL", &
|
||||
description="names of the functionals, see also "// &
|
||||
"http://www.tddft.org/programs/octopus/wiki/index.php/Libxc_functionals ."// &
|
||||
description="name of the functional, see also "// &
|
||||
"https://gitlab.com/libxc/libxc/wikis/Functionals-list-4.0.4 "// &
|
||||
"The precise list of available functionals depends on "// &
|
||||
"the version of libxc interfaced (currently 2.2.2).", &
|
||||
"the version of libxc interfaced (currently 4.0.3)", &
|
||||
usage=usage, type_of_var=char_t, n_var=-1)
|
||||
CALL section_add_keyword(section, keyword)
|
||||
CALL keyword_release(keyword)
|
||||
CALL keyword_create(keyword, name="SCALE", &
|
||||
description="scaling factors of the functionals", &
|
||||
usage="SCALE 1.0 1.0", type_of_var=real_t, &
|
||||
default_r_vals=(/1.0_dp/), n_var=-1)
|
||||
description="scaling factors for the functional", &
|
||||
usage="SCALE 0.8", type_of_var=real_t, &
|
||||
default_r_val=1.0_dp)
|
||||
CALL section_add_keyword(section, keyword)
|
||||
CALL keyword_release(keyword)
|
||||
CALL keyword_create(keyword, name="PARAMETERS", &
|
||||
description="parameters of the functionals", &
|
||||
type_of_var=real_t, default_r_vals=(/1e20_dp/), n_var=-1)
|
||||
description="list of external parameters for the functional", &
|
||||
usage="PARAMETERS 0.3 [0.5 [1.4]]", type_of_var=real_t, &
|
||||
default_r_vals=(/HUGE(0.0_dp)/), n_var=-1)
|
||||
CALL section_add_keyword(section, keyword)
|
||||
CALL keyword_release(keyword)
|
||||
END SUBROUTINE
|
||||
|
|
|
|||
|
|
@ -6,11 +6,13 @@
|
|||
! **************************************************************************************************
|
||||
MODULE xc_derivatives
|
||||
|
||||
USE input_section_types, ONLY: section_vals_get_subs_vals2,&
|
||||
USE input_section_types, ONLY: section_vals_duplicate,&
|
||||
section_vals_get,&
|
||||
section_vals_get_subs_vals2,&
|
||||
section_vals_release,&
|
||||
section_vals_type,&
|
||||
section_vals_val_get
|
||||
USE kinds, ONLY: default_string_length,&
|
||||
dp
|
||||
USE kinds, ONLY: dp
|
||||
USE xc_b97, ONLY: b97_lda_eval,&
|
||||
b97_lda_info,&
|
||||
b97_lsd_eval,&
|
||||
|
|
@ -139,17 +141,15 @@ CONTAINS
|
|||
!> \param needs the flags corresponding to the inputs needed by this
|
||||
!> functional are set to true (the flags not needed aren't touched)
|
||||
!> \param max_deriv the maximal derivative available
|
||||
!> \param ifunc_name ...
|
||||
!> \author fawzi
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE xc_functional_get_info(functional, lsd, reference, shortform, &
|
||||
needs, max_deriv, ifunc_name)
|
||||
needs, max_deriv)
|
||||
TYPE(section_vals_type), POINTER :: functional
|
||||
LOGICAL, INTENT(in) :: lsd
|
||||
CHARACTER(LEN=*), INTENT(OUT), OPTIONAL :: reference, shortform
|
||||
TYPE(xc_rho_cflags_type), INTENT(inout), OPTIONAL :: needs
|
||||
INTEGER, INTENT(out), OPTIONAL :: max_deriv
|
||||
INTEGER, INTENT(in), OPTIONAL :: ifunc_name
|
||||
|
||||
CHARACTER(len=*), PARAMETER :: routineN = 'xc_functional_get_info', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
|
@ -229,11 +229,9 @@ CONTAINS
|
|||
ENDIF
|
||||
CASE ("LIBXC", "KE_LIBXC")
|
||||
IF (lsd) THEN
|
||||
CALL libxc_lsd_info(functional, reference, shortform, needs, max_deriv, &
|
||||
ifunc_name)
|
||||
CALL libxc_lsd_info(functional, reference, shortform, needs, max_deriv)
|
||||
ELSE
|
||||
CALL libxc_lda_info(functional, reference, shortform, needs, max_deriv, &
|
||||
ifunc_name)
|
||||
CALL libxc_lda_info(functional, reference, shortform, needs, max_deriv)
|
||||
ENDIF
|
||||
CASE ("CS1")
|
||||
IF (lsd) THEN
|
||||
|
|
@ -340,20 +338,17 @@ CONTAINS
|
|||
!> the code all the derivatives might be calculated, you should ignore
|
||||
!> them when adding derivatives of various functionals they might contain
|
||||
!> the derivative of just one functional)
|
||||
!> \param ifunc_name ...
|
||||
!> \par History
|
||||
!> 11.2003 created [fawzi]
|
||||
!> \author fawzi
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE xc_functional_eval(functional, lsd, rho_set, deriv_set, &
|
||||
deriv_order, ifunc_name)
|
||||
SUBROUTINE xc_functional_eval(functional, lsd, rho_set, deriv_set, deriv_order)
|
||||
|
||||
TYPE(section_vals_type), POINTER :: functional
|
||||
LOGICAL, INTENT(in) :: lsd
|
||||
TYPE(xc_rho_set_type), POINTER :: rho_set
|
||||
TYPE(xc_derivative_set_type), POINTER :: deriv_set
|
||||
INTEGER, INTENT(IN) :: deriv_order
|
||||
INTEGER, INTENT(in), OPTIONAL :: ifunc_name
|
||||
|
||||
CHARACTER(len=*), PARAMETER :: routineN = 'xc_functional_eval', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
|
@ -435,9 +430,9 @@ CONTAINS
|
|||
ENDIF
|
||||
CASE ("LIBXC", "KE_LIBXC")
|
||||
IF (lsd) THEN
|
||||
CALL libxc_lsd_eval(rho_set, deriv_set, deriv_order, functional, ifunc_name)
|
||||
CALL libxc_lsd_eval(rho_set, deriv_set, deriv_order, functional)
|
||||
ELSE
|
||||
CALL libxc_lda_eval(rho_set, deriv_set, deriv_order, functional, ifunc_name)
|
||||
CALL libxc_lda_eval(rho_set, deriv_set, deriv_order, functional)
|
||||
ENDIF
|
||||
CASE ("CS1")
|
||||
IF (lsd) THEN
|
||||
|
|
@ -582,10 +577,8 @@ CONTAINS
|
|||
CHARACTER(len=*), PARAMETER :: routineN = 'xc_functionals_eval', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
||||
CHARACTER(len=default_string_length), &
|
||||
DIMENSION(:), POINTER :: func_name
|
||||
INTEGER :: ifun, ifunc_name
|
||||
TYPE(section_vals_type), POINTER :: xc_fun
|
||||
INTEGER :: i_rep, ifun, n_rep
|
||||
TYPE(section_vals_type), POINTER :: libxc_fun, xc_fun
|
||||
|
||||
CPASSERT(ASSOCIATED(functionals))
|
||||
ifun = 0
|
||||
|
|
@ -593,21 +586,26 @@ CONTAINS
|
|||
ifun = ifun+1
|
||||
xc_fun => section_vals_get_subs_vals2(functionals, i_section=ifun)
|
||||
IF (.NOT. ASSOCIATED(xc_fun)) EXIT
|
||||
CALL xc_functional_eval(xc_fun, &
|
||||
lsd=lsd, &
|
||||
rho_set=rho_set, &
|
||||
deriv_set=deriv_set, &
|
||||
deriv_order=deriv_order, &
|
||||
ifunc_name=1)
|
||||
IF (TRIM(xc_fun%section%name) == "LIBXC") THEN
|
||||
CALL section_vals_val_get(xc_fun, "functional", c_vals=func_name)
|
||||
DO ifunc_name = 2, SIZE(func_name)
|
||||
CALL xc_functional_eval(xc_fun, &
|
||||
IF (TRIM(xc_fun%section%name) /= "LIBXC") THEN
|
||||
CALL xc_functional_eval(xc_fun, &
|
||||
lsd=lsd, &
|
||||
rho_set=rho_set, &
|
||||
deriv_set=deriv_set, &
|
||||
deriv_order=deriv_order)
|
||||
ELSE
|
||||
! LIBXC is the only repeatable functional section - for each we need
|
||||
! NOT the single values, but the whole section_vals_type independently
|
||||
CALL section_vals_get(xc_fun, n_repetition=n_rep)
|
||||
DO i_rep = 1, n_rep
|
||||
NULLIFY (libxc_fun)
|
||||
CALL section_vals_duplicate(xc_fun, libxc_fun, i_rep_start=i_rep, i_rep_end=i_rep)
|
||||
IF (.NOT. ASSOCIATED(libxc_fun)) EXIT
|
||||
CALL xc_functional_eval(libxc_fun, &
|
||||
lsd=lsd, &
|
||||
rho_set=rho_set, &
|
||||
deriv_set=deriv_set, &
|
||||
deriv_order=deriv_order, &
|
||||
ifunc_name=ifunc_name)
|
||||
deriv_order=deriv_order)
|
||||
CALL section_vals_release(libxc_fun)
|
||||
END DO
|
||||
END IF
|
||||
END DO
|
||||
|
|
@ -634,29 +632,37 @@ CONTAINS
|
|||
CHARACTER(len=*), PARAMETER :: routineN = 'xc_functionals_get_needs', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
||||
CHARACTER(len=80), DIMENSION(:), POINTER :: func_name
|
||||
INTEGER :: ifun, ifunc_name
|
||||
INTEGER :: i_rep, ifun, n_rep
|
||||
LOGICAL :: my_add_basic_components
|
||||
TYPE(section_vals_type), POINTER :: xc_fun
|
||||
TYPE(section_vals_type), POINTER :: libxc_fun, xc_fun
|
||||
|
||||
my_add_basic_components = .FALSE.
|
||||
IF (PRESENT(add_basic_components)) my_add_basic_components = add_basic_components
|
||||
|
||||
CPASSERT(ASSOCIATED(functionals))
|
||||
CALL xc_rho_cflags_setall(needs, .FALSE.)
|
||||
|
||||
ifun = 0
|
||||
DO
|
||||
ifun = ifun+1
|
||||
xc_fun => section_vals_get_subs_vals2(functionals, i_section=ifun)
|
||||
IF (.NOT. ASSOCIATED(xc_fun)) EXIT
|
||||
CALL xc_functional_get_info(xc_fun, lsd=lsd, needs=needs, ifunc_name=1)
|
||||
IF (TRIM(xc_fun%section%name) == "LIBXC") THEN
|
||||
CALL section_vals_val_get(xc_fun, "functional", c_vals=func_name)
|
||||
DO ifunc_name = 2, SIZE(func_name)
|
||||
CALL xc_functional_get_info(xc_fun, lsd=lsd, needs=needs, ifunc_name=ifunc_name)
|
||||
IF (TRIM(xc_fun%section%name) /= "LIBXC") THEN
|
||||
CALL xc_functional_get_info(xc_fun, lsd=lsd, needs=needs)
|
||||
ELSE
|
||||
! LIBXC is the only repeatable functional section - for each we need
|
||||
! NOT the single values, but the whole section_vals_type independently
|
||||
CALL section_vals_get(xc_fun, n_repetition=n_rep)
|
||||
DO i_rep = 1, n_rep
|
||||
NULLIFY (libxc_fun)
|
||||
CALL section_vals_duplicate(xc_fun, libxc_fun, i_rep_start=i_rep, i_rep_end=i_rep)
|
||||
IF (.NOT. ASSOCIATED(libxc_fun)) EXIT
|
||||
CALL xc_functional_get_info(libxc_fun, lsd=lsd, needs=needs)
|
||||
CALL section_vals_release(libxc_fun)
|
||||
END DO
|
||||
END IF
|
||||
END DO
|
||||
|
||||
IF (my_add_basic_components) THEN
|
||||
IF (lsd) THEN
|
||||
needs%rho_spin = .TRUE.
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -6,162 +6,82 @@
|
|||
! **************************************************************************************************
|
||||
!> \brief Includes all necessary routines, functions and parameters from
|
||||
!> libxc. Provides CP2K routines/functions where the LibXC calling list
|
||||
!> is version dependent. The naming convention for such
|
||||
!> routines/functions is xc_f90_XXX --> 'xc_libxc_wrap_XXX'. All version
|
||||
!> is version dependent (>=4.0.3). The naming convention for such
|
||||
!> routines/functions is xc_f03_XXX --> 'xc_libxc_wrap_XXX'. All version
|
||||
!> independent routines/functions are just bypassed to higher level
|
||||
!> module file 'xc_libxc'.
|
||||
!>
|
||||
!> \note For LibXC versions 2.2.2 and above.
|
||||
!> Once the LibXC-API is stable, remove all 'xc_libxc_wrap_XXX'
|
||||
!> routines/functions and use 'xc_f90_lib_m' directly in 'xc_libxc'.
|
||||
!> Marques, Oliveira, Burnus, CPC 183, 2272 (2012)).
|
||||
!>
|
||||
!> \par History
|
||||
!> 08.2015 created [A. Gloess]
|
||||
!> \author A. Gloessa (agloess)
|
||||
!> 08.2015 created [A. Gloess (agloess)]
|
||||
!> 01.2018 refactoring [A. Gloess (agloess)]
|
||||
!> \author A. Gloess (agloess)
|
||||
! **************************************************************************************************
|
||||
MODULE xc_libxc_wrap
|
||||
#if defined(__LIBXC2) || defined(__LIBXC3)
|
||||
#define __LIBXC
|
||||
#endif
|
||||
#if defined (__LIBXC)
|
||||
#include <xc_version.h>
|
||||
! check for LibXC version
|
||||
#if (XC_MAJOR_VERSION < 2) || ((XC_MAJOR_VERSION == 2) && (XC_MINOR_VERSION < 2))
|
||||
This version of CP2K ONLY works with libxc versions 2.2.2 and above.
|
||||
#if (XC_MAJOR_VERSION < 4)
|
||||
This version of CP2K ONLY works with libxc versions 4.0.3 and above.
|
||||
Furthermore, -I[LIBXC_DIR]/INCLUDE needs to be added to FCFLAGS.
|
||||
#else
|
||||
|
||||
#if (XC_MAJOR_VERSION == 2)
|
||||
! Functionals which either have known bugs, or require parameters
|
||||
USE libxc_funcs_m, ONLY: XC_GGA_C_N12,&
|
||||
XC_GGA_C_N12_SX,&
|
||||
XC_GGA_K_FR_B88,&
|
||||
XC_GGA_K_LLP,&
|
||||
XC_GGA_K_THAKKAR,&
|
||||
XC_GGA_X_B88,&
|
||||
XC_GGA_X_HJS_B88,&
|
||||
XC_GGA_X_HJS_B97X,&
|
||||
XC_GGA_X_HJS_PBE,&
|
||||
XC_GGA_X_HJS_PBE_SOL,&
|
||||
XC_GGA_X_LB,&
|
||||
XC_GGA_X_MB88,&
|
||||
XC_GGA_X_N12,&
|
||||
XC_GGA_X_OPTB88_VDW,&
|
||||
XC_GGA_X_WPBEH,&
|
||||
XC_HYB_GGA_XC_HJS_B88,&
|
||||
XC_HYB_GGA_XC_HJS_B97X,&
|
||||
XC_HYB_GGA_XC_HJS_PBE,&
|
||||
XC_HYB_GGA_XC_HJS_PBE_SOL,&
|
||||
XC_HYB_GGA_XC_HSE03,&
|
||||
XC_HYB_GGA_XC_HSE06,&
|
||||
XC_HYB_GGA_XC_O3LYP,&
|
||||
XC_HYB_GGA_XC_X3LYP,&
|
||||
XC_HYB_GGA_X_N12_SX,&
|
||||
XC_HYB_MGGA_X_M11,&
|
||||
XC_LDA_C_1D_CSC,&
|
||||
XC_LDA_C_2D_PRM,&
|
||||
XC_LDA_C_XALPHA,&
|
||||
XC_LDA_X,&
|
||||
XC_LDA_X_1D,&
|
||||
XC_MGGA_X_M11_L,&
|
||||
XC_MGGA_X_MS2H,&
|
||||
XC_MGGA_X_TB09
|
||||
#else
|
||||
! Functionals which require parameters
|
||||
USE libxc_funcs_m, ONLY: XC_LDA_X,&
|
||||
XC_LDA_X_1D,&
|
||||
XC_LDA_C_XALPHA,&
|
||||
XC_LDA_C_2D_PRM,&
|
||||
XC_LDA_C_1D_CSC,&
|
||||
XC_MGGA_X_TB09,&
|
||||
XC_HYB_GGA_XC_HSE03,&
|
||||
XC_HYB_GGA_XC_HSE06,&
|
||||
XC_HYB_GGA_XC_HJS_PBE,&
|
||||
XC_HYB_GGA_XC_HJS_PBE_SOL,&
|
||||
XC_HYB_GGA_XC_HJS_B88,&
|
||||
XC_HYB_GGA_XC_HJS_B97X,&
|
||||
XC_GGA_X_LB,&
|
||||
XC_GGA_X_HJS_PBE,&
|
||||
XC_GGA_X_HJS_PBE_SOL,&
|
||||
XC_GGA_X_HJS_B88,&
|
||||
XC_GGA_X_HJS_B97X,&
|
||||
XC_GGA_X_WPBEH
|
||||
#endif
|
||||
USE cp_log_handling, ONLY: cp_to_string
|
||||
USE kinds, ONLY: dp
|
||||
USE xc_f90_lib_m, ONLY: xc_f90_func_end,&
|
||||
xc_f90_func_init,&
|
||||
xc_f90_functional_get_number,&
|
||||
USE xc_f03_lib_m, ONLY: xc_f03_func_end,&
|
||||
xc_f03_func_init,&
|
||||
xc_f03_func_set_ext_params,&
|
||||
xc_f03_functional_get_number,&
|
||||
!
|
||||
xc_f90_gga_exc,&
|
||||
xc_f90_gga_exc_vxc,&
|
||||
xc_f90_gga_fxc,&
|
||||
xc_f90_gga_lb_set_par,&
|
||||
xc_f90_gga_vxc,&
|
||||
xc_f90_gga_x_hjs_set_par,&
|
||||
xc_f90_gga_x_wpbeh_set_par,&
|
||||
xc_f03_gga_exc,&
|
||||
xc_f03_gga_exc_vxc,&
|
||||
xc_f03_gga_fxc,&
|
||||
xc_f03_gga_vxc,&
|
||||
!
|
||||
xc_f90_hyb_gga_xc_hse_set_par,&
|
||||
xc_f03_func_get_info,&
|
||||
xc_f03_func_info_get_family,&
|
||||
xc_f03_func_info_get_kind,&
|
||||
xc_f03_func_info_get_name,&
|
||||
xc_f03_func_info_get_references,&
|
||||
xc_f03_func_info_get_flags,&
|
||||
xc_f03_func_info_get_n_ext_params,&
|
||||
xc_f03_func_info_get_ext_params_description,&
|
||||
!
|
||||
xc_f90_info_family,&
|
||||
xc_f90_info_kind,&
|
||||
xc_f90_info_name,&
|
||||
xc_f90_info_refs,&
|
||||
xc_f90_info_flags,&
|
||||
xc_f03_func_reference_get_ref, &
|
||||
xc_f03_func_reference_get_doi, &
|
||||
!
|
||||
xc_f90_lda,&
|
||||
xc_f90_lda_c_1d_csc_set_par,&
|
||||
xc_f90_lda_c_2d_prm_set_par,&
|
||||
xc_f90_lda_c_xalpha_set_par,&
|
||||
xc_f90_lda_exc,&
|
||||
xc_f90_lda_exc_vxc,&
|
||||
xc_f90_lda_fxc,&
|
||||
xc_f90_lda_kxc,&
|
||||
xc_f90_lda_vxc,&
|
||||
xc_f90_lda_x_1d_set_par,&
|
||||
xc_f90_lda_x_set_par,&
|
||||
xc_f03_lda, &
|
||||
xc_f03_lda_exc, &
|
||||
xc_f03_lda_exc_vxc, &
|
||||
xc_f03_lda_fxc, &
|
||||
xc_f03_lda_kxc, &
|
||||
xc_f03_lda_vxc, &
|
||||
!
|
||||
xc_f90_mgga,&
|
||||
xc_f90_mgga_exc,&
|
||||
xc_f90_mgga_exc_vxc,&
|
||||
xc_f90_mgga_fxc,&
|
||||
xc_f90_mgga_vxc,&
|
||||
xc_f90_mgga_x_tb09_set_par,&
|
||||
xc_f03_mgga, &
|
||||
xc_f03_mgga_exc, &
|
||||
xc_f03_mgga_exc_vxc, &
|
||||
xc_f03_mgga_fxc, &
|
||||
xc_f03_mgga_vxc, &
|
||||
!
|
||||
xc_f90_pointer_t,&
|
||||
xc_f03_func_t, &
|
||||
xc_f03_func_info_t, &
|
||||
xc_f03_func_reference_t, &
|
||||
!
|
||||
XC_FAMILY_UNKNOWN,&
|
||||
XC_FAMILY_NONE,&
|
||||
XC_FAMILY_LDA,&
|
||||
XC_FAMILY_GGA,&
|
||||
XC_FAMILY_MGGA,&
|
||||
XC_FAMILY_LCA,&
|
||||
XC_FAMILY_OEP,&
|
||||
XC_FAMILY_HYB_GGA,&
|
||||
XC_FAMILY_HYB_MGGA,&
|
||||
XC_FAMILY_LDA, &
|
||||
XC_FAMILY_GGA, &
|
||||
XC_FAMILY_MGGA, &
|
||||
XC_FAMILY_HYB_GGA, &
|
||||
!
|
||||
XC_UNPOLARIZED,&
|
||||
XC_POLARIZED,&
|
||||
XC_NON_RELATIVISTIC,&
|
||||
XC_RELATIVISTIC,&
|
||||
XC_UNPOLARIZED, &
|
||||
XC_POLARIZED, &
|
||||
!
|
||||
XC_EXCHANGE,&
|
||||
XC_CORRELATION,&
|
||||
XC_EXCHANGE_CORRELATION,&
|
||||
XC_KINETIC,&
|
||||
XC_EXCHANGE, &
|
||||
XC_CORRELATION, &
|
||||
XC_EXCHANGE_CORRELATION, &
|
||||
XC_KINETIC, &
|
||||
!
|
||||
XC_FLAGS_HAVE_EXC,&
|
||||
XC_FLAGS_HAVE_VXC,&
|
||||
XC_FLAGS_HAVE_FXC,&
|
||||
XC_FLAGS_HAVE_KXC,&
|
||||
XC_FLAGS_HAVE_LXC,&
|
||||
XC_FLAGS_1D,&
|
||||
XC_FLAGS_2D,&
|
||||
XC_FLAGS_3D,&
|
||||
XC_FLAGS_STABLE,&
|
||||
XC_FLAGS_DEVELOPMENT,&
|
||||
XC_GGA_XC_LB,&
|
||||
XC_GGA_K_ABSR1
|
||||
XC_FLAGS_NEEDS_LAPLACIAN, &
|
||||
XC_FLAGS_HAVE_EXC
|
||||
|
||||
#include "../base/base_uses.f90"
|
||||
|
||||
|
|
@ -172,16 +92,17 @@ MODULE xc_libxc_wrap
|
|||
|
||||
CHARACTER(LEN=*), PARAMETER, PUBLIC :: libxc_version = XC_VERSION
|
||||
|
||||
PUBLIC :: xc_f90_pointer_t
|
||||
PUBLIC :: xc_f90_func_init, xc_f90_func_end
|
||||
PUBLIC :: xc_f90_info_family, xc_f90_info_kind, xc_f90_info_name
|
||||
PUBLIC :: xc_f90_gga_exc, xc_f90_gga_exc_vxc, xc_f90_gga_fxc, &
|
||||
xc_f90_gga_vxc
|
||||
PUBLIC :: xc_f90_lda, &
|
||||
xc_f90_lda_exc, xc_f90_lda_exc_vxc, &
|
||||
xc_f90_lda_fxc, xc_f90_lda_kxc, xc_f90_lda_vxc
|
||||
PUBLIC :: xc_f90_mgga, xc_f90_mgga_exc, xc_f90_mgga_exc_vxc, xc_f90_mgga_fxc, &
|
||||
xc_f90_mgga_vxc
|
||||
PUBLIC :: xc_f03_func_t, xc_f03_func_info_t
|
||||
PUBLIC :: xc_f03_func_init, xc_f03_func_end
|
||||
PUBLIC :: xc_f03_func_get_info, xc_f03_func_info_get_family, xc_f03_func_info_get_kind, &
|
||||
xc_f03_func_info_get_name
|
||||
PUBLIC :: xc_f03_gga_exc, xc_f03_gga_exc_vxc, xc_f03_gga_fxc, &
|
||||
xc_f03_gga_vxc
|
||||
PUBLIC :: xc_f03_lda, &
|
||||
xc_f03_lda_exc, xc_f03_lda_exc_vxc, &
|
||||
xc_f03_lda_fxc, xc_f03_lda_kxc, xc_f03_lda_vxc
|
||||
PUBLIC :: xc_f03_mgga, xc_f03_mgga_exc, xc_f03_mgga_exc_vxc, xc_f03_mgga_fxc, &
|
||||
xc_f03_mgga_vxc
|
||||
|
||||
PUBLIC :: XC_FAMILY_LDA, XC_FAMILY_GGA, XC_FAMILY_MGGA, &
|
||||
XC_FAMILY_HYB_GGA
|
||||
|
|
@ -190,13 +111,12 @@ MODULE xc_libxc_wrap
|
|||
|
||||
PUBLIC :: XC_EXCHANGE, XC_CORRELATION, XC_EXCHANGE_CORRELATION, XC_KINETIC
|
||||
|
||||
! wrappers for routines where interface has changed between versions
|
||||
! wrappers for routines
|
||||
PUBLIC :: xc_libxc_wrap_info_refs, &
|
||||
xc_libxc_wrap_version, &
|
||||
xc_libxc_wrap_functional_get_number, &
|
||||
xc_libxc_wrap_needs_laplace, &
|
||||
xc_libxc_wrap_functional_set_params, &
|
||||
xc_libxc_wrap_functional_buggy
|
||||
xc_libxc_wrap_functional_set_params
|
||||
|
||||
LOGICAL, SAVE :: first_time = .TRUE.
|
||||
|
||||
|
|
@ -209,50 +129,64 @@ CONTAINS
|
|||
!> \param sc ...
|
||||
!> \param reference ...
|
||||
!>
|
||||
!> \author A. Gloessa (agloess)
|
||||
!> \author A. Gloess (agloess)
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE xc_libxc_wrap_info_refs(xc_info, polarized, sc, reference)
|
||||
TYPE(xc_f90_pointer_t), INTENT(IN) :: xc_info
|
||||
INTEGER, INTENT(IN) :: polarized
|
||||
REAL(KIND=dp), INTENT(IN) :: sc
|
||||
CHARACTER(LEN=*), INTENT(OUT) :: reference
|
||||
TYPE(xc_f03_func_info_t), INTENT(IN) :: xc_info
|
||||
INTEGER, INTENT(IN) :: polarized
|
||||
REAL(KIND=dp), INTENT(IN) :: sc
|
||||
CHARACTER(LEN=*), INTENT(OUT) :: reference
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'xc_libxc_wrap_info_refs', &
|
||||
routineP = moduleN//':'//routineN
|
||||
routineP = moduleN//':'//routineN
|
||||
INTEGER, PARAMETER :: maxlen = 67
|
||||
|
||||
INTEGER, PARAMETER :: maxlen = 67 ! max line length in output
|
||||
INTEGER :: handle, i_ref, first, last, empty
|
||||
CHARACTER(LEN=400) :: ref_string ! string for one reference
|
||||
CHARACTER(LEN=400) :: tmp_string ! modified string for one reference
|
||||
#if (XC_MAJOR_VERSION == 2)
|
||||
TYPE(xc_f90_pointer_t) :: str ! this will hold a (char **) pointer
|
||||
#endif
|
||||
CHARACTER(LEN=128) :: descr_string
|
||||
CHARACTER(LEN=400) :: doi_string, ref_string, tmp_string
|
||||
INTEGER :: empty, first, handle, i, i_ref, idx, &
|
||||
last, n_params
|
||||
TYPE(xc_f03_func_reference_t) :: xc_ref
|
||||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
i_ref = 0
|
||||
#if (XC_MAJOR_VERSION == 2)
|
||||
CALL xc_f90_info_refs(xc_info, i_ref, str, ref_string)
|
||||
#else
|
||||
CALL xc_f90_info_refs(xc_info, i_ref, ref_string)
|
||||
#endif
|
||||
idx = 1
|
||||
first = 1
|
||||
DO WHILE (i_ref >= 0)
|
||||
WRITE (tmp_string, '(a1,i1,a2,a)') '[', i_ref, '] ', TRIM(ref_string)
|
||||
! information about functional references
|
||||
xc_ref = xc_f03_func_info_get_references(xc_info, i_ref)
|
||||
ref_string = xc_f03_func_reference_get_ref(xc_ref)
|
||||
doi_string = xc_f03_func_reference_get_doi(xc_ref)
|
||||
WRITE (tmp_string, '(a1,i1,a2,a,a7,a)') '[', idx, '] ', &
|
||||
TRIM(ref_string), ', doi: ', TRIM(doi_string)
|
||||
last = first+LEN_TRIM(tmp_string)-1
|
||||
reference(first:last) = TRIM(tmp_string)
|
||||
first = last+1
|
||||
empty = last-MOD(last, maxlen)+maxlen
|
||||
empty = last+(maxlen-1)-MOD(last-1, maxlen)
|
||||
! fill up line with 'spaces'
|
||||
IF (empty /= last) THEN
|
||||
! fill with 'spaces'
|
||||
reference(first:empty) = ' '
|
||||
first = empty+1
|
||||
END IF
|
||||
#if (XC_MAJOR_VERSION == 2)
|
||||
CALL xc_f90_info_refs(xc_info, i_ref, str, ref_string)
|
||||
#else
|
||||
CALL xc_f90_info_refs(xc_info, i_ref, ref_string)
|
||||
#endif
|
||||
! information about (optional) external parameters
|
||||
n_params = xc_f03_func_info_get_n_ext_params(xc_info)
|
||||
IF (n_params > 0) THEN
|
||||
reference(first:first+maxlen-1) = 'Optional external parameters:'//REPEAT(' ', maxlen-28)
|
||||
first = first+maxlen
|
||||
END IF
|
||||
DO i = 1, n_params
|
||||
descr_string = xc_f03_func_info_get_ext_params_description(xc_info, i-1)
|
||||
last = first+LEN_TRIM(descr_string)-1+3
|
||||
reference(first:last) = ' * '//TRIM(descr_string)
|
||||
first = last+1
|
||||
empty = last+(maxlen-1)-MOD(last-1, maxlen)
|
||||
! fill up line with 'spaces'
|
||||
IF (empty /= last) THEN
|
||||
reference(first:empty) = ' '
|
||||
first = empty+1
|
||||
END IF
|
||||
END DO
|
||||
idx = idx+1
|
||||
END DO
|
||||
SELECT CASE (polarized)
|
||||
CASE (XC_UNPOLARIZED)
|
||||
|
|
@ -275,9 +209,7 @@ CONTAINS
|
|||
! **************************************************************************************************
|
||||
!> \brief Provides a version string.
|
||||
!> \param version ...
|
||||
!> \author A. Gloessa (agloess)
|
||||
!> \note Minor and micro version could be defined as character for SVN trunk
|
||||
!> version (e.g. 3.x.x)!
|
||||
!> \author A. Gloess (agloess)
|
||||
!>
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE xc_libxc_wrap_version(version)
|
||||
|
|
@ -288,20 +220,8 @@ CONTAINS
|
|||
|
||||
INTEGER :: handle
|
||||
|
||||
! the string that is output
|
||||
!#if (XC_MAJOR_VERSION >= 3)
|
||||
! INTEGER :: vmajor, vminor, vmicro
|
||||
!#endif
|
||||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
!#if (XC_MAJOR_VERSION >= 3)
|
||||
! CALL xc_f90_version(vmajor, vminor, vmicro)
|
||||
! write(version(1:5),'(i1,a,i1,a,i1)') vmajor, '.', vminor, '.', vmicro
|
||||
!#else
|
||||
! CALL xc_f90_version(vmajor, vminor)
|
||||
! write(version(1:5),'(i1,a,i1,a)') vmajor, '.', vminor, '.?'
|
||||
!#endif
|
||||
version = TRIM(libxc_version)
|
||||
|
||||
CALL timestop(handle)
|
||||
|
|
@ -312,7 +232,7 @@ CONTAINS
|
|||
!> \brief Provides the functional ID.
|
||||
!> \param func_string ...
|
||||
!> \retval func_id ...
|
||||
!> \author A. Gloessa (agloess)
|
||||
!> \author A. Gloess (agloess)
|
||||
!> \note Remove prefix to keep compatibility, functionals can be specified (in
|
||||
!> LIBXC section) as:
|
||||
!> GGA_X_... or XC_GGA_X_...
|
||||
|
|
@ -331,9 +251,9 @@ CONTAINS
|
|||
CALL timeset(routineN, handle)
|
||||
|
||||
IF (func_string(1:3) == "XC_") THEN
|
||||
func_id = xc_f90_functional_get_number(func_string(4:LEN_TRIM(func_string)))
|
||||
func_id = xc_f03_functional_get_number(func_string(4:LEN_TRIM(func_string)))
|
||||
ELSE
|
||||
func_id = xc_f90_functional_get_number(func_string(1:LEN_TRIM(func_string)))
|
||||
func_id = xc_f03_functional_get_number(func_string(1:LEN_TRIM(func_string)))
|
||||
END IF
|
||||
IF (func_id == -1) THEN
|
||||
CPABORT(TRIM(func_string)//": wrong functional name")
|
||||
|
|
@ -349,144 +269,42 @@ CONTAINS
|
|||
!> \param func_id ...
|
||||
!>
|
||||
!> \retval xc_libxc_wrap_needs_laplace ...
|
||||
!> \author A. Gloessa (agloess)
|
||||
!> \author A. Gloess (agloess)
|
||||
! **************************************************************************************************
|
||||
LOGICAL FUNCTION xc_libxc_wrap_needs_laplace(func_id)
|
||||
! Only some MGGA functionals need 'r->u' and 'r->us', which are calculated
|
||||
! by default in 'src/work_mgga_x.c' and 'src/work_mgga_c.c' as 'r.u' and
|
||||
! 'r.us'.
|
||||
! All other MGGA functionals one could use a dummy (of the right size) for
|
||||
! 'lapl'.
|
||||
!
|
||||
! It would be best, if LibXC would provide the information:
|
||||
! need%lapl
|
||||
! need%tau
|
||||
! nedd%...
|
||||
! as FLAGS.
|
||||
! As a work-around we call the corresponding routine twice with different
|
||||
! values for 'lapl' and check if the results are changing.
|
||||
!
|
||||
! [last checked version: 3.x.x (18.08.2015)]
|
||||
!
|
||||
! 'r->u':
|
||||
! -------
|
||||
! # src/mgga_x_br89.c
|
||||
! XC_MGGA_X_BR89 206 /* Becke-Roussel 89 */
|
||||
! XC_MGGA_X_BJ06 207 /* Becke & Johnson correction to Becke-Roussel 89 */
|
||||
! XC_MGGA_X_TB09 208 /* Tran & Blaha correction to Becke & Johnson */
|
||||
! XC_MGGA_X_RPP09 209 /* Rasanen, Pittalis, and Proetto correction to Becke & Johnson */
|
||||
!
|
||||
! # src/mgga_x_2d_prhg07.c
|
||||
! XC_MGGA_X_2D_PRHG07 210 /* Pittalis, Rasanen, Helbig, Gross Exchange Functional */
|
||||
! XC_MGGA_X_2D_PRHG07_PRP10 211 /* PRGH07 with PRP10 correction */
|
||||
!
|
||||
! # src/mgga_x_mk00.c
|
||||
! XC_MGGA_X_MK00 230 /* Exchange for accurate virtual orbital energies */
|
||||
! XC_MGGA_X_MK00B 243 /* Exchange for accurate virtual orbital energies (v. B) */
|
||||
!
|
||||
!
|
||||
! 'r->us':
|
||||
! -------
|
||||
! # src/mgga_xc_zlp.c
|
||||
! XC_MGGA_XC_ZLP 42 /* Zhao, Levy & Parr, Eq. (21) */
|
||||
!
|
||||
! # src/mgga_c_cs.c
|
||||
! XC_MGGA_C_CS 72 /* Colle and Salvetti */
|
||||
!
|
||||
! # src/mgga_c_cc06.c
|
||||
! XC_MGGA_C_CC06 229 /* Cancio and Chou 2006 */
|
||||
!
|
||||
! Only some MGGA functionals needs the laplacian
|
||||
INTEGER, INTENT(IN) :: func_id
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'xc_libxc_wrap_needs_laplace', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: handle
|
||||
REAL(KIND=dp) :: rho, norm_drho, laplace_rho, &
|
||||
my_tau
|
||||
REAL(KIND=dp), DIMENSION(:), &
|
||||
ALLOCATABLE :: dummy
|
||||
REAL(KIND=dp), DIMENSION(:, :), &
|
||||
ALLOCATABLE :: val
|
||||
TYPE(xc_f90_pointer_t) :: xc_func, xc_info
|
||||
TYPE(xc_f03_func_t) :: xc_func
|
||||
TYPE(xc_f03_func_info_t) :: xc_info
|
||||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
xc_libxc_wrap_needs_laplace = .FALSE.
|
||||
|
||||
! Some MGGa need the laplace explicit and some just need an arbitrary array
|
||||
! of the correct size. Here we call the calculation routine twice for two
|
||||
! different values of 'laplace_rho' and check if the result has changed.
|
||||
! of the correct size.
|
||||
!
|
||||
! Assumption (.true. in v2.1.0 - v3.x.x):
|
||||
! Assumption (.true. in v2.1.0 - v4.0.x):
|
||||
! if
|
||||
! functional is Laplace-dependent for XC_UNPOLARIZED
|
||||
! then
|
||||
! functional will be Laplace-dependent for XC_POLARIZED too.
|
||||
!
|
||||
!$OMP CRITICAL(libxc_init)
|
||||
CALL xc_f90_func_init(xc_func, xc_info, func_id, XC_UNPOLARIZED)
|
||||
CALL xc_f03_func_init(xc_func, func_id, XC_UNPOLARIZED)
|
||||
xc_info = xc_f03_func_get_info(xc_func)
|
||||
!$OMP END CRITICAL(libxc_init)
|
||||
!$OMP BARRIER
|
||||
IF (xc_f90_info_family(xc_info) == XC_FAMILY_MGGA) THEN
|
||||
IF (IAND(xc_f90_info_flags(xc_info), XC_FLAGS_HAVE_EXC) == XC_FLAGS_HAVE_EXC) THEN
|
||||
ALLOCATE (val(1, 2))
|
||||
rho = 2.0e-3_dp; norm_drho = 2.0e-3_dp; my_tau = 5.0e-1_dp
|
||||
laplace_rho = -1.0e-1_dp
|
||||
CALL xc_f90_mgga_exc(xc_func, 1, rho, norm_drho, &
|
||||
laplace_rho, my_tau, val(1, 1))
|
||||
laplace_rho = -3.0e-1_dp
|
||||
CALL xc_f90_mgga_exc(xc_func, 1, rho, norm_drho, &
|
||||
laplace_rho, my_tau, val(1, 2))
|
||||
IF (val(1, 1) /= val(1, 2)) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
DEALLOCATE (val)
|
||||
END IF
|
||||
IF (IAND(xc_f90_info_flags(xc_info), XC_FLAGS_HAVE_VXC) == XC_FLAGS_HAVE_VXC) THEN
|
||||
ALLOCATE (val(1, 2), dummy(3))
|
||||
rho = 2.0e-3_dp; norm_drho = 2.0e-3_dp; my_tau = 5.0e-1_dp
|
||||
laplace_rho = -1.0e-1_dp
|
||||
CALL xc_f90_mgga_vxc(xc_func, 1, rho, norm_drho, &
|
||||
laplace_rho, my_tau, dummy(1), dummy(2), val(1, 1), dummy(3))
|
||||
laplace_rho = -3.0e-1_dp
|
||||
CALL xc_f90_mgga_vxc(xc_func, 1, rho, norm_drho, &
|
||||
laplace_rho, my_tau, dummy(1), dummy(2), val(1, 2), dummy(3))
|
||||
IF (val(1, 1) /= val(1, 2)) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
DEALLOCATE (val, dummy)
|
||||
END IF
|
||||
IF (IAND(xc_f90_info_flags(xc_info), XC_FLAGS_HAVE_FXC) == XC_FLAGS_HAVE_FXC) THEN
|
||||
ALLOCATE (val(4, 2), dummy(6))
|
||||
rho = 2.0e-3_dp; norm_drho = 2.0e-3_dp; my_tau = 5.0e-1_dp
|
||||
laplace_rho = -1.0e-1_dp
|
||||
CALL xc_f90_mgga_fxc(xc_func, 1, rho, norm_drho, &
|
||||
laplace_rho, my_tau, &
|
||||
dummy(1), dummy(2), val(1, 1), dummy(3), dummy(4), val(2, 1), &
|
||||
dummy(5), val(3, 1), dummy(6), val(4, 1))
|
||||
laplace_rho = -3.0e-1_dp
|
||||
CALL xc_f90_mgga_fxc(xc_func, 1, rho, norm_drho, &
|
||||
laplace_rho, my_tau, &
|
||||
dummy(1), dummy(2), val(1, 2), dummy(3), dummy(4), val(2, 2), &
|
||||
dummy(5), val(3, 2), dummy(6), val(4, 2))
|
||||
IF (val(1, 1) /= val(1, 2) .OR. val(2, 1) /= val(2, 2) .OR. &
|
||||
val(3, 1) /= val(3, 2) .OR. val(4, 1) /= val(4, 2)) &
|
||||
xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
DEALLOCATE (val, dummy)
|
||||
END IF
|
||||
IF (IAND(xc_f03_func_info_get_flags(xc_info), XC_FLAGS_NEEDS_LAPLACIAN) == XC_FLAGS_NEEDS_LAPLACIAN) THEN
|
||||
xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
ELSE
|
||||
xc_libxc_wrap_needs_laplace = .FALSE.
|
||||
END IF
|
||||
CALL xc_f90_func_end(xc_func)
|
||||
|
||||
! IF (func_id == XC_MGGA_X_BR89) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
! IF (func_id == XC_MGGA_X_BJ06) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
! IF (func_id == XC_MGGA_X_TB09) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
! IF (func_id == XC_MGGA_X_RPP09) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
! IF (func_id == XC_MGGA_X_2D_PRHG07) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
! IF (func_id == XC_MGGA_X_2D_PRHG07_PRP10) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
! IF (func_id == XC_MGGA_X_MK00) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
! IF (func_id == XC_MGGA_X_MK00B) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
!#if (XC_MAJOR_VERSION == 3)
|
||||
! IF (func_id == XC_MGGA_XC_ZLP) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
!#endif
|
||||
! IF (func_id == XC_MGGA_C_CS) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
! IF (func_id == XC_MGGA_C_CC06) xc_libxc_wrap_needs_laplace = .TRUE.
|
||||
CALL xc_f03_func_end(xc_func)
|
||||
|
||||
CALL timestop(handle)
|
||||
|
||||
|
|
@ -496,58 +314,64 @@ CONTAINS
|
|||
!> \brief Wrapper for functionals that need special parameters.
|
||||
!> \param xc_func ...
|
||||
!> \param xc_info ...
|
||||
!> \param func_id ...
|
||||
!> \param params ...
|
||||
!> \param no_exc ...
|
||||
!>
|
||||
!> \author A. Gloessa (agloess)
|
||||
!> \author A. Gloess (agloess)
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE xc_libxc_wrap_functional_set_params(xc_func, xc_info, func_id, params, no_exc)
|
||||
TYPE(xc_f90_pointer_t), INTENT(INOUT) :: xc_func
|
||||
TYPE(xc_f90_pointer_t), INTENT(IN) :: xc_info
|
||||
INTEGER, INTENT(IN) :: func_id
|
||||
REAL(KIND=dp), DIMENSION(*), INTENT(IN) :: params
|
||||
SUBROUTINE xc_libxc_wrap_functional_set_params(xc_func, xc_info, params, no_exc)
|
||||
TYPE(xc_f03_func_t), INTENT(INOUT) :: xc_func
|
||||
TYPE(xc_f03_func_info_t), INTENT(IN) :: xc_info
|
||||
REAL(KIND=dp), DIMENSION(:), INTENT(IN), POINTER :: params
|
||||
LOGICAL, INTENT(INOUT) :: no_exc
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'xc_libxc_wrap_functional_set_params', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: handle
|
||||
INTEGER :: handle, i_params, n_params
|
||||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
!ToDo: This is dangerous, since wrong parameter ordering or missing ones
|
||||
! result in wrong numbers or a crash.
|
||||
! --> LibXC needs to provide more informations via a function.
|
||||
IF (params(1) < 0.99e20_dp) THEN
|
||||
SELECT CASE (func_id)
|
||||
CASE (XC_LDA_X)
|
||||
CALL xc_f90_lda_x_set_par(xc_func, params(1), NINT(params(2)), params(3))
|
||||
CASE (XC_LDA_C_XALPHA)
|
||||
CALL xc_f90_lda_c_xalpha_set_par(xc_func, params(1))
|
||||
CASE (XC_LDA_C_2D_PRM)
|
||||
CALL xc_f90_lda_c_2d_prm_set_par(xc_func, params(1))
|
||||
CASE (XC_LDA_C_1D_CSC)
|
||||
CALL xc_f90_lda_c_1d_csc_set_par(xc_func, NINT(params(1)), params(2))
|
||||
CASE (XC_LDA_X_1D)
|
||||
CALL xc_f90_lda_x_1d_set_par(xc_func, NINT(params(1)), params(2))
|
||||
CASE (XC_GGA_X_LB)
|
||||
CALL xc_f90_gga_lb_set_par(xc_func, NINT(params(1)), params(2), params(3), params(4))
|
||||
CASE (XC_MGGA_X_TB09)
|
||||
CALL xc_f90_mgga_x_tb09_set_par(xc_func, params(1))
|
||||
CASE (XC_HYB_GGA_XC_HSE03, XC_HYB_GGA_XC_HSE06)
|
||||
CALL xc_f90_hyb_gga_xc_hse_set_par(xc_func, params(1), params(2))
|
||||
CASE (XC_HYB_GGA_XC_HJS_PBE, XC_HYB_GGA_XC_HJS_PBE_SOL, &
|
||||
XC_HYB_GGA_XC_HJS_B88, XC_HYB_GGA_XC_HJS_B97X, &
|
||||
XC_GGA_X_HJS_PBE, XC_GGA_X_HJS_PBE_SOL, &
|
||||
XC_GGA_X_HJS_B88, XC_GGA_X_HJS_B97X)
|
||||
CALL xc_f90_gga_x_hjs_set_par(xc_func, params(1))
|
||||
CASE (XC_GGA_X_WPBEH)
|
||||
CALL xc_f90_gga_x_wpbeh_set_par(xc_func, params(1))
|
||||
END SELECT
|
||||
n_params = xc_f03_func_info_get_n_ext_params(xc_info)
|
||||
i_params = SIZE(params)
|
||||
|
||||
IF ((n_params > 0) .AND. (i_params > 0) .AND. (params(1) < HUGE(0.0_dp))) THEN
|
||||
IF (i_params == n_params) THEN
|
||||
CALL xc_f03_func_set_ext_params(xc_func, params) ! this is wrong, but XC's F90-interface is missing the '*'
|
||||
ELSE
|
||||
CALL cp_abort(__LOCATION__, &
|
||||
"LIBXC: Inconsistent number of optional external parameters. (required: "&
|
||||
&//cp_to_string(n_params)//", given: "//cp_to_string(i_params)//")")
|
||||
END IF
|
||||
END IF
|
||||
|
||||
IF (IAND(xc_f90_info_flags(xc_info), XC_FLAGS_HAVE_EXC) == XC_FLAGS_HAVE_EXC) THEN
|
||||
! SELECT CASE (func_id)
|
||||
! CASE (XC_LDA_X)
|
||||
! CALL xc_f03_lda_x_set_par(xc_func, params(1), NINT(params(2)), params(3))
|
||||
! CASE (XC_LDA_C_XALPHA)
|
||||
! CALL xc_f03_lda_c_xalpha_set_par(xc_func, params(1))
|
||||
! CASE (XC_LDA_C_2D_PRM)
|
||||
! CALL xc_f03_lda_c_2d_prm_set_par(xc_func, params(1))
|
||||
! CASE (XC_LDA_C_1D_CSC)
|
||||
! CALL xc_f03_lda_c_1d_csc_set_par(xc_func, NINT(params(1)), params(2))
|
||||
! CASE (XC_LDA_X_1D)
|
||||
! CALL xc_f03_lda_x_1d_set_par(xc_func, NINT(params(1)), params(2))
|
||||
! CASE (XC_GGA_X_LB)
|
||||
! CALL xc_f03_gga_lb_set_par(xc_func, NINT(params(1)), params(2), params(3), params(4))
|
||||
! CASE (XC_MGGA_X_TB09)
|
||||
! CALL xc_f03_mgga_x_tb09_set_par(xc_func, params(1))
|
||||
! CASE (XC_HYB_GGA_XC_HSE03, XC_HYB_GGA_XC_HSE06)
|
||||
! CALL xc_f03_hyb_gga_xc_hse_set_par(xc_func, params(1), params(2))
|
||||
! CASE (XC_HYB_GGA_XC_HJS_PBE, XC_HYB_GGA_XC_HJS_PBE_SOL, &
|
||||
! XC_HYB_GGA_XC_HJS_B88, XC_HYB_GGA_XC_HJS_B97X, &
|
||||
! XC_GGA_X_HJS_PBE, XC_GGA_X_HJS_PBE_SOL, &
|
||||
! XC_GGA_X_HJS_B88, XC_GGA_X_HJS_B97X)
|
||||
! CALL xc_f03_gga_x_hjs_set_par(xc_func, params(1))
|
||||
! CASE (XC_GGA_X_WPBEH)
|
||||
! CALL xc_f03_gga_x_wpbeh_set_par(xc_func, params(1))
|
||||
! END SELECT
|
||||
|
||||
IF (IAND(xc_f03_func_info_get_flags(xc_info), XC_FLAGS_HAVE_EXC) == XC_FLAGS_HAVE_EXC) THEN
|
||||
no_exc = .FALSE.
|
||||
ELSE
|
||||
no_exc = .TRUE.
|
||||
|
|
@ -557,113 +381,6 @@ CONTAINS
|
|||
|
||||
END SUBROUTINE xc_libxc_wrap_functional_set_params
|
||||
|
||||
! **************************************************************************************************
|
||||
!> \brief Wrapper for known buggy functionals.
|
||||
!> \param func_id ...
|
||||
!> \param grad_deriv ...
|
||||
!> \author A. Gloessa (agloess)
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE xc_libxc_wrap_functional_buggy(func_id, grad_deriv)
|
||||
!
|
||||
! BugFix information was taken from:
|
||||
!
|
||||
! http://www.tddft.org/programs/octopus/wiki/index.php/Libxc_changes
|
||||
!
|
||||
!
|
||||
! corrected with: 2.1.3 and 2.2.3
|
||||
! XC_GGA_X_N12, XC_GGA_C_N12, XC_GGA_C_N12_SX, XC_HYB_GGA_X_N12_SX,
|
||||
! XC_HYB_GGA_XC_O3LYP, XC_HYB_GGA_XC_X3LYP, XC_GGA_X_B88,
|
||||
! XC_GGA_X_OPTB88_VDW, XC_GGA_X_MB88, XC_GGA_K_LLP, XC_GGA_K_FR_B88,
|
||||
! XC_GGA_K_THAKKAR
|
||||
! + all XC_GGA_X_HJS_*
|
||||
! + all XC_HYB_GGA_XC_HJS_*
|
||||
! second order derivatives (XC_GGA_X_B88, XC_GGA_X_OPTB88_VDW,
|
||||
! XC_GGA_X_MB88, XC_GGA_K_LLP, XC_GGA_K_FR_B88, XC_GGA_K_THAKKAR)
|
||||
!
|
||||
! corrected with: 3.x.x
|
||||
! XC_MGGA_X_M11, XC_MGGA_X_M11_L, XC_HYB_MGGA_X_MS2H
|
||||
!
|
||||
!
|
||||
! Note, some variables were redefined between version 2.1.x and 3.x.x!
|
||||
!
|
||||
! XC_HYB_MGGA_X_M11 --> XC_MGGA_X_M11
|
||||
! XC_MGGA_X_MS2H --> XC_HYB_MGGA_X_MS2H
|
||||
!
|
||||
INTEGER, INTENT(IN) :: func_id
|
||||
INTEGER, INTENT(IN), OPTIONAL :: grad_deriv
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'xc_libxc_wrap_functional_buggy', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
||||
CHARACTER(LEN=256) :: func_name
|
||||
INTEGER :: handle, i, my_grad_deriv, nbuggy
|
||||
INTEGER, ALLOCATABLE, DIMENSION(:) :: buggy
|
||||
LOGICAL :: bug
|
||||
|
||||
CALL timeset(routineN, handle)
|
||||
|
||||
bug = .FALSE.
|
||||
my_grad_deriv = 0
|
||||
IF (PRESENT(grad_deriv)) my_grad_deriv = ABS(grad_deriv)
|
||||
SELECT CASE (libxc_version)
|
||||
#if ( XC_MAJOR_VERSION == 2)
|
||||
CASE ("2.1.2", "2.2.2")
|
||||
IF (my_grad_deriv == 2) THEN
|
||||
nbuggy = 23; ALLOCATE (buggy(nbuggy))
|
||||
buggy(:) = (/XC_GGA_X_N12, XC_GGA_C_N12, &
|
||||
XC_GGA_C_N12_SX, XC_HYB_GGA_X_N12_SX, XC_HYB_GGA_XC_O3LYP, &
|
||||
XC_HYB_GGA_XC_X3LYP, XC_GGA_X_B88, XC_GGA_X_OPTB88_VDW, &
|
||||
XC_GGA_X_MB88, XC_GGA_K_LLP, XC_GGA_K_FR_B88, XC_GGA_K_THAKKAR, &
|
||||
XC_HYB_MGGA_X_M11, XC_MGGA_X_M11_L, XC_MGGA_X_MS2H, &
|
||||
XC_GGA_X_HJS_PBE, XC_GGA_X_HJS_PBE_SOL, &
|
||||
XC_GGA_X_HJS_B88, XC_GGA_X_HJS_B97X, XC_HYB_GGA_XC_HJS_PBE, &
|
||||
XC_HYB_GGA_XC_HJS_PBE_SOL, XC_HYB_GGA_XC_HJS_B88, XC_HYB_GGA_XC_HJS_B97X/)
|
||||
ELSE
|
||||
nbuggy = 17; ALLOCATE (buggy(nbuggy))
|
||||
buggy(:) = (/XC_GGA_X_N12, XC_GGA_C_N12, &
|
||||
XC_GGA_C_N12_SX, XC_HYB_GGA_X_N12_SX, XC_HYB_GGA_XC_O3LYP, &
|
||||
XC_HYB_GGA_XC_X3LYP, &
|
||||
XC_HYB_MGGA_X_M11, XC_MGGA_X_M11_L, XC_MGGA_X_MS2H, &
|
||||
XC_GGA_X_HJS_PBE, XC_GGA_X_HJS_PBE_SOL, &
|
||||
XC_GGA_X_HJS_B88, XC_GGA_X_HJS_B97X, XC_HYB_GGA_XC_HJS_PBE, &
|
||||
XC_HYB_GGA_XC_HJS_PBE_SOL, XC_HYB_GGA_XC_HJS_B88, XC_HYB_GGA_XC_HJS_B97X/)
|
||||
END IF
|
||||
CASE ("2.1.3", "2.2.3")
|
||||
nbuggy = 3; ALLOCATE (buggy(nbuggy))
|
||||
buggy(:) = (/XC_HYB_MGGA_X_M11, XC_MGGA_X_M11_L, XC_MGGA_X_MS2H/)
|
||||
#endif
|
||||
CASE ("3.x.x")
|
||||
nbuggy = 0
|
||||
CASE default
|
||||
nbuggy = 0
|
||||
IF (first_time) THEN
|
||||
CALL cp_warn(__LOCATION__, &
|
||||
" This version ("//TRIM(libxc_version)//") of LibXC is new or unknown."// &
|
||||
" ======== Please check the results carefully. ======== "// &
|
||||
" More informations on bugfixes can be found at: "// &
|
||||
" http://www.tddft.org/programs/octopus/wiki/index.php/Libxc_changes"// &
|
||||
" Calculation continues using unsupported LibXC version. ")
|
||||
first_time = .FALSE.
|
||||
END IF
|
||||
END SELECT
|
||||
|
||||
DO i = 1, nbuggy
|
||||
IF (func_id == buggy(i)) THEN
|
||||
bug = .TRUE.
|
||||
END IF
|
||||
END DO
|
||||
|
||||
IF (bug) THEN
|
||||
CALL xc_f90_functional_get_name(func_id, func_name)
|
||||
CALL cp_abort(__LOCATION__, TRIM(func_name)//": deactivated since buggy in version "// &
|
||||
TRIM(libxc_version)//" of LibXC.")
|
||||
END IF
|
||||
|
||||
IF (ALLOCATED(buggy)) DEALLOCATE (buggy)
|
||||
|
||||
CALL timestop(handle)
|
||||
|
||||
END SUBROUTINE xc_libxc_wrap_functional_buggy
|
||||
#endif
|
||||
#endif
|
||||
END MODULE xc_libxc_wrap
|
||||
|
|
|
|||
|
|
@ -775,7 +775,7 @@ CONTAINS
|
|||
END DO
|
||||
CPABORT("Drho collocation not implemented")
|
||||
CASE default
|
||||
CPABORT("")
|
||||
CPABORT("Derivatives using PW are not implemented for this 'XC_DERIV'")
|
||||
END SELECT
|
||||
CALL pw_pool_give_back_pw(pw_pool, tmp_g)
|
||||
IF (my_rho_g_local) THEN
|
||||
|
|
|
|||
|
|
@ -10,8 +10,11 @@ MODULE xc_write_output
|
|||
|
||||
USE input_constants, ONLY: xc_none
|
||||
USE input_cp2k_check, ONLY: xc_functionals_expand
|
||||
USE input_section_types, ONLY: section_vals_get_subs_vals,&
|
||||
USE input_section_types, ONLY: section_vals_duplicate,&
|
||||
section_vals_get,&
|
||||
section_vals_get_subs_vals,&
|
||||
section_vals_get_subs_vals2,&
|
||||
section_vals_release,&
|
||||
section_vals_type,&
|
||||
section_vals_val_get
|
||||
USE kinds, ONLY: default_string_length
|
||||
|
|
@ -45,10 +48,8 @@ CONTAINS
|
|||
CHARACTER(LEN=10*default_string_length) :: reference
|
||||
CHARACTER(LEN=2*default_string_length) :: shortform
|
||||
CHARACTER(LEN=20) :: tmpStr
|
||||
CHARACTER(LEN=default_string_length), &
|
||||
DIMENSION(:), POINTER :: func_name
|
||||
INTEGER :: ifun, ifunc_name, il, myfun
|
||||
TYPE(section_vals_type), POINTER :: xc_fun, xc_fun_section
|
||||
INTEGER :: i_rep, ifun, il, myfun, n_rep
|
||||
TYPE(section_vals_type), POINTER :: libxc_fun, xc_fun, xc_fun_section
|
||||
|
||||
IF (output_unit > 0) THEN
|
||||
|
||||
|
|
@ -66,26 +67,24 @@ CONTAINS
|
|||
ifun = ifun+1
|
||||
xc_fun => section_vals_get_subs_vals2(xc_fun_section, i_section=ifun)
|
||||
IF (.NOT. ASSOCIATED(xc_fun)) EXIT
|
||||
CALL xc_functional_get_info(xc_fun, &
|
||||
lsd=lsd, &
|
||||
reference=reference, &
|
||||
shortform=shortform, &
|
||||
ifunc_name=1)
|
||||
IF (TRIM(xc_fun%section%name) == "LIBXC") THEN
|
||||
CALL libxc_version_info(tmpStr)
|
||||
WRITE (output_unit, fmt="(A,A,A)") ' FUNCTIONAL| LIBXC Vers. ', TRIM(tmpStr(1:5)), &
|
||||
' (Marques, Oliveira, Burnus, CPC 183, 2272 (2012))'
|
||||
WRITE (output_unit, fmt="(' FUNCTIONAL| ',a,':')") TRIM(shortform)
|
||||
IF (TRIM(xc_fun%section%name) /= "LIBXC") THEN
|
||||
CALL xc_functional_get_info(xc_fun, lsd=lsd, reference=reference, shortform=shortform)
|
||||
WRITE (output_unit, fmt="(' FUNCTIONAL| ',a,':')") &
|
||||
TRIM(xc_fun%section%name)
|
||||
DO il = 1, LEN_TRIM(reference), 67
|
||||
WRITE (output_unit, fmt="(' FUNCTIONAL| ',a67)") reference(il:)
|
||||
END DO
|
||||
CALL section_vals_val_get(xc_fun, "functional", c_vals=func_name)
|
||||
DO ifunc_name = 2, SIZE(func_name)
|
||||
CALL xc_functional_get_info(xc_fun, &
|
||||
lsd=lsd, &
|
||||
reference=reference, &
|
||||
shortform=shortform, &
|
||||
ifunc_name=ifunc_name)
|
||||
ELSE
|
||||
! LIBXC is the only repeatable functional section - for each we need
|
||||
! NOT the single values, but the whole section_vals_type independently
|
||||
CALL section_vals_get(xc_fun, n_repetition=n_rep)
|
||||
DO i_rep = 1, n_rep
|
||||
NULLIFY (libxc_fun)
|
||||
CALL section_vals_duplicate(xc_fun, libxc_fun, i_rep_start=i_rep, i_rep_end=i_rep)
|
||||
IF (.NOT. ASSOCIATED(libxc_fun)) EXIT
|
||||
CALL xc_functional_get_info(libxc_fun, lsd=lsd, reference=reference, shortform=shortform)
|
||||
CALL section_vals_release(libxc_fun)
|
||||
CALL libxc_version_info(tmpStr)
|
||||
WRITE (output_unit, fmt="(A,A,A)") ' FUNCTIONAL| LIBXC Vers. ', TRIM(tmpStr(1:5)), &
|
||||
' (Marques, Oliveira, Burnus, CPC 183, 2272 (2012))'
|
||||
WRITE (output_unit, fmt="(' FUNCTIONAL| ',a,':')") TRIM(shortform)
|
||||
|
|
@ -93,12 +92,6 @@ CONTAINS
|
|||
WRITE (output_unit, fmt="(' FUNCTIONAL| ',a67)") reference(il:)
|
||||
END DO
|
||||
END DO
|
||||
ELSE
|
||||
WRITE (output_unit, fmt="(' FUNCTIONAL| ',a,':')") &
|
||||
TRIM(xc_fun%section%name)
|
||||
DO il = 1, LEN_TRIM(reference), 67
|
||||
WRITE (output_unit, fmt="(' FUNCTIONAL| ',a67)") reference(il:)
|
||||
END DO
|
||||
END IF
|
||||
END DO
|
||||
ELSE
|
||||
|
|
|
|||
|
|
@ -23,7 +23,10 @@
|
|||
&XC
|
||||
&XC_FUNCTIONAL
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_X_RPW86 XC_GGA_C_PBE
|
||||
FUNCTIONAL XC_GGA_X_RPW86
|
||||
&END LIBXC
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_C_PBE
|
||||
&END LIBXC
|
||||
&END XC_FUNCTIONAL
|
||||
&vdW_POTENTIAL
|
||||
|
|
|
|||
|
|
@ -23,7 +23,10 @@
|
|||
&XC
|
||||
&XC_FUNCTIONAL
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_X_RPW86 XC_GGA_C_PBE
|
||||
FUNCTIONAL XC_GGA_X_RPW86
|
||||
&END LIBXC
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_C_PBE
|
||||
&END LIBXC
|
||||
&END XC_FUNCTIONAL
|
||||
&vdW_POTENTIAL
|
||||
|
|
|
|||
|
|
@ -26,7 +26,10 @@
|
|||
&END XC_GRID
|
||||
&XC_FUNCTIONAL
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_X_RPW86 XC_GGA_C_PBE
|
||||
FUNCTIONAL XC_GGA_X_RPW86
|
||||
&END LIBXC
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_C_PBE
|
||||
&END LIBXC
|
||||
&END XC_FUNCTIONAL
|
||||
&vdW_POTENTIAL
|
||||
|
|
|
|||
|
|
@ -29,7 +29,10 @@
|
|||
&XC
|
||||
&XC_FUNCTIONAL
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_LDA_X XC_LDA_C_VWN
|
||||
FUNCTIONAL XC_LDA_X
|
||||
&END LIBXC
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_LDA_C_VWN
|
||||
&END LIBXC
|
||||
&END XC_FUNCTIONAL
|
||||
&XC_GRID
|
||||
|
|
@ -40,7 +43,10 @@
|
|||
&XC
|
||||
&XC_FUNCTIONAL
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_LDA_X XC_LDA_C_VWN
|
||||
FUNCTIONAL XC_LDA_X
|
||||
&END LIBXC
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_LDA_C_VWN
|
||||
&END LIBXC
|
||||
&END XC_FUNCTIONAL
|
||||
&END XC
|
||||
|
|
|
|||
|
|
@ -30,7 +30,10 @@
|
|||
&XC
|
||||
&XC_FUNCTIONAL
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_LDA_X XC_LDA_C_VWN
|
||||
FUNCTIONAL XC_LDA_X
|
||||
&END LIBXC
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_LDA_C_VWN
|
||||
&END LIBXC
|
||||
&END XC_FUNCTIONAL
|
||||
&XC_GRID
|
||||
|
|
@ -41,7 +44,10 @@
|
|||
&XC
|
||||
&XC_FUNCTIONAL
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_LDA_X XC_LDA_C_VWN
|
||||
FUNCTIONAL XC_LDA_X
|
||||
&END LIBXC
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_LDA_C_VWN
|
||||
&END LIBXC
|
||||
&END XC_FUNCTIONAL
|
||||
&END XC
|
||||
|
|
|
|||
|
|
@ -29,7 +29,10 @@
|
|||
&XC
|
||||
&XC_FUNCTIONAL
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_X_PBE XC_GGA_C_PBE
|
||||
FUNCTIONAL XC_GGA_X_PBE
|
||||
&END LIBXC
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_C_PBE
|
||||
&END LIBXC
|
||||
&END XC_FUNCTIONAL
|
||||
&XC_GRID
|
||||
|
|
@ -40,7 +43,10 @@
|
|||
&XC
|
||||
&XC_FUNCTIONAL
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_X_PBE XC_GGA_C_PBE
|
||||
FUNCTIONAL XC_GGA_X_PBE
|
||||
&END LIBXC
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_C_PBE
|
||||
&END LIBXC
|
||||
&END XC_FUNCTIONAL
|
||||
&END XC
|
||||
|
|
|
|||
|
|
@ -30,7 +30,10 @@
|
|||
&XC
|
||||
&XC_FUNCTIONAL
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_X_PBE XC_GGA_C_PBE
|
||||
FUNCTIONAL XC_GGA_X_PBE
|
||||
&END LIBXC
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_C_PBE
|
||||
&END LIBXC
|
||||
&END XC_FUNCTIONAL
|
||||
&XC_GRID
|
||||
|
|
@ -41,7 +44,10 @@
|
|||
&XC
|
||||
&XC_FUNCTIONAL
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_X_PBE XC_GGA_C_PBE
|
||||
FUNCTIONAL XC_GGA_X_PBE
|
||||
&END LIBXC
|
||||
&LIBXC
|
||||
FUNCTIONAL XC_GGA_C_PBE
|
||||
&END LIBXC
|
||||
&END XC_FUNCTIONAL
|
||||
&END XC
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ c332f08648ec2bc7ccce83e45a84776215aa5dfebc64fae2a23f2ac546d41ea4 *libxc-2.0.1.ta
|
|||
6ca1d0bb5fdc341d59960707bc67f23ad54de8a6018e19e02eee2b16ea7cc642 *libxc-2.2.2.tar.gz
|
||||
5542b99042c09b2925f2e3700d769cda4fb411b476d446c833ea28c6bfa8792a *libxc-3.0.0.tar.gz
|
||||
85aec0799bb77c0eca13f11b7124601d4b2ba5961dd390a98a3163fc9f1dbae7 *libxc-4.0.3.tar.gz
|
||||
f63f0d67eca45ca0cde4c53bc4b340146f5323dcdbf1f679f13b86623be383d0 *libxc-4.0.4.tar.gz
|
||||
37c3ba2d3cd3f4ea239497d9d34bd57a663a34e2ea25099c2cbef118c9156587 *mpich-3.1.2.tar.gz
|
||||
0778679a6b693d7b7caff37ff9d2856dc2bfc51318bf8373859bfa74253da3dc *mpich-3.2.tar.gz
|
||||
f2d9a231b7cf97f1fee6e8c9663113ebf6c240d407d3c118c55b3633d6be6e5f *parmetis-4.0.3.tar.gz
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue