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_functional_get_number, &
108 xc_libxc_wrap_needs_laplace, &
109 xc_libxc_wrap_functional_set_params, &
110 xc_libxc_wrap_is_under_development, &
111 xc_libxc_get_reference_length, &
112 xc_libxc_check_functional
115#include "../base/base_uses.f90"
120 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xc_libxc'
127 INTEGER(C_SIZE_T),
PARAMETER,
PRIVATE :: one = 1
144 exists = xc_libxc_check_functional(libxc_params%section%name)
146 mark_used(libxc_params)
161 LOGICAL,
INTENT(IN) :: lsd
165 CHARACTER(len=*),
PARAMETER :: routinen =
'libxc_get_reference_length'
167 CHARACTER(LEN=default_string_length) :: func_name
168 INTEGER :: func_id, handle
169 TYPE(xc_f03_func_t) :: xc_func
170 TYPE(xc_f03_func_info_t) :: xc_info
172 CALL timeset(routinen, handle)
174 func_name = libxc_params%section%name
176 func_id = xc_libxc_wrap_functional_get_number(func_name)
179 CALL xc_f03_func_init(xc_func, func_id, xc_polarized)
181 CALL xc_f03_func_init(xc_func, func_id, xc_unpolarized)
183 xc_info = xc_f03_func_get_info(xc_func)
187 length = xc_libxc_get_reference_length(xc_info)
189 CALL xc_f03_func_end(xc_func)
191 CALL timestop(handle)
193 mark_used(libxc_params)
196 cpabort(
"In order to use LibXC you have to download and install it!")
210 CHARACTER(len=*),
PARAMETER :: routinen =
'libxc_add_sections'
214 INTEGER :: handle, no_func, len_name, ii, func_id, n_param, iparam
215 REAL(kind=c_double) :: default_val
216 CHARACTER(LEN=128) :: func_name, param_name, param_descr, description
217 CHARACTER(LEN=2*default_string_length) :: warning
218 INTEGER(KIND=C_INT),
DIMENSION(:),
ALLOCATABLE :: func_ids
219 TYPE(xc_f03_func_t) :: xc_func
220 TYPE(xc_f03_func_info_t) :: xc_info
222 CALL timeset(routinen, handle)
224 cpassert(
ASSOCIATED(section))
225 NULLIFY (subsection, keyword)
227 no_func = xc_f03_number_of_functionals()
228 len_name = xc_f03_maximum_name_length()
230 ALLOCATE (func_ids(no_func))
232 CALL xc_f03_available_functional_numbers(func_ids)
236 func_id = func_ids(ii)
238 IF (func_id == func_ids(ii - 1)) cycle
241 CALL xc_f03_func_init(xc_func, func_id, xc_unpolarized)
242 xc_info = xc_f03_func_get_info(xc_func)
246 func_name = xc_f03_functional_get_name(func_id)
247 description = xc_f03_func_info_get_name(xc_info)
248 n_param = xc_f03_func_info_get_n_ext_params(xc_info)
251 CALL section_create(subsection, __location__, name=trim(func_name), description=trim(description), &
252 n_keywords=2 + n_param, n_subsections=0, repeats=.false.)
254 IF (description(1:1) ==
"_")
THEN
255 warning =
" This parameter is an internal parameter of the functional. Changing this "// &
256 "parameter effectively changes the functional."
262 CALL keyword_create(keyword, __location__, name=
"_SECTION_PARAMETERS_", &
263 description=
"Activates the functional."//trim(warning), &
264 lone_keyword_l_val=.true., default_l_val=.false.)
268 CALL keyword_create(keyword, __location__, name=
"SCALE", description=
"Scales this functional", &
269 default_r_val=1.0_dp)
273 DO iparam = 1, n_param
274 param_name = xc_f03_func_info_get_ext_params_name(xc_info, iparam - 1)
275 param_descr = xc_f03_func_info_get_ext_params_description(xc_info, iparam - 1)
276 default_val = xc_f03_func_info_get_ext_params_default_value(xc_info, iparam - 1)
278 CALL keyword_create(keyword, __location__, name=trim(param_name), &
279 description=trim(param_descr), default_r_val=default_val)
287 CALL xc_f03_func_end(xc_func)
291 DEALLOCATE (func_ids)
293 CALL timestop(handle)
313 SUBROUTINE libxc_lda_info(libxc_params, reference, shortform, needs, max_deriv, print_warn, &
317 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: reference, shortform
319 INTENT(inout),
OPTIONAL :: needs
320 INTEGER,
INTENT(out),
OPTIONAL :: max_deriv
321 LOGICAL,
INTENT(IN),
OPTIONAL :: print_warn
322 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: func_name_override
325 CHARACTER(LEN=128) :: s1, s2
326 CHARACTER(LEN=default_string_length) :: func_name
328 REAL(kind=
dp) :: func_scale
329 TYPE(xc_f03_func_t) :: xc_func
330 TYPE(xc_f03_func_info_t) :: xc_info
332 IF (
PRESENT(func_name_override))
THEN
333 func_name = func_name_override
336 func_name = libxc_params%section%name
343 IF (abs(func_scale - 1.0_dp) < 1.0e-10_dp) func_scale = 1.0_dp
345 func_id = xc_libxc_wrap_functional_get_number(func_name)
347 CALL xc_f03_func_init(xc_func, func_id, xc_unpolarized)
348 xc_info = xc_f03_func_get_info(xc_func)
352 s1 = xc_f03_func_info_get_name(xc_info)
353 SELECT CASE (xc_f03_func_info_get_kind(xc_info))
354 CASE (xc_exchange);
WRITE (s2,
'(a)')
"exchange"
355 CASE (xc_correlation);
WRITE (s2,
'(a)')
"correlation"
356 CASE (xc_exchange_correlation);
WRITE (s2,
'(a)')
"exchange-correlation"
357 CASE (xc_kinetic);
WRITE (s2,
'(a)')
"kinetic"
359 cpabort(trim(func_name)//
": this XC_KIND is currently not supported.")
361 IF (
PRESENT(shortform))
THEN
362 shortform = trim(s1)//
' ('//trim(s2)//
')'
364 IF (
PRESENT(reference))
THEN
365 CALL xc_libxc_wrap_info_refs(xc_info, xc_unpolarized, func_scale, reference)
367 IF (
PRESENT(needs))
THEN
368 SELECT CASE (xc_f03_func_info_get_family(xc_info))
369 CASE (xc_family_lda, xc_family_hyb_lda)
371 CASE (xc_family_gga, xc_family_hyb_gga)
373 needs%norm_drho = .true.
374 CASE (xc_family_mgga, xc_family_hyb_mgga)
376 needs%norm_drho = .true.
378 needs%laplace_rho = xc_libxc_wrap_needs_laplace(func_id)
380 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
383 IF (
PRESENT(max_deriv))
THEN
384 SELECT CASE (xc_f03_func_info_get_family(xc_info))
385 CASE (xc_family_lda, xc_family_hyb_lda)
387 CASE (xc_family_gga, xc_family_hyb_gga)
389 CASE (xc_family_mgga, xc_family_hyb_mgga)
392 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
395 IF (
PRESENT(print_warn))
THEN
396 IF (print_warn .AND. xc_libxc_wrap_is_under_development(xc_info))
THEN
397 cpwarn(trim(func_name)//
" is under development. Use with caution.")
401 CALL xc_f03_func_end(xc_func)
403 mark_used(libxc_params)
408 mark_used(print_warn)
409 mark_used(func_name_override)
411 CALL cp_abort(__location__,
"Unknown functional! If you are asking "// &
412 "for a functional of the LibXC library, "// &
413 "you have to download and install the library!")
430 SUBROUTINE libxc_lsd_info(libxc_params, reference, shortform, needs, max_deriv, print_warn, &
434 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: reference, shortform
436 INTENT(inout),
OPTIONAL :: needs
437 INTEGER,
INTENT(out),
OPTIONAL :: max_deriv
438 LOGICAL,
INTENT(IN),
OPTIONAL :: print_warn
439 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: func_name_override
442 CHARACTER(LEN=128) :: s1, s2
443 CHARACTER(LEN=default_string_length) :: func_name
445 REAL(kind=
dp) :: func_scale
446 TYPE(xc_f03_func_t) :: xc_func
447 TYPE(xc_f03_func_info_t) :: xc_info
449 IF (
PRESENT(func_name_override))
THEN
450 func_name = func_name_override
453 func_name = libxc_params%section%name
460 IF (abs(func_scale - 1.0_dp) < 1.0e-10_dp) func_scale = 1.0_dp
462 func_id = xc_libxc_wrap_functional_get_number(func_name)
464 CALL xc_f03_func_init(xc_func, func_id, xc_polarized)
465 xc_info = xc_f03_func_get_info(xc_func)
469 s1 = xc_f03_func_info_get_name(xc_info)
470 SELECT CASE (xc_f03_func_info_get_kind(xc_info))
471 CASE (xc_exchange);
WRITE (s2,
'(a)')
"exchange"
472 CASE (xc_correlation);
WRITE (s2,
'(a)')
"correlation"
473 CASE (xc_exchange_correlation);
WRITE (s2,
'(a)')
"exchange-correlation"
474 CASE (xc_kinetic);
WRITE (s2,
'(a)')
"kinetic"
476 cpabort(trim(func_name)//
": this XC_KIND is currently not supported.")
478 IF (
PRESENT(shortform))
THEN
479 shortform = trim(s1)//
' ('//trim(s2)//
')'
481 IF (
PRESENT(reference))
THEN
482 CALL xc_libxc_wrap_info_refs(xc_info, xc_polarized, func_scale, reference)
484 IF (
PRESENT(needs))
THEN
485 SELECT CASE (xc_f03_func_info_get_family(xc_info))
486 CASE (xc_family_lda, xc_family_hyb_lda)
487 needs%rho_spin = .true.
488 CASE (xc_family_gga, xc_family_hyb_gga)
489 needs%rho_spin = .true.
490 needs%norm_drho = .true.
491 needs%norm_drho_spin = .true.
492 CASE (xc_family_mgga, xc_family_hyb_mgga)
493 needs%rho_spin = .true.
494 needs%norm_drho = .true.
495 needs%norm_drho_spin = .true.
496 needs%tau_spin = .true.
497 needs%laplace_rho_spin = xc_libxc_wrap_needs_laplace(func_id)
499 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
502 IF (
PRESENT(max_deriv))
THEN
503 SELECT CASE (xc_f03_func_info_get_family(xc_info))
504 CASE (xc_family_lda, xc_family_hyb_lda)
506 CASE (xc_family_gga, xc_family_hyb_gga)
508 CASE (xc_family_mgga, xc_family_hyb_mgga)
511 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
514 IF (
PRESENT(print_warn))
THEN
515 IF (print_warn .AND. xc_libxc_wrap_is_under_development(xc_info))
THEN
516 cpwarn(trim(func_name)//
" is under development. Use with caution.")
520 CALL xc_f03_func_end(xc_func)
522 mark_used(libxc_params)
527 mark_used(print_warn)
528 mark_used(func_name_override)
530 CALL cp_abort(__location__,
"Unknown functional! If you are "// &
531 "asking for a functional of the LibXC library, "// &
532 "you have to download and install the library!")
543 CHARACTER(LEN=*),
INTENT(OUT) :: version
546 CALL xc_libxc_wrap_version(version)
549 cpabort(
"In order to use libxc you need to download and install it")
566 SUBROUTINE libxc_lda_eval(rho_set, deriv_set, grad_deriv, libxc_params, func_name_override)
570 INTEGER,
INTENT(in) :: grad_deriv
572 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: func_name_override
575 CHARACTER(len=*),
PARAMETER :: routinen =
'libxc_lda_eval'
577 CHARACTER(LEN=default_string_length) :: func_name
578 INTEGER :: func_id, handle, npoints
579 INTEGER,
DIMENSION(2, 3) :: bo
580 LOGICAL :: has_laplace, no_exc
581 REAL(kind=
dp) :: epsilon_rho, epsilon_tau, func_scale
582 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :),
POINTER :: dummy, e_0, e_laplace_rho, &
583 e_laplace_rho_laplace_rho, e_laplace_rho_tau, e_ndrho, &
584 e_ndrho_laplace_rho, e_ndrho_ndrho, e_ndrho_rho, e_ndrho_tau, e_rho, &
585 e_rho_laplace_rho, e_rho_rho, e_rho_rho_rho, e_rho_tau, e_tau, &
586 e_tau_tau, laplace_rho, norm_drho, rho, tau
588 TYPE(xc_f03_func_t) :: xc_func
589 TYPE(xc_f03_func_info_t) :: xc_info
591 CALL timeset(routinen, handle)
593 has_laplace = .false.
595 NULLIFY (rho, norm_drho, laplace_rho, tau)
597 IF (
PRESENT(func_name_override))
THEN
598 func_name = func_name_override
601 func_name = libxc_params%section%name
605 IF (abs(func_scale - 1.0_dp) < 1.0e-10_dp) func_scale = 1.0_dp
607 func_id = xc_libxc_wrap_functional_get_number(func_name)
608 CALL xc_f03_func_init(xc_func, func_id, xc_unpolarized)
609 xc_info = xc_f03_func_get_info(xc_func)
611 IF (.NOT.
PRESENT(func_name_override))
THEN
612 CALL xc_libxc_wrap_functional_set_params(xc_func, xc_info, libxc_params, no_exc)
616 rho=rho, norm_drho=norm_drho, laplace_rho=laplace_rho, &
617 rho_cutoff=epsilon_rho, tau_cutoff=epsilon_tau, &
618 tau=tau, local_bounds=bo)
620 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
625 IF (.NOT.
ASSOCIATED(norm_drho)) norm_drho => dummy
626 IF (.NOT.
ASSOCIATED(tau)) tau => dummy
630 has_laplace = xc_libxc_wrap_needs_laplace(func_id)
631 IF (.NOT. has_laplace) laplace_rho => dummy
636 e_laplace_rho => dummy
640 e_ndrho_ndrho => dummy
641 e_rho_laplace_rho => dummy
643 e_ndrho_laplace_rho => dummy
645 e_laplace_rho_laplace_rho => dummy
646 e_laplace_rho_tau => dummy
648 e_rho_rho_rho => dummy
650 IF (grad_deriv >= 0)
THEN
652 allocate_deriv=.true.)
655 IF (grad_deriv >= 1 .OR. grad_deriv == -1)
THEN
656 SELECT CASE (xc_f03_func_info_get_family(xc_info))
657 CASE (xc_family_lda, xc_family_hyb_lda)
659 allocate_deriv=.true.)
661 CASE (xc_family_gga, xc_family_hyb_gga)
663 allocate_deriv=.true.)
666 allocate_deriv=.true.)
668 CASE (xc_family_mgga, xc_family_hyb_mgga)
670 allocate_deriv=.true.)
673 allocate_deriv=.true.)
676 allocate_deriv=.true.)
678 IF (has_laplace)
THEN
680 allocate_deriv=.true.)
684 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
687 IF (grad_deriv >= 2 .OR. grad_deriv == -2)
THEN
688 SELECT CASE (xc_f03_func_info_get_family(xc_info))
689 CASE (xc_family_lda, xc_family_hyb_lda)
691 allocate_deriv=.true.)
693 CASE (xc_family_gga, xc_family_hyb_gga)
695 allocate_deriv=.true.)
698 allocate_deriv=.true.)
701 allocate_deriv=.true.)
703 CASE (xc_family_mgga, xc_family_hyb_mgga)
707 allocate_deriv=.true.)
710 allocate_deriv=.true.)
713 allocate_deriv=.true.)
716 allocate_deriv=.true.)
719 allocate_deriv=.true.)
722 allocate_deriv=.true.)
724 IF (has_laplace)
THEN
726 allocate_deriv=.true.)
729 allocate_deriv=.true.)
732 allocate_deriv=.true.)
735 allocate_deriv=.true.)
739 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
742 IF (grad_deriv >= 3 .OR. grad_deriv == -3)
THEN
743 SELECT CASE (xc_f03_func_info_get_family(xc_info))
744 CASE (xc_family_lda, xc_family_hyb_lda)
746 allocate_deriv=.true.)
748 CASE (xc_family_gga, xc_family_hyb_gga, xc_family_mgga, xc_family_hyb_mgga)
749 cpabort(
"derivatives larger than 2 not implemented")
751 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
754 IF (grad_deriv >= 4 .OR. grad_deriv <= -4)
THEN
755 cpabort(
"derivatives larger than 3 not implemented")
767 CALL libxc_lda_calc(rho=rho, norm_drho=norm_drho, &
768 laplace_rho=laplace_rho, tau=tau, &
769 e_0=e_0, e_rho=e_rho, e_ndrho=e_ndrho, e_laplace_rho=e_laplace_rho, &
770 e_tau=e_tau, e_rho_rho=e_rho_rho, e_ndrho_rho=e_ndrho_rho, &
771 e_ndrho_ndrho=e_ndrho_ndrho, e_rho_laplace_rho=e_rho_laplace_rho, &
772 e_rho_tau=e_rho_tau, e_ndrho_laplace_rho=e_ndrho_laplace_rho, &
773 e_ndrho_tau=e_ndrho_tau, e_laplace_rho_laplace_rho=e_laplace_rho_laplace_rho, &
774 e_laplace_rho_tau=e_laplace_rho_tau, e_tau_tau=e_tau_tau, &
775 e_rho_rho_rho=e_rho_rho_rho, &
776 grad_deriv=grad_deriv, npoints=npoints, &
777 epsilon_rho=epsilon_rho, &
778 epsilon_tau=epsilon_tau, func_name=func_name, &
779 sc=func_scale, xc_func=xc_func, xc_info=xc_info, no_exc=no_exc, has_laplace=has_laplace)
785 CALL xc_f03_func_end(xc_func)
787 CALL timestop(handle)
791 mark_used(grad_deriv)
792 mark_used(libxc_params)
793 mark_used(func_name_override)
794 CALL cp_abort(__location__,
"Unknown functional! If you are asking "// &
795 "for a functional of the LibXC library, "// &
796 "you have to download and install the library!")
812 SUBROUTINE libxc_lsd_eval(rho_set, deriv_set, grad_deriv, libxc_params, func_name_override)
816 INTEGER,
INTENT(in) :: grad_deriv
818 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: func_name_override
821 CHARACTER(len=*),
PARAMETER :: routinen =
'libxc_lsd_eval'
823 CHARACTER(LEN=default_string_length) :: func_name
824 INTEGER :: func_id, handle, npoints
825 INTEGER,
DIMENSION(2, 3) :: bo
826 LOGICAL :: has_laplace, no_exc
827 REAL(kind=
dp) :: epsilon_rho, epsilon_tau, func_scale
828 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :),
POINTER :: dummy, e_0, e_laplace_rhoa, &
829 e_laplace_rhoa_laplace_rhoa, e_laplace_rhoa_laplace_rhob, &
830 e_laplace_rhoa_tau_a, e_laplace_rhoa_tau_b, e_laplace_rhob, &
831 e_laplace_rhob_laplace_rhob, e_laplace_rhob_tau_a, &
832 e_laplace_rhob_tau_b, e_ndrho, e_ndrho_laplace_rhoa, &
833 e_ndrho_laplace_rhob, e_ndrho_ndrho, e_ndrho_ndrhoa, e_ndrho_ndrhob, &
834 e_ndrho_rhoa, e_ndrho_rhob, e_ndrho_tau_a, e_ndrho_tau_b, e_ndrhoa, &
835 e_ndrhoa_laplace_rhoa, e_ndrhoa_laplace_rhob, e_ndrhoa_ndrhoa, &
836 e_ndrhoa_ndrhob, e_ndrhoa_rhoa, e_ndrhoa_rhob, e_ndrhoa_tau_a, &
837 e_ndrhoa_tau_b, e_ndrhob
838 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :),
POINTER :: e_ndrhob_laplace_rhoa, &
839 e_ndrhob_laplace_rhob, e_ndrhob_ndrhob, e_ndrhob_rhoa, e_ndrhob_rhob, &
840 e_ndrhob_tau_a, e_ndrhob_tau_b, e_rhoa, e_rhoa_laplace_rhoa, &
841 e_rhoa_laplace_rhob, e_rhoa_rhoa, e_rhoa_rhoa_rhoa, e_rhoa_rhoa_rhob, &
842 e_rhoa_rhob, e_rhoa_rhob_rhob, e_rhoa_tau_a, e_rhoa_tau_b, e_rhob, &
843 e_rhob_laplace_rhoa, e_rhob_laplace_rhob, e_rhob_rhob, &
844 e_rhob_rhob_rhob, e_rhob_tau_a, e_rhob_tau_b, e_tau_a, e_tau_a_tau_a, &
845 e_tau_a_tau_b, e_tau_b, e_tau_b_tau_b, laplace_rhoa, laplace_rhob, &
846 norm_drho, norm_drhoa, norm_drhob, rhoa, rhob, tau_a, tau_b
848 TYPE(xc_f03_func_t) :: xc_func
849 TYPE(xc_f03_func_info_t) :: xc_info
851 CALL timeset(routinen, handle)
854 NULLIFY (rhoa, rhob, norm_drho, norm_drhoa, norm_drhob, laplace_rhoa, &
855 laplace_rhob, tau_a, tau_b)
857 IF (
PRESENT(func_name_override))
THEN
858 func_name = func_name_override
861 func_name = libxc_params%section%name
865 IF (abs(func_scale - 1.0_dp) < 1.0e-10_dp) func_scale = 1.0_dp
867 func_id = xc_libxc_wrap_functional_get_number(func_name)
868 CALL xc_f03_func_init(xc_func, func_id, xc_polarized)
869 xc_info = xc_f03_func_get_info(xc_func)
871 IF (.NOT.
PRESENT(func_name_override))
THEN
872 CALL xc_libxc_wrap_functional_set_params(xc_func, xc_info, libxc_params, no_exc)
876 rhoa=rhoa, rhob=rhob, norm_drho=norm_drho, &
877 norm_drhoa=norm_drhoa, norm_drhob=norm_drhob, &
878 laplace_rhoa=laplace_rhoa, laplace_rhob=laplace_rhob, &
879 rho_cutoff=epsilon_rho, tau_cutoff=epsilon_tau, &
880 tau_a=tau_a, tau_b=tau_b, local_bounds=bo)
882 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
887 IF (.NOT.
ASSOCIATED(norm_drho)) norm_drho => dummy
888 IF (.NOT.
ASSOCIATED(norm_drhoa)) norm_drhoa => dummy
889 IF (.NOT.
ASSOCIATED(norm_drhob)) norm_drhob => dummy
890 IF (.NOT.
ASSOCIATED(tau_a)) tau_a => dummy
891 IF (.NOT.
ASSOCIATED(tau_b)) tau_b => dummy
895 has_laplace = xc_libxc_wrap_needs_laplace(func_id)
896 IF (.NOT. has_laplace) laplace_rhoa => dummy
897 IF (.NOT. has_laplace) laplace_rhob => dummy
905 e_laplace_rhoa => dummy
906 e_laplace_rhob => dummy
912 e_ndrho_rhoa => dummy
913 e_ndrho_rhob => dummy
914 e_ndrhoa_rhoa => dummy
915 e_ndrhoa_rhob => dummy
916 e_ndrhob_rhoa => dummy
917 e_ndrhob_rhob => dummy
918 e_ndrho_ndrho => dummy
919 e_ndrho_ndrhoa => dummy
920 e_ndrho_ndrhob => dummy
921 e_ndrhoa_ndrhoa => dummy
922 e_ndrhoa_ndrhob => dummy
923 e_ndrhob_ndrhob => dummy
924 e_rhoa_laplace_rhoa => dummy
925 e_rhoa_laplace_rhob => dummy
926 e_rhob_laplace_rhoa => dummy
927 e_rhob_laplace_rhob => dummy
928 e_rhoa_tau_a => dummy
929 e_rhoa_tau_b => dummy
930 e_rhob_tau_a => dummy
931 e_rhob_tau_b => dummy
932 e_ndrho_laplace_rhoa => dummy
933 e_ndrho_laplace_rhob => dummy
934 e_ndrhoa_laplace_rhoa => dummy
935 e_ndrhoa_laplace_rhob => dummy
936 e_ndrhob_laplace_rhoa => dummy
937 e_ndrhob_laplace_rhob => dummy
938 e_ndrho_tau_a => dummy
939 e_ndrho_tau_b => dummy
940 e_ndrhoa_tau_a => dummy
941 e_ndrhoa_tau_b => dummy
942 e_ndrhob_tau_a => dummy
943 e_ndrhob_tau_b => dummy
944 e_laplace_rhoa_laplace_rhoa => dummy
945 e_laplace_rhoa_laplace_rhob => dummy
946 e_laplace_rhob_laplace_rhob => dummy
947 e_laplace_rhoa_tau_a => dummy
948 e_laplace_rhoa_tau_b => dummy
949 e_laplace_rhob_tau_a => dummy
950 e_laplace_rhob_tau_b => dummy
951 e_tau_a_tau_a => dummy
952 e_tau_a_tau_b => dummy
953 e_tau_b_tau_b => dummy
954 e_rhoa_rhoa_rhoa => dummy
955 e_rhoa_rhoa_rhob => dummy
956 e_rhoa_rhob_rhob => dummy
957 e_rhob_rhob_rhob => dummy
959 IF (grad_deriv >= 0)
THEN
961 allocate_deriv=.true.)
964 IF (grad_deriv >= 1 .OR. grad_deriv == -1)
THEN
965 SELECT CASE (xc_f03_func_info_get_family(xc_info))
966 CASE (xc_family_lda, xc_family_hyb_lda)
968 allocate_deriv=.true.)
971 allocate_deriv=.true.)
973 CASE (xc_family_gga, xc_family_hyb_gga)
975 allocate_deriv=.true.)
978 allocate_deriv=.true.)
981 allocate_deriv=.true.)
984 allocate_deriv=.true.)
987 allocate_deriv=.true.)
989 CASE (xc_family_mgga, xc_family_hyb_mgga)
991 allocate_deriv=.true.)
994 allocate_deriv=.true.)
997 allocate_deriv=.true.)
1000 allocate_deriv=.true.)
1003 allocate_deriv=.true.)
1006 allocate_deriv=.true.)
1009 allocate_deriv=.true.)
1011 IF (has_laplace)
THEN
1013 allocate_deriv=.true.)
1016 allocate_deriv=.true.)
1020 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
1023 IF (grad_deriv >= 2 .OR. grad_deriv == -2)
THEN
1024 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1025 CASE (xc_family_lda, xc_family_hyb_lda)
1027 allocate_deriv=.true.)
1030 allocate_deriv=.true.)
1033 allocate_deriv=.true.)
1035 CASE (xc_family_gga, xc_family_hyb_gga)
1037 allocate_deriv=.true.)
1040 allocate_deriv=.true.)
1043 allocate_deriv=.true.)
1046 allocate_deriv=.true.)
1049 allocate_deriv=.true.)
1052 allocate_deriv=.true.)
1055 allocate_deriv=.true.)
1058 allocate_deriv=.true.)
1061 allocate_deriv=.true.)
1064 allocate_deriv=.true.)
1067 allocate_deriv=.true.)
1070 allocate_deriv=.true.)
1073 allocate_deriv=.true.)
1076 allocate_deriv=.true.)
1079 allocate_deriv=.true.)
1081 CASE (xc_family_mgga, xc_family_hyb_mgga)
1084 allocate_deriv=.true.)
1087 allocate_deriv=.true.)
1090 allocate_deriv=.true.)
1093 allocate_deriv=.true.)
1096 allocate_deriv=.true.)
1099 allocate_deriv=.true.)
1102 allocate_deriv=.true.)
1105 allocate_deriv=.true.)
1108 allocate_deriv=.true.)
1111 allocate_deriv=.true.)
1114 allocate_deriv=.true.)
1117 allocate_deriv=.true.)
1120 allocate_deriv=.true.)
1123 allocate_deriv=.true.)
1126 allocate_deriv=.true.)
1129 allocate_deriv=.true.)
1132 allocate_deriv=.true.)
1135 allocate_deriv=.true.)
1138 allocate_deriv=.true.)
1141 allocate_deriv=.true.)
1144 allocate_deriv=.true.)
1147 allocate_deriv=.true.)
1150 allocate_deriv=.true.)
1153 allocate_deriv=.true.)
1156 allocate_deriv=.true.)
1159 allocate_deriv=.true.)
1162 allocate_deriv=.true.)
1165 allocate_deriv=.true.)
1167 IF (has_laplace)
THEN
1169 allocate_deriv=.true.)
1172 allocate_deriv=.true.)
1175 allocate_deriv=.true.)
1178 allocate_deriv=.true.)
1181 allocate_deriv=.true.)
1184 allocate_deriv=.true.)
1187 allocate_deriv=.true.)
1190 allocate_deriv=.true.)
1193 allocate_deriv=.true.)
1196 allocate_deriv=.true.)
1199 allocate_deriv=.true.)
1202 allocate_deriv=.true.)
1205 allocate_deriv=.true.)
1208 allocate_deriv=.true.)
1211 allocate_deriv=.true.)
1214 allocate_deriv=.true.)
1217 allocate_deriv=.true.)
1221 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
1224 IF (grad_deriv >= 3 .OR. grad_deriv == -3)
THEN
1225 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1226 CASE (xc_family_lda, xc_family_hyb_lda)
1228 allocate_deriv=.true.)
1231 allocate_deriv=.true.)
1234 allocate_deriv=.true.)
1237 allocate_deriv=.true.)
1239 CASE (xc_family_gga, xc_family_hyb_gga, xc_family_mgga, xc_family_hyb_mgga)
1240 cpabort(
"derivatives larger than 2 not implemented")
1242 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
1245 IF (grad_deriv >= 4 .OR. grad_deriv <= -4)
THEN
1246 cpabort(
"derivatives larger than 3 not implemented")
1273 CALL libxc_lsd_calc(rhoa=rhoa, rhob=rhob, norm_drho=norm_drho, &
1274 norm_drhoa=norm_drhoa, norm_drhob=norm_drhob, laplace_rhoa=laplace_rhoa, &
1275 laplace_rhob=laplace_rhob, tau_a=tau_a, tau_b=tau_b, &
1276 e_0=e_0, e_rhoa=e_rhoa, e_rhob=e_rhob, e_ndrho=e_ndrho, &
1277 e_ndrhoa=e_ndrhoa, e_ndrhob=e_ndrhob, e_laplace_rhoa=e_laplace_rhoa, &
1278 e_laplace_rhob=e_laplace_rhob, e_tau_a=e_tau_a, e_tau_b=e_tau_b, &
1279 e_rhoa_rhoa=e_rhoa_rhoa, e_rhoa_rhob=e_rhoa_rhob, e_rhob_rhob=e_rhob_rhob, &
1280 e_ndrho_rhoa=e_ndrho_rhoa, e_ndrho_rhob=e_ndrho_rhob, &
1281 e_ndrhoa_rhoa=e_ndrhoa_rhoa, e_ndrhoa_rhob=e_ndrhoa_rhob, &
1282 e_ndrhob_rhoa=e_ndrhob_rhoa, e_ndrhob_rhob=e_ndrhob_rhob, &
1283 e_ndrho_ndrho=e_ndrho_ndrho, e_ndrho_ndrhoa=e_ndrho_ndrhoa, &
1284 e_ndrho_ndrhob=e_ndrho_ndrhob, e_ndrhoa_ndrhoa=e_ndrhoa_ndrhoa, &
1285 e_ndrhoa_ndrhob=e_ndrhoa_ndrhob, e_ndrhob_ndrhob=e_ndrhob_ndrhob, &
1286 e_rhoa_laplace_rhoa=e_rhoa_laplace_rhoa, &
1287 e_rhoa_laplace_rhob=e_rhoa_laplace_rhob, &
1288 e_rhob_laplace_rhoa=e_rhob_laplace_rhoa, &
1289 e_rhob_laplace_rhob=e_rhob_laplace_rhob, &
1290 e_rhoa_tau_a=e_rhoa_tau_a, e_rhoa_tau_b=e_rhoa_tau_b, &
1291 e_rhob_tau_a=e_rhob_tau_a, e_rhob_tau_b=e_rhob_tau_b, &
1292 e_ndrho_laplace_rhoa=e_ndrho_laplace_rhoa, &
1293 e_ndrho_laplace_rhob=e_ndrho_laplace_rhob, &
1294 e_ndrhoa_laplace_rhoa=e_ndrhoa_laplace_rhoa, &
1295 e_ndrhoa_laplace_rhob=e_ndrhoa_laplace_rhob, &
1296 e_ndrhob_laplace_rhoa=e_ndrhob_laplace_rhoa, &
1297 e_ndrhob_laplace_rhob=e_ndrhob_laplace_rhob, &
1298 e_ndrho_tau_a=e_ndrho_tau_a, e_ndrho_tau_b=e_ndrho_tau_b, &
1299 e_ndrhoa_tau_a=e_ndrhoa_tau_a, e_ndrhoa_tau_b=e_ndrhoa_tau_b, &
1300 e_ndrhob_tau_a=e_ndrhob_tau_a, e_ndrhob_tau_b=e_ndrhob_tau_b, &
1301 e_laplace_rhoa_laplace_rhoa=e_laplace_rhoa_laplace_rhoa, &
1302 e_laplace_rhoa_laplace_rhob=e_laplace_rhoa_laplace_rhob, &
1303 e_laplace_rhob_laplace_rhob=e_laplace_rhob_laplace_rhob, &
1304 e_laplace_rhoa_tau_a=e_laplace_rhoa_tau_a, &
1305 e_laplace_rhoa_tau_b=e_laplace_rhoa_tau_b, &
1306 e_laplace_rhob_tau_a=e_laplace_rhob_tau_a, &
1307 e_laplace_rhob_tau_b=e_laplace_rhob_tau_b, &
1308 e_tau_a_tau_a=e_tau_a_tau_a, &
1309 e_tau_a_tau_b=e_tau_a_tau_b, &
1310 e_tau_b_tau_b=e_tau_b_tau_b, &
1311 e_rhoa_rhoa_rhoa=e_rhoa_rhoa_rhoa, &
1312 e_rhoa_rhoa_rhob=e_rhoa_rhoa_rhob, &
1313 e_rhoa_rhob_rhob=e_rhoa_rhob_rhob, &
1314 e_rhob_rhob_rhob=e_rhob_rhob_rhob, &
1315 grad_deriv=grad_deriv, npoints=npoints, &
1316 epsilon_rho=epsilon_rho, &
1317 epsilon_tau=epsilon_tau, func_name=func_name, &
1318 sc=func_scale, xc_func=xc_func, xc_info=xc_info, no_exc=no_exc, has_laplace=has_laplace)
1324 CALL xc_f03_func_end(xc_func)
1326 CALL timestop(handle)
1329 mark_used(deriv_set)
1330 mark_used(grad_deriv)
1331 mark_used(libxc_params)
1332 mark_used(func_name_override)
1334 CALL cp_abort(__location__,
"Unknown functional! If you are asking "// &
1335 "for a functional of the LibXC library, "// &
1336 "you have to download and install the library!")
1376#if defined (__LIBXC)
1377 SUBROUTINE libxc_lda_calc(rho, norm_drho, laplace_rho, tau, &
1378 e_0, e_rho, e_ndrho, e_laplace_rho, e_tau, e_rho_rho, e_ndrho_rho, &
1379 e_ndrho_ndrho, e_rho_laplace_rho, e_rho_tau, e_ndrho_laplace_rho, &
1380 e_ndrho_tau, e_laplace_rho_laplace_rho, e_laplace_rho_tau, &
1381 e_tau_tau, e_rho_rho_rho, &
1382 grad_deriv, npoints, epsilon_rho, &
1383 epsilon_tau, func_name, sc, xc_func, xc_info, no_exc, has_laplace)
1385 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, norm_drho, laplace_rho, tau
1386 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: e_0, e_rho, e_ndrho, e_laplace_rho, e_tau, &
1387 e_rho_rho, e_ndrho_rho, e_ndrho_ndrho, e_rho_laplace_rho, e_rho_tau, e_ndrho_laplace_rho, &
1388 e_ndrho_tau, e_laplace_rho_laplace_rho, e_laplace_rho_tau, e_tau_tau, e_rho_rho_rho
1389 INTEGER,
INTENT(in) :: grad_deriv, npoints
1390 REAL(kind=
dp),
INTENT(in) :: epsilon_rho, epsilon_tau
1391 CHARACTER(LEN=default_string_length),
INTENT(IN) :: func_name
1392 REAL(kind=
dp),
INTENT(in) :: sc
1393 TYPE(xc_f03_func_t),
INTENT(IN) :: xc_func
1394 TYPE(xc_f03_func_info_t),
INTENT(IN) :: xc_info
1395 LOGICAL,
INTENT(IN) :: no_exc, has_laplace
1398 REAL(kind=
dp),
DIMENSION(1) :: exc, my_tau, sigma, v2lapl2, v2lapltau, v2rho2, v2rholapl, &
1399 v2rhosigma, v2rhotau, v2sigma2, v2sigmalapl, v2sigmatau, v2tau2, v3rho3, vlapl, vrho, &
1405 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1406 CASE (xc_family_lda, xc_family_hyb_lda)
1407 IF (grad_deriv == 0)
THEN
1410 IF (rho(ii) > epsilon_rho)
THEN
1411 CALL xc_f03_lda_exc(xc_func, one, rho(ii), exc)
1412 e_0(ii) = e_0(ii) + sc*exc(1)*rho(ii)
1416 ELSE IF (grad_deriv == -1)
THEN
1419 IF (rho(ii) > epsilon_rho)
THEN
1420 CALL xc_f03_lda_vxc(xc_func, one, rho(ii), vrho)
1421 e_rho(ii) = e_rho(ii) + sc*vrho(1)
1425 ELSE IF (grad_deriv == 1)
THEN
1428 IF (rho(ii) > epsilon_rho)
THEN
1429 CALL xc_f03_lda_exc_vxc(xc_func, one, rho(ii), exc, vrho)
1430 e_0(ii) = e_0(ii) + sc*exc(1)*rho(ii)
1431 e_rho(ii) = e_rho(ii) + sc*vrho(1)
1435 ELSE IF (grad_deriv == -2)
THEN
1438 IF (rho(ii) > epsilon_rho)
THEN
1439 CALL xc_f03_lda_fxc(xc_func, one, rho(ii), v2rho2)
1440 e_rho_rho(ii) = e_rho_rho(ii) + sc*v2rho2(1)
1444 ELSE IF (grad_deriv == 2)
THEN
1447 IF (rho(ii) > epsilon_rho)
THEN
1448 CALL xc_f03_lda_exc_vxc_fxc(xc_func, one, rho(ii), exc, vrho, v2rho2)
1449 e_0(ii) = e_0(ii) + sc*exc(1)*rho(ii)
1450 e_rho(ii) = e_rho(ii) + sc*vrho(1)
1451 e_rho_rho(ii) = e_rho_rho(ii) + sc*v2rho2(1)
1455 ELSE IF (grad_deriv == -3)
THEN
1458 IF (rho(ii) > epsilon_rho)
THEN
1459 CALL xc_f03_lda_kxc(xc_func, one, rho(ii), v3rho3)
1460 e_rho_rho_rho(ii) = e_rho_rho_rho(ii) + sc*v3rho3(1)
1464 ELSE IF (grad_deriv == 3)
THEN
1467 IF (rho(ii) > epsilon_rho)
THEN
1468 CALL xc_f03_lda(xc_func, one, rho(ii), exc, vrho, v2rho2, v3rho3)
1469 e_0(ii) = e_0(ii) + sc*exc(1)*rho(ii)
1470 e_rho(ii) = e_rho(ii) + sc*vrho(1)
1471 e_rho_rho(ii) = e_rho_rho(ii) + sc*v2rho2(1)
1472 e_rho_rho_rho(ii) = e_rho_rho_rho(ii) + sc*v3rho3(1)
1477 CASE (xc_family_gga, xc_family_hyb_gga)
1478 IF (grad_deriv == 0)
THEN
1481 IF (rho(ii) > epsilon_rho)
THEN
1482 sigma = norm_drho(ii)**2
1483 CALL xc_f03_gga_exc(xc_func, one, rho(ii), sigma, exc)
1484 e_0(ii) = e_0(ii) + sc*exc(1)*rho(ii)
1488 ELSE IF (grad_deriv == -1)
THEN
1491 IF (rho(ii) > epsilon_rho)
THEN
1492 sigma = norm_drho(ii)**2
1493 CALL xc_f03_gga_vxc(xc_func, one, rho(ii), sigma, vrho, vsigma)
1494 e_rho(ii) = e_rho(ii) + sc*vrho(1)
1495 e_ndrho(ii) = e_ndrho(ii) + sc*2.0_dp*vsigma(1)*norm_drho(ii)
1499 ELSE IF (grad_deriv == 1)
THEN
1502 IF (rho(ii) > epsilon_rho)
THEN
1503 sigma = norm_drho(ii)**2
1505 CALL xc_f03_gga_vxc(xc_func, one, rho(ii), sigma, vrho, vsigma)
1508 CALL xc_f03_gga_exc_vxc(xc_func, one, rho(ii), sigma, &
1511 e_0(ii) = e_0(ii) + sc*exc(1)*rho(ii)
1512 e_rho(ii) = e_rho(ii) + sc*vrho(1)
1513 e_ndrho(ii) = e_ndrho(ii) + sc*2.0_dp*vsigma(1)*norm_drho(ii)
1517 ELSE IF (grad_deriv == -2)
THEN
1520 IF (rho(ii) > epsilon_rho)
THEN
1521 sigma = norm_drho(ii)**2
1523 CALL xc_f03_gga_vxc_fxc(xc_func, one, rho(ii), sigma, vrho, vsigma, &
1524 v2rho2, v2rhosigma, v2sigma2)
1526 CALL xc_f03_gga_exc_vxc_fxc(xc_func, one, rho(ii), sigma, &
1527 exc, vrho, vsigma, v2rho2, &
1528 v2rhosigma, v2sigma2)
1530 e_rho_rho(ii) = e_rho_rho(ii) + sc*v2rho2(1)
1531 e_ndrho_rho(ii) = e_ndrho_rho(ii) + sc*2.0_dp*v2rhosigma(1)*norm_drho(ii)
1532 e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) + &
1533 sc*2.0_dp*(2.0_dp*sigma(1)*v2sigma2(1) + vsigma(1))
1537 ELSE IF (grad_deriv == 2)
THEN
1540 IF (rho(ii) > epsilon_rho)
THEN
1541 sigma = norm_drho(ii)**2
1543 CALL xc_f03_gga_vxc_fxc(xc_func, one, rho(ii), sigma, vrho, vsigma, &
1544 v2rho2, v2rhosigma, v2sigma2)
1547 CALL xc_f03_gga_exc_vxc_fxc(xc_func, one, rho(ii), sigma, &
1548 exc, vrho, vsigma, &
1549 v2rho2, v2rhosigma, v2sigma2)
1551 e_0(ii) = e_0(ii) + sc*exc(1)*rho(ii)
1552 e_rho(ii) = e_rho(ii) + sc*vrho(1)
1553 e_ndrho(ii) = e_ndrho(ii) + sc*2.0_dp*vsigma(1)*norm_drho(ii)
1554 e_rho_rho(ii) = e_rho_rho(ii) + sc*v2rho2(1)
1555 e_ndrho_rho(ii) = e_ndrho_rho(ii) + sc*2.0_dp*v2rhosigma(1)*norm_drho(ii)
1556 e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) + &
1557 sc*2.0_dp*(2.0_dp*sigma(1)*v2sigma2(1) + vsigma(1))
1562 CASE (xc_family_mgga, xc_family_hyb_mgga)
1563 IF (grad_deriv == 0)
THEN
1566 IF ((rho(ii) > epsilon_rho) .AND. (tau(ii) > epsilon_tau))
THEN
1567 sigma = norm_drho(ii)**2
1568 my_tau(1) = max(tau(ii), sigma(1)/(8.0_dp*rho(ii)))
1569 CALL xc_f03_mgga_exc(xc_func, one, rho(ii), sigma, &
1570 laplace_rho(ii), my_tau, exc)
1571 e_0(ii) = e_0(ii) + sc*exc(1)*rho(ii)
1575 ELSE IF (grad_deriv == -1)
THEN
1578 IF ((rho(ii) > epsilon_rho) .AND. (tau(ii) > epsilon_tau))
THEN
1579 sigma = norm_drho(ii)**2
1580 my_tau(1) = max(tau(ii), sigma(1)/(8.0_dp*rho(ii)))
1581 CALL xc_f03_mgga_vxc(xc_func, one, rho(ii), sigma, &
1582 laplace_rho(ii), my_tau, vrho, vsigma, vlapl, vtau)
1583 e_rho(ii) = e_rho(ii) + sc*vrho(1)
1584 e_ndrho(ii) = e_ndrho(ii) + sc*2.0_dp*vsigma(1)*norm_drho(ii)
1585 IF (has_laplace) e_laplace_rho(ii) = e_laplace_rho(ii) + sc*vlapl(1)
1586 e_tau(ii) = e_tau(ii) + sc*vtau(1)
1590 ELSE IF (grad_deriv == 1)
THEN
1593 IF ((rho(ii) > epsilon_rho) .AND. (tau(ii) > epsilon_tau))
THEN
1594 sigma(1) = norm_drho(ii)**2
1595 my_tau(1) = max(tau(ii), sigma(1)/(8.0_dp*rho(ii)))
1597 CALL xc_f03_mgga_vxc(xc_func, one, rho(ii), sigma, &
1598 laplace_rho(ii), my_tau, vrho, vsigma, vlapl, vtau)
1601 CALL xc_f03_mgga_exc_vxc(xc_func, one, rho(ii), sigma, &
1602 laplace_rho(ii), my_tau, exc, vrho, vsigma, vlapl, vtau)
1604 e_0(ii) = e_0(ii) + sc*exc(1)*rho(ii)
1605 e_rho(ii) = e_rho(ii) + sc*vrho(1)
1606 e_ndrho(ii) = e_ndrho(ii) + sc*2.0_dp*vsigma(1)*norm_drho(ii)
1607 IF (has_laplace) e_laplace_rho(ii) = e_laplace_rho(ii) + sc*vlapl(1)
1608 e_tau(ii) = e_tau(ii) + sc*vtau(1)
1612 ELSE IF (grad_deriv == -2)
THEN
1615 IF ((rho(ii) > epsilon_rho) .AND. (tau(ii) > epsilon_tau))
THEN
1616 sigma = norm_drho(ii)**2
1617 my_tau(1) = max(tau(ii), sigma(1)/(8.0_dp*rho(ii)))
1619 CALL xc_f03_mgga_vxc_fxc(xc_func, one, rho(ii), sigma, &
1620 laplace_rho(ii), my_tau, vrho, vsigma, vlapl, vtau, &
1621 v2rho2, v2rhosigma, v2rholapl, v2rhotau, v2sigma2, v2sigmalapl, v2sigmatau, &
1622 v2lapl2, v2lapltau, v2tau2)
1624 CALL xc_f03_mgga(xc_func, one, rho(ii), sigma, &
1625 laplace_rho(ii), my_tau, exc, vrho, vsigma, vlapl, vtau, &
1626 v2rho2, v2rhosigma, v2rholapl, v2rhotau, v2sigma2, v2sigmalapl, v2sigmatau, &
1627 v2lapl2, v2lapltau, v2tau2)
1629 e_rho_rho(ii) = e_rho_rho(ii) + sc*v2rho2(1)
1630 e_ndrho_rho(ii) = e_ndrho_rho(ii) + sc*2.0_dp*v2rhosigma(1)*norm_drho(ii)
1631 e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) + &
1632 sc*2.0_dp*(2.0_dp*sigma(1)*v2sigma2(1) + vsigma(1))
1633 e_rho_tau(ii) = e_rho_tau(ii) + sc*v2rhotau(1)
1634 e_ndrho_tau(ii) = e_ndrho_tau(ii) + sc*2.0_dp*v2sigmatau(1)*norm_drho(ii)
1635 e_tau_tau(ii) = e_tau_tau(ii) + sc*v2tau2(1)
1636 IF (has_laplace)
THEN
1637 e_rho_laplace_rho(ii) = e_rho_laplace_rho(ii) + sc*v2rholapl(1)
1638 e_ndrho_laplace_rho(ii) = e_ndrho_laplace_rho(ii) + &
1639 sc*2.0_dp*v2sigmalapl(1)*norm_drho(ii)
1640 e_laplace_rho_laplace_rho(ii) = e_laplace_rho_laplace_rho(ii) + sc*v2lapl2(1)
1641 e_laplace_rho_tau(ii) = e_laplace_rho_tau(ii) + sc*v2lapltau(1)
1646 ELSE IF (grad_deriv == 2)
THEN
1649 IF ((rho(ii) > epsilon_rho) .AND. (tau(ii) > epsilon_tau))
THEN
1650 sigma = norm_drho(ii)**2
1651 my_tau(1) = max(tau(ii), sigma(1)/(8.0_dp*rho(ii)))
1653 CALL xc_f03_mgga_vxc_fxc(xc_func, one, rho(ii), sigma, &
1654 laplace_rho(ii), my_tau, vrho, vsigma, vlapl, vtau, &
1655 v2rho2, v2rhosigma, v2rholapl, v2rhotau, v2sigma2, v2sigmalapl, v2sigmatau, &
1656 v2lapl2, v2lapltau, v2tau2)
1659 CALL xc_f03_mgga(xc_func, one, rho(ii), sigma, &
1660 laplace_rho(ii), my_tau, exc, vrho, vsigma, vlapl, vtau, &
1661 v2rho2, v2rhosigma, v2rholapl, v2rhotau, v2sigma2, v2sigmalapl, v2sigmatau, &
1662 v2lapl2, v2lapltau, v2tau2)
1664 e_0(ii) = e_0(ii) + sc*exc(1)*rho(ii)
1665 e_rho(ii) = e_rho(ii) + sc*vrho(1)
1666 e_ndrho(ii) = e_ndrho(ii) + sc*2.0_dp*vsigma(1)*norm_drho(ii)
1667 e_tau(ii) = e_tau(ii) + sc*vtau(1)
1668 e_rho_rho(ii) = e_rho_rho(ii) + sc*v2rho2(1)
1669 e_ndrho_rho(ii) = e_ndrho_rho(ii) + sc*2.0_dp*v2rhosigma(1)*norm_drho(ii)
1670 e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) + &
1671 sc*2.0_dp*(2.0_dp*sigma(1)*v2sigma2(1) + vsigma(1))
1672 e_rho_tau(ii) = e_rho_tau(ii) + sc*v2rhotau(1)
1673 e_ndrho_tau(ii) = e_ndrho_tau(ii) + sc*2.0_dp*v2sigmatau(1)*norm_drho(ii)
1674 e_tau_tau(ii) = e_tau_tau(ii) + sc*v2tau2(1)
1675 IF (has_laplace)
THEN
1676 e_laplace_rho(ii) = e_laplace_rho(ii) + sc*vlapl(1)
1677 e_rho_laplace_rho(ii) = e_rho_laplace_rho(ii) + sc*v2rholapl(1)
1678 e_ndrho_laplace_rho(ii) = e_ndrho_laplace_rho(ii) + &
1679 sc*2.0_dp*v2sigmalapl(1)*norm_drho(ii)
1680 e_laplace_rho_laplace_rho(ii) = e_laplace_rho_laplace_rho(ii) + sc*v2lapl2(1)
1681 e_laplace_rho_tau(ii) = e_laplace_rho_tau(ii) + sc*v2lapltau(1)
1688 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
1691 END SUBROUTINE libxc_lda_calc
1778#if defined (__LIBXC)
1779 SUBROUTINE libxc_lsd_calc(rhoa, rhob, norm_drho, norm_drhoa, &
1780 norm_drhob, laplace_rhoa, laplace_rhob, tau_a, tau_b, &
1781 e_0, e_rhoa, e_rhob, e_ndrho, e_ndrhoa, e_ndrhob, &
1782 e_laplace_rhoa, e_laplace_rhob, e_tau_a, e_tau_b, &
1783 e_rhoa_rhoa, e_rhoa_rhob, e_rhob_rhob, &
1784 e_ndrho_rhoa, e_ndrho_rhob, e_ndrhoa_rhoa, &
1785 e_ndrhoa_rhob, e_ndrhob_rhoa, e_ndrhob_rhob, &
1786 e_ndrho_ndrho, e_ndrho_ndrhoa, e_ndrho_ndrhob, &
1787 e_ndrhoa_ndrhoa, e_ndrhoa_ndrhob, e_ndrhob_ndrhob, &
1788 e_rhoa_laplace_rhoa, e_rhoa_laplace_rhob, &
1789 e_rhob_laplace_rhoa, e_rhob_laplace_rhob, &
1790 e_rhoa_tau_a, e_rhoa_tau_b, e_rhob_tau_a, e_rhob_tau_b, &
1791 e_ndrho_laplace_rhoa, e_ndrho_laplace_rhob, &
1792 e_ndrhoa_laplace_rhoa, e_ndrhoa_laplace_rhob, &
1793 e_ndrhob_laplace_rhoa, e_ndrhob_laplace_rhob, &
1794 e_ndrho_tau_a, e_ndrho_tau_b, &
1795 e_ndrhoa_tau_a, e_ndrhoa_tau_b, &
1796 e_ndrhob_tau_a, e_ndrhob_tau_b, &
1797 e_laplace_rhoa_laplace_rhoa, &
1798 e_laplace_rhoa_laplace_rhob, &
1799 e_laplace_rhob_laplace_rhob, &
1800 e_laplace_rhoa_tau_a, e_laplace_rhoa_tau_b, &
1801 e_laplace_rhob_tau_a, e_laplace_rhob_tau_b, &
1802 e_tau_a_tau_a, e_tau_a_tau_b, e_tau_b_tau_b, &
1803 e_rhoa_rhoa_rhoa, e_rhoa_rhoa_rhob, &
1804 e_rhoa_rhob_rhob, e_rhob_rhob_rhob, &
1805 grad_deriv, npoints, epsilon_rho, &
1806 epsilon_tau, func_name, sc, xc_func, xc_info, no_exc, has_laplace)
1808 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rhoa, rhob, norm_drho, norm_drhoa, &
1809 norm_drhob, laplace_rhoa, &
1810 laplace_rhob, tau_a, tau_b
1811 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: e_0, e_rhoa, e_rhob, e_ndrho, e_ndrhoa, &
1812 e_ndrhob, e_laplace_rhoa, e_laplace_rhob, e_tau_a, e_tau_b, e_rhoa_rhoa, e_rhoa_rhob, &
1813 e_rhob_rhob, e_ndrho_rhoa, e_ndrho_rhob, e_ndrhoa_rhoa, e_ndrhoa_rhob, e_ndrhob_rhoa, &
1814 e_ndrhob_rhob, e_ndrho_ndrho, e_ndrho_ndrhoa, e_ndrho_ndrhob, e_ndrhoa_ndrhoa, &
1815 e_ndrhoa_ndrhob, e_ndrhob_ndrhob, e_rhoa_laplace_rhoa, e_rhoa_laplace_rhob, &
1816 e_rhob_laplace_rhoa, e_rhob_laplace_rhob, e_rhoa_tau_a, e_rhoa_tau_b, e_rhob_tau_a, &
1817 e_rhob_tau_b, e_ndrho_laplace_rhoa, e_ndrho_laplace_rhob, e_ndrhoa_laplace_rhoa
1818 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: e_ndrhoa_laplace_rhob, e_ndrhob_laplace_rhoa, &
1819 e_ndrhob_laplace_rhob, e_ndrho_tau_a, e_ndrho_tau_b, e_ndrhoa_tau_a, e_ndrhoa_tau_b, &
1820 e_ndrhob_tau_a, e_ndrhob_tau_b, e_laplace_rhoa_laplace_rhoa, e_laplace_rhoa_laplace_rhob, &
1821 e_laplace_rhob_laplace_rhob, e_laplace_rhoa_tau_a, e_laplace_rhoa_tau_b, &
1822 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, &
1823 e_rhoa_rhoa_rhoa, e_rhoa_rhoa_rhob, e_rhoa_rhob_rhob, e_rhob_rhob_rhob
1824 INTEGER,
INTENT(in) :: grad_deriv, npoints
1825 REAL(kind=
dp),
INTENT(in) :: epsilon_rho, epsilon_tau
1826 CHARACTER(LEN=default_string_length),
INTENT(IN) :: func_name
1827 REAL(kind=
dp),
INTENT(in) :: sc
1828 TYPE(xc_f03_func_t),
INTENT(IN) :: xc_func
1829 TYPE(xc_f03_func_info_t),
INTENT(IN) :: xc_info
1830 LOGICAL,
INTENT(IN) :: no_exc, has_laplace
1833 REAL(kind=
dp) :: my_norm_drho, my_norm_drhoa, &
1834 my_norm_drhob, my_rhoa, my_rhob, &
1836 REAL(kind=
dp),
DIMENSION(1) :: exc
1837 REAL(kind=
dp),
DIMENSION(2, 1) :: laplace_rhov, rhov, tauv, vlapl, vrho, &
1839 REAL(kind=
dp),
DIMENSION(3, 1) :: sigmav, v2lapl2, v2rho2, v2tau2, vsigma
1840 REAL(kind=
dp),
DIMENSION(4, 1) :: v2lapltau, v2rholapl, v2rhotau, v3rho3
1841 REAL(kind=
dp),
DIMENSION(6, 1) :: v2rhosigma, v2sigma2, v2sigmalapl, &
1844 vlapl(1, 1) = 0.0_dp
1845 vlapl(2, 1) = 0.0_dp
1847 SELECT CASE (xc_f03_func_info_get_family(xc_info))
1848 CASE (xc_family_lda, xc_family_hyb_lda)
1849 IF (grad_deriv == 0)
THEN
1852 my_rhoa = max(rhoa(ii), 0.0_dp)
1853 my_rhob = max(rhob(ii), 0.0_dp)
1854 IF ((my_rhoa + my_rhob) > epsilon_rho)
THEN
1855 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
1856 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
1857 CALL xc_f03_lda_exc(xc_func, one, rhov(1, 1), exc)
1858 e_0(ii) = e_0(ii) + sc*exc(1)*(rhov(1, 1) + rhov(2, 1))
1862 ELSE IF (grad_deriv == -1)
THEN
1865 my_rhoa = max(rhoa(ii), 0.0_dp)
1866 my_rhob = max(rhob(ii), 0.0_dp)
1867 IF ((my_rhoa + my_rhob) > epsilon_rho)
THEN
1868 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
1869 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
1870 CALL xc_f03_lda_vxc(xc_func, one, rhov(1, 1), vrho(1, 1))
1871 e_rhoa(ii) = e_rhoa(ii) + sc*vrho(1, 1)
1872 e_rhob(ii) = e_rhob(ii) + sc*vrho(2, 1)
1876 ELSE IF (grad_deriv == 1)
THEN
1879 my_rhoa = max(rhoa(ii), 0.0_dp)
1880 my_rhob = max(rhob(ii), 0.0_dp)
1881 IF ((my_rhoa + my_rhob) > epsilon_rho)
THEN
1882 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
1883 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
1884 CALL xc_f03_lda_exc_vxc(xc_func, one, rhov(1, 1), exc, vrho(1, 1))
1885 e_0(ii) = e_0(ii) + sc*exc(1)*(rhov(1, 1) + rhov(2, 1))
1886 e_rhoa(ii) = e_rhoa(ii) + sc*vrho(1, 1)
1887 e_rhob(ii) = e_rhob(ii) + sc*vrho(2, 1)
1891 ELSE IF (grad_deriv == -2)
THEN
1894 my_rhoa = max(rhoa(ii), 0.0_dp)
1895 my_rhob = max(rhob(ii), 0.0_dp)
1896 IF ((my_rhoa + my_rhob) > epsilon_rho)
THEN
1897 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
1898 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
1899 CALL xc_f03_lda_fxc(xc_func, one, rhov(1, 1), v2rho2(1, 1))
1900 e_rhoa_rhoa(ii) = e_rhoa_rhoa(ii) + sc*v2rho2(1, 1)
1901 e_rhoa_rhob(ii) = e_rhoa_rhob(ii) + sc*v2rho2(2, 1)
1902 e_rhob_rhob(ii) = e_rhob_rhob(ii) + sc*v2rho2(3, 1)
1906 ELSE IF (grad_deriv == 2)
THEN
1909 my_rhoa = max(rhoa(ii), 0.0_dp)
1910 my_rhob = max(rhob(ii), 0.0_dp)
1911 IF ((my_rhoa + my_rhob) > epsilon_rho)
THEN
1912 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
1913 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
1914 CALL xc_f03_lda_exc_vxc_fxc(xc_func, one, rhov(1, 1), exc, vrho(1, 1), v2rho2(1, 1))
1915 e_0(ii) = e_0(ii) + sc*exc(1)*(rhov(1, 1) + rhov(2, 1))
1916 e_rhoa(ii) = e_rhoa(ii) + sc*vrho(1, 1)
1917 e_rhob(ii) = e_rhob(ii) + sc*vrho(2, 1)
1918 e_rhoa_rhoa(ii) = e_rhoa_rhoa(ii) + sc*v2rho2(1, 1)
1919 e_rhoa_rhob(ii) = e_rhoa_rhob(ii) + sc*v2rho2(2, 1)
1920 e_rhob_rhob(ii) = e_rhob_rhob(ii) + sc*v2rho2(3, 1)
1924 ELSE IF (grad_deriv == -3)
THEN
1927 my_rhoa = max(rhoa(ii), 0.0_dp)
1928 my_rhob = max(rhob(ii), 0.0_dp)
1929 IF ((my_rhoa + my_rhob) > epsilon_rho)
THEN
1930 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
1931 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
1932 CALL xc_f03_lda_kxc(xc_func, one, rhov(1, 1), v3rho3(1, 1))
1933 e_rhoa_rhoa_rhoa(ii) = e_rhoa_rhoa_rhoa(ii) + sc*v3rho3(1, 1)
1934 e_rhoa_rhoa_rhob(ii) = e_rhoa_rhoa_rhob(ii) + sc*v3rho3(2, 1)
1935 e_rhoa_rhob_rhob(ii) = e_rhoa_rhob_rhob(ii) + sc*v3rho3(3, 1)
1936 e_rhob_rhob_rhob(ii) = e_rhob_rhob_rhob(ii) + sc*v3rho3(4, 1)
1940 ELSE IF (grad_deriv == 3)
THEN
1943 my_rhoa = max(rhoa(ii), 0.0_dp)
1944 my_rhob = max(rhob(ii), 0.0_dp)
1945 IF ((my_rhoa + my_rhob) > epsilon_rho)
THEN
1946 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
1947 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
1948 CALL xc_f03_lda(xc_func, one, rhov(1, 1), exc, vrho(1, 1), v2rho2(1, 1), v3rho3(1, 1))
1949 e_0(ii) = e_0(ii) + sc*exc(1)*(rhov(1, 1) + rhov(2, 1))
1950 e_rhoa(ii) = e_rhoa(ii) + sc*vrho(1, 1)
1951 e_rhob(ii) = e_rhob(ii) + sc*vrho(2, 1)
1952 e_rhoa_rhoa(ii) = e_rhoa_rhoa(ii) + sc*v2rho2(1, 1)
1953 e_rhoa_rhob(ii) = e_rhoa_rhob(ii) + sc*v2rho2(2, 1)
1954 e_rhob_rhob(ii) = e_rhob_rhob(ii) + sc*v2rho2(3, 1)
1955 e_rhoa_rhoa_rhoa(ii) = e_rhoa_rhoa_rhoa(ii) + sc*v3rho3(1, 1)
1956 e_rhoa_rhoa_rhob(ii) = e_rhoa_rhoa_rhob(ii) + sc*v3rho3(2, 1)
1957 e_rhoa_rhob_rhob(ii) = e_rhoa_rhob_rhob(ii) + sc*v3rho3(3, 1)
1958 e_rhob_rhob_rhob(ii) = e_rhob_rhob_rhob(ii) + sc*v3rho3(4, 1)
1963 CASE (xc_family_gga, xc_family_hyb_gga)
1964 IF (grad_deriv == 0)
THEN
1967 my_rhoa = max(rhoa(ii), 0.0_dp)
1968 my_rhob = max(rhob(ii), 0.0_dp)
1969 IF ((my_rhoa + my_rhob) > epsilon_rho)
THEN
1970 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
1971 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
1972 my_norm_drhoa = max(norm_drhoa(ii), epsilon(0.0_dp)*1.e4_dp)
1973 my_norm_drhob = max(norm_drhob(ii), epsilon(0.0_dp)*1.e4_dp)
1974 my_norm_drho = max(norm_drho(ii), epsilon(0.0_dp)*1.e4_dp)
1975 sigmav(1, 1) = my_norm_drhoa**2
1976 sigmav(3, 1) = my_norm_drhob**2
1977 sigmav(2, 1) = 0.5_dp*(my_norm_drho**2 - sigmav(1, 1) - sigmav(3, 1))
1978 CALL xc_f03_gga_exc(xc_func, one, rhov(1, 1), sigmav(1, 1), exc)
1979 e_0(ii) = e_0(ii) + sc*exc(1)*(rhov(1, 1) + rhov(2, 1))
1983 ELSE IF (grad_deriv == -1)
THEN
1986 my_rhoa = max(rhoa(ii), 0.0_dp)
1987 my_rhob = max(rhob(ii), 0.0_dp)
1988 IF ((my_rhoa + my_rhob) > epsilon_rho)
THEN
1989 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
1990 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
1991 my_norm_drhoa = max(norm_drhoa(ii), epsilon(0.0_dp)*1.e4_dp)
1992 my_norm_drhob = max(norm_drhob(ii), epsilon(0.0_dp)*1.e4_dp)
1993 my_norm_drho = max(norm_drho(ii), epsilon(0.0_dp)*1.e4_dp)
1994 sigmav(1, 1) = my_norm_drhoa**2
1995 sigmav(3, 1) = my_norm_drhob**2
1996 sigmav(2, 1) = 0.5_dp*(my_norm_drho**2 - sigmav(1, 1) - sigmav(3, 1))
1997 CALL xc_f03_gga_vxc(xc_func, one, rhov(1, 1), sigmav(1, 1), vrho(1, 1), vsigma(1, 1))
1998 e_rhoa(ii) = e_rhoa(ii) + sc*vrho(1, 1)
1999 e_rhob(ii) = e_rhob(ii) + sc*vrho(2, 1)
2000 e_ndrho(ii) = e_ndrho(ii) + sc*vsigma(2, 1)*my_norm_drho
2001 e_ndrhoa(ii) = e_ndrhoa(ii) + &
2002 sc*(2.0_dp*vsigma(1, 1) - vsigma(2, 1))*my_norm_drhoa
2003 e_ndrhob(ii) = e_ndrhob(ii) + &
2004 sc*(2.0_dp*vsigma(3, 1) - vsigma(2, 1))*my_norm_drhob
2008 ELSE IF (grad_deriv == 1)
THEN
2011 my_rhoa = max(rhoa(ii), 0.0_dp)
2012 my_rhob = max(rhob(ii), 0.0_dp)
2013 IF ((my_rhoa + my_rhob) > epsilon_rho)
THEN
2014 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
2015 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
2016 my_norm_drhoa = max(norm_drhoa(ii), epsilon(0.0_dp)*1.e4_dp)
2017 my_norm_drhob = max(norm_drhob(ii), epsilon(0.0_dp)*1.e4_dp)
2018 my_norm_drho = max(norm_drho(ii), epsilon(0.0_dp)*1.e4_dp)
2019 sigmav(1, 1) = my_norm_drhoa**2
2020 sigmav(3, 1) = my_norm_drhob**2
2021 sigmav(2, 1) = 0.5_dp*(my_norm_drho**2 - sigmav(1, 1) - sigmav(3, 1))
2023 CALL xc_f03_gga_vxc(xc_func, one, rhov(1, 1), sigmav(1, 1), vrho(1, 1), vsigma(1, 1))
2026 CALL xc_f03_gga_exc_vxc(xc_func, one, rhov(1, 1), sigmav(1, 1), exc, vrho(1, 1), vsigma(1, 1))
2028 e_0(ii) = e_0(ii) + sc*exc(1)*(rhov(1, 1) + rhov(2, 1))
2029 e_rhoa(ii) = e_rhoa(ii) + sc*vrho(1, 1)
2030 e_rhob(ii) = e_rhob(ii) + sc*vrho(2, 1)
2031 e_ndrho(ii) = e_ndrho(ii) + sc*vsigma(2, 1)*my_norm_drho
2032 e_ndrhoa(ii) = e_ndrhoa(ii) + &
2033 sc*(2.0_dp*vsigma(1, 1) - vsigma(2, 1))*my_norm_drhoa
2034 e_ndrhob(ii) = e_ndrhob(ii) + &
2035 sc*(2.0_dp*vsigma(3, 1) - vsigma(2, 1))*my_norm_drhob
2039 ELSE IF (grad_deriv == -2)
THEN
2042 my_rhoa = max(rhoa(ii), 0.0_dp)
2043 my_rhob = max(rhob(ii), 0.0_dp)
2044 IF ((my_rhoa + my_rhob) > epsilon_rho)
THEN
2045 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
2046 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
2047 my_norm_drhoa = max(norm_drhoa(ii), epsilon(0.0_dp)*1.e4_dp)
2048 my_norm_drhob = max(norm_drhob(ii), epsilon(0.0_dp)*1.e4_dp)
2049 my_norm_drho = max(norm_drho(ii), epsilon(0.0_dp)*1.e4_dp)
2050 sigmav(1, 1) = my_norm_drhoa**2
2051 sigmav(3, 1) = my_norm_drhob**2
2052 sigmav(2, 1) = 0.5_dp*(my_norm_drho**2 - sigmav(1, 1) - sigmav(3, 1))
2054 CALL xc_f03_gga_vxc_fxc(xc_func, one, rhov(1, 1), sigmav(1, 1), vrho(1, 1), vsigma(1, 1), &
2055 v2rho2(1, 1), v2rhosigma(1, 1), v2sigma2(1, 1))
2057 CALL xc_f03_gga_exc_vxc_fxc(xc_func, one, rhov(1, 1), sigmav(1, 1), exc, vrho(1, 1), vsigma(1, 1), &
2058 v2rho2(1, 1), v2rhosigma(1, 1), v2sigma2(1, 1))
2060 e_rhoa_rhoa(ii) = e_rhoa_rhoa(ii) + sc*v2rho2(1, 1)
2061 e_rhoa_rhob(ii) = e_rhoa_rhob(ii) + sc*v2rho2(2, 1)
2062 e_rhob_rhob(ii) = e_rhob_rhob(ii) + sc*v2rho2(3, 1)
2063 e_ndrho_rhoa(ii) = e_ndrho_rhoa(ii) + sc*v2rhosigma(2, 1)*my_norm_drho
2064 e_ndrho_rhob(ii) = e_ndrho_rhob(ii) + sc*v2rhosigma(5, 1)*my_norm_drho
2065 e_ndrhoa_rhoa(ii) = e_ndrhoa_rhoa(ii) + &
2066 sc*(2.0_dp*v2rhosigma(1, 1) - v2rhosigma(2, 1))*my_norm_drhoa
2067 e_ndrhoa_rhob(ii) = e_ndrhoa_rhob(ii) + &
2068 sc*(2.0_dp*v2rhosigma(4, 1) - v2rhosigma(5, 1))*my_norm_drhoa
2069 e_ndrhob_rhoa(ii) = e_ndrhob_rhoa(ii) + &
2070 sc*(2.0_dp*v2rhosigma(3, 1) - v2rhosigma(2, 1))*my_norm_drhob
2071 e_ndrhob_rhob(ii) = e_ndrhob_rhob(ii) + &
2072 sc*(2.0_dp*v2rhosigma(6, 1) - v2rhosigma(5, 1))*my_norm_drhob
2073 e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) + &
2074 sc*(vsigma(2, 1) + my_norm_drho**2*v2sigma2(4, 1))
2075 e_ndrho_ndrhoa(ii) = e_ndrho_ndrhoa(ii) + &
2076 sc*(2.0_dp*v2sigma2(2, 1) - v2sigma2(4, 1))*my_norm_drho*my_norm_drhoa
2077 e_ndrho_ndrhob(ii) = e_ndrho_ndrhob(ii) + &
2078 sc*(2.0_dp*v2sigma2(5, 1) - v2sigma2(4, 1))*my_norm_drho*my_norm_drhob
2079 e_ndrhoa_ndrhoa(ii) = e_ndrhoa_ndrhoa(ii) + &
2080 sc*(2.0_dp*vsigma(1, 1) - vsigma(2, 1) + my_norm_drhoa**2*( &
2081 4.0_dp*v2sigma2(1, 1) - 4.0_dp*v2sigma2(2, 1) + v2sigma2(4, 1)))
2082 e_ndrhoa_ndrhob(ii) = e_ndrhoa_ndrhob(ii) + &
2083 sc*(4.0_dp*v2sigma2(3, 1) - 2.0_dp*v2sigma2(2, 1) - &
2084 2.0_dp*v2sigma2(5, 1) + v2sigma2(4, 1))*my_norm_drhoa*my_norm_drhob
2085 e_ndrhob_ndrhob(ii) = e_ndrhob_ndrhob(ii) + &
2086 sc*(2.0_dp*vsigma(3, 1) - vsigma(2, 1) + my_norm_drhob**2*( &
2087 4.0_dp*v2sigma2(6, 1) - 4.0_dp*v2sigma2(5, 1) + v2sigma2(4, 1)))
2091 ELSE IF (grad_deriv == 2)
THEN
2094 my_rhoa = max(rhoa(ii), 0.0_dp)
2095 my_rhob = max(rhob(ii), 0.0_dp)
2096 IF ((my_rhoa + my_rhob) > epsilon_rho)
THEN
2097 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
2098 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
2099 my_norm_drhoa = max(norm_drhoa(ii), epsilon(0.0_dp)*1.e4_dp)
2100 my_norm_drhob = max(norm_drhob(ii), epsilon(0.0_dp)*1.e4_dp)
2101 my_norm_drho = max(norm_drho(ii), epsilon(0.0_dp)*1.e4_dp)
2102 sigmav(1, 1) = my_norm_drhoa**2
2103 sigmav(3, 1) = my_norm_drhob**2
2104 sigmav(2, 1) = 0.5_dp*(my_norm_drho**2 - sigmav(1, 1) - sigmav(3, 1))
2106 CALL xc_f03_gga_vxc_fxc(xc_func, one, rhov(1, 1), sigmav(1, 1), vrho(1, 1), vsigma(1, 1), &
2107 v2rho2(1, 1), v2rhosigma(1, 1), v2sigma2(1, 1))
2110 CALL xc_f03_gga_exc_vxc_fxc(xc_func, one, rhov(1, 1), sigmav(1, 1), exc, vrho(1, 1), vsigma(1, 1), &
2111 v2rho2(1, 1), v2rhosigma(1, 1), v2sigma2(1, 1))
2113 e_0(ii) = e_0(ii) + sc*exc(1)*(rhov(1, 1) + rhov(2, 1))
2114 e_rhoa(ii) = e_rhoa(ii) + sc*vrho(1, 1)
2115 e_rhob(ii) = e_rhob(ii) + sc*vrho(2, 1)
2116 e_ndrho(ii) = e_ndrho(ii) + sc*vsigma(2, 1)*my_norm_drho
2117 e_ndrhoa(ii) = e_ndrhoa(ii) + &
2118 sc*(2.0_dp*vsigma(1, 1) - vsigma(2, 1))*my_norm_drhoa
2119 e_ndrhob(ii) = e_ndrhob(ii) + &
2120 sc*(2.0_dp*vsigma(3, 1) - vsigma(2, 1))*my_norm_drhob
2121 e_rhoa_rhoa(ii) = e_rhoa_rhoa(ii) + sc*v2rho2(1, 1)
2122 e_rhoa_rhob(ii) = e_rhoa_rhob(ii) + sc*v2rho2(2, 1)
2123 e_rhob_rhob(ii) = e_rhob_rhob(ii) + sc*v2rho2(3, 1)
2124 e_ndrho_rhoa(ii) = e_ndrho_rhoa(ii) + sc*v2rhosigma(2, 1)*my_norm_drho
2125 e_ndrho_rhob(ii) = e_ndrho_rhob(ii) + sc*v2rhosigma(5, 1)*my_norm_drho
2126 e_ndrhoa_rhoa(ii) = e_ndrhoa_rhoa(ii) + &
2127 sc*(2.0_dp*v2rhosigma(1, 1) - v2rhosigma(2, 1))*my_norm_drhoa
2128 e_ndrhoa_rhob(ii) = e_ndrhoa_rhob(ii) + &
2129 sc*(2.0_dp*v2rhosigma(4, 1) - v2rhosigma(5, 1))*my_norm_drhoa
2130 e_ndrhob_rhoa(ii) = e_ndrhob_rhoa(ii) + &
2131 sc*(2.0_dp*v2rhosigma(3, 1) - v2rhosigma(2, 1))*my_norm_drhob
2132 e_ndrhob_rhob(ii) = e_ndrhob_rhob(ii) + &
2133 sc*(2.0_dp*v2rhosigma(6, 1) - v2rhosigma(5, 1))*my_norm_drhob
2134 e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) + &
2135 sc*(vsigma(2, 1) + my_norm_drho**2*v2sigma2(4, 1))
2136 e_ndrho_ndrhoa(ii) = e_ndrho_ndrhoa(ii) + &
2137 sc*(2.0_dp*v2sigma2(2, 1) - v2sigma2(4, 1))*my_norm_drho*my_norm_drhoa
2138 e_ndrho_ndrhob(ii) = e_ndrho_ndrhob(ii) + &
2139 sc*(2.0_dp*v2sigma2(5, 1) - v2sigma2(4, 1))*my_norm_drho*my_norm_drhob
2140 e_ndrhoa_ndrhoa(ii) = e_ndrhoa_ndrhoa(ii) + &
2141 sc*(2.0_dp*vsigma(1, 1) - vsigma(2, 1) + my_norm_drhoa**2*( &
2142 4.0_dp*v2sigma2(1, 1) - 4.0_dp*v2sigma2(2, 1) + v2sigma2(4, 1)))
2143 e_ndrhoa_ndrhob(ii) = e_ndrhoa_ndrhob(ii) + &
2144 sc*(4.0_dp*v2sigma2(3, 1) - 2.0_dp*v2sigma2(2, 1) - &
2145 2.0_dp*v2sigma2(5, 1) + v2sigma2(4, 1))*my_norm_drhoa*my_norm_drhob
2146 e_ndrhob_ndrhob(ii) = e_ndrhob_ndrhob(ii) + &
2147 sc*(2.0_dp*vsigma(3, 1) - vsigma(2, 1) + my_norm_drhob**2*( &
2148 4.0_dp*v2sigma2(6, 1) - 4.0_dp*v2sigma2(5, 1) + v2sigma2(4, 1)))
2153 CASE (xc_family_mgga, xc_family_hyb_mgga)
2154 IF (grad_deriv == 0)
THEN
2157 my_rhoa = max(rhoa(ii), 0.0_dp)
2158 my_rhob = max(rhob(ii), 0.0_dp)
2159 my_tau_a = max(tau_a(ii), 0.0_dp)
2160 my_tau_b = max(tau_b(ii), 0.0_dp)
2161 IF (((my_rhoa + my_rhob) > epsilon_rho) .AND. ((my_tau_a + my_tau_b) > epsilon_tau))
THEN
2162 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
2163 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
2164 my_norm_drhoa = max(norm_drhoa(ii), epsilon(0.0_dp)*1.e4_dp)
2165 my_norm_drhob = max(norm_drhob(ii), epsilon(0.0_dp)*1.e4_dp)
2166 my_norm_drho = max(norm_drho(ii), epsilon(0.0_dp)*1.e4_dp)
2167 sigmav(1, 1) = my_norm_drhoa**2
2168 sigmav(3, 1) = my_norm_drhob**2
2169 sigmav(2, 1) = 0.5_dp*(my_norm_drho**2 - sigmav(1, 1) - sigmav(3, 1))
2170 tauv(1, 1) = max(my_tau_a, epsilon(0.0_dp)*1.e4_dp)
2171 tauv(2, 1) = max(my_tau_b, epsilon(0.0_dp)*1.e4_dp)
2172 tauv(1, 1) = max(tauv(1, 1), sigmav(1, 1)/(8.0_dp*rhov(1, 1)))
2173 tauv(2, 1) = max(tauv(2, 1), sigmav(3, 1)/(8.0_dp*rhov(2, 1)))
2174 laplace_rhov(1, 1) = laplace_rhoa(ii)
2175 laplace_rhov(2, 1) = laplace_rhob(ii)
2176 CALL xc_f03_mgga_exc(xc_func, one, rhov(1, 1), sigmav(1, 1), &
2177 laplace_rhov(1, 1), tauv(1, 1), exc)
2178 e_0(ii) = e_0(ii) + sc*exc(1)*(rhov(1, 1) + rhov(2, 1))
2182 ELSE IF (grad_deriv == -1)
THEN
2185 my_rhoa = max(rhoa(ii), 0.0_dp)
2186 my_rhob = max(rhob(ii), 0.0_dp)
2187 my_tau_a = max(tau_a(ii), 0.0_dp)
2188 my_tau_b = max(tau_b(ii), 0.0_dp)
2189 IF (((my_rhoa + my_rhob) > epsilon_rho) .AND. ((my_tau_a + my_tau_b) > epsilon_tau))
THEN
2190 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
2191 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
2192 my_norm_drhoa = max(norm_drhoa(ii), epsilon(0.0_dp)*1.e4_dp)
2193 my_norm_drhob = max(norm_drhob(ii), epsilon(0.0_dp)*1.e4_dp)
2194 my_norm_drho = max(norm_drho(ii), epsilon(0.0_dp)*1.e4_dp)
2195 sigmav(1, 1) = my_norm_drhoa**2
2196 sigmav(3, 1) = my_norm_drhob**2
2197 sigmav(2, 1) = 0.5_dp*(my_norm_drho**2 - sigmav(1, 1) - sigmav(3, 1))
2198 laplace_rhov(1, 1) = laplace_rhoa(ii)
2199 laplace_rhov(2, 1) = laplace_rhob(ii)
2200 tauv(1, 1) = max(my_tau_a, epsilon(0.0_dp)*1.e4_dp)
2201 tauv(2, 1) = max(my_tau_b, epsilon(0.0_dp)*1.e4_dp)
2202 tauv(1, 1) = max(tauv(1, 1), sigmav(1, 1)/(8.0_dp*rhov(1, 1)))
2203 tauv(2, 1) = max(tauv(2, 1), sigmav(3, 1)/(8.0_dp*rhov(2, 1)))
2204 CALL xc_f03_mgga_vxc(xc_func, one, rhov(1, 1), sigmav(1, 1), &
2205 laplace_rhov(1, 1), tauv(1, 1), vrho(1, 1), vsigma(1, 1), vlapl(1, 1), vtau(1, 1))
2206 e_rhoa(ii) = e_rhoa(ii) + sc*vrho(1, 1)
2207 e_rhob(ii) = e_rhob(ii) + sc*vrho(2, 1)
2208 e_ndrho(ii) = e_ndrho(ii) + sc*vsigma(2, 1)*my_norm_drho
2209 e_ndrhoa(ii) = e_ndrhoa(ii) + &
2210 sc*(2.0_dp*vsigma(1, 1) - vsigma(2, 1))*my_norm_drhoa
2211 e_ndrhob(ii) = e_ndrhob(ii) + &
2212 sc*(2.0_dp*vsigma(3, 1) - vsigma(2, 1))*my_norm_drhob
2213 e_tau_a(ii) = e_tau_a(ii) + sc*vtau(1, 1)
2214 e_tau_b(ii) = e_tau_b(ii) + sc*vtau(2, 1)
2215 IF (has_laplace)
THEN
2216 e_laplace_rhoa(ii) = e_laplace_rhoa(ii) + sc*vlapl(1, 1)
2217 e_laplace_rhob(ii) = e_laplace_rhob(ii) + sc*vlapl(2, 1)
2222 ELSE IF (grad_deriv == 1)
THEN
2225 my_rhoa = max(rhoa(ii), 0.0_dp)
2226 my_rhob = max(rhob(ii), 0.0_dp)
2227 my_tau_a = max(tau_a(ii), 0.0_dp)
2228 my_tau_b = max(tau_b(ii), 0.0_dp)
2229 IF (((my_rhoa + my_rhob) > epsilon_rho) .AND. ((my_tau_a + my_tau_b) > epsilon_tau))
THEN
2230 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
2231 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
2232 my_norm_drhoa = max(norm_drhoa(ii), epsilon(0.0_dp)*1.e4_dp)
2233 my_norm_drhob = max(norm_drhob(ii), epsilon(0.0_dp)*1.e4_dp)
2234 my_norm_drho = max(norm_drho(ii), epsilon(0.0_dp)*1.e4_dp)
2235 sigmav(1, 1) = my_norm_drhoa**2
2236 sigmav(3, 1) = my_norm_drhob**2
2237 sigmav(2, 1) = 0.5_dp*(my_norm_drho**2 - sigmav(1, 1) - sigmav(3, 1))
2238 laplace_rhov(1, 1) = laplace_rhoa(ii)
2239 laplace_rhov(2, 1) = laplace_rhob(ii)
2240 tauv(1, 1) = max(my_tau_a, epsilon(0.0_dp)*1.e4_dp)
2241 tauv(2, 1) = max(my_tau_b, epsilon(0.0_dp)*1.e4_dp)
2242 tauv(1, 1) = max(tauv(1, 1), sigmav(1, 1)/(8.0_dp*rhov(1, 1)))
2243 tauv(2, 1) = max(tauv(2, 1), sigmav(3, 1)/(8.0_dp*rhov(2, 1)))
2245 CALL xc_f03_mgga_vxc(xc_func, one, rhov(1, 1), sigmav(1, 1), &
2246 laplace_rhov(1, 1), tauv(1, 1), vrho(1, 1), vsigma(1, 1), &
2247 vlapl(1, 1), vtau(1, 1))
2250 CALL xc_f03_mgga_exc_vxc(xc_func, one, rhov(1, 1), sigmav(1, 1), &
2251 laplace_rhov(1, 1), tauv(1, 1), exc, &
2252 vrho(1, 1), vsigma(1, 1), vlapl(1, 1), vtau(1, 1))
2254 e_0(ii) = e_0(ii) + sc*exc(1)*(rhov(1, 1) + rhov(2, 1))
2255 e_rhoa(ii) = e_rhoa(ii) + sc*vrho(1, 1)
2256 e_rhob(ii) = e_rhob(ii) + sc*vrho(2, 1)
2257 e_ndrho(ii) = e_ndrho(ii) + sc*vsigma(2, 1)*my_norm_drho
2258 e_ndrhoa(ii) = e_ndrhoa(ii) + &
2259 sc*(2.0_dp*vsigma(1, 1) - vsigma(2, 1))*my_norm_drhoa
2260 e_ndrhob(ii) = e_ndrhob(ii) + &
2261 sc*(2.0_dp*vsigma(3, 1) - vsigma(2, 1))*my_norm_drhob
2262 e_tau_a(ii) = e_tau_a(ii) + sc*vtau(1, 1)
2263 e_tau_b(ii) = e_tau_b(ii) + sc*vtau(2, 1)
2264 IF (has_laplace)
THEN
2265 e_laplace_rhoa(ii) = e_laplace_rhoa(ii) + sc*vlapl(1, 1)
2266 e_laplace_rhob(ii) = e_laplace_rhob(ii) + sc*vlapl(2, 1)
2271 ELSE IF (grad_deriv == -2)
THEN
2274 my_rhoa = max(rhoa(ii), 0.0_dp)
2275 my_rhob = max(rhob(ii), 0.0_dp)
2276 my_tau_a = max(tau_a(ii), 0.0_dp)
2277 my_tau_b = max(tau_b(ii), 0.0_dp)
2278 IF (((my_rhoa + my_rhob) > epsilon_rho) .AND. ((my_tau_a + my_tau_b) > epsilon_tau))
THEN
2279 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
2280 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
2281 my_norm_drhoa = max(norm_drhoa(ii), epsilon(0.0_dp)*1.e4_dp)
2282 my_norm_drhob = max(norm_drhob(ii), epsilon(0.0_dp)*1.e4_dp)
2283 my_norm_drho = max(norm_drho(ii), epsilon(0.0_dp)*1.e4_dp)
2284 sigmav(1, 1) = my_norm_drhoa**2
2285 sigmav(3, 1) = my_norm_drhob**2
2286 sigmav(2, 1) = 0.5_dp*(my_norm_drho**2 - sigmav(1, 1) - sigmav(3, 1))
2287 laplace_rhov(1, 1) = laplace_rhoa(ii)
2288 laplace_rhov(2, 1) = laplace_rhob(ii)
2289 tauv(1, 1) = max(my_tau_a, epsilon(0.0_dp)*1.e4_dp)
2290 tauv(2, 1) = max(my_tau_b, epsilon(0.0_dp)*1.e4_dp)
2291 tauv(1, 1) = max(tauv(1, 1), sigmav(1, 1)/(8.0_dp*rhov(1, 1)))
2292 tauv(2, 1) = max(tauv(2, 1), sigmav(3, 1)/(8.0_dp*rhov(2, 1)))
2294 CALL xc_f03_mgga_vxc_fxc(xc_func, one, rhov(1, 1), sigmav(1, 1), &
2295 laplace_rhov(1, 1), tauv(1, 1), vrho(1, 1), vsigma(1, 1), &
2296 vlapl(1, 1), vtau(1, 1), &
2297 v2rho2(1, 1), v2rhosigma(1, 1), v2rholapl(1, 1), v2rhotau(1, 1), &
2298 v2sigma2(1, 1), v2sigmalapl(1, 1), v2sigmatau(1, 1), &
2299 v2lapl2(1, 1), v2lapltau(1, 1), v2tau2(1, 1))
2301 CALL xc_f03_mgga(xc_func, one, rhov(1, 1), sigmav(1, 1), &
2302 laplace_rhov(1, 1), tauv(1, 1), exc, vrho(1, 1), vsigma(1, 1), &
2303 vlapl(1, 1), vtau(1, 1), v2rho2(1, 1), v2rhosigma(1, 1), v2rholapl(1, 1), &
2304 v2rhotau(1, 1), v2sigma2(1, 1), v2sigmalapl(1, 1), v2sigmatau(1, 1), &
2305 v2lapl2(1, 1), v2lapltau(1, 1), v2tau2(1, 1))
2307 e_rhoa_rhoa(ii) = e_rhoa_rhoa(ii) + sc*v2rho2(1, 1)
2308 e_rhoa_rhob(ii) = e_rhoa_rhob(ii) + sc*v2rho2(2, 1)
2309 e_rhob_rhob(ii) = e_rhob_rhob(ii) + sc*v2rho2(3, 1)
2310 e_ndrho_rhoa(ii) = e_ndrho_rhoa(ii) + sc*v2rhosigma(2, 1)*my_norm_drho
2311 e_ndrho_rhob(ii) = e_ndrho_rhob(ii) + sc*v2rhosigma(5, 1)*my_norm_drho
2312 e_ndrhoa_rhoa(ii) = e_ndrhoa_rhoa(ii) + &
2313 sc*(2.0_dp*v2rhosigma(1, 1) - v2rhosigma(2, 1))*my_norm_drhoa
2314 e_ndrhoa_rhob(ii) = e_ndrhoa_rhob(ii) + &
2315 sc*(2.0_dp*v2rhosigma(4, 1) - v2rhosigma(5, 1))*my_norm_drhoa
2316 e_ndrhob_rhoa(ii) = e_ndrhob_rhoa(ii) + &
2317 sc*(2.0_dp*v2rhosigma(3, 1) - v2rhosigma(2, 1))*my_norm_drhob
2318 e_ndrhob_rhob(ii) = e_ndrhob_rhob(ii) + &
2319 sc*(2.0_dp*v2rhosigma(6, 1) - v2rhosigma(5, 1))*my_norm_drhob
2320 e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) + &
2321 sc*(vsigma(2, 1) + my_norm_drho**2*v2sigma2(4, 1))
2322 e_ndrho_ndrhoa(ii) = e_ndrho_ndrhoa(ii) + &
2323 sc*(2.0_dp*v2sigma2(2, 1) - v2sigma2(4, 1))*my_norm_drho*my_norm_drhoa
2324 e_ndrho_ndrhob(ii) = e_ndrho_ndrhob(ii) + &
2325 sc*(2.0_dp*v2sigma2(5, 1) - v2sigma2(4, 1))*my_norm_drho*my_norm_drhob
2326 e_ndrhoa_ndrhoa(ii) = e_ndrhoa_ndrhoa(ii) + &
2327 sc*(2.0_dp*vsigma(1, 1) - vsigma(2, 1) + my_norm_drhoa**2*( &
2328 4.0_dp*v2sigma2(1, 1) - 4.0_dp*v2sigma2(2, 1) + v2sigma2(4, 1)))
2329 e_ndrhoa_ndrhob(ii) = e_ndrhoa_ndrhob(ii) + &
2330 sc*(4.0_dp*v2sigma2(3, 1) - 2.0_dp*v2sigma2(2, 1) - &
2331 2.0_dp*v2sigma2(5, 1) + v2sigma2(4, 1))*my_norm_drhoa*my_norm_drhob
2332 e_ndrhob_ndrhob(ii) = e_ndrhob_ndrhob(ii) + &
2333 sc*(2.0_dp*vsigma(3, 1) - vsigma(2, 1) + my_norm_drhob**2*( &
2334 4.0_dp*v2sigma2(6, 1) - 4.0_dp*v2sigma2(5, 1) + v2sigma2(4, 1)))
2335 e_rhoa_tau_a(ii) = e_rhoa_tau_a(ii) + sc*v2rhotau(1, 1)
2336 e_rhoa_tau_b(ii) = e_rhoa_tau_b(ii) + sc*v2rhotau(2, 1)
2337 e_rhob_tau_a(ii) = e_rhob_tau_a(ii) + sc*v2rhotau(3, 1)
2338 e_rhob_tau_b(ii) = e_rhob_tau_b(ii) + sc*v2rhotau(4, 1)
2339 e_ndrho_tau_a(ii) = e_ndrho_tau_a(ii) + sc*v2sigmatau(3, 1)*my_norm_drho
2340 e_ndrho_tau_b(ii) = e_ndrho_tau_b(ii) + sc*v2sigmatau(4, 1)*my_norm_drho
2341 e_ndrhoa_tau_a(ii) = e_ndrhoa_tau_a(ii) + &
2342 sc*(2.0_dp*v2sigmatau(1, 1) - v2sigmatau(3, 1))*my_norm_drhoa
2343 e_ndrhoa_tau_b(ii) = e_ndrhoa_tau_b(ii) + &
2344 sc*(2.0_dp*v2sigmatau(2, 1) - v2sigmatau(4, 1))*my_norm_drhoa
2345 e_ndrhob_tau_a(ii) = e_ndrhob_tau_a(ii) + &
2346 sc*(2.0_dp*v2sigmatau(5, 1) - v2sigmatau(3, 1))*my_norm_drhob
2347 e_ndrhob_tau_b(ii) = e_ndrhob_tau_b(ii) + &
2348 sc*(2.0_dp*v2sigmatau(6, 1) - v2sigmatau(4, 1))*my_norm_drhob
2349 e_tau_a_tau_a(ii) = e_tau_a_tau_a(ii) + sc*v2tau2(1, 1)
2350 e_tau_a_tau_b(ii) = e_tau_a_tau_b(ii) + sc*v2tau2(2, 1)
2351 e_tau_b_tau_b(ii) = e_tau_b_tau_b(ii) + sc*v2tau2(3, 1)
2352 IF (has_laplace)
THEN
2353 e_rhoa_laplace_rhoa(ii) = e_rhoa_laplace_rhoa(ii) + sc*v2rholapl(1, 1)
2354 e_rhoa_laplace_rhob(ii) = e_rhoa_laplace_rhob(ii) + sc*v2rholapl(2, 1)
2355 e_rhob_laplace_rhoa(ii) = e_rhob_laplace_rhoa(ii) + sc*v2rholapl(3, 1)
2356 e_rhob_laplace_rhob(ii) = e_rhob_laplace_rhob(ii) + sc*v2rholapl(4, 1)
2357 e_ndrho_laplace_rhoa(ii) = e_ndrho_laplace_rhoa(ii) + sc*v2sigmalapl(3, 1)*my_norm_drho
2358 e_ndrho_laplace_rhob(ii) = e_ndrho_laplace_rhob(ii) + sc*v2sigmalapl(4, 1)*my_norm_drho
2359 e_ndrhoa_laplace_rhoa(ii) = e_ndrhoa_laplace_rhoa(ii) + &
2360 sc*(2.0_dp*v2sigmalapl(1, 1) - v2sigmalapl(3, 1))*my_norm_drhoa
2361 e_ndrhoa_laplace_rhob(ii) = e_ndrhoa_laplace_rhob(ii) + &
2362 sc*(2.0_dp*v2sigmalapl(2, 1) - v2sigmalapl(4, 1))*my_norm_drhoa
2363 e_ndrhob_laplace_rhoa(ii) = e_ndrhob_laplace_rhoa(ii) + &
2364 sc*(2.0_dp*v2sigmalapl(5, 1) - v2sigmalapl(3, 1))*my_norm_drhob
2365 e_ndrhob_laplace_rhob(ii) = e_ndrhob_laplace_rhob(ii) + &
2366 sc*(2.0_dp*v2sigmalapl(6, 1) - v2sigmalapl(4, 1))*my_norm_drhob
2367 e_laplace_rhoa_laplace_rhoa(ii) = e_laplace_rhoa_laplace_rhoa(ii) + sc*v2lapl2(1, 1)
2368 e_laplace_rhoa_laplace_rhob(ii) = e_laplace_rhoa_laplace_rhob(ii) + sc*v2lapl2(2, 1)
2369 e_laplace_rhob_laplace_rhob(ii) = e_laplace_rhob_laplace_rhob(ii) + sc*v2lapl2(3, 1)
2370 e_laplace_rhoa_tau_a(ii) = e_laplace_rhoa_tau_a(ii) + sc*v2lapltau(1, 1)
2371 e_laplace_rhoa_tau_b(ii) = e_laplace_rhoa_tau_b(ii) + sc*v2lapltau(2, 1)
2372 e_laplace_rhob_tau_a(ii) = e_laplace_rhob_tau_a(ii) + sc*v2lapltau(3, 1)
2373 e_laplace_rhob_tau_b(ii) = e_laplace_rhob_tau_b(ii) + sc*v2lapltau(4, 1)
2378 ELSE IF (grad_deriv == 2)
THEN
2381 my_rhoa = max(rhoa(ii), 0.0_dp)
2382 my_rhob = max(rhob(ii), 0.0_dp)
2383 my_tau_a = max(tau_a(ii), 0.0_dp)
2384 my_tau_b = max(tau_b(ii), 0.0_dp)
2385 IF (((my_rhoa + my_rhob) > epsilon_rho) .AND. ((my_tau_a + my_tau_b) > epsilon_tau))
THEN
2386 rhov(1, 1) = max(my_rhoa, epsilon(0.0_dp)*1.e4_dp)
2387 rhov(2, 1) = max(my_rhob, epsilon(0.0_dp)*1.e4_dp)
2388 my_norm_drhoa = max(norm_drhoa(ii), epsilon(0.0_dp)*1.e4_dp)
2389 my_norm_drhob = max(norm_drhob(ii), epsilon(0.0_dp)*1.e4_dp)
2390 my_norm_drho = max(norm_drho(ii), epsilon(0.0_dp)*1.e4_dp)
2391 sigmav(1, 1) = my_norm_drhoa**2
2392 sigmav(3, 1) = my_norm_drhob**2
2393 sigmav(2, 1) = 0.5_dp*(my_norm_drho**2 - sigmav(1, 1) - sigmav(3, 1))
2394 laplace_rhov(1, 1) = laplace_rhoa(ii)
2395 laplace_rhov(2, 1) = laplace_rhob(ii)
2396 tauv(1, 1) = max(my_tau_a, epsilon(0.0_dp)*1.e4_dp)
2397 tauv(2, 1) = max(my_tau_b, epsilon(0.0_dp)*1.e4_dp)
2398 tauv(1, 1) = max(tauv(1, 1), sigmav(1, 1)/(8.0_dp*rhov(1, 1)))
2399 tauv(2, 1) = max(tauv(2, 1), sigmav(3, 1)/(8.0_dp*rhov(2, 1)))
2401 CALL xc_f03_mgga_vxc_fxc(xc_func, one, rhov(1, 1), sigmav(1, 1), &
2402 laplace_rhov(1, 1), tauv(1, 1), vrho(1, 1), vsigma(1, 1), &
2403 vlapl(1, 1), vtau(1, 1), &
2404 v2rho2(1, 1), v2rhosigma(1, 1), v2rholapl(1, 1), v2rhotau(1, 1), &
2405 v2sigma2(1, 1), v2sigmalapl(1, 1), v2sigmatau(1, 1), &
2406 v2lapl2(1, 1), v2lapltau(1, 1), v2tau2(1, 1))
2409 CALL xc_f03_mgga(xc_func, one, rhov(1, 1), sigmav(1, 1), &
2410 laplace_rhov(1, 1), tauv(1, 1), exc, vrho(1, 1), vsigma(1, 1), &
2411 vlapl(1, 1), vtau(1, 1), v2rho2(1, 1), v2rhosigma(1, 1), v2rholapl(1, 1), &
2412 v2rhotau(1, 1), v2sigma2(1, 1), v2sigmalapl(1, 1), v2sigmatau(1, 1), &
2413 v2lapl2(1, 1), v2lapltau(1, 1), v2tau2(1, 1))
2415 e_0(ii) = e_0(ii) + sc*exc(1)*(rhov(1, 1) + rhov(2, 1))
2416 e_rhoa(ii) = e_rhoa(ii) + sc*vrho(1, 1)
2417 e_rhob(ii) = e_rhob(ii) + sc*vrho(2, 1)
2418 e_ndrho(ii) = e_ndrho(ii) + sc*vsigma(2, 1)*my_norm_drho
2419 e_ndrhoa(ii) = e_ndrhoa(ii) + &
2420 sc*(2.0_dp*vsigma(1, 1) - vsigma(2, 1))*my_norm_drhoa
2421 e_ndrhob(ii) = e_ndrhob(ii) + &
2422 sc*(2.0_dp*vsigma(3, 1) - vsigma(2, 1))*my_norm_drhob
2423 e_tau_a(ii) = e_tau_a(ii) + sc*vtau(1, 1)
2424 e_tau_b(ii) = e_tau_b(ii) + sc*vtau(2, 1)
2425 e_rhoa_rhoa(ii) = e_rhoa_rhoa(ii) + sc*v2rho2(1, 1)
2426 e_rhoa_rhob(ii) = e_rhoa_rhob(ii) + sc*v2rho2(2, 1)
2427 e_rhob_rhob(ii) = e_rhob_rhob(ii) + sc*v2rho2(3, 1)
2428 e_ndrho_rhoa(ii) = e_ndrho_rhoa(ii) + sc*v2rhosigma(2, 1)*my_norm_drho
2429 e_ndrho_rhob(ii) = e_ndrho_rhob(ii) + sc*v2rhosigma(5, 1)*my_norm_drho
2430 e_ndrhoa_rhoa(ii) = e_ndrhoa_rhoa(ii) + &
2431 sc*(2.0_dp*v2rhosigma(1, 1) - v2rhosigma(2, 1))*my_norm_drhoa
2432 e_ndrhoa_rhob(ii) = e_ndrhoa_rhob(ii) + &
2433 sc*(2.0_dp*v2rhosigma(4, 1) - v2rhosigma(5, 1))*my_norm_drhoa
2434 e_ndrhob_rhoa(ii) = e_ndrhob_rhoa(ii) + &
2435 sc*(2.0_dp*v2rhosigma(3, 1) - v2rhosigma(2, 1))*my_norm_drhob
2436 e_ndrhob_rhob(ii) = e_ndrhob_rhob(ii) + &
2437 sc*(2.0_dp*v2rhosigma(6, 1) - v2rhosigma(5, 1))*my_norm_drhob
2438 e_ndrho_ndrho(ii) = e_ndrho_ndrho(ii) + &
2439 sc*(vsigma(2, 1) + my_norm_drho**2*v2sigma2(4, 1))
2440 e_ndrho_ndrhoa(ii) = e_ndrho_ndrhoa(ii) + &
2441 sc*(2.0_dp*v2sigma2(2, 1) - v2sigma2(4, 1))*my_norm_drho*my_norm_drhoa
2442 e_ndrho_ndrhob(ii) = e_ndrho_ndrhob(ii) + &
2443 sc*(2.0_dp*v2sigma2(5, 1) - v2sigma2(4, 1))*my_norm_drho*my_norm_drhob
2444 e_ndrhoa_ndrhoa(ii) = e_ndrhoa_ndrhoa(ii) + &
2445 sc*(2.0_dp*vsigma(1, 1) - vsigma(2, 1) + my_norm_drhoa**2*( &
2446 4.0_dp*v2sigma2(1, 1) - 4.0_dp*v2sigma2(2, 1) + v2sigma2(4, 1)))
2447 e_ndrhoa_ndrhob(ii) = e_ndrhoa_ndrhob(ii) + &
2448 sc*(4.0_dp*v2sigma2(3, 1) - 2.0_dp*v2sigma2(2, 1) - &
2449 2.0_dp*v2sigma2(5, 1) + v2sigma2(4, 1))*my_norm_drhoa*my_norm_drhob
2450 e_ndrhob_ndrhob(ii) = e_ndrhob_ndrhob(ii) + &
2451 sc*(2.0_dp*vsigma(3, 1) - vsigma(2, 1) + my_norm_drhob**2*( &
2452 4.0_dp*v2sigma2(6, 1) - 4.0_dp*v2sigma2(5, 1) + v2sigma2(4, 1)))
2453 e_rhoa_tau_a(ii) = e_rhoa_tau_a(ii) + sc*v2rhotau(1, 1)
2454 e_rhoa_tau_b(ii) = e_rhoa_tau_b(ii) + sc*v2rhotau(2, 1)
2455 e_rhob_tau_a(ii) = e_rhob_tau_a(ii) + sc*v2rhotau(3, 1)
2456 e_rhob_tau_b(ii) = e_rhob_tau_b(ii) + sc*v2rhotau(4, 1)
2457 e_ndrho_tau_a(ii) = e_ndrho_tau_a(ii) + sc*v2sigmatau(3, 1)*my_norm_drho
2458 e_ndrho_tau_b(ii) = e_ndrho_tau_b(ii) + sc*v2sigmatau(4, 1)*my_norm_drho
2459 e_ndrhoa_tau_a(ii) = e_ndrhoa_tau_a(ii) + &
2460 sc*(2.0_dp*v2sigmatau(1, 1) - v2sigmatau(3, 1))*my_norm_drhoa
2461 e_ndrhoa_tau_b(ii) = e_ndrhoa_tau_b(ii) + &
2462 sc*(2.0_dp*v2sigmatau(2, 1) - v2sigmatau(4, 1))*my_norm_drhoa
2463 e_ndrhob_tau_a(ii) = e_ndrhob_tau_a(ii) + &
2464 sc*(2.0_dp*v2sigmatau(5, 1) - v2sigmatau(3, 1))*my_norm_drhob
2465 e_ndrhob_tau_b(ii) = e_ndrhob_tau_b(ii) + &
2466 sc*(2.0_dp*v2sigmatau(6, 1) - v2sigmatau(4, 1))*my_norm_drhob
2467 e_tau_a_tau_a(ii) = e_tau_a_tau_a(ii) + sc*v2tau2(1, 1)
2468 e_tau_a_tau_b(ii) = e_tau_a_tau_b(ii) + sc*v2tau2(2, 1)
2469 e_tau_b_tau_b(ii) = e_tau_b_tau_b(ii) + sc*v2tau2(3, 1)
2470 IF (has_laplace)
THEN
2471 e_laplace_rhoa(ii) = e_laplace_rhoa(ii) + sc*vlapl(1, 1)
2472 e_laplace_rhob(ii) = e_laplace_rhob(ii) + sc*vlapl(2, 1)
2473 e_rhoa_laplace_rhoa(ii) = e_rhoa_laplace_rhoa(ii) + sc*v2rholapl(1, 1)
2474 e_rhoa_laplace_rhob(ii) = e_rhoa_laplace_rhob(ii) + sc*v2rholapl(2, 1)
2475 e_rhob_laplace_rhoa(ii) = e_rhob_laplace_rhoa(ii) + sc*v2rholapl(3, 1)
2476 e_rhob_laplace_rhob(ii) = e_rhob_laplace_rhob(ii) + sc*v2rholapl(4, 1)
2477 e_ndrho_laplace_rhoa(ii) = e_ndrho_laplace_rhoa(ii) + sc*v2sigmalapl(3, 1)*my_norm_drho
2478 e_ndrho_laplace_rhob(ii) = e_ndrho_laplace_rhob(ii) + sc*v2sigmalapl(4, 1)*my_norm_drho
2479 e_ndrhoa_laplace_rhoa(ii) = e_ndrhoa_laplace_rhoa(ii) + &
2480 sc*(2.0_dp*v2sigmalapl(1, 1) - v2sigmalapl(3, 1))*my_norm_drhoa
2481 e_ndrhoa_laplace_rhob(ii) = e_ndrhoa_laplace_rhob(ii) + &
2482 sc*(2.0_dp*v2sigmalapl(2, 1) - v2sigmalapl(4, 1))*my_norm_drhoa
2483 e_ndrhob_laplace_rhoa(ii) = e_ndrhob_laplace_rhoa(ii) + &
2484 sc*(2.0_dp*v2sigmalapl(5, 1) - v2sigmalapl(3, 1))*my_norm_drhob
2485 e_ndrhob_laplace_rhob(ii) = e_ndrhob_laplace_rhob(ii) + &
2486 sc*(2.0_dp*v2sigmalapl(6, 1) - v2sigmalapl(4, 1))*my_norm_drhob
2487 e_laplace_rhoa_laplace_rhoa(ii) = e_laplace_rhoa_laplace_rhoa(ii) + sc*v2lapl2(1, 1)
2488 e_laplace_rhoa_laplace_rhob(ii) = e_laplace_rhoa_laplace_rhob(ii) + sc*v2lapl2(2, 1)
2489 e_laplace_rhob_laplace_rhob(ii) = e_laplace_rhob_laplace_rhob(ii) + sc*v2lapl2(3, 1)
2490 e_laplace_rhoa_tau_a(ii) = e_laplace_rhoa_tau_a(ii) + sc*v2lapltau(1, 1)
2491 e_laplace_rhoa_tau_b(ii) = e_laplace_rhoa_tau_b(ii) + sc*v2lapltau(2, 1)
2492 e_laplace_rhob_tau_a(ii) = e_laplace_rhob_tau_a(ii) + sc*v2lapltau(3, 1)
2493 e_laplace_rhob_tau_b(ii) = e_laplace_rhob_tau_b(ii) + sc*v2lapltau(4, 1)
2500 cpabort(trim(func_name)//
": this XC_FAMILY is currently not supported.")
2503 END SUBROUTINE libxc_lsd_calc
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_lda_info(libxc_params, reference, shortform, needs, max_deriv, print_warn, func_name_override)
info about the functional from libxc
subroutine, public libxc_lsd_info(libxc_params, reference, shortform, needs, max_deriv, print_warn, func_name_override)
info about the functional from libxc
subroutine, public libxc_lda_eval(rho_set, deriv_set, grad_deriv, libxc_params, func_name_override)
evaluates the functional from libxc
subroutine, public libxc_add_sections(section)
...
subroutine, public libxc_lsd_eval(rho_set, deriv_set, grad_deriv, libxc_params, func_name_override)
evaluates the functional from libxc
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_version_info(version)
info about the LibXC version
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