38 use,
intrinsic :: iso_fortran_env
109 logical :: calculating
110 logical :: time_present
112 real(real64),
allocatable :: density(:, :)
113 logical :: total_density_alloc
114 real(real64),
pointer,
contiguous :: total_density(:)
115 type(energy_t),
allocatable :: energy
117 type(states_elec_t),
pointer :: hf_st
122 real(real64),
allocatable :: vxc(:, :)
123 real(real64),
allocatable :: vtau(:, :)
124 real(real64),
allocatable :: axc(:, :, :)
125 real(real64),
allocatable :: a_ind(:, :)
126 real(real64),
allocatable :: b_ind(:, :)
127 logical :: calc_energy
132 integer,
public :: theory_level = -1
133 logical,
public :: frozen_hxc = .false.
135 integer,
public :: xc_family = 0
136 integer,
public :: xc_flags = 0
137 type(xc_t),
public :: xc
138 type(xc_oep_t),
public :: oep
139 type(xc_ks_inversion_t),
public :: ks_inversion
140 type(xc_sic_t),
public :: sic
141 type(xc_vdw_t),
public :: vdw
142 type(grid_t),
pointer,
public :: gr
143 type(sturm_liouville_t),
public :: sl_solver
144 type(v_ks_calc_t) :: calc
145 logical :: calculate_current = .false.
146 type(current_t) :: current_calculator
147 logical :: include_td_field = .false.
150 real(real64),
public :: stress_xc(3, 3)
151 type(v_ks_photon_t),
public :: v_ks_photons
157 subroutine v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
158 type(v_ks_t),
intent(inout) :: ks
159 type(namespace_t),
intent(in) :: namespace
160 type(grid_t),
target,
intent(inout) :: gr
161 type(states_elec_t),
intent(in) :: st
162 type(ions_t),
intent(inout) :: ions
163 type(multicomm_t),
intent(in) :: mc
164 class(space_t),
intent(in) :: space
165 type(kpoints_t),
intent(in) :: kpoints
167 integer :: x_id, c_id, xk_id, ck_id, default, val
168 logical :: parsed_theory_level, using_hartree_fock
169 integer :: pseudo_x_functional, pseudo_c_functional
217 ks%xc_family = xc_family_none
222 parsed_theory_level = .false.
243 call messages_write(
'Info: the XCFunctional has been selected to match the pseudopotentials', new_line = .
true.)
258 call messages_write(
'The XCFunctional that you selected does not match the one used', new_line = .
true.)
291 call ks%v_ks_photons%init(namespace)
299 using_hartree_fock = (ks%theory_level ==
hartree_fock) &
301 call xc_init(ks%xc, namespace, space%dim, space%periodic_dim, st%qtot, &
302 x_id, c_id, xk_id, ck_id,
hartree_fock = using_hartree_fock, ispin=st%d%ispin)
304 ks%xc_family = ks%xc%family
305 ks%xc_flags = ks%xc%flags
307 if (.not. parsed_theory_level)
then
316 call parse_variable(namespace,
'TheoryLevel', default, ks%theory_level)
328 ks%xc_family = ior(ks%xc_family, xc_family_oep)
338 ks%sic%amaldi_factor =
m_one
340 select case (ks%theory_level)
345 if (space%periodic_dim == space%dim)
then
348 if (kpoints%full%npoints > 1)
then
353 if (kpoints%full%npoints > 1)
then
368 if (
bitand(ks%xc_family, xc_family_lda + xc_family_gga) /= 0)
then
369 call xc_sic_init(ks%sic, namespace, gr, st, mc, space)
372 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
373 select case (ks%xc%functional(
func_x,1)%id)
375 if (kpoints%reduced%npoints > 1 .and. st%d%ispin ==
spinors)
then
378 if (kpoints%use_symmetries)
then
383 if (kpoints%reduced%npoints > 1)
then
388 if((.not. ks%v_ks_photons%active()) .or. (ks%v_ks_photons%functional() /= 0))
then
389 if(oep_type == -1)
then
392 call xc_oep_init(ks%oep, namespace, gr, st, mc, space, oep_type)
406 message(1) =
"SICCorrection can only be used with Kohn-Sham DFT"
410 if (st%d%ispin ==
spinors)
then
411 if (
bitand(ks%xc_family, xc_family_mgga + xc_family_hyb_mgga) /= 0)
then
416 ks%frozen_hxc = .false.
421 ks%calc%calculating = .false.
426 call ks%vdw%init(namespace, space, gr, ks%xc, ions, x_id, c_id)
427 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level ==
rdmft)
then
428 message(1) =
"VDWCorrection and RDMFT are not compatible"
431 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level ==
independent_particles)
then
432 message(1) =
"VDWCorrection and independent particles are not compatible"
436 call ks%v_ks_photons%init_xc(namespace, space, gr, st)
448 integer,
intent(out) :: x_functional
449 integer,
intent(out) :: c_functional
451 integer :: xf, cf, ispecies
452 logical :: warned_inconsistent
457 warned_inconsistent = .false.
458 do ispecies = 1, ions%nspecies
459 select type(spec=>ions%species(ispecies)%s)
461 xf = spec%x_functional()
462 cf = spec%c_functional()
465 call messages_write(
"Unknown XC functional for species '"//trim(ions%species(ispecies)%s%get_label())//
"'")
473 if (xf /= x_functional .and. .not. warned_inconsistent)
then
474 call messages_write(
'Inconsistent XC functional detected between species')
476 warned_inconsistent = .
true.
483 if (cf /= c_functional .and. .not. warned_inconsistent)
then
484 call messages_write(
'Inconsistent XC functional detected between species')
486 warned_inconsistent = .
true.
506 type(
v_ks_t),
intent(inout) :: ks
513 select case (ks%theory_level)
518 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
528 call ks%v_ks_photons%end()
537 type(
v_ks_t),
intent(in) :: ks
538 integer,
optional,
intent(in) :: iunit
539 type(
namespace_t),
optional,
intent(in) :: namespace
546 select case (ks%theory_level)
593 type(
v_ks_t),
intent(in) :: ks
600 if (st%requires_generalized_overlap)
then
603 "Spin-polarized calculations with ultrasoft/PAW (the screened D_ij is not spin resolved)", &
606 if (st%d%ispin ==
spinors)
then
608 "Noncollinear (spinor) calculations with ultrasoft/PAW", namespace=namespace)
612 "meta-GGA with ultrasoft/PAW (the kinetic-energy-density augmentation is missing)", &
617 "Hartree-Fock / hybrid functionals with ultrasoft/PAW (exact-exchange augmentation is missing)", &
622 "PZ-SIC / OEP with ultrasoft/PAW (orbital-resolved augmentation is missing)", &
627 "DFT+U with ultrasoft/PAW (the occupation matrix needs the S-augmented projection)", &
638 subroutine v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
641 type(
grid_t),
intent(in) :: gr
642 type(
ions_t),
intent(in) :: ions
645 type(
v_ks_t),
intent(inout) :: ks
647 logical,
optional,
intent(in) :: calc_eigenval
648 logical,
optional,
intent(in) :: calc_current
650 integer,
allocatable :: ind(:)
652 real(real64),
allocatable :: copy_occ(:)
653 logical :: calc_eigenval_
654 logical :: calc_current_
661 call density_calc(st, gr, st%rho, ep = hm%ep, vnl = hm%uspp_overlap, phase = hm%phase)
662 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
663 calc_eigenval = calc_eigenval_, calc_current = calc_current_)
665 if (st%restart_reorder_occs .and. .not. st%fromScratch)
then
666 message(1) =
"Reordering occupations for restart."
669 safe_allocate(ind(1:st%nst))
670 safe_allocate(copy_occ(1:st%nst))
673 call sort(st%eigenval(:,
ik), ind)
674 copy_occ(1:st%nst) = st%occ(1:st%nst,
ik)
676 st%occ(ist,
ik) = copy_occ(ind(ist))
680 safe_deallocate_a(ind)
681 safe_deallocate_a(copy_occ)
691 subroutine v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
692 calc_eigenval, time, calc_energy, calc_current, force_semilocal)
693 type(
v_ks_t),
intent(inout) :: ks
698 type(
ions_t),
intent(in) :: ions
700 logical,
optional,
intent(in) :: calc_eigenval
701 real(real64),
optional,
intent(in) :: time
702 logical,
optional,
intent(in) :: calc_energy
703 logical,
optional,
intent(in) :: calc_current
704 logical,
optional,
intent(in) :: force_semilocal
706 logical :: calc_current_
711 .and. (ks%calculate_current &
715 if (calc_current_)
then
720 call v_ks_calc_start(ks, namespace, space, hm, st, ions, hm%kpoints%latt, ext_partners, time, &
721 calc_energy, force_semilocal=force_semilocal)
723 ext_partners, force_semilocal=force_semilocal)
734 call lalg_axpy(ks%gr%np, st%d%nspin,
m_one, hm%magnetic_constrain%pot, hm%ks_pot%vhxc)
746 subroutine v_ks_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, &
747 calc_energy, force_semilocal)
748 type(
v_ks_t),
target,
intent(inout) :: ks
750 class(
space_t),
intent(in) :: space
753 type(
ions_t),
intent(in) :: ions
756 real(real64),
optional,
intent(in) :: time
757 logical,
optional,
intent(in) :: calc_energy
758 logical,
optional,
intent(in) :: force_semilocal
764 assert(.not. ks%calc%calculating)
765 ks%calc%calculating = .
true.
767 write(
message(1),
'(a)')
'Debug: Calculating Kohn-Sham potential.'
770 ks%calc%time_present =
present(time)
776 if (ks%frozen_hxc)
then
782 allocate(ks%calc%energy)
786 ks%calc%energy%intnvxc =
m_zero
788 nullify(ks%calc%total_density)
798 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
call v_a_xc(hm, force_semilocal)
800 ks%calc%total_density_alloc = .false.
807 nullify(ks%calc%hf_st)
812 if (st%parallel_in_states)
then
814 call messages_write(
'State parallelization of Hartree-Fock exchange is not supported')
816 call messages_write(
'when running with GPUs. Please use domain parallelization')
818 call messages_write(
"or disable acceleration using 'DisableAccel = yes'.")
823 if (hm%exxop%useACE)
then
826 safe_allocate(ks%calc%hf_st)
835 if (hm%self_induced_magnetic)
then
836 safe_allocate(ks%calc%a_ind(1:ks%gr%np_part, 1:space%dim))
837 safe_allocate(ks%calc%b_ind(1:ks%gr%np_part, 1:space%dim))
838 call magnetic_induced(namespace, ks%gr, st, hm%psolver, hm%kpoints, ks%calc%a_ind, ks%calc%b_ind)
841 if ((ks%v_ks_photons%active()) .and. (ks%calc%time_present) .and. (ks%v_ks_photons%functional() == 0) )
then
842 call ks%v_ks_photons%mf_calc(ks%gr, st, ions, time)
860 safe_allocate(ks%calc%density(1:ks%gr%np, 1:st%d%nspin))
865 call lalg_scal(ks%gr%np, st%d%nspin, ks%sic%amaldi_factor, ks%calc%density)
877 if (
allocated(st%rho_core))
then
881 int(ks%gr%np, int64), st%rho_core)
883 if (
allocated(st%frozen_rho))
then
887 int(ks%gr%np, int64), int(st%d%nspin, int64), st%frozen_rho)
888 ks%xc%quantities%frozen_rho_np = ks%gr%np
891 ks%xc%quantities%amaldi_factor = ks%sic%amaldi_factor
895 nullify(ks%calc%total_density)
896 if (
allocated(st%rho_core) .or. hm%d%spin_channels > 1)
then
897 ks%calc%total_density_alloc = .
true.
899 safe_allocate(ks%calc%total_density(1:ks%gr%np))
902 ks%calc%total_density(ip) = sum(ks%calc%density(ip, 1:hm%d%spin_channels))
906 if (
allocated(st%rho_core))
then
907 call lalg_axpy(ks%gr%np, -ks%sic%amaldi_factor, st%rho_core, ks%calc%total_density)
910 ks%calc%total_density_alloc = .false.
911 ks%calc%total_density => ks%calc%density(:, 1)
918 subroutine v_a_xc(hm, force_semilocal)
920 logical,
optional,
intent(in) :: force_semilocal
925 ks%calc%energy%exchange =
m_zero
926 ks%calc%energy%correlation =
m_zero
927 ks%calc%energy%xc_j =
m_zero
928 ks%calc%energy%vdw =
m_zero
930 allocate(ks%calc%vxc(1:ks%gr%np, 1:st%d%nspin))
934 safe_allocate(ks%calc%vtau(1:ks%gr%np, 1:st%d%nspin))
939 if (ks%calc%calc_energy)
then
941 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
942 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
943 deltaxc = ks%calc%energy%delta_xc, vtau = ks%calc%vtau, stress_xc=ks%stress_xc, &
944 force_orbitalfree=force_semilocal)
946 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
947 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
948 deltaxc = ks%calc%energy%delta_xc, stress_xc=ks%stress_xc, force_orbitalfree=force_semilocal)
952 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
953 st%d%ispin, latt%rcell_volume, ks%calc%vxc, vtau = ks%calc%vtau, stress_xc=ks%stress_xc, &
954 force_orbitalfree=force_semilocal)
956 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
957 st%d%ispin, latt%rcell_volume, ks%calc%vxc, stress_xc=ks%stress_xc, force_orbitalfree=force_semilocal)
963 if (st%d%ispin /=
spinors)
then
964 message(1) =
"Noncollinear functionals can only be used with spinor wavefunctions."
969 message(1) =
"Cannot perform LCAO for noncollinear MGGAs."
970 message(2) =
"Please perform a LDA calculation first."
974 if (ks%calc%calc_energy)
then
976 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
977 vtau = ks%calc%vtau, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
979 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
980 ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
984 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, &
985 ks%calc%vxc, vtau = ks%calc%vtau)
987 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc)
992 call ks%vdw%calc(namespace, space, latt, ions%atom, ions%natoms, ions%pos, &
993 ks%gr, st, ks%calc%energy%vdw, ks%calc%vxc)
1006 if (ks%calc%calc_energy)
then
1007 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
1008 ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
1010 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
1022 call x_slater_calc(namespace, ks%gr, space, hm%exxop, st, hm%kpoints, ks%calc%energy%exchange, &
1025 call x_fbe_calc(ks%xc%functional(
func_x,1)%id, namespace, hm%psolver, ks%sl_solver, ks%gr, st, space, &
1026 ks%calc%energy%exchange, vxc = ks%calc%vxc)
1030 call fbe_c_lda_sl(namespace, hm%psolver, ks%sl_solver, ks%gr, st, space, ks%calc%energy%correlation, vxc = ks%calc%vxc)
1038 call xc_ks_inversion_calc(ks%ks_inversion, namespace, space, ks%gr, hm, ext_partners, st, vxc = ks%calc%vxc, &
1039 time = ks%calc%time)
1043 if (ks%v_ks_photons%functional() /= 0)
then
1044 call ks%v_ks_photons%add_px(namespace, ks%calc%total_density, ks%gr, space, hm%psolver, st, &
1045 hm%d%spin_channels, ks%calc%vxc, ks%calc%energy%photon_exchange)
1050 if (ks%calc%calc_energy)
then
1063 subroutine v_ks_calc_finish(ks, hm, namespace, space, latt, st, ext_partners, force_semilocal)
1064 type(
v_ks_t),
target,
intent(inout) :: ks
1067 class(
space_t),
intent(in) :: space
1071 logical,
optional,
intent(in) :: force_semilocal
1073 integer :: ip, ispin
1076 real(real64) :: exx_energy
1077 real(real64) :: factor
1081 assert(ks%calc%calculating)
1082 ks%calc%calculating = .false.
1084 if (ks%frozen_hxc)
then
1090 safe_deallocate_a(hm%energy)
1091 call move_alloc(ks%calc%energy, hm%energy)
1093 if (hm%self_induced_magnetic)
then
1094 hm%a_ind(1:ks%gr%np, 1:space%dim) = ks%calc%a_ind(1:ks%gr%np, 1:space%dim)
1095 hm%b_ind(1:ks%gr%np, 1:space%dim) = ks%calc%b_ind(1:ks%gr%np, 1:space%dim)
1097 safe_deallocate_a(ks%calc%a_ind)
1098 safe_deallocate_a(ks%calc%b_ind)
1101 if (
allocated(hm%v_static))
then
1102 if (
associated(ks%calc%total_density))
then
1103 hm%energy%intnvstatic =
dmf_dotp(ks%gr, ks%calc%total_density, hm%v_static)
1106 hm%energy%intnvstatic =
m_zero
1107 do ispin = 1, hm%d%spin_channels
1108 hm%energy%intnvstatic = hm%energy%intnvstatic +
dmf_dotp(ks%gr, st%rho(:, ispin), hm%v_static)
1112 hm%energy%intnvstatic =
m_zero
1118 hm%energy%intnvxc =
m_zero
1119 hm%energy%hartree =
m_zero
1120 hm%energy%exchange =
m_zero
1121 hm%energy%exchange_hf =
m_zero
1122 hm%energy%correlation =
m_zero
1125 hm%energy%hartree =
m_zero
1126 call v_ks_hartree(namespace, ks, space, hm, ext_partners)
1132 call dxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1133 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1135 call zxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1136 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1145 call dxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1146 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1148 call zxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1149 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1156 call ks%v_ks_photons%oep_calc(namespace, ks%xc, ks%gr, hm, st, space, ks%calc%vxc)
1160 if (ks%calc%calc_energy)
then
1162 hm%energy%intnvxc =
m_zero
1165 do ispin = 1, hm%d%nspin
1166 if (ispin <= 2)
then
1171 hm%energy%intnvxc = hm%energy%intnvxc + &
1172 factor*
dmf_dotp(ks%gr, st%rho(:, ispin), ks%calc%vxc(:, ispin), reduce = .false.)
1174 call ks%gr%allreduce(hm%energy%intnvxc)
1179 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
then
1181 safe_deallocate_a(hm%ks_pot%vxc)
1182 call move_alloc(ks%calc%vxc, hm%ks_pot%vxc)
1185 call hm%ks_pot%set_vtau(ks%calc%vtau)
1186 safe_deallocate_a(ks%calc%vtau)
1192 hm%energy%intnvxc = hm%energy%intnvxc &
1195 hm%energy%intnvxc = hm%energy%intnvxc &
1205 if (.not. ks%v_ks_photons%includes_hartree())
then
1206 hm%energy%hartree =
m_zero
1207 hm%ks_pot%vhartree =
m_zero
1213 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vxc(ip, 1) + hm%ks_pot%vhartree(ip)
1215 if (
allocated(hm%vberry))
then
1217 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vhxc(ip, 1) + hm%vberry(ip, 1)
1223 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vxc(ip, 2) + hm%ks_pot%vhartree(ip)
1225 if (
allocated(hm%vberry))
then
1227 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vhxc(ip, 2) + hm%vberry(ip, 2)
1232 if (hm%d%ispin ==
spinors)
then
1235 hm%ks_pot%vhxc(ip, ispin) = hm%ks_pot%vxc(ip, ispin)
1241 hm%energy%exchange_hf =
m_zero
1243 .or. ks%theory_level ==
rdmft &
1247 if (.not. hm%exxop%useACE)
then
1249 if (
associated(hm%exxop%st))
then
1252 safe_deallocate_p(hm%exxop%st)
1263 select case (ks%theory_level)
1277 if (hm%exxop%useACE)
then
1281 if (hm%exxop%with_isdf)
then
1284 call hm%exxop%isdf%get_interpolation_points(namespace, space, ks%gr, st%rho(1:ks%gr%np, 1))
1286 ks%calc%hf_st, xst, hm%kpoints)
1289 ks%calc%hf_st, xst, hm%kpoints)
1295 ks%calc%hf_st, xst, hm%kpoints)
1297 if (hm%phase%is_allocated())
then
1304 exx_energy = exx_energy + hm%exxop%singul%energy
1308 select case (ks%theory_level)
1311 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1314 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1332 if (ks%v_ks_photons%active() .and. (ks%v_ks_photons%functional() == 0))
then
1333 call ks%v_ks_photons%add_mf_potential(ks%gr, hm%ks_pot%vhxc, hm%d%ispin, hm%ep%photon_forces(1:space%dim))
1336 if (ks%vdw%vdw_correction /= option__vdwcorrection__none)
then
1337 assert(
allocated(ks%vdw%forces))
1338 hm%ep%vdw_forces(:, :) = ks%vdw%forces(:, :)
1339 hm%ep%vdw_stress = ks%vdw%stress
1340 safe_deallocate_a(ks%vdw%forces)
1342 hm%ep%vdw_forces = 0.0_real64
1345 if (ks%calc%time_present .or. hm%time_zero)
then
1346 call hm%update(ks%gr, namespace, space, ext_partners, time = ks%calc%time)
1352 safe_deallocate_a(ks%calc%density)
1353 if (ks%calc%total_density_alloc)
then
1354 safe_deallocate_p(ks%calc%total_density)
1356 nullify(ks%calc%total_density)
1370 class(
space_t),
intent(in ) :: space
1371 class(
mesh_t),
intent(in ) :: gr
1377 if (exxop%isdf%use_serial)
then
1379 hf_st, xst, kpoints)
1381 call isdf_parallel_ace_compute_potentials(exxop, namespace, space, gr, &
1382 hf_st, xst, kpoints)
1393 subroutine v_ks_hartree(namespace, ks, space, hm, ext_partners)
1395 type(
v_ks_t),
intent(inout) :: ks
1396 class(
space_t),
intent(in) :: space
1404 call dpoisson_solve(hm%psolver, namespace, hm%ks_pot%vhartree, ks%calc%total_density, reset=.false.)
1410 if (ks%calc%calc_energy)
then
1412 hm%energy%hartree =
m_half*
dmf_dotp(ks%gr, ks%calc%total_density, hm%ks_pot%vhartree)
1416 if(ks%calc%time_present)
then
1419 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick, time=ks%calc%time)
1422 ks%calc%total_density, hm%energy%pcm_corr, time=ks%calc%time)
1427 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick)
1430 ks%calc%total_density, hm%energy%pcm_corr)
1441 type(
v_ks_t),
intent(inout) :: ks
1445 ks%frozen_hxc = .
true.
1452 type(
v_ks_t),
intent(inout) :: this
1453 logical,
intent(in) :: calc_cur
1457 this%calculate_current = calc_cur
1464 type(
v_ks_t),
intent(inout) :: ks
1468 real(real64),
intent(out) :: int_dft_u
1487 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 density_calc(st, gr, density, istin, ep, vnl, phase)
Computes the density from the orbitals in st.
subroutine, public states_elec_total_density(st, mesh, total_rho)
This routine calculates the total electronic density.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
integer, parameter, public unpolarized
Parameters...
integer, parameter, public spinors
integer, parameter, public spin_polarized
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 ...
integer, parameter, private ik
All molecular calculations performed at the Gamma-point.
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)
/* To use the profiling module, call profiling_in and profiling_out with the label of the region as a...
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_check_generalized_overlap(ks, st, hm, namespace)
Fence the spin treatments and theory levels / functionals that are not yet correct for ultrasoft/PAW.
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()