39 use,
intrinsic :: iso_fortran_env
60#ifdef HAVE_LIBXC_FUNCS
93 real(real64),
pointer :: rho(:,:)
95 real(real64),
allocatable :: dens(:,:)
96 real(real64),
allocatable :: gdens(:,:,:)
97 real(real64),
allocatable :: ldens(:,:)
98 real(real64),
allocatable :: tau(:,:)
100 type(accel_mem_t) :: dens_buff
101 type(accel_mem_t) :: zk_buff
102 type(accel_mem_t) :: dedd_buff
103 type(accel_mem_t) :: sigma_buff
104 type(accel_mem_t) :: vsigma_buff
105 type(accel_mem_t) :: tau_buff
106 type(accel_mem_t) :: ldens_buff
107 type(accel_mem_t) :: dedtau_buff
108 type(accel_mem_t) :: dedldens_buff
111 real(real64),
pointer,
contiguous :: hbuf_dens(:,:) => null()
112 real(real64),
pointer,
contiguous :: hbuf_sigma(:,:) => null()
113 real(real64),
pointer,
contiguous :: hbuf_ldens(:,:) => null()
114 real(real64),
pointer,
contiguous :: hbuf_tau(:,:) => null()
115 real(real64),
pointer,
contiguous :: hbuf_zk(:) => null()
116 real(real64),
pointer,
contiguous :: hbuf_dedd(:,:) => null()
117 real(real64),
pointer,
contiguous :: hbuf_vsigma(:,:) => null()
118 real(real64),
pointer,
contiguous :: hbuf_dedldens(:,:) => null()
119 real(real64),
pointer,
contiguous :: hbuf_dedtau(:,:) => null()
122 type(accel_mem_t) :: buff_rho_core
123 type(accel_mem_t) :: buff_frozen_rho
124 integer :: frozen_rho_np = 0
125 real(real64) :: amaldi_factor =
m_one
128 logical :: dens_buff_prefilled = .false.
134 integer,
public :: family
135 integer,
public :: flags
136 integer,
public :: kernel_family
137 type(xc_functional_t),
public :: functional(2,2)
140 type(xc_functional_t),
public :: kernel(2,2)
141 type(xc_cam_t),
public :: cam
142 type(xc_lrc_t),
public :: lrc
144 logical,
public :: use_gi_ked
145 integer,
public :: xc_density_correction
146 logical,
public :: xcd_optimize_cutoff
147 real(real64),
public :: xcd_ncutoff
148 logical,
public :: xcd_minimum
149 logical,
public :: xcd_normalize
150 logical,
public :: parallel
151 logical,
public :: xc_on_host
153 type(internal_quantities_t),
public :: quantities
161 real(real64),
public,
parameter :: xc_tiny = 1.0e-12_real64
163 integer,
public,
parameter :: &
171 type(xc_t),
intent(in) :: xcs
172 integer,
optional,
intent(in) :: iunit
173 type(namespace_t),
optional,
intent(in) :: namespace
179 write(
message(1),
'(a)')
"Exchange-correlation:"
186 if (abs(xcs%cam%alpha) + abs(xcs%cam%beta) >
m_epsilon)
then
188 write(
message(2),
'(a,f8.5)')
"Exact exchange mixing = ", xcs%cam%alpha
189 write(
message(3),
'(a,f8.5)')
"Exact exchange for short-range beta = ", xcs%cam%beta
190 write(
message(4),
'(a,f8.5)')
"Exact exchange range-separate omega = ", xcs%cam%omega
201 integer,
optional,
intent(in) :: iunit
208 write(
message(1),
'(a)')
"Exchange-correlation kernel:"
221 type(
xc_t),
intent(inout) :: xcs
236 logical :: xc_force_cpu
250#if defined(HAVE_LIBXC_DEVICE) && defined(HAVE_ACCEL)
255#elif defined(HAVE_LIBXC_DEVICE) && !defined(HAVE_ACCEL)
256 if(.not. xc_force_cpu)
then
257 call messages_warning(
"Libxc has device support but no accelerator support is enabled in Octopus.", namespace=namespace)
268 subroutine xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
269 type(
xc_t),
intent(out) :: xcs
271 integer,
intent(in) :: ndim
272 integer,
intent(in) :: periodic_dim
273 real(real64),
intent(in) :: nel
274 integer,
intent(in) :: x_id
275 integer,
intent(in) :: c_id
276 integer,
intent(in) :: xk_id
277 integer,
intent(in) :: ck_id
279 integer,
intent(in) :: ispin
281 integer :: isp, xc_major, xc_minor, xc_micro
288 call xc_f03_version(xc_major, xc_minor, xc_micro)
292 xcs%kernel_family = 0
296 call xc_lrc_init(xcs%lrc, namespace, ndim, periodic_dim)
302 if (ndim /= 3) xcs%xc_on_host = .
true.
318 xcs%family = ior(xcs%family, xcs%functional(
func_x,1)%family)
319 xcs%family = ior(xcs%family, xcs%functional(
func_c,1)%family)
321 xcs%flags = ior(xcs%flags, xcs%functional(
func_x,1)%flags)
322 xcs%flags = ior(xcs%flags, xcs%functional(
func_c,1)%flags)
324 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_x,1)%family)
325 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_c,1)%family)
329 message(1) =
"Cannot perform a periodic calculation with a functional"
330 message(2) =
"that depends on the number of electrons."
342 message(1) =
"You cannot use an exchange functional when performing"
343 message(2) =
"a Hartree-Fock calculation or using a hybrid functional."
347 if (periodic_dim == ndim)
then
348 call messages_experimental(
"Fock operator (Hartree-Fock, OEP, hybrids) in fully periodic systems", namespace=namespace)
354 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,1)%conf, xcs%cam%omega, &
355 xcs%cam%alpha, xcs%cam%beta)
356 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,2)%conf, xcs%cam%omega, &
357 xcs%cam%alpha, xcs%cam%beta)
364 xcs%functional(
func_x,1)%family = xc_family_oep
366 xcs%functional(
func_x,2)%family = xc_family_oep
369 xcs%family = ior(xcs%family, xc_family_oep)
373 if (
in_family(xcs%family, [xc_family_lca]))
then
380 if (xcs%functional(
func_x, 1)%id == xc_mgga_x_tb09 .and. periodic_dim /= 3)
then
381 message(1) =
"mgga_x_tb09 functional can only be used for 3D periodic systems"
420 call parse_variable(namespace,
'XCDensityCorrection', lr_none, xcs%xc_density_correction)
422 if (xcs%xc_density_correction /= lr_none)
then
440 call parse_variable(namespace,
'XCDensityCorrectionOptimize', .
true., xcs%xcd_optimize_cutoff)
473 call parse_variable(namespace,
'XCDensityCorrectionNormalize', .
true., xcs%xcd_normalize)
498 if(
parse_block(namespace,
'HybridCamParameters', blk) == 0)
then
505 if(.not. cam_ext%is_null())
then
506 call cam_ext%print(namespace,
msg=
"Info: Setting external CAM parameters")
517 type(
xc_t),
intent(inout) :: xcs
534 if (
associated(xcs%quantities%hbuf_dens))
then
536 nullify(xcs%quantities%hbuf_dens)
538 if (
associated(xcs%quantities%hbuf_sigma))
then
539 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_sigma(1,1)),
size(xcs%quantities%hbuf_sigma, kind=int64)*8_int64)
540 nullify(xcs%quantities%hbuf_sigma)
542 if (
associated(xcs%quantities%hbuf_ldens))
then
543 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_ldens(1,1)),
size(xcs%quantities%hbuf_ldens, kind=int64)*8_int64)
544 nullify(xcs%quantities%hbuf_ldens)
546 if (
associated(xcs%quantities%hbuf_tau))
then
548 nullify(xcs%quantities%hbuf_tau)
550 if (
associated(xcs%quantities%hbuf_zk))
then
552 nullify(xcs%quantities%hbuf_zk)
554 if (
associated(xcs%quantities%hbuf_dedd))
then
556 nullify(xcs%quantities%hbuf_dedd)
558 if (
associated(xcs%quantities%hbuf_vsigma))
then
559 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_vsigma(1,1)),
size(xcs%quantities%hbuf_vsigma, kind=int64)*8_int64)
560 nullify(xcs%quantities%hbuf_vsigma)
562 if (
associated(xcs%quantities%hbuf_dedldens))
then
564 size(xcs%quantities%hbuf_dedldens, kind=int64)*8_int64)
565 nullify(xcs%quantities%hbuf_dedldens)
567 if (
associated(xcs%quantities%hbuf_dedtau))
then
568 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_dedtau(1,1)),
size(xcs%quantities%hbuf_dedtau, kind=int64)*8_int64)
569 nullify(xcs%quantities%hbuf_dedtau)
580 logical pure function xc_is_orbital_dependent(xcs)
581 type(
xc_t),
intent(in) :: xcs
592 integer,
intent(in) :: family
593 logical,
optional,
intent(in) :: only_collinear
595 if(optional_default(only_collinear, .false.))
then
597 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
600 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc, xc_family_nc_mgga])
610 integer,
intent(in) :: family
613 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
619 integer,
intent(in) :: family
620 logical,
optional,
intent(in) :: only_collinear
622 if(optional_default(only_collinear, .false.))
then
630 integer,
intent(in) :: family
638 type(
xc_t),
intent(in) :: xcs
644 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_mgga, xc_family_hyb_mgga, xc_family_nc_mgga]) &
645 .and. xc_functional_is_energy_functional(xcs%functional(ixc, 1)))
then
653 type(
xc_t),
intent(in) :: xcs
659 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga]))
then
665 pure logical function in_family(family, xc_families)
666 integer,
intent(in) :: family
667 integer,
intent(in) :: xc_families(:)
669 in_family = bitand(family, sum(xc_families)) /= 0
674 class(
xc_t),
intent(in) :: xc
675 integer,
intent(in) :: theory_level
677 integer,
parameter :: exchange_theory_level(3) = [hartree, hartree_fock, rdmft]
682 (theory_level == generalized_kohn_sham_dft .and.
family_is_hybrid(xc)) .or. &
683 (xc%functional(func_x, 1)%id == xc_oep_x_slater) .or. &
684 (bitand(xc%family, xc_family_oep) /= 0)
693 type(
xc_t),
intent(inout) :: xcs
694 type(namespace_t),
intent(in) :: namespace
695 type(xc_cam_t),
intent(in) :: cam_ext
697 real(real64),
parameter :: default_alpha_pbe0 = 0.25_real64
706 select case(xcs%functional(func_c, 1)%id)
708 case(xc_hyb_gga_xc_pbeh, xc_hyb_lda_xc_lda0)
710 call xc_f03_func_set_ext_params(xcs%functional(func_c, 1)%conf,
parameters)
711 call xc_f03_func_set_ext_params(xcs%functional(func_c, 2)%conf,
parameters)
712 write(message(1),
'(a,f6.3,a)')
'Info: Setting mixing parameter (' ,
parameters(1) ,
').'
713 call messages_info(1)
715 case(xc_hyb_gga_xc_cam_pbeh, xc_hyb_lda_xc_cam_lda0)
718 call xc_f03_func_set_ext_params(xcs%functional(func_c, 1)%conf,
parameters)
719 call xc_f03_func_set_ext_params(xcs%functional(func_c, 2)%conf,
parameters)
721 call xc_f03_hyb_cam_coef(xcs%functional(func_c,1)%conf, xcs%cam%omega, &
722 xcs%cam%alpha, xcs%cam%beta)
723 call xc_f03_hyb_cam_coef(xcs%functional(func_c,2)%conf, xcs%cam%omega, &
724 xcs%cam%alpha, xcs%cam%beta)
725 call xcs%cam%print(namespace, msg=
"Setting CAM parameters:")
738 type(
xc_t),
intent(in) :: xcs
739 type(namespace_t),
intent(in) :: namespace
742 .or. xc_functional_is_not_size_consistent(xcs%functional(func_c,1), namespace)
748 type(
xc_t),
intent(in) :: xcs
750 .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...