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.