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"
113 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xc_libxc_wrap'
115 CHARACTER(LEN=*),
PARAMETER,
PUBLIC :: libxc_version = xc_version
117 PUBLIC :: xc_f03_func_t, xc_f03_func_info_t
118 PUBLIC :: xc_f03_func_init, xc_f03_func_end
119 PUBLIC :: xc_f03_functional_get_name, xc_f03_available_functional_numbers, xc_f03_maximum_name_length, &
120 xc_f03_number_of_functionals, xc_f03_available_functional_names
121 PUBLIC :: xc_f03_func_get_info, xc_f03_func_info_get_family, xc_f03_func_info_get_kind, &
122 xc_f03_func_info_get_name, xc_f03_func_info_get_ext_params_name, &
123 xc_f03_func_info_get_ext_params_description, xc_f03_func_info_get_ext_params_default_value, &
124 xc_f03_func_info_get_n_ext_params
125 PUBLIC :: xc_f03_gga_exc, xc_f03_gga_exc_vxc, xc_f03_gga_exc_vxc_fxc, xc_f03_gga_fxc, &
126 xc_f03_gga_vxc, xc_f03_gga_vxc_fxc
127 PUBLIC :: xc_f03_lda, &
128 xc_f03_lda_exc, xc_f03_lda_exc_vxc, xc_f03_lda_exc_vxc_fxc, &
129 xc_f03_lda_fxc, xc_f03_lda_kxc, xc_f03_lda_vxc
130 PUBLIC :: xc_f03_mgga, xc_f03_mgga_exc, xc_f03_mgga_exc_vxc, xc_f03_mgga_fxc, &
131 xc_f03_mgga_vxc, xc_f03_mgga_vxc_fxc
133 PUBLIC :: xc_family_lda, xc_family_gga, xc_family_mgga, &
134 xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga
136 PUBLIC :: xc_unpolarized, xc_polarized
138 PUBLIC :: xc_exchange, xc_correlation, xc_exchange_correlation, xc_kinetic
141 PUBLIC :: xc_libxc_wrap_info_refs, &
142 xc_libxc_wrap_version, &
143 xc_libxc_wrap_functional_get_number, &
144 xc_libxc_wrap_needs_laplace, &
145 xc_libxc_wrap_functional_set_params, &
146 xc_libxc_wrap_is_under_development, &
147 xc_libxc_get_reference_length, &
148 xc_libxc_check_functional
158 FUNCTION xc_libxc_get_reference_length(xc_info)
RESULT(length)
160 TYPE(xc_f03_func_info_t),
INTENT(IN) :: xc_info
163 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_get_reference_length'
164 INTEGER,
PARAMETER :: maxlen = 67
166 CHARACTER(LEN=128) :: descr_string
167 CHARACTER(LEN=1024) :: doi_string, ref_string
168 INTEGER :: i, i_ref, i_ref_old, n_params, handle
169 TYPE(xc_f03_func_reference_t) :: xc_ref
171 CALL timeset(routinen, handle)
177 DO WHILE (i_ref >= 0 .AND. i_ref /= i_ref_old)
179 xc_ref = xc_f03_func_info_get_references(xc_info, i_ref)
180 ref_string = xc_f03_func_reference_get_ref(xc_ref)
181 doi_string = xc_f03_func_reference_get_doi(xc_ref)
182 length = length + len_trim(ref_string) + len_trim(doi_string) + 11
183 IF (mod(length, maxlen) /= 0) length = length + maxlen - mod(length, maxlen)
185 n_params = xc_f03_func_info_get_n_ext_params(xc_info)
186 IF (n_params > 0)
THEN
187 length = length + maxlen
190 descr_string = xc_f03_func_info_get_ext_params_description(xc_info, i - 1)
191 length = length + len_trim(descr_string) + 3
192 IF (mod(length, maxlen) /= 0) length = length + maxlen - mod(length, maxlen)
197 length = length + 2*maxlen
199 CALL timestop(handle)
201 END FUNCTION xc_libxc_get_reference_length
212 SUBROUTINE xc_libxc_wrap_info_refs(xc_info, polarized, sc, reference)
213 TYPE(xc_f03_func_info_t),
INTENT(IN) :: xc_info
214 INTEGER,
INTENT(IN) :: polarized
215 REAL(KIND=
dp),
INTENT(IN) :: sc
216 CHARACTER(LEN=*),
INTENT(OUT) :: reference
218 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_wrap_info_refs'
219 INTEGER,
PARAMETER :: maxlen = 67
221 CHARACTER(LEN=128) :: descr_string
222 CHARACTER(LEN=1028) :: doi_string, ref_string
224 CHARACTER(LEN=2067) :: tmp_string
225 INTEGER :: empty, first, handle, i, i_ref, i_ref_old, idx, &
227 TYPE(xc_f03_func_reference_t) :: xc_ref
229 CALL timeset(routinen, handle)
235 DO WHILE (i_ref >= 0 .AND. i_ref /= i_ref_old)
237 xc_ref = xc_f03_func_info_get_references(xc_info, i_ref)
238 ref_string = xc_f03_func_reference_get_ref(xc_ref)
239 doi_string = xc_f03_func_reference_get_doi(xc_ref)
240 WRITE (tmp_string,
'(a1,i1,a2,a,a7,a)')
'[', idx,
'] ', &
241 trim(ref_string),
', doi: ', trim(doi_string)
242 last = first + len_trim(tmp_string) - 1
243 reference(first:last) = trim(tmp_string)
245 empty = last + (maxlen - 1) - mod(last - 1, maxlen)
247 IF (empty /= last)
THEN
248 reference(first:empty) =
' '
252 n_params = xc_f03_func_info_get_n_ext_params(xc_info)
253 IF (n_params > 0)
THEN
254 reference(first:first + maxlen - 1) =
'Optional external parameters:'//repeat(
' ', maxlen - 28)
255 first = first + maxlen
258 descr_string = xc_f03_func_info_get_ext_params_description(xc_info, i - 1)
259 last = first + len_trim(descr_string) - 1 + 3
260 reference(first:last) =
' * '//trim(descr_string)
262 empty = last + (maxlen - 1) - mod(last - 1, maxlen)
265 IF (empty /= last)
THEN
266 reference(first:empty) =
' '
273 SELECT CASE (polarized)
274 CASE (xc_unpolarized)
275 WRITE (tmp_string,
"('{scale=',f5.3,', spin-unpolarized}')") sc
277 WRITE (tmp_string,
"('{scale=',f5.3,', spin-polarized}')") sc
279 cpabort(
"Unsupported value for variable 'polarized'.")
281 last = first + len_trim(tmp_string) - 1
282 reference(first:last) = trim(tmp_string)
285 reference(first:len(reference)) =
' '
287 IF (last > len(reference)) &
288 cpabort(
"Faulty reference length.")
290 CALL timestop(handle)
292 END SUBROUTINE xc_libxc_wrap_info_refs
300 SUBROUTINE xc_libxc_wrap_version(version)
301 CHARACTER(LEN=*),
INTENT(OUT) :: version
303 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_wrap_version'
307 CALL timeset(routinen, handle)
309 version = trim(libxc_version)
311 CALL timestop(handle)
313 END SUBROUTINE xc_libxc_wrap_version
327 LOGICAL FUNCTION xc_libxc_check_functional(func_string)
RESULT(exists)
328 CHARACTER(LEN=*),
INTENT(IN) :: func_string
330 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_check_functional'
332 INTEGER :: func_id, handle
334 CALL timeset(routinen, handle)
336 IF (func_string(1:3) ==
"XC_")
THEN
337 func_id = xc_f03_functional_get_number(func_string(4:len_trim(func_string)))
339 func_id = xc_f03_functional_get_number(func_string(1:len_trim(func_string)))
343 IF (func_id == -1) exists = .false.
345 CALL timestop(handle)
347 END FUNCTION xc_libxc_check_functional
361 INTEGER FUNCTION xc_libxc_wrap_functional_get_number(func_string)
RESULT(func_id)
362 CHARACTER(LEN=*),
INTENT(IN) :: func_string
364 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_wrap_functional_get_number'
368 CALL timeset(routinen, handle)
370 IF (func_string(1:3) ==
"XC_")
THEN
371 func_id = xc_f03_functional_get_number(func_string(4:len_trim(func_string)))
373 func_id = xc_f03_functional_get_number(func_string(1:len_trim(func_string)))
375 IF (func_id == -1)
THEN
376 cpabort(trim(func_string)//
": wrong functional name")
379 CALL timestop(handle)
381 END FUNCTION xc_libxc_wrap_functional_get_number
390 LOGICAL FUNCTION xc_libxc_wrap_is_under_development(xc_info)
391 TYPE(xc_f03_func_info_t) :: xc_info
393 IF (iand(xc_f03_func_info_get_flags(xc_info), xc_flags_development) == xc_flags_development)
THEN
394 xc_libxc_wrap_is_under_development = .true.
396 xc_libxc_wrap_is_under_development = .false.
399 END FUNCTION xc_libxc_wrap_is_under_development
409 LOGICAL FUNCTION xc_libxc_wrap_needs_laplace(func_id)
411 INTEGER,
INTENT(IN) :: func_id
413 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_wrap_needs_laplace'
416 TYPE(xc_f03_func_info_t) :: xc_info
417 TYPE(xc_f03_func_t) :: xc_func
419 CALL timeset(routinen, handle)
431 CALL xc_f03_func_init(xc_func, func_id, xc_unpolarized)
432 xc_info = xc_f03_func_get_info(xc_func)
435 IF (iand(xc_f03_func_info_get_flags(xc_info), xc_flags_needs_laplacian) == xc_flags_needs_laplacian)
THEN
436 xc_libxc_wrap_needs_laplace = .true.
438 xc_libxc_wrap_needs_laplace = .false.
441 CALL xc_f03_func_end(xc_func)
443 CALL timestop(handle)
445 END FUNCTION xc_libxc_wrap_needs_laplace
456 SUBROUTINE xc_libxc_wrap_functional_set_params(xc_func, xc_info, libxc_params, no_exc)
457 TYPE(xc_f03_func_t),
INTENT(INOUT) :: xc_func
458 TYPE(xc_f03_func_info_t),
INTENT(IN) :: xc_info
459 TYPE(section_vals_type),
POINTER,
INTENT(IN) :: libxc_params
460 LOGICAL,
INTENT(INOUT) :: no_exc
462 CHARACTER(LEN=*),
PARAMETER :: routineN =
'xc_libxc_wrap_functional_set_params'
464 INTEGER :: handle, i, n_params
465 REAL(KIND=
dp),
DIMENSION(:),
ALLOCATABLE :: params
466 CHARACTER(LEN=128) :: param_name
468 CALL timeset(routinen, handle)
470 n_params = xc_f03_func_info_get_n_ext_params(xc_info)
471 IF (n_params > 0)
THEN
472 ALLOCATE (params(n_params))
474 param_name = xc_f03_func_info_get_ext_params_name(xc_info, i - 1)
479 CALL xc_f03_func_set_ext_params(xc_func, params)
482 IF (iand(xc_f03_func_info_get_flags(xc_info), xc_flags_have_exc) == xc_flags_have_exc)
THEN
488 CALL timestop(handle)
490 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...