38 use,
intrinsic :: iso_fortran_env
59#ifdef HAVE_LIBXC_FUNCS
92 real(real64),
pointer :: rho(:,:)
94 real(real64),
allocatable :: dens(:,:)
95 real(real64),
allocatable :: gdens(:,:,:)
96 real(real64),
allocatable :: ldens(:,:)
97 real(real64),
allocatable :: tau(:,:)
99 type(accel_mem_t) :: dens_buff
100 type(accel_mem_t) :: zk_buff
101 type(accel_mem_t) :: dedd_buff
102 type(accel_mem_t) :: sigma_buff
103 type(accel_mem_t) :: vsigma_buff
104 type(accel_mem_t) :: tau_buff
105 type(accel_mem_t) :: ldens_buff
106 type(accel_mem_t) :: dedtau_buff
107 type(accel_mem_t) :: dedldens_buff
110 real(real64),
pointer,
contiguous :: hbuf_dens(:,:) => null()
111 real(real64),
pointer,
contiguous :: hbuf_sigma(:,:) => null()
112 real(real64),
pointer,
contiguous :: hbuf_ldens(:,:) => null()
113 real(real64),
pointer,
contiguous :: hbuf_tau(:,:) => null()
114 real(real64),
pointer,
contiguous :: hbuf_zk(:) => null()
115 real(real64),
pointer,
contiguous :: hbuf_dedd(:,:) => null()
116 real(real64),
pointer,
contiguous :: hbuf_vsigma(:,:) => null()
117 real(real64),
pointer,
contiguous :: hbuf_dedldens(:,:) => null()
118 real(real64),
pointer,
contiguous :: hbuf_dedtau(:,:) => null()
121 type(accel_mem_t) :: buff_rho_core
122 type(accel_mem_t) :: buff_frozen_rho
123 integer :: frozen_rho_np = 0
124 real(real64) :: amaldi_factor =
m_one
127 logical :: dens_buff_prefilled = .false.
133 integer,
public :: family
134 integer,
public :: flags
135 integer,
public :: kernel_family
136 type(xc_functional_t),
public :: functional(2,2)
139 type(xc_functional_t),
public :: kernel(2,2)
140 type(xc_cam_t),
public :: cam
141 type(xc_lrc_t),
public :: lrc
143 logical,
public :: use_gi_ked
144 integer,
public :: xc_density_correction
145 logical,
public :: xcd_optimize_cutoff
146 real(real64),
public :: xcd_ncutoff
147 logical,
public :: xcd_minimum
148 logical,
public :: xcd_normalize
149 logical,
public :: parallel
150 logical,
public :: xc_on_host
152 type(internal_quantities_t),
public :: quantities
160 real(real64),
public,
parameter :: xc_tiny = 1.0e-12_real64
162 integer,
public,
parameter :: &
170 type(xc_t),
intent(in) :: xcs
171 integer,
optional,
intent(in) :: iunit
172 type(namespace_t),
optional,
intent(in) :: namespace
178 write(
message(1),
'(a)')
"Exchange-correlation:"
185 if (abs(xcs%cam%alpha) + abs(xcs%cam%beta) >
m_epsilon)
then
187 write(
message(2),
'(a,f8.5)')
"Exact exchange mixing = ", xcs%cam%alpha
188 write(
message(3),
'(a,f8.5)')
"Exact exchange for short-range beta = ", xcs%cam%beta
189 write(
message(4),
'(a,f8.5)')
"Exact exchange range-separate omega = ", xcs%cam%omega
200 integer,
optional,
intent(in) :: iunit
207 write(
message(1),
'(a)')
"Exchange-correlation kernel:"
220 type(
xc_t),
intent(inout) :: xcs
235 logical :: xc_force_cpu
249#if defined(HAVE_LIBXC_DEVICE) && defined(HAVE_ACCEL)
254#elif defined(HAVE_LIBXC_DEVICE) && !defined(HAVE_ACCEL)
255 if(.not. xc_force_cpu)
then
256 call messages_warning(
"Libxc has device support but no accelerator support is enabled in Octopus.", namespace=namespace)
267 subroutine xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
268 type(
xc_t),
intent(out) :: xcs
270 integer,
intent(in) :: ndim
271 integer,
intent(in) :: periodic_dim
272 real(real64),
intent(in) :: nel
273 integer,
intent(in) :: x_id
274 integer,
intent(in) :: c_id
275 integer,
intent(in) :: xk_id
276 integer,
intent(in) :: ck_id
278 integer,
intent(in) :: ispin
280 integer :: isp, xc_major, xc_minor, xc_micro
287 call xc_f03_version(xc_major, xc_minor, xc_micro)
291 xcs%kernel_family = 0
295 call xc_lrc_init(xcs%lrc, namespace, ndim, periodic_dim)
301 if (ndim /= 3) xcs%xc_on_host = .
true.
317 xcs%family = ior(xcs%family, xcs%functional(
func_x,1)%family)
318 xcs%family = ior(xcs%family, xcs%functional(
func_c,1)%family)
320 xcs%flags = ior(xcs%flags, xcs%functional(
func_x,1)%flags)
321 xcs%flags = ior(xcs%flags, xcs%functional(
func_c,1)%flags)
323 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_x,1)%family)
324 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_c,1)%family)
328 message(1) =
"Cannot perform a periodic calculation with a functional"
329 message(2) =
"that depends on the number of electrons."
341 message(1) =
"You cannot use an exchange functional when performing"
342 message(2) =
"a Hartree-Fock calculation or using a hybrid functional."
346 if (periodic_dim == ndim)
then
347 call messages_experimental(
"Fock operator (Hartree-Fock, OEP, hybrids) in fully periodic systems", namespace=namespace)
353 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,1)%conf, xcs%cam%omega, &
354 xcs%cam%alpha, xcs%cam%beta)
355 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,2)%conf, xcs%cam%omega, &
356 xcs%cam%alpha, xcs%cam%beta)
363 xcs%functional(
func_x,1)%family = xc_family_oep
365 xcs%functional(
func_x,2)%family = xc_family_oep
368 xcs%family = ior(xcs%family, xc_family_oep)
372 if (
in_family(xcs%family, [xc_family_lca]))
then
379 if (xcs%functional(
func_x, 1)%id == xc_mgga_x_tb09 .and. periodic_dim /= 3)
then
380 message(1) =
"mgga_x_tb09 functional can only be used for 3D periodic systems"
419 call parse_variable(namespace,
'XCDensityCorrection', lr_none, xcs%xc_density_correction)
421 if (xcs%xc_density_correction /= lr_none)
then
439 call parse_variable(namespace,
'XCDensityCorrectionOptimize', .
true., xcs%xcd_optimize_cutoff)
472 call parse_variable(namespace,
'XCDensityCorrectionNormalize', .
true., xcs%xcd_normalize)
497 if(
parse_block(namespace,
'HybridCamParameters', blk) == 0)
then
504 if(.not. cam_ext%is_null())
then
505 call cam_ext%print(namespace,
msg=
"Info: Setting external CAM parameters")
516 type(
xc_t),
intent(inout) :: xcs
533 if (
associated(xcs%quantities%hbuf_dens))
then
535 nullify(xcs%quantities%hbuf_dens)
537 if (
associated(xcs%quantities%hbuf_sigma))
then
538 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_sigma(1,1)),
size(xcs%quantities%hbuf_sigma, kind=int64)*8_int64)
539 nullify(xcs%quantities%hbuf_sigma)
541 if (
associated(xcs%quantities%hbuf_ldens))
then
542 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_ldens(1,1)),
size(xcs%quantities%hbuf_ldens, kind=int64)*8_int64)
543 nullify(xcs%quantities%hbuf_ldens)
545 if (
associated(xcs%quantities%hbuf_tau))
then
547 nullify(xcs%quantities%hbuf_tau)
549 if (
associated(xcs%quantities%hbuf_zk))
then
551 nullify(xcs%quantities%hbuf_zk)
553 if (
associated(xcs%quantities%hbuf_dedd))
then
555 nullify(xcs%quantities%hbuf_dedd)
557 if (
associated(xcs%quantities%hbuf_vsigma))
then
558 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_vsigma(1,1)),
size(xcs%quantities%hbuf_vsigma, kind=int64)*8_int64)
559 nullify(xcs%quantities%hbuf_vsigma)
561 if (
associated(xcs%quantities%hbuf_dedldens))
then
563 size(xcs%quantities%hbuf_dedldens, kind=int64)*8_int64)
564 nullify(xcs%quantities%hbuf_dedldens)
566 if (
associated(xcs%quantities%hbuf_dedtau))
then
567 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_dedtau(1,1)),
size(xcs%quantities%hbuf_dedtau, kind=int64)*8_int64)
568 nullify(xcs%quantities%hbuf_dedtau)
579 logical pure function xc_is_orbital_dependent(xcs)
580 type(
xc_t),
intent(in) :: xcs
591 integer,
intent(in) :: family
592 logical,
optional,
intent(in) :: only_collinear
594 if(optional_default(only_collinear, .false.))
then
596 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
599 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc, xc_family_nc_mgga])
609 integer,
intent(in) :: family
612 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
618 integer,
intent(in) :: family
619 logical,
optional,
intent(in) :: only_collinear
621 if(optional_default(only_collinear, .false.))
then
629 integer,
intent(in) :: family
637 type(
xc_t),
intent(in) :: xcs
643 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_mgga, xc_family_hyb_mgga, xc_family_nc_mgga]) &
644 .and. xc_functional_is_energy_functional(xcs%functional(ixc, 1)))
then
652 type(
xc_t),
intent(in) :: xcs
658 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga]))
then
664 pure logical function in_family(family, xc_families)
665 integer,
intent(in) :: family
666 integer,
intent(in) :: xc_families(:)
668 in_family = bitand(family, sum(xc_families)) /= 0
673 class(
xc_t),
intent(in) :: xc
674 integer,
intent(in) :: theory_level
676 integer,
parameter :: exchange_theory_level(3) = [hartree, hartree_fock, rdmft]
681 (theory_level == generalized_kohn_sham_dft .and.
family_is_hybrid(xc)) .or. &
682 (xc%functional(func_x, 1)%id == xc_oep_x_slater) .or. &
683 (bitand(xc%family, xc_family_oep) /= 0)
692 type(
xc_t),
intent(inout) :: xcs
693 type(namespace_t),
intent(in) :: namespace
694 type(xc_cam_t),
intent(in) :: cam_ext
696 real(real64),
parameter :: default_alpha_pbe0 = 0.25_real64
705 select case(xcs%functional(func_c, 1)%id)
707 case(xc_hyb_gga_xc_pbeh, xc_hyb_lda_xc_lda0)
709 call xc_f03_func_set_ext_params(xcs%functional(func_c, 1)%conf,
parameters)
710 call xc_f03_func_set_ext_params(xcs%functional(func_c, 2)%conf,
parameters)
711 write(message(1),
'(a,f6.3,a)')
'Info: Setting mixing parameter (' ,
parameters(1) ,
').'
712 call messages_info(1)
714 case(xc_hyb_gga_xc_cam_pbeh, xc_hyb_lda_xc_cam_lda0)
717 call xc_f03_func_set_ext_params(xcs%functional(func_c, 1)%conf,
parameters)
718 call xc_f03_func_set_ext_params(xcs%functional(func_c, 2)%conf,
parameters)
720 call xc_f03_hyb_cam_coef(xcs%functional(func_c,1)%conf, xcs%cam%omega, &
721 xcs%cam%alpha, xcs%cam%beta)
722 call xc_f03_hyb_cam_coef(xcs%functional(func_c,2)%conf, xcs%cam%omega, &
723 xcs%cam%alpha, xcs%cam%beta)
724 call xcs%cam%print(namespace, msg=
"Setting CAM parameters:")
737 type(
xc_t),
intent(in) :: xcs
738 type(namespace_t),
intent(in) :: namespace
741 .or. xc_functional_is_not_size_consistent(xcs%functional(func_c,1), namespace)
747 type(
xc_t),
intent(in) :: xcs
749 .or. xc_functional_is_energy_functional(xcs%functional(func_c,1))
pure logical function, public accel_is_enabled()
This module contains interfaces for routines in allocate_hardware_aware.c.
subroutine, public deallocate_hardware_aware(array, size)
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
integer, parameter, public unpolarized
Parameters...
real(real64), parameter, public m_zero
integer, parameter, public hartree_fock
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
This module is intended to contain "only mathematical" functions and procedures.
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_not_implemented(feature, namespace)
character(len=512), private msg
subroutine, public messages_warning(no_lines, all_nodes, namespace)
subroutine, public messages_obsolete_variable(namespace, name, rep)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public messages_experimental(name, namespace)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
integer function, public parse_block(namespace, name, blk, check_varinfo_)
This module handles spin dimensions of the states and the k-point distribution.
This module defines the unit system, used for input and output.
type(xc_cam_t), parameter, public cam_null
All CAM parameters set to zero.
type(xc_cam_t), parameter, public cam_exact_exchange
Use only Hartree Fock exact exchange.
subroutine, public xc_functional_write_info(functl, iunit, namespace)
Write functional information.
subroutine, public xc_functional_init(functl, namespace, id, ndim, nel, spin_channels, functionals_on_cpu)
integer, parameter, public xc_family_nc_mgga
integer, parameter, public xc_oep_x
Exact exchange.
subroutine, public xc_functional_end(functl)
integer, parameter, public func_c
integer, parameter, public func_x
subroutine, public xc_lrc_init(this, namespace, dim, periodic_dim)
subroutine, public xc_write_info(xcs, iunit, namespace)
subroutine, public xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
pure logical function, public family_is_mgga(family, only_collinear)
Is the xc function part of the mGGA family.
subroutine set_hybrid_params(xcs, namespace, cam_ext)
Sets external parameters for some hybrid functionals.
pure logical function, public family_is_gga(family, only_collinear)
Is the xc function part of the GGA family.
logical pure function, public family_is_mgga_with_exc(xcs)
Is the xc function part of the mGGA family with an energy functional.
logical function, public xc_is_using_device(namespace)
Check if XC will run on device (parses config and checks availability)
subroutine, public xc_end(xcs)
logical pure function, public xc_is_energy_functional(xcs)
Is one of the x or c functional is not an energy functional.
logical pure function, public family_is_hybrid(xcs)
Returns true if the functional is an hybrid functional.
logical function, public xc_is_not_size_consistent(xcs, namespace)
Is one of the x or c functional is not size consistent.
subroutine, public xc_init_device_support(xcs, namespace)
integer, parameter, public lr_x
pure logical function, public family_is_nc_mgga(family)
logical function xc_compute_exchange(xc, theory_level)
Theory levels and functionals for which exacy exchange is required.
pure logical function, public family_is_supported(family)
Is the xc family internally supported by Octopus.
pure logical function, public in_family(family, xc_families)
subroutine, public xc_write_fxc_info(xcs, iunit, namespace)
logical pure function, public xc_is_orbital_dependent(xcs)
Is the xc family orbital dependent.
Coulomb-attenuating method parameters, used in the partitioning of the Coulomb potential into a short...