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 integer,
public :: xc_photon = 0
137 type(xc_t),
public :: xc
138 type(xc_photons_t),
public :: xc_photons
139 type(xc_oep_t),
public :: oep
140 type(xc_oep_photon_t),
public :: oep_photon
141 type(xc_ks_inversion_t),
public :: ks_inversion
142 type(xc_sic_t),
public :: sic
143 type(xc_vdw_t),
public :: vdw
144 type(grid_t),
pointer,
public :: gr
145 type(v_ks_calc_t) :: calc
146 logical :: calculate_current = .false.
147 type(current_t) :: current_calculator
148 logical :: include_td_field = .false.
149 logical,
public :: has_photons = .false.
150 logical :: xc_photon_include_hartree = .
true.
152 real(real64),
public :: stress_xc_gga(3, 3)
153 type(photon_mode_t),
pointer,
public :: pt => null()
154 type(mf_t),
public :: pt_mx
160 subroutine v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
161 type(v_ks_t),
intent(inout) :: ks
162 type(namespace_t),
intent(in) :: namespace
163 type(grid_t),
target,
intent(inout) :: gr
164 type(states_elec_t),
intent(in) :: st
165 type(ions_t),
intent(inout) :: ions
166 type(multicomm_t),
intent(in) :: mc
167 class(space_t),
intent(in) :: space
168 type(kpoints_t),
intent(in) :: kpoints
170 integer :: x_id, c_id, xk_id, ck_id, default, val
171 logical :: parsed_theory_level, using_hartree_fock
172 integer :: pseudo_x_functional, pseudo_c_functional
215 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.)
306 call parse_variable(namespace,
'XCPhotonFunctional', option__xcphotonfunctional__none, ks%xc_photon)
316 call parse_variable(namespace,
'XCPhotonIncludeHartree', .
true., ks%xc_photon_include_hartree)
318 if (.not. ks%xc_photon_include_hartree)
then
329 using_hartree_fock = (ks%theory_level ==
hartree_fock) &
331 call xc_init(ks%xc, namespace, space%dim, space%periodic_dim, st%qtot, &
332 x_id, c_id, xk_id, ck_id,
hartree_fock = using_hartree_fock, ispin=st%d%ispin)
334 ks%xc_family = ks%xc%family
335 ks%xc_flags = ks%xc%flags
337 if (.not. parsed_theory_level)
then
346 call parse_variable(namespace,
'TheoryLevel', default, ks%theory_level)
358 ks%xc_family = ior(ks%xc_family, xc_family_oep)
368 ks%sic%amaldi_factor =
m_one
370 select case (ks%theory_level)
375 if (space%periodic_dim == space%dim)
then
378 if (kpoints%full%npoints > 1)
then
383 if (kpoints%full%npoints > 1)
then
398 if (
bitand(ks%xc_family, xc_family_lda + xc_family_gga) /= 0)
then
399 call xc_sic_init(ks%sic, namespace, gr, st, mc, space)
402 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
403 select case (ks%xc%functional(
func_x,1)%id)
405 if (kpoints%reduced%npoints > 1 .and. st%d%ispin ==
spinors)
then
408 if (kpoints%use_symmetries)
then
413 if (kpoints%reduced%npoints > 1)
then
418 if((.not. ks%has_photons) .or. (ks%xc_photon /= 0))
then
419 if(oep_type == -1)
then
422 call xc_oep_init(ks%oep, namespace, gr, st, mc, space, oep_type)
436 message(1) =
"SICCorrection can only be used with Kohn-Sham DFT"
440 if (st%d%ispin ==
spinors)
then
441 if (
bitand(ks%xc_family, xc_family_mgga + xc_family_hyb_mgga) /= 0)
then
446 ks%frozen_hxc = .false.
451 ks%calc%calculating = .false.
456 call ks%vdw%init(namespace, space, gr, ks%xc, ions, x_id, c_id)
457 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level ==
rdmft)
then
458 message(1) =
"VDWCorrection and RDMFT are not compatible"
461 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level ==
independent_particles)
then
462 message(1) =
"VDWCorrection and independent particles are not compatible"
466 if (ks%xc_photon /= 0)
then
468 call ks%xc_photons%init(namespace, ks%xc_photon , space, gr, st)
480 integer,
intent(out) :: x_functional
481 integer,
intent(out) :: c_functional
483 integer :: xf, cf, ispecies
484 logical :: warned_inconsistent
489 warned_inconsistent = .false.
490 do ispecies = 1, ions%nspecies
491 select type(spec=>ions%species(ispecies)%s)
493 xf = spec%x_functional()
494 cf = spec%c_functional()
497 call messages_write(
"Unknown XC functional for species '"//trim(ions%species(ispecies)%s%get_label())//
"'")
505 if (xf /= x_functional .and. .not. warned_inconsistent)
then
506 call messages_write(
'Inconsistent XC functional detected between species')
508 warned_inconsistent = .
true.
515 if (cf /= c_functional .and. .not. warned_inconsistent)
then
516 call messages_write(
'Inconsistent XC functional detected between species')
518 warned_inconsistent = .
true.
538 type(
v_ks_t),
intent(inout) :: ks
544 select case (ks%theory_level)
549 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
559 if (ks%xc_photon /= 0)
then
560 call ks%xc_photons%end()
570 type(
v_ks_t),
intent(in) :: ks
571 integer,
optional,
intent(in) :: iunit
572 type(
namespace_t),
optional,
intent(in) :: namespace
579 select case (ks%theory_level)
604 subroutine v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
607 type(
grid_t),
intent(in) :: gr
608 type(
ions_t),
intent(in) :: ions
611 type(
v_ks_t),
intent(inout) :: ks
613 logical,
optional,
intent(in) :: calc_eigenval
614 logical,
optional,
intent(in) :: calc_current
616 integer,
allocatable :: ind(:)
618 real(real64),
allocatable :: copy_occ(:)
619 logical :: calc_eigenval_
620 logical :: calc_current_
628 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
629 calc_eigenval = calc_eigenval_, calc_current = calc_current_)
631 if (st%restart_reorder_occs .and. .not. st%fromScratch)
then
632 message(1) =
"Reordering occupations for restart."
635 safe_allocate(ind(1:st%nst))
636 safe_allocate(copy_occ(1:st%nst))
639 call sort(st%eigenval(:, ik), ind)
640 copy_occ(1:st%nst) = st%occ(1:st%nst, ik)
642 st%occ(ist, ik) = copy_occ(ind(ist))
646 safe_deallocate_a(ind)
647 safe_deallocate_a(copy_occ)
657 subroutine v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
658 calc_eigenval, time, calc_energy, calc_current, force_semilocal)
659 type(
v_ks_t),
intent(inout) :: ks
666 logical,
optional,
intent(in) :: calc_eigenval
667 real(real64),
optional,
intent(in) :: time
668 logical,
optional,
intent(in) :: calc_energy
669 logical,
optional,
intent(in) :: calc_current
670 logical,
optional,
intent(in) :: force_semilocal
672 logical :: calc_current_
677 .and. (ks%calculate_current &
681 if (calc_current_)
then
686 call v_ks_calc_start(ks, namespace, space, hm, st, ions, hm%kpoints%latt, ext_partners, time, &
687 calc_energy, force_semilocal=force_semilocal)
689 ext_partners, force_semilocal=force_semilocal)
700 call lalg_axpy(ks%gr%np, st%d%nspin,
m_one, hm%magnetic_constrain%pot, hm%ks_pot%vhxc)
712 subroutine v_ks_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, &
713 calc_energy, force_semilocal)
714 type(
v_ks_t),
target,
intent(inout) :: ks
716 class(
space_t),
intent(in) :: space
719 type(
ions_t),
intent(in) :: ions
722 real(real64),
optional,
intent(in) :: time
723 logical,
optional,
intent(in) :: calc_energy
724 logical,
optional,
intent(in) :: force_semilocal
730 assert(.not. ks%calc%calculating)
731 ks%calc%calculating = .
true.
733 write(
message(1),
'(a)')
'Debug: Calculating Kohn-Sham potential.'
736 ks%calc%time_present =
present(time)
742 if (ks%frozen_hxc)
then
748 allocate(ks%calc%energy)
754 nullify(ks%calc%total_density)
764 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
call v_a_xc(hm, force_semilocal)
766 ks%calc%total_density_alloc = .false.
773 nullify(ks%calc%hf_st)
778 if (st%parallel_in_states)
then
780 call messages_write(
'State parallelization of Hartree-Fock exchange is not supported')
782 call messages_write(
'when running with GPUs. Please use domain parallelization')
784 call messages_write(
"or disable acceleration using 'DisableAccel = yes'.")
789 if (hm%exxop%useACE)
then
792 safe_allocate(ks%calc%hf_st)
801 if (hm%self_induced_magnetic)
then
802 safe_allocate(ks%calc%a_ind(1:ks%gr%np_part, 1:space%dim))
803 safe_allocate(ks%calc%b_ind(1:ks%gr%np_part, 1:space%dim))
804 call magnetic_induced(namespace, ks%gr, st, hm%psolver, hm%kpoints, ks%calc%a_ind, ks%calc%b_ind)
807 if ((ks%has_photons) .and. (ks%calc%time_present) .and. (ks%xc_photon == 0) )
then
808 call mf_calc(ks%pt_mx, ks%gr, st, ions, ks%pt, time)
826 safe_allocate(ks%calc%density(1:ks%gr%np, 1:st%d%nspin))
831 call lalg_scal(ks%gr%np, st%d%nspin, ks%sic%amaldi_factor, ks%calc%density)
843 if (
allocated(st%rho_core))
then
847 int(ks%gr%np, int64), st%rho_core)
849 if (
allocated(st%frozen_rho))
then
853 int(ks%gr%np, int64), int(st%d%nspin, int64), st%frozen_rho)
854 ks%xc%quantities%frozen_rho_np = ks%gr%np
857 ks%xc%quantities%amaldi_factor = ks%sic%amaldi_factor
861 nullify(ks%calc%total_density)
862 if (
allocated(st%rho_core) .or. hm%d%spin_channels > 1)
then
863 ks%calc%total_density_alloc = .
true.
865 safe_allocate(ks%calc%total_density(1:ks%gr%np))
868 ks%calc%total_density(ip) = sum(ks%calc%density(ip, 1:hm%d%spin_channels))
872 if (
allocated(st%rho_core))
then
873 call lalg_axpy(ks%gr%np, -ks%sic%amaldi_factor, st%rho_core, ks%calc%total_density)
876 ks%calc%total_density_alloc = .false.
877 ks%calc%total_density => ks%calc%density(:, 1)
884 subroutine v_a_xc(hm, force_semilocal)
886 logical,
optional,
intent(in) :: force_semilocal
893 ks%calc%energy%exchange =
m_zero
894 ks%calc%energy%correlation =
m_zero
895 ks%calc%energy%xc_j =
m_zero
896 ks%calc%energy%vdw =
m_zero
898 allocate(ks%calc%vxc(1:ks%gr%np, 1:st%d%nspin))
902 safe_allocate(ks%calc%vtau(1:ks%gr%np, 1:st%d%nspin))
907 if (ks%calc%calc_energy)
then
909 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
910 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
911 deltaxc = ks%calc%energy%delta_xc, vtau = ks%calc%vtau, force_orbitalfree=force_semilocal)
913 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
914 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
915 deltaxc = ks%calc%energy%delta_xc, stress_xc=ks%stress_xc_gga, force_orbitalfree=force_semilocal)
919 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
920 st%d%ispin, latt%rcell_volume, ks%calc%vxc, vtau = ks%calc%vtau, force_orbitalfree=force_semilocal)
922 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
923 st%d%ispin, latt%rcell_volume, ks%calc%vxc, stress_xc=ks%stress_xc_gga, force_orbitalfree=force_semilocal)
929 if (st%d%ispin /=
spinors)
then
930 message(1) =
"Noncollinear functionals can only be used with spinor wavefunctions."
935 message(1) =
"Cannot perform LCAO for noncollinear MGGAs."
936 message(2) =
"Please perform a LDA calculation first."
940 if (ks%calc%calc_energy)
then
942 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
943 vtau = ks%calc%vtau, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
945 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
946 ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
950 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, &
951 ks%calc%vxc, vtau = ks%calc%vtau)
953 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc)
958 call ks%vdw%calc(namespace, space, latt, ions%atom, ions%natoms, ions%pos, &
959 ks%gr, st, ks%calc%energy%vdw, ks%calc%vxc)
972 if (ks%calc%calc_energy)
then
973 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
974 ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
976 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
988 call x_slater_calc(namespace, ks%gr, space, hm%exxop, st, hm%kpoints, ks%calc%energy%exchange, &
991 call x_fbe_calc(ks%xc%functional(
func_x,1)%id, namespace, hm%psolver, ks%gr, st, space, &
992 ks%calc%energy%exchange, vxc = ks%calc%vxc)
996 call fbe_c_lda_sl(namespace, ks%gr, st, space, ks%calc%energy%correlation, vxc = ks%calc%vxc)
1004 call xc_ks_inversion_calc(ks%ks_inversion, namespace, space, ks%gr, hm, ext_partners, st, vxc = ks%calc%vxc, &
1005 time = ks%calc%time)
1009 if (ks%xc_photon /= 0)
then
1011 call ks%xc_photons%v_ks(namespace, ks%calc%total_density, ks%gr, space, hm%psolver, st)
1014 do ispin = 1, hm%d%spin_channels
1015 call lalg_axpy(ks%gr%np,
m_one, ks%xc_photons%vpx(1:ks%gr%np), ks%calc%vxc(1:ks%gr%np, ispin) )
1019 ks%calc%energy%photon_exchange = ks%xc_photons%ex
1024 if (ks%calc%calc_energy)
then
1037 subroutine v_ks_calc_finish(ks, hm, namespace, space, latt, st, ext_partners, force_semilocal)
1038 type(
v_ks_t),
target,
intent(inout) :: ks
1041 class(
space_t),
intent(in) :: space
1045 logical,
optional,
intent(in) :: force_semilocal
1047 integer :: ip, ispin
1050 real(real64) :: exx_energy
1051 real(real64) :: factor
1055 assert(ks%calc%calculating)
1056 ks%calc%calculating = .false.
1058 if (ks%frozen_hxc)
then
1064 safe_deallocate_a(hm%energy)
1065 call move_alloc(ks%calc%energy, hm%energy)
1067 if (hm%self_induced_magnetic)
then
1068 hm%a_ind(1:ks%gr%np, 1:space%dim) = ks%calc%a_ind(1:ks%gr%np, 1:space%dim)
1069 hm%b_ind(1:ks%gr%np, 1:space%dim) = ks%calc%b_ind(1:ks%gr%np, 1:space%dim)
1071 safe_deallocate_a(ks%calc%a_ind)
1072 safe_deallocate_a(ks%calc%b_ind)
1075 if (
allocated(hm%v_static))
then
1076 hm%energy%intnvstatic =
dmf_dotp(ks%gr, ks%calc%total_density, hm%v_static)
1078 hm%energy%intnvstatic =
m_zero
1084 hm%energy%intnvxc =
m_zero
1085 hm%energy%hartree =
m_zero
1086 hm%energy%exchange =
m_zero
1087 hm%energy%exchange_hf =
m_zero
1088 hm%energy%correlation =
m_zero
1091 hm%energy%hartree =
m_zero
1092 call v_ks_hartree(namespace, ks, space, hm, ext_partners)
1098 call dxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1099 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1101 call zxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1102 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1111 call dxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1112 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1114 call zxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1115 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1124 hm, st, space, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1127 hm, st, space, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1129 hm%energy%photon_exchange = ks%oep_photon%pt%ex
1133 if (ks%calc%calc_energy)
then
1135 hm%energy%intnvxc =
m_zero
1138 do ispin = 1, hm%d%nspin
1139 if (ispin <= 2)
then
1144 hm%energy%intnvxc = hm%energy%intnvxc + &
1145 factor*
dmf_dotp(ks%gr, st%rho(:, ispin), ks%calc%vxc(:, ispin), reduce = .false.)
1147 call ks%gr%allreduce(hm%energy%intnvxc)
1152 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
then
1154 safe_deallocate_a(hm%ks_pot%vxc)
1155 call move_alloc(ks%calc%vxc, hm%ks_pot%vxc)
1158 call hm%ks_pot%set_vtau(ks%calc%vtau)
1159 safe_deallocate_a(ks%calc%vtau)
1165 hm%energy%intnvxc = hm%energy%intnvxc &
1168 hm%energy%intnvxc = hm%energy%intnvxc &
1178 if (.not. ks%xc_photon_include_hartree)
then
1179 hm%energy%hartree =
m_zero
1180 hm%ks_pot%vhartree =
m_zero
1186 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vxc(ip, 1) + hm%ks_pot%vhartree(ip)
1188 if (
allocated(hm%vberry))
then
1190 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vhxc(ip, 1) + hm%vberry(ip, 1)
1196 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vxc(ip, 2) + hm%ks_pot%vhartree(ip)
1198 if (
allocated(hm%vberry))
then
1200 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vhxc(ip, 2) + hm%vberry(ip, 2)
1205 if (hm%d%ispin ==
spinors)
then
1208 hm%ks_pot%vhxc(ip, ispin) = hm%ks_pot%vxc(ip, ispin)
1214 hm%energy%exchange_hf =
m_zero
1216 .or. ks%theory_level ==
rdmft &
1220 if (.not. hm%exxop%useACE)
then
1222 if (
associated(hm%exxop%st))
then
1225 safe_deallocate_p(hm%exxop%st)
1236 select case (ks%theory_level)
1250 if (hm%exxop%useACE)
then
1254 if (hm%exxop%with_isdf)
then
1257 call hm%exxop%isdf%get_interpolation_points(namespace, space, ks%gr, st%rho(1:ks%gr%np, 1))
1259 ks%calc%hf_st, xst, hm%kpoints)
1262 ks%calc%hf_st, xst, hm%kpoints)
1268 ks%calc%hf_st, xst, hm%kpoints)
1270 if (hm%phase%is_allocated())
then
1277 exx_energy = exx_energy + hm%exxop%singul%energy
1281 select case (ks%theory_level)
1284 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1287 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1305 if (ks%has_photons .and. (ks%xc_photon == 0))
then
1306 if (
associated(ks%pt_mx%vmf))
then
1307 call lalg_axpy(ks%gr%np,
m_one, ks%pt_mx%vmf, hm%ks_pot%vhxc(:, 1))
1309 call lalg_axpy(ks%gr%np,
m_one, ks%pt_mx%vmf, hm%ks_pot%vhxc(:, 2))
1312 hm%ep%photon_forces(1:space%dim) = ks%pt_mx%fmf(1:space%dim)
1315 if (ks%vdw%vdw_correction /= option__vdwcorrection__none)
then
1316 assert(
allocated(ks%vdw%forces))
1317 hm%ep%vdw_forces(:, :) = ks%vdw%forces(:, :)
1318 hm%ep%vdw_stress = ks%vdw%stress
1319 safe_deallocate_a(ks%vdw%forces)
1321 hm%ep%vdw_forces = 0.0_real64
1324 if (ks%calc%time_present .or. hm%time_zero)
then
1325 call hm%update(ks%gr, namespace, space, ext_partners, time = ks%calc%time)
1331 safe_deallocate_a(ks%calc%density)
1332 if (ks%calc%total_density_alloc)
then
1333 safe_deallocate_p(ks%calc%total_density)
1335 nullify(ks%calc%total_density)
1349 class(
space_t),
intent(in ) :: space
1350 class(
mesh_t),
intent(in ) :: gr
1356 if (exxop%isdf%use_serial)
then
1358 hf_st, xst, kpoints)
1360 call isdf_parallel_ace_compute_potentials(exxop, namespace, space, gr, &
1361 hf_st, xst, kpoints)
1372 subroutine v_ks_hartree(namespace, ks, space, hm, ext_partners)
1374 type(
v_ks_t),
intent(inout) :: ks
1375 class(
space_t),
intent(in) :: space
1383 call dpoisson_solve(hm%psolver, namespace, hm%ks_pot%vhartree, ks%calc%total_density, reset=.false.)
1389 if (ks%calc%calc_energy)
then
1391 hm%energy%hartree =
m_half*
dmf_dotp(ks%gr, ks%calc%total_density, hm%ks_pot%vhartree)
1395 if(ks%calc%time_present)
then
1398 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick, time=ks%calc%time)
1401 ks%calc%total_density, hm%energy%pcm_corr, time=ks%calc%time)
1406 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick)
1409 ks%calc%total_density, hm%energy%pcm_corr)
1420 type(
v_ks_t),
intent(inout) :: ks
1424 ks%frozen_hxc = .
true.
1431 type(
v_ks_t),
intent(inout) :: this
1432 logical,
intent(in) :: calc_cur
1436 this%calculate_current = calc_cur
1443 type(
v_ks_t),
intent(inout) :: ks
1447 real(real64),
intent(out) :: int_dft_u
constant times a vector plus a vector
scales a vector by a constant
This is the common interface to a sorting routine. It performs the shell algorithm,...
logical pure function, public accel_buffer_is_allocated(this)
pure logical function, public accel_is_enabled()
integer, parameter, public accel_mem_read_only
subroutine, public current_calculate(this, namespace, gr, hm, space, st)
Compute total electronic current density.
subroutine, public current_init(this, namespace)
This module implements a calculator for the density and defines related functions.
subroutine, public states_elec_total_density(st, mesh, total_rho)
This routine calculates the total electronic density.
subroutine, public density_calc(st, gr, density, istin)
Computes the density from the orbitals in st.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
integer, parameter, public unpolarized
Parameters...
integer, parameter, public spinors
subroutine, public energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit, full)
This subroutine calculates the total energy of the system. Basically, it adds up the KS eigenvalues,...
real(real64) function, public zenergy_calc_electronic(namespace, hm, der, st, terms)
real(real64) function, public denergy_calc_electronic(namespace, hm, der, st, terms)
subroutine, public energy_calc_eigenvalues(namespace, hm, der, st)
subroutine, public energy_copy(ein, eout)
subroutine, public dexchange_operator_ace(this, namespace, mesh, st, xst, phase)
subroutine, public zexchange_operator_compute_potentials(this, namespace, space, gr, st, xst, kpoints, F_out)
subroutine, public exchange_operator_reinit(this, cam, st)
subroutine, public dexchange_operator_compute_potentials(this, namespace, space, gr, st, xst, kpoints, F_out)
subroutine, public zexchange_operator_ace(this, namespace, mesh, st, xst, phase)
real(real64) function, public dexchange_operator_compute_ex(mesh, st, xst)
Compute the exact exchange energy.
real(real64) function, public zexchange_operator_compute_ex(mesh, st, xst)
Compute the exact exchange energy.
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
integer, parameter, public rdmft
integer, parameter, public hartree_fock
integer, parameter, public independent_particles
Theory level.
integer, parameter, public generalized_kohn_sham_dft
integer, parameter, public kohn_sham_dft
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
integer, parameter, public hartree
This module implements the underlying real-space grid.
integer, parameter, public term_mgga
integer, parameter, public term_dft_u
logical function, public hamiltonian_elec_has_kick(hm)
logical function, public hamiltonian_elec_needs_current(hm, states_are_real)
subroutine, public hamiltonian_elec_update_pot(this, mesh, accumulate)
Update the KS potential of the electronic Hamiltonian.
This module defines classes and functions for interaction partners.
Interoperable Separable Density Fitting (ISDF) molecular implementation.
subroutine, public isdf_ace_compute_potentials(exxop, namespace, space, mesh, st, Vx_on_st, kpoints)
ISDF wrapper computing interpolation points and vectors, which are used to build the potential used ...
Serial prototype for benchmarking and validating ISDF implementation.
subroutine, public isdf_serial_ace_compute_potentials(exxop, namespace, space, mesh, st, Vx_on_st, kpoints)
ISDF wrapper computing interpolation points and vectors, which are used to build the potential used ...
A module to handle KS potential, without the external potential.
integer, parameter, public dft_u_none
This modules implements the routines for doing constrain DFT for noncollinear magnetism.
integer, parameter, public constrain_none
subroutine, public magnetic_constrain_update(this, mesh, std, space, latt, pos, rho)
Recomputes the magnetic contraining potential.
subroutine, public magnetic_induced(namespace, gr, st, psolver, kpoints, a_ind, b_ind)
This subroutine receives as input a current, and produces as an output the vector potential that it i...
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
subroutine, public messages_not_implemented(feature, namespace)
character(len=512), private msg
subroutine, public messages_warning(no_lines, all_nodes, namespace)
subroutine, public messages_obsolete_variable(namespace, name, rep)
subroutine, public messages_new_line()
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public messages_input_error(namespace, var, details, row, column)
subroutine, public messages_experimental(name, namespace)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This module handles the communicators for the various parallelization strategies.
logical function, public parse_is_defined(namespace, name)
subroutine, public pcm_hartree_potential(pcm, space, mesh, psolver, ext_partners, vhartree, density, pcm_corr, kick, time)
PCM reaction field due to the electronic density.
subroutine, public mf_calc(this, gr, st, ions, pt_mode, time)
subroutine, public dpoisson_solve_start(this, rho)
subroutine, public dpoisson_solve(this, namespace, pot, rho, all_nodes, kernel, reset)
Calculates the Poisson equation. Given the density returns the corresponding potential.
subroutine, public dpoisson_solve_finish(this, pot)
logical pure function, public poisson_is_async(this)
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
integer, parameter, public pseudo_exchange_unknown
integer, parameter, public pseudo_correlation_unknown
integer, parameter, public pseudo_correlation_any
integer, parameter, public pseudo_exchange_any
This module is intended to contain "only mathematical" functions and procedures.
integer, parameter, private libxc_c_index
pure logical function, public states_are_complex(st)
pure logical function, public states_are_real(st)
This module handles spin dimensions of the states and the k-point distribution.
subroutine, public states_elec_fermi(st, namespace, mesh, compute_spin)
calculate the Fermi level for the states in this object
subroutine, public states_elec_end(st)
finalize the states_elec_t object
subroutine, public states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special)
make a (selective) copy of a states_elec_t object
subroutine, public states_elec_allocate_current(st, space, mesh)
This module provides routines for communicating states when using states parallelization.
subroutine, public states_elec_parallel_remote_access_stop(this)
stop remote memory access for states on other processors
subroutine, public states_elec_parallel_remote_access_start(this)
start remote memory access for states on other processors
type(type_t), parameter, public type_float
subroutine v_ks_hartree(namespace, ks, space, hm, ext_partners)
Hartree contribution to the KS potential. This function is designed to be used by v_ks_calc_finish an...
subroutine, public v_ks_calc_finish(ks, hm, namespace, space, latt, st, ext_partners, force_semilocal)
subroutine, public v_ks_freeze_hxc(ks)
subroutine, public v_ks_end(ks)
subroutine, public v_ks_calculate_current(this, calc_cur)
subroutine, public v_ks_write_info(ks, iunit, namespace)
subroutine, public v_ks_update_dftu_energy(ks, namespace, hm, st, int_dft_u)
Update the value of <\psi | V_U | \psi>, where V_U is the DFT+U potential.
subroutine, public v_ks_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, calc_energy, force_semilocal)
This routine starts the calculation of the Kohn-Sham potential. The routine v_ks_calc_finish must be ...
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
subroutine, public v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
subroutine, public v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
subroutine, public x_slater_calc(namespace, gr, space, exxop, st, kpoints, ex, vxc)
Interface to X(slater_calc)
type(xc_cam_t), parameter, public cam_null
All CAM parameters set to zero.
type(xc_cam_t), parameter, public cam_exact_exchange
Use only Hartree Fock exact exchange.
subroutine, public x_fbe_calc(id, namespace, psolver, gr, st, space, ex, vxc)
Interface to X(x_fbe_calc) Two possible run modes possible: adiabatic and Sturm-Liouville....
subroutine, public fbe_c_lda_sl(namespace, gr, st, space, ec, vxc)
Sturm-Liouville version of the FBE local-density correlation functional.
integer, parameter, public xc_family_ks_inversion
declaring 'family' constants for 'functionals' not handled by libxc careful not to use a value define...
integer function, public xc_get_default_functional(dim, pseudo_x_functional, pseudo_c_functional)
Returns the default functional given the one parsed from the pseudopotentials and the space dimension...
integer, parameter, public xc_family_nc_mgga
integer, parameter, public xc_oep_x
Exact exchange.
integer, parameter, public xc_lda_c_fbe_sl
LDA correlation based ib the force-balance equation - Sturm-Liouville version.
integer, parameter, public xc_family_nc_lda
integer, parameter, public xc_oep_x_fbe_sl
Exchange approximation based on the force balance equation - Sturn-Liouville version.
integer, parameter, public xc_oep_x_fbe
Exchange approximation based on the force balance equation.
integer, parameter, public xc_oep_x_slater
Slater approximation to the exact exchange.
integer, parameter, public func_c
integer, parameter, public func_x
subroutine, public xc_ks_inversion_end(ks_inv)
subroutine, public xc_ks_inversion_write_info(ks_inversion, iunit, namespace)
subroutine, public xc_ks_inversion_init(ks_inv, namespace, gr, ions, st, xc, mc, space, kpoints)
subroutine, public xc_ks_inversion_calc(ks_inversion, namespace, space, gr, hm, ext_partners, st, vxc, time)
subroutine, public xc_get_nc_vxc(gr, xcs, st, kpoints, space, namespace, rho, vxc, ex, ec, vtau, ex_density, ec_density)
This routines is similar to xc_get_vxc but for noncollinear functionals, which are not implemented in...
subroutine, public xc_write_info(xcs, iunit, namespace)
subroutine, public xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
pure logical function, public family_is_mgga(family, only_collinear)
Is the xc function part of the mGGA family.
logical pure function, public family_is_mgga_with_exc(xcs)
Is the xc function part of the mGGA family with an energy functional.
subroutine, public xc_end(xcs)
logical pure function, public family_is_hybrid(xcs)
Returns true if the functional is an hybrid functional.
integer, parameter, public oep_type_mgga
integer, parameter, public oep_level_none
the OEP levels
subroutine, public xc_oep_end(oep)
subroutine, public zxc_oep_calc(oep, namespace, xcs, gr, hm, st, space, rcell_volume, ex, ec, vxc)
This file handles the evaluation of the OEP potential, in the KLI or full OEP as described in S....
subroutine, public dxc_oep_calc(oep, namespace, xcs, gr, hm, st, space, rcell_volume, ex, ec, vxc)
This file handles the evaluation of the OEP potential, in the KLI or full OEP as described in S....
subroutine, public xc_oep_write_info(oep, iunit, namespace)
integer, parameter, public oep_type_exx
The different types of OEP that we can work with.
subroutine, public xc_oep_init(oep, namespace, gr, st, mc, space, oep_type)
subroutine, public zxc_oep_photon_calc(oep, namespace, xcs, gr, hm, st, space, 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_photon_calc(oep, namespace, xcs, gr, hm, st, space, ex, ec, vxc)
This file handles the evaluation of the OEP potential, in the KLI or full OEP as described in S....
This module implements the "photon-free" electron-photon exchange-correlation functional.
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.
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()