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)
510 if(
parse_block(namespace,
'HybridCamParameters', blk) == 0)
then
517 if(.not. cam_ext%is_null())
then
518 call cam_ext%print(namespace,
msg=
"Info: Setting external CAM parameters")
529 type(
xc_t),
intent(inout) :: xcs
546 if (
associated(xcs%quantities%hbuf_dens))
then
548 nullify(xcs%quantities%hbuf_dens)
550 if (
associated(xcs%quantities%hbuf_sigma))
then
551 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_sigma(1,1)),
size(xcs%quantities%hbuf_sigma, kind=int64)*8_int64)
552 nullify(xcs%quantities%hbuf_sigma)
554 if (
associated(xcs%quantities%hbuf_ldens))
then
555 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_ldens(1,1)),
size(xcs%quantities%hbuf_ldens, kind=int64)*8_int64)
556 nullify(xcs%quantities%hbuf_ldens)
558 if (
associated(xcs%quantities%hbuf_tau))
then
560 nullify(xcs%quantities%hbuf_tau)
562 if (
associated(xcs%quantities%hbuf_zk))
then
564 nullify(xcs%quantities%hbuf_zk)
566 if (
associated(xcs%quantities%hbuf_dedd))
then
568 nullify(xcs%quantities%hbuf_dedd)
570 if (
associated(xcs%quantities%hbuf_vsigma))
then
571 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_vsigma(1,1)),
size(xcs%quantities%hbuf_vsigma, kind=int64)*8_int64)
572 nullify(xcs%quantities%hbuf_vsigma)
574 if (
associated(xcs%quantities%hbuf_dedldens))
then
576 size(xcs%quantities%hbuf_dedldens, kind=int64)*8_int64)
577 nullify(xcs%quantities%hbuf_dedldens)
579 if (
associated(xcs%quantities%hbuf_dedtau))
then
580 call deallocate_hardware_aware(c_loc(xcs%quantities%hbuf_dedtau(1,1)),
size(xcs%quantities%hbuf_dedtau, kind=int64)*8_int64)
581 nullify(xcs%quantities%hbuf_dedtau)
592 logical pure function xc_is_orbital_dependent(xcs)
593 type(
xc_t),
intent(in) :: xcs
604 integer,
intent(in) :: family
605 logical,
optional,
intent(in) :: only_collinear
607 if(optional_default(only_collinear, .false.))
then
609 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
612 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc, xc_family_nc_mgga])
622 integer,
intent(in) :: family
625 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
631 integer,
intent(in) :: family
632 logical,
optional,
intent(in) :: only_collinear
634 if(optional_default(only_collinear, .false.))
then
642 integer,
intent(in) :: family
650 type(
xc_t),
intent(in) :: xcs
656 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_mgga, xc_family_hyb_mgga, xc_family_nc_mgga]) &
657 .and. xc_functional_is_energy_functional(xcs%functional(ixc, 1)))
then
665 type(
xc_t),
intent(in) :: xcs
671 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga]))
then
677 pure logical function in_family(family, xc_families)
678 integer,
intent(in) :: family
679 integer,
intent(in) :: xc_families(:)
681 in_family = bitand(family, sum(xc_families)) /= 0
686 class(
xc_t),
intent(in) :: xc
687 integer,
intent(in) :: theory_level
689 integer,
parameter :: exchange_theory_level(3) = [hartree, hartree_fock, rdmft]
694 (theory_level == generalized_kohn_sham_dft .and.
family_is_hybrid(xc)) .or. &
695 (xc%functional(func_x, 1)%id == xc_oep_x_slater) .or. &
696 (bitand(xc%family, xc_family_oep) /= 0)
705 type(
xc_t),
intent(inout) :: xcs
706 type(namespace_t),
intent(in) :: namespace
707 type(xc_cam_t),
intent(in) :: cam_ext
709 real(real64),
parameter :: default_alpha_pbe0 = 0.25_real64
718 select case(xcs%functional(func_c, 1)%id)
720 case(xc_hyb_gga_xc_pbeh, xc_hyb_lda_xc_lda0)
722 call xc_f03_func_set_ext_params(xcs%functional(func_c, 1)%conf,
parameters)
723 call xc_f03_func_set_ext_params(xcs%functional(func_c, 2)%conf,
parameters)
724 write(message(1),
'(a,f6.3,a)')
'Info: Setting mixing parameter (' ,
parameters(1) ,
').'
725 call messages_info(1)
727 case(xc_hyb_gga_xc_cam_pbeh, xc_hyb_lda_xc_cam_lda0)
730 call xc_f03_func_set_ext_params(xcs%functional(func_c, 1)%conf,
parameters)
731 call xc_f03_func_set_ext_params(xcs%functional(func_c, 2)%conf,
parameters)
733 call xc_f03_hyb_cam_coef(xcs%functional(func_c,1)%conf, xcs%cam%omega, &
734 xcs%cam%alpha, xcs%cam%beta)
735 call xc_f03_hyb_cam_coef(xcs%functional(func_c,2)%conf, xcs%cam%omega, &
736 xcs%cam%alpha, xcs%cam%beta)
737 call xcs%cam%print(namespace, msg=
"Setting CAM parameters:")
750 type(
xc_t),
intent(in) :: xcs
751 type(namespace_t),
intent(in) :: namespace
754 .or. xc_functional_is_not_size_consistent(xcs%functional(func_c,1), namespace)
760 type(
xc_t),
intent(in) :: xcs
762 .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...