38 use,
intrinsic :: iso_fortran_env
107 logical :: calculating
108 logical :: time_present
110 real(real64),
allocatable :: density(:, :)
111 logical :: total_density_alloc
112 real(real64),
pointer,
contiguous :: total_density(:)
113 type(energy_t),
allocatable :: energy
115 type(states_elec_t),
pointer :: hf_st
120 real(real64),
allocatable :: vxc(:, :)
121 real(real64),
allocatable :: vtau(:, :)
122 real(real64),
allocatable :: axc(:, :, :)
123 real(real64),
allocatable :: a_ind(:, :)
124 real(real64),
allocatable :: b_ind(:, :)
125 logical :: calc_energy
130 integer,
public :: theory_level = -1
131 logical,
public :: frozen_hxc = .false.
133 integer,
public :: xc_family = 0
134 integer,
public :: xc_flags = 0
135 type(xc_t),
public :: xc
136 type(xc_oep_t),
public :: oep
137 type(xc_ks_inversion_t),
public :: ks_inversion
138 type(xc_sic_t),
public :: sic
139 type(xc_vdw_t),
public :: vdw
140 type(grid_t),
pointer,
public :: gr
141 type(sturm_liouville_t),
public :: sl_solver
142 type(v_ks_calc_t) :: calc
143 logical :: calculate_current = .false.
144 type(current_t) :: current_calculator
145 logical :: include_td_field = .false.
148 real(real64),
public :: stress_xc(3, 3)
149 type(v_ks_photon_t),
public :: v_ks_photons
155 subroutine v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
156 type(v_ks_t),
intent(inout) :: ks
157 type(namespace_t),
intent(in) :: namespace
158 type(grid_t),
target,
intent(inout) :: gr
159 type(states_elec_t),
intent(in) :: st
160 type(ions_t),
intent(inout) :: ions
161 type(multicomm_t),
intent(in) :: mc
162 class(space_t),
intent(in) :: space
163 type(kpoints_t),
intent(in) :: kpoints
165 integer :: x_id, c_id, xk_id, ck_id, default, val
166 logical :: parsed_theory_level, using_hartree_fock
167 integer :: pseudo_x_functional, pseudo_c_functional
215 ks%xc_family = xc_family_none
220 parsed_theory_level = .false.
227 parsed_theory_level = .
true.
241 call messages_write(
'Info: the XCFunctional has been selected to match the pseudopotentials', new_line = .
true.)
256 call messages_write(
'The XCFunctional that you selected does not match the one used', new_line = .
true.)
289 call ks%v_ks_photons%init(namespace)
297 using_hartree_fock = (ks%theory_level ==
hartree_fock) &
299 call xc_init(ks%xc, namespace, space%dim, space%periodic_dim, st%qtot, &
300 x_id, c_id, xk_id, ck_id,
hartree_fock = using_hartree_fock, ispin=st%d%ispin)
302 ks%xc_family = ks%xc%family
303 ks%xc_flags = ks%xc%flags
305 if (.not. parsed_theory_level)
then
314 call parse_variable(namespace,
'TheoryLevel', default, ks%theory_level)
326 ks%xc_family = ior(ks%xc_family, xc_family_oep)
336 ks%sic%amaldi_factor =
m_one
338 select case (ks%theory_level)
343 if (space%periodic_dim == space%dim)
then
346 if (kpoints%full%npoints > 1)
then
351 if (kpoints%full%npoints > 1)
then
366 if (
bitand(ks%xc_family, xc_family_lda + xc_family_gga) /= 0)
then
367 call xc_sic_init(ks%sic, namespace, gr, st, mc, space)
370 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
371 select case (ks%xc%functional(
func_x,1)%id)
373 if (kpoints%reduced%npoints > 1 .and. st%d%ispin ==
spinors)
then
376 if (kpoints%use_symmetries)
then
381 if (kpoints%reduced%npoints > 1)
then
386 if((.not. ks%v_ks_photons%active()) .or. (ks%v_ks_photons%functional() /= 0))
then
387 if(oep_type == -1)
then
390 call xc_oep_init(ks%oep, namespace, gr, st, mc, space, oep_type)
404 message(1) =
"SICCorrection can only be used with Kohn-Sham DFT"
408 if (st%d%ispin ==
spinors)
then
409 if (
bitand(ks%xc_family, xc_family_mgga + xc_family_hyb_mgga) /= 0)
then
414 ks%frozen_hxc = .false.
419 ks%calc%calculating = .false.
424 call ks%vdw%init(namespace, space, gr, ks%xc, ions, x_id, c_id)
425 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level ==
rdmft)
then
426 message(1) =
"VDWCorrection and RDMFT are not compatible"
429 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level ==
independent_particles)
then
430 message(1) =
"VDWCorrection and independent particles are not compatible"
434 call ks%v_ks_photons%init_xc(namespace, space, gr, st)
446 integer,
intent(out) :: x_functional
447 integer,
intent(out) :: c_functional
449 integer :: xf, cf, ispecies
450 logical :: warned_inconsistent
455 warned_inconsistent = .false.
456 do ispecies = 1, ions%nspecies
457 select type(spec=>ions%species(ispecies)%s)
459 xf = spec%x_functional()
460 cf = spec%c_functional()
463 call messages_write(
"Unknown XC functional for species '"//trim(ions%species(ispecies)%s%get_label())//
"'")
471 if (xf /= x_functional .and. .not. warned_inconsistent)
then
472 call messages_write(
'Inconsistent XC functional detected between species')
474 warned_inconsistent = .
true.
481 if (cf /= c_functional .and. .not. warned_inconsistent)
then
482 call messages_write(
'Inconsistent XC functional detected between species')
484 warned_inconsistent = .
true.
504 type(
v_ks_t),
intent(inout) :: ks
511 select case (ks%theory_level)
516 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
526 call ks%v_ks_photons%end()
535 type(
v_ks_t),
intent(in) :: ks
536 integer,
optional,
intent(in) :: iunit
537 type(
namespace_t),
optional,
intent(in) :: namespace
544 select case (ks%theory_level)
569 subroutine v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
572 type(
grid_t),
intent(in) :: gr
573 type(
ions_t),
intent(in) :: ions
576 type(
v_ks_t),
intent(inout) :: ks
578 logical,
optional,
intent(in) :: calc_eigenval
579 logical,
optional,
intent(in) :: calc_current
581 integer,
allocatable :: ind(:)
583 real(real64),
allocatable :: copy_occ(:)
584 logical :: calc_eigenval_
585 logical :: calc_current_
593 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
594 calc_eigenval = calc_eigenval_, calc_current = calc_current_)
596 if (st%restart_reorder_occs .and. .not. st%fromScratch)
then
597 message(1) =
"Reordering occupations for restart."
600 safe_allocate(ind(1:st%nst))
601 safe_allocate(copy_occ(1:st%nst))
604 call sort(st%eigenval(:, ik), ind)
605 copy_occ(1:st%nst) = st%occ(1:st%nst, ik)
607 st%occ(ist, ik) = copy_occ(ind(ist))
611 safe_deallocate_a(ind)
612 safe_deallocate_a(copy_occ)
622 subroutine v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
623 calc_eigenval, time, calc_energy, calc_current, force_semilocal)
624 type(
v_ks_t),
intent(inout) :: ks
631 logical,
optional,
intent(in) :: calc_eigenval
632 real(real64),
optional,
intent(in) :: time
633 logical,
optional,
intent(in) :: calc_energy
634 logical,
optional,
intent(in) :: calc_current
635 logical,
optional,
intent(in) :: force_semilocal
637 logical :: calc_current_
642 .and. (ks%calculate_current &
646 if (calc_current_)
then
651 call v_ks_calc_start(ks, namespace, space, hm, st, ions, hm%kpoints%latt, ext_partners, time, &
652 calc_energy, force_semilocal=force_semilocal)
654 ext_partners, force_semilocal=force_semilocal)
665 call lalg_axpy(ks%gr%np, st%d%nspin,
m_one, hm%magnetic_constrain%pot, hm%ks_pot%vhxc)
677 subroutine v_ks_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, &
678 calc_energy, force_semilocal)
679 type(
v_ks_t),
target,
intent(inout) :: ks
681 class(
space_t),
intent(in) :: space
684 type(
ions_t),
intent(in) :: ions
687 real(real64),
optional,
intent(in) :: time
688 logical,
optional,
intent(in) :: calc_energy
689 logical,
optional,
intent(in) :: force_semilocal
695 assert(.not. ks%calc%calculating)
696 ks%calc%calculating = .
true.
698 write(
message(1),
'(a)')
'Debug: Calculating Kohn-Sham potential.'
701 ks%calc%time_present =
present(time)
707 if (ks%frozen_hxc)
then
713 allocate(ks%calc%energy)
719 nullify(ks%calc%total_density)
729 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
call v_a_xc(hm, force_semilocal)
731 ks%calc%total_density_alloc = .false.
738 nullify(ks%calc%hf_st)
743 if (st%parallel_in_states)
then
745 call messages_write(
'State parallelization of Hartree-Fock exchange is not supported')
747 call messages_write(
'when running with GPUs. Please use domain parallelization')
749 call messages_write(
"or disable acceleration using 'DisableAccel = yes'.")
754 if (hm%exxop%useACE)
then
757 safe_allocate(ks%calc%hf_st)
766 if (hm%self_induced_magnetic)
then
767 safe_allocate(ks%calc%a_ind(1:ks%gr%np_part, 1:space%dim))
768 safe_allocate(ks%calc%b_ind(1:ks%gr%np_part, 1:space%dim))
769 call magnetic_induced(namespace, ks%gr, st, hm%psolver, hm%kpoints, ks%calc%a_ind, ks%calc%b_ind)
772 if ((ks%v_ks_photons%active()) .and. (ks%calc%time_present) .and. (ks%v_ks_photons%functional() == 0) )
then
773 call ks%v_ks_photons%mf_calc(ks%gr, st, ions, time)
791 safe_allocate(ks%calc%density(1:ks%gr%np, 1:st%d%nspin))
796 call lalg_scal(ks%gr%np, st%d%nspin, ks%sic%amaldi_factor, ks%calc%density)
808 if (
allocated(st%rho_core))
then
812 int(ks%gr%np, int64), st%rho_core)
814 if (
allocated(st%frozen_rho))
then
818 int(ks%gr%np, int64), int(st%d%nspin, int64), st%frozen_rho)
819 ks%xc%quantities%frozen_rho_np = ks%gr%np
822 ks%xc%quantities%amaldi_factor = ks%sic%amaldi_factor
826 nullify(ks%calc%total_density)
827 if (
allocated(st%rho_core) .or. hm%d%spin_channels > 1)
then
828 ks%calc%total_density_alloc = .
true.
830 safe_allocate(ks%calc%total_density(1:ks%gr%np))
833 ks%calc%total_density(ip) = sum(ks%calc%density(ip, 1:hm%d%spin_channels))
837 if (
allocated(st%rho_core))
then
838 call lalg_axpy(ks%gr%np, -ks%sic%amaldi_factor, st%rho_core, ks%calc%total_density)
841 ks%calc%total_density_alloc = .false.
842 ks%calc%total_density => ks%calc%density(:, 1)
849 subroutine v_a_xc(hm, force_semilocal)
851 logical,
optional,
intent(in) :: force_semilocal
856 ks%calc%energy%exchange =
m_zero
857 ks%calc%energy%correlation =
m_zero
858 ks%calc%energy%xc_j =
m_zero
859 ks%calc%energy%vdw =
m_zero
861 allocate(ks%calc%vxc(1:ks%gr%np, 1:st%d%nspin))
865 safe_allocate(ks%calc%vtau(1:ks%gr%np, 1:st%d%nspin))
870 if (ks%calc%calc_energy)
then
872 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
873 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
874 deltaxc = ks%calc%energy%delta_xc, vtau = ks%calc%vtau, stress_xc=ks%stress_xc, &
875 force_orbitalfree=force_semilocal)
877 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
878 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
879 deltaxc = ks%calc%energy%delta_xc, stress_xc=ks%stress_xc, force_orbitalfree=force_semilocal)
883 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
884 st%d%ispin, latt%rcell_volume, ks%calc%vxc, vtau = ks%calc%vtau, stress_xc=ks%stress_xc, &
885 force_orbitalfree=force_semilocal)
887 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
888 st%d%ispin, latt%rcell_volume, ks%calc%vxc, stress_xc=ks%stress_xc, force_orbitalfree=force_semilocal)
894 if (st%d%ispin /=
spinors)
then
895 message(1) =
"Noncollinear functionals can only be used with spinor wavefunctions."
900 message(1) =
"Cannot perform LCAO for noncollinear MGGAs."
901 message(2) =
"Please perform a LDA calculation first."
905 if (ks%calc%calc_energy)
then
907 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
908 vtau = ks%calc%vtau, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
910 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
911 ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
915 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, &
916 ks%calc%vxc, vtau = ks%calc%vtau)
918 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc)
923 call ks%vdw%calc(namespace, space, latt, ions%atom, ions%natoms, ions%pos, &
924 ks%gr, st, ks%calc%energy%vdw, ks%calc%vxc)
937 if (ks%calc%calc_energy)
then
938 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
939 ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
941 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
953 call x_slater_calc(namespace, ks%gr, space, hm%exxop, st, hm%kpoints, ks%calc%energy%exchange, &
956 call x_fbe_calc(ks%xc%functional(
func_x,1)%id, namespace, hm%psolver, ks%sl_solver, ks%gr, st, space, &
957 ks%calc%energy%exchange, vxc = ks%calc%vxc)
961 call fbe_c_lda_sl(namespace, hm%psolver, ks%sl_solver, ks%gr, st, space, ks%calc%energy%correlation, vxc = ks%calc%vxc)
969 call xc_ks_inversion_calc(ks%ks_inversion, namespace, space, ks%gr, hm, ext_partners, st, vxc = ks%calc%vxc, &
974 if (ks%v_ks_photons%functional() /= 0)
then
975 call ks%v_ks_photons%add_px(namespace, ks%calc%total_density, ks%gr, space, hm%psolver, st, &
976 hm%d%spin_channels, ks%calc%vxc, ks%calc%energy%photon_exchange)
981 if (ks%calc%calc_energy)
then
994 subroutine v_ks_calc_finish(ks, hm, namespace, space, latt, st, ext_partners, force_semilocal)
995 type(
v_ks_t),
target,
intent(inout) :: ks
998 class(
space_t),
intent(in) :: space
1002 logical,
optional,
intent(in) :: force_semilocal
1004 integer :: ip, ispin
1007 real(real64) :: exx_energy
1008 real(real64) :: factor
1012 assert(ks%calc%calculating)
1013 ks%calc%calculating = .false.
1015 if (ks%frozen_hxc)
then
1021 safe_deallocate_a(hm%energy)
1022 call move_alloc(ks%calc%energy, hm%energy)
1024 if (hm%self_induced_magnetic)
then
1025 hm%a_ind(1:ks%gr%np, 1:space%dim) = ks%calc%a_ind(1:ks%gr%np, 1:space%dim)
1026 hm%b_ind(1:ks%gr%np, 1:space%dim) = ks%calc%b_ind(1:ks%gr%np, 1:space%dim)
1028 safe_deallocate_a(ks%calc%a_ind)
1029 safe_deallocate_a(ks%calc%b_ind)
1032 if (
allocated(hm%v_static))
then
1033 hm%energy%intnvstatic =
dmf_dotp(ks%gr, ks%calc%total_density, hm%v_static)
1035 hm%energy%intnvstatic =
m_zero
1041 hm%energy%intnvxc =
m_zero
1042 hm%energy%hartree =
m_zero
1043 hm%energy%exchange =
m_zero
1044 hm%energy%exchange_hf =
m_zero
1045 hm%energy%correlation =
m_zero
1048 hm%energy%hartree =
m_zero
1049 call v_ks_hartree(namespace, ks, space, hm, ext_partners)
1055 call dxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1056 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1058 call zxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1059 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1068 call dxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1069 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1071 call zxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1072 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1079 call ks%v_ks_photons%oep_calc(namespace, ks%xc, ks%gr, hm, st, space, ks%calc%vxc)
1083 if (ks%calc%calc_energy)
then
1085 hm%energy%intnvxc =
m_zero
1088 do ispin = 1, hm%d%nspin
1089 if (ispin <= 2)
then
1094 hm%energy%intnvxc = hm%energy%intnvxc + &
1095 factor*
dmf_dotp(ks%gr, st%rho(:, ispin), ks%calc%vxc(:, ispin), reduce = .false.)
1097 call ks%gr%allreduce(hm%energy%intnvxc)
1102 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
then
1104 safe_deallocate_a(hm%ks_pot%vxc)
1105 call move_alloc(ks%calc%vxc, hm%ks_pot%vxc)
1108 call hm%ks_pot%set_vtau(ks%calc%vtau)
1109 safe_deallocate_a(ks%calc%vtau)
1115 hm%energy%intnvxc = hm%energy%intnvxc &
1118 hm%energy%intnvxc = hm%energy%intnvxc &
1128 if (.not. ks%v_ks_photons%includes_hartree())
then
1129 hm%energy%hartree =
m_zero
1130 hm%ks_pot%vhartree =
m_zero
1136 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vxc(ip, 1) + hm%ks_pot%vhartree(ip)
1138 if (
allocated(hm%vberry))
then
1140 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vhxc(ip, 1) + hm%vberry(ip, 1)
1146 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vxc(ip, 2) + hm%ks_pot%vhartree(ip)
1148 if (
allocated(hm%vberry))
then
1150 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vhxc(ip, 2) + hm%vberry(ip, 2)
1155 if (hm%d%ispin ==
spinors)
then
1158 hm%ks_pot%vhxc(ip, ispin) = hm%ks_pot%vxc(ip, ispin)
1164 hm%energy%exchange_hf =
m_zero
1166 .or. ks%theory_level ==
rdmft &
1170 if (.not. hm%exxop%useACE)
then
1172 if (
associated(hm%exxop%st))
then
1175 safe_deallocate_p(hm%exxop%st)
1186 select case (ks%theory_level)
1200 if (hm%exxop%useACE)
then
1204 if (hm%exxop%with_isdf)
then
1207 call hm%exxop%isdf%get_interpolation_points(namespace, space, ks%gr, st%rho(1:ks%gr%np, 1))
1209 ks%calc%hf_st, xst, hm%kpoints)
1212 ks%calc%hf_st, xst, hm%kpoints)
1218 ks%calc%hf_st, xst, hm%kpoints)
1220 if (hm%phase%is_allocated())
then
1227 exx_energy = exx_energy + hm%exxop%singul%energy
1231 select case (ks%theory_level)
1234 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1237 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1255 if (ks%v_ks_photons%active() .and. (ks%v_ks_photons%functional() == 0))
then
1256 call ks%v_ks_photons%add_mf_potential(ks%gr, hm%ks_pot%vhxc, hm%d%ispin, hm%ep%photon_forces(1:space%dim))
1259 if (ks%vdw%vdw_correction /= option__vdwcorrection__none)
then
1260 assert(
allocated(ks%vdw%forces))
1261 hm%ep%vdw_forces(:, :) = ks%vdw%forces(:, :)
1262 hm%ep%vdw_stress = ks%vdw%stress
1263 safe_deallocate_a(ks%vdw%forces)
1265 hm%ep%vdw_forces = 0.0_real64
1268 if (ks%calc%time_present .or. hm%time_zero)
then
1269 call hm%update(ks%gr, namespace, space, ext_partners, time = ks%calc%time)
1275 safe_deallocate_a(ks%calc%density)
1276 if (ks%calc%total_density_alloc)
then
1277 safe_deallocate_p(ks%calc%total_density)
1279 nullify(ks%calc%total_density)
1293 class(
space_t),
intent(in ) :: space
1294 class(
mesh_t),
intent(in ) :: gr
1300 if (exxop%isdf%use_serial)
then
1302 hf_st, xst, kpoints)
1304 call isdf_parallel_ace_compute_potentials(exxop, namespace, space, gr, &
1305 hf_st, xst, kpoints)
1316 subroutine v_ks_hartree(namespace, ks, space, hm, ext_partners)
1318 type(
v_ks_t),
intent(inout) :: ks
1319 class(
space_t),
intent(in) :: space
1327 call dpoisson_solve(hm%psolver, namespace, hm%ks_pot%vhartree, ks%calc%total_density, reset=.false.)
1333 if (ks%calc%calc_energy)
then
1335 hm%energy%hartree =
m_half*
dmf_dotp(ks%gr, ks%calc%total_density, hm%ks_pot%vhartree)
1339 if(ks%calc%time_present)
then
1342 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick, time=ks%calc%time)
1345 ks%calc%total_density, hm%energy%pcm_corr, time=ks%calc%time)
1350 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick)
1353 ks%calc%total_density, hm%energy%pcm_corr)
1364 type(
v_ks_t),
intent(inout) :: ks
1368 ks%frozen_hxc = .
true.
1375 type(
v_ks_t),
intent(inout) :: this
1376 logical,
intent(in) :: calc_cur
1380 this%calculate_current = calc_cur
1387 type(
v_ks_t),
intent(inout) :: ks
1391 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)
Construct the ACE vectors.
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)
Construct the ACE vectors.
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
General Sturm-Liouville solver for equations of the form .
subroutine, public sturm_liouville_end(this)
Finalize the Sturm-Liouville solver.
subroutine, public sturm_liouville_init(this, namespace, gr, space, max_iter, thr, inverse_tol)
Initialize the Sturm-Liouville solver.
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 fbe_c_lda_sl(namespace, psolver, sl_solver, gr, st, space, ec, vxc)
Sturm-Liouville version of the FBE local-density correlation functional.
subroutine, public x_fbe_calc(id, namespace, psolver, sl_solver, gr, st, space, ex, vxc)
Interface to X(x_fbe_calc) Two possible run modes possible: adiabatic and Sturm-Liouville....
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()