36#include "functionals_list.F90" 
   49  integer, 
public, 
parameter ::   &
 
   50    XC_OEP_X = 901,               &  !< Exact exchange
 
   70  integer, 
public, 
parameter :: &
 
   71    XC_FAMILY_KS_INVERSION = 1024, &
 
   83    integer         :: spin_channels = 0
 
   86    type(xc_f03_func_t)               :: conf
 
   87    type(xc_f03_func_info_t), 
private :: info
 
   88    type(libvdwxc_t)                  :: libvdwxc
 
   91  integer, 
public, 
parameter :: LIBXC_C_INDEX = 1000
 
   97    type(xc_functional_t), 
intent(inout) :: functl
 
   98    type(namespace_t),     
intent(in)    :: namespace
 
   99    integer,               
intent(in)    :: id
 
  100    integer,               
intent(in)    :: ndim
 
  101    real(real64),          
intent(in)    :: nel
 
  102    integer,               
intent(in)    :: spin_channels
 
  104    integer :: interact_1d
 
  105    real(real64)   :: alpha, parameters(2)
 
  112    functl%spin_channels = spin_channels
 
  114    if (functl%id == 0) 
then 
  115      functl%family = xc_family_none
 
  118      functl%family = xc_f03_family_from_id(functl%id)
 
  121      if (functl%family == xc_family_unknown) 
then 
  123        select case (functl%id)
 
  125          functl%family = xc_family_oep
 
  128          functl%family = xc_family_lda
 
  131          functl%family = xc_family_ks_inversion
 
  135          functl%family = xc_family_lda 
 
  145          functl%family = xc_family_hyb_gga
 
  157    if (functl%family == xc_family_oep) 
then 
  158      functl%type = xc_exchange
 
  160    else if (functl%family == xc_family_ks_inversion .or. functl%family == 
xc_family_rdmft) 
then 
  161      functl%type = xc_exchange_correlation
 
  164      call xc_f03_func_init(functl%conf, xc_lda_c_pw, spin_channels)
 
  165      functl%info = xc_f03_func_get_info(functl%conf)
 
  166      functl%type = xc_f03_func_info_get_kind(functl%info)
 
  167      functl%flags = xc_f03_func_info_get_flags(functl%info)
 
  172      functl%type = xc_exchange_correlation
 
  175      functl%type = xc_correlation
 
  176      functl%flags = xc_flags_have_exc + xc_flags_have_vxc
 
  179      functl%type = xc_exchange
 
  180      functl%flags = xc_flags_have_vxc + xc_flags_have_exc
 
  183      functl%type = xc_correlation
 
  184      functl%flags = xc_flags_have_vxc + xc_flags_have_exc
 
  186    else if (functl%family == xc_family_none) 
then 
  194      select case (functl%id)
 
  196        call xc_f03_func_init(functl%conf, xc_hyb_gga_xc_hse06, spin_channels)
 
  199        call xc_f03_func_init(functl%conf, xc_hyb_gga_xc_pbeh, spin_channels)
 
  202        call xc_f03_func_init(functl%conf, functl%id, spin_channels)
 
  204      functl%info     = xc_f03_func_get_info(functl%conf)
 
  205      functl%type     = xc_f03_func_info_get_kind(functl%info)
 
  206      functl%flags    = xc_f03_func_info_get_flags(functl%info)
 
  209      if (
bitand(functl%flags, xc_flags_have_exc) == 0) 
then 
  210        message(1) = 
'Specified functional does not have total energy available.' 
  211        message(2) = 
'Corresponding component of energy will just be left as zero.' 
  215      if (
bitand(functl%flags, xc_flags_have_vxc) == 0) 
then 
  216        message(1) = 
'Specified functional does not have XC potential available.' 
  217        message(2) = 
'Cannot run calculations. Choose another XCFunctional.' 
  221      ok = 
bitand(functl%flags, xc_flags_1d) /= 0
 
  222      if ((ndim /= 1) .and. ok) 
then 
  223        message(1) = 
'Specified functional is only allowed in 1D.' 
  226      if (ndim == 1 .and. (.not. ok)) 
then 
  227        message(1) = 
'Cannot use the specified functionals in 1D.' 
  231      ok = 
bitand(functl%flags, xc_flags_2d) /= 0
 
  232      if ((ndim /= 2) .and. ok) 
then 
  233        message(1) = 
'Specified functional is only allowed in 2D.' 
  236      if (ndim == 2 .and. (.not. ok)) 
then 
  237        message(1) = 
'Cannot use the specified functionals in 2D.' 
  241      ok = 
bitand(functl%flags, xc_flags_3d) /= 0
 
  242      if ((ndim /= 3) .and. ok) 
then 
  243        message(1) = 
'Specified functional is only allowed in 3D.' 
  246      if (ndim == 3 .and. (.not. ok)) 
then 
  247        message(1) = 
'Cannot use the specified functionals in 3D.' 
  257    select case (functl%id)
 
  259    case (xc_lda_c_xalpha)
 
  271      call xc_f03_func_set_ext_params(functl%conf, parameters(1))
 
  274    case (xc_lda_x_1d_soft, xc_lda_c_1d_csc)
 
  289      call parse_variable(namespace, 
'Interaction1D', option__interaction1d__interaction_soft_coulomb, interact_1d)
 
  301      parameters(1) = real(interact_1d, real64)
 
  302      parameters(2) = alpha
 
  303      call xc_f03_func_set_ext_params(functl%conf, parameters(1))
 
  305    case (xc_lda_c_2d_prm)
 
  307      call xc_f03_func_set_ext_params(functl%conf, parameters(1))
 
  325    type(xc_functional_t), 
intent(inout) :: functl
 
  329    if (functl%family /= xc_family_none .and. functl%family /= xc_family_oep .and. &
 
  330      functl%family /= xc_family_ks_inversion .and. functl%id /= 
xc_half_hartree &
 
  333      call xc_f03_func_end(functl%conf)
 
  346    type(xc_functional_t),       
intent(in) :: functl
 
  347    integer,           
optional, 
intent(in) :: iunit
 
  348    type(namespace_t), 
optional, 
intent(in) :: namespace
 
  350    character(len=120) :: family
 
  355    if (functl%family == xc_family_oep) 
then 
  358      select case (functl%id)
 
  360        write(
message(1), 
'(2x,a)') 
'Exchange' 
  361        write(
message(2), 
'(4x,a)') 
'Exact exchange' 
  365        write(
message(1), 
'(2x,a)') 
'Exchange' 
  366        write(
message(2), 
'(4x,a)') 
'Slater exchange' 
  370        write(
message(1), 
'(2x,a)') 
'Exchange' 
  371        write(
message(2), 
'(4x,a)') 
'Force-based local exchange' 
  372        write(
message(3), 
'(4x,a)') 
'[1] Tancogne-Dejean et al., J. Chem. Phys. 160, 024103 (2024)' 
  376        write(
message(1), 
'(2x,a)') 
'Exchange' 
  377        write(
message(2), 
'(4x,a)') 
'Force-based local exchange - Sturm-Liouville' 
  381        write(
message(1), 
'(2x,a)') 
'Correlation' 
  382        write(
message(2), 
'(4x,a)') 
'Force-based local-density correlation - Sturm-Liouville' 
  389    else if (functl%family == xc_family_ks_inversion) 
then 
  391      select case (functl%id)
 
  393        write(
message(1), 
'(2x,a)') 
'Exchange-Correlation:' 
  394        write(
message(2), 
'(4x,a)') 
'  KS Inversion' 
  402      write(
message(1), 
'(2x,a)') 
'Exchange' 
  403      write(
message(2), 
'(4x,a)') 
'Noncollinear Becke-Roussel (MGGA)' 
  404      write(
message(3), 
'(4x,a)') 
'[1] N. Tancogne-Dejean, A. Rubio, and C. A. Ullrich, Phys. Rev. B 107, 165111 (2023)' 
  408      write(
message(1), 
'(2x,a)') 
'Exchange' 
  409      write(
message(2), 
'(4x,a)') 
'Noncollinear Becke-Roussel, gamma = 1.0 (MGGA)' 
  410      write(
message(3), 
'(4x,a)') 
'[1] N. Tancogne-Dejean, A. Rubio, and C. A. Ullrich, Phys. Rev. B 107, 165111 (2023)' 
  414      write(
message(1), 
'(2x,a)') 
'Correlation' 
  415      write(
message(2), 
'(4x,a)') 
'Noncollinear Colle-Salvetti (MGGA)' 
  416      write(
message(3), 
'(4x,a)') 
'[1] N. Tancogne-Dejean, A. Rubio, and C. A. Ullrich, Phys. Rev. B 107, 165111 (2023)' 
  421      write(
message(1), 
'(2x,a)') 
'Exchange-Correlation:' 
  422      write(
message(2), 
'(4x,a)') 
'Half-Hartree two-electron exchange' 
  426      write(
message(1), 
'(2x,a)') 
'Correlation' 
  427      write(
message(2), 
'(4x,a)') 
'Force-based LDA correlation' 
  430    else if (functl%family /= xc_family_none) 
then  
  431      select case (functl%type)
 
  433        write(
message(1), 
'(2x,a)') 
'Exchange' 
  434      case (xc_correlation)
 
  435        write(
message(1), 
'(2x,a)') 
'Correlation' 
  436      case (xc_exchange_correlation)
 
  437        write(
message(1), 
'(2x,a)') 
'Exchange-correlation' 
  441        write(
message(1), 
'(a,i6,a,i6)') 
"Unknown functional type ", functl%type, 
' for functional ', functl%id
 
  445      select case (functl%family)
 
  447        write(family,
'(a)') 
"LDA" 
  449        write(family,
'(a)') 
"GGA" 
  450      case (xc_family_mgga)
 
  451        write(family,
'(a)') 
"MGGA" 
  452      case (xc_family_hyb_lda)
 
  453        write(family,
'(a)') 
"Hybrid LDA" 
  454      case (xc_family_hyb_gga)
 
  455        write(family,
'(a)') 
"Hybrid GGA" 
  456      case (xc_family_hyb_mgga)
 
  457        write(family,
'(a)') 
"Hybrid MGGA" 
  459      write(
message(2), 
'(4x,4a)') trim(xc_f03_func_info_get_name(functl%info)), 
' (', trim(family), 
')' 
  464        write(
message(1), 
'(4x,a,i1,2a)') 
'[', ii + 1, 
'] ', &
 
  465          trim(xc_f03_func_reference_get_ref(xc_f03_func_info_get_references(functl%info, ii)))
 
  476    integer, 
intent(in) :: dim
 
  477    integer, 
intent(in) :: pseudo_x_functional, pseudo_c_functional
 
  484      default = pseudo_x_functional
 
  490        default = xc_lda_x_2d
 
  492        default = xc_lda_x_1d_soft
 
  499      default = default + libxc_c_index*pseudo_c_functional
 
  503        default = default + libxc_c_index * xc_lda_c_pz_mod
 
  505        default = default + libxc_c_index * xc_lda_c_2d_amgb
 
  507        default = default + libxc_c_index * xc_lda_c_1d_csc
 
real(real64), parameter, public m_one
 
subroutine, public libvdwxc_end(this)
 
subroutine, public libvdwxc_init(libvdwxc, namespace, functional)
 
subroutine, public libvdwxc_write_info(this, iunit, namespace)
 
subroutine, public messages_not_implemented(feature, namespace)
 
subroutine, public messages_warning(no_lines, all_nodes, 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_input_error(namespace, var, details, row, column)
 
subroutine, public messages_experimental(name, namespace)
 
logical function, public parse_is_defined(namespace, name)
 
integer, parameter, public pseudo_correlation_any
 
integer, parameter, public pseudo_exchange_any
 
integer, parameter, public xc_ks_inversion
inversion of Kohn-Sham potential
 
integer, parameter, public xc_vdw_c_vdwdf
vdw-df correlation from libvdwxc
 
integer, parameter, public xc_family_rdmft
 
subroutine, public xc_functional_write_info(functl, iunit, namespace)
 
integer function, public xc_get_default_functional(dim, pseudo_x_functional, pseudo_c_functional)
Returns the default functional given the one parsed from the pseudopotentials and the space dimension...
 
integer, parameter, public xc_mgga_c_nc_cs
Noncollinear version of the Colle-Salvetti correlation functional.
 
integer, parameter, public xc_hyb_gga_xc_mvorb_pbeh
Density-based mixing parameter of PBE0.
 
integer, parameter, public xc_mgga_x_nc_br
Noncollinear version of the Becke-Roussel functional.
 
integer, parameter, public xc_vdw_c_vdwdfcx
vdw-df-cx correlation from libvdwxc
 
subroutine, public xc_functional_init(functl, namespace, id, ndim, nel, spin_channels)
 
integer, parameter, public xc_lda_c_fbe
LDA correlation based ib the force-balance equation.
 
integer, parameter, public xc_family_nc_mgga
 
integer, parameter, public xc_half_hartree
half-Hartree exchange for two electrons (supports complex scaling)
 
integer, parameter, public xc_vdw_c_vdwdf2
vdw-df2 correlation from libvdwxc
 
integer, parameter, public xc_family_libvdwxc
 
integer, parameter, public xc_hyb_gga_xc_mvorb_hse06
Density-based mixing parameter of HSE06.
 
subroutine, public xc_functional_end(functl)
 
integer, parameter, public xc_lda_c_fbe_sl
LDA correlation based ib the force-balance equation - Sturm-Liouville version.
 
integer, parameter, public xc_rdmft_xc_m
RDMFT Mueller functional.
 
integer, parameter, public xc_mgga_x_nc_br_1
Noncollinear version of the Becke-Roussel functional, gamma=1.
 
integer, parameter, public xc_family_nc_lda
 
integer, parameter, public xc_oep_x_fbe_sl
Exchange approximation based on the force balance equation - Sturn-Liouville version.
 
integer, parameter, public xc_oep_x_fbe
Exchange approximation based on the force balance equation.
 
integer, parameter, public xc_oep_x_slater
Slater approximation to the exact exchange.