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.