33 use,
intrinsic :: iso_fortran_env
53#ifdef HAVE_LIBXC_FUNCS
82 real(real64),
pointer :: rho(:,:)
84 real(real64),
allocatable :: dens(:,:)
85 real(real64),
allocatable :: gdens(:,:,:)
86 real(real64),
allocatable :: ldens(:,:)
87 real(real64),
allocatable :: tau(:,:)
93 integer,
public :: family
94 integer,
public :: flags
95 integer,
public :: kernel_family
96 type(xc_functional_t),
public :: functional(2,2)
99 type(xc_functional_t),
public :: kernel(2,2)
100 real(real64),
public :: kernel_lrc_alpha
101 real(real64),
public :: kernel_proca_a_zero
102 real(real64),
public :: kernel_proca_a_one
103 type(xc_cam_t),
public :: cam
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 subroutine xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
161 type(xc_t),
intent(out) :: xcs
162 type(namespace_t),
intent(in) :: namespace
163 integer,
intent(in) :: ndim
164 integer,
intent(in) :: periodic_dim
165 real(real64),
intent(in) :: nel
166 integer,
intent(in) :: x_id
167 integer,
intent(in) :: c_id
168 integer,
intent(in) :: xk_id
169 integer,
intent(in) :: ck_id
170 logical,
intent(in) :: hartree_fock
171 integer,
intent(in) :: ispin
173 integer :: isp, xc_major, xc_minor, xc_micro
176 type(xc_cam_t) :: cam_ext
180 call xc_f03_version(xc_major, xc_minor, xc_micro)
184 xcs%kernel_family = 0
202 xcs%family = ior(xcs%family, xcs%functional(
func_x,1)%family)
203 xcs%family = ior(xcs%family, xcs%functional(
func_c,1)%family)
205 xcs%flags = ior(xcs%flags, xcs%functional(
func_x,1)%flags)
206 xcs%flags = ior(xcs%flags, xcs%functional(
func_c,1)%flags)
208 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_x,1)%family)
209 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_c,1)%family)
213 message(1) =
"Cannot perform a periodic calculation with a functional"
214 message(2) =
"that depends on the number of electrons."
221 ll = (hartree_fock) &
226 message(1) =
"You cannot use an exchange functional when performing"
227 message(2) =
"a Hartree-Fock calculation or using a hybrid functional."
231 if (periodic_dim == ndim)
then
232 call messages_experimental(
"Fock operator (Hartree-Fock, OEP, hybrids) in fully periodic systems", namespace=namespace)
238 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,1)%conf, xcs%cam%omega, &
239 xcs%cam%alpha, xcs%cam%beta)
240 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,2)%conf, xcs%cam%omega, &
241 xcs%cam%alpha, xcs%cam%beta)
248 xcs%functional(
func_x,1)%family = xc_family_oep
250 xcs%functional(
func_x,2)%family = xc_family_oep
252 if (.not. hartree_fock)
then
253 xcs%family = ior(xcs%family, xc_family_oep)
257 if (
in_family(xcs%family, [xc_family_lca]))
then
264 if (xcs%functional(
func_x, 1)%id == xc_mgga_x_tb09 .and. periodic_dim /= 3)
then
265 message(1) =
"mgga_x_tb09 functional can only be used for 3D periodic systems"
309 if (abs(xcs%kernel_lrc_alpha) >
m_epsilon)
then
323 if (abs(xcs%kernel_proca_a_zero) >
m_epsilon)
then
337 if (abs(xcs%kernel_proca_a_one) >
m_epsilon)
then
353 call parse_variable(namespace,
'XCDensityCorrection', lr_none, xcs%xc_density_correction)
355 if (xcs%xc_density_correction /= lr_none)
then
373 call parse_variable(namespace,
'XCDensityCorrectionOptimize', .
true., xcs%xcd_optimize_cutoff)
406 call parse_variable(namespace,
'XCDensityCorrectionNormalize', .
true., xcs%xcd_normalize)
431 if(
parse_block(namespace,
'HybridCamParameters', blk) == 0)
then
438 if(.not. cam_ext%is_null())
then
439 call cam_ext%print(namespace,
msg=
"Info: Setting external CAM parameters")
450 type(
xc_t),
intent(inout) :: xcs
473 logical pure function xc_is_orbital_dependent(xcs)
474 type(
xc_t),
intent(in) :: xcs
485 integer,
intent(in) :: family
486 logical,
optional,
intent(in) :: only_collinear
488 if(optional_default(only_collinear, .false.))
then
490 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
493 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc, xc_family_nc_mgga])
503 integer,
intent(in) :: family
506 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
512 integer,
optional,
intent(in) :: family
513 logical,
optional,
intent(in) :: only_collinear
515 if(optional_default(only_collinear, .false.))
then
524 logical pure function family_is_mgga_with_exc(xcs)
525 type(
xc_t),
intent(in) :: xcs
531 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_mgga, xc_family_hyb_mgga, xc_family_nc_mgga]) &
532 .and. xc_functional_is_energy_functional(xcs%functional(ixc, 1)))
then
539 logical pure function family_is_hybrid(xcs)
540 type(
xc_t),
intent(in) :: xcs
546 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga]))
then
552 pure logical function in_family(family, xc_families)
553 integer,
intent(in) :: family
554 integer,
intent(in) :: xc_families(:)
556 in_family = bitand(family, sum(xc_families)) /= 0
561 class(
xc_t),
intent(in) :: xc
562 integer,
intent(in) :: theory_level
564 integer,
parameter :: exchange_theory_level(3) = [hartree, hartree_fock, rdmft]
569 (theory_level == generalized_kohn_sham_dft .and.
family_is_hybrid(xc)) .or. &
570 (xc%functional(func_x, 1)%id == xc_oep_x_slater) .or. &
571 (bitand(xc%family, xc_family_oep) /= 0)
580 real(real64),
intent(in) :: global(:,:)
581 real(real64),
intent(out) :: local(:,:)
582 integer,
intent(in) :: n_block
583 integer,
intent(in) :: nspin
584 integer,
intent(in) :: ip
593 local(is, ib) = global(ib + ip - 1, is)
602 real(real64),
intent(in) :: local(:,:)
603 real(real64),
intent(inout) :: global(:,:)
604 integer,
intent(in) :: n_block
605 integer,
intent(in) :: spin_channels
606 integer,
intent(in) :: ip
612 do is = 1, spin_channels
615 global(ib + ip - 1, is) = global(ib + ip - 1, is) + local(is, ib)
625 type(
xc_t),
intent(inout) :: xcs
626 type(namespace_t),
intent(in) :: namespace
627 type(xc_cam_t),
intent(in) :: cam_ext
629 real(real64),
parameter :: default_alpha_pbe0 = 0.25_real64
638 select case(xcs%functional(func_c, 1)%id)
640 case(xc_hyb_gga_xc_pbeh, xc_hyb_lda_xc_lda0)
642 call xc_f03_func_set_ext_params(xcs%functional(func_c, 1)%conf,
parameters)
643 call xc_f03_func_set_ext_params(xcs%functional(func_c, 2)%conf,
parameters)
644 write(message(1),
'(a,f6.3,a)')
'Info: Setting mixing parameter (' ,
parameters(1) ,
').'
645 call messages_info(1)
647 case(xc_hyb_gga_xc_cam_pbeh, xc_hyb_lda_xc_cam_lda0)
651 call xc_f03_hyb_cam_coef(xcs%functional(func_c,1)%conf, xcs%cam%omega, &
652 xcs%cam%alpha, xcs%cam%beta)
653 call xc_f03_hyb_cam_coef(xcs%functional(func_c,2)%conf, xcs%cam%omega, &
654 xcs%cam%alpha, xcs%cam%beta)
655 call xcs%cam%print(namespace, msg=
"Setting CAM parameters:")
668 type(
xc_t),
intent(in) :: xcs
669 type(namespace_t),
intent(in) :: namespace
672 .or. xc_functional_is_not_size_consistent(xcs%functional(func_c,1), namespace)
677 logical pure function xc_is_energy_functional(xcs)
678 type(
xc_t),
intent(in) :: xcs
680 .or. xc_functional_is_energy_functional(xcs%functional(func_c,1))
683#include "xc_vxc_inc.F90"
684#include "xc_fxc_inc.F90"
685#include "xc_kxc_inc.F90"
687#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
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_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 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.