52 USE iso_c_binding,
ONLY: c_size_t, c_int, c_double
61 xc_f03_functional_get_name, &
62 xc_f03_func_get_info, &
63 xc_f03_func_info_get_family, &
64 xc_f03_func_info_get_kind, &
65 xc_f03_func_info_get_n_ext_params, &
66 xc_f03_func_info_get_name, &
67 xc_f03_available_functional_numbers, &
68 xc_f03_available_functional_names, &
69 xc_f03_maximum_name_length, &
70 xc_f03_number_of_functionals, &
71 xc_f03_func_info_get_ext_params_name, &
72 xc_f03_func_info_get_ext_params_description, &
73 xc_f03_func_info_get_ext_params_default_value, &
76 xc_f03_gga_exc_vxc_fxc, &
83 xc_f03_lda_exc_vxc_fxc, &
89 xc_f03_mgga_exc_vxc, &
92 xc_f03_mgga_vxc_fxc, &
100 xc_family_hyb_mgga, &
103 xc_exchange_correlation, &
105 xc_libxc_wrap_info_refs, &
106 xc_libxc_wrap_version, &
107 xc_libxc_wrap_library_reference, &
108 xc_libxc_wrap_functional_get_number, &
109 xc_libxc_wrap_info_needs_laplace, &
110 xc_libxc_wrap_info_no_exc, &
111 xc_libxc_wrap_set_thresholds, &
112 xc_f03_func_set_ext_params, &
113 xc_libxc_wrap_is_under_development, &
114 xc_libxc_get_reference_length, &
115 xc_libxc_check_functional
121#include "../base/base_uses.f90"
126 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xc_libxc'
142 INTEGER,
PARAMETER,
PRIVATE :: libxc_block_size = 512
149 TYPE libxc_worker_type
150 TYPE(xc_f03_func_t) :: func = xc_f03_func_t()
151 TYPE(xc_f03_func_info_t) :: info = xc_f03_func_info_t()
152 LOGICAL :: is_init = .false.
154 REAL(KIND=
dp),
DIMENSION(:, :),
ALLOCATABLE :: rho, sigma, lapl, tau
156 REAL(KIND=
dp),
DIMENSION(:),
ALLOCATABLE :: nd, nda, ndb
157 REAL(KIND=
dp),
DIMENSION(:),
ALLOCATABLE :: exc
158 REAL(KIND=
dp),
DIMENSION(:, :),
ALLOCATABLE :: vrho, vsigma, vlapl, vtau
159 REAL(KIND=
dp),
DIMENSION(:, :),
ALLOCATABLE :: v2rho2, v2rhosigma, v2sigma2, &
160 v2rholapl, v2rhotau, v2sigmalapl, &
161 v2sigmatau, v2lapl2, v2lapltau, v2tau2
162 REAL(KIND=
dp),
DIMENSION(:, :),
ALLOCATABLE :: v3rho3
163 END TYPE libxc_worker_type
169 TYPE libxc_worker_set_type
170 INTEGER :: func_id = -1
171 INTEGER :: nspin = -1
172 INTEGER :: family = -1
173 LOGICAL :: has_laplace = .false.
174 LOGICAL :: no_exc = .false.
175 LOGICAL :: has_params = .false.
176 REAL(KIND=
dp) :: epsilon_rho = -1.0_dp
177 REAL(KIND=
dp) :: epsilon_tau = -1.0_dp
178 REAL(KIND=
dp),
DIMENSION(:),
ALLOCATABLE :: params
179 CHARACTER(LEN=128),
DIMENSION(:),
ALLOCATABLE :: param_names
180 TYPE(libxc_worker_type),
DIMENSION(:),
ALLOCATABLE :: worker
181 END TYPE libxc_worker_set_type
185 TYPE(libxc_worker_set_type),
DIMENSION(:),
ALLOCATABLE,
TARGET,
PRIVATE,
SAVE :: libxc_cache
193 REAL(KIND=
dp),
DIMENSION(:),
ALLOCATABLE,
TARGET,
PRIVATE,
SAVE :: libxc_unused
210 exists = xc_libxc_check_functional(libxc_params%section%name)
212 mark_used(libxc_params)
227 LOGICAL,
INTENT(IN) :: lsd
231 CHARACTER(len=*),
PARAMETER :: routinen =
'libxc_get_reference_length'
233 CHARACTER(LEN=default_string_length) :: func_name
234 INTEGER :: func_id, handle
235 TYPE(xc_f03_func_t) :: xc_func
236 TYPE(xc_f03_func_info_t) :: xc_info
238 CALL timeset(routinen, handle)
240 func_name = libxc_params%section%name
242 func_id = xc_libxc_wrap_functional_get_number(func_name)
244 CALL xc_f03_func_init(xc_func, func_id, xc_polarized)
246 CALL xc_f03_func_init(xc_func, func_id, xc_unpolarized)
248 xc_info = xc_f03_func_get_info(xc_func)
250 length = xc_libxc_get_reference_length(xc_info)
252 CALL xc_f03_func_end(xc_func)
254 CALL timestop(handle)
256 mark_used(libxc_params)
259 cpabort(
"In order to use LibXC you have to download and install it!")
273 CHARACTER(len=*),
PARAMETER :: routinen =
'libxc_add_sections'
277 INTEGER :: handle, no_func, len_name, ii, func_id, n_param, iparam
278 REAL(kind=c_double) :: default_val
279 CHARACTER(LEN=128) :: func_name, param_name, param_descr, description
280 CHARACTER(LEN=2*default_string_length) :: warning
281 INTEGER(KIND=C_INT),
DIMENSION(:),
ALLOCATABLE :: func_ids
282 TYPE(xc_f03_func_t) :: xc_func
283 TYPE(xc_f03_func_info_t) :: xc_info
285 CALL timeset(routinen, handle)
287 cpassert(
ASSOCIATED(section))
288 NULLIFY (subsection, keyword)
290 no_func = xc_f03_number_of_functionals()
291 len_name = xc_f03_maximum_name_length()
293 ALLOCATE (func_ids(no_func))
295 CALL xc_f03_available_functional_numbers(func_ids)
299 func_id = func_ids(ii)
301 IF (func_id == func_ids(ii - 1)) cycle
303 CALL xc_f03_func_init(xc_func, func_id, xc_unpolarized)
304 xc_info = xc_f03_func_get_info(xc_func)
306 func_name = xc_f03_functional_get_name(func_id)
307 description = xc_f03_func_info_get_name(xc_info)
308 n_param = xc_f03_func_info_get_n_ext_params(xc_info)
311 CALL section_create(subsection, __location__, name=trim(func_name), description=trim(description), &
312 n_keywords=2 + n_param, n_subsections=0, repeats=.false.)
314 IF (description(1:1) ==
"_")
THEN
315 warning =
" This parameter is an internal parameter of the functional. Changing this "// &
316 "parameter effectively changes the functional."
322 CALL keyword_create(keyword, __location__, name=
"_SECTION_PARAMETERS_", &
323 description=
"Activates the functional."//trim(warning), &
324 lone_keyword_l_val=.true., default_l_val=.false.)
328 CALL keyword_create(keyword, __location__, name=
"SCALE", description=
"Scales this functional", &
329 default_r_val=1.0_dp)
333 DO iparam = 1, n_param
334 param_name = xc_f03_func_info_get_ext_params_name(xc_info, iparam - 1)
335 param_descr = xc_f03_func_info_get_ext_params_description(xc_info, iparam - 1)
336 default_val = xc_f03_func_info_get_ext_params_default_value(xc_info, iparam - 1)
338 CALL keyword_create(keyword, __location__, name=trim(param_name), &
339 description=trim(param_descr), default_r_val=default_val)
347 CALL xc_f03_func_end(xc_func)
351 DEALLOCATE (func_ids)
353 CALL timestop(handle)
377 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: reference, shortform
379 INTENT(inout),
OPTIONAL :: needs
380 INTEGER,
INTENT(out),
OPTIONAL :: max_deriv
381 LOGICAL,
INTENT(IN),
OPTIONAL :: print_warn
382 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: func_name_override
385 CHARACTER(LEN=128) :: s1, s2
386 CHARACTER(LEN=default_string_length) :: func_name
388 REAL(kind=
dp) :: func_scale
389 TYPE(xc_f03_func_t) :: xc_func
390 TYPE(xc_f03_func_info_t) :: xc_info
392 IF (
PRESENT(func_name_override))
THEN
393 func_name = func_name_override
396 func_name = libxc_params%section%name
403 IF (abs(func_scale - 1.0_dp) < 1.0e-10_dp) func_scale = 1.0_dp
405 func_id = xc_libxc_wrap_functional_get_number(func_name)
406 CALL xc_f03_func_init(xc_func, func_id, xc_unpolarized)
407 xc_info = xc_f03_func_get_info(xc_func)
409 s1 = xc_f03_func_info_get_name(xc_info)
410 SELECT CASE (xc_f03_func_info_get_kind(xc_info))
411 CASE (xc_exchange);
WRITE (s2,
'(a)')
"exchange"
412 CASE (xc_correlation);
WRITE (s2,
'(a)')
"correlation"
413 CASE (xc_exchange_correlation);
WRITE (s2,
'(a)')
"exchange-correlation"
414 CASE (xc_kinetic);
WRITE (s2,
'(a)')
"kinetic"
416 cpabort(trim(func_name)//
": this XC_KIND is currently not supported.")
418 IF (
PRESENT(shortform))
THEN
419 shortform = trim(s1)//
' ('//trim(s2)//
')'
421 IF (
PRESENT(reference))
THEN
422 CALL xc_libxc_wrap_info_refs(xc_info, xc_unpolarized, func_scale, reference)
424 IF (
PRESENT(needs))
THEN
425 SELECT CASE (xc_f03_func_info_get_family(xc_info))
426 CASE (xc_family_lda, xc_family_hyb_lda)
428 CASE (xc_family_gga, xc_family_hyb_gga)
430 needs%norm_drho = .true.
431 CASE (xc_family_mgga, xc_family_hyb_mgga)
433 needs%norm_drho = .true.
435 needs%laplace_rho = xc_libxc_wrap_info_needs_laplace(xc_info)
437 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
440 IF (
PRESENT(max_deriv))
THEN
441 SELECT CASE (xc_f03_func_info_get_family(xc_info))
442 CASE (xc_family_lda, xc_family_hyb_lda)
444 CASE (xc_family_gga, xc_family_hyb_gga)
446 CASE (xc_family_mgga, xc_family_hyb_mgga)
449 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
452 IF (
PRESENT(print_warn))
THEN
453 IF (print_warn .AND. xc_libxc_wrap_is_under_development(xc_info))
THEN
454 cpwarn(trim(func_name)//
" is under development. Use with caution.")
458 CALL xc_f03_func_end(xc_func)
460 mark_used(libxc_params)
465 mark_used(print_warn)
466 mark_used(func_name_override)
468 CALL cp_abort(__location__,
"Unknown functional! If you are asking "// &
469 "for a functional of the LibXC library, "// &
470 "you have to download and install the library!")
491 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: reference, shortform
493 INTENT(inout),
OPTIONAL :: needs
494 INTEGER,
INTENT(out),
OPTIONAL :: max_deriv
495 LOGICAL,
INTENT(IN),
OPTIONAL :: print_warn
496 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: func_name_override
499 CHARACTER(LEN=128) :: s1, s2
500 CHARACTER(LEN=default_string_length) :: func_name
502 REAL(kind=
dp) :: func_scale
503 TYPE(xc_f03_func_t) :: xc_func
504 TYPE(xc_f03_func_info_t) :: xc_info
506 IF (
PRESENT(func_name_override))
THEN
507 func_name = func_name_override
510 func_name = libxc_params%section%name
517 IF (abs(func_scale - 1.0_dp) < 1.0e-10_dp) func_scale = 1.0_dp
519 func_id = xc_libxc_wrap_functional_get_number(func_name)
520 CALL xc_f03_func_init(xc_func, func_id, xc_polarized)
521 xc_info = xc_f03_func_get_info(xc_func)
523 s1 = xc_f03_func_info_get_name(xc_info)
524 SELECT CASE (xc_f03_func_info_get_kind(xc_info))
525 CASE (xc_exchange);
WRITE (s2,
'(a)')
"exchange"
526 CASE (xc_correlation);
WRITE (s2,
'(a)')
"correlation"
527 CASE (xc_exchange_correlation);
WRITE (s2,
'(a)')
"exchange-correlation"
528 CASE (xc_kinetic);
WRITE (s2,
'(a)')
"kinetic"
530 cpabort(trim(func_name)//
": this XC_KIND is currently not supported.")
532 IF (
PRESENT(shortform))
THEN
533 shortform = trim(s1)//
' ('//trim(s2)//
')'
535 IF (
PRESENT(reference))
THEN
536 CALL xc_libxc_wrap_info_refs(xc_info, xc_polarized, func_scale, reference)
538 IF (
PRESENT(needs))
THEN
539 SELECT CASE (xc_f03_func_info_get_family(xc_info))
540 CASE (xc_family_lda, xc_family_hyb_lda)
541 needs%rho_spin = .true.
542 CASE (xc_family_gga, xc_family_hyb_gga)
543 needs%rho_spin = .true.
544 needs%norm_drho = .true.
545 needs%norm_drho_spin = .true.
546 CASE (xc_family_mgga, xc_family_hyb_mgga)
547 needs%rho_spin = .true.
548 needs%norm_drho = .true.
549 needs%norm_drho_spin = .true.
550 needs%tau_spin = .true.
551 needs%laplace_rho_spin = xc_libxc_wrap_info_needs_laplace(xc_info)
553 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
556 IF (
PRESENT(max_deriv))
THEN
557 SELECT CASE (xc_f03_func_info_get_family(xc_info))
558 CASE (xc_family_lda, xc_family_hyb_lda)
560 CASE (xc_family_gga, xc_family_hyb_gga)
562 CASE (xc_family_mgga, xc_family_hyb_mgga)
565 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
568 IF (
PRESENT(print_warn))
THEN
569 IF (print_warn .AND. xc_libxc_wrap_is_under_development(xc_info))
THEN
570 cpwarn(trim(func_name)//
" is under development. Use with caution.")
574 CALL xc_f03_func_end(xc_func)
576 mark_used(libxc_params)
581 mark_used(print_warn)
582 mark_used(func_name_override)
584 CALL cp_abort(__location__,
"Unknown functional! If you are "// &
585 "asking for a functional of the LibXC library, "// &
586 "you have to download and install the library!")
598 CHARACTER(LEN=*),
INTENT(OUT) :: version
599 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: compiled_version
602 CALL xc_libxc_wrap_version(version, compiled_version)
605 IF (
PRESENT(compiled_version)) compiled_version =
"none"
606 cpabort(
"In order to use libxc you need to download and install it")
618 CHARACTER(LEN=*),
INTENT(OUT) :: reference, doi
621 CALL xc_libxc_wrap_library_reference(reference, doi)
625 cpabort(
"In order to use libxc you need to download and install it")
638 SUBROUTINE libxc_read_params(libxc_params, param_names, params)
640 CHARACTER(LEN=128),
DIMENSION(:),
INTENT(IN) :: param_names
641 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: params
645 DO i = 1,
SIZE(param_names)
649 END SUBROUTINE libxc_read_params
661 SUBROUTINE libxc_worker_alloc(worker, family, nspin)
662 TYPE(libxc_worker_type),
INTENT(INOUT) :: worker
663 INTEGER,
INTENT(IN) :: family, nspin
665 INTEGER :: nb, nl, np, ns
667 nb = libxc_block_size
669 IF (nspin == xc_polarized)
THEN
679 ALLOCATE (worker%rho(np, nb))
680 ALLOCATE (worker%exc(nb))
681 ALLOCATE (worker%vrho(np, nb))
682 ALLOCATE (worker%v2rho2(ns, nb))
683 ALLOCATE (worker%v3rho3(nl, nb))
686 CASE (xc_family_gga, xc_family_hyb_gga, xc_family_mgga, xc_family_hyb_mgga)
687 ALLOCATE (worker%sigma(ns, nb))
688 ALLOCATE (worker%vsigma(ns, nb))
689 IF (nspin == xc_polarized)
THEN
690 ALLOCATE (worker%nd(nb), worker%nda(nb), worker%ndb(nb))
692 ALLOCATE (worker%v2rhosigma(merge(6, 1, nspin == xc_polarized), nb))
693 ALLOCATE (worker%v2sigma2(merge(6, 1, nspin == xc_polarized), nb))
697 CASE (xc_family_mgga, xc_family_hyb_mgga)
698 ALLOCATE (worker%lapl(np, nb))
699 ALLOCATE (worker%tau(np, nb))
700 ALLOCATE (worker%vlapl(np, nb))
701 ALLOCATE (worker%vtau(np, nb))
702 ALLOCATE (worker%v2rholapl(nl, nb))
703 ALLOCATE (worker%v2rhotau(nl, nb))
704 ALLOCATE (worker%v2sigmalapl(merge(6, 1, nspin == xc_polarized), nb))
705 ALLOCATE (worker%v2sigmatau(merge(6, 1, nspin == xc_polarized), nb))
706 ALLOCATE (worker%v2lapl2(ns, nb))
707 ALLOCATE (worker%v2lapltau(nl, nb))
708 ALLOCATE (worker%v2tau2(ns, nb))
712 worker%vlapl = 0.0_dp
715 END SUBROUTINE libxc_worker_alloc
722 SUBROUTINE libxc_reserve_unused(npoints)
723 INTEGER,
INTENT(IN) :: npoints
725 IF (
ALLOCATED(libxc_unused))
THEN
726 IF (
SIZE(libxc_unused) >= npoints)
RETURN
727 DEALLOCATE (libxc_unused)
729 ALLOCATE (libxc_unused(npoints))
731 END SUBROUTINE libxc_reserve_unused
746 FUNCTION libxc_get_workers(func_name, nspin, libxc_params, epsilon_rho, epsilon_tau)
RESULT(idx)
747 CHARACTER(LEN=*),
INTENT(IN) :: func_name
748 INTEGER,
INTENT(IN) :: nspin
750 REAL(kind=
dp),
INTENT(IN) :: epsilon_rho, epsilon_tau
753 CHARACTER(LEN=*),
PARAMETER :: routinen =
'libxc_get_workers'
755 INTEGER :: func_id, handle, i, ithread, n_params, &
757 LOGICAL :: has_params
758 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: params
759 TYPE(libxc_worker_set_type),
ALLOCATABLE, &
760 DIMENSION(:) :: tmp_cache
762 CALL timeset(routinen, handle)
764 func_id = xc_libxc_wrap_functional_get_number(func_name)
765 has_params =
ASSOCIATED(libxc_params)
770 IF (.NOT.
ALLOCATED(libxc_cache))
ALLOCATE (libxc_cache(0))
773 DO i = 1,
SIZE(libxc_cache)
774 IF (libxc_cache(i)%func_id == func_id .AND. &
775 libxc_cache(i)%nspin == nspin .AND. &
776 (libxc_cache(i)%has_params .EQV. has_params))
THEN
777 IF (libxc_cache(i)%epsilon_rho == epsilon_rho .AND. &
778 libxc_cache(i)%epsilon_tau == epsilon_tau .AND. &
779 SIZE(libxc_cache(i)%worker) >= nthreads)
THEN
788 CALL move_alloc(libxc_cache, tmp_cache)
789 ALLOCATE (libxc_cache(
SIZE(tmp_cache) + 1))
790 DO i = 1,
SIZE(tmp_cache)
791 CALL libxc_move_worker_set(tmp_cache(i), libxc_cache(i))
793 DEALLOCATE (tmp_cache)
794 idx =
SIZE(libxc_cache)
796 associate(ws => libxc_cache(
idx))
799 ws%has_params = has_params
800 ws%epsilon_rho = epsilon_rho
801 ws%epsilon_tau = epsilon_tau
802 ALLOCATE (ws%worker(nthreads))
804 DO ithread = 1, nthreads
805 CALL xc_f03_func_init(ws%worker(ithread)%func, func_id, nspin)
806 ws%worker(ithread)%info = xc_f03_func_get_info(ws%worker(ithread)%func)
807 ws%worker(ithread)%is_init = .true.
810 ws%family = xc_f03_func_info_get_family(ws%worker(1)%info)
811 ws%has_laplace = xc_libxc_wrap_info_needs_laplace(ws%worker(1)%info)
812 ws%no_exc = xc_libxc_wrap_info_no_exc(ws%worker(1)%info)
817 IF (has_params) n_params = xc_f03_func_info_get_n_ext_params(ws%worker(1)%info)
818 ALLOCATE (ws%params(n_params))
819 ALLOCATE (ws%param_names(n_params))
821 ws%param_names(i) = xc_f03_func_info_get_ext_params_name(ws%worker(1)%info, i - 1)
823 IF (n_params > 0)
THEN
824 CALL libxc_read_params(libxc_params, ws%param_names, ws%params)
825 DO ithread = 1, nthreads
826 CALL xc_f03_func_set_ext_params(ws%worker(ithread)%func, ws%params)
830 DO ithread = 1, nthreads
831 CALL xc_libxc_wrap_set_thresholds(ws%worker(ithread)%func, ws%worker(ithread)%info, &
832 epsilon_rho, epsilon_tau)
833 CALL libxc_worker_alloc(ws%worker(ithread), ws%family, nspin)
840 associate(ws => libxc_cache(
idx))
841 n_params =
SIZE(ws%params)
842 IF (n_params > 0)
THEN
843 ALLOCATE (params(n_params))
844 CALL libxc_read_params(libxc_params, ws%param_names, params)
845 IF (any(params /= ws%params))
THEN
846 ws%params(:) = params(:)
847 DO ithread = 1,
SIZE(ws%worker)
848 CALL xc_f03_func_set_ext_params(ws%worker(ithread)%func, ws%params)
852 CALL xc_libxc_wrap_set_thresholds(ws%worker(ithread)%func, &
853 ws%worker(ithread)%info, &
854 ws%epsilon_rho, ws%epsilon_tau)
862 CALL timestop(handle)
864 END FUNCTION libxc_get_workers
874 SUBROUTINE libxc_move_worker_set(from, to)
875 TYPE(libxc_worker_set_type),
INTENT(INOUT) :: from, to
877 to%func_id = from%func_id
878 to%nspin = from%nspin
879 to%family = from%family
880 to%has_laplace = from%has_laplace
881 to%no_exc = from%no_exc
882 to%has_params = from%has_params
883 to%epsilon_rho = from%epsilon_rho
884 to%epsilon_tau = from%epsilon_tau
885 IF (
ALLOCATED(from%params))
CALL move_alloc(from%params, to%params)
886 IF (
ALLOCATED(from%param_names))
CALL move_alloc(from%param_names, to%param_names)
887 IF (
ALLOCATED(from%worker))
CALL move_alloc(from%worker, to%worker)
889 END SUBROUTINE libxc_move_worker_set
901 INTEGER :: i, ithread
903 IF (.NOT.
ALLOCATED(libxc_cache))
RETURN
905 DO i = 1,
SIZE(libxc_cache)
906 IF (.NOT.
ALLOCATED(libxc_cache(i)%worker)) cycle
907 DO ithread = 1,
SIZE(libxc_cache(i)%worker)
908 IF (libxc_cache(i)%worker(ithread)%is_init)
THEN
909 CALL xc_f03_func_end(libxc_cache(i)%worker(ithread)%func)
910 libxc_cache(i)%worker(ithread)%is_init = .false.
914 DEALLOCATE (libxc_cache)
915 IF (
ALLOCATED(libxc_unused))
DEALLOCATE (libxc_unused)
934 TYPE(xc_rho_set_type),
INTENT(IN) :: rho_set
935 TYPE(xc_derivative_set_type),
INTENT(IN) :: deriv_set
936 INTEGER,
INTENT(in) :: grad_deriv
937 TYPE(section_vals_type),
POINTER :: libxc_params
938 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: func_name_override
941 CHARACTER(len=*),
PARAMETER :: routinen =
'libxc_spin_unpolarized_eval'
943 CHARACTER(LEN=default_string_length) :: func_name
944 INTEGER :: handle, iw, npoints
945 INTEGER,
DIMENSION(2, 3) :: bo
946 LOGICAL :: has_laplace
947 REAL(kind=dp) :: epsilon_rho, epsilon_tau, func_scale
948 TYPE(libxc_worker_set_type),
POINTER :: workers
949 TYPE(section_vals_type),
POINTER :: no_params
950 REAL(kind=dp),
CONTIGUOUS,
DIMENSION(:, :, :),
POINTER :: dummy, e_0, e_laplace_rho, &
951 e_laplace_rho_laplace_rho, e_laplace_rho_tau, e_ndrho, &
952 e_ndrho_laplace_rho, e_ndrho_ndrho, e_ndrho_rho, e_ndrho_tau, e_rho, &
953 e_rho_laplace_rho, e_rho_rho, e_rho_rho_rho, e_rho_tau, e_tau, &
954 e_tau_tau, laplace_rho, norm_drho, rho, tau
955 TYPE(xc_derivative_type),
POINTER :: deriv
956 TYPE(xc_f03_func_info_t) :: xc_info
958 CALL timeset(routinen, handle)
963 IF (grad_deriv < 0)
THEN
964 cpabort(
"Evaluating a single derivative order is not supported.")
966 IF (grad_deriv > 3)
THEN
967 cpabort(
"derivatives larger than 3 not implemented")
970 has_laplace = .false.
973 NULLIFY (rho, norm_drho, laplace_rho, tau)
975 IF (
PRESENT(func_name_override))
THEN
976 func_name = func_name_override
979 func_name = libxc_params%section%name
980 CALL section_vals_val_get(libxc_params,
"scale", r_val=func_scale)
983 IF (abs(func_scale - 1.0_dp) < 1.0e-10_dp) func_scale = 1.0_dp
985 CALL xc_rho_set_get(rho_set, can_return_null=.true., &
986 rho=rho, norm_drho=norm_drho, laplace_rho=laplace_rho, &
987 rho_cutoff=epsilon_rho, tau_cutoff=epsilon_tau, &
988 tau=tau, local_bounds=bo)
990 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
994 IF (
PRESENT(func_name_override))
THEN
997 iw = libxc_get_workers(func_name, xc_unpolarized, no_params, epsilon_rho, epsilon_tau)
999 iw = libxc_get_workers(func_name, xc_unpolarized, libxc_params, epsilon_rho, epsilon_tau)
1001 workers => libxc_cache(iw)
1002 xc_info = workers%worker(1)%info
1003 has_laplace = workers%has_laplace
1007 CALL libxc_reserve_unused(npoints)
1008 dummy(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)) => libxc_unused(1:npoints)
1011 IF (.NOT.
ASSOCIATED(norm_drho)) norm_drho => rho
1012 IF (.NOT.
ASSOCIATED(tau)) tau => rho
1016 IF (.NOT. has_laplace) laplace_rho => rho
1021 e_laplace_rho => dummy
1024 e_ndrho_rho => dummy
1025 e_ndrho_ndrho => dummy
1026 e_rho_laplace_rho => dummy
1028 e_ndrho_laplace_rho => dummy
1029 e_ndrho_tau => dummy
1030 e_laplace_rho_laplace_rho => dummy
1031 e_laplace_rho_tau => dummy
1033 e_rho_rho_rho => dummy
1035 IF (grad_deriv >= 0)
THEN
1036 deriv => xc_dset_get_derivative(deriv_set, [
INTEGER::], &
1037 allocate_deriv=.true.)
1038 CALL xc_derivative_get(deriv, deriv_data=e_0)
1040 IF (grad_deriv >= 1)
THEN
1041 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1042 CASE (xc_family_lda, xc_family_hyb_lda)
1043 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho], &
1044 allocate_deriv=.true.)
1045 CALL xc_derivative_get(deriv, deriv_data=e_rho)
1046 CASE (xc_family_gga, xc_family_hyb_gga)
1047 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho], &
1048 allocate_deriv=.true.)
1049 CALL xc_derivative_get(deriv, deriv_data=e_rho)
1050 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
1051 allocate_deriv=.true.)
1052 CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
1053 CASE (xc_family_mgga, xc_family_hyb_mgga)
1054 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho], &
1055 allocate_deriv=.true.)
1056 CALL xc_derivative_get(deriv, deriv_data=e_rho)
1057 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
1058 allocate_deriv=.true.)
1059 CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
1060 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau], &
1061 allocate_deriv=.true.)
1062 CALL xc_derivative_get(deriv, deriv_data=e_tau)
1063 IF (has_laplace)
THEN
1064 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rho], &
1065 allocate_deriv=.true.)
1066 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho)
1069 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
1072 IF (grad_deriv >= 2)
THEN
1073 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1074 CASE (xc_family_lda, xc_family_hyb_lda)
1075 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho], &
1076 allocate_deriv=.true.)
1077 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho)
1078 CASE (xc_family_gga, xc_family_hyb_gga)
1079 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho], &
1080 allocate_deriv=.true.)
1081 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho)
1082 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rho], &
1083 allocate_deriv=.true.)
1084 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rho)
1085 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drho], &
1086 allocate_deriv=.true.)
1087 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
1088 CASE (xc_family_mgga, xc_family_hyb_mgga)
1091 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho], &
1092 allocate_deriv=.true.)
1093 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho)
1094 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rho], &
1095 allocate_deriv=.true.)
1096 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rho)
1097 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drho], &
1098 allocate_deriv=.true.)
1099 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
1100 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_tau], &
1101 allocate_deriv=.true.)
1102 CALL xc_derivative_get(deriv, deriv_data=e_rho_tau)
1103 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_tau], &
1104 allocate_deriv=.true.)
1105 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_tau)
1106 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau, deriv_tau], &
1107 allocate_deriv=.true.)
1108 CALL xc_derivative_get(deriv, deriv_data=e_tau_tau)
1109 IF (has_laplace)
THEN
1110 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_laplace_rho], &
1111 allocate_deriv=.true.)
1112 CALL xc_derivative_get(deriv, deriv_data=e_rho_laplace_rho)
1113 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_laplace_rho], &
1114 allocate_deriv=.true.)
1115 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_laplace_rho)
1116 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rho, deriv_laplace_rho], &
1117 allocate_deriv=.true.)
1118 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_laplace_rho)
1119 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rho, deriv_tau], &
1120 allocate_deriv=.true.)
1121 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rho_tau)
1124 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
1127 IF (grad_deriv >= 3)
THEN
1128 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1129 CASE (xc_family_lda, xc_family_hyb_lda)
1130 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho, deriv_rho], &
1131 allocate_deriv=.true.)
1132 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_rho)
1133 CASE (xc_family_gga, xc_family_hyb_gga, xc_family_mgga, xc_family_hyb_mgga)
1134 cpabort(
"derivatives larger than 2 not implemented")
1136 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
1148 CALL libxc_spin_unpolarized_calc(rho=rho, norm_drho=norm_drho, &
1149 laplace_rho=laplace_rho, tau=tau, &
1150 e_0=e_0, e_rho=e_rho, e_ndrho=e_ndrho, e_laplace_rho=e_laplace_rho, &
1151 e_tau=e_tau, e_rho_rho=e_rho_rho, e_ndrho_rho=e_ndrho_rho, &
1152 e_ndrho_ndrho=e_ndrho_ndrho, e_rho_laplace_rho=e_rho_laplace_rho, &
1153 e_rho_tau=e_rho_tau, e_ndrho_laplace_rho=e_ndrho_laplace_rho, &
1154 e_ndrho_tau=e_ndrho_tau, e_laplace_rho_laplace_rho=e_laplace_rho_laplace_rho, &
1155 e_laplace_rho_tau=e_laplace_rho_tau, e_tau_tau=e_tau_tau, &
1156 e_rho_rho_rho=e_rho_rho_rho, &
1157 grad_deriv=grad_deriv, npoints=npoints, &
1158 func_name=func_name, sc=func_scale, workers=workers)
1165 CALL timestop(handle)
1168 mark_used(deriv_set)
1169 mark_used(grad_deriv)
1170 mark_used(libxc_params)
1171 mark_used(func_name_override)
1172 CALL cp_abort(__location__,
"Unknown functional! If you are asking "// &
1173 "for a functional of the LibXC library, "// &
1174 "you have to download and install the library!")
1192 TYPE(xc_rho_set_type),
INTENT(IN) :: rho_set
1193 TYPE(xc_derivative_set_type),
INTENT(IN) :: deriv_set
1194 INTEGER,
INTENT(in) :: grad_deriv
1195 TYPE(section_vals_type),
POINTER :: libxc_params
1196 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: func_name_override
1198#if defined (__LIBXC)
1199 CHARACTER(len=*),
PARAMETER :: routinen =
'libxc_spin_polarized_eval'
1201 CHARACTER(LEN=default_string_length) :: func_name
1202 INTEGER :: handle, iw, npoints
1203 INTEGER,
DIMENSION(2, 3) :: bo
1204 LOGICAL :: has_laplace
1205 REAL(kind=dp) :: epsilon_rho, epsilon_tau, func_scale
1206 TYPE(libxc_worker_set_type),
POINTER :: workers
1207 TYPE(section_vals_type),
POINTER :: no_params
1208 REAL(kind=dp),
CONTIGUOUS,
DIMENSION(:, :, :),
POINTER :: dummy, e_0, e_laplace_rhoa, &
1209 e_laplace_rhoa_laplace_rhoa, e_laplace_rhoa_laplace_rhob, &
1210 e_laplace_rhoa_tau_a, e_laplace_rhoa_tau_b, e_laplace_rhob, &
1211 e_laplace_rhob_laplace_rhob, e_laplace_rhob_tau_a, &
1212 e_laplace_rhob_tau_b, e_ndrho, e_ndrho_laplace_rhoa, &
1213 e_ndrho_laplace_rhob, e_ndrho_ndrho, e_ndrho_ndrhoa, e_ndrho_ndrhob, &
1214 e_ndrho_rhoa, e_ndrho_rhob, e_ndrho_tau_a, e_ndrho_tau_b, e_ndrhoa, &
1215 e_ndrhoa_laplace_rhoa, e_ndrhoa_laplace_rhob, e_ndrhoa_ndrhoa, &
1216 e_ndrhoa_ndrhob, e_ndrhoa_rhoa, e_ndrhoa_rhob, e_ndrhoa_tau_a, &
1217 e_ndrhoa_tau_b, e_ndrhob
1218 REAL(kind=dp),
CONTIGUOUS,
DIMENSION(:, :, :),
POINTER :: e_ndrhob_laplace_rhoa, &
1219 e_ndrhob_laplace_rhob, e_ndrhob_ndrhob, e_ndrhob_rhoa, e_ndrhob_rhob, &
1220 e_ndrhob_tau_a, e_ndrhob_tau_b, e_rhoa, e_rhoa_laplace_rhoa, &
1221 e_rhoa_laplace_rhob, e_rhoa_rhoa, e_rhoa_rhoa_rhoa, e_rhoa_rhoa_rhob, &
1222 e_rhoa_rhob, e_rhoa_rhob_rhob, e_rhoa_tau_a, e_rhoa_tau_b, e_rhob, &
1223 e_rhob_laplace_rhoa, e_rhob_laplace_rhob, e_rhob_rhob, &
1224 e_rhob_rhob_rhob, e_rhob_tau_a, e_rhob_tau_b, e_tau_a, e_tau_a_tau_a, &
1225 e_tau_a_tau_b, e_tau_b, e_tau_b_tau_b, laplace_rhoa, laplace_rhob, &
1226 norm_drho, norm_drhoa, norm_drhob, rhoa, rhob, tau_a, tau_b
1227 TYPE(xc_derivative_type),
POINTER :: deriv
1228 TYPE(xc_f03_func_info_t) :: xc_info
1230 CALL timeset(routinen, handle)
1235 IF (grad_deriv < 0)
THEN
1236 cpabort(
"Evaluating a single derivative order is not supported.")
1238 IF (grad_deriv > 3)
THEN
1239 cpabort(
"derivatives larger than 3 not implemented")
1244 NULLIFY (rhoa, rhob, norm_drho, norm_drhoa, norm_drhob, laplace_rhoa, &
1245 laplace_rhob, tau_a, tau_b)
1247 IF (
PRESENT(func_name_override))
THEN
1248 func_name = func_name_override
1251 func_name = libxc_params%section%name
1252 CALL section_vals_val_get(libxc_params,
"scale", r_val=func_scale)
1255 IF (abs(func_scale - 1.0_dp) < 1.0e-10_dp) func_scale = 1.0_dp
1257 CALL xc_rho_set_get(rho_set, can_return_null=.true., &
1258 rhoa=rhoa, rhob=rhob, norm_drho=norm_drho, &
1259 norm_drhoa=norm_drhoa, norm_drhob=norm_drhob, &
1260 laplace_rhoa=laplace_rhoa, laplace_rhob=laplace_rhob, &
1261 rho_cutoff=epsilon_rho, tau_cutoff=epsilon_tau, &
1262 tau_a=tau_a, tau_b=tau_b, local_bounds=bo)
1264 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
1268 IF (
PRESENT(func_name_override))
THEN
1271 iw = libxc_get_workers(func_name, xc_polarized, no_params, epsilon_rho, epsilon_tau)
1273 iw = libxc_get_workers(func_name, xc_polarized, libxc_params, epsilon_rho, epsilon_tau)
1275 workers => libxc_cache(iw)
1276 xc_info = workers%worker(1)%info
1277 has_laplace = workers%has_laplace
1281 CALL libxc_reserve_unused(npoints)
1282 dummy(bo(1, 1):bo(2, 1), bo(1, 2):bo(2, 2), bo(1, 3):bo(2, 3)) => libxc_unused(1:npoints)
1285 IF (.NOT.
ASSOCIATED(norm_drho)) norm_drho => rhoa
1286 IF (.NOT.
ASSOCIATED(norm_drhoa)) norm_drhoa => rhoa
1287 IF (.NOT.
ASSOCIATED(norm_drhob)) norm_drhob => rhoa
1288 IF (.NOT.
ASSOCIATED(tau_a)) tau_a => rhoa
1289 IF (.NOT.
ASSOCIATED(tau_b)) tau_b => rhoa
1293 IF (.NOT. has_laplace) laplace_rhoa => rhoa
1294 IF (.NOT. has_laplace) laplace_rhob => rhoa
1302 e_laplace_rhoa => dummy
1303 e_laplace_rhob => dummy
1306 e_rhoa_rhoa => dummy
1307 e_rhoa_rhob => dummy
1308 e_rhob_rhob => dummy
1309 e_ndrho_rhoa => dummy
1310 e_ndrho_rhob => dummy
1311 e_ndrhoa_rhoa => dummy
1312 e_ndrhoa_rhob => dummy
1313 e_ndrhob_rhoa => dummy
1314 e_ndrhob_rhob => dummy
1315 e_ndrho_ndrho => dummy
1316 e_ndrho_ndrhoa => dummy
1317 e_ndrho_ndrhob => dummy
1318 e_ndrhoa_ndrhoa => dummy
1319 e_ndrhoa_ndrhob => dummy
1320 e_ndrhob_ndrhob => dummy
1321 e_rhoa_laplace_rhoa => dummy
1322 e_rhoa_laplace_rhob => dummy
1323 e_rhob_laplace_rhoa => dummy
1324 e_rhob_laplace_rhob => dummy
1325 e_rhoa_tau_a => dummy
1326 e_rhoa_tau_b => dummy
1327 e_rhob_tau_a => dummy
1328 e_rhob_tau_b => dummy
1329 e_ndrho_laplace_rhoa => dummy
1330 e_ndrho_laplace_rhob => dummy
1331 e_ndrhoa_laplace_rhoa => dummy
1332 e_ndrhoa_laplace_rhob => dummy
1333 e_ndrhob_laplace_rhoa => dummy
1334 e_ndrhob_laplace_rhob => dummy
1335 e_ndrho_tau_a => dummy
1336 e_ndrho_tau_b => dummy
1337 e_ndrhoa_tau_a => dummy
1338 e_ndrhoa_tau_b => dummy
1339 e_ndrhob_tau_a => dummy
1340 e_ndrhob_tau_b => dummy
1341 e_laplace_rhoa_laplace_rhoa => dummy
1342 e_laplace_rhoa_laplace_rhob => dummy
1343 e_laplace_rhob_laplace_rhob => dummy
1344 e_laplace_rhoa_tau_a => dummy
1345 e_laplace_rhoa_tau_b => dummy
1346 e_laplace_rhob_tau_a => dummy
1347 e_laplace_rhob_tau_b => dummy
1348 e_tau_a_tau_a => dummy
1349 e_tau_a_tau_b => dummy
1350 e_tau_b_tau_b => dummy
1351 e_rhoa_rhoa_rhoa => dummy
1352 e_rhoa_rhoa_rhob => dummy
1353 e_rhoa_rhob_rhob => dummy
1354 e_rhob_rhob_rhob => dummy
1356 IF (grad_deriv >= 0)
THEN
1357 deriv => xc_dset_get_derivative(deriv_set, [
INTEGER::], &
1358 allocate_deriv=.true.)
1359 CALL xc_derivative_get(deriv, deriv_data=e_0)
1361 IF (grad_deriv >= 1)
THEN
1362 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1363 CASE (xc_family_lda, xc_family_hyb_lda)
1364 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa], &
1365 allocate_deriv=.true.)
1366 CALL xc_derivative_get(deriv, deriv_data=e_rhoa)
1367 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob], &
1368 allocate_deriv=.true.)
1369 CALL xc_derivative_get(deriv, deriv_data=e_rhob)
1370 CASE (xc_family_gga, xc_family_hyb_gga)
1371 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa], &
1372 allocate_deriv=.true.)
1373 CALL xc_derivative_get(deriv, deriv_data=e_rhoa)
1374 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob], &
1375 allocate_deriv=.true.)
1376 CALL xc_derivative_get(deriv, deriv_data=e_rhob)
1377 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
1378 allocate_deriv=.true.)
1379 CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
1380 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa], &
1381 allocate_deriv=.true.)
1382 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa)
1383 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob], &
1384 allocate_deriv=.true.)
1385 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob)
1386 CASE (xc_family_mgga, xc_family_hyb_mgga)
1387 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa], &
1388 allocate_deriv=.true.)
1389 CALL xc_derivative_get(deriv, deriv_data=e_rhoa)
1390 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob], &
1391 allocate_deriv=.true.)
1392 CALL xc_derivative_get(deriv, deriv_data=e_rhob)
1393 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
1394 allocate_deriv=.true.)
1395 CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
1396 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa], &
1397 allocate_deriv=.true.)
1398 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa)
1399 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob], &
1400 allocate_deriv=.true.)
1401 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob)
1402 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau_a], &
1403 allocate_deriv=.true.)
1404 CALL xc_derivative_get(deriv, deriv_data=e_tau_a)
1405 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau_b], &
1406 allocate_deriv=.true.)
1407 CALL xc_derivative_get(deriv, deriv_data=e_tau_b)
1408 IF (has_laplace)
THEN
1409 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhoa], &
1410 allocate_deriv=.true.)
1411 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa)
1412 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhob], &
1413 allocate_deriv=.true.)
1414 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob)
1417 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
1420 IF (grad_deriv >= 2)
THEN
1421 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1422 CASE (xc_family_lda, xc_family_hyb_lda)
1423 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhoa], &
1424 allocate_deriv=.true.)
1425 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa)
1426 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhob], &
1427 allocate_deriv=.true.)
1428 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob)
1429 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_rhob], &
1430 allocate_deriv=.true.)
1431 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob)
1432 CASE (xc_family_gga, xc_family_hyb_gga)
1433 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhoa], &
1434 allocate_deriv=.true.)
1435 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa)
1436 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhob], &
1437 allocate_deriv=.true.)
1438 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob)
1439 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_rhob], &
1440 allocate_deriv=.true.)
1441 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob)
1442 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rhoa], &
1443 allocate_deriv=.true.)
1444 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rhoa)
1445 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rhob], &
1446 allocate_deriv=.true.)
1447 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rhob)
1448 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_rhoa], &
1449 allocate_deriv=.true.)
1450 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_rhoa)
1451 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_rhob], &
1452 allocate_deriv=.true.)
1453 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_rhob)
1454 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_rhoa], &
1455 allocate_deriv=.true.)
1456 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_rhoa)
1457 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_rhob], &
1458 allocate_deriv=.true.)
1459 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_rhob)
1460 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drho], &
1461 allocate_deriv=.true.)
1462 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
1463 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drhoa], &
1464 allocate_deriv=.true.)
1465 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrhoa)
1466 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drhob], &
1467 allocate_deriv=.true.)
1468 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrhob)
1469 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_norm_drhoa], &
1470 allocate_deriv=.true.)
1471 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_ndrhoa)
1472 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_norm_drhob], &
1473 allocate_deriv=.true.)
1474 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_ndrhob)
1475 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_norm_drhob], &
1476 allocate_deriv=.true.)
1477 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_ndrhob)
1478 CASE (xc_family_mgga, xc_family_hyb_mgga)
1480 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhoa], &
1481 allocate_deriv=.true.)
1482 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa)
1483 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhob], &
1484 allocate_deriv=.true.)
1485 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob)
1486 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_rhob], &
1487 allocate_deriv=.true.)
1488 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob)
1489 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rhoa], &
1490 allocate_deriv=.true.)
1491 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rhoa)
1492 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_rhob], &
1493 allocate_deriv=.true.)
1494 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_rhob)
1495 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_rhoa], &
1496 allocate_deriv=.true.)
1497 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_rhoa)
1498 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_rhob], &
1499 allocate_deriv=.true.)
1500 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_rhob)
1501 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_rhoa], &
1502 allocate_deriv=.true.)
1503 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_rhoa)
1504 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_rhob], &
1505 allocate_deriv=.true.)
1506 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_rhob)
1507 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drho], &
1508 allocate_deriv=.true.)
1509 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
1510 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drhoa], &
1511 allocate_deriv=.true.)
1512 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrhoa)
1513 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_norm_drhob], &
1514 allocate_deriv=.true.)
1515 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrhob)
1516 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_norm_drhoa], &
1517 allocate_deriv=.true.)
1518 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_ndrhoa)
1519 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_norm_drhob], &
1520 allocate_deriv=.true.)
1521 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_ndrhob)
1522 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_norm_drhob], &
1523 allocate_deriv=.true.)
1524 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_ndrhob)
1525 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_tau_a], &
1526 allocate_deriv=.true.)
1527 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_tau_a)
1528 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_tau_b], &
1529 allocate_deriv=.true.)
1530 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_tau_b)
1531 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_tau_a], &
1532 allocate_deriv=.true.)
1533 CALL xc_derivative_get(deriv, deriv_data=e_rhob_tau_a)
1534 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_tau_b], &
1535 allocate_deriv=.true.)
1536 CALL xc_derivative_get(deriv, deriv_data=e_rhob_tau_b)
1537 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_tau_a], &
1538 allocate_deriv=.true.)
1539 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_tau_a)
1540 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_tau_b], &
1541 allocate_deriv=.true.)
1542 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_tau_b)
1543 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_tau_a], &
1544 allocate_deriv=.true.)
1545 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_tau_a)
1546 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_tau_b], &
1547 allocate_deriv=.true.)
1548 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_tau_b)
1549 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_tau_a], &
1550 allocate_deriv=.true.)
1551 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_tau_a)
1552 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_tau_b], &
1553 allocate_deriv=.true.)
1554 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_tau_b)
1555 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau_a, deriv_tau_a], &
1556 allocate_deriv=.true.)
1557 CALL xc_derivative_get(deriv, deriv_data=e_tau_a_tau_a)
1558 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau_a, deriv_tau_b], &
1559 allocate_deriv=.true.)
1560 CALL xc_derivative_get(deriv, deriv_data=e_tau_a_tau_b)
1561 deriv => xc_dset_get_derivative(deriv_set, [deriv_tau_b, deriv_tau_b], &
1562 allocate_deriv=.true.)
1563 CALL xc_derivative_get(deriv, deriv_data=e_tau_b_tau_b)
1564 IF (has_laplace)
THEN
1565 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_laplace_rhoa], &
1566 allocate_deriv=.true.)
1567 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_laplace_rhoa)
1568 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_laplace_rhob], &
1569 allocate_deriv=.true.)
1570 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_laplace_rhob)
1571 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_laplace_rhoa], &
1572 allocate_deriv=.true.)
1573 CALL xc_derivative_get(deriv, deriv_data=e_rhob_laplace_rhoa)
1574 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_laplace_rhob], &
1575 allocate_deriv=.true.)
1576 CALL xc_derivative_get(deriv, deriv_data=e_rhob_laplace_rhob)
1577 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_laplace_rhoa], &
1578 allocate_deriv=.true.)
1579 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_laplace_rhoa)
1580 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho, deriv_laplace_rhob], &
1581 allocate_deriv=.true.)
1582 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_laplace_rhob)
1583 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_laplace_rhoa], &
1584 allocate_deriv=.true.)
1585 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_laplace_rhoa)
1586 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhoa, deriv_laplace_rhob], &
1587 allocate_deriv=.true.)
1588 CALL xc_derivative_get(deriv, deriv_data=e_ndrhoa_laplace_rhob)
1589 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_laplace_rhoa], &
1590 allocate_deriv=.true.)
1591 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_laplace_rhoa)
1592 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drhob, deriv_laplace_rhob], &
1593 allocate_deriv=.true.)
1594 CALL xc_derivative_get(deriv, deriv_data=e_ndrhob_laplace_rhob)
1595 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhoa, deriv_laplace_rhoa], &
1596 allocate_deriv=.true.)
1597 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_laplace_rhoa)
1598 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhoa, deriv_laplace_rhob], &
1599 allocate_deriv=.true.)
1600 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_laplace_rhob)
1601 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhob, deriv_laplace_rhob], &
1602 allocate_deriv=.true.)
1603 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob_laplace_rhob)
1604 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhoa, deriv_tau_a], &
1605 allocate_deriv=.true.)
1606 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_tau_a)
1607 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhoa, deriv_tau_b], &
1608 allocate_deriv=.true.)
1609 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhoa_tau_b)
1610 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhob, deriv_tau_a], &
1611 allocate_deriv=.true.)
1612 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob_tau_a)
1613 deriv => xc_dset_get_derivative(deriv_set, [deriv_laplace_rhob, deriv_tau_b], &
1614 allocate_deriv=.true.)
1615 CALL xc_derivative_get(deriv, deriv_data=e_laplace_rhob_tau_b)
1618 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
1621 IF (grad_deriv >= 3)
THEN
1622 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1623 CASE (xc_family_lda, xc_family_hyb_lda)
1624 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhoa, deriv_rhoa], &
1625 allocate_deriv=.true.)
1626 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_rhoa)
1627 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhoa, deriv_rhob], &
1628 allocate_deriv=.true.)
1629 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhoa_rhob)
1630 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhoa, deriv_rhob, deriv_rhob], &
1631 allocate_deriv=.true.)
1632 CALL xc_derivative_get(deriv, deriv_data=e_rhoa_rhob_rhob)
1633 deriv => xc_dset_get_derivative(deriv_set, [deriv_rhob, deriv_rhob, deriv_rhob], &
1634 allocate_deriv=.true.)
1635 CALL xc_derivative_get(deriv, deriv_data=e_rhob_rhob_rhob)
1636 CASE (xc_family_gga, xc_family_hyb_gga, xc_family_mgga, xc_family_hyb_mgga)
1637 cpabort(
"derivatives larger than 2 not implemented")
1639 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
1666 CALL libxc_spin_polarized_calc(rhoa=rhoa, rhob=rhob, norm_drho=norm_drho, &
1667 norm_drhoa=norm_drhoa, norm_drhob=norm_drhob, laplace_rhoa=laplace_rhoa, &
1668 laplace_rhob=laplace_rhob, tau_a=tau_a, tau_b=tau_b, &
1669 e_0=e_0, e_rhoa=e_rhoa, e_rhob=e_rhob, e_ndrho=e_ndrho, &
1670 e_ndrhoa=e_ndrhoa, e_ndrhob=e_ndrhob, e_laplace_rhoa=e_laplace_rhoa, &
1671 e_laplace_rhob=e_laplace_rhob, e_tau_a=e_tau_a, e_tau_b=e_tau_b, &
1672 e_rhoa_rhoa=e_rhoa_rhoa, e_rhoa_rhob=e_rhoa_rhob, e_rhob_rhob=e_rhob_rhob, &
1673 e_ndrho_rhoa=e_ndrho_rhoa, e_ndrho_rhob=e_ndrho_rhob, &
1674 e_ndrhoa_rhoa=e_ndrhoa_rhoa, e_ndrhoa_rhob=e_ndrhoa_rhob, &
1675 e_ndrhob_rhoa=e_ndrhob_rhoa, e_ndrhob_rhob=e_ndrhob_rhob, &
1676 e_ndrho_ndrho=e_ndrho_ndrho, e_ndrho_ndrhoa=e_ndrho_ndrhoa, &
1677 e_ndrho_ndrhob=e_ndrho_ndrhob, e_ndrhoa_ndrhoa=e_ndrhoa_ndrhoa, &
1678 e_ndrhoa_ndrhob=e_ndrhoa_ndrhob, e_ndrhob_ndrhob=e_ndrhob_ndrhob, &
1679 e_rhoa_laplace_rhoa=e_rhoa_laplace_rhoa, &
1680 e_rhoa_laplace_rhob=e_rhoa_laplace_rhob, &
1681 e_rhob_laplace_rhoa=e_rhob_laplace_rhoa, &
1682 e_rhob_laplace_rhob=e_rhob_laplace_rhob, &
1683 e_rhoa_tau_a=e_rhoa_tau_a, e_rhoa_tau_b=e_rhoa_tau_b, &
1684 e_rhob_tau_a=e_rhob_tau_a, e_rhob_tau_b=e_rhob_tau_b, &
1685 e_ndrho_laplace_rhoa=e_ndrho_laplace_rhoa, &
1686 e_ndrho_laplace_rhob=e_ndrho_laplace_rhob, &
1687 e_ndrhoa_laplace_rhoa=e_ndrhoa_laplace_rhoa, &
1688 e_ndrhoa_laplace_rhob=e_ndrhoa_laplace_rhob, &
1689 e_ndrhob_laplace_rhoa=e_ndrhob_laplace_rhoa, &
1690 e_ndrhob_laplace_rhob=e_ndrhob_laplace_rhob, &
1691 e_ndrho_tau_a=e_ndrho_tau_a, e_ndrho_tau_b=e_ndrho_tau_b, &
1692 e_ndrhoa_tau_a=e_ndrhoa_tau_a, e_ndrhoa_tau_b=e_ndrhoa_tau_b, &
1693 e_ndrhob_tau_a=e_ndrhob_tau_a, e_ndrhob_tau_b=e_ndrhob_tau_b, &
1694 e_laplace_rhoa_laplace_rhoa=e_laplace_rhoa_laplace_rhoa, &
1695 e_laplace_rhoa_laplace_rhob=e_laplace_rhoa_laplace_rhob, &
1696 e_laplace_rhob_laplace_rhob=e_laplace_rhob_laplace_rhob, &
1697 e_laplace_rhoa_tau_a=e_laplace_rhoa_tau_a, &
1698 e_laplace_rhoa_tau_b=e_laplace_rhoa_tau_b, &
1699 e_laplace_rhob_tau_a=e_laplace_rhob_tau_a, &
1700 e_laplace_rhob_tau_b=e_laplace_rhob_tau_b, &
1701 e_tau_a_tau_a=e_tau_a_tau_a, &
1702 e_tau_a_tau_b=e_tau_a_tau_b, &
1703 e_tau_b_tau_b=e_tau_b_tau_b, &
1704 e_rhoa_rhoa_rhoa=e_rhoa_rhoa_rhoa, &
1705 e_rhoa_rhoa_rhob=e_rhoa_rhoa_rhob, &
1706 e_rhoa_rhob_rhob=e_rhoa_rhob_rhob, &
1707 e_rhob_rhob_rhob=e_rhob_rhob_rhob, &
1708 grad_deriv=grad_deriv, npoints=npoints, &
1709 func_name=func_name, sc=func_scale, workers=workers)
1716 CALL timestop(handle)
1719 mark_used(deriv_set)
1720 mark_used(grad_deriv)
1721 mark_used(libxc_params)
1722 mark_used(func_name_override)
1724 CALL cp_abort(__location__,
"Unknown functional! If you are asking "// &
1725 "for a functional of the LibXC library, "// &
1726 "you have to download and install the library!")
1761#if defined (__LIBXC)
1762 SUBROUTINE libxc_spin_unpolarized_calc(rho, norm_drho, laplace_rho, tau, &
1763 e_0, e_rho, e_ndrho, e_laplace_rho, e_tau, e_rho_rho, e_ndrho_rho, &
1764 e_ndrho_ndrho, e_rho_laplace_rho, e_rho_tau, e_ndrho_laplace_rho, &
1765 e_ndrho_tau, e_laplace_rho_laplace_rho, e_laplace_rho_tau, &
1766 e_tau_tau, e_rho_rho_rho, &
1767 grad_deriv, npoints, func_name, sc, workers)
1769 REAL(kind=dp),
DIMENSION(*),
INTENT(IN) :: rho, norm_drho, laplace_rho, tau
1770 REAL(kind=dp),
DIMENSION(*),
INTENT(INOUT) :: e_0, e_rho, e_ndrho, e_laplace_rho, e_tau, &
1771 e_rho_rho, e_ndrho_rho, e_ndrho_ndrho, e_rho_laplace_rho, e_rho_tau, e_ndrho_laplace_rho, &
1772 e_ndrho_tau, e_laplace_rho_laplace_rho, e_laplace_rho_tau, e_tau_tau, e_rho_rho_rho
1773 INTEGER,
INTENT(in) :: grad_deriv, npoints
1774 CHARACTER(LEN=default_string_length),
INTENT(IN) :: func_name
1775 REAL(kind=dp),
INTENT(in) :: sc
1776 TYPE(libxc_worker_set_type),
INTENT(INOUT) :: workers
1778 INTEGER :: bsize, family, i, i0, ib, ii, ithread, &
1779 nb, nblocks, nthreads
1780 INTEGER(C_SIZE_T) :: np
1781 LOGICAL :: is_gga, is_mgga
1787 cpassert(ithread <
SIZE(workers%worker))
1793 bsize = max(1, min(libxc_block_size, (npoints + nthreads - 1)/nthreads))
1794 nblocks = (npoints + bsize - 1)/bsize
1796 family = workers%family
1797 SELECT CASE (family)
1798 CASE (xc_family_lda, xc_family_hyb_lda)
1801 CASE (xc_family_gga, xc_family_hyb_gga)
1804 CASE (xc_family_mgga, xc_family_hyb_mgga)
1810 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
1817 associate(w => workers%worker(ithread + 1), has_laplace => workers%has_laplace, &
1818 no_exc => workers%no_exc, eps_rho => workers%epsilon_rho, &
1819 eps_tau => workers%epsilon_tau)
1823 nb = min(bsize, npoints - i0)
1824 np = int(nb, kind=c_size_t)
1828 w%rho(1, i) = rho(i0 + i)
1832 w%sigma(1, i) = norm_drho(i0 + i)**2
1838 w%lapl(1, i) = laplace_rho(ii)
1839 w%tau(1, i) = tau(ii)
1849 IF (w%tau(1, i) <= eps_tau) w%rho(1, i) = 0.0_dp
1850 w%tau(1, i) = max(w%tau(1, i), &
1851 w%sigma(1, i)/(8.0_dp*max(w%rho(1, i), eps_rho)))
1857 SELECT CASE (grad_deriv)
1859 CALL xc_f03_mgga_exc(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%lapl(1, 1), w%tau(1, 1), w%exc(1))
1862 CALL xc_f03_mgga_vxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%lapl(1, 1), w%tau(1, 1), &
1863 w%vrho(1, 1), w%vsigma(1, 1), w%vlapl(1, 1), w%vtau(1, 1))
1864 w%exc(1:nb) = 0.0_dp
1866 CALL xc_f03_mgga_exc_vxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%lapl(1, 1), w%tau(1, 1), &
1867 w%exc(1), w%vrho(1, 1), w%vsigma(1, 1), w%vlapl(1, 1), w%vtau(1, 1))
1871 CALL xc_f03_mgga_vxc_fxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%lapl(1, 1), w%tau(1, 1), &
1872 w%vrho(1, 1), w%vsigma(1, 1), w%vlapl(1, 1), w%vtau(1, 1), &
1873 w%v2rho2(1, 1), w%v2rhosigma(1, 1), w%v2rholapl(1, 1), &
1874 w%v2rhotau(1, 1), w%v2sigma2(1, 1), w%v2sigmalapl(1, 1), &
1875 w%v2sigmatau(1, 1), w%v2lapl2(1, 1), w%v2lapltau(1, 1), w%v2tau2(1, 1))
1876 w%exc(1:nb) = 0.0_dp
1878 CALL xc_f03_mgga(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%lapl(1, 1), w%tau(1, 1), &
1879 w%exc(1), w%vrho(1, 1), w%vsigma(1, 1), w%vlapl(1, 1), w%vtau(1, 1), &
1880 w%v2rho2(1, 1), w%v2rhosigma(1, 1), w%v2rholapl(1, 1), &
1881 w%v2rhotau(1, 1), w%v2sigma2(1, 1), w%v2sigmalapl(1, 1), &
1882 w%v2sigmatau(1, 1), w%v2lapl2(1, 1), w%v2lapltau(1, 1), w%v2tau2(1, 1))
1885 ELSE IF (is_gga)
THEN
1886 SELECT CASE (grad_deriv)
1888 CALL xc_f03_gga_exc(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%exc(1))
1891 CALL xc_f03_gga_vxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%vrho(1, 1), w%vsigma(1, 1))
1892 w%exc(1:nb) = 0.0_dp
1894 CALL xc_f03_gga_exc_vxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), &
1895 w%exc(1), w%vrho(1, 1), w%vsigma(1, 1))
1899 CALL xc_f03_gga_vxc_fxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), &
1900 w%vrho(1, 1), w%vsigma(1, 1), &
1901 w%v2rho2(1, 1), w%v2rhosigma(1, 1), w%v2sigma2(1, 1))
1902 w%exc(1:nb) = 0.0_dp
1904 CALL xc_f03_gga_exc_vxc_fxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), &
1905 w%exc(1), w%vrho(1, 1), w%vsigma(1, 1), &
1906 w%v2rho2(1, 1), w%v2rhosigma(1, 1), w%v2sigma2(1, 1))
1910 SELECT CASE (grad_deriv)
1912 CALL xc_f03_lda_exc(w%func, np, w%rho(1, 1), w%exc(1))
1914 CALL xc_f03_lda_exc_vxc(w%func, np, w%rho(1, 1), w%exc(1), w%vrho(1, 1))
1916 CALL xc_f03_lda_exc_vxc_fxc(w%func, np, w%rho(1, 1), &
1917 w%exc(1), w%vrho(1, 1), w%v2rho2(1, 1))
1919 CALL xc_f03_lda(w%func, np, w%rho(1, 1), &
1920 w%exc(1), w%vrho(1, 1), w%v2rho2(1, 1), w%v3rho3(1, 1))
1927 IF (grad_deriv >= 0)
THEN
1930 e_0(ii) = e_0(ii) + sc*w%exc(i)*rho(ii)
1933 IF (grad_deriv >= 1)
THEN
1936 e_rho(ii) = e_rho(ii) + sc*w%vrho(1, i)
1941 e_ndrho(ii) = e_ndrho(ii) + sc*2.0_dp*w%vsigma(1, i)*norm_drho(ii)
1947 e_tau(ii) = e_tau(ii) + sc*w%vtau(1, i)
1950 IF (is_mgga .AND. has_laplace)
THEN
1953 e_laplace_rho(ii) = e_laplace_rho(ii) + sc*w%vlapl(1, i)
1957 IF (grad_deriv >= 2)
THEN
1960 e_rho_rho(ii) = e_rho_rho(ii) + sc*w%v2rho2(1, i)
1965 e_ndrho_rho(ii) = e_ndrho_rho(ii) + sc*2.0_dp*w%v2rhosigma(1, i)*norm_drho(ii)
1966 e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) + &
1967 sc*2.0_dp*(2.0_dp*w%sigma(1, i)*w%v2sigma2(1, i) + w%vsigma(1, i))
1973 e_rho_tau(ii) = e_rho_tau(ii) + sc*w%v2rhotau(1, i)
1974 e_ndrho_tau(ii) = e_ndrho_tau(ii) + sc*2.0_dp*w%v2sigmatau(1, i)*norm_drho(ii)
1975 e_tau_tau(ii) = e_tau_tau(ii) + sc*w%v2tau2(1, i)
1978 IF (is_mgga .AND. has_laplace)
THEN
1981 e_rho_laplace_rho(ii) = e_rho_laplace_rho(ii) + sc*w%v2rholapl(1, i)
1982 e_ndrho_laplace_rho(ii) = e_ndrho_laplace_rho(ii) + &
1983 sc*2.0_dp*w%v2sigmalapl(1, i)*norm_drho(ii)
1984 e_laplace_rho_laplace_rho(ii) = e_laplace_rho_laplace_rho(ii) + sc*w%v2lapl2(1, i)
1985 e_laplace_rho_tau(ii) = e_laplace_rho_tau(ii) + sc*w%v2lapltau(1, i)
1989 IF (grad_deriv >= 3)
THEN
1992 e_rho_rho_rho(ii) = e_rho_rho_rho(ii) + sc*w%v3rho3(1, i)
1999 END SUBROUTINE libxc_spin_unpolarized_calc
2081#if defined (__LIBXC)
2082 SUBROUTINE libxc_spin_polarized_calc(rhoa, rhob, norm_drho, norm_drhoa, &
2083 norm_drhob, laplace_rhoa, laplace_rhob, tau_a, tau_b, &
2084 e_0, e_rhoa, e_rhob, e_ndrho, e_ndrhoa, e_ndrhob, &
2085 e_laplace_rhoa, e_laplace_rhob, e_tau_a, e_tau_b, &
2086 e_rhoa_rhoa, e_rhoa_rhob, e_rhob_rhob, &
2087 e_ndrho_rhoa, e_ndrho_rhob, e_ndrhoa_rhoa, &
2088 e_ndrhoa_rhob, e_ndrhob_rhoa, e_ndrhob_rhob, &
2089 e_ndrho_ndrho, e_ndrho_ndrhoa, e_ndrho_ndrhob, &
2090 e_ndrhoa_ndrhoa, e_ndrhoa_ndrhob, e_ndrhob_ndrhob, &
2091 e_rhoa_laplace_rhoa, e_rhoa_laplace_rhob, &
2092 e_rhob_laplace_rhoa, e_rhob_laplace_rhob, &
2093 e_rhoa_tau_a, e_rhoa_tau_b, e_rhob_tau_a, e_rhob_tau_b, &
2094 e_ndrho_laplace_rhoa, e_ndrho_laplace_rhob, &
2095 e_ndrhoa_laplace_rhoa, e_ndrhoa_laplace_rhob, &
2096 e_ndrhob_laplace_rhoa, e_ndrhob_laplace_rhob, &
2097 e_ndrho_tau_a, e_ndrho_tau_b, &
2098 e_ndrhoa_tau_a, e_ndrhoa_tau_b, &
2099 e_ndrhob_tau_a, e_ndrhob_tau_b, &
2100 e_laplace_rhoa_laplace_rhoa, &
2101 e_laplace_rhoa_laplace_rhob, &
2102 e_laplace_rhob_laplace_rhob, &
2103 e_laplace_rhoa_tau_a, e_laplace_rhoa_tau_b, &
2104 e_laplace_rhob_tau_a, e_laplace_rhob_tau_b, &
2105 e_tau_a_tau_a, e_tau_a_tau_b, e_tau_b_tau_b, &
2106 e_rhoa_rhoa_rhoa, e_rhoa_rhoa_rhob, &
2107 e_rhoa_rhob_rhob, e_rhob_rhob_rhob, &
2108 grad_deriv, npoints, func_name, sc, workers)
2110 REAL(kind=dp),
DIMENSION(*),
INTENT(IN) :: rhoa, rhob, norm_drho, norm_drhoa, &
2111 norm_drhob, laplace_rhoa, &
2112 laplace_rhob, tau_a, tau_b
2113 REAL(kind=dp),
DIMENSION(*),
INTENT(INOUT) :: e_0, e_rhoa, e_rhob, e_ndrho, e_ndrhoa, &
2114 e_ndrhob, e_laplace_rhoa, e_laplace_rhob, e_tau_a, e_tau_b, e_rhoa_rhoa, e_rhoa_rhob, &
2115 e_rhob_rhob, e_ndrho_rhoa, e_ndrho_rhob, e_ndrhoa_rhoa, e_ndrhoa_rhob, e_ndrhob_rhoa, &
2116 e_ndrhob_rhob, e_ndrho_ndrho, e_ndrho_ndrhoa, e_ndrho_ndrhob, e_ndrhoa_ndrhoa, &
2117 e_ndrhoa_ndrhob, e_ndrhob_ndrhob, e_rhoa_laplace_rhoa, e_rhoa_laplace_rhob, &
2118 e_rhob_laplace_rhoa, e_rhob_laplace_rhob, e_rhoa_tau_a, e_rhoa_tau_b, e_rhob_tau_a, &
2119 e_rhob_tau_b, e_ndrho_laplace_rhoa, e_ndrho_laplace_rhob, e_ndrhoa_laplace_rhoa
2120 REAL(kind=dp),
DIMENSION(*),
INTENT(INOUT) :: e_ndrhoa_laplace_rhob, e_ndrhob_laplace_rhoa, &
2121 e_ndrhob_laplace_rhob, e_ndrho_tau_a, e_ndrho_tau_b, e_ndrhoa_tau_a, e_ndrhoa_tau_b, &
2122 e_ndrhob_tau_a, e_ndrhob_tau_b, e_laplace_rhoa_laplace_rhoa, e_laplace_rhoa_laplace_rhob, &
2123 e_laplace_rhob_laplace_rhob, e_laplace_rhoa_tau_a, e_laplace_rhoa_tau_b, &
2124 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, &
2125 e_rhoa_rhoa_rhoa, e_rhoa_rhoa_rhob, e_rhoa_rhob_rhob, e_rhob_rhob_rhob
2126 INTEGER,
INTENT(in) :: grad_deriv, npoints
2127 CHARACTER(LEN=default_string_length),
INTENT(IN) :: func_name
2128 REAL(kind=dp),
INTENT(in) :: sc
2129 TYPE(libxc_worker_set_type),
INTENT(INOUT) :: workers
2131 INTEGER :: bsize, family, i, i0, ib, ii, ithread, &
2132 nb, nblocks, nthreads
2133 INTEGER(C_SIZE_T) :: np
2134 LOGICAL :: is_gga, is_mgga
2140 cpassert(ithread <
SIZE(workers%worker))
2142 bsize = max(1, min(libxc_block_size, (npoints + nthreads - 1)/nthreads))
2143 nblocks = (npoints + bsize - 1)/bsize
2145 family = workers%family
2146 SELECT CASE (family)
2147 CASE (xc_family_lda, xc_family_hyb_lda)
2150 CASE (xc_family_gga, xc_family_hyb_gga)
2153 CASE (xc_family_mgga, xc_family_hyb_mgga)
2159 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
2164 associate(w => workers%worker(ithread + 1), has_laplace => workers%has_laplace, &
2165 no_exc => workers%no_exc, eps_rho => workers%epsilon_rho, &
2166 eps_tau => workers%epsilon_tau)
2170 nb = min(bsize, npoints - i0)
2171 np = int(nb, kind=c_size_t)
2176 w%rho(1, i) = max(rhoa(ii), 0.0_dp)
2177 w%rho(2, i) = max(rhob(ii), 0.0_dp)
2183 w%nda(i) = max(norm_drhoa(ii), epsilon(0.0_dp)*1.e4_dp)
2184 w%ndb(i) = max(norm_drhob(ii), epsilon(0.0_dp)*1.e4_dp)
2185 w%nd(i) = max(norm_drho(ii), epsilon(0.0_dp)*1.e4_dp)
2186 w%sigma(1, i) = w%nda(i)**2
2187 w%sigma(3, i) = w%ndb(i)**2
2188 w%sigma(2, i) = 0.5_dp*(w%nd(i)**2 - w%sigma(1, i) - w%sigma(3, i))
2194 w%lapl(1, i) = laplace_rhoa(ii)
2195 w%lapl(2, i) = laplace_rhob(ii)
2196 w%tau(1, i) = max(tau_a(ii), 0.0_dp)
2197 w%tau(2, i) = max(tau_b(ii), 0.0_dp)
2203 IF (w%tau(1, i) + w%tau(2, i) <= eps_tau)
THEN
2204 w%rho(1, i) = 0.0_dp
2205 w%rho(2, i) = 0.0_dp
2207 w%tau(1, i) = max(w%tau(1, i), &
2208 w%sigma(1, i)/(8.0_dp*max(w%rho(1, i), eps_rho)))
2209 w%tau(2, i) = max(w%tau(2, i), &
2210 w%sigma(3, i)/(8.0_dp*max(w%rho(2, i), eps_rho)))
2216 SELECT CASE (grad_deriv)
2218 CALL xc_f03_mgga_exc(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%lapl(1, 1), w%tau(1, 1), w%exc(1))
2221 CALL xc_f03_mgga_vxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%lapl(1, 1), w%tau(1, 1), &
2222 w%vrho(1, 1), w%vsigma(1, 1), w%vlapl(1, 1), w%vtau(1, 1))
2223 w%exc(1:nb) = 0.0_dp
2225 CALL xc_f03_mgga_exc_vxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%lapl(1, 1), w%tau(1, 1), &
2226 w%exc(1), w%vrho(1, 1), w%vsigma(1, 1), w%vlapl(1, 1), w%vtau(1, 1))
2230 CALL xc_f03_mgga_vxc_fxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%lapl(1, 1), w%tau(1, 1), &
2231 w%vrho(1, 1), w%vsigma(1, 1), w%vlapl(1, 1), w%vtau(1, 1), &
2232 w%v2rho2(1, 1), w%v2rhosigma(1, 1), w%v2rholapl(1, 1), &
2233 w%v2rhotau(1, 1), w%v2sigma2(1, 1), w%v2sigmalapl(1, 1), &
2234 w%v2sigmatau(1, 1), w%v2lapl2(1, 1), w%v2lapltau(1, 1), w%v2tau2(1, 1))
2235 w%exc(1:nb) = 0.0_dp
2237 CALL xc_f03_mgga(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%lapl(1, 1), w%tau(1, 1), &
2238 w%exc(1), w%vrho(1, 1), w%vsigma(1, 1), w%vlapl(1, 1), w%vtau(1, 1), &
2239 w%v2rho2(1, 1), w%v2rhosigma(1, 1), w%v2rholapl(1, 1), &
2240 w%v2rhotau(1, 1), w%v2sigma2(1, 1), w%v2sigmalapl(1, 1), &
2241 w%v2sigmatau(1, 1), w%v2lapl2(1, 1), w%v2lapltau(1, 1), w%v2tau2(1, 1))
2244 ELSE IF (is_gga)
THEN
2245 SELECT CASE (grad_deriv)
2247 CALL xc_f03_gga_exc(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%exc(1))
2250 CALL xc_f03_gga_vxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), w%vrho(1, 1), w%vsigma(1, 1))
2251 w%exc(1:nb) = 0.0_dp
2253 CALL xc_f03_gga_exc_vxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), &
2254 w%exc(1), w%vrho(1, 1), w%vsigma(1, 1))
2258 CALL xc_f03_gga_vxc_fxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), &
2259 w%vrho(1, 1), w%vsigma(1, 1), &
2260 w%v2rho2(1, 1), w%v2rhosigma(1, 1), w%v2sigma2(1, 1))
2261 w%exc(1:nb) = 0.0_dp
2263 CALL xc_f03_gga_exc_vxc_fxc(w%func, np, w%rho(1, 1), w%sigma(1, 1), &
2264 w%exc(1), w%vrho(1, 1), w%vsigma(1, 1), &
2265 w%v2rho2(1, 1), w%v2rhosigma(1, 1), w%v2sigma2(1, 1))
2269 SELECT CASE (grad_deriv)
2271 CALL xc_f03_lda_exc(w%func, np, w%rho(1, 1), w%exc(1))
2273 CALL xc_f03_lda_exc_vxc(w%func, np, w%rho(1, 1), w%exc(1), w%vrho(1, 1))
2275 CALL xc_f03_lda_exc_vxc_fxc(w%func, np, w%rho(1, 1), &
2276 w%exc(1), w%vrho(1, 1), w%v2rho2(1, 1))
2278 CALL xc_f03_lda(w%func, np, w%rho(1, 1), &
2279 w%exc(1), w%vrho(1, 1), w%v2rho2(1, 1), w%v3rho3(1, 1))
2285 IF (grad_deriv >= 0)
THEN
2288 e_0(ii) = e_0(ii) + sc*w%exc(i)*(w%rho(1, i) + w%rho(2, i))
2291 IF (grad_deriv >= 1)
THEN
2294 e_rhoa(ii) = e_rhoa(ii) + sc*w%vrho(1, i)
2295 e_rhob(ii) = e_rhob(ii) + sc*w%vrho(2, i)
2300 e_ndrho(ii) = e_ndrho(ii) + sc*w%vsigma(2, i)*w%nd(i)
2301 e_ndrhoa(ii) = e_ndrhoa(ii) + &
2302 sc*(2.0_dp*w%vsigma(1, i) - w%vsigma(2, i))*w%nda(i)
2303 e_ndrhob(ii) = e_ndrhob(ii) + &
2304 sc*(2.0_dp*w%vsigma(3, i) - w%vsigma(2, i))*w%ndb(i)
2310 e_tau_a(ii) = e_tau_a(ii) + sc*w%vtau(1, i)
2311 e_tau_b(ii) = e_tau_b(ii) + sc*w%vtau(2, i)
2314 IF (is_mgga .AND. has_laplace)
THEN
2317 e_laplace_rhoa(ii) = e_laplace_rhoa(ii) + sc*w%vlapl(1, i)
2318 e_laplace_rhob(ii) = e_laplace_rhob(ii) + sc*w%vlapl(2, i)
2322 IF (grad_deriv >= 2)
THEN
2325 e_rhoa_rhoa(ii) = e_rhoa_rhoa(ii) + sc*w%v2rho2(1, i)
2326 e_rhoa_rhob(ii) = e_rhoa_rhob(ii) + sc*w%v2rho2(2, i)
2327 e_rhob_rhob(ii) = e_rhob_rhob(ii) + sc*w%v2rho2(3, i)
2332 e_ndrho_rhoa(ii) = e_ndrho_rhoa(ii) + sc*w%v2rhosigma(2, i)*w%nd(i)
2333 e_ndrho_rhob(ii) = e_ndrho_rhob(ii) + sc*w%v2rhosigma(5, i)*w%nd(i)
2334 e_ndrhoa_rhoa(ii) = e_ndrhoa_rhoa(ii) + &
2335 sc*(2.0_dp*w%v2rhosigma(1, i) - w%v2rhosigma(2, i))*w%nda(i)
2336 e_ndrhoa_rhob(ii) = e_ndrhoa_rhob(ii) + &
2337 sc*(2.0_dp*w%v2rhosigma(4, i) - w%v2rhosigma(5, i))*w%nda(i)
2338 e_ndrhob_rhoa(ii) = e_ndrhob_rhoa(ii) + &
2339 sc*(2.0_dp*w%v2rhosigma(3, i) - w%v2rhosigma(2, i))*w%ndb(i)
2340 e_ndrhob_rhob(ii) = e_ndrhob_rhob(ii) + &
2341 sc*(2.0_dp*w%v2rhosigma(6, i) - w%v2rhosigma(5, i))*w%ndb(i)
2342 e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) + &
2343 sc*(w%vsigma(2, i) + w%nd(i)**2*w%v2sigma2(4, i))
2344 e_ndrho_ndrhoa(ii) = e_ndrho_ndrhoa(ii) + &
2345 sc*(2.0_dp*w%v2sigma2(2, i) - w%v2sigma2(4, i))*w%nd(i)*w%nda(i)
2346 e_ndrho_ndrhob(ii) = e_ndrho_ndrhob(ii) + &
2347 sc*(2.0_dp*w%v2sigma2(5, i) - w%v2sigma2(4, i))*w%nd(i)*w%ndb(i)
2348 e_ndrhoa_ndrhoa(ii) = e_ndrhoa_ndrhoa(ii) + &
2349 sc*(2.0_dp*w%vsigma(1, i) - w%vsigma(2, i) + w%nda(i)**2*( &
2350 4.0_dp*w%v2sigma2(1, i) - 4.0_dp*w%v2sigma2(2, i) + w%v2sigma2(4, i)))
2351 e_ndrhoa_ndrhob(ii) = e_ndrhoa_ndrhob(ii) + &
2352 sc*(4.0_dp*w%v2sigma2(3, i) - 2.0_dp*w%v2sigma2(2, i) - &
2353 2.0_dp*w%v2sigma2(5, i) + w%v2sigma2(4, i))*w%nda(i)*w%ndb(i)
2354 e_ndrhob_ndrhob(ii) = e_ndrhob_ndrhob(ii) + &
2355 sc*(2.0_dp*w%vsigma(3, i) - w%vsigma(2, i) + w%ndb(i)**2*( &
2356 4.0_dp*w%v2sigma2(6, i) - 4.0_dp*w%v2sigma2(5, i) + w%v2sigma2(4, i)))
2362 e_rhoa_tau_a(ii) = e_rhoa_tau_a(ii) + sc*w%v2rhotau(1, i)
2363 e_rhoa_tau_b(ii) = e_rhoa_tau_b(ii) + sc*w%v2rhotau(2, i)
2364 e_rhob_tau_a(ii) = e_rhob_tau_a(ii) + sc*w%v2rhotau(3, i)
2365 e_rhob_tau_b(ii) = e_rhob_tau_b(ii) + sc*w%v2rhotau(4, i)
2366 e_ndrho_tau_a(ii) = e_ndrho_tau_a(ii) + sc*w%v2sigmatau(3, i)*w%nd(i)
2367 e_ndrho_tau_b(ii) = e_ndrho_tau_b(ii) + sc*w%v2sigmatau(4, i)*w%nd(i)
2368 e_ndrhoa_tau_a(ii) = e_ndrhoa_tau_a(ii) + &
2369 sc*(2.0_dp*w%v2sigmatau(1, i) - w%v2sigmatau(3, i))*w%nda(i)
2370 e_ndrhoa_tau_b(ii) = e_ndrhoa_tau_b(ii) + &
2371 sc*(2.0_dp*w%v2sigmatau(2, i) - w%v2sigmatau(4, i))*w%nda(i)
2372 e_ndrhob_tau_a(ii) = e_ndrhob_tau_a(ii) + &
2373 sc*(2.0_dp*w%v2sigmatau(5, i) - w%v2sigmatau(3, i))*w%ndb(i)
2374 e_ndrhob_tau_b(ii) = e_ndrhob_tau_b(ii) + &
2375 sc*(2.0_dp*w%v2sigmatau(6, i) - w%v2sigmatau(4, i))*w%ndb(i)
2376 e_tau_a_tau_a(ii) = e_tau_a_tau_a(ii) + sc*w%v2tau2(1, i)
2377 e_tau_a_tau_b(ii) = e_tau_a_tau_b(ii) + sc*w%v2tau2(2, i)
2378 e_tau_b_tau_b(ii) = e_tau_b_tau_b(ii) + sc*w%v2tau2(3, i)
2381 IF (is_mgga .AND. has_laplace)
THEN
2384 e_rhoa_laplace_rhoa(ii) = e_rhoa_laplace_rhoa(ii) + sc*w%v2rholapl(1, i)
2385 e_rhoa_laplace_rhob(ii) = e_rhoa_laplace_rhob(ii) + sc*w%v2rholapl(2, i)
2386 e_rhob_laplace_rhoa(ii) = e_rhob_laplace_rhoa(ii) + sc*w%v2rholapl(3, i)
2387 e_rhob_laplace_rhob(ii) = e_rhob_laplace_rhob(ii) + sc*w%v2rholapl(4, i)
2388 e_ndrho_laplace_rhoa(ii) = e_ndrho_laplace_rhoa(ii) + sc*w%v2sigmalapl(3, i)*w%nd(i)
2389 e_ndrho_laplace_rhob(ii) = e_ndrho_laplace_rhob(ii) + sc*w%v2sigmalapl(4, i)*w%nd(i)
2390 e_ndrhoa_laplace_rhoa(ii) = e_ndrhoa_laplace_rhoa(ii) + &
2391 sc*(2.0_dp*w%v2sigmalapl(1, i) - w%v2sigmalapl(3, i))*w%nda(i)
2392 e_ndrhoa_laplace_rhob(ii) = e_ndrhoa_laplace_rhob(ii) + &
2393 sc*(2.0_dp*w%v2sigmalapl(2, i) - w%v2sigmalapl(4, i))*w%nda(i)
2394 e_ndrhob_laplace_rhoa(ii) = e_ndrhob_laplace_rhoa(ii) + &
2395 sc*(2.0_dp*w%v2sigmalapl(5, i) - w%v2sigmalapl(3, i))*w%ndb(i)
2396 e_ndrhob_laplace_rhob(ii) = e_ndrhob_laplace_rhob(ii) + &
2397 sc*(2.0_dp*w%v2sigmalapl(6, i) - w%v2sigmalapl(4, i))*w%ndb(i)
2398 e_laplace_rhoa_laplace_rhoa(ii) = e_laplace_rhoa_laplace_rhoa(ii) + sc*w%v2lapl2(1, i)
2399 e_laplace_rhoa_laplace_rhob(ii) = e_laplace_rhoa_laplace_rhob(ii) + sc*w%v2lapl2(2, i)
2400 e_laplace_rhob_laplace_rhob(ii) = e_laplace_rhob_laplace_rhob(ii) + sc*w%v2lapl2(3, i)
2401 e_laplace_rhoa_tau_a(ii) = e_laplace_rhoa_tau_a(ii) + sc*w%v2lapltau(1, i)
2402 e_laplace_rhoa_tau_b(ii) = e_laplace_rhoa_tau_b(ii) + sc*w%v2lapltau(2, i)
2403 e_laplace_rhob_tau_a(ii) = e_laplace_rhob_tau_a(ii) + sc*w%v2lapltau(3, i)
2404 e_laplace_rhob_tau_b(ii) = e_laplace_rhob_tau_b(ii) + sc*w%v2lapltau(4, i)
2408 IF (grad_deriv >= 3)
THEN
2411 e_rhoa_rhoa_rhoa(ii) = e_rhoa_rhoa_rhoa(ii) + sc*w%v3rho3(1, i)
2412 e_rhoa_rhoa_rhob(ii) = e_rhoa_rhoa_rhob(ii) + sc*w%v3rho3(2, i)
2413 e_rhoa_rhob_rhob(ii) = e_rhoa_rhob_rhob(ii) + sc*w%v3rho3(3, i)
2414 e_rhob_rhob_rhob(ii) = e_rhob_rhob_rhob(ii) + sc*w%v3rho3(4, i)
2421 END SUBROUTINE libxc_spin_polarized_calc
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
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
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_norm_drhoa
integer, parameter, public deriv_rhob
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_norm_drhob
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
subroutine, public libxc_spin_unpolarized_info(libxc_params, reference, shortform, needs, max_deriv, print_warn, func_name_override)
info about the functional from libxc
subroutine, public libxc_spin_unpolarized_eval(rho_set, deriv_set, grad_deriv, libxc_params, func_name_override)
evaluates the functional from libxc
subroutine, public libxc_spin_polarized_info(libxc_params, reference, shortform, needs, max_deriv, print_warn, func_name_override)
info about the functional from libxc
subroutine, public libxc_release_workers()
Reads the external parameters of a LibXC functional from its input section.
subroutine, public libxc_spin_polarized_eval(rho_set, deriv_set, grad_deriv, libxc_params, func_name_override)
evaluates the functional from libxc
subroutine, public libxc_version_info(version, compiled_version)
info about the LibXC version
subroutine, public libxc_add_sections(section)
...
logical function, public libxc_check_existence_in_libxc(libxc_params)
This function checks whether a functional name belongs to LibXC.
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.
subroutine, public libxc_library_reference(reference, doi)
Returns the citation LibXC asks for the library itself.
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
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