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.
147 real(real64),
public :: stress_xc_gga(3, 3)
148 type(v_ks_photon_t),
public :: v_ks_photons
154 subroutine v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
155 type(v_ks_t),
intent(inout) :: ks
156 type(namespace_t),
intent(in) :: namespace
157 type(grid_t),
target,
intent(inout) :: gr
158 type(states_elec_t),
intent(in) :: st
159 type(ions_t),
intent(inout) :: ions
160 type(multicomm_t),
intent(in) :: mc
161 class(space_t),
intent(in) :: space
162 type(kpoints_t),
intent(in) :: kpoints
164 integer :: x_id, c_id, xk_id, ck_id, default, val
165 logical :: parsed_theory_level, using_hartree_fock
166 integer :: pseudo_x_functional, pseudo_c_functional
209 ks%xc_family = xc_family_none
214 parsed_theory_level = .false.
221 parsed_theory_level = .
true.
235 call messages_write(
'Info: the XCFunctional has been selected to match the pseudopotentials', new_line = .
true.)
250 call messages_write(
'The XCFunctional that you selected does not match the one used', new_line = .
true.)
280 call ks%v_ks_photons%init(namespace)
288 using_hartree_fock = (ks%theory_level ==
hartree_fock) &
290 call xc_init(ks%xc, namespace, space%dim, space%periodic_dim, st%qtot, &
291 x_id, c_id, xk_id, ck_id,
hartree_fock = using_hartree_fock, ispin=st%d%ispin)
293 ks%xc_family = ks%xc%family
294 ks%xc_flags = ks%xc%flags
296 if (.not. parsed_theory_level)
then
305 call parse_variable(namespace,
'TheoryLevel', default, ks%theory_level)
317 ks%xc_family = ior(ks%xc_family, xc_family_oep)
327 ks%sic%amaldi_factor =
m_one
329 select case (ks%theory_level)
334 if (space%periodic_dim == space%dim)
then
337 if (kpoints%full%npoints > 1)
then
342 if (kpoints%full%npoints > 1)
then
357 if (
bitand(ks%xc_family, xc_family_lda + xc_family_gga) /= 0)
then
358 call xc_sic_init(ks%sic, namespace, gr, st, mc, space)
361 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
362 select case (ks%xc%functional(
func_x,1)%id)
364 if (kpoints%reduced%npoints > 1 .and. st%d%ispin ==
spinors)
then
367 if (kpoints%use_symmetries)
then
372 if (kpoints%reduced%npoints > 1)
then
377 if((.not. ks%v_ks_photons%active()) .or. (ks%v_ks_photons%functional() /= 0))
then
378 if(oep_type == -1)
then
381 call xc_oep_init(ks%oep, namespace, gr, st, mc, space, oep_type)
395 message(1) =
"SICCorrection can only be used with Kohn-Sham DFT"
399 if (st%d%ispin ==
spinors)
then
400 if (
bitand(ks%xc_family, xc_family_mgga + xc_family_hyb_mgga) /= 0)
then
405 ks%frozen_hxc = .false.
410 ks%calc%calculating = .false.
415 call ks%vdw%init(namespace, space, gr, ks%xc, ions, x_id, c_id)
416 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level ==
rdmft)
then
417 message(1) =
"VDWCorrection and RDMFT are not compatible"
420 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level ==
independent_particles)
then
421 message(1) =
"VDWCorrection and independent particles are not compatible"
425 call ks%v_ks_photons%init_xc(namespace, space, gr, st)
435 integer,
intent(out) :: x_functional
436 integer,
intent(out) :: c_functional
438 integer :: xf, cf, ispecies
439 logical :: warned_inconsistent
444 warned_inconsistent = .false.
445 do ispecies = 1, ions%nspecies
446 select type(spec=>ions%species(ispecies)%s)
448 xf = spec%x_functional()
449 cf = spec%c_functional()
452 call messages_write(
"Unknown XC functional for species '"//trim(ions%species(ispecies)%s%get_label())//
"'")
460 if (xf /= x_functional .and. .not. warned_inconsistent)
then
461 call messages_write(
'Inconsistent XC functional detected between species')
463 warned_inconsistent = .
true.
470 if (cf /= c_functional .and. .not. warned_inconsistent)
then
471 call messages_write(
'Inconsistent XC functional detected between species')
473 warned_inconsistent = .
true.
493 type(
v_ks_t),
intent(inout) :: ks
500 select case (ks%theory_level)
505 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
515 call ks%v_ks_photons%end()
524 type(
v_ks_t),
intent(in) :: ks
525 integer,
optional,
intent(in) :: iunit
526 type(
namespace_t),
optional,
intent(in) :: namespace
533 select case (ks%theory_level)
558 subroutine v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
561 type(
grid_t),
intent(in) :: gr
562 type(
ions_t),
intent(in) :: ions
565 type(
v_ks_t),
intent(inout) :: ks
567 logical,
optional,
intent(in) :: calc_eigenval
568 logical,
optional,
intent(in) :: calc_current
570 integer,
allocatable :: ind(:)
572 real(real64),
allocatable :: copy_occ(:)
573 logical :: calc_eigenval_
574 logical :: calc_current_
582 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
583 calc_eigenval = calc_eigenval_, calc_current = calc_current_)
585 if (st%restart_reorder_occs .and. .not. st%fromScratch)
then
586 message(1) =
"Reordering occupations for restart."
589 safe_allocate(ind(1:st%nst))
590 safe_allocate(copy_occ(1:st%nst))
593 call sort(st%eigenval(:, ik), ind)
594 copy_occ(1:st%nst) = st%occ(1:st%nst, ik)
596 st%occ(ist, ik) = copy_occ(ind(ist))
600 safe_deallocate_a(ind)
601 safe_deallocate_a(copy_occ)
611 subroutine v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
612 calc_eigenval, time, calc_energy, calc_current, force_semilocal)
613 type(
v_ks_t),
intent(inout) :: ks
620 logical,
optional,
intent(in) :: calc_eigenval
621 real(real64),
optional,
intent(in) :: time
622 logical,
optional,
intent(in) :: calc_energy
623 logical,
optional,
intent(in) :: calc_current
624 logical,
optional,
intent(in) :: force_semilocal
626 logical :: calc_current_
631 .and. (ks%calculate_current &
635 if (calc_current_)
then
640 call v_ks_calc_start(ks, namespace, space, hm, st, ions, hm%kpoints%latt, ext_partners, time, &
641 calc_energy, force_semilocal=force_semilocal)
643 ext_partners, force_semilocal=force_semilocal)
654 call lalg_axpy(ks%gr%np, st%d%nspin,
m_one, hm%magnetic_constrain%pot, hm%ks_pot%vhxc)
666 subroutine v_ks_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, &
667 calc_energy, force_semilocal)
668 type(
v_ks_t),
target,
intent(inout) :: ks
670 class(
space_t),
intent(in) :: space
673 type(
ions_t),
intent(in) :: ions
676 real(real64),
optional,
intent(in) :: time
677 logical,
optional,
intent(in) :: calc_energy
678 logical,
optional,
intent(in) :: force_semilocal
684 assert(.not. ks%calc%calculating)
685 ks%calc%calculating = .
true.
687 write(
message(1),
'(a)')
'Debug: Calculating Kohn-Sham potential.'
690 ks%calc%time_present =
present(time)
696 if (ks%frozen_hxc)
then
702 allocate(ks%calc%energy)
708 nullify(ks%calc%total_density)
718 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
call v_a_xc(hm, force_semilocal)
720 ks%calc%total_density_alloc = .false.
727 nullify(ks%calc%hf_st)
732 if (st%parallel_in_states)
then
734 call messages_write(
'State parallelization of Hartree-Fock exchange is not supported')
736 call messages_write(
'when running with GPUs. Please use domain parallelization')
738 call messages_write(
"or disable acceleration using 'DisableAccel = yes'.")
743 if (hm%exxop%useACE)
then
746 safe_allocate(ks%calc%hf_st)
755 if (hm%self_induced_magnetic)
then
756 safe_allocate(ks%calc%a_ind(1:ks%gr%np_part, 1:space%dim))
757 safe_allocate(ks%calc%b_ind(1:ks%gr%np_part, 1:space%dim))
758 call magnetic_induced(namespace, ks%gr, st, hm%psolver, hm%kpoints, ks%calc%a_ind, ks%calc%b_ind)
761 if ((ks%v_ks_photons%active()) .and. (ks%calc%time_present) .and. (ks%v_ks_photons%functional() == 0) )
then
762 call ks%v_ks_photons%mf_calc(ks%gr, st, ions, time)
780 safe_allocate(ks%calc%density(1:ks%gr%np, 1:st%d%nspin))
785 call lalg_scal(ks%gr%np, st%d%nspin, ks%sic%amaldi_factor, ks%calc%density)
797 if (
allocated(st%rho_core))
then
801 int(ks%gr%np, int64), st%rho_core)
803 if (
allocated(st%frozen_rho))
then
807 int(ks%gr%np, int64), int(st%d%nspin, int64), st%frozen_rho)
808 ks%xc%quantities%frozen_rho_np = ks%gr%np
811 ks%xc%quantities%amaldi_factor = ks%sic%amaldi_factor
815 nullify(ks%calc%total_density)
816 if (
allocated(st%rho_core) .or. hm%d%spin_channels > 1)
then
817 ks%calc%total_density_alloc = .
true.
819 safe_allocate(ks%calc%total_density(1:ks%gr%np))
822 ks%calc%total_density(ip) = sum(ks%calc%density(ip, 1:hm%d%spin_channels))
826 if (
allocated(st%rho_core))
then
827 call lalg_axpy(ks%gr%np, -ks%sic%amaldi_factor, st%rho_core, ks%calc%total_density)
830 ks%calc%total_density_alloc = .false.
831 ks%calc%total_density => ks%calc%density(:, 1)
838 subroutine v_a_xc(hm, force_semilocal)
840 logical,
optional,
intent(in) :: force_semilocal
845 ks%calc%energy%exchange =
m_zero
846 ks%calc%energy%correlation =
m_zero
847 ks%calc%energy%xc_j =
m_zero
848 ks%calc%energy%vdw =
m_zero
850 allocate(ks%calc%vxc(1:ks%gr%np, 1:st%d%nspin))
854 safe_allocate(ks%calc%vtau(1:ks%gr%np, 1:st%d%nspin))
859 if (ks%calc%calc_energy)
then
861 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
862 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
863 deltaxc = ks%calc%energy%delta_xc, vtau = ks%calc%vtau, force_orbitalfree=force_semilocal)
865 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
866 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
867 deltaxc = ks%calc%energy%delta_xc, stress_xc=ks%stress_xc_gga, force_orbitalfree=force_semilocal)
871 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
872 st%d%ispin, latt%rcell_volume, ks%calc%vxc, vtau = ks%calc%vtau, force_orbitalfree=force_semilocal)
874 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
875 st%d%ispin, latt%rcell_volume, ks%calc%vxc, stress_xc=ks%stress_xc_gga, force_orbitalfree=force_semilocal)
881 if (st%d%ispin /=
spinors)
then
882 message(1) =
"Noncollinear functionals can only be used with spinor wavefunctions."
887 message(1) =
"Cannot perform LCAO for noncollinear MGGAs."
888 message(2) =
"Please perform a LDA calculation first."
892 if (ks%calc%calc_energy)
then
894 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
895 vtau = ks%calc%vtau, 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, ks%calc%vxc, &
898 ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
902 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, &
903 ks%calc%vxc, vtau = ks%calc%vtau)
905 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc)
910 call ks%vdw%calc(namespace, space, latt, ions%atom, ions%natoms, ions%pos, &
911 ks%gr, st, ks%calc%energy%vdw, ks%calc%vxc)
924 if (ks%calc%calc_energy)
then
925 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
926 ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
928 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
940 call x_slater_calc(namespace, ks%gr, space, hm%exxop, st, hm%kpoints, ks%calc%energy%exchange, &
943 call x_fbe_calc(ks%xc%functional(
func_x,1)%id, namespace, hm%psolver, ks%sl_solver, ks%gr, st, space, &
944 ks%calc%energy%exchange, vxc = ks%calc%vxc)
948 call fbe_c_lda_sl(namespace, hm%psolver, ks%sl_solver, ks%gr, st, space, ks%calc%energy%correlation, vxc = ks%calc%vxc)
956 call xc_ks_inversion_calc(ks%ks_inversion, namespace, space, ks%gr, hm, ext_partners, st, vxc = ks%calc%vxc, &
961 if (ks%v_ks_photons%functional() /= 0)
then
962 call ks%v_ks_photons%add_px(namespace, ks%calc%total_density, ks%gr, space, hm%psolver, st, &
963 hm%d%spin_channels, ks%calc%vxc, ks%calc%energy%photon_exchange)
968 if (ks%calc%calc_energy)
then
981 subroutine v_ks_calc_finish(ks, hm, namespace, space, latt, st, ext_partners, force_semilocal)
982 type(
v_ks_t),
target,
intent(inout) :: ks
985 class(
space_t),
intent(in) :: space
989 logical,
optional,
intent(in) :: force_semilocal
994 real(real64) :: exx_energy
995 real(real64) :: factor
999 assert(ks%calc%calculating)
1000 ks%calc%calculating = .false.
1002 if (ks%frozen_hxc)
then
1008 safe_deallocate_a(hm%energy)
1009 call move_alloc(ks%calc%energy, hm%energy)
1011 if (hm%self_induced_magnetic)
then
1012 hm%a_ind(1:ks%gr%np, 1:space%dim) = ks%calc%a_ind(1:ks%gr%np, 1:space%dim)
1013 hm%b_ind(1:ks%gr%np, 1:space%dim) = ks%calc%b_ind(1:ks%gr%np, 1:space%dim)
1015 safe_deallocate_a(ks%calc%a_ind)
1016 safe_deallocate_a(ks%calc%b_ind)
1019 if (
allocated(hm%v_static))
then
1020 hm%energy%intnvstatic =
dmf_dotp(ks%gr, ks%calc%total_density, hm%v_static)
1022 hm%energy%intnvstatic =
m_zero
1028 hm%energy%intnvxc =
m_zero
1029 hm%energy%hartree =
m_zero
1030 hm%energy%exchange =
m_zero
1031 hm%energy%exchange_hf =
m_zero
1032 hm%energy%correlation =
m_zero
1035 hm%energy%hartree =
m_zero
1036 call v_ks_hartree(namespace, ks, space, hm, ext_partners)
1042 call dxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1043 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1045 call zxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1046 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1055 call dxc_oep_calc(ks%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%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1059 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1066 call ks%v_ks_photons%oep_calc(namespace, ks%xc, ks%gr, hm, st, space, ks%calc%vxc)
1070 if (ks%calc%calc_energy)
then
1072 hm%energy%intnvxc =
m_zero
1075 do ispin = 1, hm%d%nspin
1076 if (ispin <= 2)
then
1081 hm%energy%intnvxc = hm%energy%intnvxc + &
1082 factor*
dmf_dotp(ks%gr, st%rho(:, ispin), ks%calc%vxc(:, ispin), reduce = .false.)
1084 call ks%gr%allreduce(hm%energy%intnvxc)
1089 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
then
1091 safe_deallocate_a(hm%ks_pot%vxc)
1092 call move_alloc(ks%calc%vxc, hm%ks_pot%vxc)
1095 call hm%ks_pot%set_vtau(ks%calc%vtau)
1096 safe_deallocate_a(ks%calc%vtau)
1102 hm%energy%intnvxc = hm%energy%intnvxc &
1105 hm%energy%intnvxc = hm%energy%intnvxc &
1115 if (.not. ks%v_ks_photons%includes_hartree())
then
1116 hm%energy%hartree =
m_zero
1117 hm%ks_pot%vhartree =
m_zero
1123 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vxc(ip, 1) + hm%ks_pot%vhartree(ip)
1125 if (
allocated(hm%vberry))
then
1127 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vhxc(ip, 1) + hm%vberry(ip, 1)
1133 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vxc(ip, 2) + hm%ks_pot%vhartree(ip)
1135 if (
allocated(hm%vberry))
then
1137 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vhxc(ip, 2) + hm%vberry(ip, 2)
1142 if (hm%d%ispin ==
spinors)
then
1145 hm%ks_pot%vhxc(ip, ispin) = hm%ks_pot%vxc(ip, ispin)
1151 hm%energy%exchange_hf =
m_zero
1153 .or. ks%theory_level ==
rdmft &
1157 if (.not. hm%exxop%useACE)
then
1159 if (
associated(hm%exxop%st))
then
1162 safe_deallocate_p(hm%exxop%st)
1173 select case (ks%theory_level)
1187 if (hm%exxop%useACE)
then
1191 if (hm%exxop%with_isdf)
then
1194 call hm%exxop%isdf%get_interpolation_points(namespace, space, ks%gr, st%rho(1:ks%gr%np, 1))
1196 ks%calc%hf_st, xst, hm%kpoints)
1199 ks%calc%hf_st, xst, hm%kpoints)
1205 ks%calc%hf_st, xst, hm%kpoints)
1207 if (hm%phase%is_allocated())
then
1214 exx_energy = exx_energy + hm%exxop%singul%energy
1218 select case (ks%theory_level)
1221 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1224 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1242 if (ks%v_ks_photons%active() .and. (ks%v_ks_photons%functional() == 0))
then
1243 call ks%v_ks_photons%add_mf_potential(ks%gr, hm%ks_pot%vhxc, hm%d%ispin, hm%ep%photon_forces(1:space%dim))
1246 if (ks%vdw%vdw_correction /= option__vdwcorrection__none)
then
1247 assert(
allocated(ks%vdw%forces))
1248 hm%ep%vdw_forces(:, :) = ks%vdw%forces(:, :)
1249 hm%ep%vdw_stress = ks%vdw%stress
1250 safe_deallocate_a(ks%vdw%forces)
1252 hm%ep%vdw_forces = 0.0_real64
1255 if (ks%calc%time_present .or. hm%time_zero)
then
1256 call hm%update(ks%gr, namespace, space, ext_partners, time = ks%calc%time)
1262 safe_deallocate_a(ks%calc%density)
1263 if (ks%calc%total_density_alloc)
then
1264 safe_deallocate_p(ks%calc%total_density)
1266 nullify(ks%calc%total_density)
1280 class(
space_t),
intent(in ) :: space
1281 class(
mesh_t),
intent(in ) :: gr
1287 if (exxop%isdf%use_serial)
then
1289 hf_st, xst, kpoints)
1291 call isdf_parallel_ace_compute_potentials(exxop, namespace, space, gr, &
1292 hf_st, xst, kpoints)
1303 subroutine v_ks_hartree(namespace, ks, space, hm, ext_partners)
1305 type(
v_ks_t),
intent(inout) :: ks
1306 class(
space_t),
intent(in) :: space
1314 call dpoisson_solve(hm%psolver, namespace, hm%ks_pot%vhartree, ks%calc%total_density, reset=.false.)
1320 if (ks%calc%calc_energy)
then
1322 hm%energy%hartree =
m_half*
dmf_dotp(ks%gr, ks%calc%total_density, hm%ks_pot%vhartree)
1326 if(ks%calc%time_present)
then
1329 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick, time=ks%calc%time)
1332 ks%calc%total_density, hm%energy%pcm_corr, time=ks%calc%time)
1337 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick)
1340 ks%calc%total_density, hm%energy%pcm_corr)
1351 type(
v_ks_t),
intent(inout) :: ks
1355 ks%frozen_hxc = .
true.
1362 type(
v_ks_t),
intent(inout) :: this
1363 logical,
intent(in) :: calc_cur
1367 this%calculate_current = calc_cur
1374 type(
v_ks_t),
intent(inout) :: ks
1378 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()