(git:f2a7cfd)
Loading...
Searching...
No Matches
xc_libxc.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief calculates a functional from libxc and its derivatives
10!> \note
11!> LibXC:
12!> (Marques, Oliveira, Burnus, CPC 183, 2272 (2012)).
13!>
14!> WARNING: In the subroutine libxc_spin_polarized_calc, it could be that the
15!> ordering for the 1st index of v2lapltau, v2rholapl, v2rhotau,
16!> v2sigmalapl and v2sigmatau is not correct. For the moment it does not
17!> matter since the calculation of the 2nd derivatives for meta-GGA
18!> functionals is not implemented in CP2K.
19!>
20!> \par History
21!> 01.2013 created [F. Tran]
22!> 07.2014 updates to versions 2.1 [JGH]
23!> 08.2015 refactoring [A. Gloess (agloess)]
24!> 01.2018 refactoring [A. Gloess (agloess)]
25!> 10.2018/04.2019 added hyb_mgga [S. Simko, included by F. Stein]
26!> \author F. Tran
27! **************************************************************************************************
28
30 USE bibliography, ONLY: lehtola2018, &
32 cite_reference
40 USE kinds, ONLY: default_string_length, &
41 dp
49#include "../base/base_uses.f90"
50#if defined (__LIBXC)
54 USE iso_c_binding, ONLY: c_int, c_double
55 USE xc_derivative_desc, ONLY: &
60 USE xc_libxc_wrap, ONLY: xc_f03_func_t, &
61 xc_f03_func_init, &
62 xc_f03_func_end, &
63 xc_f03_func_info_t, &
64 xc_f03_functional_get_name, &
65 xc_f03_func_get_info, &
66 xc_f03_func_info_get_family, &
67 xc_f03_func_info_get_kind, &
68 xc_f03_func_info_get_n_ext_params, &
69 xc_f03_func_info_get_name, &
70 xc_f03_available_functional_numbers, &
71 xc_f03_available_functional_names, &
72 xc_f03_maximum_name_length, &
73 xc_f03_number_of_functionals, &
74 xc_f03_func_info_get_ext_params_name, &
75 xc_f03_func_info_get_ext_params_description, &
76 xc_f03_func_info_get_ext_params_default_value, &
77 xc_f03_gga_exc, &
78 xc_f03_gga_exc_vxc, &
79 xc_f03_gga_exc_vxc_fxc, &
80 xc_f03_gga_exc_vxc_fxc_kxc, &
81 xc_f03_gga_fxc, &
82 xc_f03_gga_vxc, &
83 xc_f03_gga_vxc_fxc, &
84 xc_f03_gga_vxc_fxc_kxc, &
85 xc_f03_lda, &
86 xc_f03_lda_exc, &
87 xc_f03_lda_exc_vxc, &
88 xc_f03_lda_exc_vxc_fxc, &
89 xc_f03_lda_fxc, &
90 xc_f03_lda_kxc, &
91 xc_f03_lda_vxc, &
92 xc_f03_mgga, &
93 xc_f03_mgga_exc, &
94 xc_f03_mgga_exc_vxc, &
95 xc_f03_mgga_exc_vxc_fxc, &
96 xc_f03_mgga_exc_vxc_fxc_kxc, &
97 xc_f03_mgga_fxc, &
98 xc_f03_mgga_vxc, &
99 xc_f03_mgga_vxc_fxc, &
100 xc_f03_mgga_vxc_fxc_kxc, &
101 xc_polarized, &
102 xc_unpolarized, &
103 xc_family_lda, &
104 xc_family_gga, &
105 xc_family_mgga, &
106 xc_family_hyb_lda, &
107 xc_family_hyb_gga, &
108 xc_family_hyb_mgga, &
109 libxc_set_backend, &
110 libxc_func_init_wrapper, &
111 libxc_gga_exc_vxc_wrapper, libxc_gga_exc_wrapper, &
112 libxc_lda_exc_vxc_wrapper, libxc_lda_exc_wrapper, &
113 libxc_mgga_exc_vxc_wrapper, libxc_mgga_exc_wrapper, &
114 libxc_mgga_vxc_wrapper, &
115 xc_libxc_wrap_functional_get_number, &
116 xc_libxc_wrap_info_needs_laplace, &
117 xc_libxc_wrap_info_no_exc, &
118 xc_libxc_wrap_is_under_development, &
119 xc_libxc_check_functional, &
120 xc_libxc_get_reference_length, &
121 xc_libxc_wrap_init_safe, &
122 xc_libxc_wrap_library_reference, &
123 xc_libxc_wrap_version, &
124 xc_libxc_wrap_set_thresholds, &
125 xc_libxc_wrap_info_refs, &
126 xc_f03_func_set_ext_params, &
127 xc_exchange, xc_correlation, xc_exchange_correlation, xc_kinetic
128 USE xc_libxc_wrap, ONLY: libxc_is_gpu
129 USE xc_libxc_wrap, ONLY: libxc_worker_type, &
130 libxc_worker_alloc, libxc_worker_free_buffers, &
131 libxc_worker_resize_cuda, libxc_worker_eval, libxc_family_flags
132#endif
133!$ USE OMP_LIB, ONLY: omp_get_max_threads, &
134!$ omp_get_num_threads, &
135!$ omp_get_thread_num
136
137 IMPLICIT NONE
138 PRIVATE
139
140 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xc_libxc'
141
147
148#if defined (__LIBXC)
149 PUBLIC :: libxc_set_backend
150
151! **************************************************************************************************
152!> \brief All threads' workers for one distinct functional setup, together with
153!> the key that identifies that setup. Each worker (functional object plus
154!> host staging buffers and, on GPU builds, the mirroring device buffers)
155!> is implemented in xc_libxc_wrap; here they are only aggregated.
156! **************************************************************************************************
157 TYPE libxc_worker_set_type
158 INTEGER :: func_id = -1
159 INTEGER :: nspin = -1
160 INTEGER :: family = -1
161 ! highest derivative order the workers' buffers were allocated for
162 INTEGER :: grad_deriv = -1
163 LOGICAL :: has_laplace = .false.
164 LOGICAL :: no_exc = .false.
165 LOGICAL :: has_params = .false.
166 REAL(KIND=dp) :: epsilon_rho = -1.0_dp
167 REAL(KIND=dp) :: epsilon_tau = -1.0_dp
168 REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: params
169 CHARACTER(LEN=128), DIMENSION(:), ALLOCATABLE :: param_names
170 TYPE(libxc_worker_type), DIMENSION(:), ALLOCATABLE :: worker
171 END TYPE libxc_worker_set_type
172
173 ! Workers are acquired from a serial region only (see libxc_get_workers), so
174 ! the cache itself needs no locking.
175 TYPE(libxc_worker_set_type), DIMENSION(:), ALLOCATABLE, TARGET, PRIVATE, SAVE :: libxc_cache
176
177 ! Stands in for the derivative arrays a given evaluation does not produce.
178 ! Those arguments still have to be associated with something, but they are
179 ! never read or written; pointing them at the density instead would make an
180 ! output argument alias a read-only input. Grown on demand and kept for the
181 ! run rather than allocated per evaluation, and like the cache above it is
182 ! only ever touched from a serial region.
183 REAL(KIND=dp), DIMENSION(:), ALLOCATABLE, TARGET, PRIVATE, SAVE :: libxc_unused
184#endif
185
186 ! Backend initialization bookkeeping
187 LOGICAL, PRIVATE, SAVE :: libxc_initialized = .false.
188
189CONTAINS
190
191! **************************************************************************************************
192!> \brief This function checks whether a functional name belongs to LibXC
193!> \param libxc_params (possible) LibXC input section
194!> \return exists whether the functional exists in LibXC
195! **************************************************************************************************
196 FUNCTION libxc_check_existence_in_libxc(libxc_params) RESULT(exists)
197
198 TYPE(section_vals_type), POINTER, INTENT(IN) :: libxc_params
199 LOGICAL :: exists
200
201#if defined (__LIBXC)
202 ! Initialize once on first call
203 IF (.NOT. libxc_initialized) THEN
204 CALL xc_libxc_wrap_init_safe()
205 libxc_initialized = .true.
206 END IF
207
208 exists = xc_libxc_check_functional(libxc_params%section%name)
209#else
210 mark_used(libxc_params)
211 exists = .false.
212#endif
213
215
216! **************************************************************************************************
217!> \brief This function returns the maximum length of the reference string for a given LibXC functional
218!> \param libxc_params LibXC input section
219!> \param lsd spin polarized calculation
220!> \return maximum length of the string
221! **************************************************************************************************
222 FUNCTION libxc_get_reference_length(libxc_params, lsd) RESULT(length)
223
224 TYPE(section_vals_type), POINTER, INTENT(IN) :: libxc_params
225 LOGICAL, INTENT(IN) :: lsd
226 INTEGER :: length
227
228#if defined (__LIBXC)
229 CHARACTER(len=*), PARAMETER :: routinen = 'libxc_get_reference_length'
230
231 CHARACTER(LEN=default_string_length) :: func_name
232 INTEGER :: func_id, handle
233 TYPE(xc_f03_func_t) :: xc_func
234 TYPE(xc_f03_func_info_t) :: xc_info
235
236 CALL timeset(routinen, handle)
237
238 func_name = libxc_params%section%name
239
240 func_id = xc_libxc_wrap_functional_get_number(func_name)
241 IF (lsd) THEN
242 CALL libxc_func_init_wrapper(xc_func, func_id, xc_polarized, force_host=.true.)
243 ELSE
244 CALL libxc_func_init_wrapper(xc_func, func_id, xc_unpolarized, force_host=.true.)
245 END IF
246 xc_info = xc_f03_func_get_info(xc_func)
247
248 length = xc_libxc_get_reference_length(xc_info)
249
250 CALL xc_f03_func_end(xc_func)
251
252 CALL timestop(handle)
253#else
254 mark_used(libxc_params)
255 mark_used(lsd)
256 length = 0
257 cpabort("In order to use LibXC you have to download and install it!")
258#endif
259
260 END FUNCTION libxc_get_reference_length
261
262! **************************************************************************************************
263!> \brief ...
264!> \param section ...
265! **************************************************************************************************
266 SUBROUTINE libxc_add_sections(section)
267
268 TYPE(section_type), POINTER, INTENT(IN) :: section
269
270#if defined (__LIBXC)
271 CHARACTER(len=*), PARAMETER :: routinen = 'libxc_add_sections'
272
273 TYPE(section_type), POINTER :: subsection
274 TYPE(keyword_type), POINTER :: keyword
275 INTEGER :: handle, no_func, len_name, ii, func_id, n_param, iparam
276 REAL(kind=c_double) :: default_val
277 CHARACTER(LEN=128) :: func_name, param_name, param_descr, description
278 CHARACTER(LEN=2*default_string_length) :: warning
279 INTEGER(KIND=C_INT), DIMENSION(:), ALLOCATABLE :: func_ids
280 TYPE(xc_f03_func_t) :: xc_func
281 TYPE(xc_f03_func_info_t) :: xc_info
282
283 CALL timeset(routinen, handle)
284
285 cpassert(ASSOCIATED(section))
286 NULLIFY (subsection, keyword)
287
288 no_func = xc_f03_number_of_functionals()
289 len_name = xc_f03_maximum_name_length()
290
291 ALLOCATE (func_ids(no_func))
292
293 CALL xc_f03_available_functional_numbers(func_ids)
294
295 DO ii = 1, no_func
296
297 func_id = func_ids(ii)
298 IF (ii > 1) THEN
299 IF (func_id == func_ids(ii - 1)) cycle
300 END IF
301 CALL libxc_func_init_wrapper(xc_func, func_id, xc_unpolarized, force_host=.true.)
302 xc_info = xc_f03_func_get_info(xc_func)
303
304 func_name = xc_f03_functional_get_name(func_id)
305 description = xc_f03_func_info_get_name(xc_info)
306 n_param = xc_f03_func_info_get_n_ext_params(xc_info)
307
308 NULLIFY (subsection)
309 CALL section_create(subsection, __location__, name=trim(func_name), description=trim(description), &
310 n_keywords=2 + n_param, n_subsections=0, repeats=.false.)
311
312 IF (description(1:1) == "_") THEN
313 warning = " This parameter is an internal parameter of the functional. Changing this "// &
314 "parameter effectively changes the functional."
315 ELSE
316 warning = " "
317 END IF
318
319 NULLIFY (keyword)
320 CALL keyword_create(keyword, __location__, name="_SECTION_PARAMETERS_", &
321 description="Activates the functional."//trim(warning), &
322 lone_keyword_l_val=.true., default_l_val=.false.)
323 CALL section_add_keyword(subsection, keyword)
324 CALL keyword_release(keyword)
325
326 CALL keyword_create(keyword, __location__, name="SCALE", description="Scales this functional", &
327 default_r_val=1.0_dp)
328 CALL section_add_keyword(subsection, keyword)
329 CALL keyword_release(keyword)
330
331 DO iparam = 1, n_param
332 param_name = xc_f03_func_info_get_ext_params_name(xc_info, iparam - 1)
333 param_descr = xc_f03_func_info_get_ext_params_description(xc_info, iparam - 1)
334 default_val = xc_f03_func_info_get_ext_params_default_value(xc_info, iparam - 1)
335 NULLIFY (keyword)
336 CALL keyword_create(keyword, __location__, name=trim(param_name), &
337 description=trim(param_descr), default_r_val=default_val)
338 CALL section_add_keyword(subsection, keyword)
339 CALL keyword_release(keyword)
340 END DO
341
342 CALL section_add_subsection(section, subsection)
343 CALL section_release(subsection)
344
345 CALL xc_f03_func_end(xc_func)
346
347 END DO
348
349 DEALLOCATE (func_ids)
350
351 CALL timestop(handle)
352#else
353 mark_used(section)
354
355#endif
356
357 END SUBROUTINE libxc_add_sections
358
359! **************************************************************************************************
360!> \brief info about the functional from libxc
361!> \param libxc_params input parameter (functional name, scaling and parameters)
362!> \param reference string with the reference of the actual functional
363!> \param shortform string with the shortform of the functional name
364!> \param needs the components needed by this functional are set to
365!> true (does not set the unneeded components to false)
366!> \param max_deriv maximum implemented derivative of the xc functional
367!> \param print_warn whether to print warning about development status of a functional
368!> \param func_name_override optional LibXC functional name overriding the section name
369!> \author F. Tran
370! **************************************************************************************************
371 SUBROUTINE libxc_spin_unpolarized_info(libxc_params, reference, shortform, needs, max_deriv, print_warn, &
372 func_name_override)
373
374 TYPE(section_vals_type), POINTER :: libxc_params
375 CHARACTER(LEN=*), INTENT(OUT), OPTIONAL :: reference, shortform
376 TYPE(xc_rho_cflags_type), &
377 INTENT(inout), OPTIONAL :: needs
378 INTEGER, INTENT(out), OPTIONAL :: max_deriv
379 LOGICAL, INTENT(IN), OPTIONAL :: print_warn
380 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: func_name_override
381
382#if defined (__LIBXC)
383 CHARACTER(LEN=128) :: s1, s2
384 CHARACTER(LEN=default_string_length) :: func_name
385 INTEGER :: func_id
386 REAL(kind=dp) :: func_scale
387 TYPE(xc_f03_func_t) :: xc_func
388 TYPE(xc_f03_func_info_t) :: xc_info
389
390 IF (PRESENT(func_name_override)) THEN
391 func_name = func_name_override
392 func_scale = 1.0_dp
393 ELSE
394 func_name = libxc_params%section%name
395 CALL section_vals_val_get(libxc_params, "scale", r_val=func_scale)
396 END IF
397
398 CALL cite_reference(marques2012)
399 CALL cite_reference(lehtola2018)
400
401 IF (abs(func_scale - 1.0_dp) < 1.0e-10_dp) func_scale = 1.0_dp
402
403 func_id = xc_libxc_wrap_functional_get_number(func_name)
404 CALL libxc_func_init_wrapper(xc_func, func_id, xc_unpolarized, force_host=.true.)
405 xc_info = xc_f03_func_get_info(xc_func)
406
407 s1 = xc_f03_func_info_get_name(xc_info)
408 SELECT CASE (xc_f03_func_info_get_kind(xc_info))
409 CASE (xc_exchange); WRITE (s2, '(a)') "exchange"
410 CASE (xc_correlation); WRITE (s2, '(a)') "correlation"
411 CASE (xc_exchange_correlation); WRITE (s2, '(a)') "exchange-correlation"
412 CASE (xc_kinetic); WRITE (s2, '(a)') "kinetic"
413 CASE default
414 cpabort(trim(func_name)//": this XC_KIND is currently not supported.")
415 END SELECT
416 IF (PRESENT(shortform)) THEN
417 shortform = trim(s1)//' ('//trim(s2)//')'
418 END IF
419 IF (PRESENT(reference)) THEN
420 CALL xc_libxc_wrap_info_refs(xc_info, xc_unpolarized, func_scale, reference)
421 END IF
422 IF (PRESENT(needs)) THEN
423 SELECT CASE (xc_f03_func_info_get_family(xc_info))
424 CASE (xc_family_lda, xc_family_hyb_lda)
425 needs%rho = .true.
426 CASE (xc_family_gga, xc_family_hyb_gga)
427 needs%rho = .true.
428 needs%norm_drho = .true.
429 CASE (xc_family_mgga, xc_family_hyb_mgga)
430 needs%rho = .true.
431 needs%norm_drho = .true.
432 needs%tau = .true.
433 needs%laplace_rho = xc_libxc_wrap_info_needs_laplace(xc_info)
434 CASE default
435 cpabort(trim(func_name)//": this XC_FAMILY is currently not supported.")
436 END SELECT
437 END IF
438 IF (PRESENT(max_deriv)) THEN
439 SELECT CASE (xc_f03_func_info_get_family(xc_info))
440 CASE (xc_family_lda, xc_family_hyb_lda)
441 max_deriv = 3
442 CASE (xc_family_gga, xc_family_hyb_gga)
443 max_deriv = 2
444 CASE (xc_family_mgga, xc_family_hyb_mgga)
445 max_deriv = 2
446 CASE default
447 cpabort(trim(func_name)//": this XC_FAMILY is currently not supported.")
448 END SELECT
449 END IF
450 IF (PRESENT(print_warn)) THEN
451 IF (print_warn .AND. xc_libxc_wrap_is_under_development(xc_info)) THEN
452 cpwarn(trim(func_name)//" is under development. Use with caution.")
453 END IF
454 END IF
455
456 CALL xc_f03_func_end(xc_func)
457#else
458 mark_used(libxc_params)
459 mark_used(reference)
460 mark_used(shortform)
461 mark_used(needs)
462 mark_used(max_deriv)
463 mark_used(print_warn)
464 mark_used(func_name_override)
465
466 CALL cp_abort(__location__, "Unknown functional! If you are asking "// &
467 "for a functional of the LibXC library, "// &
468 "you have to download and install the library!")
469#endif
470
471 END SUBROUTINE libxc_spin_unpolarized_info
472
473! **************************************************************************************************
474!> \brief info about the functional from libxc
475!> \param libxc_params input parameter (functional name, scaling and parameters)
476!> \param reference string with the reference of the actual functional
477!> \param shortform string with the shortform of the functional name
478!> \param needs the components needed by this functional are set to
479!> true (does not set the unneeded components to false)
480!> \param max_deriv maximum implemented derivative of the xc functional
481!> \param print_warn whether to print warning about development status of a functional
482!> \param func_name_override optional LibXC functional name overriding the section name
483!> \author F. Tran
484! **************************************************************************************************
485 SUBROUTINE libxc_spin_polarized_info(libxc_params, reference, shortform, needs, max_deriv, print_warn, &
486 func_name_override)
487
488 TYPE(section_vals_type), POINTER :: libxc_params
489 CHARACTER(LEN=*), INTENT(OUT), OPTIONAL :: reference, shortform
490 TYPE(xc_rho_cflags_type), &
491 INTENT(inout), OPTIONAL :: needs
492 INTEGER, INTENT(out), OPTIONAL :: max_deriv
493 LOGICAL, INTENT(IN), OPTIONAL :: print_warn
494 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: func_name_override
495
496#if defined (__LIBXC)
497 CHARACTER(LEN=128) :: s1, s2
498 CHARACTER(LEN=default_string_length) :: func_name
499 INTEGER :: func_id
500 REAL(kind=dp) :: func_scale
501 TYPE(xc_f03_func_t) :: xc_func
502 TYPE(xc_f03_func_info_t) :: xc_info
503
504 IF (PRESENT(func_name_override)) THEN
505 func_name = func_name_override
506 func_scale = 1.0_dp
507 ELSE
508 func_name = libxc_params%section%name
509 CALL section_vals_val_get(libxc_params, "scale", r_val=func_scale)
510 END IF
511
512 CALL cite_reference(marques2012)
513 CALL cite_reference(lehtola2018)
514
515 IF (abs(func_scale - 1.0_dp) < 1.0e-10_dp) func_scale = 1.0_dp
516
517 func_id = xc_libxc_wrap_functional_get_number(func_name)
518 CALL libxc_func_init_wrapper(xc_func, func_id, xc_polarized, force_host=.true.)
519 xc_info = xc_f03_func_get_info(xc_func)
520
521 s1 = xc_f03_func_info_get_name(xc_info)
522 SELECT CASE (xc_f03_func_info_get_kind(xc_info))
523 CASE (xc_exchange); WRITE (s2, '(a)') "exchange"
524 CASE (xc_correlation); WRITE (s2, '(a)') "correlation"
525 CASE (xc_exchange_correlation); WRITE (s2, '(a)') "exchange-correlation"
526 CASE (xc_kinetic); WRITE (s2, '(a)') "kinetic"
527 CASE default
528 cpabort(trim(func_name)//": this XC_KIND is currently not supported.")
529 END SELECT
530 IF (PRESENT(shortform)) THEN
531 shortform = trim(s1)//' ('//trim(s2)//')'
532 END IF
533 IF (PRESENT(reference)) THEN
534 CALL xc_libxc_wrap_info_refs(xc_info, xc_polarized, func_scale, reference)
535 END IF
536 IF (PRESENT(needs)) THEN
537 SELECT CASE (xc_f03_func_info_get_family(xc_info))
538 CASE (xc_family_lda, xc_family_hyb_lda)
539 needs%rho_spin = .true.
540 CASE (xc_family_gga, xc_family_hyb_gga)
541 needs%rho_spin = .true.
542 needs%norm_drho = .true.
543 needs%norm_drho_spin = .true.
544 CASE (xc_family_mgga, xc_family_hyb_mgga)
545 needs%rho_spin = .true.
546 needs%norm_drho = .true.
547 needs%norm_drho_spin = .true.
548 needs%tau_spin = .true.
549 needs%laplace_rho_spin = xc_libxc_wrap_info_needs_laplace(xc_info)
550 CASE default
551 cpabort(trim(func_name)//": this XC_FAMILY is currently not supported.")
552 END SELECT
553 END IF
554 IF (PRESENT(max_deriv)) THEN
555 SELECT CASE (xc_f03_func_info_get_family(xc_info))
556 CASE (xc_family_lda, xc_family_hyb_lda)
557 max_deriv = 3
558 CASE (xc_family_gga, xc_family_hyb_gga)
559 max_deriv = 2
560 CASE (xc_family_mgga, xc_family_hyb_mgga)
561 max_deriv = 2
562 CASE default
563 cpabort(trim(func_name)//": this XC_FAMILY is currently not supported.")
564 END SELECT
565 END IF
566 IF (PRESENT(print_warn)) THEN
567 IF (print_warn .AND. xc_libxc_wrap_is_under_development(xc_info)) THEN
568 cpwarn(trim(func_name)//" is under development. Use with caution.")
569 END IF
570 END IF
571
572 CALL xc_f03_func_end(xc_func)
573#else
574 mark_used(libxc_params)
575 mark_used(reference)
576 mark_used(shortform)
577 mark_used(needs)
578 mark_used(max_deriv)
579 mark_used(print_warn)
580 mark_used(func_name_override)
581
582 CALL cp_abort(__location__, "Unknown functional! If you are "// &
583 "asking for a functional of the LibXC library, "// &
584 "you have to download and install the library!")
585#endif
586
587 END SUBROUTINE libxc_spin_polarized_info
588
589! **************************************************************************************************
590!> \brief info about the LibXC version
591!> \param version version string reported by the library at run time
592!> \param compiled_version version of the LibXC headers CP2K was compiled against
593!> \author A. Gloess (agloess)
594! **************************************************************************************************
595 SUBROUTINE libxc_version_info(version, compiled_version)
596 CHARACTER(LEN=*), INTENT(OUT) :: version ! the string that is output
597 CHARACTER(LEN=*), INTENT(OUT), OPTIONAL :: compiled_version
598
599#if defined (__LIBXC)
600 CALL xc_libxc_wrap_version(version, compiled_version)
601#else
602 version = "none"
603 IF (PRESENT(compiled_version)) compiled_version = "none"
604 cpabort("In order to use libxc you need to download and install it")
605#endif
606
607 END SUBROUTINE libxc_version_info
608
609! **************************************************************************************************
610!> \brief Returns the citation LibXC asks for the library itself.
611!> \param reference bibliographic reference
612!> \param doi digital object identifier of that reference
613!> \author S. Lehtola
614! **************************************************************************************************
615 SUBROUTINE libxc_library_reference(reference, doi)
616 CHARACTER(LEN=*), INTENT(OUT) :: reference, doi
617
618#if defined (__LIBXC)
619 CALL xc_libxc_wrap_library_reference(reference, doi)
620#else
621 reference = "none"
622 doi = "none"
623 cpabort("In order to use libxc you need to download and install it")
624#endif
625
626 END SUBROUTINE libxc_library_reference
627
628! **************************************************************************************************
629!> \brief Reads the external parameters of a LibXC functional from its input section.
630!> \param libxc_params LibXC input section
631!> \param param_names names of the external parameters, as reported by LibXC
632!> \param params values read from the input
633!> \author S. Lehtola
634! **************************************************************************************************
635#if defined (__LIBXC)
636 SUBROUTINE libxc_read_params(libxc_params, param_names, params)
637 TYPE(section_vals_type), INTENT(IN), POINTER :: libxc_params
638 CHARACTER(LEN=128), DIMENSION(:), INTENT(IN) :: param_names
639 REAL(kind=dp), DIMENSION(:), INTENT(OUT) :: params
640
641 INTEGER :: i
642
643 DO i = 1, SIZE(param_names)
644 CALL section_vals_val_get(libxc_params, trim(param_names(i)), r_val=params(i))
645 END DO
646
647 END SUBROUTINE libxc_read_params
648
649! **************************************************************************************************
650!> \brief Makes sure the placeholder for unproduced derivatives holds npoints values.
651!> \param npoints number of grid points in this evaluation
652!> \author S. Lehtola
653! **************************************************************************************************
654 SUBROUTINE libxc_reserve_unused(npoints)
655 INTEGER, INTENT(IN) :: npoints
656
657 IF (ALLOCATED(libxc_unused)) THEN
658 IF (SIZE(libxc_unused) >= npoints) RETURN
659 DEALLOCATE (libxc_unused)
660 END IF
661 ALLOCATE (libxc_unused(npoints))
662
663 END SUBROUTINE libxc_reserve_unused
664
665! **************************************************************************************************
666!> \brief Returns the cache slot holding the per-thread workers for a functional.
667!> \param func_name LibXC functional name
668!> \param nspin XC_UNPOLARIZED or XC_POLARIZED
669!> \param libxc_params LibXC input section, or null when no parameters are to be set
670!> \param epsilon_rho density cutoff
671!> \param epsilon_tau kinetic energy density cutoff
672!> \param grad_deriv highest derivative order this evaluation needs
673!> \return index into libxc_cache
674!> \author S. Lehtola
675!> \note Must be called from a serial region: it is the only writer of the cache,
676!> and keeping it serial is what makes the cache lock-free. The workers it
677!> returns are then used concurrently, one per thread.
678! **************************************************************************************************
679 FUNCTION libxc_get_workers(func_name, nspin, libxc_params, epsilon_rho, epsilon_tau, &
680 grad_deriv) RESULT(idx)
681 CHARACTER(LEN=*), INTENT(IN) :: func_name
682 INTEGER, INTENT(IN) :: nspin
683 TYPE(section_vals_type), INTENT(IN), POINTER :: libxc_params
684 REAL(kind=dp), INTENT(IN) :: epsilon_rho, epsilon_tau
685 INTEGER, INTENT(IN) :: grad_deriv
686 INTEGER :: idx
687
688 CHARACTER(LEN=*), PARAMETER :: routinen = 'libxc_get_workers'
689
690 INTEGER :: func_id, handle, i, ithread, n_params, &
691 nthreads
692 LOGICAL :: has_params
693 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: params
694 TYPE(libxc_worker_set_type), ALLOCATABLE, &
695 DIMENSION(:) :: tmp_cache
696
697 CALL timeset(routinen, handle)
698
699 func_id = xc_libxc_wrap_functional_get_number(func_name)
700 has_params = ASSOCIATED(libxc_params)
701
702 nthreads = 1
703!$ nthreads = omp_get_max_threads()
704
705 IF (.NOT. ALLOCATED(libxc_cache)) ALLOCATE (libxc_cache(0))
706
707 idx = 0
708 DO i = 1, SIZE(libxc_cache)
709 IF (libxc_cache(i)%func_id == func_id .AND. &
710 libxc_cache(i)%nspin == nspin .AND. &
711 (libxc_cache(i)%has_params .EQV. has_params)) THEN
712 IF (libxc_cache(i)%epsilon_rho == epsilon_rho .AND. &
713 libxc_cache(i)%epsilon_tau == epsilon_tau .AND. &
714 SIZE(libxc_cache(i)%worker) >= nthreads) THEN
715 idx = i
716 EXIT
717 END IF
718 END IF
719 END DO
720
721 ! A set built for a lower derivative order carries buffers that are too
722 ! narrow for this call. Widening them in place keeps one set per functional
723 ! setup: the SCF fills the cache at first order and a later response
724 ! calculation grows that same slot to third order.
725 IF (idx /= 0) THEN
726 IF (libxc_cache(idx)%grad_deriv < grad_deriv) THEN
727 DO ithread = 1, SIZE(libxc_cache(idx)%worker)
728 CALL libxc_worker_free_buffers(libxc_cache(idx)%worker(ithread))
729 CALL libxc_worker_alloc(libxc_cache(idx)%worker(ithread), &
730 libxc_cache(idx)%family, nspin, grad_deriv)
731 END DO
732 libxc_cache(idx)%grad_deriv = grad_deriv
733 END IF
734 END IF
735
736 IF (idx == 0) THEN
737 ! Grow the cache by one slot and build the workers for it.
738 CALL move_alloc(libxc_cache, tmp_cache)
739 ALLOCATE (libxc_cache(SIZE(tmp_cache) + 1))
740 DO i = 1, SIZE(tmp_cache)
741 CALL libxc_move_worker_set(tmp_cache(i), libxc_cache(i))
742 END DO
743 DEALLOCATE (tmp_cache)
744 idx = SIZE(libxc_cache)
745
746 associate(ws => libxc_cache(idx))
747 ws%func_id = func_id
748 ws%nspin = nspin
749 ws%has_params = has_params
750 ws%epsilon_rho = epsilon_rho
751 ws%epsilon_tau = epsilon_tau
752 ws%grad_deriv = grad_deriv
753 ALLOCATE (ws%worker(nthreads))
754
755 DO ithread = 1, nthreads
756 CALL libxc_func_init_wrapper(ws%worker(ithread)%func, func_id, nspin)
757 ws%worker(ithread)%info = xc_f03_func_get_info(ws%worker(ithread)%func)
758 ws%worker(ithread)%is_init = .true.
759 END DO
760
761 ws%family = xc_f03_func_info_get_family(ws%worker(1)%info)
762 ws%has_laplace = xc_libxc_wrap_info_needs_laplace(ws%worker(1)%info)
763 ws%no_exc = xc_libxc_wrap_info_no_exc(ws%worker(1)%info)
764
765 ! Remember the parameter names so that later evaluations can re-read
766 ! the input without another functional object to ask for them.
767 n_params = 0
768 IF (has_params) n_params = xc_f03_func_info_get_n_ext_params(ws%worker(1)%info)
769 ALLOCATE (ws%params(n_params))
770 ALLOCATE (ws%param_names(n_params))
771 DO i = 1, n_params
772 ws%param_names(i) = xc_f03_func_info_get_ext_params_name(ws%worker(1)%info, i - 1)
773 END DO
774 IF (n_params > 0) THEN
775 CALL libxc_read_params(libxc_params, ws%param_names, ws%params)
776 DO ithread = 1, nthreads
777 CALL xc_f03_func_set_ext_params(ws%worker(ithread)%func, ws%params)
778 END DO
779 END IF
780
781 DO ithread = 1, nthreads
782 CALL xc_libxc_wrap_set_thresholds(ws%worker(ithread)%func, ws%worker(ithread)%info, &
783 epsilon_rho, epsilon_tau)
784 CALL libxc_worker_alloc(ws%worker(ithread), ws%family, nspin, grad_deriv)
785 END DO
786 END associate
787 ELSE
788 ! Cached slot: the input section may in principle carry different
789 ! parameter values than the ones the workers were last set up with, so
790 ! re-read them and push them through only when they actually changed.
791 associate(ws => libxc_cache(idx))
792 n_params = SIZE(ws%params)
793 IF (n_params > 0) THEN
794 ALLOCATE (params(n_params))
795 CALL libxc_read_params(libxc_params, ws%param_names, params)
796 IF (any(params /= ws%params)) THEN
797 ws%params(:) = params(:)
798 DO ithread = 1, SIZE(ws%worker)
799 CALL xc_f03_func_set_ext_params(ws%worker(ithread)%func, ws%params)
800 ! re-assert the cutoffs: setting parameters runs the
801 ! functional's own callback, which is free to rebuild the
802 ! component functionals a mixed functional is made of
803 CALL xc_libxc_wrap_set_thresholds(ws%worker(ithread)%func, &
804 ws%worker(ithread)%info, &
805 ws%epsilon_rho, ws%epsilon_tau)
806 END DO
807 END IF
808 DEALLOCATE (params)
809 END IF
810 END associate
811 END IF
812
813 CALL timestop(handle)
814
815 END FUNCTION libxc_get_workers
816
817! **************************************************************************************************
818!> \brief Moves a worker set to a new cache slot without touching LibXC.
819!> \param from source slot, left empty
820!> \param to destination slot
821!> \author S. Lehtola
822!> \note Used when the cache array grows. The LibXC objects are opaque handles, so
823!> they survive being moved; only the Fortran allocatables need transferring.
824! **************************************************************************************************
825 SUBROUTINE libxc_move_worker_set(from, to)
826 TYPE(libxc_worker_set_type), INTENT(INOUT) :: from, to
827
828 to%func_id = from%func_id
829 to%nspin = from%nspin
830 to%family = from%family
831 to%grad_deriv = from%grad_deriv
832 to%has_laplace = from%has_laplace
833 to%no_exc = from%no_exc
834 to%has_params = from%has_params
835 to%epsilon_rho = from%epsilon_rho
836 to%epsilon_tau = from%epsilon_tau
837 IF (ALLOCATED(from%params)) CALL move_alloc(from%params, to%params)
838 IF (ALLOCATED(from%param_names)) CALL move_alloc(from%param_names, to%param_names)
839 IF (ALLOCATED(from%worker)) CALL move_alloc(from%worker, to%worker)
840
841 END SUBROUTINE libxc_move_worker_set
842#endif
843
844! **************************************************************************************************
845!> \brief Destroys all cached LibXC functional objects.
846!> \author S. Lehtola
847!> \note Call once at the end of a run. The workers are deliberately kept alive
848!> across SCF steps and across calculations, so nothing else releases them.
849! **************************************************************************************************
851
852#if defined (__LIBXC)
853 INTEGER :: i, ithread
854
855 IF (.NOT. ALLOCATED(libxc_cache)) RETURN
856
857 DO i = 1, SIZE(libxc_cache)
858 IF (.NOT. ALLOCATED(libxc_cache(i)%worker)) cycle
859 DO ithread = 1, SIZE(libxc_cache(i)%worker)
860 IF (libxc_cache(i)%worker(ithread)%is_init) THEN
861 CALL xc_f03_func_end(libxc_cache(i)%worker(ithread)%func)
862 libxc_cache(i)%worker(ithread)%is_init = .false.
863 END IF
864 ! Free the staging buffers and any device buffers they mirror.
865 CALL libxc_worker_free_buffers(libxc_cache(i)%worker(ithread))
866 END DO
867 END DO
868 DEALLOCATE (libxc_cache)
869 IF (ALLOCATED(libxc_unused)) DEALLOCATE (libxc_unused)
870#endif
871
872 END SUBROUTINE libxc_release_workers
873
874! **************************************************************************************************
875!> \brief evaluates the functional from libxc
876!> \param rho_set the density where you want to evaluate the functional
877!> \param deriv_set place where to store the functional derivatives (they are
878!> added to the derivatives)
879!> \param grad_deriv degree of the derivative that should be evaluated;
880!> all derivatives up to the given degree are evaluated, in a single
881!> LibXC call per block of grid points
882!> \param libxc_params input parameter (functional name, scaling and parameters)
883!> \param func_name_override optional LibXC functional name overriding the section name
884!> \author F. Tran
885! **************************************************************************************************
886 SUBROUTINE libxc_spin_unpolarized_eval(rho_set, deriv_set, grad_deriv, libxc_params, func_name_override)
887
888 TYPE(xc_rho_set_type), INTENT(IN) :: rho_set
889 TYPE(xc_derivative_set_type), INTENT(IN) :: deriv_set
890 INTEGER, INTENT(in) :: grad_deriv
891 TYPE(section_vals_type), POINTER :: libxc_params
892 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: func_name_override
893
894#if defined (__LIBXC)
895 CHARACTER(len=*), PARAMETER :: routinen = 'libxc_spin_unpolarized_eval'
896
897 CHARACTER(LEN=default_string_length) :: func_name
898 INTEGER :: handle, iw, npoints
899 INTEGER, DIMENSION(2, 3) :: bo
900 LOGICAL :: has_laplace
901 REAL(kind=dp) :: epsilon_rho, epsilon_tau, func_scale
902 TYPE(libxc_worker_set_type), POINTER :: workers
903 TYPE(section_vals_type), POINTER :: no_params
904 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: dummy, e_0, e_laplace_rho, &
905 e_laplace_rho_laplace_rho, e_laplace_rho_tau, e_ndrho, &
906 e_ndrho_laplace_rho, e_ndrho_ndrho, e_ndrho_rho, e_ndrho_tau, e_rho, &
907 e_rho_laplace_rho, e_rho_rho, e_rho_rho_rho, e_rho_tau, e_tau, &
908 e_tau_tau, laplace_rho, norm_drho, rho, tau
909 ! derivatives w.r.t. the reduced gradient gamma = |grad rho|^2
910 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma
911 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rho_gamma
912 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_gamma
913 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_laplace_rho
914 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_tau
915 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rho_rho_gamma
916 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rho_rho_laplace_rho
917 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rho_rho_tau
918 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rho_gamma_gamma
919 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rho_gamma_laplace_rho
920 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rho_gamma_tau
921 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rho_laplace_rho_laplace_rho
922 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rho_laplace_rho_tau
923 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rho_tau_tau
924 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_gamma_gamma
925 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_gamma_laplace_rho
926 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_gamma_tau
927 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_laplace_rho_laplace_rho
928 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_laplace_rho_tau
929 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_tau_tau
930 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rho_laplace_rho_laplace_rho
931 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rho_laplace_rho_tau
932 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rho_tau_tau
933 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_tau_tau_tau
934 TYPE(xc_derivative_type), POINTER :: deriv
935 TYPE(xc_f03_func_info_t) :: xc_info
936
937 CALL timeset(routinen, handle)
938
939 ! Only "everything up to grad_deriv" is supported. Asking for a single
940 ! derivative order in isolation is rejected here rather than further down,
941 ! where it would quietly evaluate nothing at all.
942 IF (grad_deriv < 0) THEN
943 cpabort("Evaluating a single derivative order is not supported.")
944 END IF
945 IF (grad_deriv > 3) THEN
946 cpabort("derivatives larger than 3 not implemented")
947 END IF
948
949 has_laplace = .false.
950 NULLIFY (dummy)
951 NULLIFY (workers)
952 NULLIFY (rho, norm_drho, laplace_rho, tau)
953
954 IF (PRESENT(func_name_override)) THEN
955 func_name = func_name_override
956 func_scale = 1.0_dp
957 ELSE
958 func_name = libxc_params%section%name
959 CALL section_vals_val_get(libxc_params, "scale", r_val=func_scale)
960 END IF
961
962 IF (abs(func_scale - 1.0_dp) < 1.0e-10_dp) func_scale = 1.0_dp
963
964 CALL xc_rho_set_get(rho_set, can_return_null=.true., &
965 rho=rho, norm_drho=norm_drho, laplace_rho=laplace_rho, &
966 rho_cutoff=epsilon_rho, tau_cutoff=epsilon_tau, &
967 tau=tau, local_bounds=bo)
968
969 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
970
971 ! One functional object per thread, kept across calls. The cutoffs are part
972 ! of the worker setup because LibXC does the screening itself.
973 IF (PRESENT(func_name_override)) THEN
974 ! an overriding name carries no input section, so no parameters are set
975 NULLIFY (no_params)
976 iw = libxc_get_workers(func_name, xc_unpolarized, no_params, epsilon_rho, epsilon_tau, &
977 grad_deriv)
978 ELSE
979 iw = libxc_get_workers(func_name, xc_unpolarized, libxc_params, epsilon_rho, epsilon_tau, &
980 grad_deriv)
981 END IF
982 workers => libxc_cache(iw)
983 xc_info = workers%worker(1)%info
984 has_laplace = workers%has_laplace
985
986 ! see libxc_unused: the arguments the requested order does not produce are
987 ! never touched, but they still have to point somewhere
988 CALL libxc_reserve_unused(npoints)
989 dummy(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)) => libxc_unused(1:npoints)
990
991 ! due to assumed shape array usage in next routine
992 IF (.NOT. ASSOCIATED(norm_drho)) norm_drho => rho
993 IF (.NOT. ASSOCIATED(tau)) tau => rho
994
995 ! only some MGGA functionals really need the Laplacian,
996 ! all others can work with rho (read-only) as dummy
997 IF (.NOT. has_laplace) laplace_rho => rho
998
999 e_0 => dummy
1000 e_rho => dummy
1001 e_ndrho => dummy
1002 e_laplace_rho => dummy
1003 e_tau => dummy
1004 e_rho_rho => dummy
1005 e_ndrho_rho => dummy
1006 e_ndrho_ndrho => dummy
1007 e_rho_laplace_rho => dummy
1008 e_rho_tau => dummy
1009 e_ndrho_laplace_rho => dummy
1010 e_ndrho_tau => dummy
1011 e_laplace_rho_laplace_rho => dummy
1012 e_laplace_rho_tau => dummy
1013 e_tau_tau => dummy
1014 e_rho_rho_rho => dummy
1015 e_gamma => dummy
1016 e_rho_gamma => dummy
1017 e_gamma_gamma => dummy
1018 e_gamma_laplace_rho => dummy
1019 e_gamma_tau => dummy
1020 e_rho_rho_gamma => dummy
1021 e_rho_rho_laplace_rho => dummy
1022 e_rho_rho_tau => dummy
1023 e_rho_gamma_gamma => dummy
1024 e_rho_gamma_laplace_rho => dummy
1025 e_rho_gamma_tau => dummy
1026 e_rho_laplace_rho_laplace_rho => dummy
1027 e_rho_laplace_rho_tau => dummy
1028 e_rho_tau_tau => dummy
1029 e_gamma_gamma_gamma => dummy
1030 e_gamma_gamma_laplace_rho => dummy
1031 e_gamma_gamma_tau => dummy
1032 e_gamma_laplace_rho_laplace_rho => dummy
1033 e_gamma_laplace_rho_tau => dummy
1034 e_gamma_tau_tau => dummy
1035 e_laplace_rho_laplace_rho_laplace_rho => dummy
1036 e_laplace_rho_laplace_rho_tau => dummy
1037 e_laplace_rho_tau_tau => dummy
1038 e_tau_tau_tau => dummy
1039
1040 IF (grad_deriv >= 0) THEN
1041 deriv => xc_dset_get_derivative(deriv_set, [INTEGER::], &
1042 allocate_deriv=.true.)
1043 CALL xc_derivative_get(deriv, deriv_data=e_0)
1044 END IF
1045 IF (grad_deriv >= 1) THEN
1046 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1047 CASE (xc_family_lda, xc_family_hyb_lda)
1048 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho], &
1049 allocate_deriv=.true.)
1050 CALL xc_derivative_get(deriv, deriv_data=e_rho)
1051 CASE (xc_family_gga, xc_family_hyb_gga)
1052 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho], &
1053 allocate_deriv=.true.)
1054 CALL xc_derivative_get(deriv, deriv_data=e_rho)
1055 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
1056 allocate_deriv=.true.)
1057 CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
1058 deriv => xc_dset_get_derivative(deriv_set, &
1059 [deriv_gamma], &
1060 allocate_deriv=.true.)
1061 CALL xc_derivative_get(deriv, deriv_data=e_gamma)
1062 CASE (xc_family_mgga, xc_family_hyb_mgga)
1063 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho], &
1064 allocate_deriv=.true.)
1065 CALL xc_derivative_get(deriv, deriv_data=e_rho)
1066 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
1067 allocate_deriv=.true.)
1068 CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
1069 deriv => xc_dset_get_derivative(deriv_set, &
1070 [deriv_gamma], &
1071 allocate_deriv=.true.)
1072 CALL xc_derivative_get(deriv, deriv_data=e_gamma)
1073 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau], &
1074 allocate_deriv=.true.)
1075 CALL xc_derivative_get(deriv, deriv_data=e_tau)
1076 IF (has_laplace) THEN
1077 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rho], &
1078 allocate_deriv=.true.)
1079 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho)
1080 END IF
1081 CASE default
1082 cpabort(trim(func_name)//": this XC_FAMILY is currently not supported.")
1083 END SELECT
1084 END IF
1085 IF (grad_deriv >= 2) THEN
1086 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1087 CASE (xc_family_lda, xc_family_hyb_lda)
1088 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho], &
1089 allocate_deriv=.true.)
1090 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho)
1091 CASE (xc_family_gga, xc_family_hyb_gga)
1092 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho], &
1093 allocate_deriv=.true.)
1094 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho)
1095 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rho], &
1096 allocate_deriv=.true.)
1097 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rho)
1098 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drho], &
1099 allocate_deriv=.true.)
1100 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
1101 deriv => xc_dset_get_derivative(deriv_set, &
1102 [deriv_rho, deriv_gamma], &
1103 allocate_deriv=.true.)
1104 CALL xc_derivative_get(deriv, deriv_data=e_rho_gamma)
1105 deriv => xc_dset_get_derivative(deriv_set, &
1106 [deriv_gamma, deriv_gamma], &
1107 allocate_deriv=.true.)
1108 CALL xc_derivative_get(deriv, deriv_data=e_gamma_gamma)
1109 CASE (xc_family_mgga, xc_family_hyb_mgga)
1110 ! not implemented ...
1111
1112 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho], &
1113 allocate_deriv=.true.)
1114 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho)
1115 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rho], &
1116 allocate_deriv=.true.)
1117 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rho)
1118 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drho], &
1119 allocate_deriv=.true.)
1120 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
1121 deriv => xc_dset_get_derivative(deriv_set, &
1122 [deriv_rho, deriv_gamma], &
1123 allocate_deriv=.true.)
1124 CALL xc_derivative_get(deriv, deriv_data=e_rho_gamma)
1125 deriv => xc_dset_get_derivative(deriv_set, &
1126 [deriv_gamma, deriv_gamma], &
1127 allocate_deriv=.true.)
1128 CALL xc_derivative_get(deriv, deriv_data=e_gamma_gamma)
1129 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_tau], &
1130 allocate_deriv=.true.)
1131 CALL xc_derivative_get(deriv, deriv_data=e_rho_tau)
1132 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_tau], &
1133 allocate_deriv=.true.)
1134 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_tau)
1135 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau, deriv_tau], &
1136 allocate_deriv=.true.)
1137 CALL xc_derivative_get(deriv, deriv_data=e_tau_tau)
1138 deriv => xc_dset_get_derivative(deriv_set, &
1139 [deriv_gamma, deriv_tau], &
1140 allocate_deriv=.true.)
1141 CALL xc_derivative_get(deriv, deriv_data=e_gamma_tau)
1142 IF (has_laplace) THEN
1143 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_laplace_rho], &
1144 allocate_deriv=.true.)
1145 CALL xc_derivative_get(deriv, deriv_data=e_rho_laplace_rho)
1146 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_laplace_rho], &
1147 allocate_deriv=.true.)
1148 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_laplace_rho)
1149 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rho, deriv_laplace_rho], &
1150 allocate_deriv=.true.)
1151 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_laplace_rho)
1152 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rho, deriv_tau], &
1153 allocate_deriv=.true.)
1154 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_tau)
1155 END IF
1156 CASE default
1157 cpabort(trim(func_name)//": this XC_FAMILY is currently not supported.")
1158 END SELECT
1159 END IF
1160 IF (grad_deriv >= 3) THEN
1161 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1162 CASE (xc_family_lda, xc_family_hyb_lda)
1163 IF (has_laplace) THEN
1164 deriv => xc_dset_get_derivative(deriv_set, &
1165 [deriv_rho, deriv_rho, deriv_laplace_rho], &
1166 allocate_deriv=.true.)
1167 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_laplace_rho)
1168 deriv => xc_dset_get_derivative(deriv_set, &
1169 [deriv_rho, deriv_gamma, deriv_laplace_rho], &
1170 allocate_deriv=.true.)
1171 CALL xc_derivative_get(deriv, deriv_data=e_rho_gamma_laplace_rho)
1172 deriv => xc_dset_get_derivative(deriv_set, &
1173 [deriv_rho, deriv_laplace_rho, deriv_laplace_rho], &
1174 allocate_deriv=.true.)
1175 CALL xc_derivative_get(deriv, deriv_data=e_rho_laplace_rho_laplace_rho)
1176 deriv => xc_dset_get_derivative(deriv_set, &
1177 [deriv_rho, deriv_laplace_rho, deriv_tau], &
1178 allocate_deriv=.true.)
1179 CALL xc_derivative_get(deriv, deriv_data=e_rho_laplace_rho_tau)
1180 deriv => xc_dset_get_derivative(deriv_set, &
1181 [deriv_gamma, deriv_gamma, deriv_laplace_rho], &
1182 allocate_deriv=.true.)
1183 CALL xc_derivative_get(deriv, deriv_data=e_gamma_gamma_laplace_rho)
1184 deriv => xc_dset_get_derivative(deriv_set, &
1185 [deriv_gamma, deriv_laplace_rho, deriv_laplace_rho], &
1186 allocate_deriv=.true.)
1187 CALL xc_derivative_get(deriv, deriv_data=e_gamma_laplace_rho_laplace_rho)
1188 deriv => xc_dset_get_derivative(deriv_set, &
1189 [deriv_gamma, deriv_laplace_rho, deriv_tau], &
1190 allocate_deriv=.true.)
1191 CALL xc_derivative_get(deriv, deriv_data=e_gamma_laplace_rho_tau)
1192 deriv => xc_dset_get_derivative(deriv_set, &
1193 [deriv_laplace_rho, deriv_laplace_rho, deriv_laplace_rho], &
1194 allocate_deriv=.true.)
1195 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_laplace_rho_laplace_rho)
1196 deriv => xc_dset_get_derivative(deriv_set, &
1197 [deriv_laplace_rho, deriv_laplace_rho, deriv_tau], &
1198 allocate_deriv=.true.)
1199 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_laplace_rho_tau)
1200 deriv => xc_dset_get_derivative(deriv_set, &
1201 [deriv_laplace_rho, deriv_tau, deriv_tau], &
1202 allocate_deriv=.true.)
1203 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_tau_tau)
1204 END IF
1205 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho, deriv_rho], &
1206 allocate_deriv=.true.)
1207 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_rho)
1208 CASE (xc_family_gga, xc_family_hyb_gga)
1209 IF (has_laplace) THEN
1210 deriv => xc_dset_get_derivative(deriv_set, &
1211 [deriv_rho, deriv_rho, deriv_laplace_rho], &
1212 allocate_deriv=.true.)
1213 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_laplace_rho)
1214 deriv => xc_dset_get_derivative(deriv_set, &
1215 [deriv_rho, deriv_gamma, deriv_laplace_rho], &
1216 allocate_deriv=.true.)
1217 CALL xc_derivative_get(deriv, deriv_data=e_rho_gamma_laplace_rho)
1218 deriv => xc_dset_get_derivative(deriv_set, &
1219 [deriv_rho, deriv_laplace_rho, deriv_laplace_rho], &
1220 allocate_deriv=.true.)
1221 CALL xc_derivative_get(deriv, deriv_data=e_rho_laplace_rho_laplace_rho)
1222 deriv => xc_dset_get_derivative(deriv_set, &
1223 [deriv_rho, deriv_laplace_rho, deriv_tau], &
1224 allocate_deriv=.true.)
1225 CALL xc_derivative_get(deriv, deriv_data=e_rho_laplace_rho_tau)
1226 deriv => xc_dset_get_derivative(deriv_set, &
1227 [deriv_gamma, deriv_gamma, deriv_laplace_rho], &
1228 allocate_deriv=.true.)
1229 CALL xc_derivative_get(deriv, deriv_data=e_gamma_gamma_laplace_rho)
1230 deriv => xc_dset_get_derivative(deriv_set, &
1231 [deriv_gamma, deriv_laplace_rho, deriv_laplace_rho], &
1232 allocate_deriv=.true.)
1233 CALL xc_derivative_get(deriv, deriv_data=e_gamma_laplace_rho_laplace_rho)
1234 deriv => xc_dset_get_derivative(deriv_set, &
1235 [deriv_gamma, deriv_laplace_rho, deriv_tau], &
1236 allocate_deriv=.true.)
1237 CALL xc_derivative_get(deriv, deriv_data=e_gamma_laplace_rho_tau)
1238 deriv => xc_dset_get_derivative(deriv_set, &
1239 [deriv_laplace_rho, deriv_laplace_rho, deriv_laplace_rho], &
1240 allocate_deriv=.true.)
1241 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_laplace_rho_laplace_rho)
1242 deriv => xc_dset_get_derivative(deriv_set, &
1243 [deriv_laplace_rho, deriv_laplace_rho, deriv_tau], &
1244 allocate_deriv=.true.)
1245 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_laplace_rho_tau)
1246 deriv => xc_dset_get_derivative(deriv_set, &
1247 [deriv_laplace_rho, deriv_tau, deriv_tau], &
1248 allocate_deriv=.true.)
1249 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_tau_tau)
1250 END IF
1251 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho, deriv_rho], &
1252 allocate_deriv=.true.)
1253 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_rho)
1254 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho, deriv_gamma], &
1255 allocate_deriv=.true.)
1256 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_gamma)
1257 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_gamma, deriv_gamma], &
1258 allocate_deriv=.true.)
1259 CALL xc_derivative_get(deriv, deriv_data=e_rho_gamma_gamma)
1260 deriv => xc_dset_get_derivative(deriv_set, [deriv_gamma, deriv_gamma, deriv_gamma], &
1261 allocate_deriv=.true.)
1262 CALL xc_derivative_get(deriv, deriv_data=e_gamma_gamma_gamma)
1263 CASE (xc_family_mgga, xc_family_hyb_mgga)
1264 deriv => xc_dset_get_derivative(deriv_set, &
1265 [deriv_rho, deriv_rho, deriv_gamma], &
1266 allocate_deriv=.true.)
1267 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_gamma)
1268 deriv => xc_dset_get_derivative(deriv_set, &
1269 [deriv_rho, deriv_rho, deriv_tau], &
1270 allocate_deriv=.true.)
1271 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_tau)
1272 deriv => xc_dset_get_derivative(deriv_set, &
1273 [deriv_rho, deriv_gamma, deriv_gamma], &
1274 allocate_deriv=.true.)
1275 CALL xc_derivative_get(deriv, deriv_data=e_rho_gamma_gamma)
1276 deriv => xc_dset_get_derivative(deriv_set, &
1277 [deriv_rho, deriv_gamma, deriv_tau], &
1278 allocate_deriv=.true.)
1279 CALL xc_derivative_get(deriv, deriv_data=e_rho_gamma_tau)
1280 deriv => xc_dset_get_derivative(deriv_set, &
1281 [deriv_rho, deriv_tau, deriv_tau], &
1282 allocate_deriv=.true.)
1283 CALL xc_derivative_get(deriv, deriv_data=e_rho_tau_tau)
1284 deriv => xc_dset_get_derivative(deriv_set, &
1285 [deriv_gamma, deriv_gamma, deriv_gamma], &
1286 allocate_deriv=.true.)
1287 CALL xc_derivative_get(deriv, deriv_data=e_gamma_gamma_gamma)
1288 deriv => xc_dset_get_derivative(deriv_set, &
1289 [deriv_gamma, deriv_gamma, deriv_tau], &
1290 allocate_deriv=.true.)
1291 CALL xc_derivative_get(deriv, deriv_data=e_gamma_gamma_tau)
1292 deriv => xc_dset_get_derivative(deriv_set, &
1293 [deriv_gamma, deriv_tau, deriv_tau], &
1294 allocate_deriv=.true.)
1295 CALL xc_derivative_get(deriv, deriv_data=e_gamma_tau_tau)
1296 deriv => xc_dset_get_derivative(deriv_set, &
1297 [deriv_tau, deriv_tau, deriv_tau], &
1298 allocate_deriv=.true.)
1299 CALL xc_derivative_get(deriv, deriv_data=e_tau_tau_tau)
1300 IF (has_laplace) THEN
1301 deriv => xc_dset_get_derivative(deriv_set, &
1302 [deriv_rho, deriv_rho, deriv_laplace_rho], &
1303 allocate_deriv=.true.)
1304 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_laplace_rho)
1305 deriv => xc_dset_get_derivative(deriv_set, &
1306 [deriv_rho, deriv_gamma, deriv_laplace_rho], &
1307 allocate_deriv=.true.)
1308 CALL xc_derivative_get(deriv, deriv_data=e_rho_gamma_laplace_rho)
1309 deriv => xc_dset_get_derivative(deriv_set, &
1310 [deriv_rho, deriv_laplace_rho, deriv_laplace_rho], &
1311 allocate_deriv=.true.)
1312 CALL xc_derivative_get(deriv, deriv_data=e_rho_laplace_rho_laplace_rho)
1313 deriv => xc_dset_get_derivative(deriv_set, &
1314 [deriv_rho, deriv_laplace_rho, deriv_tau], &
1315 allocate_deriv=.true.)
1316 CALL xc_derivative_get(deriv, deriv_data=e_rho_laplace_rho_tau)
1317 deriv => xc_dset_get_derivative(deriv_set, &
1318 [deriv_gamma, deriv_gamma, deriv_laplace_rho], &
1319 allocate_deriv=.true.)
1320 CALL xc_derivative_get(deriv, deriv_data=e_gamma_gamma_laplace_rho)
1321 deriv => xc_dset_get_derivative(deriv_set, &
1322 [deriv_gamma, deriv_laplace_rho, deriv_laplace_rho], &
1323 allocate_deriv=.true.)
1324 CALL xc_derivative_get(deriv, deriv_data=e_gamma_laplace_rho_laplace_rho)
1325 deriv => xc_dset_get_derivative(deriv_set, &
1326 [deriv_gamma, deriv_laplace_rho, deriv_tau], &
1327 allocate_deriv=.true.)
1328 CALL xc_derivative_get(deriv, deriv_data=e_gamma_laplace_rho_tau)
1329 deriv => xc_dset_get_derivative(deriv_set, &
1330 [deriv_laplace_rho, deriv_laplace_rho, deriv_laplace_rho], &
1331 allocate_deriv=.true.)
1332 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_laplace_rho_laplace_rho)
1333 deriv => xc_dset_get_derivative(deriv_set, &
1334 [deriv_laplace_rho, deriv_laplace_rho, deriv_tau], &
1335 allocate_deriv=.true.)
1336 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_laplace_rho_tau)
1337 deriv => xc_dset_get_derivative(deriv_set, &
1338 [deriv_laplace_rho, deriv_tau, deriv_tau], &
1339 allocate_deriv=.true.)
1340 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_tau_tau)
1341 END IF
1342 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho, deriv_rho], &
1343 allocate_deriv=.true.)
1344 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_rho)
1345 CASE default
1346 cpabort(trim(func_name)//": this XC_FAMILY is currently not supported.")
1347 END SELECT
1348 END IF
1349
1350!$OMP PARALLEL DEFAULT(NONE), &
1351!$OMP SHARED(rho,norm_drho,laplace_rho,tau,e_0,e_rho,e_ndrho,e_laplace_rho),&
1352!$OMP SHARED(e_tau,e_rho_rho,e_ndrho_rho,e_ndrho_ndrho,e_rho_laplace_rho),&
1353!$OMP SHARED(e_rho_tau,e_ndrho_laplace_rho,e_ndrho_tau,e_laplace_rho_laplace_rho),&
1354!$OMP SHARED(e_laplace_rho_tau,e_tau_tau,e_rho_rho_rho),&
1355!$OMP SHARED(e_gamma),&
1356!$OMP SHARED(e_rho_gamma),&
1357!$OMP SHARED(e_gamma_gamma),&
1358!$OMP SHARED(e_gamma_laplace_rho),&
1359!$OMP SHARED(e_gamma_tau),&
1360!$OMP SHARED(e_rho_rho_gamma),&
1361!$OMP SHARED(e_rho_rho_laplace_rho),&
1362!$OMP SHARED(e_rho_rho_tau),&
1363!$OMP SHARED(e_rho_gamma_gamma),&
1364!$OMP SHARED(e_rho_gamma_laplace_rho),&
1365!$OMP SHARED(e_rho_gamma_tau),&
1366!$OMP SHARED(e_rho_laplace_rho_laplace_rho),&
1367!$OMP SHARED(e_rho_laplace_rho_tau),&
1368!$OMP SHARED(e_rho_tau_tau),&
1369!$OMP SHARED(e_gamma_gamma_gamma),&
1370!$OMP SHARED(e_gamma_gamma_laplace_rho),&
1371!$OMP SHARED(e_gamma_gamma_tau),&
1372!$OMP SHARED(e_gamma_laplace_rho_laplace_rho),&
1373!$OMP SHARED(e_gamma_laplace_rho_tau),&
1374!$OMP SHARED(e_gamma_tau_tau),&
1375!$OMP SHARED(e_laplace_rho_laplace_rho_laplace_rho),&
1376!$OMP SHARED(e_laplace_rho_laplace_rho_tau),&
1377!$OMP SHARED(e_laplace_rho_tau_tau),&
1378!$OMP SHARED(e_tau_tau_tau),&
1379!$OMP SHARED(grad_deriv,npoints),&
1380!$OMP SHARED(func_name,func_scale,workers)
1381
1382 CALL libxc_spin_unpolarized_calc(rho=rho, norm_drho=norm_drho, &
1383 laplace_rho=laplace_rho, tau=tau, &
1384 e_0=e_0, e_rho=e_rho, e_ndrho=e_ndrho, e_laplace_rho=e_laplace_rho, &
1385 e_tau=e_tau, e_rho_rho=e_rho_rho, e_ndrho_rho=e_ndrho_rho, &
1386 e_ndrho_ndrho=e_ndrho_ndrho, e_rho_laplace_rho=e_rho_laplace_rho, &
1387 e_rho_tau=e_rho_tau, e_ndrho_laplace_rho=e_ndrho_laplace_rho, &
1388 e_ndrho_tau=e_ndrho_tau, e_laplace_rho_laplace_rho=e_laplace_rho_laplace_rho, &
1389 e_laplace_rho_tau=e_laplace_rho_tau, e_tau_tau=e_tau_tau, &
1390 e_rho_rho_rho=e_rho_rho_rho, &
1391 e_gamma=e_gamma, &
1392 e_rho_gamma=e_rho_gamma, &
1393 e_gamma_gamma=e_gamma_gamma, &
1394 e_gamma_laplace_rho=e_gamma_laplace_rho, &
1395 e_gamma_tau=e_gamma_tau, &
1396 e_rho_rho_gamma=e_rho_rho_gamma, &
1397 e_rho_rho_laplace_rho=e_rho_rho_laplace_rho, &
1398 e_rho_rho_tau=e_rho_rho_tau, &
1399 e_rho_gamma_gamma=e_rho_gamma_gamma, &
1400 e_rho_gamma_laplace_rho=e_rho_gamma_laplace_rho, &
1401 e_rho_gamma_tau=e_rho_gamma_tau, &
1402 e_rho_laplace_rho_laplace_rho=e_rho_laplace_rho_laplace_rho, &
1403 e_rho_laplace_rho_tau=e_rho_laplace_rho_tau, &
1404 e_rho_tau_tau=e_rho_tau_tau, &
1405 e_gamma_gamma_gamma=e_gamma_gamma_gamma, &
1406 e_gamma_gamma_laplace_rho=e_gamma_gamma_laplace_rho, &
1407 e_gamma_gamma_tau=e_gamma_gamma_tau, &
1408 e_gamma_laplace_rho_laplace_rho=e_gamma_laplace_rho_laplace_rho, &
1409 e_gamma_laplace_rho_tau=e_gamma_laplace_rho_tau, &
1410 e_gamma_tau_tau=e_gamma_tau_tau, &
1411 e_laplace_rho_laplace_rho_laplace_rho=e_laplace_rho_laplace_rho_laplace_rho, &
1412 e_laplace_rho_laplace_rho_tau=e_laplace_rho_laplace_rho_tau, &
1413 e_laplace_rho_tau_tau=e_laplace_rho_tau_tau, &
1414 e_tau_tau_tau=e_tau_tau_tau, &
1415 grad_deriv=grad_deriv, npoints=npoints, &
1416 func_name=func_name, sc=func_scale, workers=workers)
1417
1418!$OMP END PARALLEL
1419
1420 NULLIFY (dummy)
1421 NULLIFY (workers)
1422
1423 CALL timestop(handle)
1424#else
1425 mark_used(rho_set)
1426 mark_used(deriv_set)
1427 mark_used(grad_deriv)
1428 mark_used(libxc_params)
1429 mark_used(func_name_override)
1430 CALL cp_abort(__location__, "Unknown functional! If you are asking "// &
1431 "for a functional of the LibXC library, "// &
1432 "you have to download and install the library!")
1433#endif
1434 END SUBROUTINE libxc_spin_unpolarized_eval
1435
1436! **************************************************************************************************
1437!> \brief evaluates the functional from libxc
1438!> \param rho_set the density where you want to evaluate the functional
1439!> \param deriv_set place where to store the functional derivatives (they are
1440!> added to the derivatives)
1441!> \param grad_deriv degree of the derivative that should be evaluated;
1442!> all derivatives up to the given degree are evaluated, in a single
1443!> LibXC call per block of grid points
1444!> \param libxc_params input parameter (functional name, scaling and parameters)
1445!> \param func_name_override optional LibXC functional name overriding the section name
1446!> \author F. Tran
1447! **************************************************************************************************
1448 SUBROUTINE libxc_spin_polarized_eval(rho_set, deriv_set, grad_deriv, libxc_params, func_name_override)
1449
1450 TYPE(xc_rho_set_type), INTENT(IN) :: rho_set
1451 TYPE(xc_derivative_set_type), INTENT(IN) :: deriv_set
1452 INTEGER, INTENT(in) :: grad_deriv
1453 TYPE(section_vals_type), POINTER :: libxc_params
1454 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: func_name_override
1455
1456#if defined (__LIBXC)
1457 CHARACTER(len=*), PARAMETER :: routinen = 'libxc_spin_polarized_eval'
1458
1459 CHARACTER(LEN=default_string_length) :: func_name
1460 INTEGER :: handle, iw, npoints
1461 INTEGER, DIMENSION(2, 3) :: bo
1462 LOGICAL :: has_laplace
1463 REAL(kind=dp) :: epsilon_rho, epsilon_tau, func_scale
1464 TYPE(libxc_worker_set_type), POINTER :: workers
1465 TYPE(section_vals_type), POINTER :: no_params
1466 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: dummy, e_0, e_laplace_rhoa, &
1467 e_laplace_rhoa_laplace_rhoa, e_laplace_rhoa_laplace_rhob, &
1468 e_laplace_rhoa_tau_a, e_laplace_rhoa_tau_b, e_laplace_rhob, &
1469 e_laplace_rhob_laplace_rhob, e_laplace_rhob_tau_a, &
1470 e_laplace_rhob_tau_b, e_ndrho, e_ndrho_laplace_rhoa, &
1471 e_ndrho_laplace_rhob, e_ndrho_ndrho, e_ndrho_ndrhoa, e_ndrho_ndrhob, &
1472 e_ndrho_rhoa, e_ndrho_rhob, e_ndrho_tau_a, e_ndrho_tau_b, e_ndrhoa, &
1473 e_ndrhoa_laplace_rhoa, e_ndrhoa_laplace_rhob, e_ndrhoa_ndrhoa, &
1474 e_ndrhoa_ndrhob, e_ndrhoa_rhoa, e_ndrhoa_rhob, e_ndrhoa_tau_a, &
1475 e_ndrhoa_tau_b, e_ndrhob
1476 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_ndrhob_laplace_rhoa, &
1477 e_ndrhob_laplace_rhob, e_ndrhob_ndrhob, e_ndrhob_rhoa, e_ndrhob_rhob, &
1478 e_ndrhob_tau_a, e_ndrhob_tau_b, e_rhoa, e_rhoa_laplace_rhoa, &
1479 e_rhoa_laplace_rhob, e_rhoa_rhoa, e_rhoa_rhoa_rhoa, e_rhoa_rhoa_rhob, &
1480 e_rhoa_rhob, e_rhoa_rhob_rhob, e_rhoa_tau_a, e_rhoa_tau_b, e_rhob, &
1481 e_rhob_laplace_rhoa, e_rhob_laplace_rhob, e_rhob_rhob, &
1482 e_rhob_rhob_rhob, e_rhob_tau_a, e_rhob_tau_b, e_tau_a, e_tau_a_tau_a, &
1483 e_tau_a_tau_b, e_tau_b, e_tau_b_tau_b, laplace_rhoa, laplace_rhob, &
1484 norm_drho, norm_drhoa, norm_drhob, rhoa, rhob, tau_a, tau_b
1485 ! derivatives w.r.t. the reduced gradients gamma_ij = grad rho_i . grad rho_j
1486 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa
1487 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab
1488 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb
1489 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_aa
1490 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_ab
1491 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_bb
1492 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_aa
1493 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_ab
1494 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_bb
1495 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_aa
1496 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_ab
1497 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_bb
1498 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_laplace_rhoa
1499 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_laplace_rhob
1500 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_tau_a
1501 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_tau_b
1502 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_ab
1503 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_bb
1504 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_laplace_rhoa
1505 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_laplace_rhob
1506 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_tau_a
1507 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_tau_b
1508 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_gamma_bb
1509 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_laplace_rhoa
1510 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_laplace_rhob
1511 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_tau_a
1512 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_tau_b
1513 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhoa_gamma_aa
1514 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhoa_gamma_ab
1515 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhoa_gamma_bb
1516 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhoa_laplace_rhoa
1517 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhoa_laplace_rhob
1518 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhoa_tau_a
1519 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhoa_tau_b
1520 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhob_gamma_aa
1521 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhob_gamma_ab
1522 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhob_gamma_bb
1523 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhob_laplace_rhoa
1524 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhob_laplace_rhob
1525 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhob_tau_a
1526 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_rhob_tau_b
1527 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_aa_gamma_aa
1528 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_aa_gamma_ab
1529 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_aa_gamma_bb
1530 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_aa_laplace_rhoa
1531 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_aa_laplace_rhob
1532 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_aa_tau_a
1533 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_aa_tau_b
1534 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_ab_gamma_ab
1535 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_ab_gamma_bb
1536 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_ab_laplace_rhoa
1537 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_ab_laplace_rhob
1538 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_ab_tau_a
1539 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_ab_tau_b
1540 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_bb_gamma_bb
1541 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_bb_laplace_rhoa
1542 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_bb_laplace_rhob
1543 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_bb_tau_a
1544 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_gamma_bb_tau_b
1545 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_laplace_rhoa_laplace_rhoa
1546 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_laplace_rhoa_laplace_rhob
1547 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_laplace_rhoa_tau_a
1548 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_laplace_rhoa_tau_b
1549 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_laplace_rhob_laplace_rhob
1550 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_laplace_rhob_tau_a
1551 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_laplace_rhob_tau_b
1552 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_tau_a_tau_a
1553 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_tau_a_tau_b
1554 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhoa_tau_b_tau_b
1555 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_rhob_gamma_aa
1556 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_rhob_gamma_ab
1557 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_rhob_gamma_bb
1558 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_rhob_laplace_rhoa
1559 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_rhob_laplace_rhob
1560 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_rhob_tau_a
1561 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_rhob_tau_b
1562 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_aa_gamma_aa
1563 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_aa_gamma_ab
1564 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_aa_gamma_bb
1565 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_aa_laplace_rhoa
1566 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_aa_laplace_rhob
1567 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_aa_tau_a
1568 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_aa_tau_b
1569 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_ab_gamma_ab
1570 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_ab_gamma_bb
1571 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_ab_laplace_rhoa
1572 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_ab_laplace_rhob
1573 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_ab_tau_a
1574 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_ab_tau_b
1575 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_bb_gamma_bb
1576 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_bb_laplace_rhoa
1577 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_bb_laplace_rhob
1578 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_bb_tau_a
1579 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_gamma_bb_tau_b
1580 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_laplace_rhoa_laplace_rhoa
1581 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_laplace_rhoa_laplace_rhob
1582 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_laplace_rhoa_tau_a
1583 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_laplace_rhoa_tau_b
1584 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_laplace_rhob_laplace_rhob
1585 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_laplace_rhob_tau_a
1586 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_laplace_rhob_tau_b
1587 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_tau_a_tau_a
1588 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_tau_a_tau_b
1589 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_rhob_tau_b_tau_b
1590 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_aa_gamma_aa
1591 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_aa_gamma_ab
1592 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_aa_gamma_bb
1593 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_aa_laplace_rhoa
1594 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_aa_laplace_rhob
1595 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_aa_tau_a
1596 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_aa_tau_b
1597 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_ab_gamma_ab
1598 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_ab_gamma_bb
1599 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_ab_laplace_rhoa
1600 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_ab_laplace_rhob
1601 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_ab_tau_a
1602 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_ab_tau_b
1603 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_bb_gamma_bb
1604 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_bb_laplace_rhoa
1605 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_bb_laplace_rhob
1606 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_bb_tau_a
1607 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_gamma_bb_tau_b
1608 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_laplace_rhoa_laplace_rhoa
1609 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_laplace_rhoa_laplace_rhob
1610 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_laplace_rhoa_tau_a
1611 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_laplace_rhoa_tau_b
1612 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_laplace_rhob_laplace_rhob
1613 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_laplace_rhob_tau_a
1614 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_laplace_rhob_tau_b
1615 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_tau_a_tau_a
1616 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_tau_a_tau_b
1617 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_aa_tau_b_tau_b
1618 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_ab_gamma_ab
1619 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_ab_gamma_bb
1620 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_ab_laplace_rhoa
1621 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_ab_laplace_rhob
1622 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_ab_tau_a
1623 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_ab_tau_b
1624 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_bb_gamma_bb
1625 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_bb_laplace_rhoa
1626 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_bb_laplace_rhob
1627 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_bb_tau_a
1628 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_gamma_bb_tau_b
1629 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_laplace_rhoa_laplace_rhoa
1630 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_laplace_rhoa_laplace_rhob
1631 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_laplace_rhoa_tau_a
1632 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_laplace_rhoa_tau_b
1633 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_laplace_rhob_laplace_rhob
1634 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_laplace_rhob_tau_a
1635 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_laplace_rhob_tau_b
1636 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_tau_a_tau_a
1637 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_tau_a_tau_b
1638 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_ab_tau_b_tau_b
1639 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_gamma_bb_gamma_bb
1640 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_gamma_bb_laplace_rhoa
1641 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_gamma_bb_laplace_rhob
1642 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_gamma_bb_tau_a
1643 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_gamma_bb_tau_b
1644 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_laplace_rhoa_laplace_rhoa
1645 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_laplace_rhoa_laplace_rhob
1646 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_laplace_rhoa_tau_a
1647 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_laplace_rhoa_tau_b
1648 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_laplace_rhob_laplace_rhob
1649 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_laplace_rhob_tau_a
1650 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_laplace_rhob_tau_b
1651 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_tau_a_tau_a
1652 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_tau_a_tau_b
1653 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_gamma_bb_tau_b_tau_b
1654 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhoa_laplace_rhoa_laplace_rhoa
1655 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhoa_laplace_rhoa_laplace_rhob
1656 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhoa_laplace_rhoa_tau_a
1657 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhoa_laplace_rhoa_tau_b
1658 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhoa_laplace_rhob_laplace_rhob
1659 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhoa_laplace_rhob_tau_a
1660 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhoa_laplace_rhob_tau_b
1661 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhoa_tau_a_tau_a
1662 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhoa_tau_a_tau_b
1663 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhoa_tau_b_tau_b
1664 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhob_laplace_rhob_laplace_rhob
1665 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhob_laplace_rhob_tau_a
1666 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhob_laplace_rhob_tau_b
1667 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhob_tau_a_tau_a
1668 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhob_tau_a_tau_b
1669 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_laplace_rhob_tau_b_tau_b
1670 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_tau_a_tau_a_tau_a
1671 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_tau_a_tau_a_tau_b
1672 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_tau_a_tau_b_tau_b
1673 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_tau_b_tau_b_tau_b
1674 TYPE(xc_derivative_type), POINTER :: deriv
1675 TYPE(xc_f03_func_info_t) :: xc_info
1676
1677 CALL timeset(routinen, handle)
1678
1679 ! Only "everything up to grad_deriv" is supported. Asking for a single
1680 ! derivative order in isolation is rejected here rather than further down,
1681 ! where it would quietly evaluate nothing at all.
1682 IF (grad_deriv < 0) THEN
1683 cpabort("Evaluating a single derivative order is not supported.")
1684 END IF
1685 IF (grad_deriv > 3) THEN
1686 cpabort("derivatives larger than 3 not implemented")
1687 END IF
1688
1689 NULLIFY (dummy)
1690 NULLIFY (workers)
1691 NULLIFY (rhoa, rhob, norm_drho, norm_drhoa, norm_drhob, laplace_rhoa, &
1692 laplace_rhob, tau_a, tau_b)
1693
1694 IF (PRESENT(func_name_override)) THEN
1695 func_name = func_name_override
1696 func_scale = 1.0_dp
1697 ELSE
1698 func_name = libxc_params%section%name
1699 CALL section_vals_val_get(libxc_params, "scale", r_val=func_scale)
1700 END IF
1701
1702 IF (abs(func_scale - 1.0_dp) < 1.0e-10_dp) func_scale = 1.0_dp
1703
1704 CALL xc_rho_set_get(rho_set, can_return_null=.true., &
1705 rhoa=rhoa, rhob=rhob, norm_drho=norm_drho, &
1706 norm_drhoa=norm_drhoa, norm_drhob=norm_drhob, &
1707 laplace_rhoa=laplace_rhoa, laplace_rhob=laplace_rhob, &
1708 rho_cutoff=epsilon_rho, tau_cutoff=epsilon_tau, &
1709 tau_a=tau_a, tau_b=tau_b, local_bounds=bo)
1710
1711 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
1712
1713 ! One functional object per thread, kept across calls. The cutoffs are part
1714 ! of the worker setup because LibXC does the screening itself.
1715 IF (PRESENT(func_name_override)) THEN
1716 ! an overriding name carries no input section, so no parameters are set
1717 NULLIFY (no_params)
1718 iw = libxc_get_workers(func_name, xc_polarized, no_params, epsilon_rho, epsilon_tau, &
1719 grad_deriv)
1720 ELSE
1721 iw = libxc_get_workers(func_name, xc_polarized, libxc_params, epsilon_rho, epsilon_tau, &
1722 grad_deriv)
1723 END IF
1724 workers => libxc_cache(iw)
1725 xc_info = workers%worker(1)%info
1726 has_laplace = workers%has_laplace
1727
1728 ! see libxc_unused: the arguments the requested order does not produce are
1729 ! never touched, but they still have to point somewhere
1730 CALL libxc_reserve_unused(npoints)
1731 dummy(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)) => libxc_unused(1:npoints)
1732
1733 ! due to assumed shape array usage in next routine
1734 IF (.NOT. ASSOCIATED(norm_drho)) norm_drho => rhoa
1735 IF (.NOT. ASSOCIATED(norm_drhoa)) norm_drhoa => rhoa
1736 IF (.NOT. ASSOCIATED(norm_drhob)) norm_drhob => rhoa
1737 IF (.NOT. ASSOCIATED(tau_a)) tau_a => rhoa
1738 IF (.NOT. ASSOCIATED(tau_b)) tau_b => rhoa
1739
1740 ! only some MGGA functionals really need the Laplacian,
1741 ! all others can work with rhoa (read-only) as dummy
1742 IF (.NOT. has_laplace) laplace_rhoa => rhoa
1743 IF (.NOT. has_laplace) laplace_rhob => rhoa
1744
1745 e_0 => dummy
1746 e_rhoa => dummy
1747 e_rhob => dummy
1748 e_ndrho => dummy
1749 e_ndrhoa => dummy
1750 e_ndrhob => dummy
1751 e_laplace_rhoa => dummy
1752 e_laplace_rhob => dummy
1753 e_tau_a => dummy
1754 e_tau_b => dummy
1755 e_rhoa_rhoa => dummy
1756 e_rhoa_rhob => dummy
1757 e_rhob_rhob => dummy
1758 e_ndrho_rhoa => dummy
1759 e_ndrho_rhob => dummy
1760 e_ndrhoa_rhoa => dummy
1761 e_ndrhoa_rhob => dummy
1762 e_ndrhob_rhoa => dummy
1763 e_ndrhob_rhob => dummy
1764 e_ndrho_ndrho => dummy
1765 e_ndrho_ndrhoa => dummy
1766 e_ndrho_ndrhob => dummy
1767 e_ndrhoa_ndrhoa => dummy
1768 e_ndrhoa_ndrhob => dummy
1769 e_ndrhob_ndrhob => dummy
1770 e_rhoa_laplace_rhoa => dummy
1771 e_rhoa_laplace_rhob => dummy
1772 e_rhob_laplace_rhoa => dummy
1773 e_rhob_laplace_rhob => dummy
1774 e_rhoa_tau_a => dummy
1775 e_rhoa_tau_b => dummy
1776 e_rhob_tau_a => dummy
1777 e_rhob_tau_b => dummy
1778 e_ndrho_laplace_rhoa => dummy
1779 e_ndrho_laplace_rhob => dummy
1780 e_ndrhoa_laplace_rhoa => dummy
1781 e_ndrhoa_laplace_rhob => dummy
1782 e_ndrhob_laplace_rhoa => dummy
1783 e_ndrhob_laplace_rhob => dummy
1784 e_ndrho_tau_a => dummy
1785 e_ndrho_tau_b => dummy
1786 e_ndrhoa_tau_a => dummy
1787 e_ndrhoa_tau_b => dummy
1788 e_ndrhob_tau_a => dummy
1789 e_ndrhob_tau_b => dummy
1790 e_laplace_rhoa_laplace_rhoa => dummy
1791 e_laplace_rhoa_laplace_rhob => dummy
1792 e_laplace_rhob_laplace_rhob => dummy
1793 e_laplace_rhoa_tau_a => dummy
1794 e_laplace_rhoa_tau_b => dummy
1795 e_laplace_rhob_tau_a => dummy
1796 e_laplace_rhob_tau_b => dummy
1797 e_tau_a_tau_a => dummy
1798 e_tau_a_tau_b => dummy
1799 e_tau_b_tau_b => dummy
1800 e_rhoa_rhoa_rhoa => dummy
1801 e_rhoa_rhoa_rhob => dummy
1802 e_rhoa_rhob_rhob => dummy
1803 e_rhob_rhob_rhob => dummy
1804 e_gamma_aa => dummy
1805 e_gamma_ab => dummy
1806 e_gamma_bb => dummy
1807 e_rhoa_gamma_aa => dummy
1808 e_rhoa_gamma_ab => dummy
1809 e_rhoa_gamma_bb => dummy
1810 e_rhob_gamma_aa => dummy
1811 e_rhob_gamma_ab => dummy
1812 e_rhob_gamma_bb => dummy
1813 e_gamma_aa_gamma_aa => dummy
1814 e_gamma_aa_gamma_ab => dummy
1815 e_gamma_aa_gamma_bb => dummy
1816 e_gamma_aa_laplace_rhoa => dummy
1817 e_gamma_aa_laplace_rhob => dummy
1818 e_gamma_aa_tau_a => dummy
1819 e_gamma_aa_tau_b => dummy
1820 e_gamma_ab_gamma_ab => dummy
1821 e_gamma_ab_gamma_bb => dummy
1822 e_gamma_ab_laplace_rhoa => dummy
1823 e_gamma_ab_laplace_rhob => dummy
1824 e_gamma_ab_tau_a => dummy
1825 e_gamma_ab_tau_b => dummy
1826 e_gamma_bb_gamma_bb => dummy
1827 e_gamma_bb_laplace_rhoa => dummy
1828 e_gamma_bb_laplace_rhob => dummy
1829 e_gamma_bb_tau_a => dummy
1830 e_gamma_bb_tau_b => dummy
1831 e_rhoa_rhoa_gamma_aa => dummy
1832 e_rhoa_rhoa_gamma_ab => dummy
1833 e_rhoa_rhoa_gamma_bb => dummy
1834 e_rhoa_rhoa_laplace_rhoa => dummy
1835 e_rhoa_rhoa_laplace_rhob => dummy
1836 e_rhoa_rhoa_tau_a => dummy
1837 e_rhoa_rhoa_tau_b => dummy
1838 e_rhoa_rhob_gamma_aa => dummy
1839 e_rhoa_rhob_gamma_ab => dummy
1840 e_rhoa_rhob_gamma_bb => dummy
1841 e_rhoa_rhob_laplace_rhoa => dummy
1842 e_rhoa_rhob_laplace_rhob => dummy
1843 e_rhoa_rhob_tau_a => dummy
1844 e_rhoa_rhob_tau_b => dummy
1845 e_rhoa_gamma_aa_gamma_aa => dummy
1846 e_rhoa_gamma_aa_gamma_ab => dummy
1847 e_rhoa_gamma_aa_gamma_bb => dummy
1848 e_rhoa_gamma_aa_laplace_rhoa => dummy
1849 e_rhoa_gamma_aa_laplace_rhob => dummy
1850 e_rhoa_gamma_aa_tau_a => dummy
1851 e_rhoa_gamma_aa_tau_b => dummy
1852 e_rhoa_gamma_ab_gamma_ab => dummy
1853 e_rhoa_gamma_ab_gamma_bb => dummy
1854 e_rhoa_gamma_ab_laplace_rhoa => dummy
1855 e_rhoa_gamma_ab_laplace_rhob => dummy
1856 e_rhoa_gamma_ab_tau_a => dummy
1857 e_rhoa_gamma_ab_tau_b => dummy
1858 e_rhoa_gamma_bb_gamma_bb => dummy
1859 e_rhoa_gamma_bb_laplace_rhoa => dummy
1860 e_rhoa_gamma_bb_laplace_rhob => dummy
1861 e_rhoa_gamma_bb_tau_a => dummy
1862 e_rhoa_gamma_bb_tau_b => dummy
1863 e_rhoa_laplace_rhoa_laplace_rhoa => dummy
1864 e_rhoa_laplace_rhoa_laplace_rhob => dummy
1865 e_rhoa_laplace_rhoa_tau_a => dummy
1866 e_rhoa_laplace_rhoa_tau_b => dummy
1867 e_rhoa_laplace_rhob_laplace_rhob => dummy
1868 e_rhoa_laplace_rhob_tau_a => dummy
1869 e_rhoa_laplace_rhob_tau_b => dummy
1870 e_rhoa_tau_a_tau_a => dummy
1871 e_rhoa_tau_a_tau_b => dummy
1872 e_rhoa_tau_b_tau_b => dummy
1873 e_rhob_rhob_gamma_aa => dummy
1874 e_rhob_rhob_gamma_ab => dummy
1875 e_rhob_rhob_gamma_bb => dummy
1876 e_rhob_rhob_laplace_rhoa => dummy
1877 e_rhob_rhob_laplace_rhob => dummy
1878 e_rhob_rhob_tau_a => dummy
1879 e_rhob_rhob_tau_b => dummy
1880 e_rhob_gamma_aa_gamma_aa => dummy
1881 e_rhob_gamma_aa_gamma_ab => dummy
1882 e_rhob_gamma_aa_gamma_bb => dummy
1883 e_rhob_gamma_aa_laplace_rhoa => dummy
1884 e_rhob_gamma_aa_laplace_rhob => dummy
1885 e_rhob_gamma_aa_tau_a => dummy
1886 e_rhob_gamma_aa_tau_b => dummy
1887 e_rhob_gamma_ab_gamma_ab => dummy
1888 e_rhob_gamma_ab_gamma_bb => dummy
1889 e_rhob_gamma_ab_laplace_rhoa => dummy
1890 e_rhob_gamma_ab_laplace_rhob => dummy
1891 e_rhob_gamma_ab_tau_a => dummy
1892 e_rhob_gamma_ab_tau_b => dummy
1893 e_rhob_gamma_bb_gamma_bb => dummy
1894 e_rhob_gamma_bb_laplace_rhoa => dummy
1895 e_rhob_gamma_bb_laplace_rhob => dummy
1896 e_rhob_gamma_bb_tau_a => dummy
1897 e_rhob_gamma_bb_tau_b => dummy
1898 e_rhob_laplace_rhoa_laplace_rhoa => dummy
1899 e_rhob_laplace_rhoa_laplace_rhob => dummy
1900 e_rhob_laplace_rhoa_tau_a => dummy
1901 e_rhob_laplace_rhoa_tau_b => dummy
1902 e_rhob_laplace_rhob_laplace_rhob => dummy
1903 e_rhob_laplace_rhob_tau_a => dummy
1904 e_rhob_laplace_rhob_tau_b => dummy
1905 e_rhob_tau_a_tau_a => dummy
1906 e_rhob_tau_a_tau_b => dummy
1907 e_rhob_tau_b_tau_b => dummy
1908 e_gamma_aa_gamma_aa_gamma_aa => dummy
1909 e_gamma_aa_gamma_aa_gamma_ab => dummy
1910 e_gamma_aa_gamma_aa_gamma_bb => dummy
1911 e_gamma_aa_gamma_aa_laplace_rhoa => dummy
1912 e_gamma_aa_gamma_aa_laplace_rhob => dummy
1913 e_gamma_aa_gamma_aa_tau_a => dummy
1914 e_gamma_aa_gamma_aa_tau_b => dummy
1915 e_gamma_aa_gamma_ab_gamma_ab => dummy
1916 e_gamma_aa_gamma_ab_gamma_bb => dummy
1917 e_gamma_aa_gamma_ab_laplace_rhoa => dummy
1918 e_gamma_aa_gamma_ab_laplace_rhob => dummy
1919 e_gamma_aa_gamma_ab_tau_a => dummy
1920 e_gamma_aa_gamma_ab_tau_b => dummy
1921 e_gamma_aa_gamma_bb_gamma_bb => dummy
1922 e_gamma_aa_gamma_bb_laplace_rhoa => dummy
1923 e_gamma_aa_gamma_bb_laplace_rhob => dummy
1924 e_gamma_aa_gamma_bb_tau_a => dummy
1925 e_gamma_aa_gamma_bb_tau_b => dummy
1926 e_gamma_aa_laplace_rhoa_laplace_rhoa => dummy
1927 e_gamma_aa_laplace_rhoa_laplace_rhob => dummy
1928 e_gamma_aa_laplace_rhoa_tau_a => dummy
1929 e_gamma_aa_laplace_rhoa_tau_b => dummy
1930 e_gamma_aa_laplace_rhob_laplace_rhob => dummy
1931 e_gamma_aa_laplace_rhob_tau_a => dummy
1932 e_gamma_aa_laplace_rhob_tau_b => dummy
1933 e_gamma_aa_tau_a_tau_a => dummy
1934 e_gamma_aa_tau_a_tau_b => dummy
1935 e_gamma_aa_tau_b_tau_b => dummy
1936 e_gamma_ab_gamma_ab_gamma_ab => dummy
1937 e_gamma_ab_gamma_ab_gamma_bb => dummy
1938 e_gamma_ab_gamma_ab_laplace_rhoa => dummy
1939 e_gamma_ab_gamma_ab_laplace_rhob => dummy
1940 e_gamma_ab_gamma_ab_tau_a => dummy
1941 e_gamma_ab_gamma_ab_tau_b => dummy
1942 e_gamma_ab_gamma_bb_gamma_bb => dummy
1943 e_gamma_ab_gamma_bb_laplace_rhoa => dummy
1944 e_gamma_ab_gamma_bb_laplace_rhob => dummy
1945 e_gamma_ab_gamma_bb_tau_a => dummy
1946 e_gamma_ab_gamma_bb_tau_b => dummy
1947 e_gamma_ab_laplace_rhoa_laplace_rhoa => dummy
1948 e_gamma_ab_laplace_rhoa_laplace_rhob => dummy
1949 e_gamma_ab_laplace_rhoa_tau_a => dummy
1950 e_gamma_ab_laplace_rhoa_tau_b => dummy
1951 e_gamma_ab_laplace_rhob_laplace_rhob => dummy
1952 e_gamma_ab_laplace_rhob_tau_a => dummy
1953 e_gamma_ab_laplace_rhob_tau_b => dummy
1954 e_gamma_ab_tau_a_tau_a => dummy
1955 e_gamma_ab_tau_a_tau_b => dummy
1956 e_gamma_ab_tau_b_tau_b => dummy
1957 e_gamma_bb_gamma_bb_gamma_bb => dummy
1958 e_gamma_bb_gamma_bb_laplace_rhoa => dummy
1959 e_gamma_bb_gamma_bb_laplace_rhob => dummy
1960 e_gamma_bb_gamma_bb_tau_a => dummy
1961 e_gamma_bb_gamma_bb_tau_b => dummy
1962 e_gamma_bb_laplace_rhoa_laplace_rhoa => dummy
1963 e_gamma_bb_laplace_rhoa_laplace_rhob => dummy
1964 e_gamma_bb_laplace_rhoa_tau_a => dummy
1965 e_gamma_bb_laplace_rhoa_tau_b => dummy
1966 e_gamma_bb_laplace_rhob_laplace_rhob => dummy
1967 e_gamma_bb_laplace_rhob_tau_a => dummy
1968 e_gamma_bb_laplace_rhob_tau_b => dummy
1969 e_gamma_bb_tau_a_tau_a => dummy
1970 e_gamma_bb_tau_a_tau_b => dummy
1971 e_gamma_bb_tau_b_tau_b => dummy
1972 e_laplace_rhoa_laplace_rhoa_laplace_rhoa => dummy
1973 e_laplace_rhoa_laplace_rhoa_laplace_rhob => dummy
1974 e_laplace_rhoa_laplace_rhoa_tau_a => dummy
1975 e_laplace_rhoa_laplace_rhoa_tau_b => dummy
1976 e_laplace_rhoa_laplace_rhob_laplace_rhob => dummy
1977 e_laplace_rhoa_laplace_rhob_tau_a => dummy
1978 e_laplace_rhoa_laplace_rhob_tau_b => dummy
1979 e_laplace_rhoa_tau_a_tau_a => dummy
1980 e_laplace_rhoa_tau_a_tau_b => dummy
1981 e_laplace_rhoa_tau_b_tau_b => dummy
1982 e_laplace_rhob_laplace_rhob_laplace_rhob => dummy
1983 e_laplace_rhob_laplace_rhob_tau_a => dummy
1984 e_laplace_rhob_laplace_rhob_tau_b => dummy
1985 e_laplace_rhob_tau_a_tau_a => dummy
1986 e_laplace_rhob_tau_a_tau_b => dummy
1987 e_laplace_rhob_tau_b_tau_b => dummy
1988 e_tau_a_tau_a_tau_a => dummy
1989 e_tau_a_tau_a_tau_b => dummy
1990 e_tau_a_tau_b_tau_b => dummy
1991 e_tau_b_tau_b_tau_b => dummy
1992
1993 IF (grad_deriv >= 0) THEN
1994 deriv => xc_dset_get_derivative(deriv_set, [INTEGER::], &
1995 allocate_deriv=.true.)
1996 CALL xc_derivative_get(deriv, deriv_data=e_0)
1997 END IF
1998 IF (grad_deriv >= 1) THEN
1999 SELECT CASE (xc_f03_func_info_get_family(xc_info))
2000 CASE (xc_family_lda, xc_family_hyb_lda)
2001 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa], &
2002 allocate_deriv=.true.)
2003 CALL xc_derivative_get(deriv, deriv_data=e_rhoa)
2004 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob], &
2005 allocate_deriv=.true.)
2006 CALL xc_derivative_get(deriv, deriv_data=e_rhob)
2007 CASE (xc_family_gga, xc_family_hyb_gga)
2008 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa], &
2009 allocate_deriv=.true.)
2010 CALL xc_derivative_get(deriv, deriv_data=e_rhoa)
2011 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob], &
2012 allocate_deriv=.true.)
2013 CALL xc_derivative_get(deriv, deriv_data=e_rhob)
2014 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
2015 allocate_deriv=.true.)
2016 CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
2017 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa], &
2018 allocate_deriv=.true.)
2019 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa)
2020 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob], &
2021 allocate_deriv=.true.)
2022 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob)
2023 deriv => xc_dset_get_derivative(deriv_set, &
2024 [deriv_gamma_aa], &
2025 allocate_deriv=.true.)
2026 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa)
2027 deriv => xc_dset_get_derivative(deriv_set, &
2028 [deriv_gamma_ab], &
2029 allocate_deriv=.true.)
2030 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab)
2031 deriv => xc_dset_get_derivative(deriv_set, &
2032 [deriv_gamma_bb], &
2033 allocate_deriv=.true.)
2034 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb)
2035 CASE (xc_family_mgga, xc_family_hyb_mgga)
2036 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa], &
2037 allocate_deriv=.true.)
2038 CALL xc_derivative_get(deriv, deriv_data=e_rhoa)
2039 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob], &
2040 allocate_deriv=.true.)
2041 CALL xc_derivative_get(deriv, deriv_data=e_rhob)
2042 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
2043 allocate_deriv=.true.)
2044 CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
2045 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa], &
2046 allocate_deriv=.true.)
2047 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa)
2048 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob], &
2049 allocate_deriv=.true.)
2050 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob)
2051 deriv => xc_dset_get_derivative(deriv_set, &
2052 [deriv_gamma_aa], &
2053 allocate_deriv=.true.)
2054 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa)
2055 deriv => xc_dset_get_derivative(deriv_set, &
2056 [deriv_gamma_ab], &
2057 allocate_deriv=.true.)
2058 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab)
2059 deriv => xc_dset_get_derivative(deriv_set, &
2060 [deriv_gamma_bb], &
2061 allocate_deriv=.true.)
2062 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb)
2063 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau_a], &
2064 allocate_deriv=.true.)
2065 CALL xc_derivative_get(deriv, deriv_data=e_tau_a)
2066 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau_b], &
2067 allocate_deriv=.true.)
2068 CALL xc_derivative_get(deriv, deriv_data=e_tau_b)
2069 IF (has_laplace) THEN
2070 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhoa], &
2071 allocate_deriv=.true.)
2072 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa)
2073 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhob], &
2074 allocate_deriv=.true.)
2075 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob)
2076 END IF
2077 CASE default
2078 cpabort(trim(func_name)//": this XC_FAMILY is currently not supported.")
2079 END SELECT
2080 END IF
2081 IF (grad_deriv >= 2) THEN
2082 SELECT CASE (xc_f03_func_info_get_family(xc_info))
2083 CASE (xc_family_lda, xc_family_hyb_lda)
2084 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhoa], &
2085 allocate_deriv=.true.)
2086 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa)
2087 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhob], &
2088 allocate_deriv=.true.)
2089 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob)
2090 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_rhob], &
2091 allocate_deriv=.true.)
2092 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob)
2093 CASE (xc_family_gga, xc_family_hyb_gga)
2094 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhoa], &
2095 allocate_deriv=.true.)
2096 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa)
2097 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhob], &
2098 allocate_deriv=.true.)
2099 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob)
2100 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_rhob], &
2101 allocate_deriv=.true.)
2102 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob)
2103 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rhoa], &
2104 allocate_deriv=.true.)
2105 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rhoa)
2106 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rhob], &
2107 allocate_deriv=.true.)
2108 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rhob)
2109 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_rhoa], &
2110 allocate_deriv=.true.)
2111 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_rhoa)
2112 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_rhob], &
2113 allocate_deriv=.true.)
2114 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_rhob)
2115 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_rhoa], &
2116 allocate_deriv=.true.)
2117 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_rhoa)
2118 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_rhob], &
2119 allocate_deriv=.true.)
2120 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_rhob)
2121 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drho], &
2122 allocate_deriv=.true.)
2123 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
2124 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drhoa], &
2125 allocate_deriv=.true.)
2126 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrhoa)
2127 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drhob], &
2128 allocate_deriv=.true.)
2129 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrhob)
2130 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_norm_drhoa], &
2131 allocate_deriv=.true.)
2132 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_ndrhoa)
2133 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_norm_drhob], &
2134 allocate_deriv=.true.)
2135 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_ndrhob)
2136 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_norm_drhob], &
2137 allocate_deriv=.true.)
2138 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_ndrhob)
2139 deriv => xc_dset_get_derivative(deriv_set, &
2140 [deriv_rhoa, deriv_gamma_aa], &
2141 allocate_deriv=.true.)
2142 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_aa)
2143 deriv => xc_dset_get_derivative(deriv_set, &
2144 [deriv_rhoa, deriv_gamma_ab], &
2145 allocate_deriv=.true.)
2146 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_ab)
2147 deriv => xc_dset_get_derivative(deriv_set, &
2148 [deriv_rhoa, deriv_gamma_bb], &
2149 allocate_deriv=.true.)
2150 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_bb)
2151 deriv => xc_dset_get_derivative(deriv_set, &
2152 [deriv_rhob, deriv_gamma_aa], &
2153 allocate_deriv=.true.)
2154 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_aa)
2155 deriv => xc_dset_get_derivative(deriv_set, &
2156 [deriv_rhob, deriv_gamma_ab], &
2157 allocate_deriv=.true.)
2158 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_ab)
2159 deriv => xc_dset_get_derivative(deriv_set, &
2160 [deriv_rhob, deriv_gamma_bb], &
2161 allocate_deriv=.true.)
2162 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_bb)
2163 deriv => xc_dset_get_derivative(deriv_set, &
2164 [deriv_gamma_aa, deriv_gamma_aa], &
2165 allocate_deriv=.true.)
2166 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_aa)
2167 deriv => xc_dset_get_derivative(deriv_set, &
2168 [deriv_gamma_aa, deriv_gamma_ab], &
2169 allocate_deriv=.true.)
2170 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_ab)
2171 deriv => xc_dset_get_derivative(deriv_set, &
2172 [deriv_gamma_aa, deriv_gamma_bb], &
2173 allocate_deriv=.true.)
2174 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_bb)
2175 deriv => xc_dset_get_derivative(deriv_set, &
2176 [deriv_gamma_ab, deriv_gamma_ab], &
2177 allocate_deriv=.true.)
2178 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_ab)
2179 deriv => xc_dset_get_derivative(deriv_set, &
2180 [deriv_gamma_ab, deriv_gamma_bb], &
2181 allocate_deriv=.true.)
2182 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_bb)
2183 deriv => xc_dset_get_derivative(deriv_set, &
2184 [deriv_gamma_bb, deriv_gamma_bb], &
2185 allocate_deriv=.true.)
2186 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_gamma_bb)
2187 CASE (xc_family_mgga, xc_family_hyb_mgga)
2188
2189 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhoa], &
2190 allocate_deriv=.true.)
2191 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa)
2192 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhob], &
2193 allocate_deriv=.true.)
2194 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob)
2195 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_rhob], &
2196 allocate_deriv=.true.)
2197 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob)
2198 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rhoa], &
2199 allocate_deriv=.true.)
2200 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rhoa)
2201 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rhob], &
2202 allocate_deriv=.true.)
2203 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rhob)
2204 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_rhoa], &
2205 allocate_deriv=.true.)
2206 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_rhoa)
2207 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_rhob], &
2208 allocate_deriv=.true.)
2209 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_rhob)
2210 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_rhoa], &
2211 allocate_deriv=.true.)
2212 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_rhoa)
2213 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_rhob], &
2214 allocate_deriv=.true.)
2215 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_rhob)
2216 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drho], &
2217 allocate_deriv=.true.)
2218 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
2219 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drhoa], &
2220 allocate_deriv=.true.)
2221 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrhoa)
2222 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drhob], &
2223 allocate_deriv=.true.)
2224 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrhob)
2225 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_norm_drhoa], &
2226 allocate_deriv=.true.)
2227 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_ndrhoa)
2228 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_norm_drhob], &
2229 allocate_deriv=.true.)
2230 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_ndrhob)
2231 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_norm_drhob], &
2232 allocate_deriv=.true.)
2233 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_ndrhob)
2234 deriv => xc_dset_get_derivative(deriv_set, &
2235 [deriv_rhoa, deriv_gamma_aa], &
2236 allocate_deriv=.true.)
2237 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_aa)
2238 deriv => xc_dset_get_derivative(deriv_set, &
2239 [deriv_rhoa, deriv_gamma_ab], &
2240 allocate_deriv=.true.)
2241 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_ab)
2242 deriv => xc_dset_get_derivative(deriv_set, &
2243 [deriv_rhoa, deriv_gamma_bb], &
2244 allocate_deriv=.true.)
2245 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_bb)
2246 deriv => xc_dset_get_derivative(deriv_set, &
2247 [deriv_rhob, deriv_gamma_aa], &
2248 allocate_deriv=.true.)
2249 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_aa)
2250 deriv => xc_dset_get_derivative(deriv_set, &
2251 [deriv_rhob, deriv_gamma_ab], &
2252 allocate_deriv=.true.)
2253 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_ab)
2254 deriv => xc_dset_get_derivative(deriv_set, &
2255 [deriv_rhob, deriv_gamma_bb], &
2256 allocate_deriv=.true.)
2257 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_bb)
2258 deriv => xc_dset_get_derivative(deriv_set, &
2259 [deriv_gamma_aa, deriv_gamma_aa], &
2260 allocate_deriv=.true.)
2261 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_aa)
2262 deriv => xc_dset_get_derivative(deriv_set, &
2263 [deriv_gamma_aa, deriv_gamma_ab], &
2264 allocate_deriv=.true.)
2265 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_ab)
2266 deriv => xc_dset_get_derivative(deriv_set, &
2267 [deriv_gamma_aa, deriv_gamma_bb], &
2268 allocate_deriv=.true.)
2269 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_bb)
2270 deriv => xc_dset_get_derivative(deriv_set, &
2271 [deriv_gamma_aa, deriv_tau_a], &
2272 allocate_deriv=.true.)
2273 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_tau_a)
2274 deriv => xc_dset_get_derivative(deriv_set, &
2275 [deriv_gamma_aa, deriv_tau_b], &
2276 allocate_deriv=.true.)
2277 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_tau_b)
2278 deriv => xc_dset_get_derivative(deriv_set, &
2279 [deriv_gamma_ab, deriv_gamma_ab], &
2280 allocate_deriv=.true.)
2281 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_ab)
2282 deriv => xc_dset_get_derivative(deriv_set, &
2283 [deriv_gamma_ab, deriv_gamma_bb], &
2284 allocate_deriv=.true.)
2285 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_bb)
2286 deriv => xc_dset_get_derivative(deriv_set, &
2287 [deriv_gamma_ab, deriv_tau_a], &
2288 allocate_deriv=.true.)
2289 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_tau_a)
2290 deriv => xc_dset_get_derivative(deriv_set, &
2291 [deriv_gamma_ab, deriv_tau_b], &
2292 allocate_deriv=.true.)
2293 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_tau_b)
2294 deriv => xc_dset_get_derivative(deriv_set, &
2295 [deriv_gamma_bb, deriv_gamma_bb], &
2296 allocate_deriv=.true.)
2297 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_gamma_bb)
2298 deriv => xc_dset_get_derivative(deriv_set, &
2299 [deriv_gamma_bb, deriv_tau_a], &
2300 allocate_deriv=.true.)
2301 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_tau_a)
2302 deriv => xc_dset_get_derivative(deriv_set, &
2303 [deriv_gamma_bb, deriv_tau_b], &
2304 allocate_deriv=.true.)
2305 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_tau_b)
2306 IF (has_laplace) THEN
2307 deriv => xc_dset_get_derivative(deriv_set, &
2308 [deriv_gamma_aa, deriv_laplace_rhoa], &
2309 allocate_deriv=.true.)
2310 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_laplace_rhoa)
2311 deriv => xc_dset_get_derivative(deriv_set, &
2312 [deriv_gamma_aa, deriv_laplace_rhob], &
2313 allocate_deriv=.true.)
2314 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_laplace_rhob)
2315 deriv => xc_dset_get_derivative(deriv_set, &
2316 [deriv_gamma_ab, deriv_laplace_rhoa], &
2317 allocate_deriv=.true.)
2318 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_laplace_rhoa)
2319 deriv => xc_dset_get_derivative(deriv_set, &
2320 [deriv_gamma_ab, deriv_laplace_rhob], &
2321 allocate_deriv=.true.)
2322 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_laplace_rhob)
2323 deriv => xc_dset_get_derivative(deriv_set, &
2324 [deriv_gamma_bb, deriv_laplace_rhoa], &
2325 allocate_deriv=.true.)
2326 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_laplace_rhoa)
2327 deriv => xc_dset_get_derivative(deriv_set, &
2328 [deriv_gamma_bb, deriv_laplace_rhob], &
2329 allocate_deriv=.true.)
2330 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_laplace_rhob)
2331 END IF
2332 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_tau_a], &
2333 allocate_deriv=.true.)
2334 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_tau_a)
2335 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_tau_b], &
2336 allocate_deriv=.true.)
2337 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_tau_b)
2338 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_tau_a], &
2339 allocate_deriv=.true.)
2340 CALL xc_derivative_get(deriv, deriv_data=e_rhob_tau_a)
2341 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_tau_b], &
2342 allocate_deriv=.true.)
2343 CALL xc_derivative_get(deriv, deriv_data=e_rhob_tau_b)
2344 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_tau_a], &
2345 allocate_deriv=.true.)
2346 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_tau_a)
2347 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_tau_b], &
2348 allocate_deriv=.true.)
2349 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_tau_b)
2350 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_tau_a], &
2351 allocate_deriv=.true.)
2352 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_tau_a)
2353 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_tau_b], &
2354 allocate_deriv=.true.)
2355 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_tau_b)
2356 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_tau_a], &
2357 allocate_deriv=.true.)
2358 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_tau_a)
2359 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_tau_b], &
2360 allocate_deriv=.true.)
2361 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_tau_b)
2362 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau_a, deriv_tau_a], &
2363 allocate_deriv=.true.)
2364 CALL xc_derivative_get(deriv, deriv_data=e_tau_a_tau_a)
2365 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau_a, deriv_tau_b], &
2366 allocate_deriv=.true.)
2367 CALL xc_derivative_get(deriv, deriv_data=e_tau_a_tau_b)
2368 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau_b, deriv_tau_b], &
2369 allocate_deriv=.true.)
2370 CALL xc_derivative_get(deriv, deriv_data=e_tau_b_tau_b)
2371 IF (has_laplace) THEN
2372 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_laplace_rhoa], &
2373 allocate_deriv=.true.)
2374 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_laplace_rhoa)
2375 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_laplace_rhob], &
2376 allocate_deriv=.true.)
2377 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_laplace_rhob)
2378 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_laplace_rhoa], &
2379 allocate_deriv=.true.)
2380 CALL xc_derivative_get(deriv, deriv_data=e_rhob_laplace_rhoa)
2381 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_laplace_rhob], &
2382 allocate_deriv=.true.)
2383 CALL xc_derivative_get(deriv, deriv_data=e_rhob_laplace_rhob)
2384 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_laplace_rhoa], &
2385 allocate_deriv=.true.)
2386 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_laplace_rhoa)
2387 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_laplace_rhob], &
2388 allocate_deriv=.true.)
2389 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_laplace_rhob)
2390 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_laplace_rhoa], &
2391 allocate_deriv=.true.)
2392 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_laplace_rhoa)
2393 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_laplace_rhob], &
2394 allocate_deriv=.true.)
2395 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_laplace_rhob)
2396 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_laplace_rhoa], &
2397 allocate_deriv=.true.)
2398 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_laplace_rhoa)
2399 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_laplace_rhob], &
2400 allocate_deriv=.true.)
2401 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_laplace_rhob)
2402 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhoa, deriv_laplace_rhoa], &
2403 allocate_deriv=.true.)
2404 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_laplace_rhoa)
2405 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhoa, deriv_laplace_rhob], &
2406 allocate_deriv=.true.)
2407 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_laplace_rhob)
2408 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhob, deriv_laplace_rhob], &
2409 allocate_deriv=.true.)
2410 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob_laplace_rhob)
2411 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhoa, deriv_tau_a], &
2412 allocate_deriv=.true.)
2413 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_tau_a)
2414 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhoa, deriv_tau_b], &
2415 allocate_deriv=.true.)
2416 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_tau_b)
2417 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhob, deriv_tau_a], &
2418 allocate_deriv=.true.)
2419 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob_tau_a)
2420 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhob, deriv_tau_b], &
2421 allocate_deriv=.true.)
2422 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob_tau_b)
2423 END IF
2424 CASE default
2425 cpabort(trim(func_name)//": this XC_FAMILY is currently not supported.")
2426 END SELECT
2427 END IF
2428 IF (grad_deriv >= 3) THEN
2429 SELECT CASE (xc_f03_func_info_get_family(xc_info))
2430 CASE (xc_family_lda, xc_family_hyb_lda)
2431 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhoa, deriv_rhoa], &
2432 allocate_deriv=.true.)
2433 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_rhoa)
2434 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhoa, deriv_rhob], &
2435 allocate_deriv=.true.)
2436 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_rhob)
2437 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhob, deriv_rhob], &
2438 allocate_deriv=.true.)
2439 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_rhob)
2440 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_rhob, deriv_rhob], &
2441 allocate_deriv=.true.)
2442 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_rhob)
2443 CASE (xc_family_gga, xc_family_hyb_gga)
2444 deriv => xc_dset_get_derivative(deriv_set, &
2445 [deriv_rhoa, deriv_rhoa, deriv_gamma_aa], &
2446 allocate_deriv=.true.)
2447 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_gamma_aa)
2448 deriv => xc_dset_get_derivative(deriv_set, &
2449 [deriv_rhoa, deriv_rhoa, deriv_gamma_ab], &
2450 allocate_deriv=.true.)
2451 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_gamma_ab)
2452 deriv => xc_dset_get_derivative(deriv_set, &
2453 [deriv_rhoa, deriv_rhoa, deriv_gamma_bb], &
2454 allocate_deriv=.true.)
2455 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_gamma_bb)
2456 deriv => xc_dset_get_derivative(deriv_set, &
2457 [deriv_rhoa, deriv_rhob, deriv_gamma_aa], &
2458 allocate_deriv=.true.)
2459 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_gamma_aa)
2460 deriv => xc_dset_get_derivative(deriv_set, &
2461 [deriv_rhoa, deriv_rhob, deriv_gamma_ab], &
2462 allocate_deriv=.true.)
2463 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_gamma_ab)
2464 deriv => xc_dset_get_derivative(deriv_set, &
2465 [deriv_rhoa, deriv_rhob, deriv_gamma_bb], &
2466 allocate_deriv=.true.)
2467 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_gamma_bb)
2468 deriv => xc_dset_get_derivative(deriv_set, &
2469 [deriv_rhoa, deriv_gamma_aa, deriv_gamma_aa], &
2470 allocate_deriv=.true.)
2471 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_aa_gamma_aa)
2472 deriv => xc_dset_get_derivative(deriv_set, &
2473 [deriv_rhoa, deriv_gamma_aa, deriv_gamma_ab], &
2474 allocate_deriv=.true.)
2475 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_aa_gamma_ab)
2476 deriv => xc_dset_get_derivative(deriv_set, &
2477 [deriv_rhoa, deriv_gamma_aa, deriv_gamma_bb], &
2478 allocate_deriv=.true.)
2479 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_aa_gamma_bb)
2480 deriv => xc_dset_get_derivative(deriv_set, &
2481 [deriv_rhoa, deriv_gamma_ab, deriv_gamma_ab], &
2482 allocate_deriv=.true.)
2483 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_ab_gamma_ab)
2484 deriv => xc_dset_get_derivative(deriv_set, &
2485 [deriv_rhoa, deriv_gamma_ab, deriv_gamma_bb], &
2486 allocate_deriv=.true.)
2487 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_ab_gamma_bb)
2488 deriv => xc_dset_get_derivative(deriv_set, &
2489 [deriv_rhoa, deriv_gamma_bb, deriv_gamma_bb], &
2490 allocate_deriv=.true.)
2491 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_bb_gamma_bb)
2492 deriv => xc_dset_get_derivative(deriv_set, &
2493 [deriv_rhob, deriv_rhob, deriv_gamma_aa], &
2494 allocate_deriv=.true.)
2495 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_gamma_aa)
2496 deriv => xc_dset_get_derivative(deriv_set, &
2497 [deriv_rhob, deriv_rhob, deriv_gamma_ab], &
2498 allocate_deriv=.true.)
2499 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_gamma_ab)
2500 deriv => xc_dset_get_derivative(deriv_set, &
2501 [deriv_rhob, deriv_rhob, deriv_gamma_bb], &
2502 allocate_deriv=.true.)
2503 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_gamma_bb)
2504 deriv => xc_dset_get_derivative(deriv_set, &
2505 [deriv_rhob, deriv_gamma_aa, deriv_gamma_aa], &
2506 allocate_deriv=.true.)
2507 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_aa_gamma_aa)
2508 deriv => xc_dset_get_derivative(deriv_set, &
2509 [deriv_rhob, deriv_gamma_aa, deriv_gamma_ab], &
2510 allocate_deriv=.true.)
2511 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_aa_gamma_ab)
2512 deriv => xc_dset_get_derivative(deriv_set, &
2513 [deriv_rhob, deriv_gamma_aa, deriv_gamma_bb], &
2514 allocate_deriv=.true.)
2515 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_aa_gamma_bb)
2516 deriv => xc_dset_get_derivative(deriv_set, &
2517 [deriv_rhob, deriv_gamma_ab, deriv_gamma_ab], &
2518 allocate_deriv=.true.)
2519 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_ab_gamma_ab)
2520 deriv => xc_dset_get_derivative(deriv_set, &
2521 [deriv_rhob, deriv_gamma_ab, deriv_gamma_bb], &
2522 allocate_deriv=.true.)
2523 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_ab_gamma_bb)
2524 deriv => xc_dset_get_derivative(deriv_set, &
2525 [deriv_rhob, deriv_gamma_bb, deriv_gamma_bb], &
2526 allocate_deriv=.true.)
2527 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_bb_gamma_bb)
2528 deriv => xc_dset_get_derivative(deriv_set, &
2529 [deriv_gamma_aa, deriv_gamma_aa, deriv_gamma_aa], &
2530 allocate_deriv=.true.)
2531 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_aa_gamma_aa)
2532 deriv => xc_dset_get_derivative(deriv_set, &
2533 [deriv_gamma_aa, deriv_gamma_aa, deriv_gamma_ab], &
2534 allocate_deriv=.true.)
2535 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_aa_gamma_ab)
2536 deriv => xc_dset_get_derivative(deriv_set, &
2537 [deriv_gamma_aa, deriv_gamma_aa, deriv_gamma_bb], &
2538 allocate_deriv=.true.)
2539 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_aa_gamma_bb)
2540 deriv => xc_dset_get_derivative(deriv_set, &
2541 [deriv_gamma_aa, deriv_gamma_ab, deriv_gamma_ab], &
2542 allocate_deriv=.true.)
2543 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_ab_gamma_ab)
2544 deriv => xc_dset_get_derivative(deriv_set, &
2545 [deriv_gamma_aa, deriv_gamma_ab, deriv_gamma_bb], &
2546 allocate_deriv=.true.)
2547 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_ab_gamma_bb)
2548 deriv => xc_dset_get_derivative(deriv_set, &
2549 [deriv_gamma_aa, deriv_gamma_bb, deriv_gamma_bb], &
2550 allocate_deriv=.true.)
2551 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_bb_gamma_bb)
2552 deriv => xc_dset_get_derivative(deriv_set, &
2553 [deriv_gamma_ab, deriv_gamma_ab, deriv_gamma_ab], &
2554 allocate_deriv=.true.)
2555 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_ab_gamma_ab)
2556 deriv => xc_dset_get_derivative(deriv_set, &
2557 [deriv_gamma_ab, deriv_gamma_ab, deriv_gamma_bb], &
2558 allocate_deriv=.true.)
2559 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_ab_gamma_bb)
2560 deriv => xc_dset_get_derivative(deriv_set, &
2561 [deriv_gamma_ab, deriv_gamma_bb, deriv_gamma_bb], &
2562 allocate_deriv=.true.)
2563 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_bb_gamma_bb)
2564 deriv => xc_dset_get_derivative(deriv_set, &
2565 [deriv_gamma_bb, deriv_gamma_bb, deriv_gamma_bb], &
2566 allocate_deriv=.true.)
2567 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_gamma_bb_gamma_bb)
2568 deriv => xc_dset_get_derivative(deriv_set, &
2569 [deriv_rhoa, deriv_rhoa, deriv_rhoa], &
2570 allocate_deriv=.true.)
2571 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_rhoa)
2572 deriv => xc_dset_get_derivative(deriv_set, &
2573 [deriv_rhoa, deriv_rhoa, deriv_rhob], &
2574 allocate_deriv=.true.)
2575 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_rhob)
2576 deriv => xc_dset_get_derivative(deriv_set, &
2577 [deriv_rhoa, deriv_rhob, deriv_rhob], &
2578 allocate_deriv=.true.)
2579 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_rhob)
2580 deriv => xc_dset_get_derivative(deriv_set, &
2581 [deriv_rhob, deriv_rhob, deriv_rhob], &
2582 allocate_deriv=.true.)
2583 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_rhob)
2584 CASE (xc_family_mgga, xc_family_hyb_mgga)
2585 deriv => xc_dset_get_derivative(deriv_set, &
2586 [deriv_rhoa, deriv_rhoa, deriv_gamma_aa], &
2587 allocate_deriv=.true.)
2588 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_gamma_aa)
2589 deriv => xc_dset_get_derivative(deriv_set, &
2590 [deriv_rhoa, deriv_rhoa, deriv_gamma_ab], &
2591 allocate_deriv=.true.)
2592 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_gamma_ab)
2593 deriv => xc_dset_get_derivative(deriv_set, &
2594 [deriv_rhoa, deriv_rhoa, deriv_gamma_bb], &
2595 allocate_deriv=.true.)
2596 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_gamma_bb)
2597 deriv => xc_dset_get_derivative(deriv_set, &
2598 [deriv_rhoa, deriv_rhoa, deriv_tau_a], &
2599 allocate_deriv=.true.)
2600 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_tau_a)
2601 deriv => xc_dset_get_derivative(deriv_set, &
2602 [deriv_rhoa, deriv_rhoa, deriv_tau_b], &
2603 allocate_deriv=.true.)
2604 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_tau_b)
2605 deriv => xc_dset_get_derivative(deriv_set, &
2606 [deriv_rhoa, deriv_rhob, deriv_gamma_aa], &
2607 allocate_deriv=.true.)
2608 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_gamma_aa)
2609 deriv => xc_dset_get_derivative(deriv_set, &
2610 [deriv_rhoa, deriv_rhob, deriv_gamma_ab], &
2611 allocate_deriv=.true.)
2612 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_gamma_ab)
2613 deriv => xc_dset_get_derivative(deriv_set, &
2614 [deriv_rhoa, deriv_rhob, deriv_gamma_bb], &
2615 allocate_deriv=.true.)
2616 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_gamma_bb)
2617 deriv => xc_dset_get_derivative(deriv_set, &
2618 [deriv_rhoa, deriv_rhob, deriv_tau_a], &
2619 allocate_deriv=.true.)
2620 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_tau_a)
2621 deriv => xc_dset_get_derivative(deriv_set, &
2622 [deriv_rhoa, deriv_rhob, deriv_tau_b], &
2623 allocate_deriv=.true.)
2624 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_tau_b)
2625 deriv => xc_dset_get_derivative(deriv_set, &
2626 [deriv_rhoa, deriv_gamma_aa, deriv_gamma_aa], &
2627 allocate_deriv=.true.)
2628 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_aa_gamma_aa)
2629 deriv => xc_dset_get_derivative(deriv_set, &
2630 [deriv_rhoa, deriv_gamma_aa, deriv_gamma_ab], &
2631 allocate_deriv=.true.)
2632 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_aa_gamma_ab)
2633 deriv => xc_dset_get_derivative(deriv_set, &
2634 [deriv_rhoa, deriv_gamma_aa, deriv_gamma_bb], &
2635 allocate_deriv=.true.)
2636 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_aa_gamma_bb)
2637 deriv => xc_dset_get_derivative(deriv_set, &
2638 [deriv_rhoa, deriv_gamma_aa, deriv_tau_a], &
2639 allocate_deriv=.true.)
2640 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_aa_tau_a)
2641 deriv => xc_dset_get_derivative(deriv_set, &
2642 [deriv_rhoa, deriv_gamma_aa, deriv_tau_b], &
2643 allocate_deriv=.true.)
2644 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_aa_tau_b)
2645 deriv => xc_dset_get_derivative(deriv_set, &
2646 [deriv_rhoa, deriv_gamma_ab, deriv_gamma_ab], &
2647 allocate_deriv=.true.)
2648 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_ab_gamma_ab)
2649 deriv => xc_dset_get_derivative(deriv_set, &
2650 [deriv_rhoa, deriv_gamma_ab, deriv_gamma_bb], &
2651 allocate_deriv=.true.)
2652 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_ab_gamma_bb)
2653 deriv => xc_dset_get_derivative(deriv_set, &
2654 [deriv_rhoa, deriv_gamma_ab, deriv_tau_a], &
2655 allocate_deriv=.true.)
2656 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_ab_tau_a)
2657 deriv => xc_dset_get_derivative(deriv_set, &
2658 [deriv_rhoa, deriv_gamma_ab, deriv_tau_b], &
2659 allocate_deriv=.true.)
2660 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_ab_tau_b)
2661 deriv => xc_dset_get_derivative(deriv_set, &
2662 [deriv_rhoa, deriv_gamma_bb, deriv_gamma_bb], &
2663 allocate_deriv=.true.)
2664 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_bb_gamma_bb)
2665 deriv => xc_dset_get_derivative(deriv_set, &
2666 [deriv_rhoa, deriv_gamma_bb, deriv_tau_a], &
2667 allocate_deriv=.true.)
2668 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_bb_tau_a)
2669 deriv => xc_dset_get_derivative(deriv_set, &
2670 [deriv_rhoa, deriv_gamma_bb, deriv_tau_b], &
2671 allocate_deriv=.true.)
2672 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_bb_tau_b)
2673 deriv => xc_dset_get_derivative(deriv_set, &
2674 [deriv_rhoa, deriv_tau_a, deriv_tau_a], &
2675 allocate_deriv=.true.)
2676 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_tau_a_tau_a)
2677 deriv => xc_dset_get_derivative(deriv_set, &
2678 [deriv_rhoa, deriv_tau_a, deriv_tau_b], &
2679 allocate_deriv=.true.)
2680 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_tau_a_tau_b)
2681 deriv => xc_dset_get_derivative(deriv_set, &
2682 [deriv_rhoa, deriv_tau_b, deriv_tau_b], &
2683 allocate_deriv=.true.)
2684 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_tau_b_tau_b)
2685 deriv => xc_dset_get_derivative(deriv_set, &
2686 [deriv_rhob, deriv_rhob, deriv_gamma_aa], &
2687 allocate_deriv=.true.)
2688 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_gamma_aa)
2689 deriv => xc_dset_get_derivative(deriv_set, &
2690 [deriv_rhob, deriv_rhob, deriv_gamma_ab], &
2691 allocate_deriv=.true.)
2692 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_gamma_ab)
2693 deriv => xc_dset_get_derivative(deriv_set, &
2694 [deriv_rhob, deriv_rhob, deriv_gamma_bb], &
2695 allocate_deriv=.true.)
2696 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_gamma_bb)
2697 deriv => xc_dset_get_derivative(deriv_set, &
2698 [deriv_rhob, deriv_rhob, deriv_tau_a], &
2699 allocate_deriv=.true.)
2700 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_tau_a)
2701 deriv => xc_dset_get_derivative(deriv_set, &
2702 [deriv_rhob, deriv_rhob, deriv_tau_b], &
2703 allocate_deriv=.true.)
2704 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_tau_b)
2705 deriv => xc_dset_get_derivative(deriv_set, &
2706 [deriv_rhob, deriv_gamma_aa, deriv_gamma_aa], &
2707 allocate_deriv=.true.)
2708 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_aa_gamma_aa)
2709 deriv => xc_dset_get_derivative(deriv_set, &
2710 [deriv_rhob, deriv_gamma_aa, deriv_gamma_ab], &
2711 allocate_deriv=.true.)
2712 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_aa_gamma_ab)
2713 deriv => xc_dset_get_derivative(deriv_set, &
2714 [deriv_rhob, deriv_gamma_aa, deriv_gamma_bb], &
2715 allocate_deriv=.true.)
2716 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_aa_gamma_bb)
2717 deriv => xc_dset_get_derivative(deriv_set, &
2718 [deriv_rhob, deriv_gamma_aa, deriv_tau_a], &
2719 allocate_deriv=.true.)
2720 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_aa_tau_a)
2721 deriv => xc_dset_get_derivative(deriv_set, &
2722 [deriv_rhob, deriv_gamma_aa, deriv_tau_b], &
2723 allocate_deriv=.true.)
2724 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_aa_tau_b)
2725 deriv => xc_dset_get_derivative(deriv_set, &
2726 [deriv_rhob, deriv_gamma_ab, deriv_gamma_ab], &
2727 allocate_deriv=.true.)
2728 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_ab_gamma_ab)
2729 deriv => xc_dset_get_derivative(deriv_set, &
2730 [deriv_rhob, deriv_gamma_ab, deriv_gamma_bb], &
2731 allocate_deriv=.true.)
2732 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_ab_gamma_bb)
2733 deriv => xc_dset_get_derivative(deriv_set, &
2734 [deriv_rhob, deriv_gamma_ab, deriv_tau_a], &
2735 allocate_deriv=.true.)
2736 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_ab_tau_a)
2737 deriv => xc_dset_get_derivative(deriv_set, &
2738 [deriv_rhob, deriv_gamma_ab, deriv_tau_b], &
2739 allocate_deriv=.true.)
2740 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_ab_tau_b)
2741 deriv => xc_dset_get_derivative(deriv_set, &
2742 [deriv_rhob, deriv_gamma_bb, deriv_gamma_bb], &
2743 allocate_deriv=.true.)
2744 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_bb_gamma_bb)
2745 deriv => xc_dset_get_derivative(deriv_set, &
2746 [deriv_rhob, deriv_gamma_bb, deriv_tau_a], &
2747 allocate_deriv=.true.)
2748 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_bb_tau_a)
2749 deriv => xc_dset_get_derivative(deriv_set, &
2750 [deriv_rhob, deriv_gamma_bb, deriv_tau_b], &
2751 allocate_deriv=.true.)
2752 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_bb_tau_b)
2753 deriv => xc_dset_get_derivative(deriv_set, &
2754 [deriv_rhob, deriv_tau_a, deriv_tau_a], &
2755 allocate_deriv=.true.)
2756 CALL xc_derivative_get(deriv, deriv_data=e_rhob_tau_a_tau_a)
2757 deriv => xc_dset_get_derivative(deriv_set, &
2758 [deriv_rhob, deriv_tau_a, deriv_tau_b], &
2759 allocate_deriv=.true.)
2760 CALL xc_derivative_get(deriv, deriv_data=e_rhob_tau_a_tau_b)
2761 deriv => xc_dset_get_derivative(deriv_set, &
2762 [deriv_rhob, deriv_tau_b, deriv_tau_b], &
2763 allocate_deriv=.true.)
2764 CALL xc_derivative_get(deriv, deriv_data=e_rhob_tau_b_tau_b)
2765 deriv => xc_dset_get_derivative(deriv_set, &
2766 [deriv_gamma_aa, deriv_gamma_aa, deriv_gamma_aa], &
2767 allocate_deriv=.true.)
2768 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_aa_gamma_aa)
2769 deriv => xc_dset_get_derivative(deriv_set, &
2770 [deriv_gamma_aa, deriv_gamma_aa, deriv_gamma_ab], &
2771 allocate_deriv=.true.)
2772 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_aa_gamma_ab)
2773 deriv => xc_dset_get_derivative(deriv_set, &
2774 [deriv_gamma_aa, deriv_gamma_aa, deriv_gamma_bb], &
2775 allocate_deriv=.true.)
2776 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_aa_gamma_bb)
2777 deriv => xc_dset_get_derivative(deriv_set, &
2778 [deriv_gamma_aa, deriv_gamma_aa, deriv_tau_a], &
2779 allocate_deriv=.true.)
2780 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_aa_tau_a)
2781 deriv => xc_dset_get_derivative(deriv_set, &
2782 [deriv_gamma_aa, deriv_gamma_aa, deriv_tau_b], &
2783 allocate_deriv=.true.)
2784 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_aa_tau_b)
2785 deriv => xc_dset_get_derivative(deriv_set, &
2786 [deriv_gamma_aa, deriv_gamma_ab, deriv_gamma_ab], &
2787 allocate_deriv=.true.)
2788 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_ab_gamma_ab)
2789 deriv => xc_dset_get_derivative(deriv_set, &
2790 [deriv_gamma_aa, deriv_gamma_ab, deriv_gamma_bb], &
2791 allocate_deriv=.true.)
2792 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_ab_gamma_bb)
2793 deriv => xc_dset_get_derivative(deriv_set, &
2794 [deriv_gamma_aa, deriv_gamma_ab, deriv_tau_a], &
2795 allocate_deriv=.true.)
2796 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_ab_tau_a)
2797 deriv => xc_dset_get_derivative(deriv_set, &
2798 [deriv_gamma_aa, deriv_gamma_ab, deriv_tau_b], &
2799 allocate_deriv=.true.)
2800 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_ab_tau_b)
2801 deriv => xc_dset_get_derivative(deriv_set, &
2802 [deriv_gamma_aa, deriv_gamma_bb, deriv_gamma_bb], &
2803 allocate_deriv=.true.)
2804 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_bb_gamma_bb)
2805 deriv => xc_dset_get_derivative(deriv_set, &
2806 [deriv_gamma_aa, deriv_gamma_bb, deriv_tau_a], &
2807 allocate_deriv=.true.)
2808 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_bb_tau_a)
2809 deriv => xc_dset_get_derivative(deriv_set, &
2810 [deriv_gamma_aa, deriv_gamma_bb, deriv_tau_b], &
2811 allocate_deriv=.true.)
2812 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_bb_tau_b)
2813 deriv => xc_dset_get_derivative(deriv_set, &
2814 [deriv_gamma_aa, deriv_tau_a, deriv_tau_a], &
2815 allocate_deriv=.true.)
2816 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_tau_a_tau_a)
2817 deriv => xc_dset_get_derivative(deriv_set, &
2818 [deriv_gamma_aa, deriv_tau_a, deriv_tau_b], &
2819 allocate_deriv=.true.)
2820 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_tau_a_tau_b)
2821 deriv => xc_dset_get_derivative(deriv_set, &
2822 [deriv_gamma_aa, deriv_tau_b, deriv_tau_b], &
2823 allocate_deriv=.true.)
2824 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_tau_b_tau_b)
2825 deriv => xc_dset_get_derivative(deriv_set, &
2826 [deriv_gamma_ab, deriv_gamma_ab, deriv_gamma_ab], &
2827 allocate_deriv=.true.)
2828 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_ab_gamma_ab)
2829 deriv => xc_dset_get_derivative(deriv_set, &
2830 [deriv_gamma_ab, deriv_gamma_ab, deriv_gamma_bb], &
2831 allocate_deriv=.true.)
2832 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_ab_gamma_bb)
2833 deriv => xc_dset_get_derivative(deriv_set, &
2834 [deriv_gamma_ab, deriv_gamma_ab, deriv_tau_a], &
2835 allocate_deriv=.true.)
2836 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_ab_tau_a)
2837 deriv => xc_dset_get_derivative(deriv_set, &
2838 [deriv_gamma_ab, deriv_gamma_ab, deriv_tau_b], &
2839 allocate_deriv=.true.)
2840 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_ab_tau_b)
2841 deriv => xc_dset_get_derivative(deriv_set, &
2842 [deriv_gamma_ab, deriv_gamma_bb, deriv_gamma_bb], &
2843 allocate_deriv=.true.)
2844 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_bb_gamma_bb)
2845 deriv => xc_dset_get_derivative(deriv_set, &
2846 [deriv_gamma_ab, deriv_gamma_bb, deriv_tau_a], &
2847 allocate_deriv=.true.)
2848 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_bb_tau_a)
2849 deriv => xc_dset_get_derivative(deriv_set, &
2850 [deriv_gamma_ab, deriv_gamma_bb, deriv_tau_b], &
2851 allocate_deriv=.true.)
2852 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_bb_tau_b)
2853 deriv => xc_dset_get_derivative(deriv_set, &
2854 [deriv_gamma_ab, deriv_tau_a, deriv_tau_a], &
2855 allocate_deriv=.true.)
2856 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_tau_a_tau_a)
2857 deriv => xc_dset_get_derivative(deriv_set, &
2858 [deriv_gamma_ab, deriv_tau_a, deriv_tau_b], &
2859 allocate_deriv=.true.)
2860 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_tau_a_tau_b)
2861 deriv => xc_dset_get_derivative(deriv_set, &
2862 [deriv_gamma_ab, deriv_tau_b, deriv_tau_b], &
2863 allocate_deriv=.true.)
2864 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_tau_b_tau_b)
2865 deriv => xc_dset_get_derivative(deriv_set, &
2866 [deriv_gamma_bb, deriv_gamma_bb, deriv_gamma_bb], &
2867 allocate_deriv=.true.)
2868 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_gamma_bb_gamma_bb)
2869 deriv => xc_dset_get_derivative(deriv_set, &
2870 [deriv_gamma_bb, deriv_gamma_bb, deriv_tau_a], &
2871 allocate_deriv=.true.)
2872 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_gamma_bb_tau_a)
2873 deriv => xc_dset_get_derivative(deriv_set, &
2874 [deriv_gamma_bb, deriv_gamma_bb, deriv_tau_b], &
2875 allocate_deriv=.true.)
2876 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_gamma_bb_tau_b)
2877 deriv => xc_dset_get_derivative(deriv_set, &
2878 [deriv_gamma_bb, deriv_tau_a, deriv_tau_a], &
2879 allocate_deriv=.true.)
2880 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_tau_a_tau_a)
2881 deriv => xc_dset_get_derivative(deriv_set, &
2882 [deriv_gamma_bb, deriv_tau_a, deriv_tau_b], &
2883 allocate_deriv=.true.)
2884 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_tau_a_tau_b)
2885 deriv => xc_dset_get_derivative(deriv_set, &
2886 [deriv_gamma_bb, deriv_tau_b, deriv_tau_b], &
2887 allocate_deriv=.true.)
2888 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_tau_b_tau_b)
2889 deriv => xc_dset_get_derivative(deriv_set, &
2890 [deriv_tau_a, deriv_tau_a, deriv_tau_a], &
2891 allocate_deriv=.true.)
2892 CALL xc_derivative_get(deriv, deriv_data=e_tau_a_tau_a_tau_a)
2893 deriv => xc_dset_get_derivative(deriv_set, &
2894 [deriv_tau_a, deriv_tau_a, deriv_tau_b], &
2895 allocate_deriv=.true.)
2896 CALL xc_derivative_get(deriv, deriv_data=e_tau_a_tau_a_tau_b)
2897 deriv => xc_dset_get_derivative(deriv_set, &
2898 [deriv_tau_a, deriv_tau_b, deriv_tau_b], &
2899 allocate_deriv=.true.)
2900 CALL xc_derivative_get(deriv, deriv_data=e_tau_a_tau_b_tau_b)
2901 deriv => xc_dset_get_derivative(deriv_set, &
2902 [deriv_tau_b, deriv_tau_b, deriv_tau_b], &
2903 allocate_deriv=.true.)
2904 CALL xc_derivative_get(deriv, deriv_data=e_tau_b_tau_b_tau_b)
2905 IF (has_laplace) THEN
2906 deriv => xc_dset_get_derivative(deriv_set, &
2907 [deriv_rhoa, deriv_rhoa, deriv_laplace_rhoa], &
2908 allocate_deriv=.true.)
2909 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_laplace_rhoa)
2910 deriv => xc_dset_get_derivative(deriv_set, &
2911 [deriv_rhoa, deriv_rhoa, deriv_laplace_rhob], &
2912 allocate_deriv=.true.)
2913 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_laplace_rhob)
2914 deriv => xc_dset_get_derivative(deriv_set, &
2915 [deriv_rhoa, deriv_rhob, deriv_laplace_rhoa], &
2916 allocate_deriv=.true.)
2917 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_laplace_rhoa)
2918 deriv => xc_dset_get_derivative(deriv_set, &
2919 [deriv_rhoa, deriv_rhob, deriv_laplace_rhob], &
2920 allocate_deriv=.true.)
2921 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_laplace_rhob)
2922 deriv => xc_dset_get_derivative(deriv_set, &
2923 [deriv_rhoa, deriv_gamma_aa, deriv_laplace_rhoa], &
2924 allocate_deriv=.true.)
2925 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_aa_laplace_rhoa)
2926 deriv => xc_dset_get_derivative(deriv_set, &
2927 [deriv_rhoa, deriv_gamma_aa, deriv_laplace_rhob], &
2928 allocate_deriv=.true.)
2929 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_aa_laplace_rhob)
2930 deriv => xc_dset_get_derivative(deriv_set, &
2931 [deriv_rhoa, deriv_gamma_ab, deriv_laplace_rhoa], &
2932 allocate_deriv=.true.)
2933 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_ab_laplace_rhoa)
2934 deriv => xc_dset_get_derivative(deriv_set, &
2935 [deriv_rhoa, deriv_gamma_ab, deriv_laplace_rhob], &
2936 allocate_deriv=.true.)
2937 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_ab_laplace_rhob)
2938 deriv => xc_dset_get_derivative(deriv_set, &
2939 [deriv_rhoa, deriv_gamma_bb, deriv_laplace_rhoa], &
2940 allocate_deriv=.true.)
2941 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_bb_laplace_rhoa)
2942 deriv => xc_dset_get_derivative(deriv_set, &
2943 [deriv_rhoa, deriv_gamma_bb, deriv_laplace_rhob], &
2944 allocate_deriv=.true.)
2945 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_gamma_bb_laplace_rhob)
2946 deriv => xc_dset_get_derivative(deriv_set, &
2947 [deriv_rhoa, deriv_laplace_rhoa, deriv_laplace_rhoa], &
2948 allocate_deriv=.true.)
2949 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_laplace_rhoa_laplace_rhoa)
2950 deriv => xc_dset_get_derivative(deriv_set, &
2951 [deriv_rhoa, deriv_laplace_rhoa, deriv_laplace_rhob], &
2952 allocate_deriv=.true.)
2953 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_laplace_rhoa_laplace_rhob)
2954 deriv => xc_dset_get_derivative(deriv_set, &
2955 [deriv_rhoa, deriv_laplace_rhoa, deriv_tau_a], &
2956 allocate_deriv=.true.)
2957 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_laplace_rhoa_tau_a)
2958 deriv => xc_dset_get_derivative(deriv_set, &
2959 [deriv_rhoa, deriv_laplace_rhoa, deriv_tau_b], &
2960 allocate_deriv=.true.)
2961 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_laplace_rhoa_tau_b)
2962 deriv => xc_dset_get_derivative(deriv_set, &
2963 [deriv_rhoa, deriv_laplace_rhob, deriv_laplace_rhob], &
2964 allocate_deriv=.true.)
2965 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_laplace_rhob_laplace_rhob)
2966 deriv => xc_dset_get_derivative(deriv_set, &
2967 [deriv_rhoa, deriv_laplace_rhob, deriv_tau_a], &
2968 allocate_deriv=.true.)
2969 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_laplace_rhob_tau_a)
2970 deriv => xc_dset_get_derivative(deriv_set, &
2971 [deriv_rhoa, deriv_laplace_rhob, deriv_tau_b], &
2972 allocate_deriv=.true.)
2973 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_laplace_rhob_tau_b)
2974 deriv => xc_dset_get_derivative(deriv_set, &
2975 [deriv_rhob, deriv_rhob, deriv_laplace_rhoa], &
2976 allocate_deriv=.true.)
2977 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_laplace_rhoa)
2978 deriv => xc_dset_get_derivative(deriv_set, &
2979 [deriv_rhob, deriv_rhob, deriv_laplace_rhob], &
2980 allocate_deriv=.true.)
2981 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_laplace_rhob)
2982 deriv => xc_dset_get_derivative(deriv_set, &
2983 [deriv_rhob, deriv_gamma_aa, deriv_laplace_rhoa], &
2984 allocate_deriv=.true.)
2985 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_aa_laplace_rhoa)
2986 deriv => xc_dset_get_derivative(deriv_set, &
2987 [deriv_rhob, deriv_gamma_aa, deriv_laplace_rhob], &
2988 allocate_deriv=.true.)
2989 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_aa_laplace_rhob)
2990 deriv => xc_dset_get_derivative(deriv_set, &
2991 [deriv_rhob, deriv_gamma_ab, deriv_laplace_rhoa], &
2992 allocate_deriv=.true.)
2993 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_ab_laplace_rhoa)
2994 deriv => xc_dset_get_derivative(deriv_set, &
2995 [deriv_rhob, deriv_gamma_ab, deriv_laplace_rhob], &
2996 allocate_deriv=.true.)
2997 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_ab_laplace_rhob)
2998 deriv => xc_dset_get_derivative(deriv_set, &
2999 [deriv_rhob, deriv_gamma_bb, deriv_laplace_rhoa], &
3000 allocate_deriv=.true.)
3001 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_bb_laplace_rhoa)
3002 deriv => xc_dset_get_derivative(deriv_set, &
3003 [deriv_rhob, deriv_gamma_bb, deriv_laplace_rhob], &
3004 allocate_deriv=.true.)
3005 CALL xc_derivative_get(deriv, deriv_data=e_rhob_gamma_bb_laplace_rhob)
3006 deriv => xc_dset_get_derivative(deriv_set, &
3007 [deriv_rhob, deriv_laplace_rhoa, deriv_laplace_rhoa], &
3008 allocate_deriv=.true.)
3009 CALL xc_derivative_get(deriv, deriv_data=e_rhob_laplace_rhoa_laplace_rhoa)
3010 deriv => xc_dset_get_derivative(deriv_set, &
3011 [deriv_rhob, deriv_laplace_rhoa, deriv_laplace_rhob], &
3012 allocate_deriv=.true.)
3013 CALL xc_derivative_get(deriv, deriv_data=e_rhob_laplace_rhoa_laplace_rhob)
3014 deriv => xc_dset_get_derivative(deriv_set, &
3015 [deriv_rhob, deriv_laplace_rhoa, deriv_tau_a], &
3016 allocate_deriv=.true.)
3017 CALL xc_derivative_get(deriv, deriv_data=e_rhob_laplace_rhoa_tau_a)
3018 deriv => xc_dset_get_derivative(deriv_set, &
3019 [deriv_rhob, deriv_laplace_rhoa, deriv_tau_b], &
3020 allocate_deriv=.true.)
3021 CALL xc_derivative_get(deriv, deriv_data=e_rhob_laplace_rhoa_tau_b)
3022 deriv => xc_dset_get_derivative(deriv_set, &
3023 [deriv_rhob, deriv_laplace_rhob, deriv_laplace_rhob], &
3024 allocate_deriv=.true.)
3025 CALL xc_derivative_get(deriv, deriv_data=e_rhob_laplace_rhob_laplace_rhob)
3026 deriv => xc_dset_get_derivative(deriv_set, &
3027 [deriv_rhob, deriv_laplace_rhob, deriv_tau_a], &
3028 allocate_deriv=.true.)
3029 CALL xc_derivative_get(deriv, deriv_data=e_rhob_laplace_rhob_tau_a)
3030 deriv => xc_dset_get_derivative(deriv_set, &
3031 [deriv_rhob, deriv_laplace_rhob, deriv_tau_b], &
3032 allocate_deriv=.true.)
3033 CALL xc_derivative_get(deriv, deriv_data=e_rhob_laplace_rhob_tau_b)
3034 deriv => xc_dset_get_derivative(deriv_set, &
3035 [deriv_gamma_aa, deriv_gamma_aa, deriv_laplace_rhoa], &
3036 allocate_deriv=.true.)
3037 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_aa_laplace_rhoa)
3038 deriv => xc_dset_get_derivative(deriv_set, &
3039 [deriv_gamma_aa, deriv_gamma_aa, deriv_laplace_rhob], &
3040 allocate_deriv=.true.)
3041 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_aa_laplace_rhob)
3042 deriv => xc_dset_get_derivative(deriv_set, &
3043 [deriv_gamma_aa, deriv_gamma_ab, deriv_laplace_rhoa], &
3044 allocate_deriv=.true.)
3045 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_ab_laplace_rhoa)
3046 deriv => xc_dset_get_derivative(deriv_set, &
3047 [deriv_gamma_aa, deriv_gamma_ab, deriv_laplace_rhob], &
3048 allocate_deriv=.true.)
3049 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_ab_laplace_rhob)
3050 deriv => xc_dset_get_derivative(deriv_set, &
3051 [deriv_gamma_aa, deriv_gamma_bb, deriv_laplace_rhoa], &
3052 allocate_deriv=.true.)
3053 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_bb_laplace_rhoa)
3054 deriv => xc_dset_get_derivative(deriv_set, &
3055 [deriv_gamma_aa, deriv_gamma_bb, deriv_laplace_rhob], &
3056 allocate_deriv=.true.)
3057 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_gamma_bb_laplace_rhob)
3058 deriv => xc_dset_get_derivative(deriv_set, &
3059 [deriv_gamma_aa, deriv_laplace_rhoa, deriv_laplace_rhoa], &
3060 allocate_deriv=.true.)
3061 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_laplace_rhoa_laplace_rhoa)
3062 deriv => xc_dset_get_derivative(deriv_set, &
3063 [deriv_gamma_aa, deriv_laplace_rhoa, deriv_laplace_rhob], &
3064 allocate_deriv=.true.)
3065 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_laplace_rhoa_laplace_rhob)
3066 deriv => xc_dset_get_derivative(deriv_set, &
3067 [deriv_gamma_aa, deriv_laplace_rhoa, deriv_tau_a], &
3068 allocate_deriv=.true.)
3069 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_laplace_rhoa_tau_a)
3070 deriv => xc_dset_get_derivative(deriv_set, &
3071 [deriv_gamma_aa, deriv_laplace_rhoa, deriv_tau_b], &
3072 allocate_deriv=.true.)
3073 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_laplace_rhoa_tau_b)
3074 deriv => xc_dset_get_derivative(deriv_set, &
3075 [deriv_gamma_aa, deriv_laplace_rhob, deriv_laplace_rhob], &
3076 allocate_deriv=.true.)
3077 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_laplace_rhob_laplace_rhob)
3078 deriv => xc_dset_get_derivative(deriv_set, &
3079 [deriv_gamma_aa, deriv_laplace_rhob, deriv_tau_a], &
3080 allocate_deriv=.true.)
3081 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_laplace_rhob_tau_a)
3082 deriv => xc_dset_get_derivative(deriv_set, &
3083 [deriv_gamma_aa, deriv_laplace_rhob, deriv_tau_b], &
3084 allocate_deriv=.true.)
3085 CALL xc_derivative_get(deriv, deriv_data=e_gamma_aa_laplace_rhob_tau_b)
3086 deriv => xc_dset_get_derivative(deriv_set, &
3087 [deriv_gamma_ab, deriv_gamma_ab, deriv_laplace_rhoa], &
3088 allocate_deriv=.true.)
3089 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_ab_laplace_rhoa)
3090 deriv => xc_dset_get_derivative(deriv_set, &
3091 [deriv_gamma_ab, deriv_gamma_ab, deriv_laplace_rhob], &
3092 allocate_deriv=.true.)
3093 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_ab_laplace_rhob)
3094 deriv => xc_dset_get_derivative(deriv_set, &
3095 [deriv_gamma_ab, deriv_gamma_bb, deriv_laplace_rhoa], &
3096 allocate_deriv=.true.)
3097 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_bb_laplace_rhoa)
3098 deriv => xc_dset_get_derivative(deriv_set, &
3099 [deriv_gamma_ab, deriv_gamma_bb, deriv_laplace_rhob], &
3100 allocate_deriv=.true.)
3101 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_gamma_bb_laplace_rhob)
3102 deriv => xc_dset_get_derivative(deriv_set, &
3103 [deriv_gamma_ab, deriv_laplace_rhoa, deriv_laplace_rhoa], &
3104 allocate_deriv=.true.)
3105 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_laplace_rhoa_laplace_rhoa)
3106 deriv => xc_dset_get_derivative(deriv_set, &
3107 [deriv_gamma_ab, deriv_laplace_rhoa, deriv_laplace_rhob], &
3108 allocate_deriv=.true.)
3109 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_laplace_rhoa_laplace_rhob)
3110 deriv => xc_dset_get_derivative(deriv_set, &
3111 [deriv_gamma_ab, deriv_laplace_rhoa, deriv_tau_a], &
3112 allocate_deriv=.true.)
3113 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_laplace_rhoa_tau_a)
3114 deriv => xc_dset_get_derivative(deriv_set, &
3115 [deriv_gamma_ab, deriv_laplace_rhoa, deriv_tau_b], &
3116 allocate_deriv=.true.)
3117 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_laplace_rhoa_tau_b)
3118 deriv => xc_dset_get_derivative(deriv_set, &
3119 [deriv_gamma_ab, deriv_laplace_rhob, deriv_laplace_rhob], &
3120 allocate_deriv=.true.)
3121 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_laplace_rhob_laplace_rhob)
3122 deriv => xc_dset_get_derivative(deriv_set, &
3123 [deriv_gamma_ab, deriv_laplace_rhob, deriv_tau_a], &
3124 allocate_deriv=.true.)
3125 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_laplace_rhob_tau_a)
3126 deriv => xc_dset_get_derivative(deriv_set, &
3127 [deriv_gamma_ab, deriv_laplace_rhob, deriv_tau_b], &
3128 allocate_deriv=.true.)
3129 CALL xc_derivative_get(deriv, deriv_data=e_gamma_ab_laplace_rhob_tau_b)
3130 deriv => xc_dset_get_derivative(deriv_set, &
3131 [deriv_gamma_bb, deriv_gamma_bb, deriv_laplace_rhoa], &
3132 allocate_deriv=.true.)
3133 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_gamma_bb_laplace_rhoa)
3134 deriv => xc_dset_get_derivative(deriv_set, &
3135 [deriv_gamma_bb, deriv_gamma_bb, deriv_laplace_rhob], &
3136 allocate_deriv=.true.)
3137 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_gamma_bb_laplace_rhob)
3138 deriv => xc_dset_get_derivative(deriv_set, &
3139 [deriv_gamma_bb, deriv_laplace_rhoa, deriv_laplace_rhoa], &
3140 allocate_deriv=.true.)
3141 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_laplace_rhoa_laplace_rhoa)
3142 deriv => xc_dset_get_derivative(deriv_set, &
3143 [deriv_gamma_bb, deriv_laplace_rhoa, deriv_laplace_rhob], &
3144 allocate_deriv=.true.)
3145 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_laplace_rhoa_laplace_rhob)
3146 deriv => xc_dset_get_derivative(deriv_set, &
3147 [deriv_gamma_bb, deriv_laplace_rhoa, deriv_tau_a], &
3148 allocate_deriv=.true.)
3149 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_laplace_rhoa_tau_a)
3150 deriv => xc_dset_get_derivative(deriv_set, &
3151 [deriv_gamma_bb, deriv_laplace_rhoa, deriv_tau_b], &
3152 allocate_deriv=.true.)
3153 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_laplace_rhoa_tau_b)
3154 deriv => xc_dset_get_derivative(deriv_set, &
3155 [deriv_gamma_bb, deriv_laplace_rhob, deriv_laplace_rhob], &
3156 allocate_deriv=.true.)
3157 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_laplace_rhob_laplace_rhob)
3158 deriv => xc_dset_get_derivative(deriv_set, &
3159 [deriv_gamma_bb, deriv_laplace_rhob, deriv_tau_a], &
3160 allocate_deriv=.true.)
3161 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_laplace_rhob_tau_a)
3162 deriv => xc_dset_get_derivative(deriv_set, &
3163 [deriv_gamma_bb, deriv_laplace_rhob, deriv_tau_b], &
3164 allocate_deriv=.true.)
3165 CALL xc_derivative_get(deriv, deriv_data=e_gamma_bb_laplace_rhob_tau_b)
3166 deriv => xc_dset_get_derivative(deriv_set, &
3167 [deriv_laplace_rhoa, deriv_laplace_rhoa, deriv_laplace_rhoa], &
3168 allocate_deriv=.true.)
3169 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_laplace_rhoa_laplace_rhoa)
3170 deriv => xc_dset_get_derivative(deriv_set, &
3171 [deriv_laplace_rhoa, deriv_laplace_rhoa, deriv_laplace_rhob], &
3172 allocate_deriv=.true.)
3173 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_laplace_rhoa_laplace_rhob)
3174 deriv => xc_dset_get_derivative(deriv_set, &
3175 [deriv_laplace_rhoa, deriv_laplace_rhoa, deriv_tau_a], &
3176 allocate_deriv=.true.)
3177 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_laplace_rhoa_tau_a)
3178 deriv => xc_dset_get_derivative(deriv_set, &
3179 [deriv_laplace_rhoa, deriv_laplace_rhoa, deriv_tau_b], &
3180 allocate_deriv=.true.)
3181 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_laplace_rhoa_tau_b)
3182 deriv => xc_dset_get_derivative(deriv_set, &
3183 [deriv_laplace_rhoa, deriv_laplace_rhob, deriv_laplace_rhob], &
3184 allocate_deriv=.true.)
3185 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_laplace_rhob_laplace_rhob)
3186 deriv => xc_dset_get_derivative(deriv_set, &
3187 [deriv_laplace_rhoa, deriv_laplace_rhob, deriv_tau_a], &
3188 allocate_deriv=.true.)
3189 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_laplace_rhob_tau_a)
3190 deriv => xc_dset_get_derivative(deriv_set, &
3191 [deriv_laplace_rhoa, deriv_laplace_rhob, deriv_tau_b], &
3192 allocate_deriv=.true.)
3193 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_laplace_rhob_tau_b)
3194 deriv => xc_dset_get_derivative(deriv_set, &
3195 [deriv_laplace_rhoa, deriv_tau_a, deriv_tau_a], &
3196 allocate_deriv=.true.)
3197 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_tau_a_tau_a)
3198 deriv => xc_dset_get_derivative(deriv_set, &
3199 [deriv_laplace_rhoa, deriv_tau_a, deriv_tau_b], &
3200 allocate_deriv=.true.)
3201 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_tau_a_tau_b)
3202 deriv => xc_dset_get_derivative(deriv_set, &
3203 [deriv_laplace_rhoa, deriv_tau_b, deriv_tau_b], &
3204 allocate_deriv=.true.)
3205 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_tau_b_tau_b)
3206 deriv => xc_dset_get_derivative(deriv_set, &
3207 [deriv_laplace_rhob, deriv_laplace_rhob, deriv_laplace_rhob], &
3208 allocate_deriv=.true.)
3209 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob_laplace_rhob_laplace_rhob)
3210 deriv => xc_dset_get_derivative(deriv_set, &
3211 [deriv_laplace_rhob, deriv_laplace_rhob, deriv_tau_a], &
3212 allocate_deriv=.true.)
3213 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob_laplace_rhob_tau_a)
3214 deriv => xc_dset_get_derivative(deriv_set, &
3215 [deriv_laplace_rhob, deriv_laplace_rhob, deriv_tau_b], &
3216 allocate_deriv=.true.)
3217 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob_laplace_rhob_tau_b)
3218 deriv => xc_dset_get_derivative(deriv_set, &
3219 [deriv_laplace_rhob, deriv_tau_a, deriv_tau_a], &
3220 allocate_deriv=.true.)
3221 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob_tau_a_tau_a)
3222 deriv => xc_dset_get_derivative(deriv_set, &
3223 [deriv_laplace_rhob, deriv_tau_a, deriv_tau_b], &
3224 allocate_deriv=.true.)
3225 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob_tau_a_tau_b)
3226 deriv => xc_dset_get_derivative(deriv_set, &
3227 [deriv_laplace_rhob, deriv_tau_b, deriv_tau_b], &
3228 allocate_deriv=.true.)
3229 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob_tau_b_tau_b)
3230 END IF
3231 deriv => xc_dset_get_derivative(deriv_set, &
3232 [deriv_rhoa, deriv_rhoa, deriv_rhoa], &
3233 allocate_deriv=.true.)
3234 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_rhoa)
3235 deriv => xc_dset_get_derivative(deriv_set, &
3236 [deriv_rhoa, deriv_rhoa, deriv_rhob], &
3237 allocate_deriv=.true.)
3238 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_rhob)
3239 deriv => xc_dset_get_derivative(deriv_set, &
3240 [deriv_rhoa, deriv_rhob, deriv_rhob], &
3241 allocate_deriv=.true.)
3242 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_rhob)
3243 deriv => xc_dset_get_derivative(deriv_set, &
3244 [deriv_rhob, deriv_rhob, deriv_rhob], &
3245 allocate_deriv=.true.)
3246 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_rhob)
3247 CASE default
3248 cpabort(trim(func_name)//": this XC_FAMILY is currently not supported.")
3249 END SELECT
3250 END IF
3251
3252!$OMP PARALLEL DEFAULT(NONE), &
3253!$OMP SHARED(rhoa,rhob,norm_drho,norm_drhoa,norm_drhob),&
3254!$OMP SHARED(laplace_rhoa,laplace_rhob,tau_a,tau_b),&
3255!$OMP SHARED(e_0,e_rhoa,e_rhob,e_ndrho,e_ndrhoa,e_ndrhob),&
3256!$OMP SHARED(e_laplace_rhoa,e_laplace_rhob,e_tau_a,e_tau_b),&
3257!$OMP SHARED(e_rhoa_rhoa,e_rhoa_rhob,e_rhob_rhob),&
3258!$OMP SHARED(e_ndrho_rhoa,e_ndrho_rhob),&
3259!$OMP SHARED(e_ndrhoa_rhoa,e_ndrhoa_rhob,e_ndrhob_rhoa,e_ndrhob_rhob),&
3260!$OMP SHARED(e_ndrho_ndrho,e_ndrho_ndrhoa,e_ndrho_ndrhob),&
3261!$OMP SHARED(e_ndrhoa_ndrhoa,e_ndrhoa_ndrhob,e_ndrhob_ndrhob),&
3262!$OMP SHARED(e_rhoa_laplace_rhoa,e_rhoa_laplace_rhob,e_rhob_laplace_rhoa,e_rhob_laplace_rhob),&
3263!$OMP SHARED(e_rhoa_tau_a,e_rhoa_tau_b,e_rhob_tau_a,e_rhob_tau_b),&
3264!$OMP SHARED(e_ndrho_laplace_rhoa,e_ndrho_laplace_rhob),&
3265!$OMP SHARED(e_ndrhoa_laplace_rhoa,e_ndrhoa_laplace_rhob,e_ndrhob_laplace_rhoa,e_ndrhob_laplace_rhob),&
3266!$OMP SHARED(e_ndrho_tau_a,e_ndrho_tau_b),&
3267!$OMP SHARED(e_ndrhoa_tau_a,e_ndrhoa_tau_b,e_ndrhob_tau_a,e_ndrhob_tau_b),&
3268!$OMP SHARED(e_laplace_rhoa_laplace_rhoa,e_laplace_rhoa_laplace_rhob,e_laplace_rhob_laplace_rhob),&
3269!$OMP SHARED(e_laplace_rhoa_tau_a,e_laplace_rhoa_tau_b,e_laplace_rhob_tau_a,e_laplace_rhob_tau_b),&
3270!$OMP SHARED(e_tau_a_tau_a,e_tau_a_tau_b,e_tau_b_tau_b),&
3271!$OMP SHARED(e_rhoa_rhoa_rhoa,e_rhoa_rhoa_rhob,e_rhoa_rhob_rhob,e_rhob_rhob_rhob),&
3272!$OMP SHARED(e_gamma_aa),&
3273!$OMP SHARED(e_gamma_ab),&
3274!$OMP SHARED(e_gamma_bb),&
3275!$OMP SHARED(e_rhoa_gamma_aa),&
3276!$OMP SHARED(e_rhoa_gamma_ab),&
3277!$OMP SHARED(e_rhoa_gamma_bb),&
3278!$OMP SHARED(e_rhob_gamma_aa),&
3279!$OMP SHARED(e_rhob_gamma_ab),&
3280!$OMP SHARED(e_rhob_gamma_bb),&
3281!$OMP SHARED(e_gamma_aa_gamma_aa),&
3282!$OMP SHARED(e_gamma_aa_gamma_ab),&
3283!$OMP SHARED(e_gamma_aa_gamma_bb),&
3284!$OMP SHARED(e_gamma_aa_laplace_rhoa),&
3285!$OMP SHARED(e_gamma_aa_laplace_rhob),&
3286!$OMP SHARED(e_gamma_aa_tau_a),&
3287!$OMP SHARED(e_gamma_aa_tau_b),&
3288!$OMP SHARED(e_gamma_ab_gamma_ab),&
3289!$OMP SHARED(e_gamma_ab_gamma_bb),&
3290!$OMP SHARED(e_gamma_ab_laplace_rhoa),&
3291!$OMP SHARED(e_gamma_ab_laplace_rhob),&
3292!$OMP SHARED(e_gamma_ab_tau_a),&
3293!$OMP SHARED(e_gamma_ab_tau_b),&
3294!$OMP SHARED(e_gamma_bb_gamma_bb),&
3295!$OMP SHARED(e_gamma_bb_laplace_rhoa),&
3296!$OMP SHARED(e_gamma_bb_laplace_rhob),&
3297!$OMP SHARED(e_gamma_bb_tau_a),&
3298!$OMP SHARED(e_gamma_bb_tau_b),&
3299!$OMP SHARED(e_rhoa_rhoa_gamma_aa),&
3300!$OMP SHARED(e_rhoa_rhoa_gamma_ab),&
3301!$OMP SHARED(e_rhoa_rhoa_gamma_bb),&
3302!$OMP SHARED(e_rhoa_rhoa_laplace_rhoa),&
3303!$OMP SHARED(e_rhoa_rhoa_laplace_rhob),&
3304!$OMP SHARED(e_rhoa_rhoa_tau_a),&
3305!$OMP SHARED(e_rhoa_rhoa_tau_b),&
3306!$OMP SHARED(e_rhoa_rhob_gamma_aa),&
3307!$OMP SHARED(e_rhoa_rhob_gamma_ab),&
3308!$OMP SHARED(e_rhoa_rhob_gamma_bb),&
3309!$OMP SHARED(e_rhoa_rhob_laplace_rhoa),&
3310!$OMP SHARED(e_rhoa_rhob_laplace_rhob),&
3311!$OMP SHARED(e_rhoa_rhob_tau_a),&
3312!$OMP SHARED(e_rhoa_rhob_tau_b),&
3313!$OMP SHARED(e_rhoa_gamma_aa_gamma_aa),&
3314!$OMP SHARED(e_rhoa_gamma_aa_gamma_ab),&
3315!$OMP SHARED(e_rhoa_gamma_aa_gamma_bb),&
3316!$OMP SHARED(e_rhoa_gamma_aa_laplace_rhoa),&
3317!$OMP SHARED(e_rhoa_gamma_aa_laplace_rhob),&
3318!$OMP SHARED(e_rhoa_gamma_aa_tau_a),&
3319!$OMP SHARED(e_rhoa_gamma_aa_tau_b),&
3320!$OMP SHARED(e_rhoa_gamma_ab_gamma_ab),&
3321!$OMP SHARED(e_rhoa_gamma_ab_gamma_bb),&
3322!$OMP SHARED(e_rhoa_gamma_ab_laplace_rhoa),&
3323!$OMP SHARED(e_rhoa_gamma_ab_laplace_rhob),&
3324!$OMP SHARED(e_rhoa_gamma_ab_tau_a),&
3325!$OMP SHARED(e_rhoa_gamma_ab_tau_b),&
3326!$OMP SHARED(e_rhoa_gamma_bb_gamma_bb),&
3327!$OMP SHARED(e_rhoa_gamma_bb_laplace_rhoa),&
3328!$OMP SHARED(e_rhoa_gamma_bb_laplace_rhob),&
3329!$OMP SHARED(e_rhoa_gamma_bb_tau_a),&
3330!$OMP SHARED(e_rhoa_gamma_bb_tau_b),&
3331!$OMP SHARED(e_rhoa_laplace_rhoa_laplace_rhoa),&
3332!$OMP SHARED(e_rhoa_laplace_rhoa_laplace_rhob),&
3333!$OMP SHARED(e_rhoa_laplace_rhoa_tau_a),&
3334!$OMP SHARED(e_rhoa_laplace_rhoa_tau_b),&
3335!$OMP SHARED(e_rhoa_laplace_rhob_laplace_rhob),&
3336!$OMP SHARED(e_rhoa_laplace_rhob_tau_a),&
3337!$OMP SHARED(e_rhoa_laplace_rhob_tau_b),&
3338!$OMP SHARED(e_rhoa_tau_a_tau_a),&
3339!$OMP SHARED(e_rhoa_tau_a_tau_b),&
3340!$OMP SHARED(e_rhoa_tau_b_tau_b),&
3341!$OMP SHARED(e_rhob_rhob_gamma_aa),&
3342!$OMP SHARED(e_rhob_rhob_gamma_ab),&
3343!$OMP SHARED(e_rhob_rhob_gamma_bb),&
3344!$OMP SHARED(e_rhob_rhob_laplace_rhoa),&
3345!$OMP SHARED(e_rhob_rhob_laplace_rhob),&
3346!$OMP SHARED(e_rhob_rhob_tau_a),&
3347!$OMP SHARED(e_rhob_rhob_tau_b),&
3348!$OMP SHARED(e_rhob_gamma_aa_gamma_aa),&
3349!$OMP SHARED(e_rhob_gamma_aa_gamma_ab),&
3350!$OMP SHARED(e_rhob_gamma_aa_gamma_bb),&
3351!$OMP SHARED(e_rhob_gamma_aa_laplace_rhoa),&
3352!$OMP SHARED(e_rhob_gamma_aa_laplace_rhob),&
3353!$OMP SHARED(e_rhob_gamma_aa_tau_a),&
3354!$OMP SHARED(e_rhob_gamma_aa_tau_b),&
3355!$OMP SHARED(e_rhob_gamma_ab_gamma_ab),&
3356!$OMP SHARED(e_rhob_gamma_ab_gamma_bb),&
3357!$OMP SHARED(e_rhob_gamma_ab_laplace_rhoa),&
3358!$OMP SHARED(e_rhob_gamma_ab_laplace_rhob),&
3359!$OMP SHARED(e_rhob_gamma_ab_tau_a),&
3360!$OMP SHARED(e_rhob_gamma_ab_tau_b),&
3361!$OMP SHARED(e_rhob_gamma_bb_gamma_bb),&
3362!$OMP SHARED(e_rhob_gamma_bb_laplace_rhoa),&
3363!$OMP SHARED(e_rhob_gamma_bb_laplace_rhob),&
3364!$OMP SHARED(e_rhob_gamma_bb_tau_a),&
3365!$OMP SHARED(e_rhob_gamma_bb_tau_b),&
3366!$OMP SHARED(e_rhob_laplace_rhoa_laplace_rhoa),&
3367!$OMP SHARED(e_rhob_laplace_rhoa_laplace_rhob),&
3368!$OMP SHARED(e_rhob_laplace_rhoa_tau_a),&
3369!$OMP SHARED(e_rhob_laplace_rhoa_tau_b),&
3370!$OMP SHARED(e_rhob_laplace_rhob_laplace_rhob),&
3371!$OMP SHARED(e_rhob_laplace_rhob_tau_a),&
3372!$OMP SHARED(e_rhob_laplace_rhob_tau_b),&
3373!$OMP SHARED(e_rhob_tau_a_tau_a),&
3374!$OMP SHARED(e_rhob_tau_a_tau_b),&
3375!$OMP SHARED(e_rhob_tau_b_tau_b),&
3376!$OMP SHARED(e_gamma_aa_gamma_aa_gamma_aa),&
3377!$OMP SHARED(e_gamma_aa_gamma_aa_gamma_ab),&
3378!$OMP SHARED(e_gamma_aa_gamma_aa_gamma_bb),&
3379!$OMP SHARED(e_gamma_aa_gamma_aa_laplace_rhoa),&
3380!$OMP SHARED(e_gamma_aa_gamma_aa_laplace_rhob),&
3381!$OMP SHARED(e_gamma_aa_gamma_aa_tau_a),&
3382!$OMP SHARED(e_gamma_aa_gamma_aa_tau_b),&
3383!$OMP SHARED(e_gamma_aa_gamma_ab_gamma_ab),&
3384!$OMP SHARED(e_gamma_aa_gamma_ab_gamma_bb),&
3385!$OMP SHARED(e_gamma_aa_gamma_ab_laplace_rhoa),&
3386!$OMP SHARED(e_gamma_aa_gamma_ab_laplace_rhob),&
3387!$OMP SHARED(e_gamma_aa_gamma_ab_tau_a),&
3388!$OMP SHARED(e_gamma_aa_gamma_ab_tau_b),&
3389!$OMP SHARED(e_gamma_aa_gamma_bb_gamma_bb),&
3390!$OMP SHARED(e_gamma_aa_gamma_bb_laplace_rhoa),&
3391!$OMP SHARED(e_gamma_aa_gamma_bb_laplace_rhob),&
3392!$OMP SHARED(e_gamma_aa_gamma_bb_tau_a),&
3393!$OMP SHARED(e_gamma_aa_gamma_bb_tau_b),&
3394!$OMP SHARED(e_gamma_aa_laplace_rhoa_laplace_rhoa),&
3395!$OMP SHARED(e_gamma_aa_laplace_rhoa_laplace_rhob),&
3396!$OMP SHARED(e_gamma_aa_laplace_rhoa_tau_a),&
3397!$OMP SHARED(e_gamma_aa_laplace_rhoa_tau_b),&
3398!$OMP SHARED(e_gamma_aa_laplace_rhob_laplace_rhob),&
3399!$OMP SHARED(e_gamma_aa_laplace_rhob_tau_a),&
3400!$OMP SHARED(e_gamma_aa_laplace_rhob_tau_b),&
3401!$OMP SHARED(e_gamma_aa_tau_a_tau_a),&
3402!$OMP SHARED(e_gamma_aa_tau_a_tau_b),&
3403!$OMP SHARED(e_gamma_aa_tau_b_tau_b),&
3404!$OMP SHARED(e_gamma_ab_gamma_ab_gamma_ab),&
3405!$OMP SHARED(e_gamma_ab_gamma_ab_gamma_bb),&
3406!$OMP SHARED(e_gamma_ab_gamma_ab_laplace_rhoa),&
3407!$OMP SHARED(e_gamma_ab_gamma_ab_laplace_rhob),&
3408!$OMP SHARED(e_gamma_ab_gamma_ab_tau_a),&
3409!$OMP SHARED(e_gamma_ab_gamma_ab_tau_b),&
3410!$OMP SHARED(e_gamma_ab_gamma_bb_gamma_bb),&
3411!$OMP SHARED(e_gamma_ab_gamma_bb_laplace_rhoa),&
3412!$OMP SHARED(e_gamma_ab_gamma_bb_laplace_rhob),&
3413!$OMP SHARED(e_gamma_ab_gamma_bb_tau_a),&
3414!$OMP SHARED(e_gamma_ab_gamma_bb_tau_b),&
3415!$OMP SHARED(e_gamma_ab_laplace_rhoa_laplace_rhoa),&
3416!$OMP SHARED(e_gamma_ab_laplace_rhoa_laplace_rhob),&
3417!$OMP SHARED(e_gamma_ab_laplace_rhoa_tau_a),&
3418!$OMP SHARED(e_gamma_ab_laplace_rhoa_tau_b),&
3419!$OMP SHARED(e_gamma_ab_laplace_rhob_laplace_rhob),&
3420!$OMP SHARED(e_gamma_ab_laplace_rhob_tau_a),&
3421!$OMP SHARED(e_gamma_ab_laplace_rhob_tau_b),&
3422!$OMP SHARED(e_gamma_ab_tau_a_tau_a),&
3423!$OMP SHARED(e_gamma_ab_tau_a_tau_b),&
3424!$OMP SHARED(e_gamma_ab_tau_b_tau_b),&
3425!$OMP SHARED(e_gamma_bb_gamma_bb_gamma_bb),&
3426!$OMP SHARED(e_gamma_bb_gamma_bb_laplace_rhoa),&
3427!$OMP SHARED(e_gamma_bb_gamma_bb_laplace_rhob),&
3428!$OMP SHARED(e_gamma_bb_gamma_bb_tau_a),&
3429!$OMP SHARED(e_gamma_bb_gamma_bb_tau_b),&
3430!$OMP SHARED(e_gamma_bb_laplace_rhoa_laplace_rhoa),&
3431!$OMP SHARED(e_gamma_bb_laplace_rhoa_laplace_rhob),&
3432!$OMP SHARED(e_gamma_bb_laplace_rhoa_tau_a),&
3433!$OMP SHARED(e_gamma_bb_laplace_rhoa_tau_b),&
3434!$OMP SHARED(e_gamma_bb_laplace_rhob_laplace_rhob),&
3435!$OMP SHARED(e_gamma_bb_laplace_rhob_tau_a),&
3436!$OMP SHARED(e_gamma_bb_laplace_rhob_tau_b),&
3437!$OMP SHARED(e_gamma_bb_tau_a_tau_a),&
3438!$OMP SHARED(e_gamma_bb_tau_a_tau_b),&
3439!$OMP SHARED(e_gamma_bb_tau_b_tau_b),&
3440!$OMP SHARED(e_laplace_rhoa_laplace_rhoa_laplace_rhoa),&
3441!$OMP SHARED(e_laplace_rhoa_laplace_rhoa_laplace_rhob),&
3442!$OMP SHARED(e_laplace_rhoa_laplace_rhoa_tau_a),&
3443!$OMP SHARED(e_laplace_rhoa_laplace_rhoa_tau_b),&
3444!$OMP SHARED(e_laplace_rhoa_laplace_rhob_laplace_rhob),&
3445!$OMP SHARED(e_laplace_rhoa_laplace_rhob_tau_a),&
3446!$OMP SHARED(e_laplace_rhoa_laplace_rhob_tau_b),&
3447!$OMP SHARED(e_laplace_rhoa_tau_a_tau_a),&
3448!$OMP SHARED(e_laplace_rhoa_tau_a_tau_b),&
3449!$OMP SHARED(e_laplace_rhoa_tau_b_tau_b),&
3450!$OMP SHARED(e_laplace_rhob_laplace_rhob_laplace_rhob),&
3451!$OMP SHARED(e_laplace_rhob_laplace_rhob_tau_a),&
3452!$OMP SHARED(e_laplace_rhob_laplace_rhob_tau_b),&
3453!$OMP SHARED(e_laplace_rhob_tau_a_tau_a),&
3454!$OMP SHARED(e_laplace_rhob_tau_a_tau_b),&
3455!$OMP SHARED(e_laplace_rhob_tau_b_tau_b),&
3456!$OMP SHARED(e_tau_a_tau_a_tau_a),&
3457!$OMP SHARED(e_tau_a_tau_a_tau_b),&
3458!$OMP SHARED(e_tau_a_tau_b_tau_b),&
3459!$OMP SHARED(e_tau_b_tau_b_tau_b),&
3460!$OMP SHARED(grad_deriv,npoints),&
3461!$OMP SHARED(func_name,func_scale,workers)
3462
3463 CALL libxc_spin_polarized_calc(rhoa=rhoa, rhob=rhob, norm_drho=norm_drho, &
3464 norm_drhoa=norm_drhoa, norm_drhob=norm_drhob, laplace_rhoa=laplace_rhoa, &
3465 laplace_rhob=laplace_rhob, tau_a=tau_a, tau_b=tau_b, &
3466 e_0=e_0, e_rhoa=e_rhoa, e_rhob=e_rhob, e_ndrho=e_ndrho, &
3467 e_ndrhoa=e_ndrhoa, e_ndrhob=e_ndrhob, e_laplace_rhoa=e_laplace_rhoa, &
3468 e_laplace_rhob=e_laplace_rhob, e_tau_a=e_tau_a, e_tau_b=e_tau_b, &
3469 e_rhoa_rhoa=e_rhoa_rhoa, e_rhoa_rhob=e_rhoa_rhob, e_rhob_rhob=e_rhob_rhob, &
3470 e_ndrho_rhoa=e_ndrho_rhoa, e_ndrho_rhob=e_ndrho_rhob, &
3471 e_ndrhoa_rhoa=e_ndrhoa_rhoa, e_ndrhoa_rhob=e_ndrhoa_rhob, &
3472 e_ndrhob_rhoa=e_ndrhob_rhoa, e_ndrhob_rhob=e_ndrhob_rhob, &
3473 e_ndrho_ndrho=e_ndrho_ndrho, e_ndrho_ndrhoa=e_ndrho_ndrhoa, &
3474 e_ndrho_ndrhob=e_ndrho_ndrhob, e_ndrhoa_ndrhoa=e_ndrhoa_ndrhoa, &
3475 e_ndrhoa_ndrhob=e_ndrhoa_ndrhob, e_ndrhob_ndrhob=e_ndrhob_ndrhob, &
3476 e_rhoa_laplace_rhoa=e_rhoa_laplace_rhoa, &
3477 e_rhoa_laplace_rhob=e_rhoa_laplace_rhob, &
3478 e_rhob_laplace_rhoa=e_rhob_laplace_rhoa, &
3479 e_rhob_laplace_rhob=e_rhob_laplace_rhob, &
3480 e_rhoa_tau_a=e_rhoa_tau_a, e_rhoa_tau_b=e_rhoa_tau_b, &
3481 e_rhob_tau_a=e_rhob_tau_a, e_rhob_tau_b=e_rhob_tau_b, &
3482 e_ndrho_laplace_rhoa=e_ndrho_laplace_rhoa, &
3483 e_ndrho_laplace_rhob=e_ndrho_laplace_rhob, &
3484 e_ndrhoa_laplace_rhoa=e_ndrhoa_laplace_rhoa, &
3485 e_ndrhoa_laplace_rhob=e_ndrhoa_laplace_rhob, &
3486 e_ndrhob_laplace_rhoa=e_ndrhob_laplace_rhoa, &
3487 e_ndrhob_laplace_rhob=e_ndrhob_laplace_rhob, &
3488 e_ndrho_tau_a=e_ndrho_tau_a, e_ndrho_tau_b=e_ndrho_tau_b, &
3489 e_ndrhoa_tau_a=e_ndrhoa_tau_a, e_ndrhoa_tau_b=e_ndrhoa_tau_b, &
3490 e_ndrhob_tau_a=e_ndrhob_tau_a, e_ndrhob_tau_b=e_ndrhob_tau_b, &
3491 e_laplace_rhoa_laplace_rhoa=e_laplace_rhoa_laplace_rhoa, &
3492 e_laplace_rhoa_laplace_rhob=e_laplace_rhoa_laplace_rhob, &
3493 e_laplace_rhob_laplace_rhob=e_laplace_rhob_laplace_rhob, &
3494 e_laplace_rhoa_tau_a=e_laplace_rhoa_tau_a, &
3495 e_laplace_rhoa_tau_b=e_laplace_rhoa_tau_b, &
3496 e_laplace_rhob_tau_a=e_laplace_rhob_tau_a, &
3497 e_laplace_rhob_tau_b=e_laplace_rhob_tau_b, &
3498 e_tau_a_tau_a=e_tau_a_tau_a, &
3499 e_tau_a_tau_b=e_tau_a_tau_b, &
3500 e_tau_b_tau_b=e_tau_b_tau_b, &
3501 e_rhoa_rhoa_rhoa=e_rhoa_rhoa_rhoa, &
3502 e_rhoa_rhoa_rhob=e_rhoa_rhoa_rhob, &
3503 e_rhoa_rhob_rhob=e_rhoa_rhob_rhob, &
3504 e_rhob_rhob_rhob=e_rhob_rhob_rhob, &
3505 e_gamma_aa=e_gamma_aa, &
3506 e_gamma_ab=e_gamma_ab, &
3507 e_gamma_bb=e_gamma_bb, &
3508 e_rhoa_gamma_aa=e_rhoa_gamma_aa, &
3509 e_rhoa_gamma_ab=e_rhoa_gamma_ab, &
3510 e_rhoa_gamma_bb=e_rhoa_gamma_bb, &
3511 e_rhob_gamma_aa=e_rhob_gamma_aa, &
3512 e_rhob_gamma_ab=e_rhob_gamma_ab, &
3513 e_rhob_gamma_bb=e_rhob_gamma_bb, &
3514 e_gamma_aa_gamma_aa=e_gamma_aa_gamma_aa, &
3515 e_gamma_aa_gamma_ab=e_gamma_aa_gamma_ab, &
3516 e_gamma_aa_gamma_bb=e_gamma_aa_gamma_bb, &
3517 e_gamma_aa_laplace_rhoa=e_gamma_aa_laplace_rhoa, &
3518 e_gamma_aa_laplace_rhob=e_gamma_aa_laplace_rhob, &
3519 e_gamma_aa_tau_a=e_gamma_aa_tau_a, &
3520 e_gamma_aa_tau_b=e_gamma_aa_tau_b, &
3521 e_gamma_ab_gamma_ab=e_gamma_ab_gamma_ab, &
3522 e_gamma_ab_gamma_bb=e_gamma_ab_gamma_bb, &
3523 e_gamma_ab_laplace_rhoa=e_gamma_ab_laplace_rhoa, &
3524 e_gamma_ab_laplace_rhob=e_gamma_ab_laplace_rhob, &
3525 e_gamma_ab_tau_a=e_gamma_ab_tau_a, &
3526 e_gamma_ab_tau_b=e_gamma_ab_tau_b, &
3527 e_gamma_bb_gamma_bb=e_gamma_bb_gamma_bb, &
3528 e_gamma_bb_laplace_rhoa=e_gamma_bb_laplace_rhoa, &
3529 e_gamma_bb_laplace_rhob=e_gamma_bb_laplace_rhob, &
3530 e_gamma_bb_tau_a=e_gamma_bb_tau_a, &
3531 e_gamma_bb_tau_b=e_gamma_bb_tau_b, &
3532 e_rhoa_rhoa_gamma_aa=e_rhoa_rhoa_gamma_aa, &
3533 e_rhoa_rhoa_gamma_ab=e_rhoa_rhoa_gamma_ab, &
3534 e_rhoa_rhoa_gamma_bb=e_rhoa_rhoa_gamma_bb, &
3535 e_rhoa_rhoa_laplace_rhoa=e_rhoa_rhoa_laplace_rhoa, &
3536 e_rhoa_rhoa_laplace_rhob=e_rhoa_rhoa_laplace_rhob, &
3537 e_rhoa_rhoa_tau_a=e_rhoa_rhoa_tau_a, &
3538 e_rhoa_rhoa_tau_b=e_rhoa_rhoa_tau_b, &
3539 e_rhoa_rhob_gamma_aa=e_rhoa_rhob_gamma_aa, &
3540 e_rhoa_rhob_gamma_ab=e_rhoa_rhob_gamma_ab, &
3541 e_rhoa_rhob_gamma_bb=e_rhoa_rhob_gamma_bb, &
3542 e_rhoa_rhob_laplace_rhoa=e_rhoa_rhob_laplace_rhoa, &
3543 e_rhoa_rhob_laplace_rhob=e_rhoa_rhob_laplace_rhob, &
3544 e_rhoa_rhob_tau_a=e_rhoa_rhob_tau_a, &
3545 e_rhoa_rhob_tau_b=e_rhoa_rhob_tau_b, &
3546 e_rhoa_gamma_aa_gamma_aa=e_rhoa_gamma_aa_gamma_aa, &
3547 e_rhoa_gamma_aa_gamma_ab=e_rhoa_gamma_aa_gamma_ab, &
3548 e_rhoa_gamma_aa_gamma_bb=e_rhoa_gamma_aa_gamma_bb, &
3549 e_rhoa_gamma_aa_laplace_rhoa=e_rhoa_gamma_aa_laplace_rhoa, &
3550 e_rhoa_gamma_aa_laplace_rhob=e_rhoa_gamma_aa_laplace_rhob, &
3551 e_rhoa_gamma_aa_tau_a=e_rhoa_gamma_aa_tau_a, &
3552 e_rhoa_gamma_aa_tau_b=e_rhoa_gamma_aa_tau_b, &
3553 e_rhoa_gamma_ab_gamma_ab=e_rhoa_gamma_ab_gamma_ab, &
3554 e_rhoa_gamma_ab_gamma_bb=e_rhoa_gamma_ab_gamma_bb, &
3555 e_rhoa_gamma_ab_laplace_rhoa=e_rhoa_gamma_ab_laplace_rhoa, &
3556 e_rhoa_gamma_ab_laplace_rhob=e_rhoa_gamma_ab_laplace_rhob, &
3557 e_rhoa_gamma_ab_tau_a=e_rhoa_gamma_ab_tau_a, &
3558 e_rhoa_gamma_ab_tau_b=e_rhoa_gamma_ab_tau_b, &
3559 e_rhoa_gamma_bb_gamma_bb=e_rhoa_gamma_bb_gamma_bb, &
3560 e_rhoa_gamma_bb_laplace_rhoa=e_rhoa_gamma_bb_laplace_rhoa, &
3561 e_rhoa_gamma_bb_laplace_rhob=e_rhoa_gamma_bb_laplace_rhob, &
3562 e_rhoa_gamma_bb_tau_a=e_rhoa_gamma_bb_tau_a, &
3563 e_rhoa_gamma_bb_tau_b=e_rhoa_gamma_bb_tau_b, &
3564 e_rhoa_laplace_rhoa_laplace_rhoa=e_rhoa_laplace_rhoa_laplace_rhoa, &
3565 e_rhoa_laplace_rhoa_laplace_rhob=e_rhoa_laplace_rhoa_laplace_rhob, &
3566 e_rhoa_laplace_rhoa_tau_a=e_rhoa_laplace_rhoa_tau_a, &
3567 e_rhoa_laplace_rhoa_tau_b=e_rhoa_laplace_rhoa_tau_b, &
3568 e_rhoa_laplace_rhob_laplace_rhob=e_rhoa_laplace_rhob_laplace_rhob, &
3569 e_rhoa_laplace_rhob_tau_a=e_rhoa_laplace_rhob_tau_a, &
3570 e_rhoa_laplace_rhob_tau_b=e_rhoa_laplace_rhob_tau_b, &
3571 e_rhoa_tau_a_tau_a=e_rhoa_tau_a_tau_a, &
3572 e_rhoa_tau_a_tau_b=e_rhoa_tau_a_tau_b, &
3573 e_rhoa_tau_b_tau_b=e_rhoa_tau_b_tau_b, &
3574 e_rhob_rhob_gamma_aa=e_rhob_rhob_gamma_aa, &
3575 e_rhob_rhob_gamma_ab=e_rhob_rhob_gamma_ab, &
3576 e_rhob_rhob_gamma_bb=e_rhob_rhob_gamma_bb, &
3577 e_rhob_rhob_laplace_rhoa=e_rhob_rhob_laplace_rhoa, &
3578 e_rhob_rhob_laplace_rhob=e_rhob_rhob_laplace_rhob, &
3579 e_rhob_rhob_tau_a=e_rhob_rhob_tau_a, &
3580 e_rhob_rhob_tau_b=e_rhob_rhob_tau_b, &
3581 e_rhob_gamma_aa_gamma_aa=e_rhob_gamma_aa_gamma_aa, &
3582 e_rhob_gamma_aa_gamma_ab=e_rhob_gamma_aa_gamma_ab, &
3583 e_rhob_gamma_aa_gamma_bb=e_rhob_gamma_aa_gamma_bb, &
3584 e_rhob_gamma_aa_laplace_rhoa=e_rhob_gamma_aa_laplace_rhoa, &
3585 e_rhob_gamma_aa_laplace_rhob=e_rhob_gamma_aa_laplace_rhob, &
3586 e_rhob_gamma_aa_tau_a=e_rhob_gamma_aa_tau_a, &
3587 e_rhob_gamma_aa_tau_b=e_rhob_gamma_aa_tau_b, &
3588 e_rhob_gamma_ab_gamma_ab=e_rhob_gamma_ab_gamma_ab, &
3589 e_rhob_gamma_ab_gamma_bb=e_rhob_gamma_ab_gamma_bb, &
3590 e_rhob_gamma_ab_laplace_rhoa=e_rhob_gamma_ab_laplace_rhoa, &
3591 e_rhob_gamma_ab_laplace_rhob=e_rhob_gamma_ab_laplace_rhob, &
3592 e_rhob_gamma_ab_tau_a=e_rhob_gamma_ab_tau_a, &
3593 e_rhob_gamma_ab_tau_b=e_rhob_gamma_ab_tau_b, &
3594 e_rhob_gamma_bb_gamma_bb=e_rhob_gamma_bb_gamma_bb, &
3595 e_rhob_gamma_bb_laplace_rhoa=e_rhob_gamma_bb_laplace_rhoa, &
3596 e_rhob_gamma_bb_laplace_rhob=e_rhob_gamma_bb_laplace_rhob, &
3597 e_rhob_gamma_bb_tau_a=e_rhob_gamma_bb_tau_a, &
3598 e_rhob_gamma_bb_tau_b=e_rhob_gamma_bb_tau_b, &
3599 e_rhob_laplace_rhoa_laplace_rhoa=e_rhob_laplace_rhoa_laplace_rhoa, &
3600 e_rhob_laplace_rhoa_laplace_rhob=e_rhob_laplace_rhoa_laplace_rhob, &
3601 e_rhob_laplace_rhoa_tau_a=e_rhob_laplace_rhoa_tau_a, &
3602 e_rhob_laplace_rhoa_tau_b=e_rhob_laplace_rhoa_tau_b, &
3603 e_rhob_laplace_rhob_laplace_rhob=e_rhob_laplace_rhob_laplace_rhob, &
3604 e_rhob_laplace_rhob_tau_a=e_rhob_laplace_rhob_tau_a, &
3605 e_rhob_laplace_rhob_tau_b=e_rhob_laplace_rhob_tau_b, &
3606 e_rhob_tau_a_tau_a=e_rhob_tau_a_tau_a, &
3607 e_rhob_tau_a_tau_b=e_rhob_tau_a_tau_b, &
3608 e_rhob_tau_b_tau_b=e_rhob_tau_b_tau_b, &
3609 e_gamma_aa_gamma_aa_gamma_aa=e_gamma_aa_gamma_aa_gamma_aa, &
3610 e_gamma_aa_gamma_aa_gamma_ab=e_gamma_aa_gamma_aa_gamma_ab, &
3611 e_gamma_aa_gamma_aa_gamma_bb=e_gamma_aa_gamma_aa_gamma_bb, &
3612 e_gamma_aa_gamma_aa_laplace_rhoa=e_gamma_aa_gamma_aa_laplace_rhoa, &
3613 e_gamma_aa_gamma_aa_laplace_rhob=e_gamma_aa_gamma_aa_laplace_rhob, &
3614 e_gamma_aa_gamma_aa_tau_a=e_gamma_aa_gamma_aa_tau_a, &
3615 e_gamma_aa_gamma_aa_tau_b=e_gamma_aa_gamma_aa_tau_b, &
3616 e_gamma_aa_gamma_ab_gamma_ab=e_gamma_aa_gamma_ab_gamma_ab, &
3617 e_gamma_aa_gamma_ab_gamma_bb=e_gamma_aa_gamma_ab_gamma_bb, &
3618 e_gamma_aa_gamma_ab_laplace_rhoa=e_gamma_aa_gamma_ab_laplace_rhoa, &
3619 e_gamma_aa_gamma_ab_laplace_rhob=e_gamma_aa_gamma_ab_laplace_rhob, &
3620 e_gamma_aa_gamma_ab_tau_a=e_gamma_aa_gamma_ab_tau_a, &
3621 e_gamma_aa_gamma_ab_tau_b=e_gamma_aa_gamma_ab_tau_b, &
3622 e_gamma_aa_gamma_bb_gamma_bb=e_gamma_aa_gamma_bb_gamma_bb, &
3623 e_gamma_aa_gamma_bb_laplace_rhoa=e_gamma_aa_gamma_bb_laplace_rhoa, &
3624 e_gamma_aa_gamma_bb_laplace_rhob=e_gamma_aa_gamma_bb_laplace_rhob, &
3625 e_gamma_aa_gamma_bb_tau_a=e_gamma_aa_gamma_bb_tau_a, &
3626 e_gamma_aa_gamma_bb_tau_b=e_gamma_aa_gamma_bb_tau_b, &
3627 e_gamma_aa_laplace_rhoa_laplace_rhoa=e_gamma_aa_laplace_rhoa_laplace_rhoa, &
3628 e_gamma_aa_laplace_rhoa_laplace_rhob=e_gamma_aa_laplace_rhoa_laplace_rhob, &
3629 e_gamma_aa_laplace_rhoa_tau_a=e_gamma_aa_laplace_rhoa_tau_a, &
3630 e_gamma_aa_laplace_rhoa_tau_b=e_gamma_aa_laplace_rhoa_tau_b, &
3631 e_gamma_aa_laplace_rhob_laplace_rhob=e_gamma_aa_laplace_rhob_laplace_rhob, &
3632 e_gamma_aa_laplace_rhob_tau_a=e_gamma_aa_laplace_rhob_tau_a, &
3633 e_gamma_aa_laplace_rhob_tau_b=e_gamma_aa_laplace_rhob_tau_b, &
3634 e_gamma_aa_tau_a_tau_a=e_gamma_aa_tau_a_tau_a, &
3635 e_gamma_aa_tau_a_tau_b=e_gamma_aa_tau_a_tau_b, &
3636 e_gamma_aa_tau_b_tau_b=e_gamma_aa_tau_b_tau_b, &
3637 e_gamma_ab_gamma_ab_gamma_ab=e_gamma_ab_gamma_ab_gamma_ab, &
3638 e_gamma_ab_gamma_ab_gamma_bb=e_gamma_ab_gamma_ab_gamma_bb, &
3639 e_gamma_ab_gamma_ab_laplace_rhoa=e_gamma_ab_gamma_ab_laplace_rhoa, &
3640 e_gamma_ab_gamma_ab_laplace_rhob=e_gamma_ab_gamma_ab_laplace_rhob, &
3641 e_gamma_ab_gamma_ab_tau_a=e_gamma_ab_gamma_ab_tau_a, &
3642 e_gamma_ab_gamma_ab_tau_b=e_gamma_ab_gamma_ab_tau_b, &
3643 e_gamma_ab_gamma_bb_gamma_bb=e_gamma_ab_gamma_bb_gamma_bb, &
3644 e_gamma_ab_gamma_bb_laplace_rhoa=e_gamma_ab_gamma_bb_laplace_rhoa, &
3645 e_gamma_ab_gamma_bb_laplace_rhob=e_gamma_ab_gamma_bb_laplace_rhob, &
3646 e_gamma_ab_gamma_bb_tau_a=e_gamma_ab_gamma_bb_tau_a, &
3647 e_gamma_ab_gamma_bb_tau_b=e_gamma_ab_gamma_bb_tau_b, &
3648 e_gamma_ab_laplace_rhoa_laplace_rhoa=e_gamma_ab_laplace_rhoa_laplace_rhoa, &
3649 e_gamma_ab_laplace_rhoa_laplace_rhob=e_gamma_ab_laplace_rhoa_laplace_rhob, &
3650 e_gamma_ab_laplace_rhoa_tau_a=e_gamma_ab_laplace_rhoa_tau_a, &
3651 e_gamma_ab_laplace_rhoa_tau_b=e_gamma_ab_laplace_rhoa_tau_b, &
3652 e_gamma_ab_laplace_rhob_laplace_rhob=e_gamma_ab_laplace_rhob_laplace_rhob, &
3653 e_gamma_ab_laplace_rhob_tau_a=e_gamma_ab_laplace_rhob_tau_a, &
3654 e_gamma_ab_laplace_rhob_tau_b=e_gamma_ab_laplace_rhob_tau_b, &
3655 e_gamma_ab_tau_a_tau_a=e_gamma_ab_tau_a_tau_a, &
3656 e_gamma_ab_tau_a_tau_b=e_gamma_ab_tau_a_tau_b, &
3657 e_gamma_ab_tau_b_tau_b=e_gamma_ab_tau_b_tau_b, &
3658 e_gamma_bb_gamma_bb_gamma_bb=e_gamma_bb_gamma_bb_gamma_bb, &
3659 e_gamma_bb_gamma_bb_laplace_rhoa=e_gamma_bb_gamma_bb_laplace_rhoa, &
3660 e_gamma_bb_gamma_bb_laplace_rhob=e_gamma_bb_gamma_bb_laplace_rhob, &
3661 e_gamma_bb_gamma_bb_tau_a=e_gamma_bb_gamma_bb_tau_a, &
3662 e_gamma_bb_gamma_bb_tau_b=e_gamma_bb_gamma_bb_tau_b, &
3663 e_gamma_bb_laplace_rhoa_laplace_rhoa=e_gamma_bb_laplace_rhoa_laplace_rhoa, &
3664 e_gamma_bb_laplace_rhoa_laplace_rhob=e_gamma_bb_laplace_rhoa_laplace_rhob, &
3665 e_gamma_bb_laplace_rhoa_tau_a=e_gamma_bb_laplace_rhoa_tau_a, &
3666 e_gamma_bb_laplace_rhoa_tau_b=e_gamma_bb_laplace_rhoa_tau_b, &
3667 e_gamma_bb_laplace_rhob_laplace_rhob=e_gamma_bb_laplace_rhob_laplace_rhob, &
3668 e_gamma_bb_laplace_rhob_tau_a=e_gamma_bb_laplace_rhob_tau_a, &
3669 e_gamma_bb_laplace_rhob_tau_b=e_gamma_bb_laplace_rhob_tau_b, &
3670 e_gamma_bb_tau_a_tau_a=e_gamma_bb_tau_a_tau_a, &
3671 e_gamma_bb_tau_a_tau_b=e_gamma_bb_tau_a_tau_b, &
3672 e_gamma_bb_tau_b_tau_b=e_gamma_bb_tau_b_tau_b, &
3673 e_laplace_rhoa_laplace_rhoa_laplace_rhoa=e_laplace_rhoa_laplace_rhoa_laplace_rhoa, &
3674 e_laplace_rhoa_laplace_rhoa_laplace_rhob=e_laplace_rhoa_laplace_rhoa_laplace_rhob, &
3675 e_laplace_rhoa_laplace_rhoa_tau_a=e_laplace_rhoa_laplace_rhoa_tau_a, &
3676 e_laplace_rhoa_laplace_rhoa_tau_b=e_laplace_rhoa_laplace_rhoa_tau_b, &
3677 e_laplace_rhoa_laplace_rhob_laplace_rhob=e_laplace_rhoa_laplace_rhob_laplace_rhob, &
3678 e_laplace_rhoa_laplace_rhob_tau_a=e_laplace_rhoa_laplace_rhob_tau_a, &
3679 e_laplace_rhoa_laplace_rhob_tau_b=e_laplace_rhoa_laplace_rhob_tau_b, &
3680 e_laplace_rhoa_tau_a_tau_a=e_laplace_rhoa_tau_a_tau_a, &
3681 e_laplace_rhoa_tau_a_tau_b=e_laplace_rhoa_tau_a_tau_b, &
3682 e_laplace_rhoa_tau_b_tau_b=e_laplace_rhoa_tau_b_tau_b, &
3683 e_laplace_rhob_laplace_rhob_laplace_rhob=e_laplace_rhob_laplace_rhob_laplace_rhob, &
3684 e_laplace_rhob_laplace_rhob_tau_a=e_laplace_rhob_laplace_rhob_tau_a, &
3685 e_laplace_rhob_laplace_rhob_tau_b=e_laplace_rhob_laplace_rhob_tau_b, &
3686 e_laplace_rhob_tau_a_tau_a=e_laplace_rhob_tau_a_tau_a, &
3687 e_laplace_rhob_tau_a_tau_b=e_laplace_rhob_tau_a_tau_b, &
3688 e_laplace_rhob_tau_b_tau_b=e_laplace_rhob_tau_b_tau_b, &
3689 e_tau_a_tau_a_tau_a=e_tau_a_tau_a_tau_a, &
3690 e_tau_a_tau_a_tau_b=e_tau_a_tau_a_tau_b, &
3691 e_tau_a_tau_b_tau_b=e_tau_a_tau_b_tau_b, &
3692 e_tau_b_tau_b_tau_b=e_tau_b_tau_b_tau_b, &
3693 grad_deriv=grad_deriv, npoints=npoints, &
3694 func_name=func_name, sc=func_scale, workers=workers)
3695
3696!$OMP END PARALLEL
3697
3698 NULLIFY (dummy)
3699 NULLIFY (workers)
3700
3701 CALL timestop(handle)
3702#else
3703 mark_used(rho_set)
3704 mark_used(deriv_set)
3705 mark_used(grad_deriv)
3706 mark_used(libxc_params)
3707 mark_used(func_name_override)
3708
3709 CALL cp_abort(__location__, "Unknown functional! If you are asking "// &
3710 "for a functional of the LibXC library, "// &
3711 "you have to download and install the library!")
3712#endif
3713 END SUBROUTINE libxc_spin_polarized_eval
3714
3715! **************************************************************************************************
3716!> \brief libxc exchange-correlation functionals
3717!> \param rho density
3718!> \param norm_drho norm of the gradient of the density
3719!> \param laplace_rho laplacian of the density
3720!> \param tau kinetic-energy density
3721!> \param e_0 energy density
3722!> \param e_rho derivative of the energy density with respect to rho
3723!> \param e_ndrho derivative of the energy density with respect to ndrho
3724!> \param e_laplace_rho derivative of the energy density with respect to laplace_rho
3725!> \param e_tau derivative of the energy density with respect to tau
3726!> \param e_rho_rho derivative of the energy density with respect to rho_rho
3727!> \param e_ndrho_rho derivative of the energy density with respect to ndrho_rho
3728!> \param e_ndrho_ndrho derivative of the energy density with respect to ndrho_ndrho
3729!> \param e_rho_laplace_rho derivative of the energy density with respect to rho_laplace_rho
3730!> \param e_rho_tau derivative of the energy density with respect to rho_tau
3731!> \param e_ndrho_laplace_rho derivative of the energy density with respect to ndrho_laplace_rho
3732!> \param e_ndrho_tau derivative of the energy density with respect to ndrho_tau
3733!> \param e_laplace_rho_laplace_rho derivative of the energy density with respect to laplace_rho_laplace_rho
3734!> \param e_laplace_rho_tau derivative of the energy density with respect to laplace_rho_tau
3735!> \param e_tau_tau derivative of the energy density with respect to tau_tau
3736!> \param e_rho_rho_rho derivative of the energy density with respect to rho_rho_rho
3737!> \param grad_deriv degree of the derivative that should be evaluated;
3738!> all derivatives up to the given degree are evaluated, in a single
3739!> LibXC call per block of grid points
3740!> \param npoints number of points on the grid
3741!> \param func_name name of the functional
3742!> \param sc scaling factor of the functional
3743!> \param workers cached LibXC functional objects and staging buffers, one per thread
3744!> \author F. Tran
3745! **************************************************************************************************
3746#if defined (__LIBXC)
3747 SUBROUTINE libxc_spin_unpolarized_calc(rho, norm_drho, laplace_rho, tau, &
3748 e_0, e_rho, e_ndrho, e_laplace_rho, e_tau, e_rho_rho, e_ndrho_rho, &
3749 e_ndrho_ndrho, e_rho_laplace_rho, e_rho_tau, e_ndrho_laplace_rho, &
3750 e_ndrho_tau, e_laplace_rho_laplace_rho, e_laplace_rho_tau, &
3751 e_tau_tau, e_rho_rho_rho, &
3752 e_gamma, &
3753 e_rho_gamma, &
3754 e_gamma_gamma, &
3755 e_gamma_laplace_rho, &
3756 e_gamma_tau, &
3757 e_rho_rho_gamma, &
3758 e_rho_rho_laplace_rho, &
3759 e_rho_rho_tau, &
3760 e_rho_gamma_gamma, &
3761 e_rho_gamma_laplace_rho, &
3762 e_rho_gamma_tau, &
3763 e_rho_laplace_rho_laplace_rho, &
3764 e_rho_laplace_rho_tau, &
3765 e_rho_tau_tau, &
3766 e_gamma_gamma_gamma, &
3767 e_gamma_gamma_laplace_rho, &
3768 e_gamma_gamma_tau, &
3769 e_gamma_laplace_rho_laplace_rho, &
3770 e_gamma_laplace_rho_tau, &
3771 e_gamma_tau_tau, &
3772 e_laplace_rho_laplace_rho_laplace_rho, &
3773 e_laplace_rho_laplace_rho_tau, &
3774 e_laplace_rho_tau_tau, &
3775 e_tau_tau_tau, &
3776 grad_deriv, npoints, func_name, sc, workers)
3777
3778 REAL(kind=dp), DIMENSION(*), INTENT(IN) :: rho, norm_drho, laplace_rho, tau
3779 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_0, e_rho, e_ndrho, e_laplace_rho, e_tau, &
3780 e_rho_rho, e_ndrho_rho, e_ndrho_ndrho, e_rho_laplace_rho, e_rho_tau, e_ndrho_laplace_rho, &
3781 e_ndrho_tau, e_laplace_rho_laplace_rho, e_laplace_rho_tau, e_tau_tau, e_rho_rho_rho
3782 ! Derivatives with respect to the reduced gradient gamma = |grad rho|^2.
3783 ! These are LibXC's own sigma derivatives, copied through unchanged: unlike
3784 ! the norm_drho ones they need no chain rule and carry no 1/|grad rho|.
3785 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma
3786 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_gamma
3787 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_gamma
3788 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_laplace_rho
3789 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_tau
3790 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_rho_gamma
3791 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_rho_laplace_rho
3792 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_rho_tau
3793 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_gamma_gamma
3794 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_gamma_laplace_rho
3795 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_gamma_tau
3796 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_laplace_rho_laplace_rho
3797 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_laplace_rho_tau
3798 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_tau_tau
3799 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_gamma_gamma
3800 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_gamma_laplace_rho
3801 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_gamma_tau
3802 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_laplace_rho_laplace_rho
3803 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_laplace_rho_tau
3804 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_tau_tau
3805 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rho_laplace_rho_laplace_rho
3806 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rho_laplace_rho_tau
3807 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rho_tau_tau
3808 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_tau_tau_tau
3809 INTEGER, INTENT(in) :: grad_deriv, npoints
3810 CHARACTER(LEN=default_string_length), INTENT(IN) :: func_name
3811 REAL(kind=dp), INTENT(in) :: sc
3812 TYPE(libxc_worker_set_type), INTENT(INOUT) :: workers
3813
3814 INTEGER :: bsize, family, i, i0, ib, ii, ithread, &
3815 nb, nblocks, nthreads
3816 LOGICAL :: is_gga, is_mgga
3817
3818 ithread = 0
3819 nthreads = 1
3820!$ ithread = omp_get_thread_num()
3821!$ nthreads = omp_get_num_threads()
3822 cpassert(ithread < SIZE(workers%worker))
3823
3824 ! On the GPU path the whole grid is handed to LibXC in a single call (no
3825 ! block cap), so the per-thread staging and device buffers are grown to
3826 ! npoints on demand; one large kernel and one synchronize beat hundreds of
3827 ! cache-sized launches. The CPU/OpenMP blocking is left untouched: cap the
3828 ! block at what the staging buffers were allocated for, but shrink it when
3829 ! there are too few points to give every thread a block of its own, so small
3830 ! atomic grids are not all evaluated by thread 0.
3831 IF (libxc_is_gpu()) THEN
3832 bsize = npoints
3833 ELSE
3834 bsize = max(1, min(workers%worker(1)%nb, (npoints + nthreads - 1)/nthreads))
3835 END IF
3836 nblocks = (npoints + bsize - 1)/bsize
3837
3838 family = workers%family
3839 CALL libxc_family_flags(family, is_gga, is_mgga, trim(func_name))
3840
3841 ! Below the cutoff LibXC leaves outputs at zero, so no test is needed here.
3842 associate(w => workers%worker(ithread + 1), has_laplace => workers%has_laplace, &
3843 no_exc => workers%no_exc, eps_rho => workers%epsilon_rho, &
3844 eps_tau => workers%epsilon_tau)
3845 !$OMP DO
3846 DO ib = 1, nblocks
3847 IF (libxc_is_gpu()) CALL libxc_worker_resize_cuda(w, workers%family, workers%nspin, npoints)
3848 i0 = (ib - 1)*bsize
3849 nb = min(bsize, npoints - i0)
3850
3851 ! stage this block's inputs in LibXC's layout
3852 DO i = 1, nb
3853 w%rho(1, i) = rho(i0 + i)
3854 END DO
3855 IF (is_gga) THEN
3856 DO i = 1, nb
3857 w%sigma(1, i) = norm_drho(i0 + i)**2
3858 END DO
3859 END IF
3860 IF (is_mgga) THEN
3861 DO i = 1, nb
3862 ii = i0 + i
3863 w%lapl(1, i) = laplace_rho(ii)
3864 w%tau(1, i) = tau(ii)
3865 END DO
3866 ! LibXC only screens on the density, so screen on tau here by
3867 ! zeroing rho; enforce the Fermi hole curvature bound tau >=
3868 ! sigma/(8*rho) with the denominator floored at the cutoff.
3869 DO i = 1, nb
3870 IF (w%tau(1, i) <= eps_tau) w%rho(1, i) = 0.0_dp
3871 w%tau(1, i) = max(w%tau(1, i), &
3872 w%sigma(1, i)/(8.0_dp*max(w%rho(1, i), eps_rho)))
3873 END DO
3874 END IF
3875
3876 ! one LibXC call for the whole block, on the host or the device
3877 CALL libxc_worker_eval(w, workers%family, workers%nspin, grad_deriv, no_exc, nb)
3878
3879 ! accumulate; each derivative is added by exactly one loop
3880 IF (grad_deriv >= 0) THEN
3881 DO i = 1, nb
3882 ii = i0 + i
3883 e_0(ii) = e_0(ii) + sc*w%exc(i)*rho(ii)
3884 END DO
3885 END IF
3886 IF (grad_deriv >= 1) THEN
3887 DO i = 1, nb
3888 ii = i0 + i
3889 e_rho(ii) = e_rho(ii) + sc*w%vrho(1, i)
3890 END DO
3891 IF (is_gga) THEN
3892 DO i = 1, nb
3893 ii = i0 + i
3894 e_ndrho(ii) = e_ndrho(ii) + sc*2.0_dp*w%vsigma(1, i)*norm_drho(ii)
3895 END DO
3896 DO i = 1, nb
3897 ii = i0 + i
3898 e_gamma(ii) = e_gamma(ii) + sc*w%vsigma(1, i)
3899 END DO
3900 END IF
3901 IF (is_mgga) THEN
3902 DO i = 1, nb
3903 ii = i0 + i
3904 e_tau(ii) = e_tau(ii) + sc*w%vtau(1, i)
3905 END DO
3906 END IF
3907 IF (is_mgga .AND. has_laplace) THEN
3908 DO i = 1, nb
3909 ii = i0 + i
3910 e_laplace_rho(ii) = e_laplace_rho(ii) + sc*w%vlapl(1, i)
3911 END DO
3912 END IF
3913 END IF
3914 IF (grad_deriv >= 2) THEN
3915 DO i = 1, nb
3916 ii = i0 + i
3917 e_rho_rho(ii) = e_rho_rho(ii) + sc*w%v2rho2(1, i)
3918 END DO
3919 IF (is_gga) THEN
3920 DO i = 1, nb
3921 ii = i0 + i
3922 e_ndrho_rho(ii) = e_ndrho_rho(ii) + sc*2.0_dp*w%v2rhosigma(1, i)*norm_drho(ii)
3923 e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) + &
3924 sc*2.0_dp*(2.0_dp*w%sigma(1, i)*w%v2sigma2(1, i) + w%vsigma(1, i))
3925 END DO
3926 DO i = 1, nb
3927 ii = i0 + i
3928 e_rho_gamma(ii) = e_rho_gamma(ii) + sc*w%v2rhosigma (1, i)
3929 e_gamma_gamma(ii) = e_gamma_gamma(ii) + sc*w%v2sigma2 (1, i)
3930 END DO
3931 END IF
3932 IF (is_mgga) THEN
3933 DO i = 1, nb
3934 ii = i0 + i
3935 e_gamma_laplace_rho(ii) = e_gamma_laplace_rho(ii) + sc*w%v2sigmalapl (1, i)
3936 e_gamma_tau(ii) = e_gamma_tau(ii) + sc*w%v2sigmatau (1, i)
3937 e_rho_tau(ii) = e_rho_tau(ii) + sc*w%v2rhotau(1, i)
3938 e_ndrho_tau(ii) = e_ndrho_tau(ii) + sc*2.0_dp*w%v2sigmatau(1, i)*norm_drho(ii)
3939 e_tau_tau(ii) = e_tau_tau(ii) + sc*w%v2tau2(1, i)
3940 END DO
3941 END IF
3942 IF (is_mgga .AND. has_laplace) THEN
3943 DO i = 1, nb
3944 ii = i0 + i
3945 e_rho_laplace_rho(ii) = e_rho_laplace_rho(ii) + sc*w%v2rholapl(1, i)
3946 e_ndrho_laplace_rho(ii) = e_ndrho_laplace_rho(ii) + &
3947 sc*2.0_dp*w%v2sigmalapl(1, i)*norm_drho(ii)
3948 e_laplace_rho_laplace_rho(ii) = e_laplace_rho_laplace_rho(ii) + sc*w%v2lapl2(1, i)
3949 e_laplace_rho_tau(ii) = e_laplace_rho_tau(ii) + sc*w%v2lapltau(1, i)
3950 END DO
3951 END IF
3952 END IF
3953 IF (grad_deriv >= 3) THEN
3954 DO i = 1, nb
3955 ii = i0 + i
3956 e_rho_rho_rho(ii) = e_rho_rho_rho(ii) + sc*w%v3rho3(1, i)
3957 END DO
3958 IF (is_mgga) THEN
3959 DO i = 1, nb
3960 ii = i0 + i
3961 e_rho_rho_gamma(ii) = e_rho_rho_gamma(ii) + sc*w%v3rho2sigma (1, i)
3962 e_rho_rho_laplace_rho(ii) = e_rho_rho_laplace_rho(ii) + sc*w%v3rho2lapl (1, i)
3963 e_rho_rho_tau(ii) = e_rho_rho_tau(ii) + sc*w%v3rho2tau (1, i)
3964 e_rho_gamma_gamma(ii) = e_rho_gamma_gamma(ii) + sc*w%v3rhosigma2 (1, i)
3965 e_rho_gamma_laplace_rho(ii) = e_rho_gamma_laplace_rho(ii) + sc*w%v3rhosigmalapl (1, i)
3966 e_rho_gamma_tau(ii) = e_rho_gamma_tau(ii) + sc*w%v3rhosigmatau (1, i)
3967 e_rho_laplace_rho_laplace_rho(ii) = e_rho_laplace_rho_laplace_rho(ii) + sc*w%v3rholapl2 (1, i)
3968 e_rho_laplace_rho_tau(ii) = e_rho_laplace_rho_tau(ii) + sc*w%v3rholapltau (1, i)
3969 e_rho_tau_tau(ii) = e_rho_tau_tau(ii) + sc*w%v3rhotau2 (1, i)
3970 e_gamma_gamma_gamma(ii) = e_gamma_gamma_gamma(ii) + sc*w%v3sigma3 (1, i)
3971 e_gamma_gamma_laplace_rho(ii) = e_gamma_gamma_laplace_rho(ii) + sc*w%v3sigma2lapl (1, i)
3972 e_gamma_gamma_tau(ii) = e_gamma_gamma_tau(ii) + sc*w%v3sigma2tau (1, i)
3973 e_gamma_laplace_rho_laplace_rho(ii) = e_gamma_laplace_rho_laplace_rho(ii) + sc*w%v3sigmalapl2 (1, i)
3974 e_gamma_laplace_rho_tau(ii) = e_gamma_laplace_rho_tau(ii) + sc*w%v3sigmalapltau (1, i)
3975 e_gamma_tau_tau(ii) = e_gamma_tau_tau(ii) + sc*w%v3sigmatau2 (1, i)
3976 e_laplace_rho_laplace_rho_laplace_rho(ii) = e_laplace_rho_laplace_rho_laplace_rho(ii) + sc*w%v3lapl3 (1, i)
3977 e_laplace_rho_laplace_rho_tau(ii) = e_laplace_rho_laplace_rho_tau(ii) + sc*w%v3lapl2tau (1, i)
3978 e_laplace_rho_tau_tau(ii) = e_laplace_rho_tau_tau(ii) + sc*w%v3lapltau2 (1, i)
3979 e_tau_tau_tau(ii) = e_tau_tau_tau(ii) + sc*w%v3tau3 (1, i)
3980 END DO
3981 ELSE IF (is_gga) THEN
3982 DO i = 1, nb
3983 ii = i0 + i
3984 e_rho_rho_gamma(ii) = e_rho_rho_gamma(ii) + sc*w%v3rho2sigma (1, i)
3985 e_rho_gamma_gamma(ii) = e_rho_gamma_gamma(ii) + sc*w%v3rhosigma2 (1, i)
3986 e_gamma_gamma_gamma(ii) = e_gamma_gamma_gamma(ii) + sc*w%v3sigma3 (1, i)
3987 END DO
3988 END IF
3989 END IF
3990 END DO
3991!$OMP END DO
3992 END associate
3993
3994END SUBROUTINE libxc_spin_unpolarized_calc
3995#endif
3996
3997! **************************************************************************************************
3998!> \brief libxc exchange-correlation functionals
3999!> \param rhoa alpha density
4000!> \param rhob beta density
4001!> \param norm_drho ...
4002!> \param norm_drhoa norm of the gradient of the alpha density
4003!> \param norm_drhob norm of the gradient of the beta density
4004!> \param laplace_rhoa laplacian of the alpha density
4005!> \param laplace_rhob laplacian of the beta density
4006!> \param tau_a alpha kinetic-energy density
4007!> \param tau_b beta kinetic-energy density
4008!> \param e_0 energy density
4009!> \param e_rhoa derivative of the energy density with respect to rhoa
4010!> \param e_rhob derivative of the energy density with respect to rhob
4011!> \param e_ndrho derivative of the energy density with respect to ndrho
4012!> \param e_ndrhoa derivative of the energy density with respect to ndrhoa
4013!> \param e_ndrhob derivative of the energy density with respect to ndrhob
4014!> \param e_laplace_rhoa derivative of the energy density with respect to laplace_rhoa
4015!> \param e_laplace_rhob derivative of the energy density with respect to laplace_rhob
4016!> \param e_tau_a derivative of the energy density with respect to tau_a
4017!> \param e_tau_b derivative of the energy density with respect to tau_b
4018!> \param e_rhoa_rhoa derivative of the energy density with respect to rhoa_rhoa
4019!> \param e_rhoa_rhob derivative of the energy density with respect to rhoa_rhob
4020!> \param e_rhob_rhob derivative of the energy density with respect to rhob_rhob
4021!> \param e_ndrho_rhoa derivative of the energy density with respect to ndrho_rhoa
4022!> \param e_ndrho_rhob derivative of the energy density with respect to ndrho_rhob
4023!> \param e_ndrhoa_rhoa derivative of the energy density with respect to ndrhoa_rhoa
4024!> \param e_ndrhoa_rhob derivative of the energy density with respect to ndrhoa_rhob
4025!> \param e_ndrhob_rhoa derivative of the energy density with respect to ndrhob_rhoa
4026!> \param e_ndrhob_rhob derivative of the energy density with respect to ndrhob_rhob
4027!> \param e_ndrho_ndrho derivative of the energy density with respect to ndrho_ndrho
4028!> \param e_ndrho_ndrhoa derivative of the energy density with respect to ndrho_ndrhoa
4029!> \param e_ndrho_ndrhob derivative of the energy density with respect to ndrho_ndrhob
4030!> \param e_ndrhoa_ndrhoa derivative of the energy density with respect to ndrhoa_ndrhoa
4031!> \param e_ndrhoa_ndrhob derivative of the energy density with respect to ndrhoa_ndrhob
4032!> \param e_ndrhob_ndrhob derivative of the energy density with respect to ndrhob_ndrhob
4033!> \param e_rhoa_laplace_rhoa derivative of the energy density with respect to rhoa_laplace_rhoa
4034!> \param e_rhoa_laplace_rhob derivative of the energy density with respect to rhoa_laplace_rhob
4035!> \param e_rhob_laplace_rhoa derivative of the energy density with respect to rhob_laplace_rhoa
4036!> \param e_rhob_laplace_rhob derivative of the energy density with respect to rhob_laplace_rhob
4037!> \param e_rhoa_tau_a derivative of the energy density with respect to rhoa_tau_a
4038!> \param e_rhoa_tau_b derivative of the energy density with respect to rhoa_tau_b
4039!> \param e_rhob_tau_a derivative of the energy density with respect to rhob_tau_a
4040!> \param e_rhob_tau_b derivative of the energy density with respect to rhob_tau_b
4041!> \param e_ndrho_laplace_rhoa derivative of the energy density with respect to ndrho_laplace_rhoa
4042!> \param e_ndrho_laplace_rhob derivative of the energy density with respect to ndrho_laplace_rhob
4043!> \param e_ndrhoa_laplace_rhoa derivative of the energy density with respect to ndrhoa_laplace_rhoa
4044!> \param e_ndrhoa_laplace_rhob derivative of the energy density with respect to ndrhoa_laplace_rhob
4045!> \param e_ndrhob_laplace_rhoa derivative of the energy density with respect to ndrhob_laplace_rhoa
4046!> \param e_ndrhob_laplace_rhob derivative of the energy density with respect to ndrhob_laplace_rhob
4047!> \param e_ndrho_tau_a derivative of the energy density with respect to ndrho_tau_a
4048!> \param e_ndrho_tau_b derivative of the energy density with respect to ndrho_tau_b
4049!> \param e_ndrhoa_tau_a derivative of the energy density with respect to ndrhoa_tau_a
4050!> \param e_ndrhoa_tau_b derivative of the energy density with respect to ndrhoa_tau_b
4051!> \param e_ndrhob_tau_a derivative of the energy density with respect to ndrhob_tau_a
4052!> \param e_ndrhob_tau_b derivative of the energy density with respect to ndrhob_tau_b
4053!> \param e_laplace_rhoa_laplace_rhoa derivative of the energy density with respect to laplace_rhoa_laplace_rhoa
4054!> \param e_laplace_rhoa_laplace_rhob derivative of the energy density with respect to laplace_rhoa_laplace_rhob
4055!> \param e_laplace_rhob_laplace_rhob derivative of the energy density with respect to laplace_rhob_laplace_rhob
4056!> \param e_laplace_rhoa_tau_a derivative of the energy density with respect to laplace_rhoa_tau_a
4057!> \param e_laplace_rhoa_tau_b derivative of the energy density with respect to laplace_rhoa_tau_b
4058!> \param e_laplace_rhob_tau_a derivative of the energy density with respect to laplace_rhob_tau_a
4059!> \param e_laplace_rhob_tau_b derivative of the energy density with respect to laplace_rhob_tau_b
4060!> \param e_tau_a_tau_a derivative of the energy density with respect to tau_a_tau_a
4061!> \param e_tau_a_tau_b derivative of the energy density with respect to tau_a_tau_b
4062!> \param e_tau_b_tau_b derivative of the energy density with respect to tau_b_tau_b
4063!> \param e_rhoa_rhoa_rhoa derivative of the energy density with respect to rhoa_rhoa_rhoa
4064!> \param e_rhoa_rhoa_rhob derivative of the energy density with respect to rhoa_rhoa_rhob
4065!> \param e_rhoa_rhob_rhob derivative of the energy density with respect to rhoa_rhob_rhob
4066!> \param e_rhob_rhob_rhob derivative of the energy density with respect to rhob_rhob_rhob
4067!> \param grad_deriv degree of the derivative that should be evaluated;
4068!> all derivatives up to the given degree are evaluated, in a single
4069!> LibXC call per block of grid points
4070!> \param npoints number of points on the grid
4071!> \param func_name name of the functional
4072!> \param sc scaling factor of the functional
4073!> \param workers cached LibXC functional objects and staging buffers, one per thread
4074!> \author F. Tran
4075! **************************************************************************************************
4076#if defined (__LIBXC)
4077SUBROUTINE libxc_spin_polarized_calc(rhoa, rhob, norm_drho, norm_drhoa, &
4078 norm_drhob, laplace_rhoa, laplace_rhob, tau_a, tau_b, &
4079 e_0, e_rhoa, e_rhob, e_ndrho, e_ndrhoa, e_ndrhob, &
4080 e_laplace_rhoa, e_laplace_rhob, e_tau_a, e_tau_b, &
4081 e_rhoa_rhoa, e_rhoa_rhob, e_rhob_rhob, &
4082 e_ndrho_rhoa, e_ndrho_rhob, e_ndrhoa_rhoa, &
4083 e_ndrhoa_rhob, e_ndrhob_rhoa, e_ndrhob_rhob, &
4084 e_ndrho_ndrho, e_ndrho_ndrhoa, e_ndrho_ndrhob, &
4085 e_ndrhoa_ndrhoa, e_ndrhoa_ndrhob, e_ndrhob_ndrhob, &
4086 e_rhoa_laplace_rhoa, e_rhoa_laplace_rhob, &
4087 e_rhob_laplace_rhoa, e_rhob_laplace_rhob, &
4088 e_rhoa_tau_a, e_rhoa_tau_b, e_rhob_tau_a, e_rhob_tau_b, &
4089 e_ndrho_laplace_rhoa, e_ndrho_laplace_rhob, &
4090 e_ndrhoa_laplace_rhoa, e_ndrhoa_laplace_rhob, &
4091 e_ndrhob_laplace_rhoa, e_ndrhob_laplace_rhob, &
4092 e_ndrho_tau_a, e_ndrho_tau_b, &
4093 e_ndrhoa_tau_a, e_ndrhoa_tau_b, &
4094 e_ndrhob_tau_a, e_ndrhob_tau_b, &
4095 e_laplace_rhoa_laplace_rhoa, &
4096 e_laplace_rhoa_laplace_rhob, &
4097 e_laplace_rhob_laplace_rhob, &
4098 e_laplace_rhoa_tau_a, e_laplace_rhoa_tau_b, &
4099 e_laplace_rhob_tau_a, e_laplace_rhob_tau_b, &
4100 e_tau_a_tau_a, e_tau_a_tau_b, e_tau_b_tau_b, &
4101 e_rhoa_rhoa_rhoa, e_rhoa_rhoa_rhob, &
4102 e_rhoa_rhob_rhob, e_rhob_rhob_rhob, &
4103 e_gamma_aa, &
4104 e_gamma_ab, &
4105 e_gamma_bb, &
4106 e_rhoa_gamma_aa, &
4107 e_rhoa_gamma_ab, &
4108 e_rhoa_gamma_bb, &
4109 e_rhob_gamma_aa, &
4110 e_rhob_gamma_ab, &
4111 e_rhob_gamma_bb, &
4112 e_gamma_aa_gamma_aa, &
4113 e_gamma_aa_gamma_ab, &
4114 e_gamma_aa_gamma_bb, &
4115 e_gamma_aa_laplace_rhoa, &
4116 e_gamma_aa_laplace_rhob, &
4117 e_gamma_aa_tau_a, &
4118 e_gamma_aa_tau_b, &
4119 e_gamma_ab_gamma_ab, &
4120 e_gamma_ab_gamma_bb, &
4121 e_gamma_ab_laplace_rhoa, &
4122 e_gamma_ab_laplace_rhob, &
4123 e_gamma_ab_tau_a, &
4124 e_gamma_ab_tau_b, &
4125 e_gamma_bb_gamma_bb, &
4126 e_gamma_bb_laplace_rhoa, &
4127 e_gamma_bb_laplace_rhob, &
4128 e_gamma_bb_tau_a, &
4129 e_gamma_bb_tau_b, &
4130 e_rhoa_rhoa_gamma_aa, &
4131 e_rhoa_rhoa_gamma_ab, &
4132 e_rhoa_rhoa_gamma_bb, &
4133 e_rhoa_rhoa_laplace_rhoa, &
4134 e_rhoa_rhoa_laplace_rhob, &
4135 e_rhoa_rhoa_tau_a, &
4136 e_rhoa_rhoa_tau_b, &
4137 e_rhoa_rhob_gamma_aa, &
4138 e_rhoa_rhob_gamma_ab, &
4139 e_rhoa_rhob_gamma_bb, &
4140 e_rhoa_rhob_laplace_rhoa, &
4141 e_rhoa_rhob_laplace_rhob, &
4142 e_rhoa_rhob_tau_a, &
4143 e_rhoa_rhob_tau_b, &
4144 e_rhoa_gamma_aa_gamma_aa, &
4145 e_rhoa_gamma_aa_gamma_ab, &
4146 e_rhoa_gamma_aa_gamma_bb, &
4147 e_rhoa_gamma_aa_laplace_rhoa, &
4148 e_rhoa_gamma_aa_laplace_rhob, &
4149 e_rhoa_gamma_aa_tau_a, &
4150 e_rhoa_gamma_aa_tau_b, &
4151 e_rhoa_gamma_ab_gamma_ab, &
4152 e_rhoa_gamma_ab_gamma_bb, &
4153 e_rhoa_gamma_ab_laplace_rhoa, &
4154 e_rhoa_gamma_ab_laplace_rhob, &
4155 e_rhoa_gamma_ab_tau_a, &
4156 e_rhoa_gamma_ab_tau_b, &
4157 e_rhoa_gamma_bb_gamma_bb, &
4158 e_rhoa_gamma_bb_laplace_rhoa, &
4159 e_rhoa_gamma_bb_laplace_rhob, &
4160 e_rhoa_gamma_bb_tau_a, &
4161 e_rhoa_gamma_bb_tau_b, &
4162 e_rhoa_laplace_rhoa_laplace_rhoa, &
4163 e_rhoa_laplace_rhoa_laplace_rhob, &
4164 e_rhoa_laplace_rhoa_tau_a, &
4165 e_rhoa_laplace_rhoa_tau_b, &
4166 e_rhoa_laplace_rhob_laplace_rhob, &
4167 e_rhoa_laplace_rhob_tau_a, &
4168 e_rhoa_laplace_rhob_tau_b, &
4169 e_rhoa_tau_a_tau_a, &
4170 e_rhoa_tau_a_tau_b, &
4171 e_rhoa_tau_b_tau_b, &
4172 e_rhob_rhob_gamma_aa, &
4173 e_rhob_rhob_gamma_ab, &
4174 e_rhob_rhob_gamma_bb, &
4175 e_rhob_rhob_laplace_rhoa, &
4176 e_rhob_rhob_laplace_rhob, &
4177 e_rhob_rhob_tau_a, &
4178 e_rhob_rhob_tau_b, &
4179 e_rhob_gamma_aa_gamma_aa, &
4180 e_rhob_gamma_aa_gamma_ab, &
4181 e_rhob_gamma_aa_gamma_bb, &
4182 e_rhob_gamma_aa_laplace_rhoa, &
4183 e_rhob_gamma_aa_laplace_rhob, &
4184 e_rhob_gamma_aa_tau_a, &
4185 e_rhob_gamma_aa_tau_b, &
4186 e_rhob_gamma_ab_gamma_ab, &
4187 e_rhob_gamma_ab_gamma_bb, &
4188 e_rhob_gamma_ab_laplace_rhoa, &
4189 e_rhob_gamma_ab_laplace_rhob, &
4190 e_rhob_gamma_ab_tau_a, &
4191 e_rhob_gamma_ab_tau_b, &
4192 e_rhob_gamma_bb_gamma_bb, &
4193 e_rhob_gamma_bb_laplace_rhoa, &
4194 e_rhob_gamma_bb_laplace_rhob, &
4195 e_rhob_gamma_bb_tau_a, &
4196 e_rhob_gamma_bb_tau_b, &
4197 e_rhob_laplace_rhoa_laplace_rhoa, &
4198 e_rhob_laplace_rhoa_laplace_rhob, &
4199 e_rhob_laplace_rhoa_tau_a, &
4200 e_rhob_laplace_rhoa_tau_b, &
4201 e_rhob_laplace_rhob_laplace_rhob, &
4202 e_rhob_laplace_rhob_tau_a, &
4203 e_rhob_laplace_rhob_tau_b, &
4204 e_rhob_tau_a_tau_a, &
4205 e_rhob_tau_a_tau_b, &
4206 e_rhob_tau_b_tau_b, &
4207 e_gamma_aa_gamma_aa_gamma_aa, &
4208 e_gamma_aa_gamma_aa_gamma_ab, &
4209 e_gamma_aa_gamma_aa_gamma_bb, &
4210 e_gamma_aa_gamma_aa_laplace_rhoa, &
4211 e_gamma_aa_gamma_aa_laplace_rhob, &
4212 e_gamma_aa_gamma_aa_tau_a, &
4213 e_gamma_aa_gamma_aa_tau_b, &
4214 e_gamma_aa_gamma_ab_gamma_ab, &
4215 e_gamma_aa_gamma_ab_gamma_bb, &
4216 e_gamma_aa_gamma_ab_laplace_rhoa, &
4217 e_gamma_aa_gamma_ab_laplace_rhob, &
4218 e_gamma_aa_gamma_ab_tau_a, &
4219 e_gamma_aa_gamma_ab_tau_b, &
4220 e_gamma_aa_gamma_bb_gamma_bb, &
4221 e_gamma_aa_gamma_bb_laplace_rhoa, &
4222 e_gamma_aa_gamma_bb_laplace_rhob, &
4223 e_gamma_aa_gamma_bb_tau_a, &
4224 e_gamma_aa_gamma_bb_tau_b, &
4225 e_gamma_aa_laplace_rhoa_laplace_rhoa, &
4226 e_gamma_aa_laplace_rhoa_laplace_rhob, &
4227 e_gamma_aa_laplace_rhoa_tau_a, &
4228 e_gamma_aa_laplace_rhoa_tau_b, &
4229 e_gamma_aa_laplace_rhob_laplace_rhob, &
4230 e_gamma_aa_laplace_rhob_tau_a, &
4231 e_gamma_aa_laplace_rhob_tau_b, &
4232 e_gamma_aa_tau_a_tau_a, &
4233 e_gamma_aa_tau_a_tau_b, &
4234 e_gamma_aa_tau_b_tau_b, &
4235 e_gamma_ab_gamma_ab_gamma_ab, &
4236 e_gamma_ab_gamma_ab_gamma_bb, &
4237 e_gamma_ab_gamma_ab_laplace_rhoa, &
4238 e_gamma_ab_gamma_ab_laplace_rhob, &
4239 e_gamma_ab_gamma_ab_tau_a, &
4240 e_gamma_ab_gamma_ab_tau_b, &
4241 e_gamma_ab_gamma_bb_gamma_bb, &
4242 e_gamma_ab_gamma_bb_laplace_rhoa, &
4243 e_gamma_ab_gamma_bb_laplace_rhob, &
4244 e_gamma_ab_gamma_bb_tau_a, &
4245 e_gamma_ab_gamma_bb_tau_b, &
4246 e_gamma_ab_laplace_rhoa_laplace_rhoa, &
4247 e_gamma_ab_laplace_rhoa_laplace_rhob, &
4248 e_gamma_ab_laplace_rhoa_tau_a, &
4249 e_gamma_ab_laplace_rhoa_tau_b, &
4250 e_gamma_ab_laplace_rhob_laplace_rhob, &
4251 e_gamma_ab_laplace_rhob_tau_a, &
4252 e_gamma_ab_laplace_rhob_tau_b, &
4253 e_gamma_ab_tau_a_tau_a, &
4254 e_gamma_ab_tau_a_tau_b, &
4255 e_gamma_ab_tau_b_tau_b, &
4256 e_gamma_bb_gamma_bb_gamma_bb, &
4257 e_gamma_bb_gamma_bb_laplace_rhoa, &
4258 e_gamma_bb_gamma_bb_laplace_rhob, &
4259 e_gamma_bb_gamma_bb_tau_a, &
4260 e_gamma_bb_gamma_bb_tau_b, &
4261 e_gamma_bb_laplace_rhoa_laplace_rhoa, &
4262 e_gamma_bb_laplace_rhoa_laplace_rhob, &
4263 e_gamma_bb_laplace_rhoa_tau_a, &
4264 e_gamma_bb_laplace_rhoa_tau_b, &
4265 e_gamma_bb_laplace_rhob_laplace_rhob, &
4266 e_gamma_bb_laplace_rhob_tau_a, &
4267 e_gamma_bb_laplace_rhob_tau_b, &
4268 e_gamma_bb_tau_a_tau_a, &
4269 e_gamma_bb_tau_a_tau_b, &
4270 e_gamma_bb_tau_b_tau_b, &
4271 e_laplace_rhoa_laplace_rhoa_laplace_rhoa, &
4272 e_laplace_rhoa_laplace_rhoa_laplace_rhob, &
4273 e_laplace_rhoa_laplace_rhoa_tau_a, &
4274 e_laplace_rhoa_laplace_rhoa_tau_b, &
4275 e_laplace_rhoa_laplace_rhob_laplace_rhob, &
4276 e_laplace_rhoa_laplace_rhob_tau_a, &
4277 e_laplace_rhoa_laplace_rhob_tau_b, &
4278 e_laplace_rhoa_tau_a_tau_a, &
4279 e_laplace_rhoa_tau_a_tau_b, &
4280 e_laplace_rhoa_tau_b_tau_b, &
4281 e_laplace_rhob_laplace_rhob_laplace_rhob, &
4282 e_laplace_rhob_laplace_rhob_tau_a, &
4283 e_laplace_rhob_laplace_rhob_tau_b, &
4284 e_laplace_rhob_tau_a_tau_a, &
4285 e_laplace_rhob_tau_a_tau_b, &
4286 e_laplace_rhob_tau_b_tau_b, &
4287 e_tau_a_tau_a_tau_a, &
4288 e_tau_a_tau_a_tau_b, &
4289 e_tau_a_tau_b_tau_b, &
4290 e_tau_b_tau_b_tau_b, &
4291 grad_deriv, npoints, func_name, sc, workers)
4292
4293REAL(kind=dp), DIMENSION(*), INTENT(IN) :: rhoa, rhob, norm_drho, norm_drhoa, &
4294 norm_drhob, laplace_rhoa, &
4295 laplace_rhob, tau_a, tau_b
4296REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_0, e_rhoa, e_rhob, e_ndrho, e_ndrhoa, &
4297 e_ndrhob, e_laplace_rhoa, e_laplace_rhob, e_tau_a, e_tau_b, e_rhoa_rhoa, e_rhoa_rhob, &
4298 e_rhob_rhob, e_ndrho_rhoa, e_ndrho_rhob, e_ndrhoa_rhoa, e_ndrhoa_rhob, e_ndrhob_rhoa, &
4299 e_ndrhob_rhob, e_ndrho_ndrho, e_ndrho_ndrhoa, e_ndrho_ndrhob, e_ndrhoa_ndrhoa, &
4300 e_ndrhoa_ndrhob, e_ndrhob_ndrhob, e_rhoa_laplace_rhoa, e_rhoa_laplace_rhob, &
4301 e_rhob_laplace_rhoa, e_rhob_laplace_rhob, e_rhoa_tau_a, e_rhoa_tau_b, e_rhob_tau_a, &
4302 e_rhob_tau_b, e_ndrho_laplace_rhoa, e_ndrho_laplace_rhob, e_ndrhoa_laplace_rhoa
4303REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_ndrhoa_laplace_rhob, e_ndrhob_laplace_rhoa, &
4304 e_ndrhob_laplace_rhob, e_ndrho_tau_a, e_ndrho_tau_b, e_ndrhoa_tau_a, e_ndrhoa_tau_b, &
4305 e_ndrhob_tau_a, e_ndrhob_tau_b, e_laplace_rhoa_laplace_rhoa, e_laplace_rhoa_laplace_rhob, &
4306 e_laplace_rhob_laplace_rhob, e_laplace_rhoa_tau_a, e_laplace_rhoa_tau_b, &
4307 e_laplace_rhob_tau_a, e_laplace_rhob_tau_b, e_tau_a_tau_a, e_tau_a_tau_b, e_tau_b_tau_b, &
4308 e_rhoa_rhoa_rhoa, e_rhoa_rhoa_rhob, e_rhoa_rhob_rhob, e_rhob_rhob_rhob
4309 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa
4310 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab
4311 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb
4312 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_aa
4313 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_ab
4314 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_bb
4315 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_aa
4316 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_ab
4317 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_bb
4318 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_aa
4319 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_ab
4320 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_bb
4321 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_laplace_rhoa
4322 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_laplace_rhob
4323 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_tau_a
4324 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_tau_b
4325 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_ab
4326 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_bb
4327 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_laplace_rhoa
4328 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_laplace_rhob
4329 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_tau_a
4330 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_tau_b
4331 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_gamma_bb
4332 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_laplace_rhoa
4333 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_laplace_rhob
4334 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_tau_a
4335 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_tau_b
4336 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhoa_gamma_aa
4337 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhoa_gamma_ab
4338 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhoa_gamma_bb
4339 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhoa_laplace_rhoa
4340 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhoa_laplace_rhob
4341 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhoa_tau_a
4342 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhoa_tau_b
4343 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhob_gamma_aa
4344 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhob_gamma_ab
4345 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhob_gamma_bb
4346 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhob_laplace_rhoa
4347 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhob_laplace_rhob
4348 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhob_tau_a
4349 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_rhob_tau_b
4350 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_aa_gamma_aa
4351 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_aa_gamma_ab
4352 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_aa_gamma_bb
4353 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_aa_laplace_rhoa
4354 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_aa_laplace_rhob
4355 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_aa_tau_a
4356 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_aa_tau_b
4357 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_ab_gamma_ab
4358 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_ab_gamma_bb
4359 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_ab_laplace_rhoa
4360 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_ab_laplace_rhob
4361 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_ab_tau_a
4362 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_ab_tau_b
4363 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_bb_gamma_bb
4364 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_bb_laplace_rhoa
4365 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_bb_laplace_rhob
4366 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_bb_tau_a
4367 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_gamma_bb_tau_b
4368 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_laplace_rhoa_laplace_rhoa
4369 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_laplace_rhoa_laplace_rhob
4370 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_laplace_rhoa_tau_a
4371 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_laplace_rhoa_tau_b
4372 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_laplace_rhob_laplace_rhob
4373 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_laplace_rhob_tau_a
4374 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_laplace_rhob_tau_b
4375 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_tau_a_tau_a
4376 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_tau_a_tau_b
4377 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhoa_tau_b_tau_b
4378 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_rhob_gamma_aa
4379 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_rhob_gamma_ab
4380 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_rhob_gamma_bb
4381 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_rhob_laplace_rhoa
4382 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_rhob_laplace_rhob
4383 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_rhob_tau_a
4384 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_rhob_tau_b
4385 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_aa_gamma_aa
4386 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_aa_gamma_ab
4387 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_aa_gamma_bb
4388 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_aa_laplace_rhoa
4389 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_aa_laplace_rhob
4390 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_aa_tau_a
4391 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_aa_tau_b
4392 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_ab_gamma_ab
4393 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_ab_gamma_bb
4394 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_ab_laplace_rhoa
4395 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_ab_laplace_rhob
4396 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_ab_tau_a
4397 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_ab_tau_b
4398 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_bb_gamma_bb
4399 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_bb_laplace_rhoa
4400 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_bb_laplace_rhob
4401 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_bb_tau_a
4402 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_gamma_bb_tau_b
4403 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_laplace_rhoa_laplace_rhoa
4404 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_laplace_rhoa_laplace_rhob
4405 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_laplace_rhoa_tau_a
4406 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_laplace_rhoa_tau_b
4407 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_laplace_rhob_laplace_rhob
4408 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_laplace_rhob_tau_a
4409 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_laplace_rhob_tau_b
4410 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_tau_a_tau_a
4411 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_tau_a_tau_b
4412 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rhob_tau_b_tau_b
4413 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_aa_gamma_aa
4414 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_aa_gamma_ab
4415 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_aa_gamma_bb
4416 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_aa_laplace_rhoa
4417 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_aa_laplace_rhob
4418 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_aa_tau_a
4419 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_aa_tau_b
4420 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_ab_gamma_ab
4421 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_ab_gamma_bb
4422 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_ab_laplace_rhoa
4423 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_ab_laplace_rhob
4424 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_ab_tau_a
4425 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_ab_tau_b
4426 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_bb_gamma_bb
4427 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_bb_laplace_rhoa
4428 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_bb_laplace_rhob
4429 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_bb_tau_a
4430 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_gamma_bb_tau_b
4431 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_laplace_rhoa_laplace_rhoa
4432 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_laplace_rhoa_laplace_rhob
4433 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_laplace_rhoa_tau_a
4434 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_laplace_rhoa_tau_b
4435 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_laplace_rhob_laplace_rhob
4436 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_laplace_rhob_tau_a
4437 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_laplace_rhob_tau_b
4438 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_tau_a_tau_a
4439 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_tau_a_tau_b
4440 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_aa_tau_b_tau_b
4441 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_ab_gamma_ab
4442 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_ab_gamma_bb
4443 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_ab_laplace_rhoa
4444 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_ab_laplace_rhob
4445 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_ab_tau_a
4446 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_ab_tau_b
4447 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_bb_gamma_bb
4448 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_bb_laplace_rhoa
4449 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_bb_laplace_rhob
4450 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_bb_tau_a
4451 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_gamma_bb_tau_b
4452 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_laplace_rhoa_laplace_rhoa
4453 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_laplace_rhoa_laplace_rhob
4454 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_laplace_rhoa_tau_a
4455 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_laplace_rhoa_tau_b
4456 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_laplace_rhob_laplace_rhob
4457 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_laplace_rhob_tau_a
4458 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_laplace_rhob_tau_b
4459 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_tau_a_tau_a
4460 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_tau_a_tau_b
4461 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_ab_tau_b_tau_b
4462 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_gamma_bb_gamma_bb
4463 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_gamma_bb_laplace_rhoa
4464 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_gamma_bb_laplace_rhob
4465 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_gamma_bb_tau_a
4466 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_gamma_bb_tau_b
4467 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_laplace_rhoa_laplace_rhoa
4468 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_laplace_rhoa_laplace_rhob
4469 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_laplace_rhoa_tau_a
4470 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_laplace_rhoa_tau_b
4471 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_laplace_rhob_laplace_rhob
4472 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_laplace_rhob_tau_a
4473 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_laplace_rhob_tau_b
4474 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_tau_a_tau_a
4475 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_tau_a_tau_b
4476 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_gamma_bb_tau_b_tau_b
4477 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhoa_laplace_rhoa_laplace_rhoa
4478 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhoa_laplace_rhoa_laplace_rhob
4479 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhoa_laplace_rhoa_tau_a
4480 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhoa_laplace_rhoa_tau_b
4481 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhoa_laplace_rhob_laplace_rhob
4482 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhoa_laplace_rhob_tau_a
4483 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhoa_laplace_rhob_tau_b
4484 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhoa_tau_a_tau_a
4485 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhoa_tau_a_tau_b
4486 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhoa_tau_b_tau_b
4487 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhob_laplace_rhob_laplace_rhob
4488 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhob_laplace_rhob_tau_a
4489 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhob_laplace_rhob_tau_b
4490 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhob_tau_a_tau_a
4491 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhob_tau_a_tau_b
4492 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_laplace_rhob_tau_b_tau_b
4493 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_tau_a_tau_a_tau_a
4494 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_tau_a_tau_a_tau_b
4495 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_tau_a_tau_b_tau_b
4496 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_tau_b_tau_b_tau_b
4497INTEGER, INTENT(in) :: grad_deriv, npoints
4498CHARACTER(LEN=default_string_length), INTENT(IN) :: func_name
4499REAL(kind=dp), INTENT(in) :: sc
4500TYPE(libxc_worker_set_type), INTENT(INOUT) :: workers
4501
4502INTEGER :: bsize, family, i, i0, ib, ii, ithread, &
4503 nb, nblocks, nthreads
4504LOGICAL :: is_gga, is_mgga
4505
4506ithread = 0
4507nthreads = 1
4508!$ ithread = omp_get_thread_num()
4509!$ nthreads = omp_get_num_threads()
4510cpassert(ithread < SIZE(workers%worker))
4511
4512! See the spin-unpolarized calc: the device is activated per evaluation.
4513
4514! See the spin-unpolarized calc: on the GPU path the whole grid is evaluated
4515! in a single LibXC call, while the CPU/OpenMP path keeps its per-footprint
4516! block cap (shrunk so every thread gets a block on small grids).
4517IF (libxc_is_gpu()) THEN
4518 bsize = npoints
4519ELSE
4520 bsize = max(1, min(workers%worker(1)%nb, (npoints + nthreads - 1)/nthreads))
4521END IF
4522nblocks = (npoints + bsize - 1)/bsize
4523
4524family = workers%family
4525CALL libxc_family_flags(family, is_gga, is_mgga, trim(func_name))
4526
4527! Density and tau cutoffs are applied by LibXC itself, as in the
4528! spin-unpolarized case.
4529associate(w => workers%worker(ithread + 1), has_laplace => workers%has_laplace, &
4530 no_exc => workers%no_exc, eps_rho => workers%epsilon_rho, &
4531 eps_tau => workers%epsilon_tau)
4532!$OMP DO
4533 DO ib = 1, nblocks
4534 IF (libxc_is_gpu()) CALL libxc_worker_resize_cuda(w, workers%family, workers%nspin, npoints)
4535 i0 = (ib - 1)*bsize
4536 nb = min(bsize, npoints - i0)
4537
4538 ! stage this block's inputs in LibXC's layout
4539 DO i = 1, nb
4540 ii = i0 + i
4541 w%rho(1, i) = max(rhoa(ii), 0.0_dp)
4542 w%rho(2, i) = max(rhob(ii), 0.0_dp)
4543 END DO
4544 IF (is_gga) THEN
4545 ! CP2K works with gradient norms, LibXC with their contractions.
4546 DO i = 1, nb
4547 ii = i0 + i
4548 w%nda(i) = max(norm_drhoa(ii), epsilon(0.0_dp)*1.e4_dp)
4549 w%ndb(i) = max(norm_drhob(ii), epsilon(0.0_dp)*1.e4_dp)
4550 w%nd(i) = max(norm_drho(ii), epsilon(0.0_dp)*1.e4_dp)
4551 w%sigma(1, i) = w%nda(i)**2
4552 w%sigma(3, i) = w%ndb(i)**2
4553 w%sigma(2, i) = 0.5_dp*(w%nd(i)**2 - w%sigma(1, i) - w%sigma(3, i))
4554 END DO
4555 END IF
4556 IF (is_mgga) THEN
4557 DO i = 1, nb
4558 ii = i0 + i
4559 w%lapl(1, i) = laplace_rhoa(ii)
4560 w%lapl(2, i) = laplace_rhob(ii)
4561 w%tau(1, i) = max(tau_a(ii), 0.0_dp)
4562 w%tau(2, i) = max(tau_b(ii), 0.0_dp)
4563 END DO
4564 ! Tau screening and Fermi hole curvature bound, per spin channel
4565 ! (see the spin-unpolarized routine); the tau test uses the sum
4566 ! of the channels, as the density test does.
4567 DO i = 1, nb
4568 IF (w%tau(1, i) + w%tau(2, i) <= eps_tau) THEN
4569 w%rho(1, i) = 0.0_dp
4570 w%rho(2, i) = 0.0_dp
4571 END IF
4572 w%tau(1, i) = max(w%tau(1, i), &
4573 w%sigma(1, i)/(8.0_dp*max(w%rho(1, i), eps_rho)))
4574 w%tau(2, i) = max(w%tau(2, i), &
4575 w%sigma(3, i)/(8.0_dp*max(w%rho(2, i), eps_rho)))
4576 END DO
4577 END IF
4578
4579 ! one LibXC call for the whole block, on the host or the device
4580 CALL libxc_worker_eval(w, workers%family, workers%nspin, grad_deriv, no_exc, nb)
4581 ! accumulate; one loop per group of derivatives, selected by the
4582 ! order requested and the family
4583 IF (grad_deriv >= 0) THEN
4584 DO i = 1, nb
4585 ii = i0 + i
4586 e_0(ii) = e_0(ii) + sc*w%exc(i)*(w%rho(1, i) + w%rho(2, i))
4587 END DO
4588 END IF
4589 IF (grad_deriv >= 1) THEN
4590 DO i = 1, nb
4591 ii = i0 + i
4592 e_rhoa(ii) = e_rhoa(ii) + sc*w%vrho(1, i)
4593 e_rhob(ii) = e_rhob(ii) + sc*w%vrho(2, i)
4594 END DO
4595 IF (is_gga) THEN
4596 DO i = 1, nb
4597 ii = i0 + i
4598 e_ndrho(ii) = e_ndrho(ii) + sc*w%vsigma(2, i)*w%nd(i)
4599 e_ndrhoa(ii) = e_ndrhoa(ii) + &
4600 sc*(2.0_dp*w%vsigma(1, i) - w%vsigma(2, i))*w%nda(i)
4601 e_ndrhob(ii) = e_ndrhob(ii) + &
4602 sc*(2.0_dp*w%vsigma(3, i) - w%vsigma(2, i))*w%ndb(i)
4603 END DO
4604 END IF
4605 IF (is_mgga) THEN
4606 DO i = 1, nb
4607 ii = i0 + i
4608 e_tau_a(ii) = e_tau_a(ii) + sc*w%vtau(1, i)
4609 e_tau_b(ii) = e_tau_b(ii) + sc*w%vtau(2, i)
4610 END DO
4611 END IF
4612 IF (is_mgga .AND. has_laplace) THEN
4613 DO i = 1, nb
4614 ii = i0 + i
4615 e_laplace_rhoa(ii) = e_laplace_rhoa(ii) + sc*w%vlapl(1, i)
4616 e_laplace_rhob(ii) = e_laplace_rhob(ii) + sc*w%vlapl(2, i)
4617 END DO
4618 END IF
4619 END IF
4620 IF (grad_deriv >= 2) THEN
4621 DO i = 1, nb
4622 ii = i0 + i
4623 e_rhoa_rhoa(ii) = e_rhoa_rhoa(ii) + sc*w%v2rho2(1, i)
4624 e_rhoa_rhob(ii) = e_rhoa_rhob(ii) + sc*w%v2rho2(2, i)
4625 e_rhob_rhob(ii) = e_rhob_rhob(ii) + sc*w%v2rho2(3, i)
4626 END DO
4627 IF (is_gga) THEN
4628 DO i = 1, nb
4629 ii = i0 + i
4630 e_ndrho_rhoa(ii) = e_ndrho_rhoa(ii) + sc*w%v2rhosigma(2, i)*w%nd(i)
4631 e_ndrho_rhob(ii) = e_ndrho_rhob(ii) + sc*w%v2rhosigma(5, i)*w%nd(i)
4632 e_ndrhoa_rhoa(ii) = e_ndrhoa_rhoa(ii) + &
4633 sc*(2.0_dp*w%v2rhosigma(1, i) - w%v2rhosigma(2, i))*w%nda(i)
4634 e_ndrhoa_rhob(ii) = e_ndrhoa_rhob(ii) + &
4635 sc*(2.0_dp*w%v2rhosigma(4, i) - w%v2rhosigma(5, i))*w%nda(i)
4636 e_ndrhob_rhoa(ii) = e_ndrhob_rhoa(ii) + &
4637 sc*(2.0_dp*w%v2rhosigma(3, i) - w%v2rhosigma(2, i))*w%ndb(i)
4638 e_ndrhob_rhob(ii) = e_ndrhob_rhob(ii) + &
4639 sc*(2.0_dp*w%v2rhosigma(6, i) - w%v2rhosigma(5, i))*w%ndb(i)
4640 e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) + &
4641 sc*(w%vsigma(2, i) + w%nd(i)**2*w%v2sigma2(4, i))
4642 e_ndrho_ndrhoa(ii) = e_ndrho_ndrhoa(ii) + &
4643 sc*(2.0_dp*w%v2sigma2(2, i) - w%v2sigma2(4, i))*w%nd(i)*w%nda(i)
4644 e_ndrho_ndrhob(ii) = e_ndrho_ndrhob(ii) + &
4645 sc*(2.0_dp*w%v2sigma2(5, i) - w%v2sigma2(4, i))*w%nd(i)*w%ndb(i)
4646 e_ndrhoa_ndrhoa(ii) = e_ndrhoa_ndrhoa(ii) + &
4647 sc*(2.0_dp*w%vsigma(1, i) - w%vsigma(2, i) + w%nda(i)**2*( &
4648 4.0_dp*w%v2sigma2(1, i) - 4.0_dp*w%v2sigma2(2, i) + w%v2sigma2(4, i)))
4649 e_ndrhoa_ndrhob(ii) = e_ndrhoa_ndrhob(ii) + &
4650 sc*(4.0_dp*w%v2sigma2(3, i) - 2.0_dp*w%v2sigma2(2, i) - &
4651 2.0_dp*w%v2sigma2(5, i) + w%v2sigma2(4, i))*w%nda(i)*w%ndb(i)
4652 e_ndrhob_ndrhob(ii) = e_ndrhob_ndrhob(ii) + &
4653 sc*(2.0_dp*w%vsigma(3, i) - w%vsigma(2, i) + w%ndb(i)**2*( &
4654 4.0_dp*w%v2sigma2(6, i) - 4.0_dp*w%v2sigma2(5, i) + w%v2sigma2(4, i)))
4655 END DO
4656 END IF
4657 IF (is_mgga) THEN
4658 DO i = 1, nb
4659 ii = i0 + i
4660 e_rhoa_tau_a(ii) = e_rhoa_tau_a(ii) + sc*w%v2rhotau(1, i)
4661 e_rhoa_tau_b(ii) = e_rhoa_tau_b(ii) + sc*w%v2rhotau(2, i)
4662 e_rhob_tau_a(ii) = e_rhob_tau_a(ii) + sc*w%v2rhotau(3, i)
4663 e_rhob_tau_b(ii) = e_rhob_tau_b(ii) + sc*w%v2rhotau(4, i)
4664 e_ndrho_tau_a(ii) = e_ndrho_tau_a(ii) + sc*w%v2sigmatau(3, i)*w%nd(i)
4665 e_ndrho_tau_b(ii) = e_ndrho_tau_b(ii) + sc*w%v2sigmatau(4, i)*w%nd(i)
4666 e_ndrhoa_tau_a(ii) = e_ndrhoa_tau_a(ii) + &
4667 sc*(2.0_dp*w%v2sigmatau(1, i) - w%v2sigmatau(3, i))*w%nda(i)
4668 e_ndrhoa_tau_b(ii) = e_ndrhoa_tau_b(ii) + &
4669 sc*(2.0_dp*w%v2sigmatau(2, i) - w%v2sigmatau(4, i))*w%nda(i)
4670 e_ndrhob_tau_a(ii) = e_ndrhob_tau_a(ii) + &
4671 sc*(2.0_dp*w%v2sigmatau(5, i) - w%v2sigmatau(3, i))*w%ndb(i)
4672 e_ndrhob_tau_b(ii) = e_ndrhob_tau_b(ii) + &
4673 sc*(2.0_dp*w%v2sigmatau(6, i) - w%v2sigmatau(4, i))*w%ndb(i)
4674 e_tau_a_tau_a(ii) = e_tau_a_tau_a(ii) + sc*w%v2tau2(1, i)
4675 e_tau_a_tau_b(ii) = e_tau_a_tau_b(ii) + sc*w%v2tau2(2, i)
4676 e_tau_b_tau_b(ii) = e_tau_b_tau_b(ii) + sc*w%v2tau2(3, i)
4677 END DO
4678 END IF
4679 IF (is_mgga .AND. has_laplace) THEN
4680 DO i = 1, nb
4681 ii = i0 + i
4682 e_rhoa_laplace_rhoa(ii) = e_rhoa_laplace_rhoa(ii) + sc*w%v2rholapl(1, i)
4683 e_rhoa_laplace_rhob(ii) = e_rhoa_laplace_rhob(ii) + sc*w%v2rholapl(2, i)
4684 e_rhob_laplace_rhoa(ii) = e_rhob_laplace_rhoa(ii) + sc*w%v2rholapl(3, i)
4685 e_rhob_laplace_rhob(ii) = e_rhob_laplace_rhob(ii) + sc*w%v2rholapl(4, i)
4686 e_ndrho_laplace_rhoa(ii) = e_ndrho_laplace_rhoa(ii) + sc*w%v2sigmalapl(3, i)*w%nd(i)
4687 e_ndrho_laplace_rhob(ii) = e_ndrho_laplace_rhob(ii) + sc*w%v2sigmalapl(4, i)*w%nd(i)
4688 e_ndrhoa_laplace_rhoa(ii) = e_ndrhoa_laplace_rhoa(ii) + &
4689 sc*(2.0_dp*w%v2sigmalapl(1, i) - w%v2sigmalapl(3, i))*w%nda(i)
4690 e_ndrhoa_laplace_rhob(ii) = e_ndrhoa_laplace_rhob(ii) + &
4691 sc*(2.0_dp*w%v2sigmalapl(2, i) - w%v2sigmalapl(4, i))*w%nda(i)
4692 e_ndrhob_laplace_rhoa(ii) = e_ndrhob_laplace_rhoa(ii) + &
4693 sc*(2.0_dp*w%v2sigmalapl(5, i) - w%v2sigmalapl(3, i))*w%ndb(i)
4694 e_ndrhob_laplace_rhob(ii) = e_ndrhob_laplace_rhob(ii) + &
4695 sc*(2.0_dp*w%v2sigmalapl(6, i) - w%v2sigmalapl(4, i))*w%ndb(i)
4696 e_laplace_rhoa_laplace_rhoa(ii) = e_laplace_rhoa_laplace_rhoa(ii) + sc*w%v2lapl2(1, i)
4697 e_laplace_rhoa_laplace_rhob(ii) = e_laplace_rhoa_laplace_rhob(ii) + sc*w%v2lapl2(2, i)
4698 e_laplace_rhob_laplace_rhob(ii) = e_laplace_rhob_laplace_rhob(ii) + sc*w%v2lapl2(3, i)
4699 e_laplace_rhoa_tau_a(ii) = e_laplace_rhoa_tau_a(ii) + sc*w%v2lapltau(1, i)
4700 e_laplace_rhoa_tau_b(ii) = e_laplace_rhoa_tau_b(ii) + sc*w%v2lapltau(2, i)
4701 e_laplace_rhob_tau_a(ii) = e_laplace_rhob_tau_a(ii) + sc*w%v2lapltau(3, i)
4702 e_laplace_rhob_tau_b(ii) = e_laplace_rhob_tau_b(ii) + sc*w%v2lapltau(4, i)
4703 END DO
4704 END IF
4705 END IF
4706 IF (grad_deriv >= 3) THEN
4707 DO i = 1, nb
4708 ii = i0 + i
4709 e_rhoa_rhoa_rhoa(ii) = e_rhoa_rhoa_rhoa(ii) + sc*w%v3rho3(1, i)
4710 e_rhoa_rhoa_rhob(ii) = e_rhoa_rhoa_rhob(ii) + sc*w%v3rho3(2, i)
4711 e_rhoa_rhob_rhob(ii) = e_rhoa_rhob_rhob(ii) + sc*w%v3rho3(3, i)
4712 e_rhob_rhob_rhob(ii) = e_rhob_rhob_rhob(ii) + sc*w%v3rho3(4, i)
4713 END DO
4714 END IF
4715 IF (grad_deriv >= 1 .AND. is_gga) THEN
4716 DO i = 1, nb
4717 ii = i0 + i
4718 e_gamma_aa(ii) = e_gamma_aa(ii) + sc*w%vsigma (1, i)
4719 e_gamma_ab(ii) = e_gamma_ab(ii) + sc*w%vsigma (2, i)
4720 e_gamma_bb(ii) = e_gamma_bb(ii) + sc*w%vsigma (3, i)
4721 END DO
4722 END IF
4723 IF (grad_deriv >= 2 .AND. is_gga) THEN
4724 DO i = 1, nb
4725 ii = i0 + i
4726 e_rhoa_gamma_aa(ii) = e_rhoa_gamma_aa(ii) + sc*w%v2rhosigma (1, i)
4727 e_rhoa_gamma_ab(ii) = e_rhoa_gamma_ab(ii) + sc*w%v2rhosigma (2, i)
4728 e_rhoa_gamma_bb(ii) = e_rhoa_gamma_bb(ii) + sc*w%v2rhosigma (3, i)
4729 e_rhob_gamma_aa(ii) = e_rhob_gamma_aa(ii) + sc*w%v2rhosigma (4, i)
4730 e_rhob_gamma_ab(ii) = e_rhob_gamma_ab(ii) + sc*w%v2rhosigma (5, i)
4731 e_rhob_gamma_bb(ii) = e_rhob_gamma_bb(ii) + sc*w%v2rhosigma (6, i)
4732 e_gamma_aa_gamma_aa(ii) = e_gamma_aa_gamma_aa(ii) + sc*w%v2sigma2 (1, i)
4733 e_gamma_aa_gamma_ab(ii) = e_gamma_aa_gamma_ab(ii) + sc*w%v2sigma2 (2, i)
4734 e_gamma_aa_gamma_bb(ii) = e_gamma_aa_gamma_bb(ii) + sc*w%v2sigma2 (3, i)
4735 e_gamma_ab_gamma_ab(ii) = e_gamma_ab_gamma_ab(ii) + sc*w%v2sigma2 (4, i)
4736 e_gamma_ab_gamma_bb(ii) = e_gamma_ab_gamma_bb(ii) + sc*w%v2sigma2 (5, i)
4737 e_gamma_bb_gamma_bb(ii) = e_gamma_bb_gamma_bb(ii) + sc*w%v2sigma2 (6, i)
4738 END DO
4739 END IF
4740 IF (grad_deriv >= 2 .AND. is_mgga) THEN
4741 DO i = 1, nb
4742 ii = i0 + i
4743 e_gamma_aa_laplace_rhoa(ii) = e_gamma_aa_laplace_rhoa(ii) + sc*w%v2sigmalapl (1, i)
4744 e_gamma_aa_laplace_rhob(ii) = e_gamma_aa_laplace_rhob(ii) + sc*w%v2sigmalapl (2, i)
4745 e_gamma_aa_tau_a(ii) = e_gamma_aa_tau_a(ii) + sc*w%v2sigmatau (1, i)
4746 e_gamma_aa_tau_b(ii) = e_gamma_aa_tau_b(ii) + sc*w%v2sigmatau (2, i)
4747 e_gamma_ab_laplace_rhoa(ii) = e_gamma_ab_laplace_rhoa(ii) + sc*w%v2sigmalapl (3, i)
4748 e_gamma_ab_laplace_rhob(ii) = e_gamma_ab_laplace_rhob(ii) + sc*w%v2sigmalapl (4, i)
4749 e_gamma_ab_tau_a(ii) = e_gamma_ab_tau_a(ii) + sc*w%v2sigmatau (3, i)
4750 e_gamma_ab_tau_b(ii) = e_gamma_ab_tau_b(ii) + sc*w%v2sigmatau (4, i)
4751 e_gamma_bb_laplace_rhoa(ii) = e_gamma_bb_laplace_rhoa(ii) + sc*w%v2sigmalapl (5, i)
4752 e_gamma_bb_laplace_rhob(ii) = e_gamma_bb_laplace_rhob(ii) + sc*w%v2sigmalapl (6, i)
4753 e_gamma_bb_tau_a(ii) = e_gamma_bb_tau_a(ii) + sc*w%v2sigmatau (5, i)
4754 e_gamma_bb_tau_b(ii) = e_gamma_bb_tau_b(ii) + sc*w%v2sigmatau (6, i)
4755 END DO
4756 END IF
4757 IF (grad_deriv >= 3 .AND. is_mgga) THEN
4758 DO i = 1, nb
4759 ii = i0 + i
4760 e_rhoa_rhoa_gamma_aa(ii) = e_rhoa_rhoa_gamma_aa(ii) + sc*w%v3rho2sigma (1, i)
4761 e_rhoa_rhoa_gamma_ab(ii) = e_rhoa_rhoa_gamma_ab(ii) + sc*w%v3rho2sigma (2, i)
4762 e_rhoa_rhoa_gamma_bb(ii) = e_rhoa_rhoa_gamma_bb(ii) + sc*w%v3rho2sigma (3, i)
4763 e_rhoa_rhoa_laplace_rhoa(ii) = e_rhoa_rhoa_laplace_rhoa(ii) + sc*w%v3rho2lapl (1, i)
4764 e_rhoa_rhoa_laplace_rhob(ii) = e_rhoa_rhoa_laplace_rhob(ii) + sc*w%v3rho2lapl (2, i)
4765 e_rhoa_rhoa_tau_a(ii) = e_rhoa_rhoa_tau_a(ii) + sc*w%v3rho2tau (1, i)
4766 e_rhoa_rhoa_tau_b(ii) = e_rhoa_rhoa_tau_b(ii) + sc*w%v3rho2tau (2, i)
4767 e_rhoa_rhob_gamma_aa(ii) = e_rhoa_rhob_gamma_aa(ii) + sc*w%v3rho2sigma (4, i)
4768 e_rhoa_rhob_gamma_ab(ii) = e_rhoa_rhob_gamma_ab(ii) + sc*w%v3rho2sigma (5, i)
4769 e_rhoa_rhob_gamma_bb(ii) = e_rhoa_rhob_gamma_bb(ii) + sc*w%v3rho2sigma (6, i)
4770 e_rhoa_rhob_laplace_rhoa(ii) = e_rhoa_rhob_laplace_rhoa(ii) + sc*w%v3rho2lapl (3, i)
4771 e_rhoa_rhob_laplace_rhob(ii) = e_rhoa_rhob_laplace_rhob(ii) + sc*w%v3rho2lapl (4, i)
4772 e_rhoa_rhob_tau_a(ii) = e_rhoa_rhob_tau_a(ii) + sc*w%v3rho2tau (3, i)
4773 e_rhoa_rhob_tau_b(ii) = e_rhoa_rhob_tau_b(ii) + sc*w%v3rho2tau (4, i)
4774 e_rhoa_gamma_aa_gamma_aa(ii) = e_rhoa_gamma_aa_gamma_aa(ii) + sc*w%v3rhosigma2 (1, i)
4775 e_rhoa_gamma_aa_gamma_ab(ii) = e_rhoa_gamma_aa_gamma_ab(ii) + sc*w%v3rhosigma2 (2, i)
4776 e_rhoa_gamma_aa_gamma_bb(ii) = e_rhoa_gamma_aa_gamma_bb(ii) + sc*w%v3rhosigma2 (3, i)
4777 e_rhoa_gamma_aa_laplace_rhoa(ii) = e_rhoa_gamma_aa_laplace_rhoa(ii) + sc*w%v3rhosigmalapl (1, i)
4778 e_rhoa_gamma_aa_laplace_rhob(ii) = e_rhoa_gamma_aa_laplace_rhob(ii) + sc*w%v3rhosigmalapl (2, i)
4779 e_rhoa_gamma_aa_tau_a(ii) = e_rhoa_gamma_aa_tau_a(ii) + sc*w%v3rhosigmatau (1, i)
4780 e_rhoa_gamma_aa_tau_b(ii) = e_rhoa_gamma_aa_tau_b(ii) + sc*w%v3rhosigmatau (2, i)
4781 e_rhoa_gamma_ab_gamma_ab(ii) = e_rhoa_gamma_ab_gamma_ab(ii) + sc*w%v3rhosigma2 (4, i)
4782 e_rhoa_gamma_ab_gamma_bb(ii) = e_rhoa_gamma_ab_gamma_bb(ii) + sc*w%v3rhosigma2 (5, i)
4783 e_rhoa_gamma_ab_laplace_rhoa(ii) = e_rhoa_gamma_ab_laplace_rhoa(ii) + sc*w%v3rhosigmalapl (3, i)
4784 e_rhoa_gamma_ab_laplace_rhob(ii) = e_rhoa_gamma_ab_laplace_rhob(ii) + sc*w%v3rhosigmalapl (4, i)
4785 e_rhoa_gamma_ab_tau_a(ii) = e_rhoa_gamma_ab_tau_a(ii) + sc*w%v3rhosigmatau (3, i)
4786 e_rhoa_gamma_ab_tau_b(ii) = e_rhoa_gamma_ab_tau_b(ii) + sc*w%v3rhosigmatau (4, i)
4787 e_rhoa_gamma_bb_gamma_bb(ii) = e_rhoa_gamma_bb_gamma_bb(ii) + sc*w%v3rhosigma2 (6, i)
4788 e_rhoa_gamma_bb_laplace_rhoa(ii) = e_rhoa_gamma_bb_laplace_rhoa(ii) + sc*w%v3rhosigmalapl (5, i)
4789 e_rhoa_gamma_bb_laplace_rhob(ii) = e_rhoa_gamma_bb_laplace_rhob(ii) + sc*w%v3rhosigmalapl (6, i)
4790 e_rhoa_gamma_bb_tau_a(ii) = e_rhoa_gamma_bb_tau_a(ii) + sc*w%v3rhosigmatau (5, i)
4791 e_rhoa_gamma_bb_tau_b(ii) = e_rhoa_gamma_bb_tau_b(ii) + sc*w%v3rhosigmatau (6, i)
4792 e_rhoa_laplace_rhoa_laplace_rhoa(ii) = e_rhoa_laplace_rhoa_laplace_rhoa(ii) + sc*w%v3rholapl2 (1, i)
4793 e_rhoa_laplace_rhoa_laplace_rhob(ii) = e_rhoa_laplace_rhoa_laplace_rhob(ii) + sc*w%v3rholapl2 (2, i)
4794 e_rhoa_laplace_rhoa_tau_a(ii) = e_rhoa_laplace_rhoa_tau_a(ii) + sc*w%v3rholapltau (1, i)
4795 e_rhoa_laplace_rhoa_tau_b(ii) = e_rhoa_laplace_rhoa_tau_b(ii) + sc*w%v3rholapltau (2, i)
4796 e_rhoa_laplace_rhob_laplace_rhob(ii) = e_rhoa_laplace_rhob_laplace_rhob(ii) + sc*w%v3rholapl2 (3, i)
4797 e_rhoa_laplace_rhob_tau_a(ii) = e_rhoa_laplace_rhob_tau_a(ii) + sc*w%v3rholapltau (3, i)
4798 e_rhoa_laplace_rhob_tau_b(ii) = e_rhoa_laplace_rhob_tau_b(ii) + sc*w%v3rholapltau (4, i)
4799 e_rhoa_tau_a_tau_a(ii) = e_rhoa_tau_a_tau_a(ii) + sc*w%v3rhotau2 (1, i)
4800 e_rhoa_tau_a_tau_b(ii) = e_rhoa_tau_a_tau_b(ii) + sc*w%v3rhotau2 (2, i)
4801 e_rhoa_tau_b_tau_b(ii) = e_rhoa_tau_b_tau_b(ii) + sc*w%v3rhotau2 (3, i)
4802 e_rhob_rhob_gamma_aa(ii) = e_rhob_rhob_gamma_aa(ii) + sc*w%v3rho2sigma (7, i)
4803 e_rhob_rhob_gamma_ab(ii) = e_rhob_rhob_gamma_ab(ii) + sc*w%v3rho2sigma (8, i)
4804 e_rhob_rhob_gamma_bb(ii) = e_rhob_rhob_gamma_bb(ii) + sc*w%v3rho2sigma (9, i)
4805 e_rhob_rhob_laplace_rhoa(ii) = e_rhob_rhob_laplace_rhoa(ii) + sc*w%v3rho2lapl (5, i)
4806 e_rhob_rhob_laplace_rhob(ii) = e_rhob_rhob_laplace_rhob(ii) + sc*w%v3rho2lapl (6, i)
4807 e_rhob_rhob_tau_a(ii) = e_rhob_rhob_tau_a(ii) + sc*w%v3rho2tau (5, i)
4808 e_rhob_rhob_tau_b(ii) = e_rhob_rhob_tau_b(ii) + sc*w%v3rho2tau (6, i)
4809 e_rhob_gamma_aa_gamma_aa(ii) = e_rhob_gamma_aa_gamma_aa(ii) + sc*w%v3rhosigma2 (7, i)
4810 e_rhob_gamma_aa_gamma_ab(ii) = e_rhob_gamma_aa_gamma_ab(ii) + sc*w%v3rhosigma2 (8, i)
4811 e_rhob_gamma_aa_gamma_bb(ii) = e_rhob_gamma_aa_gamma_bb(ii) + sc*w%v3rhosigma2 (9, i)
4812 e_rhob_gamma_aa_laplace_rhoa(ii) = e_rhob_gamma_aa_laplace_rhoa(ii) + sc*w%v3rhosigmalapl (7, i)
4813 e_rhob_gamma_aa_laplace_rhob(ii) = e_rhob_gamma_aa_laplace_rhob(ii) + sc*w%v3rhosigmalapl (8, i)
4814 e_rhob_gamma_aa_tau_a(ii) = e_rhob_gamma_aa_tau_a(ii) + sc*w%v3rhosigmatau (7, i)
4815 e_rhob_gamma_aa_tau_b(ii) = e_rhob_gamma_aa_tau_b(ii) + sc*w%v3rhosigmatau (8, i)
4816 e_rhob_gamma_ab_gamma_ab(ii) = e_rhob_gamma_ab_gamma_ab(ii) + sc*w%v3rhosigma2 (10, i)
4817 e_rhob_gamma_ab_gamma_bb(ii) = e_rhob_gamma_ab_gamma_bb(ii) + sc*w%v3rhosigma2 (11, i)
4818 e_rhob_gamma_ab_laplace_rhoa(ii) = e_rhob_gamma_ab_laplace_rhoa(ii) + sc*w%v3rhosigmalapl (9, i)
4819 e_rhob_gamma_ab_laplace_rhob(ii) = e_rhob_gamma_ab_laplace_rhob(ii) + sc*w%v3rhosigmalapl (10, i)
4820 e_rhob_gamma_ab_tau_a(ii) = e_rhob_gamma_ab_tau_a(ii) + sc*w%v3rhosigmatau (9, i)
4821 e_rhob_gamma_ab_tau_b(ii) = e_rhob_gamma_ab_tau_b(ii) + sc*w%v3rhosigmatau (10, i)
4822 e_rhob_gamma_bb_gamma_bb(ii) = e_rhob_gamma_bb_gamma_bb(ii) + sc*w%v3rhosigma2 (12, i)
4823 e_rhob_gamma_bb_laplace_rhoa(ii) = e_rhob_gamma_bb_laplace_rhoa(ii) + sc*w%v3rhosigmalapl (11, i)
4824 e_rhob_gamma_bb_laplace_rhob(ii) = e_rhob_gamma_bb_laplace_rhob(ii) + sc*w%v3rhosigmalapl (12, i)
4825 e_rhob_gamma_bb_tau_a(ii) = e_rhob_gamma_bb_tau_a(ii) + sc*w%v3rhosigmatau (11, i)
4826 e_rhob_gamma_bb_tau_b(ii) = e_rhob_gamma_bb_tau_b(ii) + sc*w%v3rhosigmatau (12, i)
4827 e_rhob_laplace_rhoa_laplace_rhoa(ii) = e_rhob_laplace_rhoa_laplace_rhoa(ii) + sc*w%v3rholapl2 (4, i)
4828 e_rhob_laplace_rhoa_laplace_rhob(ii) = e_rhob_laplace_rhoa_laplace_rhob(ii) + sc*w%v3rholapl2 (5, i)
4829 e_rhob_laplace_rhoa_tau_a(ii) = e_rhob_laplace_rhoa_tau_a(ii) + sc*w%v3rholapltau (5, i)
4830 e_rhob_laplace_rhoa_tau_b(ii) = e_rhob_laplace_rhoa_tau_b(ii) + sc*w%v3rholapltau (6, i)
4831 e_rhob_laplace_rhob_laplace_rhob(ii) = e_rhob_laplace_rhob_laplace_rhob(ii) + sc*w%v3rholapl2 (6, i)
4832 e_rhob_laplace_rhob_tau_a(ii) = e_rhob_laplace_rhob_tau_a(ii) + sc*w%v3rholapltau (7, i)
4833 e_rhob_laplace_rhob_tau_b(ii) = e_rhob_laplace_rhob_tau_b(ii) + sc*w%v3rholapltau (8, i)
4834 e_rhob_tau_a_tau_a(ii) = e_rhob_tau_a_tau_a(ii) + sc*w%v3rhotau2 (4, i)
4835 e_rhob_tau_a_tau_b(ii) = e_rhob_tau_a_tau_b(ii) + sc*w%v3rhotau2 (5, i)
4836 e_rhob_tau_b_tau_b(ii) = e_rhob_tau_b_tau_b(ii) + sc*w%v3rhotau2 (6, i)
4837 e_gamma_aa_gamma_aa_gamma_aa(ii) = e_gamma_aa_gamma_aa_gamma_aa(ii) + sc*w%v3sigma3 (1, i)
4838 e_gamma_aa_gamma_aa_gamma_ab(ii) = e_gamma_aa_gamma_aa_gamma_ab(ii) + sc*w%v3sigma3 (2, i)
4839 e_gamma_aa_gamma_aa_gamma_bb(ii) = e_gamma_aa_gamma_aa_gamma_bb(ii) + sc*w%v3sigma3 (3, i)
4840 e_gamma_aa_gamma_aa_laplace_rhoa(ii) = e_gamma_aa_gamma_aa_laplace_rhoa(ii) + sc*w%v3sigma2lapl (1, i)
4841 e_gamma_aa_gamma_aa_laplace_rhob(ii) = e_gamma_aa_gamma_aa_laplace_rhob(ii) + sc*w%v3sigma2lapl (2, i)
4842 e_gamma_aa_gamma_aa_tau_a(ii) = e_gamma_aa_gamma_aa_tau_a(ii) + sc*w%v3sigma2tau (1, i)
4843 e_gamma_aa_gamma_aa_tau_b(ii) = e_gamma_aa_gamma_aa_tau_b(ii) + sc*w%v3sigma2tau (2, i)
4844 e_gamma_aa_gamma_ab_gamma_ab(ii) = e_gamma_aa_gamma_ab_gamma_ab(ii) + sc*w%v3sigma3 (4, i)
4845 e_gamma_aa_gamma_ab_gamma_bb(ii) = e_gamma_aa_gamma_ab_gamma_bb(ii) + sc*w%v3sigma3 (5, i)
4846 e_gamma_aa_gamma_ab_laplace_rhoa(ii) = e_gamma_aa_gamma_ab_laplace_rhoa(ii) + sc*w%v3sigma2lapl (3, i)
4847 e_gamma_aa_gamma_ab_laplace_rhob(ii) = e_gamma_aa_gamma_ab_laplace_rhob(ii) + sc*w%v3sigma2lapl (4, i)
4848 e_gamma_aa_gamma_ab_tau_a(ii) = e_gamma_aa_gamma_ab_tau_a(ii) + sc*w%v3sigma2tau (3, i)
4849 e_gamma_aa_gamma_ab_tau_b(ii) = e_gamma_aa_gamma_ab_tau_b(ii) + sc*w%v3sigma2tau (4, i)
4850 e_gamma_aa_gamma_bb_gamma_bb(ii) = e_gamma_aa_gamma_bb_gamma_bb(ii) + sc*w%v3sigma3 (6, i)
4851 e_gamma_aa_gamma_bb_laplace_rhoa(ii) = e_gamma_aa_gamma_bb_laplace_rhoa(ii) + sc*w%v3sigma2lapl (5, i)
4852 e_gamma_aa_gamma_bb_laplace_rhob(ii) = e_gamma_aa_gamma_bb_laplace_rhob(ii) + sc*w%v3sigma2lapl (6, i)
4853 e_gamma_aa_gamma_bb_tau_a(ii) = e_gamma_aa_gamma_bb_tau_a(ii) + sc*w%v3sigma2tau (5, i)
4854 e_gamma_aa_gamma_bb_tau_b(ii) = e_gamma_aa_gamma_bb_tau_b(ii) + sc*w%v3sigma2tau (6, i)
4855 e_gamma_aa_laplace_rhoa_laplace_rhoa(ii) = e_gamma_aa_laplace_rhoa_laplace_rhoa(ii) + sc*w%v3sigmalapl2 (1, i)
4856 e_gamma_aa_laplace_rhoa_laplace_rhob(ii) = e_gamma_aa_laplace_rhoa_laplace_rhob(ii) + sc*w%v3sigmalapl2 (2, i)
4857 e_gamma_aa_laplace_rhoa_tau_a(ii) = e_gamma_aa_laplace_rhoa_tau_a(ii) + sc*w%v3sigmalapltau (1, i)
4858 e_gamma_aa_laplace_rhoa_tau_b(ii) = e_gamma_aa_laplace_rhoa_tau_b(ii) + sc*w%v3sigmalapltau (2, i)
4859 e_gamma_aa_laplace_rhob_laplace_rhob(ii) = e_gamma_aa_laplace_rhob_laplace_rhob(ii) + sc*w%v3sigmalapl2 (3, i)
4860 e_gamma_aa_laplace_rhob_tau_a(ii) = e_gamma_aa_laplace_rhob_tau_a(ii) + sc*w%v3sigmalapltau (3, i)
4861 e_gamma_aa_laplace_rhob_tau_b(ii) = e_gamma_aa_laplace_rhob_tau_b(ii) + sc*w%v3sigmalapltau (4, i)
4862 e_gamma_aa_tau_a_tau_a(ii) = e_gamma_aa_tau_a_tau_a(ii) + sc*w%v3sigmatau2 (1, i)
4863 e_gamma_aa_tau_a_tau_b(ii) = e_gamma_aa_tau_a_tau_b(ii) + sc*w%v3sigmatau2 (2, i)
4864 e_gamma_aa_tau_b_tau_b(ii) = e_gamma_aa_tau_b_tau_b(ii) + sc*w%v3sigmatau2 (3, i)
4865 e_gamma_ab_gamma_ab_gamma_ab(ii) = e_gamma_ab_gamma_ab_gamma_ab(ii) + sc*w%v3sigma3 (7, i)
4866 e_gamma_ab_gamma_ab_gamma_bb(ii) = e_gamma_ab_gamma_ab_gamma_bb(ii) + sc*w%v3sigma3 (8, i)
4867 e_gamma_ab_gamma_ab_laplace_rhoa(ii) = e_gamma_ab_gamma_ab_laplace_rhoa(ii) + sc*w%v3sigma2lapl (7, i)
4868 e_gamma_ab_gamma_ab_laplace_rhob(ii) = e_gamma_ab_gamma_ab_laplace_rhob(ii) + sc*w%v3sigma2lapl (8, i)
4869 e_gamma_ab_gamma_ab_tau_a(ii) = e_gamma_ab_gamma_ab_tau_a(ii) + sc*w%v3sigma2tau (7, i)
4870 e_gamma_ab_gamma_ab_tau_b(ii) = e_gamma_ab_gamma_ab_tau_b(ii) + sc*w%v3sigma2tau (8, i)
4871 e_gamma_ab_gamma_bb_gamma_bb(ii) = e_gamma_ab_gamma_bb_gamma_bb(ii) + sc*w%v3sigma3 (9, i)
4872 e_gamma_ab_gamma_bb_laplace_rhoa(ii) = e_gamma_ab_gamma_bb_laplace_rhoa(ii) + sc*w%v3sigma2lapl (9, i)
4873 e_gamma_ab_gamma_bb_laplace_rhob(ii) = e_gamma_ab_gamma_bb_laplace_rhob(ii) + sc*w%v3sigma2lapl (10, i)
4874 e_gamma_ab_gamma_bb_tau_a(ii) = e_gamma_ab_gamma_bb_tau_a(ii) + sc*w%v3sigma2tau (9, i)
4875 e_gamma_ab_gamma_bb_tau_b(ii) = e_gamma_ab_gamma_bb_tau_b(ii) + sc*w%v3sigma2tau (10, i)
4876 e_gamma_ab_laplace_rhoa_laplace_rhoa(ii) = e_gamma_ab_laplace_rhoa_laplace_rhoa(ii) + sc*w%v3sigmalapl2 (4, i)
4877 e_gamma_ab_laplace_rhoa_laplace_rhob(ii) = e_gamma_ab_laplace_rhoa_laplace_rhob(ii) + sc*w%v3sigmalapl2 (5, i)
4878 e_gamma_ab_laplace_rhoa_tau_a(ii) = e_gamma_ab_laplace_rhoa_tau_a(ii) + sc*w%v3sigmalapltau (5, i)
4879 e_gamma_ab_laplace_rhoa_tau_b(ii) = e_gamma_ab_laplace_rhoa_tau_b(ii) + sc*w%v3sigmalapltau (6, i)
4880 e_gamma_ab_laplace_rhob_laplace_rhob(ii) = e_gamma_ab_laplace_rhob_laplace_rhob(ii) + sc*w%v3sigmalapl2 (6, i)
4881 e_gamma_ab_laplace_rhob_tau_a(ii) = e_gamma_ab_laplace_rhob_tau_a(ii) + sc*w%v3sigmalapltau (7, i)
4882 e_gamma_ab_laplace_rhob_tau_b(ii) = e_gamma_ab_laplace_rhob_tau_b(ii) + sc*w%v3sigmalapltau (8, i)
4883 e_gamma_ab_tau_a_tau_a(ii) = e_gamma_ab_tau_a_tau_a(ii) + sc*w%v3sigmatau2 (4, i)
4884 e_gamma_ab_tau_a_tau_b(ii) = e_gamma_ab_tau_a_tau_b(ii) + sc*w%v3sigmatau2 (5, i)
4885 e_gamma_ab_tau_b_tau_b(ii) = e_gamma_ab_tau_b_tau_b(ii) + sc*w%v3sigmatau2 (6, i)
4886 e_gamma_bb_gamma_bb_gamma_bb(ii) = e_gamma_bb_gamma_bb_gamma_bb(ii) + sc*w%v3sigma3 (10, i)
4887 e_gamma_bb_gamma_bb_laplace_rhoa(ii) = e_gamma_bb_gamma_bb_laplace_rhoa(ii) + sc*w%v3sigma2lapl (11, i)
4888 e_gamma_bb_gamma_bb_laplace_rhob(ii) = e_gamma_bb_gamma_bb_laplace_rhob(ii) + sc*w%v3sigma2lapl (12, i)
4889 e_gamma_bb_gamma_bb_tau_a(ii) = e_gamma_bb_gamma_bb_tau_a(ii) + sc*w%v3sigma2tau (11, i)
4890 e_gamma_bb_gamma_bb_tau_b(ii) = e_gamma_bb_gamma_bb_tau_b(ii) + sc*w%v3sigma2tau (12, i)
4891 e_gamma_bb_laplace_rhoa_laplace_rhoa(ii) = e_gamma_bb_laplace_rhoa_laplace_rhoa(ii) + sc*w%v3sigmalapl2 (7, i)
4892 e_gamma_bb_laplace_rhoa_laplace_rhob(ii) = e_gamma_bb_laplace_rhoa_laplace_rhob(ii) + sc*w%v3sigmalapl2 (8, i)
4893 e_gamma_bb_laplace_rhoa_tau_a(ii) = e_gamma_bb_laplace_rhoa_tau_a(ii) + sc*w%v3sigmalapltau (9, i)
4894 e_gamma_bb_laplace_rhoa_tau_b(ii) = e_gamma_bb_laplace_rhoa_tau_b(ii) + sc*w%v3sigmalapltau (10, i)
4895 e_gamma_bb_laplace_rhob_laplace_rhob(ii) = e_gamma_bb_laplace_rhob_laplace_rhob(ii) + sc*w%v3sigmalapl2 (9, i)
4896 e_gamma_bb_laplace_rhob_tau_a(ii) = e_gamma_bb_laplace_rhob_tau_a(ii) + sc*w%v3sigmalapltau (11, i)
4897 e_gamma_bb_laplace_rhob_tau_b(ii) = e_gamma_bb_laplace_rhob_tau_b(ii) + sc*w%v3sigmalapltau (12, i)
4898 e_gamma_bb_tau_a_tau_a(ii) = e_gamma_bb_tau_a_tau_a(ii) + sc*w%v3sigmatau2 (7, i)
4899 e_gamma_bb_tau_a_tau_b(ii) = e_gamma_bb_tau_a_tau_b(ii) + sc*w%v3sigmatau2 (8, i)
4900 e_gamma_bb_tau_b_tau_b(ii) = e_gamma_bb_tau_b_tau_b(ii) + sc*w%v3sigmatau2 (9, i)
4901 e_laplace_rhoa_laplace_rhoa_laplace_rhoa(ii) = e_laplace_rhoa_laplace_rhoa_laplace_rhoa(ii) + sc*w%v3lapl3 (1, i)
4902 e_laplace_rhoa_laplace_rhoa_laplace_rhob(ii) = e_laplace_rhoa_laplace_rhoa_laplace_rhob(ii) + sc*w%v3lapl3 (2, i)
4903 e_laplace_rhoa_laplace_rhoa_tau_a(ii) = e_laplace_rhoa_laplace_rhoa_tau_a(ii) + sc*w%v3lapl2tau (1, i)
4904 e_laplace_rhoa_laplace_rhoa_tau_b(ii) = e_laplace_rhoa_laplace_rhoa_tau_b(ii) + sc*w%v3lapl2tau (2, i)
4905 e_laplace_rhoa_laplace_rhob_laplace_rhob(ii) = e_laplace_rhoa_laplace_rhob_laplace_rhob(ii) + sc*w%v3lapl3 (3, i)
4906 e_laplace_rhoa_laplace_rhob_tau_a(ii) = e_laplace_rhoa_laplace_rhob_tau_a(ii) + sc*w%v3lapl2tau (3, i)
4907 e_laplace_rhoa_laplace_rhob_tau_b(ii) = e_laplace_rhoa_laplace_rhob_tau_b(ii) + sc*w%v3lapl2tau (4, i)
4908 e_laplace_rhoa_tau_a_tau_a(ii) = e_laplace_rhoa_tau_a_tau_a(ii) + sc*w%v3lapltau2 (1, i)
4909 e_laplace_rhoa_tau_a_tau_b(ii) = e_laplace_rhoa_tau_a_tau_b(ii) + sc*w%v3lapltau2 (2, i)
4910 e_laplace_rhoa_tau_b_tau_b(ii) = e_laplace_rhoa_tau_b_tau_b(ii) + sc*w%v3lapltau2 (3, i)
4911 e_laplace_rhob_laplace_rhob_laplace_rhob(ii) = e_laplace_rhob_laplace_rhob_laplace_rhob(ii) + sc*w%v3lapl3 (4, i)
4912 e_laplace_rhob_laplace_rhob_tau_a(ii) = e_laplace_rhob_laplace_rhob_tau_a(ii) + sc*w%v3lapl2tau (5, i)
4913 e_laplace_rhob_laplace_rhob_tau_b(ii) = e_laplace_rhob_laplace_rhob_tau_b(ii) + sc*w%v3lapl2tau (6, i)
4914 e_laplace_rhob_tau_a_tau_a(ii) = e_laplace_rhob_tau_a_tau_a(ii) + sc*w%v3lapltau2 (4, i)
4915 e_laplace_rhob_tau_a_tau_b(ii) = e_laplace_rhob_tau_a_tau_b(ii) + sc*w%v3lapltau2 (5, i)
4916 e_laplace_rhob_tau_b_tau_b(ii) = e_laplace_rhob_tau_b_tau_b(ii) + sc*w%v3lapltau2 (6, i)
4917 e_tau_a_tau_a_tau_a(ii) = e_tau_a_tau_a_tau_a(ii) + sc*w%v3tau3 (1, i)
4918 e_tau_a_tau_a_tau_b(ii) = e_tau_a_tau_a_tau_b(ii) + sc*w%v3tau3 (2, i)
4919 e_tau_a_tau_b_tau_b(ii) = e_tau_a_tau_b_tau_b(ii) + sc*w%v3tau3 (3, i)
4920 e_tau_b_tau_b_tau_b(ii) = e_tau_b_tau_b_tau_b(ii) + sc*w%v3tau3 (4, i)
4921 END DO
4922 END IF
4923 IF (grad_deriv >= 3 .AND. is_gga .AND. .NOT. is_mgga) THEN
4924 DO i = 1, nb
4925 ii = i0 + i
4926 e_rhoa_rhoa_gamma_aa(ii) = e_rhoa_rhoa_gamma_aa(ii) + sc*w%v3rho2sigma (1, i)
4927 e_rhoa_rhoa_gamma_ab(ii) = e_rhoa_rhoa_gamma_ab(ii) + sc*w%v3rho2sigma (2, i)
4928 e_rhoa_rhoa_gamma_bb(ii) = e_rhoa_rhoa_gamma_bb(ii) + sc*w%v3rho2sigma (3, i)
4929 e_rhoa_rhob_gamma_aa(ii) = e_rhoa_rhob_gamma_aa(ii) + sc*w%v3rho2sigma (4, i)
4930 e_rhoa_rhob_gamma_ab(ii) = e_rhoa_rhob_gamma_ab(ii) + sc*w%v3rho2sigma (5, i)
4931 e_rhoa_rhob_gamma_bb(ii) = e_rhoa_rhob_gamma_bb(ii) + sc*w%v3rho2sigma (6, i)
4932 e_rhoa_gamma_aa_gamma_aa(ii) = e_rhoa_gamma_aa_gamma_aa(ii) + sc*w%v3rhosigma2 (1, i)
4933 e_rhoa_gamma_aa_gamma_ab(ii) = e_rhoa_gamma_aa_gamma_ab(ii) + sc*w%v3rhosigma2 (2, i)
4934 e_rhoa_gamma_aa_gamma_bb(ii) = e_rhoa_gamma_aa_gamma_bb(ii) + sc*w%v3rhosigma2 (3, i)
4935 e_rhoa_gamma_ab_gamma_ab(ii) = e_rhoa_gamma_ab_gamma_ab(ii) + sc*w%v3rhosigma2 (4, i)
4936 e_rhoa_gamma_ab_gamma_bb(ii) = e_rhoa_gamma_ab_gamma_bb(ii) + sc*w%v3rhosigma2 (5, i)
4937 e_rhoa_gamma_bb_gamma_bb(ii) = e_rhoa_gamma_bb_gamma_bb(ii) + sc*w%v3rhosigma2 (6, i)
4938 e_rhob_rhob_gamma_aa(ii) = e_rhob_rhob_gamma_aa(ii) + sc*w%v3rho2sigma (7, i)
4939 e_rhob_rhob_gamma_ab(ii) = e_rhob_rhob_gamma_ab(ii) + sc*w%v3rho2sigma (8, i)
4940 e_rhob_rhob_gamma_bb(ii) = e_rhob_rhob_gamma_bb(ii) + sc*w%v3rho2sigma (9, i)
4941 e_rhob_gamma_aa_gamma_aa(ii) = e_rhob_gamma_aa_gamma_aa(ii) + sc*w%v3rhosigma2 (7, i)
4942 e_rhob_gamma_aa_gamma_ab(ii) = e_rhob_gamma_aa_gamma_ab(ii) + sc*w%v3rhosigma2 (8, i)
4943 e_rhob_gamma_aa_gamma_bb(ii) = e_rhob_gamma_aa_gamma_bb(ii) + sc*w%v3rhosigma2 (9, i)
4944 e_rhob_gamma_ab_gamma_ab(ii) = e_rhob_gamma_ab_gamma_ab(ii) + sc*w%v3rhosigma2 (10, i)
4945 e_rhob_gamma_ab_gamma_bb(ii) = e_rhob_gamma_ab_gamma_bb(ii) + sc*w%v3rhosigma2 (11, i)
4946 e_rhob_gamma_bb_gamma_bb(ii) = e_rhob_gamma_bb_gamma_bb(ii) + sc*w%v3rhosigma2 (12, i)
4947 e_gamma_aa_gamma_aa_gamma_aa(ii) = e_gamma_aa_gamma_aa_gamma_aa(ii) + sc*w%v3sigma3 (1, i)
4948 e_gamma_aa_gamma_aa_gamma_ab(ii) = e_gamma_aa_gamma_aa_gamma_ab(ii) + sc*w%v3sigma3 (2, i)
4949 e_gamma_aa_gamma_aa_gamma_bb(ii) = e_gamma_aa_gamma_aa_gamma_bb(ii) + sc*w%v3sigma3 (3, i)
4950 e_gamma_aa_gamma_ab_gamma_ab(ii) = e_gamma_aa_gamma_ab_gamma_ab(ii) + sc*w%v3sigma3 (4, i)
4951 e_gamma_aa_gamma_ab_gamma_bb(ii) = e_gamma_aa_gamma_ab_gamma_bb(ii) + sc*w%v3sigma3 (5, i)
4952 e_gamma_aa_gamma_bb_gamma_bb(ii) = e_gamma_aa_gamma_bb_gamma_bb(ii) + sc*w%v3sigma3 (6, i)
4953 e_gamma_ab_gamma_ab_gamma_ab(ii) = e_gamma_ab_gamma_ab_gamma_ab(ii) + sc*w%v3sigma3 (7, i)
4954 e_gamma_ab_gamma_ab_gamma_bb(ii) = e_gamma_ab_gamma_ab_gamma_bb(ii) + sc*w%v3sigma3 (8, i)
4955 e_gamma_ab_gamma_bb_gamma_bb(ii) = e_gamma_ab_gamma_bb_gamma_bb(ii) + sc*w%v3sigma3 (9, i)
4956 e_gamma_bb_gamma_bb_gamma_bb(ii) = e_gamma_bb_gamma_bb_gamma_bb(ii) + sc*w%v3sigma3 (10, i)
4957 END DO
4958 END IF
4959 END DO
4960!$OMP END DO
4961END associate
4962
4963END SUBROUTINE libxc_spin_polarized_calc
4964#endif
4965
4966END MODULE xc_libxc
static GRID_HOST_DEVICE int idx(const orbital a)
Return coset index of given orbital angular momentum.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public marques2012
integer, save, public lehtola2018
represents keywords in an input
subroutine, public keyword_release(keyword)
releases the given keyword (see doc/ReferenceCounting.html)
subroutine, public keyword_create(keyword, location, name, description, usage, type_of_var, n_var, repeats, variants, default_val, default_l_val, default_r_val, default_lc_val, default_c_val, default_i_val, default_l_vals, default_r_vals, default_c_vals, default_i_vals, lone_keyword_val, lone_keyword_l_val, lone_keyword_r_val, lone_keyword_c_val, lone_keyword_i_val, lone_keyword_l_vals, lone_keyword_r_vals, lone_keyword_c_vals, lone_keyword_i_vals, enum_c_vals, enum_i_vals, enum, enum_strict, enum_desc, unit_str, citations, deprecation_notice, removed)
creates a keyword object
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_create(section, location, name, description, n_keywords, n_subsections, repeats, citations, deprecation_notice)
creates a list of keywords
subroutine, public section_add_keyword(section, keyword)
adds a keyword to the given section
subroutine, public section_add_subsection(section, subsection)
adds a subsection to the given section
recursive subroutine, public section_release(section)
releases the given keyword list (see doc/ReferenceCounting.html)
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Module with functions to handle derivative descriptors. derivative description are strings have the f...
integer, parameter, public deriv_norm_drho
integer, parameter, public deriv_laplace_rhob
integer, parameter, public deriv_gamma
integer, parameter, public deriv_norm_drhoa
integer, parameter, public deriv_rhob
integer, parameter, public deriv_gamma_aa
integer, parameter, public deriv_rhoa
integer, parameter, public deriv_tau
integer, parameter, public deriv_tau_b
integer, parameter, public deriv_tau_a
integer, parameter, public deriv_laplace_rhoa
integer, parameter, public deriv_rho
integer, parameter, public deriv_gamma_bb
integer, parameter, public deriv_norm_drhob
integer, parameter, public deriv_gamma_ab
integer, parameter, public deriv_laplace_rho
represent a group ofunctional derivatives
type(xc_derivative_type) function, pointer, public xc_dset_get_derivative(derivative_set, description, allocate_deriv)
returns the requested xc_derivative
Provides types for the management of the xc-functionals and their derivatives.
subroutine, public xc_derivative_get(deriv, split_desc, order, deriv_data, accept_null_data)
returns various information on the given derivative
Includes all necessary routines, functions and parameters from libxc. Provides CP2K routines/function...
calculates a functional from libxc and its derivatives
Definition xc_libxc.F:29
subroutine, public libxc_spin_unpolarized_info(libxc_params, reference, shortform, needs, max_deriv, print_warn, func_name_override)
info about the functional from libxc
Definition xc_libxc.F:373
subroutine, public libxc_spin_unpolarized_eval(rho_set, deriv_set, grad_deriv, libxc_params, func_name_override)
evaluates the functional from libxc
Definition xc_libxc.F:887
subroutine, public libxc_spin_polarized_info(libxc_params, reference, shortform, needs, max_deriv, print_warn, func_name_override)
info about the functional from libxc
Definition xc_libxc.F:487
subroutine, public libxc_release_workers()
Reads the external parameters of a LibXC functional from its input section.
Definition xc_libxc.F:851
subroutine, public libxc_spin_polarized_eval(rho_set, deriv_set, grad_deriv, libxc_params, func_name_override)
evaluates the functional from libxc
Definition xc_libxc.F:1449
subroutine, public libxc_version_info(version, compiled_version)
info about the LibXC version
Definition xc_libxc.F:596
subroutine, public libxc_add_sections(section)
...
Definition xc_libxc.F:267
logical function, public libxc_check_existence_in_libxc(libxc_params)
This function checks whether a functional name belongs to LibXC.
Definition xc_libxc.F:197
integer function, public libxc_get_reference_length(libxc_params, lsd)
This function returns the maximum length of the reference string for a given LibXC functional.
Definition xc_libxc.F:223
subroutine, public libxc_library_reference(reference, doi)
Returns the citation LibXC asks for the library itself.
Definition xc_libxc.F:616
contains the structure
contains the structure
subroutine, public xc_rho_set_get(rho_set, can_return_null, rho, drho, norm_drho, rhoa, rhob, norm_drhoa, norm_drhob, rho_1_3, rhoa_1_3, rhob_1_3, laplace_rho, laplace_rhoa, laplace_rhob, drhoa, drhob, rho_cutoff, drho_cutoff, tau_cutoff, tau, tau_a, tau_b, local_bounds)
returns the various attributes of rho_set
represent a keyword in the input
represent a section of the input file
A derivative set contains the different derivatives of a xc-functional in form of a linked list.
represent a derivative of a functional
contains a flag for each component of xc_rho_set, so that you can use it to tell which components you...
represent a density, with all the representation and data needed to perform a functional evaluation