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,
public :: use_gi_ked
106 integer,
public :: xc_density_correction
107 logical,
public :: xcd_optimize_cutoff
108 real(real64),
public :: xcd_ncutoff
109 logical,
public :: xcd_minimum
110 logical,
public :: xcd_normalize
111 logical,
public :: parallel
113 type(internal_quantities_t),
public :: quantities
121 real(real64),
public,
parameter :: xc_tiny = 1.0e-12_real64
123 integer,
public,
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
496 integer,
intent(in) :: family
503 logical pure function family_is_mgga_with_exc(xcs)
504 type(
xc_t),
intent(in) :: xcs
510 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_mgga, xc_family_hyb_mgga, xc_family_nc_mgga]) &
511 .and. xc_functional_is_energy_functional(xcs%functional(ixc, 1)))
then
518 logical pure function family_is_hybrid(xcs)
519 type(
xc_t),
intent(in) :: xcs
525 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga]))
then
531 pure logical function in_family(family, xc_families)
532 integer,
intent(in) :: family
533 integer,
intent(in) :: xc_families(:)
535 in_family = bitand(family, sum(xc_families)) /= 0
540 class(
xc_t),
intent(in) :: xc
541 integer,
intent(in) :: theory_level
543 integer,
parameter :: exchange_theory_level(3) = [hartree, hartree_fock, rdmft]
548 (theory_level == generalized_kohn_sham_dft .and.
family_is_hybrid(xc)) .or. &
549 (xc%functional(func_x, 1)%id == xc_oep_x_slater) .or. &
550 (bitand(xc%family, xc_family_oep) /= 0)
559 type(
xc_t),
intent(inout) :: xcs
560 type(namespace_t),
intent(in) :: namespace
561 type(xc_cam_t),
intent(in) :: cam_ext
563 real(real64),
parameter :: default_alpha_pbe0 = 0.25_real64
572 select case(xcs%functional(func_c, 1)%id)
574 case(xc_hyb_gga_xc_pbeh, xc_hyb_lda_xc_lda0)
576 call xc_f03_func_set_ext_params(xcs%functional(func_c, 1)%conf,
parameters)
577 call xc_f03_func_set_ext_params(xcs%functional(func_c, 2)%conf,
parameters)
578 write(message(1),
'(a,f6.3,a)')
'Info: Setting mixing parameter (' ,
parameters(1) ,
').'
579 call messages_info(1)
581 case(xc_hyb_gga_xc_cam_pbeh, xc_hyb_lda_xc_cam_lda0)
585 call xc_f03_hyb_cam_coef(xcs%functional(func_c,1)%conf, xcs%cam%omega, &
586 xcs%cam%alpha, xcs%cam%beta)
587 call xc_f03_hyb_cam_coef(xcs%functional(func_c,2)%conf, xcs%cam%omega, &
588 xcs%cam%alpha, xcs%cam%beta)
589 call xcs%cam%print(namespace, msg=
"Setting CAM parameters:")
602 type(
xc_t),
intent(in) :: xcs
603 type(namespace_t),
intent(in) :: namespace
606 .or. xc_functional_is_not_size_consistent(xcs%functional(func_c,1), namespace)
612 type(
xc_t),
intent(in) :: xcs
614 .or. xc_functional_is_energy_functional(xcs%functional(func_c,1))
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, 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.
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.
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...