38 use,
intrinsic :: iso_fortran_env
102 logical :: calculating
103 logical :: time_present
105 real(real64),
allocatable :: density(:, :)
106 logical :: total_density_alloc
107 real(real64),
pointer,
contiguous :: total_density(:)
108 type(energy_t),
allocatable :: energy
110 type(states_elec_t),
pointer :: hf_st
115 real(real64),
allocatable :: vxc(:, :)
116 real(real64),
allocatable :: vtau(:, :)
117 real(real64),
allocatable :: axc(:, :, :)
118 real(real64),
allocatable :: a_ind(:, :)
119 real(real64),
allocatable :: b_ind(:, :)
120 logical :: calc_energy
125 integer,
public :: theory_level = -1
127 logical,
public :: frozen_hxc = .false.
129 integer,
public :: xc_family = 0
130 integer,
public :: xc_flags = 0
131 integer,
public :: xc_photon = 0
132 type(xc_t),
public :: xc
133 type(xc_photons_t),
public :: xc_photons
134 type(xc_oep_t),
public :: oep
135 type(xc_oep_photon_t),
public :: oep_photon
136 type(xc_ks_inversion_t),
public :: ks_inversion
137 type(xc_sic_t),
public :: sic
138 type(xc_vdw_t),
public :: vdw
139 type(grid_t),
pointer,
public :: gr
140 type(v_ks_calc_t) :: calc
141 logical :: calculate_current = .false.
142 type(current_t) :: current_calculator
143 logical :: include_td_field = .false.
144 logical,
public :: has_photons = .false.
145 logical :: xc_photon_include_hartree = .
true.
147 real(real64),
public :: stress_xc_gga(3, 3)
148 type(photon_mode_t),
pointer,
public :: pt => null()
149 type(mf_t),
public :: pt_mx
155 subroutine v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
156 type(v_ks_t),
intent(inout) :: ks
157 type(namespace_t),
intent(in) :: namespace
158 type(grid_t),
target,
intent(inout) :: gr
159 type(states_elec_t),
intent(in) :: st
160 type(ions_t),
intent(inout) :: ions
161 type(multicomm_t),
intent(in) :: mc
162 class(space_t),
intent(in) :: space
163 type(kpoints_t),
intent(in) :: kpoints
165 integer :: x_id, c_id, xk_id, ck_id, default, val
166 logical :: parsed_theory_level, using_hartree_fock
167 integer :: pseudo_x_functional, pseudo_c_functional
210 ks%xc_family = xc_family_none
216 parsed_theory_level = .false.
237 call messages_write(
'Info: the XCFunctional has been selected to match the pseudopotentials', new_line = .
true.)
252 call messages_write(
'The XCFunctional that you selected does not match the one used', new_line = .
true.)
301 call parse_variable(namespace,
'XCPhotonFunctional', option__xcphotonfunctional__none, ks%xc_photon)
311 call parse_variable(namespace,
'XCPhotonIncludeHartree', .
true., ks%xc_photon_include_hartree)
313 if (.not. ks%xc_photon_include_hartree)
then
324 using_hartree_fock = (ks%theory_level ==
hartree_fock) &
326 call xc_init(ks%xc, namespace, space%dim, space%periodic_dim, st%qtot, &
327 x_id, c_id, xk_id, ck_id,
hartree_fock = using_hartree_fock, ispin=st%d%ispin)
329 ks%xc_family = ks%xc%family
330 ks%xc_flags = ks%xc%flags
332 if (.not. parsed_theory_level)
then
341 call parse_variable(namespace,
'TheoryLevel', default, ks%theory_level)
353 ks%xc_family = ior(ks%xc_family, xc_family_oep)
363 ks%sic%amaldi_factor =
m_one
365 select case (ks%theory_level)
370 if (space%periodic_dim == space%dim)
then
373 if (kpoints%full%npoints > 1)
then
378 if (kpoints%full%npoints > 1)
then
393 if (
bitand(ks%xc_family, xc_family_lda + xc_family_gga) /= 0)
then
394 call xc_sic_init(ks%sic, namespace, gr, st, mc, space)
397 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
398 select case (ks%xc%functional(
func_x,1)%id)
400 if (kpoints%reduced%npoints > 1)
then
405 if (kpoints%reduced%npoints > 1)
then
410 if((.not. ks%has_photons) .or. (ks%xc_photon /= 0))
then
411 if(oep_type == -1)
then
414 call xc_oep_init(ks%oep, namespace, gr, st, mc, space, oep_type)
428 message(1) =
"SICCorrection can only be used with Kohn-Sham DFT"
432 if (st%d%ispin ==
spinors)
then
433 if (
bitand(ks%xc_family, xc_family_mgga + xc_family_hyb_mgga) /= 0)
then
438 ks%frozen_hxc = .false.
443 ks%calc%calculating = .false.
448 call ks%vdw%init(namespace, space, gr, ks%xc, ions, x_id, c_id)
450 if (ks%xc_photon /= 0)
then
452 call ks%xc_photons%init(namespace, ks%xc_photon , space, gr, st)
464 integer,
intent(out) :: x_functional
465 integer,
intent(out) :: c_functional
467 integer :: xf, cf, ispecies
468 logical :: warned_inconsistent
473 warned_inconsistent = .false.
474 do ispecies = 1, ions%nspecies
475 select type(spec=>ions%species(ispecies)%s)
477 xf = spec%x_functional()
478 cf = spec%c_functional()
481 call messages_write(
"Unknown XC functional for species '"//trim(ions%species(ispecies)%s%get_label())//
"'")
489 if (xf /= x_functional .and. .not. warned_inconsistent)
then
490 call messages_write(
'Inconsistent XC functional detected between species')
492 warned_inconsistent = .
true.
499 if (cf /= c_functional .and. .not. warned_inconsistent)
then
500 call messages_write(
'Inconsistent XC functional detected between species')
502 warned_inconsistent = .
true.
522 type(
v_ks_t),
intent(inout) :: ks
528 select case (ks%theory_level)
533 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
543 if (ks%xc_photon /= 0)
then
544 call ks%xc_photons%end()
554 type(
v_ks_t),
intent(in) :: ks
555 integer,
optional,
intent(in) :: iunit
563 select case (ks%theory_level)
588 subroutine v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
591 type(
grid_t),
intent(in) :: gr
592 type(
ions_t),
intent(in) :: ions
595 type(
v_ks_t),
intent(inout) :: ks
597 logical,
optional,
intent(in) :: calc_eigenval
598 logical,
optional,
intent(in) :: calc_current
600 integer,
allocatable :: ind(:)
602 real(real64),
allocatable :: copy_occ(:)
603 logical :: calc_eigenval_
604 logical :: calc_current_
612 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
613 calc_eigenval = calc_eigenval_, calc_current = calc_current_)
615 if (st%restart_reorder_occs .and. .not. st%fromScratch)
then
616 message(1) =
"Reordering occupations for restart."
619 safe_allocate(ind(1:st%nst))
620 safe_allocate(copy_occ(1:st%nst))
623 call sort(st%eigenval(:, ik), ind)
624 copy_occ(1:st%nst) = st%occ(1:st%nst, ik)
626 st%occ(ist, ik) = copy_occ(ind(ist))
630 safe_deallocate_a(ind)
631 safe_deallocate_a(copy_occ)
641 subroutine v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
642 calc_eigenval, time, calc_energy, calc_current, force_semilocal)
643 type(
v_ks_t),
intent(inout) :: ks
648 type(
ions_t),
intent(in) :: ions
650 logical,
optional,
intent(in) :: calc_eigenval
651 real(real64),
optional,
intent(in) :: time
652 logical,
optional,
intent(in) :: calc_energy
653 logical,
optional,
intent(in) :: calc_current
654 logical,
optional,
intent(in) :: force_semilocal
656 logical :: calc_current_
662 call v_ks_calc_start(ks, namespace, space, hm, st, ions, hm%kpoints%latt, ext_partners, time, &
663 calc_energy, calc_current_, force_semilocal=force_semilocal)
665 ext_partners, force_semilocal=force_semilocal)
676 call lalg_axpy(ks%gr%np, st%d%nspin,
m_one, hm%magnetic_constrain%pot, hm%ks_pot%vhxc)
688 subroutine v_ks_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, &
689 calc_energy, calc_current, force_semilocal)
690 type(
v_ks_t),
target,
intent(inout) :: ks
692 class(
space_t),
intent(in) :: space
695 type(
ions_t),
intent(in) :: ions
698 real(real64),
optional,
intent(in) :: time
699 logical,
optional,
intent(in) :: calc_energy
700 logical,
optional,
intent(in) :: calc_current
701 logical,
optional,
intent(in) :: force_semilocal
703 logical :: calc_current_
708 .and. ks%calculate_current &
714 assert(.not. ks%calc%calculating)
715 ks%calc%calculating = .
true.
717 write(
message(1),
'(a)')
'Debug: Calculating Kohn-Sham potential.'
720 ks%calc%time_present =
present(time)
726 if (ks%frozen_hxc)
then
727 if (calc_current_)
then
737 allocate(ks%calc%energy)
741 ks%calc%energy%intnvxc =
m_zero
743 nullify(ks%calc%total_density)
753 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
call v_a_xc(hm, force_semilocal)
755 ks%calc%total_density_alloc = .false.
758 if (calc_current_)
then
767 nullify(ks%calc%hf_st)
772 if (st%parallel_in_states)
then
774 call messages_write(
'State parallelization of Hartree-Fock exchange is not supported')
776 call messages_write(
'when running with OpenCL/CUDA. Please use domain parallelization')
778 call messages_write(
"or disable acceleration using 'DisableAccel = yes'.")
783 if (hm%exxop%useACE)
then
786 safe_allocate(ks%calc%hf_st)
796 if (hm%self_induced_magnetic)
then
797 safe_allocate(ks%calc%a_ind(1:ks%gr%np_part, 1:space%dim))
798 safe_allocate(ks%calc%b_ind(1:ks%gr%np_part, 1:space%dim))
799 call magnetic_induced(namespace, ks%gr, st, hm%psolver, hm%kpoints, ks%calc%a_ind, ks%calc%b_ind)
802 if ((ks%has_photons) .and. (ks%calc%time_present) .and. (ks%xc_photon == 0) )
then
803 call mf_calc(ks%pt_mx, ks%gr, st, ions, ks%pt, time)
821 safe_allocate(ks%calc%density(1:ks%gr%np, 1:st%d%nspin))
826 call lalg_scal(ks%gr%np, st%d%nspin, ks%sic%amaldi_factor, ks%calc%density)
829 nullify(ks%calc%total_density)
830 if (
allocated(st%rho_core) .or. hm%d%spin_channels > 1)
then
831 ks%calc%total_density_alloc = .
true.
833 safe_allocate(ks%calc%total_density(1:ks%gr%np))
836 ks%calc%total_density(ip) = sum(ks%calc%density(ip, 1:hm%d%spin_channels))
840 if (
allocated(st%rho_core))
then
841 call lalg_axpy(ks%gr%np, -ks%sic%amaldi_factor, st%rho_core, ks%calc%total_density)
844 ks%calc%total_density_alloc = .false.
845 ks%calc%total_density => ks%calc%density(:, 1)
852 subroutine v_a_xc(hm, force_semilocal)
854 logical,
optional,
intent(in) :: force_semilocal
861 ks%calc%energy%exchange =
m_zero
862 ks%calc%energy%correlation =
m_zero
863 ks%calc%energy%xc_j =
m_zero
864 ks%calc%energy%vdw =
m_zero
866 allocate(ks%calc%vxc(1:ks%gr%np, 1:st%d%nspin))
870 safe_allocate(ks%calc%vtau(1:ks%gr%np, 1:st%d%nspin))
875 if (ks%calc%calc_energy)
then
877 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
878 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
879 deltaxc = ks%calc%energy%delta_xc, vtau = ks%calc%vtau, force_orbitalfree=force_semilocal)
881 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
882 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
883 deltaxc = ks%calc%energy%delta_xc, stress_xc=ks%stress_xc_gga, force_orbitalfree=force_semilocal)
887 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
888 st%d%ispin, latt%rcell_volume, ks%calc%vxc, vtau = ks%calc%vtau, force_orbitalfree=force_semilocal)
890 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
891 st%d%ispin, latt%rcell_volume, ks%calc%vxc, stress_xc=ks%stress_xc_gga, force_orbitalfree=force_semilocal)
897 if (st%d%ispin /=
spinors)
then
898 message(1) =
"Noncollinear functionals can only be used with spinor wavefunctions."
903 message(1) =
"Cannot perform LCAO for noncollinear MGGAs."
904 message(2) =
"Please perform a LDA calculation first."
908 if (ks%calc%calc_energy)
then
910 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
911 vtau = ks%calc%vtau, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
913 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
914 ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
918 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, &
919 ks%calc%vxc, vtau = ks%calc%vtau)
921 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc)
937 if (ks%calc%calc_energy)
then
938 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
939 ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
941 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
953 call x_slater_calc(namespace, ks%gr, space, hm%exxop, st, hm%kpoints, ks%calc%energy%exchange, &
956 call x_fbe_calc(ks%xc%functional(
func_x,1)%id, namespace, hm%psolver, ks%gr, st, space, &
957 ks%calc%energy%exchange, vxc = ks%calc%vxc)
961 call fbe_c_lda_sl(namespace, hm%psolver, ks%gr, st, space, &
962 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%xc_photon /= 0)
then
977 call ks%xc_photons%v_ks(namespace, ks%calc%total_density, ks%gr, space, hm%psolver, hm%ep, st)
980 do ispin = 1, hm%d%spin_channels
981 call lalg_axpy(ks%gr%np,
m_one, ks%xc_photons%vpx(1:ks%gr%np), ks%calc%vxc(1:ks%gr%np, ispin) )
985 ks%calc%energy%photon_exchange = ks%xc_photons%ex
990 call ks%vdw%calc(namespace, space, latt, ions%atom, ions%natoms, ions%pos, &
991 ks%gr, st, ks%calc%energy%vdw, ks%calc%vxc)
993 if (ks%calc%calc_energy)
then
1012 subroutine v_ks_calc_finish(ks, hm, namespace, space, latt, st, ext_partners, force_semilocal)
1013 type(
v_ks_t),
target,
intent(inout) :: ks
1016 class(
space_t),
intent(in) :: space
1020 logical,
optional,
intent(in) :: force_semilocal
1022 integer :: ip, ispin
1025 real(real64) :: exx_energy
1026 real(real64) :: factor
1030 assert(ks%calc%calculating)
1031 ks%calc%calculating = .false.
1033 if (ks%frozen_hxc)
then
1039 safe_deallocate_a(hm%energy)
1040 call move_alloc(ks%calc%energy, hm%energy)
1042 if (hm%self_induced_magnetic)
then
1043 hm%a_ind(1:ks%gr%np, 1:space%dim) = ks%calc%a_ind(1:ks%gr%np, 1:space%dim)
1044 hm%b_ind(1:ks%gr%np, 1:space%dim) = ks%calc%b_ind(1:ks%gr%np, 1:space%dim)
1046 safe_deallocate_a(ks%calc%a_ind)
1047 safe_deallocate_a(ks%calc%b_ind)
1050 if (
allocated(hm%v_static))
then
1051 hm%energy%intnvstatic =
dmf_dotp(ks%gr, ks%calc%total_density, hm%v_static)
1053 hm%energy%intnvstatic =
m_zero
1059 hm%energy%intnvxc =
m_zero
1060 hm%energy%hartree =
m_zero
1061 hm%energy%exchange =
m_zero
1062 hm%energy%exchange_hf =
m_zero
1063 hm%energy%correlation =
m_zero
1066 hm%energy%hartree =
m_zero
1067 call v_ks_hartree(namespace, ks, space, hm, ext_partners)
1073 call dxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1074 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1076 call zxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1077 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1086 call dxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1087 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1089 call zxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1090 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1099 hm, st, space, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1102 hm, st, space, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1104 hm%energy%photon_exchange = ks%oep_photon%pt%ex
1108 if (ks%calc%calc_energy)
then
1110 hm%energy%intnvxc =
m_zero
1113 do ispin = 1, hm%d%nspin
1114 if (ispin <= 2)
then
1119 hm%energy%intnvxc = hm%energy%intnvxc + &
1120 factor*
dmf_dotp(ks%gr, st%rho(:, ispin), ks%calc%vxc(:, ispin), reduce = .false.)
1122 call ks%gr%allreduce(hm%energy%intnvxc)
1127 if (ks%theory_level /=
hartree .and. ks%theory_level /=
rdmft)
then
1129 safe_deallocate_a(hm%ks_pot%vxc)
1130 call move_alloc(ks%calc%vxc, hm%ks_pot%vxc)
1133 call hm%ks_pot%set_vtau(ks%calc%vtau)
1134 safe_deallocate_a(ks%calc%vtau)
1140 hm%energy%intnvxc = hm%energy%intnvxc &
1143 hm%energy%intnvxc = hm%energy%intnvxc &
1153 if (.not. ks%xc_photon_include_hartree)
then
1154 hm%energy%hartree =
m_zero
1155 hm%ks_pot%vhartree =
m_zero
1161 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vxc(ip, 1) + hm%ks_pot%vhartree(ip)
1163 if (
allocated(hm%vberry))
then
1165 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vhxc(ip, 1) + hm%vberry(ip, 1)
1171 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vxc(ip, 2) + hm%ks_pot%vhartree(ip)
1173 if (
allocated(hm%vberry))
then
1175 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vhxc(ip, 2) + hm%vberry(ip, 2)
1180 if (hm%d%ispin ==
spinors)
then
1183 hm%ks_pot%vhxc(ip, ispin) = hm%ks_pot%vxc(ip, ispin)
1189 hm%energy%exchange_hf =
m_zero
1191 .or. ks%theory_level ==
rdmft &
1195 if (.not. hm%exxop%useACE)
then
1197 if (
associated(hm%exxop%st))
then
1200 safe_deallocate_p(hm%exxop%st)
1211 select case (ks%theory_level)
1225 if (hm%exxop%useACE)
then
1229 ks%calc%hf_st, xst, hm%kpoints, exx_energy)
1233 ks%calc%hf_st, xst, hm%kpoints, exx_energy)
1234 if (hm%phase%is_allocated())
then
1241 exx_energy = exx_energy + hm%exxop%singul%energy
1245 select case (ks%theory_level)
1248 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1251 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1269 if (ks%has_photons .and. (ks%xc_photon == 0))
then
1270 if (
associated(ks%pt_mx%vmf))
then
1271 forall(ip = 1:ks%gr%np) hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vhxc(ip, 1) + ks%pt_mx%vmf(ip)
1273 forall(ip = 1:ks%gr%np) hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vhxc(ip, 2) + ks%pt_mx%vmf(ip)
1276 hm%ep%photon_forces(1:space%dim) = ks%pt_mx%fmf(1:space%dim)
1279 if (ks%vdw%vdw_correction /= option__vdwcorrection__none)
then
1280 hm%ep%vdw_forces(:, :) = ks%vdw%forces(:, :)
1281 hm%ep%vdw_stress = ks%vdw%stress
1282 safe_deallocate_a(ks%vdw%forces)
1284 hm%ep%vdw_forces = 0.0_real64
1287 if (ks%calc%time_present .or. hm%time_zero)
then
1288 call hm%update(ks%gr, namespace, space, ext_partners, time = ks%calc%time)
1294 safe_deallocate_a(ks%calc%density)
1295 if (ks%calc%total_density_alloc)
then
1296 safe_deallocate_p(ks%calc%total_density)
1298 nullify(ks%calc%total_density)
1309 subroutine v_ks_hartree(namespace, ks, space, hm, ext_partners)
1311 type(
v_ks_t),
intent(inout) :: ks
1312 class(
space_t),
intent(in) :: space
1320 call dpoisson_solve(hm%psolver, namespace, hm%ks_pot%vhartree, ks%calc%total_density, reset=.false.)
1326 if (ks%calc%calc_energy)
then
1328 hm%energy%hartree =
m_half*
dmf_dotp(ks%gr, ks%calc%total_density, hm%ks_pot%vhartree)
1332 if(ks%calc%time_present)
then
1335 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick, time=ks%calc%time)
1338 ks%calc%total_density, hm%energy%pcm_corr, time=ks%calc%time)
1343 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick)
1346 ks%calc%total_density, hm%energy%pcm_corr)
1357 type(
v_ks_t),
intent(inout) :: ks
1361 ks%frozen_hxc = .
true.
1368 type(
v_ks_t),
intent(inout) :: this
1369 logical,
intent(in) :: calc_cur
1373 this%calculate_current = calc_cur
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,...
pure logical function, public accel_is_enabled()
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, ex, F_out)
subroutine, public dexchange_operator_compute_potentials(this, namespace, space, gr, st, xst, kpoints, ex, F_out)
subroutine, public zexchange_operator_ace(this, namespace, mesh, st, xst, phase)
subroutine, public exchange_operator_reinit(this, omega, alpha, beta, st)
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
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.
A module to handle KS potential, without the external potential.
integer, parameter, public rdmft
integer, parameter, public hartree
integer, parameter, public hartree_fock
integer, parameter, public independent_particles
integer, parameter, public generalized_kohn_sham_dft
integer, parameter, public kohn_sham_dft
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
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_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, calc_energy, calc_current, 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)
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, psolver, 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_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)
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)
logical pure function, public family_is_hybrid(xcs)
Returns true if the functional is an hybrid functional.
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...
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.
Extension of space that contains the knowledge of the spin dimension.
Description of the grid, containing information on derivatives, stencil, and symmetries.
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()