33 use,
intrinsic :: iso_fortran_env
53#ifdef HAVE_LIBXC_FUNCS
84 real(real64),
pointer :: rho(:,:)
86 real(real64),
allocatable :: dens(:,:)
87 real(real64),
allocatable :: gdens(:,:,:)
88 real(real64),
allocatable :: ldens(:,:)
89 real(real64),
allocatable :: tau(:,:)
95 integer,
public :: family
96 integer,
public :: flags
97 integer,
public :: kernel_family
98 type(xc_functional_t),
public :: functional(2,2)
101 type(xc_functional_t),
public :: kernel(2,2)
102 type(xc_cam_t),
public :: cam
103 type(xc_lrc_t),
public :: lrc
105 logical :: use_gi_ked
106 integer :: xc_density_correction
107 logical :: xcd_optimize_cutoff
108 real(real64) :: xcd_ncutoff
109 logical :: xcd_minimum
110 logical :: xcd_normalize
113 type(internal_quantities_t) :: quantities
121 real(real64),
public,
parameter :: xc_tiny = 1.0e-12_real64
123 integer,
parameter :: &
131 type(xc_t),
intent(in) :: xcs
132 integer,
optional,
intent(in) :: iunit
133 type(namespace_t),
optional,
intent(in) :: namespace
139 write(
message(1),
'(a)')
"Exchange-correlation:"
146 if (abs(xcs%cam%alpha + xcs%cam%beta) >
m_epsilon)
then
148 write(
message(2),
'(a,f8.5)')
"Exact exchange mixing = ", xcs%cam%alpha
149 write(
message(3),
'(a,f8.5)')
"Exact exchange for short-range beta = ", xcs%cam%beta
150 write(
message(4),
'(a,f8.5)')
"Exact exchange range-separate omega = ", xcs%cam%omega
160 type(xc_t),
intent(in) :: xcs
161 integer,
optional,
intent(in) :: iunit
162 type(namespace_t),
optional,
intent(in) :: namespace
168 write(
message(1),
'(a)')
"Exchange-correlation kernel:"
180 subroutine xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
183 integer,
intent(in) :: ndim
184 integer,
intent(in) :: periodic_dim
185 real(real64),
intent(in) :: nel
186 integer,
intent(in) :: x_id
187 integer,
intent(in) :: c_id
188 integer,
intent(in) :: xk_id
189 integer,
intent(in) :: ck_id
191 integer,
intent(in) :: ispin
193 integer :: isp, xc_major, xc_minor, xc_micro
200 call xc_f03_version(xc_major, xc_minor, xc_micro)
204 xcs%kernel_family = 0
224 xcs%family = ior(xcs%family, xcs%functional(
func_x,1)%family)
225 xcs%family = ior(xcs%family, xcs%functional(
func_c,1)%family)
227 xcs%flags = ior(xcs%flags, xcs%functional(
func_x,1)%flags)
228 xcs%flags = ior(xcs%flags, xcs%functional(
func_c,1)%flags)
230 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_x,1)%family)
231 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_c,1)%family)
235 message(1) =
"Cannot perform a periodic calculation with a functional"
236 message(2) =
"that depends on the number of electrons."
248 message(1) =
"You cannot use an exchange functional when performing"
249 message(2) =
"a Hartree-Fock calculation or using a hybrid functional."
253 if (periodic_dim == ndim)
then
254 call messages_experimental(
"Fock operator (Hartree-Fock, OEP, hybrids) in fully periodic systems", namespace=namespace)
260 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,1)%conf, xcs%cam%omega, &
261 xcs%cam%alpha, xcs%cam%beta)
262 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,2)%conf, xcs%cam%omega, &
263 xcs%cam%alpha, xcs%cam%beta)
270 xcs%functional(
func_x,1)%family = xc_family_oep
272 xcs%functional(
func_x,2)%family = xc_family_oep
275 xcs%family = ior(xcs%family, xc_family_oep)
279 if (
in_family(xcs%family, [xc_family_lca]))
then
286 if (xcs%functional(
func_x, 1)%id == xc_mgga_x_tb09 .and. periodic_dim /= 3)
then
287 message(1) =
"mgga_x_tb09 functional can only be used for 3D periodic systems"
326 call parse_variable(namespace,
'XCDensityCorrection', lr_none, xcs%xc_density_correction)
328 if (xcs%xc_density_correction /= lr_none)
then
346 call parse_variable(namespace,
'XCDensityCorrectionOptimize', .
true., xcs%xcd_optimize_cutoff)
379 call parse_variable(namespace,
'XCDensityCorrectionNormalize', .
true., xcs%xcd_normalize)
404 if(
parse_block(namespace,
'HybridCamParameters', blk) == 0)
then
411 if(.not. cam_ext%is_null())
then
412 call cam_ext%print(namespace,
msg=
"Info: Setting external CAM parameters")
423 type(
xc_t),
intent(inout) :: xcs
446 logical pure function xc_is_orbital_dependent(xcs)
447 type(
xc_t),
intent(in) :: xcs
458 integer,
intent(in) :: family
459 logical,
optional,
intent(in) :: only_collinear
461 if(optional_default(only_collinear, .false.))
then
463 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
466 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc, xc_family_nc_mgga])
476 integer,
intent(in) :: family
479 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
485 integer,
optional,
intent(in) :: family
486 logical,
optional,
intent(in) :: only_collinear
488 if(optional_default(only_collinear, .false.))
then
497 logical pure function family_is_mgga_with_exc(xcs)
498 type(
xc_t),
intent(in) :: xcs
504 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_mgga, xc_family_hyb_mgga, xc_family_nc_mgga]) &
505 .and. xc_functional_is_energy_functional(xcs%functional(ixc, 1)))
then
512 logical pure function family_is_hybrid(xcs)
513 type(
xc_t),
intent(in) :: xcs
519 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga]))
then
525 pure logical function in_family(family, xc_families)
526 integer,
intent(in) :: family
527 integer,
intent(in) :: xc_families(:)
529 in_family = bitand(family, sum(xc_families)) /= 0
534 class(
xc_t),
intent(in) :: xc
535 integer,
intent(in) :: theory_level
537 integer,
parameter :: exchange_theory_level(3) = [hartree, hartree_fock, rdmft]
542 (theory_level == generalized_kohn_sham_dft .and.
family_is_hybrid(xc)) .or. &
543 (xc%functional(func_x, 1)%id == xc_oep_x_slater) .or. &
544 (bitand(xc%family, xc_family_oep) /= 0)
553 real(real64),
intent(in) :: global(:,:)
554 real(real64),
intent(out) :: local(:,:)
555 integer,
intent(in) :: n_block
556 integer,
intent(in) :: nspin
557 integer,
intent(in) :: ip
566 local(is, ib) = global(ib + ip - 1, is)
575 real(real64),
intent(in) :: local(:,:)
576 real(real64),
intent(inout) :: global(:,:)
577 integer,
intent(in) :: n_block
578 integer,
intent(in) :: spin_channels
579 integer,
intent(in) :: ip
585 do is = 1, spin_channels
588 global(ib + ip - 1, is) = global(ib + ip - 1, is) + local(is, ib)
598 type(
xc_t),
intent(inout) :: xcs
599 type(namespace_t),
intent(in) :: namespace
600 type(xc_cam_t),
intent(in) :: cam_ext
602 real(real64),
parameter :: default_alpha_pbe0 = 0.25_real64
611 select case(xcs%functional(func_c, 1)%id)
613 case(xc_hyb_gga_xc_pbeh, xc_hyb_lda_xc_lda0)
615 call xc_f03_func_set_ext_params(xcs%functional(func_c, 1)%conf,
parameters)
616 call xc_f03_func_set_ext_params(xcs%functional(func_c, 2)%conf,
parameters)
617 write(message(1),
'(a,f6.3,a)')
'Info: Setting mixing parameter (' ,
parameters(1) ,
').'
618 call messages_info(1)
620 case(xc_hyb_gga_xc_cam_pbeh, xc_hyb_lda_xc_cam_lda0)
624 call xc_f03_hyb_cam_coef(xcs%functional(func_c,1)%conf, xcs%cam%omega, &
625 xcs%cam%alpha, xcs%cam%beta)
626 call xc_f03_hyb_cam_coef(xcs%functional(func_c,2)%conf, xcs%cam%omega, &
627 xcs%cam%alpha, xcs%cam%beta)
628 call xcs%cam%print(namespace, msg=
"Setting CAM parameters:")
641 type(
xc_t),
intent(in) :: xcs
642 type(namespace_t),
intent(in) :: namespace
645 .or. xc_functional_is_not_size_consistent(xcs%functional(func_c,1), namespace)
650 logical pure function xc_is_energy_functional(xcs)
651 type(
xc_t),
intent(in) :: xcs
653 .or. xc_functional_is_energy_functional(xcs%functional(func_c,1))
656#include "xc_vxc_inc.F90"
657#include "xc_fxc_inc.F90"
658#include "xc_kxc_inc.F90"
660#include "xc_vxc_nc_inc.F90"
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
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_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)
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 xc_compute_vxc(der, xcs, st, psolver, namespace, space, quantities, ispin, vxc, ex, ec, deltaxc, vtau, ex_density, ec_density, stress_xc)
subroutine, public xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
subroutine, public xc_get_kxc(xcs, mesh, namespace, rho, ispin, kxc)
pure logical function family_is_supported(family)
Is the xc family internally supported by Octopus.
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.
logical pure function, public family_is_mgga_with_exc(xcs)
Is the xc function part of the mGGA family with an energy functional.
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.
subroutine, public xc_get_vxc(gr, xcs, st, kpoints, psolver, namespace, space, rho, ispin, rcell_volume, vxc, ex, ec, deltaxc, vtau, ex_density, ec_density, stress_xc, force_orbitalfree)
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 copy_local_to_global(local, global, n_block, spin_channels, ip)
subroutine, public xc_get_nc_vxc(gr, xcs, st, kpoints, space, namespace, rho, vxc, ex, ec, vtau, ex_density, ec_density)
This routines is similar to xc_get_vxc but for noncollinear functionals, which are not implemented in...
pure logical function family_is_nc_mgga(family)
Returns true is the functional is a noncollinear functional.
subroutine, public xc_get_fxc(xcs, gr, namespace, rho, ispin, fxc, fxc_grad, fxc_grad_spin)
Returns the exchange-correlation kernel.
pure logical function family_is_gga(family, only_collinear)
Is the xc function part of the GGA family.
logical function xc_compute_exchange(xc, theory_level)
Theory levels and functionals for which exacy exchange is required.
pure logical function, public in_family(family, xc_families)
subroutine, public xc_write_fxc_info(xcs, iunit, namespace)
subroutine copy_global_to_local(global, local, n_block, nspin, ip)
make a local copy with the correct memory order for libxc
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...