33 use,
intrinsic :: iso_fortran_env
76 real(real64),
pointer :: rho(:,:)
78 real(real64),
allocatable :: dens(:,:)
79 real(real64),
allocatable :: gdens(:,:,:)
80 real(real64),
allocatable :: ldens(:,:)
81 real(real64),
allocatable :: tau(:,:)
87 integer,
public :: family
88 integer,
public :: flags
89 integer,
public :: kernel_family
90 type(xc_functional_t),
public :: functional(2,2)
93 type(xc_functional_t),
public :: kernel(2,2)
94 real(real64),
public :: kernel_lrc_alpha
96 real(real64),
public :: cam_omega
97 real(real64),
public :: cam_alpha
98 real(real64),
public :: cam_beta
99 real(real64),
public :: cam_ext(3)
101 logical :: use_gi_ked
103 integer :: xc_density_correction
104 logical :: xcd_optimize_cutoff
105 real(real64) :: xcd_ncutoff
106 logical :: xcd_minimum
107 logical :: xcd_normalize
110 type(internal_quantities_t) :: quantities
113 real(real64),
parameter :: tiny = 1.0e-12_real64
115 integer,
parameter :: &
123 type(xc_t),
intent(in) :: xcs
124 integer,
optional,
intent(in) :: iunit
125 type(namespace_t),
optional,
intent(in) :: namespace
131 write(
message(1),
'(a)')
"Exchange-correlation:"
138 if (abs(xcs%cam_alpha + xcs%cam_beta) >
m_epsilon)
then
140 write(
message(2),
'(a,f8.5)')
"Exact exchange mixing = ", xcs%cam_alpha
141 write(
message(3),
'(a,f8.5)')
"Exact exchange for short-range beta = ", xcs%cam_beta
142 write(
message(4),
'(a,f8.5)')
"Exact exchange range-separate omega = ", xcs%cam_omega
152 subroutine xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
153 type(xc_t),
intent(out) :: xcs
154 type(namespace_t),
intent(in) :: namespace
155 integer,
intent(in) :: ndim
156 integer,
intent(in) :: periodic_dim
157 real(real64),
intent(in) :: nel
158 integer,
intent(in) :: x_id
159 integer,
intent(in) :: c_id
160 integer,
intent(in) :: xk_id
161 integer,
intent(in) :: ck_id
162 logical,
intent(in) :: hartree_fock
163 integer,
intent(in) :: ispin
165 integer :: isp, xc_major, xc_minor, xc_micro
171 call xc_f03_version(xc_major, xc_minor, xc_micro)
175 xcs%kernel_family = 0
191 xcs%family = ior(xcs%family, xcs%functional(
func_x,1)%family)
192 xcs%family = ior(xcs%family, xcs%functional(
func_c,1)%family)
194 xcs%flags = ior(xcs%flags, xcs%functional(
func_x,1)%flags)
195 xcs%flags = ior(xcs%flags, xcs%functional(
func_c,1)%flags)
197 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_x,1)%family)
198 xcs%kernel_family = ior(xcs%kernel_family, xcs%kernel(
func_c,1)%family)
205 ll = (hartree_fock) &
210 message(1) =
"You cannot use an exchange functional when performing"
211 message(2) =
"a Hartree-Fock calculation or using a hybrid functional."
215 if (periodic_dim == ndim)
then
216 call messages_experimental(
"Fock operator (Hartree-Fock, OEP, hybrids) in fully periodic systems", namespace=namespace)
223 call xc_f03_hyb_cam_coef(xcs%functional(
func_c,1)%conf, xcs%cam_omega, &
224 xcs%cam_alpha, xcs%cam_beta)
228 xcs%cam_alpha =
m_one
233 xcs%functional(
func_x,1)%family = xc_family_oep
235 if (.not. hartree_fock)
then
236 xcs%family = ior(xcs%family, xc_family_oep)
240 if (
in_family(xcs%family, [xc_family_lca]))
then
247 if (xcs%functional(
func_x, 1)%id == xc_mgga_x_tb09 .and. periodic_dim /= 3)
then
248 message(1) =
"mgga_x_tb09 functional can only be used for 3D periodic systems"
292 if (abs(xcs%kernel_lrc_alpha) >
m_epsilon)
then
308 call parse_variable(namespace,
'XCDensityCorrection', lr_none, xcs%xc_density_correction)
310 if (xcs%xc_density_correction /= lr_none)
then
328 call parse_variable(namespace,
'XCDensityCorrectionOptimize', .
true., xcs%xcd_optimize_cutoff)
361 call parse_variable(namespace,
'XCDensityCorrectionNormalize', .
true., xcs%xcd_normalize)
386 if(
parse_block(namespace,
'HybridCamParameters', blk) == 0)
then
387 do isp = 1,
size(xcs%cam_ext)
393 if( any(abs(xcs%cam_ext) >
m_epsilon) )
then
395 write(
message(2),
'(a,f8.5)')
"External cam_alpha = ", xcs%cam_ext(1)
396 write(
message(3),
'(a,f8.5)')
"External cam_beta = ", xcs%cam_ext(2)
397 write(
message(4),
'(a,f8.5)')
"External cam_omega = ", xcs%cam_ext(3)
409 type(
xc_t),
intent(inout) :: xcs
432 logical pure function xc_is_orbital_dependent(xcs)
433 type(
xc_t),
intent(in) :: xcs
444 integer,
intent(in) :: family
445 logical,
optional,
intent(in) :: only_collinear
447 if(optional_default(only_collinear, .false.))
then
449 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
452 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc, xc_family_nc_mgga])
461 integer,
intent(in) :: family
464 xc_family_mgga, xc_family_hyb_mgga, xc_family_libvdwxc])
470 integer,
optional,
intent(in) :: family
471 logical,
optional,
intent(in) :: only_collinear
473 if(optional_default(only_collinear, .false.))
then
482 logical pure function family_is_mgga_with_exc(xcs)
483 type(
xc_t),
intent(in) :: xcs
489 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_mgga, xc_family_hyb_mgga, xc_family_nc_mgga]) &
490 .and. (bitand(xcs%functional(ixc, 1)%flags, xc_flags_have_exc) /= 0 ))
then
497 logical pure function family_is_hybrid(xcs)
498 type(
xc_t),
intent(in) :: xcs
504 if (
in_family(xcs%functional(ixc, 1)%family, [xc_family_hyb_lda, xc_family_hyb_gga, xc_family_hyb_mgga]))
then
510 pure logical function in_family(family, xc_families)
511 integer,
intent(in) :: family
512 integer,
intent(in) :: xc_families(:)
514 in_family = bitand(family, sum(xc_families)) /= 0
520 real(real64),
intent(in) :: global(:,:)
521 real(real64),
intent(out) :: local(:,:)
522 integer,
intent(in) :: n_block
523 integer,
intent(in) :: nspin
524 integer,
intent(in) :: ip
533 local(is, ib) = global(ib + ip - 1, is)
542 real(real64),
intent(in) :: local(:,:)
543 real(real64),
intent(inout) :: global(:,:)
544 integer,
intent(in) :: n_block
545 integer,
intent(in) :: spin_channels
546 integer,
intent(in) :: ip
552 do is = 1, spin_channels
555 global(ib + ip - 1, is) = global(ib + ip - 1, is) + local(is, ib)
564 type(namespace_t),
intent(in) :: namespace
566 real(real64) :: parameters(3)
568 parameters = xcs%cam_ext
570 select case(xcs%functional(func_c,1)%id)
571 case(xc_hyb_gga_xc_pbeh)
573 if(parameters(1) < m_zero) parameters(1) = 0.25_real64
575 call xc_f03_func_set_ext_params(xcs%functional(func_c,1)%conf, parameters)
576 xcs%cam_alpha = parameters(1)
578 write(message(1),
'(a,f6.3,a)')
'Info: Setting PBEH mixing parameter (' , parameters(1) ,
').'
579 call messages_info(1)
581 case(xc_hyb_gga_xc_cam_pbeh)
582 call xc_f03_func_set_ext_params(xcs%functional(func_c,1)%conf, parameters)
583 xcs%cam_alpha = parameters(1)
584 xcs%cam_beta = parameters(2)
585 xcs%cam_omega = parameters(3)
587 call xc_f03_hyb_cam_coef(xcs%functional(func_c,1)%conf, xcs%cam_omega, &
588 xcs%cam_alpha, xcs%cam_beta)
589 write(message(1),
'(a,f6.3,a)')
'Info: Setting alpha (CAM_PBE) parameter (' , xcs%cam_alpha ,
').'
590 write(message(2),
'(a,f6.3,a)')
'Info: Setting beta (CAM_PBE) parameter (' , xcs%cam_beta ,
').'
591 write(message(3),
'(a,f6.3,a)')
'Info: Setting omega (CAM_PBE) parameter (' , xcs%cam_omega ,
').'
592 call messages_info(3)
594 case(xc_hyb_lda_xc_cam_lda0)
595 call xc_f03_func_set_ext_params(xcs%functional(func_c,1)%conf, parameters)
596 xcs%cam_alpha = parameters(1)
597 xcs%cam_beta = parameters(2)
598 xcs%cam_omega = parameters(3)
600 call xc_f03_hyb_cam_coef(xcs%functional(func_c,1)%conf, xcs%cam_omega, &
601 xcs%cam_alpha, xcs%cam_beta)
602 write(message(1),
'(a,f6.3,a)')
'Info: Setting alpha (CAM_LDA) parameter (' , xcs%cam_alpha ,
').'
603 write(message(2),
'(a,f6.3,a)')
'Info: Setting beta (CAM_LDA) parameter (' , xcs%cam_beta ,
').'
604 write(message(3),
'(a,f6.3,a)')
'Info: Setting omega (CAM_LDA) parameter (' , xcs%cam_omega ,
').'
605 call messages_info(3)
607 case(xc_hyb_lda_xc_lda0)
609 if(parameters(1) < m_zero) parameters(1) = 0.25_real64
611 call xc_f03_func_set_ext_params(xcs%functional(func_c,1)%conf, parameters)
612 xcs%cam_alpha = parameters(1)
614 write(message(1),
'(a,f6.3,a)')
'Info: Setting LDA0 mixing parameter (' , parameters(1) ,
').'
615 call messages_info(1)
623#include "xc_vxc_inc.F90"
624#include "xc_fxc_inc.F90"
625#include "xc_kxc_inc.F90"
627#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)
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)
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.
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.