38 use,
intrinsic :: iso_fortran_env
106 logical :: calculating
107 logical :: time_present
109 real(real64),
allocatable :: density(:, :)
110 logical :: total_density_alloc
111 real(real64),
pointer,
contiguous :: total_density(:)
112 type(energy_t),
allocatable :: energy
114 type(states_elec_t),
pointer :: hf_st
119 real(real64),
allocatable :: vxc(:, :)
120 real(real64),
allocatable :: vtau(:, :)
121 real(real64),
allocatable :: axc(:, :, :)
122 real(real64),
allocatable :: a_ind(:, :)
123 real(real64),
allocatable :: b_ind(:, :)
124 logical :: calc_energy
129 integer,
public :: theory_level = -1
130 logical,
public :: frozen_hxc = .false.
132 integer,
public :: xc_family = 0
133 integer,
public :: xc_flags = 0
134 type(xc_t),
public :: xc
135 type(xc_oep_t),
public :: oep
136 type(xc_ks_inversion_t),
public :: ks_inversion
137 type(xc_sic_t),
public :: sic
138 type(xc_vdw_t),
public :: vdw
139 type(grid_t),
pointer,
public :: gr
140 type(v_ks_calc_t) :: calc
141 logical :: calculate_current = .false.
142 type(current_t) :: current_calculator
143 logical :: include_td_field = .false.
145 real(real64),
public :: stress_xc_gga(3, 3)
146 type(v_ks_photon_t),
public :: v_ks_photons
152 subroutine v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
153 type(v_ks_t),
intent(inout) :: ks
154 type(namespace_t),
intent(in) :: namespace
155 type(grid_t),
target,
intent(inout) :: gr
156 type(states_elec_t),
intent(in) :: st
157 type(ions_t),
intent(inout) :: ions
158 type(multicomm_t),
intent(in) :: mc
159 class(space_t),
intent(in) :: space
160 type(kpoints_t),
intent(in) :: kpoints
162 integer :: x_id, c_id, xk_id, ck_id, default, val
163 logical :: parsed_theory_level, using_hartree_fock
164 integer :: pseudo_x_functional, pseudo_c_functional
207 ks%xc_family = xc_family_none
212 parsed_theory_level = .false.
233 call messages_write(
'Info: the XCFunctional has been selected to match the pseudopotentials', new_line = .
true.)
248 call messages_write(
'The XCFunctional that you selected does not match the one used', new_line = .
true.)
278 call ks%v_ks_photons%init(namespace)
286 using_hartree_fock = (ks%theory_level ==
hartree_fock) &
288 call xc_init(ks%xc, namespace, space%dim, space%periodic_dim, st%qtot, &
289 x_id, c_id, xk_id, ck_id,
hartree_fock = using_hartree_fock, ispin=st%d%ispin)
291 ks%xc_family = ks%xc%family
292 ks%xc_flags = ks%xc%flags
294 if (.not. parsed_theory_level)
then
303 call parse_variable(namespace,
'TheoryLevel', default, ks%theory_level)
315 ks%xc_family = ior(ks%xc_family, xc_family_oep)
325 ks%sic%amaldi_factor =
m_one
327 select case (ks%theory_level)
332 if (space%periodic_dim == space%dim)
then
335 if (kpoints%full%npoints > 1)
then
340 if (kpoints%full%npoints > 1)
then
355 if (
bitand(ks%xc_family, xc_family_lda + xc_family_gga) /= 0)
then
356 call xc_sic_init(ks%sic, namespace, gr, st, mc, space)
359 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
360 select case (ks%xc%functional(
func_x,1)%id)
362 if (kpoints%reduced%npoints > 1 .and. st%d%ispin ==
spinors)
then
365 if (kpoints%use_symmetries)
then
370 if (kpoints%reduced%npoints > 1)
then
375 if((.not. ks%v_ks_photons%active()) .or. (ks%v_ks_photons%functional() /= 0))
then
376 if(oep_type == -1)
then
379 call xc_oep_init(ks%oep, namespace, gr, st, mc, space, oep_type)
393 message(1) =
"SICCorrection can only be used with Kohn-Sham DFT"
397 if (st%d%ispin ==
spinors)
then
398 if (
bitand(ks%xc_family, xc_family_mgga + xc_family_hyb_mgga) /= 0)
then
403 ks%frozen_hxc = .false.
408 ks%calc%calculating = .false.
413 call ks%vdw%init(namespace, space, gr, ks%xc, ions, x_id, c_id)
414 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level ==
rdmft)
then
415 message(1) =
"VDWCorrection and RDMFT are not compatible"
418 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level ==
independent_particles)
then
419 message(1) =
"VDWCorrection and independent particles are not compatible"
423 call ks%v_ks_photons%init_xc(namespace, space, gr, st)
431 integer,
intent(out) :: x_functional
432 integer,
intent(out) :: c_functional
434 integer :: xf, cf, ispecies
435 logical :: warned_inconsistent
440 warned_inconsistent = .false.
441 do ispecies = 1, ions%nspecies
442 select type(spec=>ions%species(ispecies)%s)
444 xf = spec%x_functional()
445 cf = spec%c_functional()
448 call messages_write(
"Unknown XC functional for species '"//trim(ions%species(ispecies)%s%get_label())//
"'")
456 if (xf /= x_functional .and. .not. warned_inconsistent)
then
457 call messages_write(
'Inconsistent XC functional detected between species')
459 warned_inconsistent = .
true.
466 if (cf /= c_functional .and. .not. warned_inconsistent)
then
467 call messages_write(
'Inconsistent XC functional detected between species')
469 warned_inconsistent = .
true.
489 type(
v_ks_t),
intent(inout) :: ks
495 select case (ks%theory_level)
500 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
510 call ks%v_ks_photons%end()
519 type(
v_ks_t),
intent(in) :: ks
520 integer,
optional,
intent(in) :: iunit
521 type(
namespace_t),
optional,
intent(in) :: namespace
528 select case (ks%theory_level)
553 subroutine v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
556 type(
grid_t),
intent(in) :: gr
557 type(
ions_t),
intent(in) :: ions
560 type(
v_ks_t),
intent(inout) :: ks
562 logical,
optional,
intent(in) :: calc_eigenval
563 logical,
optional,
intent(in) :: calc_current
565 integer,
allocatable :: ind(:)
567 real(real64),
allocatable :: copy_occ(:)
568 logical :: calc_eigenval_
569 logical :: calc_current_
577 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
578 calc_eigenval = calc_eigenval_, calc_current = calc_current_)
580 if (st%restart_reorder_occs .and. .not. st%fromScratch)
then
581 message(1) =
"Reordering occupations for restart."
584 safe_allocate(ind(1:st%nst))
585 safe_allocate(copy_occ(1:st%nst))
588 call sort(st%eigenval(:, ik), ind)
589 copy_occ(1:st%nst) = st%occ(1:st%nst, ik)
591 st%occ(ist, ik) = copy_occ(ind(ist))
595 safe_deallocate_a(ind)
596 safe_deallocate_a(copy_occ)
606 subroutine v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
607 calc_eigenval, time, calc_energy, calc_current, force_semilocal)
608 type(
v_ks_t),
intent(inout) :: ks
615 logical,
optional,
intent(in) :: calc_eigenval
616 real(real64),
optional,
intent(in) :: time
617 logical,
optional,
intent(in) :: calc_energy
618 logical,
optional,
intent(in) :: calc_current
619 logical,
optional,
intent(in) :: force_semilocal
621 logical :: calc_current_
626 .and. (ks%calculate_current &
630 if (calc_current_)
then
635 call v_ks_calc_start(ks, namespace, space, hm, st, ions, hm%kpoints%latt, ext_partners, time, &
636 calc_energy, force_semilocal=force_semilocal)
638 ext_partners, force_semilocal=force_semilocal)
649 call lalg_axpy(ks%gr%np, st%d%nspin,
m_one, hm%magnetic_constrain%pot, hm%ks_pot%vhxc)
661 subroutine v_ks_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, &
662 calc_energy, force_semilocal)
663 type(
v_ks_t),
target,
intent(inout) :: ks
665 class(
space_t),
intent(in) :: space
668 type(
ions_t),
intent(in) :: ions
671 real(real64),
optional,
intent(in) :: time
672 logical,
optional,
intent(in) :: calc_energy
673 logical,
optional,
intent(in) :: force_semilocal
679 assert(.not. ks%calc%calculating)
680 ks%calc%calculating = .
true.
682 write(
message(1),
'(a)')
'Debug: Calculating Kohn-Sham potential.'
685 ks%calc%time_present =
present(time)
691 if (ks%frozen_hxc)
then
697 allocate(ks%calc%energy)
703 nullify(ks%calc%total_density)
713 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
call v_a_xc(hm, force_semilocal)
715 ks%calc%total_density_alloc = .false.
722 nullify(ks%calc%hf_st)
727 if (st%parallel_in_states)
then
729 call messages_write(
'State parallelization of Hartree-Fock exchange is not supported')
731 call messages_write(
'when running with GPUs. Please use domain parallelization')
733 call messages_write(
"or disable acceleration using 'DisableAccel = yes'.")
738 if (hm%exxop%useACE)
then
741 safe_allocate(ks%calc%hf_st)
750 if (hm%self_induced_magnetic)
then
751 safe_allocate(ks%calc%a_ind(1:ks%gr%np_part, 1:space%dim))
752 safe_allocate(ks%calc%b_ind(1:ks%gr%np_part, 1:space%dim))
753 call magnetic_induced(namespace, ks%gr, st, hm%psolver, hm%kpoints, ks%calc%a_ind, ks%calc%b_ind)
756 if ((ks%v_ks_photons%active()) .and. (ks%calc%time_present) .and. (ks%v_ks_photons%functional() == 0) )
then
757 call ks%v_ks_photons%mf_calc(ks%gr, st, ions, time)
775 safe_allocate(ks%calc%density(1:ks%gr%np, 1:st%d%nspin))
780 call lalg_scal(ks%gr%np, st%d%nspin, ks%sic%amaldi_factor, ks%calc%density)
792 if (
allocated(st%rho_core))
then
796 int(ks%gr%np, int64), st%rho_core)
798 if (
allocated(st%frozen_rho))
then
802 int(ks%gr%np, int64), int(st%d%nspin, int64), st%frozen_rho)
803 ks%xc%quantities%frozen_rho_np = ks%gr%np
806 ks%xc%quantities%amaldi_factor = ks%sic%amaldi_factor
810 nullify(ks%calc%total_density)
811 if (
allocated(st%rho_core) .or. hm%d%spin_channels > 1)
then
812 ks%calc%total_density_alloc = .
true.
814 safe_allocate(ks%calc%total_density(1:ks%gr%np))
817 ks%calc%total_density(ip) = sum(ks%calc%density(ip, 1:hm%d%spin_channels))
821 if (
allocated(st%rho_core))
then
822 call lalg_axpy(ks%gr%np, -ks%sic%amaldi_factor, st%rho_core, ks%calc%total_density)
825 ks%calc%total_density_alloc = .false.
826 ks%calc%total_density => ks%calc%density(:, 1)
833 subroutine v_a_xc(hm, force_semilocal)
835 logical,
optional,
intent(in) :: force_semilocal
840 ks%calc%energy%exchange =
m_zero
841 ks%calc%energy%correlation =
m_zero
842 ks%calc%energy%xc_j =
m_zero
843 ks%calc%energy%vdw =
m_zero
845 allocate(ks%calc%vxc(1:ks%gr%np, 1:st%d%nspin))
849 safe_allocate(ks%calc%vtau(1:ks%gr%np, 1:st%d%nspin))
854 if (ks%calc%calc_energy)
then
856 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
857 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
858 deltaxc = ks%calc%energy%delta_xc, vtau = ks%calc%vtau, force_orbitalfree=force_semilocal)
860 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
861 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
862 deltaxc = ks%calc%energy%delta_xc, stress_xc=ks%stress_xc_gga, force_orbitalfree=force_semilocal)
866 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
867 st%d%ispin, latt%rcell_volume, ks%calc%vxc, vtau = ks%calc%vtau, force_orbitalfree=force_semilocal)
869 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
870 st%d%ispin, latt%rcell_volume, ks%calc%vxc, stress_xc=ks%stress_xc_gga, force_orbitalfree=force_semilocal)
876 if (st%d%ispin /=
spinors)
then
877 message(1) =
"Noncollinear functionals can only be used with spinor wavefunctions."
882 message(1) =
"Cannot perform LCAO for noncollinear MGGAs."
883 message(2) =
"Please perform a LDA calculation first."
887 if (ks%calc%calc_energy)
then
889 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
890 vtau = ks%calc%vtau, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
892 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
893 ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
897 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, &
898 ks%calc%vxc, vtau = ks%calc%vtau)
900 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc)
905 call ks%vdw%calc(namespace, space, latt, ions%atom, ions%natoms, ions%pos, &
906 ks%gr, st, ks%calc%energy%vdw, ks%calc%vxc)
919 if (ks%calc%calc_energy)
then
920 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
921 ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
923 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
935 call x_slater_calc(namespace, ks%gr, space, hm%exxop, st, hm%kpoints, ks%calc%energy%exchange, &
938 call x_fbe_calc(ks%xc%functional(
func_x,1)%id, namespace, hm%psolver, ks%gr, st, space, &
939 ks%calc%energy%exchange, vxc = ks%calc%vxc)
943 call fbe_c_lda_sl(namespace, ks%gr, st, space, ks%calc%energy%correlation, vxc = ks%calc%vxc)
951 call xc_ks_inversion_calc(ks%ks_inversion, namespace, space, ks%gr, hm, ext_partners, st, vxc = ks%calc%vxc, &
956 if (ks%v_ks_photons%functional() /= 0)
then
957 call ks%v_ks_photons%add_px(namespace, ks%calc%total_density, ks%gr, space, hm%psolver, st, &
958 hm%d%spin_channels, ks%calc%vxc, ks%calc%energy%photon_exchange)
963 if (ks%calc%calc_energy)
then
976 subroutine v_ks_calc_finish(ks, hm, namespace, space, latt, st, ext_partners, force_semilocal)
977 type(
v_ks_t),
target,
intent(inout) :: ks
980 class(
space_t),
intent(in) :: space
984 logical,
optional,
intent(in) :: force_semilocal
989 real(real64) :: exx_energy
990 real(real64) :: factor
994 assert(ks%calc%calculating)
995 ks%calc%calculating = .false.
997 if (ks%frozen_hxc)
then
1003 safe_deallocate_a(hm%energy)
1004 call move_alloc(ks%calc%energy, hm%energy)
1006 if (hm%self_induced_magnetic)
then
1007 hm%a_ind(1:ks%gr%np, 1:space%dim) = ks%calc%a_ind(1:ks%gr%np, 1:space%dim)
1008 hm%b_ind(1:ks%gr%np, 1:space%dim) = ks%calc%b_ind(1:ks%gr%np, 1:space%dim)
1010 safe_deallocate_a(ks%calc%a_ind)
1011 safe_deallocate_a(ks%calc%b_ind)
1014 if (
allocated(hm%v_static))
then
1015 hm%energy%intnvstatic =
dmf_dotp(ks%gr, ks%calc%total_density, hm%v_static)
1017 hm%energy%intnvstatic =
m_zero
1023 hm%energy%intnvxc =
m_zero
1024 hm%energy%hartree =
m_zero
1025 hm%energy%exchange =
m_zero
1026 hm%energy%exchange_hf =
m_zero
1027 hm%energy%correlation =
m_zero
1030 hm%energy%hartree =
m_zero
1031 call v_ks_hartree(namespace, ks, space, hm, ext_partners)
1037 call dxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1038 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1040 call zxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1041 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1050 call dxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1051 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1053 call zxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1054 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1061 call ks%v_ks_photons%oep_calc(namespace, ks%xc, ks%gr, hm, st, space, ks%calc%vxc)
1065 if (ks%calc%calc_energy)
then
1067 hm%energy%intnvxc =
m_zero
1070 do ispin = 1, hm%d%nspin
1071 if (ispin <= 2)
then
1076 hm%energy%intnvxc = hm%energy%intnvxc + &
1077 factor*
dmf_dotp(ks%gr, st%rho(:, ispin), ks%calc%vxc(:, ispin), reduce = .false.)
1079 call ks%gr%allreduce(hm%energy%intnvxc)
1084 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
then
1086 safe_deallocate_a(hm%ks_pot%vxc)
1087 call move_alloc(ks%calc%vxc, hm%ks_pot%vxc)
1090 call hm%ks_pot%set_vtau(ks%calc%vtau)
1091 safe_deallocate_a(ks%calc%vtau)
1097 hm%energy%intnvxc = hm%energy%intnvxc &
1100 hm%energy%intnvxc = hm%energy%intnvxc &
1110 if (.not. ks%v_ks_photons%includes_hartree())
then
1111 hm%energy%hartree =
m_zero
1112 hm%ks_pot%vhartree =
m_zero
1118 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vxc(ip, 1) + hm%ks_pot%vhartree(ip)
1120 if (
allocated(hm%vberry))
then
1122 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vhxc(ip, 1) + hm%vberry(ip, 1)
1128 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vxc(ip, 2) + hm%ks_pot%vhartree(ip)
1130 if (
allocated(hm%vberry))
then
1132 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vhxc(ip, 2) + hm%vberry(ip, 2)
1137 if (hm%d%ispin ==
spinors)
then
1140 hm%ks_pot%vhxc(ip, ispin) = hm%ks_pot%vxc(ip, ispin)
1146 hm%energy%exchange_hf =
m_zero
1148 .or. ks%theory_level ==
rdmft &
1152 if (.not. hm%exxop%useACE)
then
1154 if (
associated(hm%exxop%st))
then
1157 safe_deallocate_p(hm%exxop%st)
1168 select case (ks%theory_level)
1182 if (hm%exxop%useACE)
then
1186 if (hm%exxop%with_isdf)
then
1189 call hm%exxop%isdf%get_interpolation_points(namespace, space, ks%gr, st%rho(1:ks%gr%np, 1))
1191 ks%calc%hf_st, xst, hm%kpoints)
1194 ks%calc%hf_st, xst, hm%kpoints)
1200 ks%calc%hf_st, xst, hm%kpoints)
1202 if (hm%phase%is_allocated())
then
1209 exx_energy = exx_energy + hm%exxop%singul%energy
1213 select case (ks%theory_level)
1216 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1219 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1237 if (ks%v_ks_photons%active() .and. (ks%v_ks_photons%functional() == 0))
then
1238 call ks%v_ks_photons%add_mf_potential(ks%gr, hm%ks_pot%vhxc, hm%d%ispin, hm%ep%photon_forces(1:space%dim))
1241 if (ks%vdw%vdw_correction /= option__vdwcorrection__none)
then
1242 assert(
allocated(ks%vdw%forces))
1243 hm%ep%vdw_forces(:, :) = ks%vdw%forces(:, :)
1244 hm%ep%vdw_stress = ks%vdw%stress
1245 safe_deallocate_a(ks%vdw%forces)
1247 hm%ep%vdw_forces = 0.0_real64
1250 if (ks%calc%time_present .or. hm%time_zero)
then
1251 call hm%update(ks%gr, namespace, space, ext_partners, time = ks%calc%time)
1257 safe_deallocate_a(ks%calc%density)
1258 if (ks%calc%total_density_alloc)
then
1259 safe_deallocate_p(ks%calc%total_density)
1261 nullify(ks%calc%total_density)
1275 class(
space_t),
intent(in ) :: space
1276 class(
mesh_t),
intent(in ) :: gr
1282 if (exxop%isdf%use_serial)
then
1284 hf_st, xst, kpoints)
1286 call isdf_parallel_ace_compute_potentials(exxop, namespace, space, gr, &
1287 hf_st, xst, kpoints)
1298 subroutine v_ks_hartree(namespace, ks, space, hm, ext_partners)
1300 type(
v_ks_t),
intent(inout) :: ks
1301 class(
space_t),
intent(in) :: space
1309 call dpoisson_solve(hm%psolver, namespace, hm%ks_pot%vhartree, ks%calc%total_density, reset=.false.)
1315 if (ks%calc%calc_energy)
then
1317 hm%energy%hartree =
m_half*
dmf_dotp(ks%gr, ks%calc%total_density, hm%ks_pot%vhartree)
1321 if(ks%calc%time_present)
then
1324 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick, time=ks%calc%time)
1327 ks%calc%total_density, hm%energy%pcm_corr, time=ks%calc%time)
1332 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick)
1335 ks%calc%total_density, hm%energy%pcm_corr)
1346 type(
v_ks_t),
intent(inout) :: ks
1350 ks%frozen_hxc = .
true.
1357 type(
v_ks_t),
intent(inout) :: this
1358 logical,
intent(in) :: calc_cur
1362 this%calculate_current = calc_cur
1369 type(
v_ks_t),
intent(inout) :: ks
1373 real(real64),
intent(out) :: int_dft_u
constant times a vector plus a vector
scales a vector by a constant
This is the common interface to a sorting routine. It performs the shell algorithm,...
logical pure function, public accel_buffer_is_allocated(this)
pure logical function, public accel_is_enabled()
integer, parameter, public accel_mem_read_only
subroutine, public current_calculate(this, namespace, gr, hm, space, st)
Compute total electronic current density.
subroutine, public current_init(this, namespace)
This module implements a calculator for the density and defines related functions.
subroutine, public states_elec_total_density(st, mesh, total_rho)
This routine calculates the total electronic density.
subroutine, public density_calc(st, gr, density, istin)
Computes the density from the orbitals in st.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
integer, parameter, public unpolarized
Parameters...
integer, parameter, public spinors
subroutine, public energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit, full)
This subroutine calculates the total energy of the system. Basically, it adds up the KS eigenvalues,...
real(real64) function, public zenergy_calc_electronic(namespace, hm, der, st, terms)
real(real64) function, public denergy_calc_electronic(namespace, hm, der, st, terms)
subroutine, public energy_calc_eigenvalues(namespace, hm, der, st)
subroutine, public energy_copy(ein, eout)
subroutine, public dexchange_operator_ace(this, namespace, mesh, st, xst, phase)
subroutine, public zexchange_operator_compute_potentials(this, namespace, space, gr, st, xst, kpoints, F_out)
subroutine, public exchange_operator_reinit(this, cam, st)
subroutine, public dexchange_operator_compute_potentials(this, namespace, space, gr, st, xst, kpoints, F_out)
subroutine, public zexchange_operator_ace(this, namespace, mesh, st, xst, phase)
real(real64) function, public dexchange_operator_compute_ex(mesh, st, xst)
Compute the exact exchange energy.
real(real64) function, public zexchange_operator_compute_ex(mesh, st, xst)
Compute the exact exchange energy.
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
integer, parameter, public rdmft
integer, parameter, public hartree_fock
integer, parameter, public independent_particles
Theory level.
integer, parameter, public generalized_kohn_sham_dft
integer, parameter, public kohn_sham_dft
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
integer, parameter, public hartree
This module implements the underlying real-space grid.
integer, parameter, public term_mgga
integer, parameter, public term_dft_u
logical function, public hamiltonian_elec_has_kick(hm)
logical function, public hamiltonian_elec_needs_current(hm, states_are_real)
subroutine, public hamiltonian_elec_update_pot(this, mesh, accumulate)
Update the KS potential of the electronic Hamiltonian.
This module defines classes and functions for interaction partners.
Interoperable Separable Density Fitting (ISDF) molecular implementation.
subroutine, public isdf_ace_compute_potentials(exxop, namespace, space, mesh, st, Vx_on_st, kpoints)
ISDF wrapper computing interpolation points and vectors, which are used to build the potential used ...
Serial prototype for benchmarking and validating ISDF implementation.
subroutine, public isdf_serial_ace_compute_potentials(exxop, namespace, space, mesh, st, Vx_on_st, kpoints)
ISDF wrapper computing interpolation points and vectors, which are used to build the potential used ...
A module to handle KS potential, without the external potential.
integer, parameter, public dft_u_none
This modules implements the routines for doing constrain DFT for noncollinear magnetism.
integer, parameter, public constrain_none
subroutine, public magnetic_constrain_update(this, mesh, std, space, latt, pos, rho)
Recomputes the magnetic contraining potential.
subroutine, public magnetic_induced(namespace, gr, st, psolver, kpoints, a_ind, b_ind)
This subroutine receives as input a current, and produces as an output the vector potential that it i...
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
subroutine, public messages_not_implemented(feature, namespace)
character(len=512), private msg
subroutine, public messages_warning(no_lines, all_nodes, namespace)
subroutine, public messages_obsolete_variable(namespace, name, rep)
subroutine, public messages_new_line()
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)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This module handles the communicators for the various parallelization strategies.
logical function, public parse_is_defined(namespace, name)
subroutine, public pcm_hartree_potential(pcm, space, mesh, psolver, ext_partners, vhartree, density, pcm_corr, kick, time)
PCM reaction field due to the electronic density.
subroutine, public dpoisson_solve_start(this, rho)
subroutine, public dpoisson_solve(this, namespace, pot, rho, all_nodes, kernel, reset)
Calculates the Poisson equation. Given the density returns the corresponding potential.
subroutine, public dpoisson_solve_finish(this, pot)
logical pure function, public poisson_is_async(this)
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
integer, parameter, public pseudo_exchange_unknown
integer, parameter, public pseudo_correlation_unknown
integer, parameter, public pseudo_correlation_any
integer, parameter, public pseudo_exchange_any
This module is intended to contain "only mathematical" functions and procedures.
integer, parameter, private libxc_c_index
pure logical function, public states_are_complex(st)
pure logical function, public states_are_real(st)
This module handles spin dimensions of the states and the k-point distribution.
subroutine, public states_elec_fermi(st, namespace, mesh, compute_spin)
calculate the Fermi level for the states in this object
subroutine, public states_elec_end(st)
finalize the states_elec_t object
subroutine, public states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special)
make a (selective) copy of a states_elec_t object
subroutine, public states_elec_allocate_current(st, space, mesh)
This module provides routines for communicating states when using states parallelization.
subroutine, public states_elec_parallel_remote_access_stop(this)
stop remote memory access for states on other processors
subroutine, public states_elec_parallel_remote_access_start(this)
start remote memory access for states on other processors
type(type_t), parameter, public type_float
subroutine v_ks_hartree(namespace, ks, space, hm, ext_partners)
Hartree contribution to the KS potential. This function is designed to be used by v_ks_calc_finish an...
subroutine, public v_ks_calc_finish(ks, hm, namespace, space, latt, st, ext_partners, force_semilocal)
subroutine, public v_ks_freeze_hxc(ks)
subroutine, public v_ks_end(ks)
subroutine, public v_ks_calculate_current(this, calc_cur)
subroutine, public v_ks_write_info(ks, iunit, namespace)
subroutine, public v_ks_update_dftu_energy(ks, namespace, hm, st, int_dft_u)
Update the value of <\psi | V_U | \psi>, where V_U is the DFT+U potential.
subroutine, public v_ks_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, calc_energy, force_semilocal)
This routine starts the calculation of the Kohn-Sham potential. The routine v_ks_calc_finish must be ...
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
subroutine, public v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
subroutine, public v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
QEDFT / electron-photon (cavity) extension of the Kohn-Sham potential.
subroutine, public x_slater_calc(namespace, gr, space, exxop, st, kpoints, ex, vxc)
Interface to X(slater_calc)
type(xc_cam_t), parameter, public cam_null
All CAM parameters set to zero.
type(xc_cam_t), parameter, public cam_exact_exchange
Use only Hartree Fock exact exchange.
subroutine, public x_fbe_calc(id, namespace, psolver, gr, st, space, ex, vxc)
Interface to X(x_fbe_calc) Two possible run modes possible: adiabatic and Sturm-Liouville....
subroutine, public fbe_c_lda_sl(namespace, gr, st, space, ec, vxc)
Sturm-Liouville version of the FBE local-density correlation functional.
integer, parameter, public xc_family_ks_inversion
declaring 'family' constants for 'functionals' not handled by libxc careful not to use a value define...
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_family_nc_mgga
integer, parameter, public xc_oep_x
Exact exchange.
integer, parameter, public xc_lda_c_fbe_sl
LDA correlation based ib the force-balance equation - Sturm-Liouville version.
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.
integer, parameter, public func_c
integer, parameter, public func_x
subroutine, public xc_ks_inversion_end(ks_inv)
subroutine, public xc_ks_inversion_write_info(ks_inversion, iunit, namespace)
subroutine, public xc_ks_inversion_init(ks_inv, namespace, gr, ions, st, xc, mc, space, kpoints)
subroutine, public xc_ks_inversion_calc(ks_inversion, namespace, space, gr, hm, ext_partners, st, vxc, time)
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...
subroutine, public xc_write_info(xcs, iunit, namespace)
subroutine, public xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
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 family_is_hybrid(xcs)
Returns true if the functional is an hybrid functional.
integer, parameter, public oep_type_mgga
integer, parameter, public oep_level_none
the OEP levels
subroutine, public xc_oep_end(oep)
subroutine, public zxc_oep_calc(oep, namespace, xcs, gr, hm, st, space, rcell_volume, ex, ec, vxc)
This file handles the evaluation of the OEP potential, in the KLI or full OEP as described in S....
subroutine, public dxc_oep_calc(oep, namespace, xcs, gr, hm, st, space, rcell_volume, ex, ec, vxc)
This file handles the evaluation of the OEP potential, in the KLI or full OEP as described in S....
subroutine, public xc_oep_write_info(oep, iunit, namespace)
integer, parameter, public oep_type_exx
The different types of OEP that we can work with.
subroutine, public xc_oep_init(oep, namespace, gr, st, mc, space, oep_type)
integer, parameter, public sic_none
no self-interaction correction
subroutine, public xc_sic_write_info(sic, iunit, namespace)
integer, parameter, public sic_adsic
Averaged density SIC.
subroutine, public xc_sic_init(sic, namespace, gr, st, mc, space)
initialize the SIC object
subroutine, public xc_sic_end(sic)
finalize the SIC and, if needed, the included OEP
integer, parameter, public sic_pz_oep
Perdew-Zunger SIC (OEP way)
integer, parameter, public sic_amaldi
Amaldi correction term.
subroutine, public xc_sic_calc_adsic(sic, namespace, space, gr, st, hm, xc, density, vxc, ex, ec)
Computes the ADSIC potential and energy.
A module that takes care of xc contribution from vdW interactions.
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, force_host)
Extension of space that contains the knowledge of the spin dimension.
Description of the grid, containing information on derivatives, stencil, and symmetries.
Describes mesh distribution to nodes.
The states_elec_t class contains all electronic wave functions.
Photon (QEDFT) part of v_ks_t.
subroutine get_functional_from_pseudos(x_functional, c_functional)
Tries to find out the functional from the pseudopotential.
subroutine v_a_xc(hm, force_semilocal)
subroutine calculate_density()