33 use,
intrinsic :: iso_fortran_env
52#ifdef HAVE_LIBXC_FUNCS
81 real(real64),
pointer :: rho(:,:)
83 real(real64),
allocatable :: dens(:,:)
84 real(real64),
allocatable :: gdens(:,:,:)
85 real(real64),
allocatable :: ldens(:,:)
86 real(real64),
allocatable :: tau(:,:)
92 integer,
public :: family
93 integer,
public :: flags
94 integer,
public :: kernel_family
95 type(xc_functional_t),
public :: functional(2,2)
98 type(xc_functional_t),
public :: kernel(2,2)
99 real(real64),
public :: kernel_lrc_alpha
101 real(real64),
public :: cam_omega
102 real(real64),
public :: cam_alpha
103 real(real64),
public :: cam_beta
104 real(real64),
public :: cam_ext(3)
106 logical :: use_gi_ked
108 integer :: xc_density_correction
109 logical :: xcd_optimize_cutoff
110 real(real64) :: xcd_ncutoff
111 logical :: xcd_minimum
112 logical :: xcd_normalize
115 type(internal_quantities_t) :: quantities
118 real(real64),
parameter :: tiny = 1.0e-12_real64
120 integer,
parameter :: &
128 type(xc_t),
intent(in) :: xcs
129 integer,
optional,
intent(in) :: iunit
130 type(namespace_t),
optional,
intent(in) :: namespace
136 write(
message(1),
'(a)')
"Exchange-correlation:"
143 if (abs(xcs%cam_alpha + xcs%cam_beta) >
m_epsilon)
then
145 write(
message(2),
'(a,f8.5)')
"Exact exchange mixing = ", xcs%cam_alpha
146 write(
message(3),
'(a,f8.5)')
"Exact exchange for short-range beta = ", xcs%cam_beta
147 write(
message(4),
'(a,f8.5)')
"Exact exchange range-separate omega = ", xcs%cam_omega
157 subroutine xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
158 type(xc_t),
intent(out) :: xcs
159 type(namespace_t),
intent(in) :: namespace
160 integer,
intent(in) :: ndim
161 integer,
intent(in) :: periodic_dim
162 real(real64),
intent(in) :: nel
163 integer,
intent(in) :: x_id
164 integer,
intent(in) :: c_id
165 integer,
intent(in) :: xk_id
166 integer,
intent(in) :: ck_id
167 logical,
intent(in) :: hartree_fock
168 integer,
intent(in) :: ispin
170 integer :: isp, xc_major, xc_minor, xc_micro
176 call xc_f03_version(xc_major, xc_minor, xc_micro)
180 xcs%kernel_family = 0
198 xcs%family = ior(xcs%family, xcs%functional(
func_x,1)%family)
199 xcs%family = ior(xcs%family, xcs%functional(
func_c,1)%family)
201 xcs%flags = ior(xcs%flags, xcs%functional(
func_x,1)%flags)
202 xcs%flags = ior(xcs%flags, xcs%functional(
func_c,1)%flags)
204 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_x,1)%family)
205 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_c,1)%family)
209 message(1) =
"Cannot perform a periodic calculation with a functional"
210 message(2) =
"that depends on the number of electrons."
219 ll = (hartree_fock) &
224 message(1) =
"You cannot use an exchange functional when performing"
225 message(2) =
"a Hartree-Fock calculation or using a hybrid functional."
229 if (periodic_dim == ndim)
then
230 call messages_experimental(
"Fock operator (Hartree-Fock, OEP, hybrids) in fully periodic systems", namespace=namespace)
237 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,1)%conf, xcs%cam_omega, &
238 xcs%cam_alpha, xcs%cam_beta)
239 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,2)%conf, xcs%cam_omega, &
240 xcs%cam_alpha, xcs%cam_beta)
244 xcs%cam_alpha =
m_one
249 xcs%functional(
func_x,1)%family = xc_family_oep
251 xcs%functional(
func_x,2)%family = xc_family_oep
253 if (.not. hartree_fock)
then
254 xcs%family = ior(xcs%family, xc_family_oep)
258 if (
in_family(xcs%family, [xc_family_lca]))
then
265 if (xcs%functional(
func_x, 1)%id == xc_mgga_x_tb09 .and. periodic_dim /= 3)
then
266 message(1) =
"mgga_x_tb09 functional can only be used for 3D periodic systems"
310 if (abs(xcs%kernel_lrc_alpha) >
m_epsilon)
then
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
405 do isp = 1,
size(xcs%cam_ext)
411 if( any(abs(xcs%cam_ext) >
m_epsilon) )
then
413 write(
message(2),
'(a,f8.5)')
"Info: Setting external cam_alpha = ", xcs%cam_ext(1)
414 write(
message(3),
'(a,f8.5)')
"Info: Setting external cam_beta = ", xcs%cam_ext(2)
415 write(
message(4),
'(a,f8.5)')
"Info: Setting external cam_omega = ", xcs%cam_ext(3)
427 type(
xc_t),
intent(inout) :: xcs
450 logical pure function xc_is_orbital_dependent(xcs)
451 type(
xc_t),
intent(in) :: xcs
462 integer,
intent(in) :: family
463 logical,
optional,
intent(in) :: only_collinear
465 if(optional_default(only_collinear, .false.))
then
467 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
470 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc, xc_family_nc_mgga])
480 integer,
intent(in) :: family
483 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
489 integer,
optional,
intent(in) :: family
490 logical,
optional,
intent(in) :: only_collinear
492 if(optional_default(only_collinear, .false.))
then
501 logical pure function family_is_mgga_with_exc(xcs)
502 type(
xc_t),
intent(in) :: xcs
508 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_mgga, xc_family_hyb_mgga, xc_family_nc_mgga]) &
509 .and. xc_functional_is_energy_functional(xcs%functional(ixc, 1)))
then
516 logical pure function family_is_hybrid(xcs)
517 type(
xc_t),
intent(in) :: xcs
523 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga]))
then
529 pure logical function in_family(family, xc_families)
530 integer,
intent(in) :: family
531 integer,
intent(in) :: xc_families(:)
533 in_family = bitand(family, sum(xc_families)) /= 0
539 real(real64),
intent(in) :: global(:,:)
540 real(real64),
intent(out) :: local(:,:)
541 integer,
intent(in) :: n_block
542 integer,
intent(in) :: nspin
543 integer,
intent(in) :: ip
552 local(is, ib) = global(ib + ip - 1, is)
561 real(real64),
intent(in) :: local(:,:)
562 real(real64),
intent(inout) :: global(:,:)
563 integer,
intent(in) :: n_block
564 integer,
intent(in) :: spin_channels
565 integer,
intent(in) :: ip
571 do is = 1, spin_channels
574 global(ib + ip - 1, is) = global(ib + ip - 1, is) + local(is, ib)
584 type(namespace_t),
intent(in) :: namespace
585 type(
xc_t),
intent(inout) :: xcs
594 select case(xcs%functional(func_c,1)%id)
595 case(xc_hyb_gga_xc_pbeh, xc_hyb_lda_xc_lda0)
599 call xc_f03_func_set_ext_params(xcs%functional(func_c,1)%conf,
parameters)
600 call xc_f03_func_set_ext_params(xcs%functional(func_c,2)%conf,
parameters)
602 write(message(1),
'(a,f6.3,a)')
'Info: Setting mixing parameter (' ,
parameters(1) ,
').'
603 call messages_info(1)
605 case(xc_hyb_gga_xc_cam_pbeh, xc_hyb_lda_xc_cam_lda0)
609 call xc_f03_hyb_cam_coef(xcs%functional(func_c,1)%conf, xcs%cam_omega, &
610 xcs%cam_alpha, xcs%cam_beta)
611 call xc_f03_hyb_cam_coef(xcs%functional(func_c,2)%conf, xcs%cam_omega, &
612 xcs%cam_alpha, xcs%cam_beta)
613 write(message(1),
'(a,f6.3,a)')
'Info: Setting alpha parameter (' , xcs%cam_alpha ,
').'
614 write(message(2),
'(a,f6.3,a)')
'Info: Setting beta parameter (' , xcs%cam_beta ,
').'
615 write(message(3),
'(a,f6.3,a)')
'Info: Setting omega parameter (' , xcs%cam_omega ,
').'
616 call messages_info(3)
628 type(
xc_t),
intent(in) :: xcs
629 type(namespace_t),
intent(in) :: namespace
632 .or. xc_functional_is_not_size_consistent(xcs%functional(func_c,1), namespace)
637 logical pure function xc_is_energy_functional(xcs)
638 type(
xc_t),
intent(in) :: xcs
640 .or. xc_functional_is_energy_functional(xcs%functional(func_c,1))
643#include "xc_vxc_inc.F90"
644#include "xc_fxc_inc.F90"
645#include "xc_kxc_inc.F90"
647#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
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)
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.
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_get_fxc(xcs, mesh, namespace, rho, ispin, fxc, zfxc)
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.
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.
pure logical function family_is_gga(family, only_collinear)
Is the xc function part of the GGA family.
subroutine set_hybrid_params(xcs, namespace)
Sets external parameters for some hybrid functionals.
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.