33 use,
intrinsic :: iso_fortran_env
78 real(real64),
pointer :: rho(:,:)
80 real(real64),
allocatable :: dens(:,:)
81 real(real64),
allocatable :: gdens(:,:,:)
82 real(real64),
allocatable :: ldens(:,:)
83 real(real64),
allocatable :: tau(:,:)
89 integer,
public :: family
90 integer,
public :: flags
91 integer,
public :: kernel_family
92 type(xc_functional_t),
public :: functional(2,2)
95 type(xc_functional_t),
public :: kernel(2,2)
96 real(real64),
public :: kernel_lrc_alpha
98 real(real64),
public :: cam_omega
99 real(real64),
public :: cam_alpha
100 real(real64),
public :: cam_beta
101 real(real64),
public :: cam_ext(3)
103 logical :: use_gi_ked
105 integer :: xc_density_correction
106 logical :: xcd_optimize_cutoff
107 real(real64) :: xcd_ncutoff
108 logical :: xcd_minimum
109 logical :: xcd_normalize
112 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
173 call xc_f03_version(xc_major, xc_minor, xc_micro)
177 xcs%kernel_family = 0
195 xcs%family = ior(xcs%family, xcs%functional(
func_x,1)%family)
196 xcs%family = ior(xcs%family, xcs%functional(
func_c,1)%family)
198 xcs%flags = ior(xcs%flags, xcs%functional(
func_x,1)%flags)
199 xcs%flags = ior(xcs%flags, xcs%functional(
func_c,1)%flags)
201 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_x,1)%family)
202 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_c,1)%family)
206 message(1) =
"Cannot perform a periodic calculation with a functional"
207 message(2) =
"that depends on the number of electrons."
216 ll = (hartree_fock) &
221 message(1) =
"You cannot use an exchange functional when performing"
222 message(2) =
"a Hartree-Fock calculation or using a hybrid functional."
226 if (periodic_dim == ndim)
then
227 call messages_experimental(
"Fock operator (Hartree-Fock, OEP, hybrids) in fully periodic systems", namespace=namespace)
234 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,1)%conf, xcs%cam_omega, &
235 xcs%cam_alpha, xcs%cam_beta)
236 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,2)%conf, xcs%cam_omega, &
237 xcs%cam_alpha, xcs%cam_beta)
241 xcs%cam_alpha =
m_one
246 xcs%functional(
func_x,1)%family = xc_family_oep
248 xcs%functional(
func_x,2)%family = xc_family_oep
250 if (.not. hartree_fock)
then
251 xcs%family = ior(xcs%family, xc_family_oep)
255 if (
in_family(xcs%family, [xc_family_lca]))
then
262 if (xcs%functional(
func_x, 1)%id == xc_mgga_x_tb09 .and. periodic_dim /= 3)
then
263 message(1) =
"mgga_x_tb09 functional can only be used for 3D periodic systems"
307 if (abs(xcs%kernel_lrc_alpha) >
m_epsilon)
then
323 call parse_variable(namespace,
'XCDensityCorrection', lr_none, xcs%xc_density_correction)
325 if (xcs%xc_density_correction /= lr_none)
then
343 call parse_variable(namespace,
'XCDensityCorrectionOptimize', .
true., xcs%xcd_optimize_cutoff)
376 call parse_variable(namespace,
'XCDensityCorrectionNormalize', .
true., xcs%xcd_normalize)
401 if(
parse_block(namespace,
'HybridCamParameters', blk) == 0)
then
402 do isp = 1,
size(xcs%cam_ext)
408 if( any(abs(xcs%cam_ext) >
m_epsilon) )
then
410 write(
message(2),
'(a,f8.5)')
"Info: Setting external cam_alpha = ", xcs%cam_ext(1)
411 write(
message(3),
'(a,f8.5)')
"Info: Setting external cam_beta = ", xcs%cam_ext(2)
412 write(
message(4),
'(a,f8.5)')
"Info: Setting external cam_omega = ", xcs%cam_ext(3)
424 type(
xc_t),
intent(inout) :: xcs
447 logical pure function xc_is_orbital_dependent(xcs)
448 type(
xc_t),
intent(in) :: xcs
459 integer,
intent(in) :: family
460 logical,
optional,
intent(in) :: only_collinear
462 if(optional_default(only_collinear, .false.))
then
464 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
467 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc, xc_family_nc_mgga])
477 integer,
intent(in) :: family
480 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
486 integer,
optional,
intent(in) :: family
487 logical,
optional,
intent(in) :: only_collinear
489 if(optional_default(only_collinear, .false.))
then
498 logical pure function family_is_mgga_with_exc(xcs)
499 type(
xc_t),
intent(in) :: xcs
505 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_mgga, xc_family_hyb_mgga, xc_family_nc_mgga]) &
506 .and. xc_functional_is_energy_functional(xcs%functional(ixc, 1)))
then
513 logical pure function family_is_hybrid(xcs)
514 type(
xc_t),
intent(in) :: xcs
520 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga]))
then
526 pure logical function in_family(family, xc_families)
527 integer,
intent(in) :: family
528 integer,
intent(in) :: xc_families(:)
530 in_family = bitand(family, sum(xc_families)) /= 0
536 real(real64),
intent(in) :: global(:,:)
537 real(real64),
intent(out) :: local(:,:)
538 integer,
intent(in) :: n_block
539 integer,
intent(in) :: nspin
540 integer,
intent(in) :: ip
549 local(is, ib) = global(ib + ip - 1, is)
558 real(real64),
intent(in) :: local(:,:)
559 real(real64),
intent(inout) :: global(:,:)
560 integer,
intent(in) :: n_block
561 integer,
intent(in) :: spin_channels
562 integer,
intent(in) :: ip
568 do is = 1, spin_channels
571 global(ib + ip - 1, is) = global(ib + ip - 1, is) + local(is, ib)
581 type(namespace_t),
intent(in) :: namespace
582 type(
xc_t),
intent(inout) :: xcs
584 real(real64) :: parameters(3)
588 parameters = xcs%cam_ext
589 xcs%cam_alpha = parameters(1)
591 select case(xcs%functional(func_c,1)%id)
592 case(xc_hyb_gga_xc_pbeh, xc_hyb_lda_xc_lda0)
594 if(parameters(1) < m_zero) parameters(1) = 0.25_real64
596 call xc_f03_func_set_ext_params(xcs%functional(func_c,1)%conf, parameters)
597 call xc_f03_func_set_ext_params(xcs%functional(func_c,2)%conf, parameters)
599 write(message(1),
'(a,f6.3,a)')
'Info: Setting mixing parameter (' , parameters(1) ,
').'
600 call messages_info(1)
602 case(xc_hyb_gga_xc_cam_pbeh, xc_hyb_lda_xc_cam_lda0)
603 xcs%cam_beta = parameters(2)
604 xcs%cam_omega = parameters(3)
606 call xc_f03_hyb_cam_coef(xcs%functional(func_c,1)%conf, xcs%cam_omega, &
607 xcs%cam_alpha, xcs%cam_beta)
608 call xc_f03_hyb_cam_coef(xcs%functional(func_c,2)%conf, xcs%cam_omega, &
609 xcs%cam_alpha, xcs%cam_beta)
610 write(message(1),
'(a,f6.3,a)')
'Info: Setting alpha parameter (' , xcs%cam_alpha ,
').'
611 write(message(2),
'(a,f6.3,a)')
'Info: Setting beta parameter (' , xcs%cam_beta ,
').'
612 write(message(3),
'(a,f6.3,a)')
'Info: Setting omega parameter (' , xcs%cam_omega ,
').'
613 call messages_info(3)
625 type(
xc_t),
intent(in) :: xcs
626 type(namespace_t),
intent(in) :: namespace
629 .or. xc_functional_is_not_size_consistent(xcs%functional(func_c,1), namespace)
634 logical pure function xc_is_energy_functional(xcs)
635 type(
xc_t),
intent(in) :: xcs
637 .or. xc_functional_is_energy_functional(xcs%functional(func_c,1))
640#include "xc_vxc_inc.F90"
641#include "xc_fxc_inc.F90"
642#include "xc_kxc_inc.F90"
644#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)
subroutine, public messages_info(no_lines, iunit, verbose_limit, stress, all_nodes, namespace)
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)
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.