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)
call xcs%cam%print(namespace, iunit=iunit)
193 integer,
optional,
intent(in) :: iunit
200 write(
message(1),
'(a)')
"Exchange-correlation kernel:"
213 type(
xc_t),
intent(inout) :: xcs
226 type(namespace_t),
intent(in) :: namespace
228 logical :: xc_force_cpu
242#if defined(HAVE_LIBXC_DEVICE) && defined(HAVE_ACCEL)
247#elif defined(HAVE_LIBXC_DEVICE) && !defined(HAVE_ACCEL)
248 if(.not. xc_force_cpu)
then
249 call messages_warning(
"Libxc has device support but no accelerator support is enabled in Octopus.", namespace=namespace)
260 subroutine xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
261 type(
xc_t),
intent(out) :: xcs
263 integer,
intent(in) :: ndim
264 integer,
intent(in) :: periodic_dim
265 real(real64),
intent(in) :: nel
266 integer,
intent(in) :: x_id
267 integer,
intent(in) :: c_id
268 integer,
intent(in) :: xk_id
269 integer,
intent(in) :: ck_id
271 integer,
intent(in) :: ispin
273 integer :: isp, xc_major, xc_minor, xc_micro
277 logical :: cam_ext_set
281 call xc_f03_version(xc_major, xc_minor, xc_micro)
285 xcs%kernel_family = 0
289 call xc_lrc_init(xcs%lrc, namespace, ndim, periodic_dim)
295 if (ndim /= 3) xcs%xc_on_host = .
true.
311 xcs%family = ior(xcs%family, xcs%functional(
func_x,1)%family)
312 xcs%family = ior(xcs%family, xcs%functional(
func_c,1)%family)
314 xcs%flags = ior(xcs%flags, xcs%functional(
func_x,1)%flags)
315 xcs%flags = ior(xcs%flags, xcs%functional(
func_c,1)%flags)
317 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_x,1)%family)
318 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_c,1)%family)
322 message(1) =
"Cannot perform a periodic calculation with a functional"
323 message(2) =
"that depends on the number of electrons."
335 message(1) =
"You cannot use an exchange functional when performing"
336 message(2) =
"a Hartree-Fock calculation or using a hybrid functional."
340 if (periodic_dim == ndim)
then
341 call messages_experimental(
"Fock operator (Hartree-Fock, OEP, hybrids) in fully periodic systems", namespace=namespace)
347 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,1)%conf, xcs%cam%omega, &
348 xcs%cam%alpha, xcs%cam%beta)
349 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,2)%conf, xcs%cam%omega, &
350 xcs%cam%alpha, xcs%cam%beta)
357 xcs%functional(
func_x,1)%family = xc_family_oep
359 xcs%functional(
func_x,2)%family = xc_family_oep
362 xcs%family = ior(xcs%family, xc_family_oep)
366 if (
in_family(xcs%family, [xc_family_lca]))
then
373 if (xcs%functional(
func_x, 1)%id == xc_mgga_x_tb09 .and. periodic_dim /= 3)
then
374 message(1) =
"mgga_x_tb09 functional can only be used for 3D periodic systems"
413 call parse_variable(namespace,
'XCDensityCorrection', lr_none, xcs%xc_density_correction)
415 if (xcs%xc_density_correction /= lr_none)
then
433 call parse_variable(namespace,
'XCDensityCorrectionOptimize', .
true., xcs%xcd_optimize_cutoff)
466 call parse_variable(namespace,
'XCDensityCorrectionNormalize', .
true., xcs%xcd_normalize)
504 cam_ext_set =
parse_block(namespace,
'HybridCamParameters', blk) == 0
505 if (cam_ext_set)
then
512 if (cam_ext_set)
then
513 call cam_ext%print(namespace,
msg=
"Setting external CAM parameters")
524 type(
xc_t),
intent(inout) :: xcs
541 if (
associated(xcs%quantities%hbuf_dens))
then
543 nullify(xcs%quantities%hbuf_dens)
545 if (
associated(xcs%quantities%hbuf_sigma))
then
546 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_sigma(1,1)),
size(xcs%quantities%hbuf_sigma, kind=int64)*8_int64)
547 nullify(xcs%quantities%hbuf_sigma)
549 if (
associated(xcs%quantities%hbuf_ldens))
then
550 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_ldens(1,1)),
size(xcs%quantities%hbuf_ldens, kind=int64)*8_int64)
551 nullify(xcs%quantities%hbuf_ldens)
553 if (
associated(xcs%quantities%hbuf_tau))
then
555 nullify(xcs%quantities%hbuf_tau)
557 if (
associated(xcs%quantities%hbuf_zk))
then
559 nullify(xcs%quantities%hbuf_zk)
561 if (
associated(xcs%quantities%hbuf_dedd))
then
563 nullify(xcs%quantities%hbuf_dedd)
565 if (
associated(xcs%quantities%hbuf_vsigma))
then
566 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_vsigma(1,1)),
size(xcs%quantities%hbuf_vsigma, kind=int64)*8_int64)
567 nullify(xcs%quantities%hbuf_vsigma)
569 if (
associated(xcs%quantities%hbuf_dedldens))
then
571 size(xcs%quantities%hbuf_dedldens, kind=int64)*8_int64)
572 nullify(xcs%quantities%hbuf_dedldens)
574 if (
associated(xcs%quantities%hbuf_dedtau))
then
575 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_dedtau(1,1)),
size(xcs%quantities%hbuf_dedtau, kind=int64)*8_int64)
576 nullify(xcs%quantities%hbuf_dedtau)
587 logical pure function xc_is_orbital_dependent(xcs)
588 type(
xc_t),
intent(in) :: xcs
599 integer,
intent(in) :: family
600 logical,
optional,
intent(in) :: only_collinear
602 if(optional_default(only_collinear, .false.))
then
604 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
607 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc, xc_family_nc_mgga])
617 integer,
intent(in) :: family
620 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
626 integer,
intent(in) :: family
627 logical,
optional,
intent(in) :: only_collinear
629 if(optional_default(only_collinear, .false.))
then
637 integer,
intent(in) :: family
645 type(
xc_t),
intent(in) :: xcs
651 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_mgga, xc_family_hyb_mgga, xc_family_nc_mgga]) &
652 .and. xc_functional_is_energy_functional(xcs%functional(ixc, 1)))
then
660 type(
xc_t),
intent(in) :: xcs
666 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga]))
then
672 pure logical function in_family(family, xc_families)
673 integer,
intent(in) :: family
674 integer,
intent(in) :: xc_families(:)
676 in_family = bitand(family, sum(xc_families)) /= 0
681 class(
xc_t),
intent(in) :: xc
682 integer,
intent(in) :: theory_level
684 integer,
parameter :: exchange_theory_level(3) = [hartree, hartree_fock, rdmft]
689 (theory_level == generalized_kohn_sham_dft .and.
family_is_hybrid(xc)) .or. &
690 (xc%functional(func_x, 1)%id == xc_oep_x_slater) .or. &
691 (bitand(xc%family, xc_family_oep) /= 0)
700 type(
xc_t),
intent(inout) :: xcs
701 type(namespace_t),
intent(in) :: namespace
702 type(xc_cam_t),
intent(in) :: cam_ext
704 real(real64),
parameter :: default_alpha_pbe0 = 0.25_real64
713 select case(xcs%functional(func_c, 1)%id)
715 case(xc_hyb_gga_xc_pbeh, xc_hyb_lda_xc_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)
719 write(message(1),
'(a,f6.3,a)')
'Info: Setting mixing parameter (' ,
parameters(1) ,
').'
720 call messages_info(1)
722 case(xc_hyb_gga_xc_cam_pbeh, xc_hyb_lda_xc_cam_lda0)
725 call xc_f03_func_set_ext_params(xcs%functional(func_c, 1)%conf,
parameters)
726 call xc_f03_func_set_ext_params(xcs%functional(func_c, 2)%conf,
parameters)
728 call xc_f03_hyb_cam_coef(xcs%functional(func_c,1)%conf, xcs%cam%omega, &
729 xcs%cam%alpha, xcs%cam%beta)
730 call xc_f03_hyb_cam_coef(xcs%functional(func_c,2)%conf, xcs%cam%omega, &
731 xcs%cam%alpha, xcs%cam%beta)
732 call xcs%cam%print(namespace, msg=
"Setting CAM parameters:")
745 type(
xc_t),
intent(in) :: xcs
746 type(namespace_t),
intent(in) :: namespace
749 .or. xc_functional_is_not_size_consistent(xcs%functional(func_c,1), namespace)
755 type(
xc_t),
intent(in) :: xcs
757 .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...