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 type(xc_cam_t),
public :: cam
103 logical :: use_gi_ked
104 integer :: xc_density_correction
105 logical :: xcd_optimize_cutoff
106 real(real64) :: xcd_ncutoff
107 logical :: xcd_minimum
108 logical :: xcd_normalize
111 type(internal_quantities_t) :: quantities
115 real(real64),
parameter :: tiny = 1.0e-12_real64
117 integer,
parameter :: &
125 type(xc_t),
intent(in) :: xcs
126 integer,
optional,
intent(in) :: iunit
127 type(namespace_t),
optional,
intent(in) :: namespace
133 write(
message(1),
'(a)')
"Exchange-correlation:"
140 if (abs(xcs%cam%alpha + xcs%cam%beta) >
m_epsilon)
then
142 write(
message(2),
'(a,f8.5)')
"Exact exchange mixing = ", xcs%cam%alpha
143 write(
message(3),
'(a,f8.5)')
"Exact exchange for short-range beta = ", xcs%cam%beta
144 write(
message(4),
'(a,f8.5)')
"Exact exchange range-separate omega = ", xcs%cam%omega
154 subroutine xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
155 type(xc_t),
intent(out) :: xcs
156 type(namespace_t),
intent(in) :: namespace
157 integer,
intent(in) :: ndim
158 integer,
intent(in) :: periodic_dim
159 real(real64),
intent(in) :: nel
160 integer,
intent(in) :: x_id
161 integer,
intent(in) :: c_id
162 integer,
intent(in) :: xk_id
163 integer,
intent(in) :: ck_id
164 logical,
intent(in) :: hartree_fock
165 integer,
intent(in) :: ispin
167 integer :: isp, xc_major, xc_minor, xc_micro
170 type(xc_cam_t) :: cam_ext
174 call xc_f03_version(xc_major, xc_minor, xc_micro)
178 xcs%kernel_family = 0
196 xcs%family = ior(xcs%family, xcs%functional(
func_x,1)%family)
197 xcs%family = ior(xcs%family, xcs%functional(
func_c,1)%family)
199 xcs%flags = ior(xcs%flags, xcs%functional(
func_x,1)%flags)
200 xcs%flags = ior(xcs%flags, xcs%functional(
func_c,1)%flags)
202 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_x,1)%family)
203 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_c,1)%family)
207 message(1) =
"Cannot perform a periodic calculation with a functional"
208 message(2) =
"that depends on the number of electrons."
215 ll = (hartree_fock) &
220 message(1) =
"You cannot use an exchange functional when performing"
221 message(2) =
"a Hartree-Fock calculation or using a hybrid functional."
225 if (periodic_dim == ndim)
then
226 call messages_experimental(
"Fock operator (Hartree-Fock, OEP, hybrids) in fully periodic systems", namespace=namespace)
232 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,1)%conf, xcs%cam%omega, &
233 xcs%cam%alpha, xcs%cam%beta)
234 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,2)%conf, xcs%cam%omega, &
235 xcs%cam%alpha, xcs%cam%beta)
242 xcs%functional(
func_x,1)%family = xc_family_oep
244 xcs%functional(
func_x,2)%family = xc_family_oep
246 if (.not. hartree_fock)
then
247 xcs%family = ior(xcs%family, xc_family_oep)
251 if (
in_family(xcs%family, [xc_family_lca]))
then
258 if (xcs%functional(
func_x, 1)%id == xc_mgga_x_tb09 .and. periodic_dim /= 3)
then
259 message(1) =
"mgga_x_tb09 functional can only be used for 3D periodic systems"
303 if (abs(xcs%kernel_lrc_alpha) >
m_epsilon)
then
319 call parse_variable(namespace,
'XCDensityCorrection', lr_none, xcs%xc_density_correction)
321 if (xcs%xc_density_correction /= lr_none)
then
339 call parse_variable(namespace,
'XCDensityCorrectionOptimize', .
true., xcs%xcd_optimize_cutoff)
372 call parse_variable(namespace,
'XCDensityCorrectionNormalize', .
true., xcs%xcd_normalize)
397 if(
parse_block(namespace,
'HybridCamParameters', blk) == 0)
then
404 if(.not. cam_ext%is_null())
then
405 call cam_ext%print(namespace,
msg=
"Info: Setting external CAM parameters")
416 type(
xc_t),
intent(inout) :: xcs
439 logical pure function xc_is_orbital_dependent(xcs)
440 type(
xc_t),
intent(in) :: xcs
451 integer,
intent(in) :: family
452 logical,
optional,
intent(in) :: only_collinear
454 if(optional_default(only_collinear, .false.))
then
456 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
459 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc, xc_family_nc_mgga])
469 integer,
intent(in) :: family
472 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
478 integer,
optional,
intent(in) :: family
479 logical,
optional,
intent(in) :: only_collinear
481 if(optional_default(only_collinear, .false.))
then
490 logical pure function family_is_mgga_with_exc(xcs)
491 type(
xc_t),
intent(in) :: xcs
497 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_mgga, xc_family_hyb_mgga, xc_family_nc_mgga]) &
498 .and. xc_functional_is_energy_functional(xcs%functional(ixc, 1)))
then
505 logical pure function family_is_hybrid(xcs)
506 type(
xc_t),
intent(in) :: xcs
512 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga]))
then
518 pure logical function in_family(family, xc_families)
519 integer,
intent(in) :: family
520 integer,
intent(in) :: xc_families(:)
522 in_family = bitand(family, sum(xc_families)) /= 0
528 real(real64),
intent(in) :: global(:,:)
529 real(real64),
intent(out) :: local(:,:)
530 integer,
intent(in) :: n_block
531 integer,
intent(in) :: nspin
532 integer,
intent(in) :: ip
541 local(is, ib) = global(ib + ip - 1, is)
550 real(real64),
intent(in) :: local(:,:)
551 real(real64),
intent(inout) :: global(:,:)
552 integer,
intent(in) :: n_block
553 integer,
intent(in) :: spin_channels
554 integer,
intent(in) :: ip
560 do is = 1, spin_channels
563 global(ib + ip - 1, is) = global(ib + ip - 1, is) + local(is, ib)
573 type(
xc_t),
intent(inout) :: xcs
574 type(namespace_t),
intent(in) :: namespace
575 type(xc_cam_t),
intent(in) :: cam_ext
577 real(real64),
parameter :: default_alpha_pbe0 = 0.25_real64
586 select case(xcs%functional(func_c, 1)%id)
588 case(xc_hyb_gga_xc_pbeh, xc_hyb_lda_xc_lda0)
590 call xc_f03_func_set_ext_params(xcs%functional(func_c, 1)%conf,
parameters)
591 call xc_f03_func_set_ext_params(xcs%functional(func_c, 2)%conf,
parameters)
592 write(message(1),
'(a,f6.3,a)')
'Info: Setting mixing parameter (' ,
parameters(1) ,
').'
593 call messages_info(1)
595 case(xc_hyb_gga_xc_cam_pbeh, xc_hyb_lda_xc_cam_lda0)
599 call xc_f03_hyb_cam_coef(xcs%functional(func_c,1)%conf, xcs%cam%omega, &
600 xcs%cam%alpha, xcs%cam%beta)
601 call xc_f03_hyb_cam_coef(xcs%functional(func_c,2)%conf, xcs%cam%omega, &
602 xcs%cam%alpha, xcs%cam%beta)
603 call xcs%cam%print(namespace, msg=
"Setting CAM parameters:")
616 type(
xc_t),
intent(in) :: xcs
617 type(namespace_t),
intent(in) :: namespace
620 .or. xc_functional_is_not_size_consistent(xcs%functional(func_c,1), namespace)
625 logical pure function xc_is_energy_functional(xcs)
626 type(
xc_t),
intent(in) :: xcs
628 .or. xc_functional_is_energy_functional(xcs%functional(func_c,1))
631#include "xc_vxc_inc.F90"
632#include "xc_fxc_inc.F90"
633#include "xc_kxc_inc.F90"
635#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.
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.