38 use,
intrinsic :: iso_fortran_env
108 logical :: calculating
109 logical :: time_present
111 real(real64),
allocatable :: density(:, :)
112 logical :: total_density_alloc
113 real(real64),
pointer,
contiguous :: total_density(:)
114 type(energy_t),
allocatable :: energy
116 type(states_elec_t),
pointer :: hf_st
121 real(real64),
allocatable :: vxc(:, :)
122 real(real64),
allocatable :: vtau(:, :)
123 real(real64),
allocatable :: axc(:, :, :)
124 real(real64),
allocatable :: a_ind(:, :)
125 real(real64),
allocatable :: b_ind(:, :)
126 logical :: calc_energy
131 integer,
public :: theory_level = -1
132 logical,
public :: frozen_hxc = .false.
134 integer,
public :: xc_family = 0
135 integer,
public :: xc_flags = 0
136 type(xc_t),
public :: xc
137 type(xc_oep_t),
public :: oep
138 type(xc_ks_inversion_t),
public :: ks_inversion
139 type(xc_sic_t),
public :: sic
140 type(xc_vdw_t),
public :: vdw
141 type(grid_t),
pointer,
public :: gr
142 type(sturm_liouville_t),
public :: sl_solver
143 type(v_ks_calc_t) :: calc
144 logical :: calculate_current = .false.
145 type(current_t) :: current_calculator
146 logical :: include_td_field = .false.
149 real(real64),
public :: stress_xc(3, 3)
150 type(v_ks_photon_t),
public :: v_ks_photons
156 subroutine v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
157 type(v_ks_t),
intent(inout) :: ks
158 type(namespace_t),
intent(in) :: namespace
159 type(grid_t),
target,
intent(inout) :: gr
160 type(states_elec_t),
intent(in) :: st
161 type(ions_t),
intent(inout) :: ions
162 type(multicomm_t),
intent(in) :: mc
163 class(space_t),
intent(in) :: space
164 type(kpoints_t),
intent(in) :: kpoints
166 integer :: x_id, c_id, xk_id, ck_id, default, val
167 logical :: parsed_theory_level, using_hartree_fock
168 integer :: pseudo_x_functional, pseudo_c_functional
216 ks%xc_family = xc_family_none
221 parsed_theory_level = .false.
228 parsed_theory_level = .
true.
242 call messages_write(
'Info: the XCFunctional has been selected to match the pseudopotentials', new_line = .
true.)
257 call messages_write(
'The XCFunctional that you selected does not match the one used', new_line = .
true.)
290 call ks%v_ks_photons%init(namespace)
298 using_hartree_fock = (ks%theory_level ==
hartree_fock) &
300 call xc_init(ks%xc, namespace, space%dim, space%periodic_dim, st%qtot, &
301 x_id, c_id, xk_id, ck_id,
hartree_fock = using_hartree_fock, ispin=st%d%ispin)
303 ks%xc_family = ks%xc%family
304 ks%xc_flags = ks%xc%flags
306 if (.not. parsed_theory_level)
then
315 call parse_variable(namespace,
'TheoryLevel', default, ks%theory_level)
327 ks%xc_family = ior(ks%xc_family, xc_family_oep)
337 ks%sic%amaldi_factor =
m_one
339 select case (ks%theory_level)
344 if (space%periodic_dim == space%dim)
then
347 if (kpoints%full%npoints > 1)
then
352 if (kpoints%full%npoints > 1)
then
367 if (
bitand(ks%xc_family, xc_family_lda + xc_family_gga) /= 0)
then
368 call xc_sic_init(ks%sic, namespace, gr, st, mc, space)
371 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
372 select case (ks%xc%functional(
func_x,1)%id)
374 if (kpoints%reduced%npoints > 1 .and. st%d%ispin ==
spinors)
then
377 if (kpoints%use_symmetries)
then
382 if (kpoints%reduced%npoints > 1)
then
387 if((.not. ks%v_ks_photons%active()) .or. (ks%v_ks_photons%functional() /= 0))
then
388 if(oep_type == -1)
then
391 call xc_oep_init(ks%oep, namespace, gr, st, mc, space, oep_type)
405 message(1) =
"SICCorrection can only be used with Kohn-Sham DFT"
409 if (st%d%ispin ==
spinors)
then
410 if (
bitand(ks%xc_family, xc_family_mgga + xc_family_hyb_mgga) /= 0)
then
415 ks%frozen_hxc = .false.
420 ks%calc%calculating = .false.
425 call ks%vdw%init(namespace, space, gr, ks%xc, ions, x_id, c_id)
426 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level ==
rdmft)
then
427 message(1) =
"VDWCorrection and RDMFT are not compatible"
430 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level ==
independent_particles)
then
431 message(1) =
"VDWCorrection and independent particles are not compatible"
435 call ks%v_ks_photons%init_xc(namespace, space, gr, st)
447 integer,
intent(out) :: x_functional
448 integer,
intent(out) :: c_functional
450 integer :: xf, cf, ispecies
451 logical :: warned_inconsistent
456 warned_inconsistent = .false.
457 do ispecies = 1, ions%nspecies
458 select type(spec=>ions%species(ispecies)%s)
460 xf = spec%x_functional()
461 cf = spec%c_functional()
464 call messages_write(
"Unknown XC functional for species '"//trim(ions%species(ispecies)%s%get_label())//
"'")
472 if (xf /= x_functional .and. .not. warned_inconsistent)
then
473 call messages_write(
'Inconsistent XC functional detected between species')
475 warned_inconsistent = .
true.
482 if (cf /= c_functional .and. .not. warned_inconsistent)
then
483 call messages_write(
'Inconsistent XC functional detected between species')
485 warned_inconsistent = .
true.
505 type(
v_ks_t),
intent(inout) :: ks
512 select case (ks%theory_level)
517 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
527 call ks%v_ks_photons%end()
536 type(
v_ks_t),
intent(in) :: ks
537 integer,
optional,
intent(in) :: iunit
538 type(
namespace_t),
optional,
intent(in) :: namespace
545 select case (ks%theory_level)
570 subroutine v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
573 type(
grid_t),
intent(in) :: gr
574 type(
ions_t),
intent(in) :: ions
577 type(
v_ks_t),
intent(inout) :: ks
579 logical,
optional,
intent(in) :: calc_eigenval
580 logical,
optional,
intent(in) :: calc_current
582 integer,
allocatable :: ind(:)
584 real(real64),
allocatable :: copy_occ(:)
585 logical :: calc_eigenval_
586 logical :: calc_current_
594 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
595 calc_eigenval = calc_eigenval_, calc_current = calc_current_)
597 if (st%restart_reorder_occs .and. .not. st%fromScratch)
then
598 message(1) =
"Reordering occupations for restart."
601 safe_allocate(ind(1:st%nst))
602 safe_allocate(copy_occ(1:st%nst))
605 call sort(st%eigenval(:, ik), ind)
606 copy_occ(1:st%nst) = st%occ(1:st%nst, ik)
608 st%occ(ist, ik) = copy_occ(ind(ist))
612 safe_deallocate_a(ind)
613 safe_deallocate_a(copy_occ)
623 subroutine v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
624 calc_eigenval, time, calc_energy, calc_current, force_semilocal)
625 type(
v_ks_t),
intent(inout) :: ks
632 logical,
optional,
intent(in) :: calc_eigenval
633 real(real64),
optional,
intent(in) :: time
634 logical,
optional,
intent(in) :: calc_energy
635 logical,
optional,
intent(in) :: calc_current
636 logical,
optional,
intent(in) :: force_semilocal
638 logical :: calc_current_
643 .and. (ks%calculate_current &
647 if (calc_current_)
then
652 call v_ks_calc_start(ks, namespace, space, hm, st, ions, hm%kpoints%latt, ext_partners, time, &
653 calc_energy, force_semilocal=force_semilocal)
655 ext_partners, force_semilocal=force_semilocal)
666 call lalg_axpy(ks%gr%np, st%d%nspin,
m_one, hm%magnetic_constrain%pot, hm%ks_pot%vhxc)
678 subroutine v_ks_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, &
679 calc_energy, force_semilocal)
680 type(
v_ks_t),
target,
intent(inout) :: ks
682 class(
space_t),
intent(in) :: space
685 type(
ions_t),
intent(in) :: ions
688 real(real64),
optional,
intent(in) :: time
689 logical,
optional,
intent(in) :: calc_energy
690 logical,
optional,
intent(in) :: force_semilocal
696 assert(.not. ks%calc%calculating)
697 ks%calc%calculating = .
true.
699 write(
message(1),
'(a)')
'Debug: Calculating Kohn-Sham potential.'
702 ks%calc%time_present =
present(time)
708 if (ks%frozen_hxc)
then
714 allocate(ks%calc%energy)
720 nullify(ks%calc%total_density)
730 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
call v_a_xc(hm, force_semilocal)
732 ks%calc%total_density_alloc = .false.
739 nullify(ks%calc%hf_st)
744 if (st%parallel_in_states)
then
746 call messages_write(
'State parallelization of Hartree-Fock exchange is not supported')
748 call messages_write(
'when running with GPUs. Please use domain parallelization')
750 call messages_write(
"or disable acceleration using 'DisableAccel = yes'.")
755 if (hm%exxop%useACE)
then
758 safe_allocate(ks%calc%hf_st)
767 if (hm%self_induced_magnetic)
then
768 safe_allocate(ks%calc%a_ind(1:ks%gr%np_part, 1:space%dim))
769 safe_allocate(ks%calc%b_ind(1:ks%gr%np_part, 1:space%dim))
770 call magnetic_induced(namespace, ks%gr, st, hm%psolver, hm%kpoints, ks%calc%a_ind, ks%calc%b_ind)
773 if ((ks%v_ks_photons%active()) .and. (ks%calc%time_present) .and. (ks%v_ks_photons%functional() == 0) )
then
774 call ks%v_ks_photons%mf_calc(ks%gr, st, ions, time)
792 safe_allocate(ks%calc%density(1:ks%gr%np, 1:st%d%nspin))
797 call lalg_scal(ks%gr%np, st%d%nspin, ks%sic%amaldi_factor, ks%calc%density)
809 if (
allocated(st%rho_core))
then
813 int(ks%gr%np, int64), st%rho_core)
815 if (
allocated(st%frozen_rho))
then
819 int(ks%gr%np, int64), int(st%d%nspin, int64), st%frozen_rho)
820 ks%xc%quantities%frozen_rho_np = ks%gr%np
823 ks%xc%quantities%amaldi_factor = ks%sic%amaldi_factor
827 nullify(ks%calc%total_density)
828 if (
allocated(st%rho_core) .or. hm%d%spin_channels > 1)
then
829 ks%calc%total_density_alloc = .
true.
831 safe_allocate(ks%calc%total_density(1:ks%gr%np))
834 ks%calc%total_density(ip) = sum(ks%calc%density(ip, 1:hm%d%spin_channels))
838 if (
allocated(st%rho_core))
then
839 call lalg_axpy(ks%gr%np, -ks%sic%amaldi_factor, st%rho_core, ks%calc%total_density)
842 ks%calc%total_density_alloc = .false.
843 ks%calc%total_density => ks%calc%density(:, 1)
850 subroutine v_a_xc(hm, force_semilocal)
852 logical,
optional,
intent(in) :: force_semilocal
857 ks%calc%energy%exchange =
m_zero
858 ks%calc%energy%correlation =
m_zero
859 ks%calc%energy%xc_j =
m_zero
860 ks%calc%energy%vdw =
m_zero
862 allocate(ks%calc%vxc(1:ks%gr%np, 1:st%d%nspin))
866 safe_allocate(ks%calc%vtau(1:ks%gr%np, 1:st%d%nspin))
871 if (ks%calc%calc_energy)
then
873 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
874 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
875 deltaxc = ks%calc%energy%delta_xc, vtau = ks%calc%vtau, stress_xc=ks%stress_xc, &
876 force_orbitalfree=force_semilocal)
878 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
879 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
880 deltaxc = ks%calc%energy%delta_xc, stress_xc=ks%stress_xc, force_orbitalfree=force_semilocal)
884 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
885 st%d%ispin, latt%rcell_volume, ks%calc%vxc, vtau = ks%calc%vtau, stress_xc=ks%stress_xc, &
886 force_orbitalfree=force_semilocal)
888 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
889 st%d%ispin, latt%rcell_volume, ks%calc%vxc, stress_xc=ks%stress_xc, force_orbitalfree=force_semilocal)
895 if (st%d%ispin /=
spinors)
then
896 message(1) =
"Noncollinear functionals can only be used with spinor wavefunctions."
901 message(1) =
"Cannot perform LCAO for noncollinear MGGAs."
902 message(2) =
"Please perform a LDA calculation first."
906 if (ks%calc%calc_energy)
then
908 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
909 vtau = ks%calc%vtau, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
911 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
912 ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
916 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, &
917 ks%calc%vxc, vtau = ks%calc%vtau)
919 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc)
924 call ks%vdw%calc(namespace, space, latt, ions%atom, ions%natoms, ions%pos, &
925 ks%gr, st, ks%calc%energy%vdw, ks%calc%vxc)
938 if (ks%calc%calc_energy)
then
939 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
940 ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
942 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
954 call x_slater_calc(namespace, ks%gr, space, hm%exxop, st, hm%kpoints, ks%calc%energy%exchange, &
957 call x_fbe_calc(ks%xc%functional(
func_x,1)%id, namespace, hm%psolver, ks%sl_solver, ks%gr, st, space, &
958 ks%calc%energy%exchange, vxc = ks%calc%vxc)
962 call fbe_c_lda_sl(namespace, hm%psolver, ks%sl_solver, ks%gr, st, space, ks%calc%energy%correlation, vxc = ks%calc%vxc)
970 call xc_ks_inversion_calc(ks%ks_inversion, namespace, space, ks%gr, hm, ext_partners, st, vxc = ks%calc%vxc, &
975 if (ks%v_ks_photons%functional() /= 0)
then
976 call ks%v_ks_photons%add_px(namespace, ks%calc%total_density, ks%gr, space, hm%psolver, st, &
977 hm%d%spin_channels, ks%calc%vxc, ks%calc%energy%photon_exchange)
982 if (ks%calc%calc_energy)
then
995 subroutine v_ks_calc_finish(ks, hm, namespace, space, latt, st, ext_partners, force_semilocal)
996 type(
v_ks_t),
target,
intent(inout) :: ks
999 class(
space_t),
intent(in) :: space
1003 logical,
optional,
intent(in) :: force_semilocal
1005 integer :: ip, ispin
1008 real(real64) :: exx_energy
1009 real(real64) :: factor
1013 assert(ks%calc%calculating)
1014 ks%calc%calculating = .false.
1016 if (ks%frozen_hxc)
then
1022 safe_deallocate_a(hm%energy)
1023 call move_alloc(ks%calc%energy, hm%energy)
1025 if (hm%self_induced_magnetic)
then
1026 hm%a_ind(1:ks%gr%np, 1:space%dim) = ks%calc%a_ind(1:ks%gr%np, 1:space%dim)
1027 hm%b_ind(1:ks%gr%np, 1:space%dim) = ks%calc%b_ind(1:ks%gr%np, 1:space%dim)
1029 safe_deallocate_a(ks%calc%a_ind)
1030 safe_deallocate_a(ks%calc%b_ind)
1033 if (
allocated(hm%v_static))
then
1034 if (
associated(ks%calc%total_density))
then
1035 hm%energy%intnvstatic =
dmf_dotp(ks%gr, ks%calc%total_density, hm%v_static)
1038 hm%energy%intnvstatic =
m_zero
1039 do ispin = 1, hm%d%spin_channels
1040 hm%energy%intnvstatic = hm%energy%intnvstatic +
dmf_dotp(ks%gr, st%rho(:, ispin), hm%v_static)
1044 hm%energy%intnvstatic =
m_zero
1050 hm%energy%intnvxc =
m_zero
1051 hm%energy%hartree =
m_zero
1052 hm%energy%exchange =
m_zero
1053 hm%energy%exchange_hf =
m_zero
1054 hm%energy%correlation =
m_zero
1057 hm%energy%hartree =
m_zero
1058 call v_ks_hartree(namespace, ks, space, hm, ext_partners)
1064 call dxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1065 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1067 call zxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1068 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1077 call dxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1078 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1080 call zxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1081 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1088 call ks%v_ks_photons%oep_calc(namespace, ks%xc, ks%gr, hm, st, space, ks%calc%vxc)
1092 if (ks%calc%calc_energy)
then
1094 hm%energy%intnvxc =
m_zero
1097 do ispin = 1, hm%d%nspin
1098 if (ispin <= 2)
then
1103 hm%energy%intnvxc = hm%energy%intnvxc + &
1104 factor*
dmf_dotp(ks%gr, st%rho(:, ispin), ks%calc%vxc(:, ispin), reduce = .false.)
1106 call ks%gr%allreduce(hm%energy%intnvxc)
1111 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
then
1113 safe_deallocate_a(hm%ks_pot%vxc)
1114 call move_alloc(ks%calc%vxc, hm%ks_pot%vxc)
1117 call hm%ks_pot%set_vtau(ks%calc%vtau)
1118 safe_deallocate_a(ks%calc%vtau)
1124 hm%energy%intnvxc = hm%energy%intnvxc &
1127 hm%energy%intnvxc = hm%energy%intnvxc &
1137 if (.not. ks%v_ks_photons%includes_hartree())
then
1138 hm%energy%hartree =
m_zero
1139 hm%ks_pot%vhartree =
m_zero
1145 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vxc(ip, 1) + hm%ks_pot%vhartree(ip)
1147 if (
allocated(hm%vberry))
then
1149 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vhxc(ip, 1) + hm%vberry(ip, 1)
1155 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vxc(ip, 2) + hm%ks_pot%vhartree(ip)
1157 if (
allocated(hm%vberry))
then
1159 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vhxc(ip, 2) + hm%vberry(ip, 2)
1164 if (hm%d%ispin ==
spinors)
then
1167 hm%ks_pot%vhxc(ip, ispin) = hm%ks_pot%vxc(ip, ispin)
1173 hm%energy%exchange_hf =
m_zero
1175 .or. ks%theory_level ==
rdmft &
1179 if (.not. hm%exxop%useACE)
then
1181 if (
associated(hm%exxop%st))
then
1184 safe_deallocate_p(hm%exxop%st)
1195 select case (ks%theory_level)
1209 if (hm%exxop%useACE)
then
1213 if (hm%exxop%with_isdf)
then
1216 call hm%exxop%isdf%get_interpolation_points(namespace, space, ks%gr, st%rho(1:ks%gr%np, 1))
1218 ks%calc%hf_st, xst, hm%kpoints)
1221 ks%calc%hf_st, xst, hm%kpoints)
1227 ks%calc%hf_st, xst, hm%kpoints)
1229 if (hm%phase%is_allocated())
then
1236 exx_energy = exx_energy + hm%exxop%singul%energy
1240 select case (ks%theory_level)
1243 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1246 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1264 if (ks%v_ks_photons%active() .and. (ks%v_ks_photons%functional() == 0))
then
1265 call ks%v_ks_photons%add_mf_potential(ks%gr, hm%ks_pot%vhxc, hm%d%ispin, hm%ep%photon_forces(1:space%dim))
1268 if (ks%vdw%vdw_correction /= option__vdwcorrection__none)
then
1269 assert(
allocated(ks%vdw%forces))
1270 hm%ep%vdw_forces(:, :) = ks%vdw%forces(:, :)
1271 hm%ep%vdw_stress = ks%vdw%stress
1272 safe_deallocate_a(ks%vdw%forces)
1274 hm%ep%vdw_forces = 0.0_real64
1277 if (ks%calc%time_present .or. hm%time_zero)
then
1278 call hm%update(ks%gr, namespace, space, ext_partners, time = ks%calc%time)
1284 safe_deallocate_a(ks%calc%density)
1285 if (ks%calc%total_density_alloc)
then
1286 safe_deallocate_p(ks%calc%total_density)
1288 nullify(ks%calc%total_density)
1302 class(
space_t),
intent(in ) :: space
1303 class(
mesh_t),
intent(in ) :: gr
1309 if (exxop%isdf%use_serial)
then
1311 hf_st, xst, kpoints)
1313 call isdf_parallel_ace_compute_potentials(exxop, namespace, space, gr, &
1314 hf_st, xst, kpoints)
1325 subroutine v_ks_hartree(namespace, ks, space, hm, ext_partners)
1327 type(
v_ks_t),
intent(inout) :: ks
1328 class(
space_t),
intent(in) :: space
1336 call dpoisson_solve(hm%psolver, namespace, hm%ks_pot%vhartree, ks%calc%total_density, reset=.false.)
1342 if (ks%calc%calc_energy)
then
1344 hm%energy%hartree =
m_half*
dmf_dotp(ks%gr, ks%calc%total_density, hm%ks_pot%vhartree)
1348 if(ks%calc%time_present)
then
1351 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick, time=ks%calc%time)
1354 ks%calc%total_density, hm%energy%pcm_corr, time=ks%calc%time)
1359 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick)
1362 ks%calc%total_density, hm%energy%pcm_corr)
1373 type(
v_ks_t),
intent(inout) :: ks
1377 ks%frozen_hxc = .
true.
1384 type(
v_ks_t),
intent(inout) :: this
1385 logical,
intent(in) :: calc_cur
1389 this%calculate_current = calc_cur
1396 type(
v_ks_t),
intent(inout) :: ks
1400 real(real64),
intent(out) :: int_dft_u
1419 type(
v_ks_t),
intent(in) :: ks
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.
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, dest_type, copy_data)
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.
logical function, public v_ks_is_orbital_dependent(ks)
Is the theory method and functional orbital-dependent?
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 libxc_c_index
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.
logical pure function, public xc_is_orbital_dependent(xcs)
Is the xc family orbital dependent.
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()