24 #include <xc_version.h>
26 #if (XC_MAJOR_VERSION < 5 || (XC_MAJOR_VERSION == 5 && XC_MINOR_VERSION < 1))
27 this version of
cp2k only works with libxc versions 5.1.0 and above.
28 furthermore, -i${libxc_dir}/include needs to be added to fcflags.
33 USE xc_f03_lib_m,
ONLY: xc_f03_func_end, &
35 xc_f03_functional_get_name, &
36 xc_f03_func_set_ext_params, &
37 xc_f03_functional_get_number, &
38 xc_f03_available_functional_numbers, &
39 xc_f03_available_functional_names, &
40 xc_f03_maximum_name_length, &
41 xc_f03_number_of_functionals, &
45 xc_f03_gga_exc_vxc_fxc, &
50 xc_f03_func_get_info, &
51 xc_f03_func_info_get_family, &
52 xc_f03_func_info_get_kind, &
53 xc_f03_func_info_get_name, &
54 xc_f03_func_info_get_references, &
55 xc_f03_func_info_get_flags, &
56 xc_f03_func_info_get_n_ext_params, &
57 xc_f03_func_info_get_ext_params_name, &
58 xc_f03_func_info_get_ext_params_default_value, &
59 xc_f03_func_info_get_ext_params_description, &
61 xc_f03_func_reference_get_ref, &
62 xc_f03_func_reference_get_doi, &
64 xc_f03_lda => xc_f03_lda_exc_vxc_fxc_kxc, &
67 xc_f03_lda_exc_vxc_fxc, &
72 xc_f03_mgga => xc_f03_mgga_exc_vxc_fxc, &
74 xc_f03_mgga_exc_vxc, &
77 xc_f03_mgga_vxc_fxc, &
81 xc_f03_func_reference_t, &
95 xc_exchange_correlation, &
98 xc_flags_needs_laplacian, &
107 #include "../base/base_uses.f90"
112 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xc_libxc_wrap'
114 CHARACTER(LEN=*),
PARAMETER,
PUBLIC :: libxc_version = xc_version
116 PUBLIC :: xc_f03_func_t, xc_f03_func_info_t
117 PUBLIC :: xc_f03_func_init, xc_f03_func_end
118 PUBLIC :: xc_f03_functional_get_name, xc_f03_available_functional_numbers, xc_f03_maximum_name_length, &
119 xc_f03_number_of_functionals, xc_f03_available_functional_names
120 PUBLIC :: xc_f03_func_get_info, xc_f03_func_info_get_family, xc_f03_func_info_get_kind, &
121 xc_f03_func_info_get_name, xc_f03_func_info_get_ext_params_name, &
122 xc_f03_func_info_get_ext_params_description, xc_f03_func_info_get_ext_params_default_value, &
123 xc_f03_func_info_get_n_ext_params
124 PUBLIC :: xc_f03_gga_exc, xc_f03_gga_exc_vxc, xc_f03_gga_exc_vxc_fxc, xc_f03_gga_fxc, &
125 xc_f03_gga_vxc, xc_f03_gga_vxc_fxc
126 PUBLIC :: xc_f03_lda, &
127 xc_f03_lda_exc, xc_f03_lda_exc_vxc, xc_f03_lda_exc_vxc_fxc, &
128 xc_f03_lda_fxc, xc_f03_lda_kxc, xc_f03_lda_vxc
129 PUBLIC :: xc_f03_mgga, xc_f03_mgga_exc, xc_f03_mgga_exc_vxc, xc_f03_mgga_fxc, &
130 xc_f03_mgga_vxc, xc_f03_mgga_vxc_fxc
132 PUBLIC :: xc_family_lda, xc_family_gga, xc_family_mgga, &
133 xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga
135 PUBLIC :: xc_unpolarized, xc_polarized
137 PUBLIC :: xc_exchange, xc_correlation, xc_exchange_correlation, xc_kinetic
140 PUBLIC :: xc_libxc_wrap_info_refs, &
141 xc_libxc_wrap_version, &
142 xc_libxc_wrap_functional_get_number, &
143 xc_libxc_wrap_needs_laplace, &
144 xc_libxc_wrap_functional_set_params, &
145 xc_libxc_wrap_is_under_development, &
146 xc_libxc_get_reference_length, &
147 xc_libxc_check_functional
157 FUNCTION xc_libxc_get_reference_length(xc_info)
RESULT(length)
159 TYPE(xc_f03_func_info_t),
INTENT(IN) :: xc_info
162 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_get_reference_length'
163 INTEGER,
PARAMETER :: maxlen = 67
165 CHARACTER(LEN=128) :: descr_string
166 CHARACTER(LEN=1024) :: doi_string, ref_string
167 INTEGER :: i, i_ref, i_ref_old, n_params, handle
168 TYPE(xc_f03_func_reference_t) :: xc_ref
170 CALL timeset(routinen, handle)
176 DO WHILE (i_ref >= 0 .AND. i_ref /= i_ref_old)
178 xc_ref = xc_f03_func_info_get_references(xc_info, i_ref)
179 ref_string = xc_f03_func_reference_get_ref(xc_ref)
180 doi_string = xc_f03_func_reference_get_doi(xc_ref)
181 length = length + len_trim(ref_string) + len_trim(doi_string) + 11
182 IF (mod(length, maxlen) /= 0) length = length + maxlen - mod(length, maxlen)
184 n_params = xc_f03_func_info_get_n_ext_params(xc_info)
185 IF (n_params > 0)
THEN
186 length = length + maxlen
189 descr_string = xc_f03_func_info_get_ext_params_description(xc_info, i - 1)
190 length = length + len_trim(descr_string) + 3
191 IF (mod(length, maxlen) /= 0) length = length + maxlen - mod(length, maxlen)
196 length = length + 2*maxlen
198 CALL timestop(handle)
200 END FUNCTION xc_libxc_get_reference_length
211 SUBROUTINE xc_libxc_wrap_info_refs(xc_info, polarized, sc, reference)
212 TYPE(xc_f03_func_info_t),
INTENT(IN) :: xc_info
213 INTEGER,
INTENT(IN) :: polarized
214 REAL(KIND=
dp),
INTENT(IN) :: sc
215 CHARACTER(LEN=*),
INTENT(OUT) :: reference
217 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_wrap_info_refs'
218 INTEGER,
PARAMETER :: maxlen = 67
220 CHARACTER(LEN=128) :: descr_string
221 CHARACTER(LEN=1028) :: doi_string, ref_string
223 CHARACTER(LEN=2067) :: tmp_string
224 INTEGER :: empty, first, handle, i, i_ref, i_ref_old, idx, &
226 TYPE(xc_f03_func_reference_t) :: xc_ref
228 CALL timeset(routinen, handle)
234 DO WHILE (i_ref >= 0 .AND. i_ref /= i_ref_old)
236 xc_ref = xc_f03_func_info_get_references(xc_info, i_ref)
237 ref_string = xc_f03_func_reference_get_ref(xc_ref)
238 doi_string = xc_f03_func_reference_get_doi(xc_ref)
239 WRITE (tmp_string,
'(a1,i1,a2,a,a7,a)')
'[', idx,
'] ', &
240 trim(ref_string),
', doi: ', trim(doi_string)
241 last = first + len_trim(tmp_string) - 1
242 reference(first:last) = trim(tmp_string)
244 empty = last + (maxlen - 1) - mod(last - 1, maxlen)
246 IF (empty /= last)
THEN
247 reference(first:empty) =
' '
251 n_params = xc_f03_func_info_get_n_ext_params(xc_info)
252 IF (n_params > 0)
THEN
253 reference(first:first + maxlen - 1) =
'Optional external parameters:'//repeat(
' ', maxlen - 28)
254 first = first + maxlen
257 descr_string = xc_f03_func_info_get_ext_params_description(xc_info, i - 1)
258 last = first + len_trim(descr_string) - 1 + 3
259 reference(first:last) =
' * '//trim(descr_string)
261 empty = last + (maxlen - 1) - mod(last - 1, maxlen)
264 IF (empty /= last)
THEN
265 reference(first:empty) =
' '
272 SELECT CASE (polarized)
273 CASE (xc_unpolarized)
274 WRITE (tmp_string,
"('{scale=',f5.3,', spin-unpolarized}')") sc
276 WRITE (tmp_string,
"('{scale=',f5.3,', spin-polarized}')") sc
278 cpabort(
"Unsupported value for variable 'polarized'.")
280 last = first + len_trim(tmp_string) - 1
281 reference(first:last) = trim(tmp_string)
284 reference(first:len(reference)) =
' '
286 IF (last > len(reference)) &
287 cpabort(
"Faulty reference length.")
289 CALL timestop(handle)
291 END SUBROUTINE xc_libxc_wrap_info_refs
299 SUBROUTINE xc_libxc_wrap_version(version)
300 CHARACTER(LEN=*),
INTENT(OUT) :: version
302 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_wrap_version'
306 CALL timeset(routinen, handle)
308 version = trim(libxc_version)
310 CALL timestop(handle)
312 END SUBROUTINE xc_libxc_wrap_version
326 LOGICAL FUNCTION xc_libxc_check_functional(func_string)
RESULT(exists)
327 CHARACTER(LEN=*),
INTENT(IN) :: func_string
329 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_check_functional'
331 INTEGER :: func_id, handle
333 CALL timeset(routinen, handle)
335 IF (func_string(1:3) ==
"XC_")
THEN
336 func_id = xc_f03_functional_get_number(func_string(4:len_trim(func_string)))
338 func_id = xc_f03_functional_get_number(func_string(1:len_trim(func_string)))
342 IF (func_id == -1) exists = .false.
344 CALL timestop(handle)
346 END FUNCTION xc_libxc_check_functional
360 INTEGER FUNCTION xc_libxc_wrap_functional_get_number(func_string)
RESULT(func_id)
361 CHARACTER(LEN=*),
INTENT(IN) :: func_string
363 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_wrap_functional_get_number'
367 CALL timeset(routinen, handle)
369 IF (func_string(1:3) ==
"XC_")
THEN
370 func_id = xc_f03_functional_get_number(func_string(4:len_trim(func_string)))
372 func_id = xc_f03_functional_get_number(func_string(1:len_trim(func_string)))
374 IF (func_id == -1)
THEN
375 cpabort(trim(func_string)//
": wrong functional name")
378 CALL timestop(handle)
380 END FUNCTION xc_libxc_wrap_functional_get_number
389 LOGICAL FUNCTION xc_libxc_wrap_is_under_development(xc_info)
390 TYPE(xc_f03_func_info_t) :: xc_info
392 IF (iand(xc_f03_func_info_get_flags(xc_info), xc_flags_development) == xc_flags_development)
THEN
393 xc_libxc_wrap_is_under_development = .true.
395 xc_libxc_wrap_is_under_development = .false.
398 END FUNCTION xc_libxc_wrap_is_under_development
408 LOGICAL FUNCTION xc_libxc_wrap_needs_laplace(func_id)
410 INTEGER,
INTENT(IN) :: func_id
412 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_wrap_needs_laplace'
415 TYPE(xc_f03_func_info_t) :: xc_info
416 TYPE(xc_f03_func_t) :: xc_func
418 CALL timeset(routinen, handle)
430 CALL xc_f03_func_init(xc_func, func_id, xc_unpolarized)
431 xc_info = xc_f03_func_get_info(xc_func)
434 IF (iand(xc_f03_func_info_get_flags(xc_info), xc_flags_needs_laplacian) == xc_flags_needs_laplacian)
THEN
435 xc_libxc_wrap_needs_laplace = .true.
437 xc_libxc_wrap_needs_laplace = .false.
440 CALL xc_f03_func_end(xc_func)
442 CALL timestop(handle)
444 END FUNCTION xc_libxc_wrap_needs_laplace
455 SUBROUTINE xc_libxc_wrap_functional_set_params(xc_func, xc_info, libxc_params, no_exc)
456 TYPE(xc_f03_func_t),
INTENT(INOUT) :: xc_func
457 TYPE(xc_f03_func_info_t),
INTENT(IN) :: xc_info
458 TYPE(section_vals_type),
POINTER,
INTENT(IN) :: libxc_params
459 LOGICAL,
INTENT(INOUT) :: no_exc
461 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_wrap_functional_set_params'
463 INTEGER :: handle, i, n_params
464 REAL(KIND=
dp),
DIMENSION(:),
ALLOCATABLE :: params
465 CHARACTER(LEN=128) :: param_name
467 CALL timeset(routinen, handle)
469 n_params = xc_f03_func_info_get_n_ext_params(xc_info)
470 IF (n_params > 0)
THEN
471 ALLOCATE (params(n_params))
473 param_name = xc_f03_func_info_get_ext_params_name(xc_info, i - 1)
478 CALL xc_f03_func_set_ext_params(xc_func, params)
481 IF (iand(xc_f03_func_info_get_flags(xc_info), xc_flags_have_exc) == xc_flags_have_exc)
THEN
487 CALL timestop(handle)
489 END SUBROUTINE xc_libxc_wrap_functional_set_params
program cp2k
Main program of CP2K.
various routines to log and control the output. The idea is that decisions about where to log should ...
Defines the basic variable types.
integer, parameter, public dp
Includes all necessary routines, functions and parameters from libxc. Provides CP2K routines/function...