48 use,
intrinsic :: iso_fortran_env
136 type(space_t),
private :: space
137 type(states_elec_dim_t) :: d
138 type(hamiltonian_elec_base_t) :: hm_base
139 type(phase_t) :: phase
140 type(energy_t),
allocatable :: energy
141 type(absorbing_boundaries_t) :: abs_boundaries
142 type(ks_potential_t) :: ks_pot
143 real(real64),
allocatable :: vberry(:,:)
145 type(derivatives_t),
pointer,
private :: der
147 type(nonlocal_pseudopotential_t) :: vnl
149 type(ions_t),
pointer :: ions
150 logical,
private :: owns_ions = .false.
151 logical,
private :: is_copy_snapshot = .false.
152 real(real64) :: exx_coef
154 type(poisson_t) :: psolver
157 logical :: self_induced_magnetic
158 real(real64),
allocatable :: a_ind(:, :)
159 real(real64),
allocatable :: b_ind(:, :)
161 integer :: theory_level
162 type(xc_t),
pointer :: xc
163 type(xc_photons_t),
pointer :: xc_photons
169 logical,
private :: adjoint
172 real(real64),
private :: mass
175 logical,
private :: inh_term
176 type(states_elec_t) :: inh_st
180 type(oct_exchange_t) :: oct_exchange
182 type(scissor_t) :: scissor
184 real(real64) :: current_time
185 logical,
private :: is_applied_packed
188 type(lda_u_t) :: lda_u
189 integer :: lda_u_level
191 logical,
public :: time_zero
193 type(exchange_operator_t),
public :: exxop
195 type(kpoints_t),
pointer,
public :: kpoints => null()
197 type(partner_list_t) :: external_potentials
198 real(real64),
allocatable,
public :: v_ext_pot(:)
199 real(real64),
allocatable,
public :: v_static(:)
201 type(ion_electron_local_potential_t) :: v_ie_loc
204 type(magnetic_constrain_t) :: magnetic_constrain
210 type(mxll_coupling_t) :: mxll
211 type(zora_t),
pointer :: zora => null()
224 integer,
public,
parameter :: &
233 mc, kpoints, need_exchange, xc_photons)
237 type(
grid_t),
target,
intent(inout) :: gr
238 type(
ions_t),
target,
intent(inout) :: ions
241 integer,
intent(in) :: theory_level
242 type(
xc_t),
target,
intent(in) :: xc
245 logical,
optional,
intent(in) :: need_exchange
249 logical :: need_exchange_
250 real(real64) :: rashba_coupling
257 hm%theory_level = theory_level
260 hm%kpoints => kpoints
286 if (space%dim /= 2)
then
287 write(
message(1),
'(a)')
'Rashba spin-orbit coupling can only be used for two-dimensional systems.'
293 call hm%hm_base%init(hm%d%nspin, hm%mass, rashba_coupling)
296 assert(
associated(gr%der%lapl))
297 hm%hm_base%kinetic => gr%der%lapl
299 safe_allocate(hm%energy)
304 hm%owns_ions = .false.
305 hm%is_copy_snapshot = .false.
308 if(
present(xc_photons))
then
309 hm%xc_photons => xc_photons
311 hm%xc_photons => null()
320 call poisson_init(hm%psolver, namespace, space, gr%der, mc, gr%stencil, st%qtot)
323 call epot_init(hm%ep, namespace, gr, hm%ions, hm%psolver, hm%d%ispin, hm%xc%family, hm%kpoints)
324 call kick_init(hm%kick, namespace, space, hm%kpoints, hm%d%ispin)
326 hm%zora =>
zora_t(namespace, hm%der, hm%d, hm%ep, hm%mass)
329 call hm%v_ie_loc%init(gr, hm%psolver, hm%ions, namespace)
331 call hm%nlcc%init(gr, hm%ions)
332 safe_allocate(st%rho_core(1:gr%np))
365 call parse_variable(namespace,
'CalculateSelfInducedMagneticField', .false., hm%self_induced_magnetic)
366 if (hm%self_induced_magnetic)
then
367 safe_allocate(hm%a_ind(1:gr%np_part, 1:space%dim))
368 safe_allocate(hm%b_ind(1:gr%np_part, 1:space%dim))
376 hm%inh_term = .false.
381 call hm%phase%init(gr, hm%d%kpt, hm%kpoints, st%d, space)
401 call lda_u_init(hm%lda_u, namespace, space, hm%lda_u_level, gr, ions, st, mc, hm%kpoints)
410 if(hm%lda_u_level /=
dft_u_none .and. hm%phase%is_allocated())
then
425 call parse_variable(namespace,
'HamiltonianApplyPacked', .
true., hm%is_applied_packed)
427 if (hm%theory_level ==
hartree_fock .and. st%parallel_in_states)
then
432 .and. st%parallel_in_states)
then
451 if (hm%xc%compute_exchange(hm%theory_level) .or. need_exchange_)
then
456 else if (
bitand(hm%xc%family, xc_family_oep) /= 0 .or. hm%theory_level ==
rdmft)
then
458 hm%kpoints, hm%xc%cam)
459 if (hm%theory_level ==
rdmft) hm%exxop%useACE = .false.
468 if (gr%use_curvilinear)
then
470 hm%is_applied_packed = .false.
471 call messages_write(
'Cannot use GPUs as curvilinear coordinates are used.')
474 call messages_write(
'Cannot use GPUs as curvilinear coordinates are used.', new_line = .
true.)
475 call messages_write(
'Calculation will not be continued. To force execution, set AllowCPUonly = yes.')
505 if (
associated(hm%xc_photons))
then
506 if (hm%xc_photons%wants_to_renormalize_mass())
then
508 call hm%set_mass(namespace, hm%xc_photons%get_renormalized_mass())
512 if (hm%xc%compute_exchange(hm%theory_level) .or. need_exchange_)
call hm%exxop%write_info(namespace)
522 class(*),
pointer :: potential
527 safe_allocate(hm%v_ext_pot(1:gr%np))
528 hm%v_ext_pot(1:gr%np) =
m_zero
530 call iter%start(hm%external_potentials)
531 do while (iter%has_next())
532 potential => iter%get_next()
533 select type (potential)
536 call potential%allocate_memory(gr)
537 call potential%calculate(namespace, gr, hm%psolver)
540 select case (potential%type)
546 message(1) =
"Cannot use static magnetic field with real wavefunctions"
550 if (.not.
allocated(hm%ep%b_field))
then
551 safe_allocate(hm%ep%b_field(1:3))
552 hm%ep%b_field(1:3) =
m_zero
554 hm%ep%b_field(1:3) = hm%ep%b_field(1:3) + potential%b_field(1:3)
556 if (.not.
allocated(hm%ep%a_static))
then
557 safe_allocate(hm%ep%a_static(1:gr%np, 1:space%dim))
558 hm%ep%a_static(1:gr%np, 1:space%dim) =
m_zero
560 call lalg_axpy(gr%np, space%dim,
m_one, potential%a_static, hm%ep%a_static)
563 if (.not.
allocated(hm%ep%e_field))
then
564 safe_allocate(hm%ep%e_field(1:space%dim))
565 hm%ep%e_field(1:space%dim) =
m_zero
567 hm%ep%e_field(1:space%dim) = hm%ep%e_field(1:space%dim) + potential%e_field(1:space%dim)
570 if (space%periodic_dim < space%dim)
then
571 if (.not.
allocated(hm%v_static))
then
572 safe_allocate(hm%v_static(1:gr%np))
573 hm%v_static(1:gr%np) =
m_zero
575 if (.not.
allocated(hm%ep%v_ext))
then
576 safe_allocate(hm%ep%v_ext(1:gr%np_part))
577 hm%ep%v_ext(1:gr%np_part) =
m_zero
583 if (hm%kpoints%use_symmetries)
then
587 message(1) =
"The StaticElectricField breaks (at least) one of the symmetries used to reduce the k-points."
588 message(2) =
"Set SymmetryBreakDir equal to StaticElectricField."
595 call potential%deallocate_memory()
608 class(*),
pointer :: potential
612 call iter%start(hm%external_potentials)
613 do while (iter%has_next())
614 potential => iter%get_next()
615 select type (potential)
619 message(1) =
"Applying StaticElectricField in a periodic direction is only accurate for large supercells."
620 message(2) =
"Single-point Berry phase is not appropriate when k-point sampling is needed."
636 logical :: external_potentials_present
637 logical :: kick_present
641 if (
allocated(hm%ep%e_field) .and. space%is_periodic() .and. .not.
list_has_gauge_field(ext_partners))
then
644 if (any(abs(hm%ep%e_field(1:space%periodic_dim)) >
m_epsilon))
then
645 safe_allocate(hm%vberry(1:gr%np, 1:hm%d%nspin))
656 call pcm_init(hm%pcm, namespace, space, ions, gr, st%qtot, st%val_charge, external_potentials_present, kick_present)
657 if (hm%pcm%run_pcm)
then
680 if (hm%is_copy_snapshot)
then
687 call hm%hm_base%end()
693 safe_deallocate_a(hm%vberry)
694 safe_deallocate_a(hm%a_ind)
695 safe_deallocate_a(hm%b_ind)
696 safe_deallocate_a(hm%v_ext_pot)
698 safe_deallocate_p(hm%zora)
706 if (hm%owns_ions .and.
associated(hm%ions))
then
709 if (
allocated(hm%ions%species))
then
710 safe_deallocate_a(hm%ions%species)
713 safe_deallocate_p(hm%ions)
714 hm%owns_ions = .false.
717 hm%owns_ions = .false.
729 safe_deallocate_a(hm%energy)
731 if (hm%pcm%run_pcm)
call pcm_end(hm%pcm)
733 call hm%v_ie_loc%end()
736 call iter%start(hm%external_potentials)
737 do while (iter%has_next())
738 potential => iter%get_next()
739 safe_deallocate_p(potential)
741 call hm%external_potentials%empty()
742 safe_deallocate_a(hm%v_static)
748 hm%is_copy_snapshot = .false.
765 if (hm%owns_ions .and.
associated(hm%ions))
then
766 if (
allocated(hm%ions%species))
then
767 safe_deallocate_a(hm%ions%species)
770 safe_deallocate_p(hm%ions)
771 hm%owns_ions = .false.
774 hm%owns_ions = .false.
777 if (
associated(hm%zora))
then
778 safe_deallocate_p(hm%zora)
781 call iter%start(hm%external_potentials)
782 do while (iter%has_next())
783 potential => iter%get_next()
784 safe_deallocate_p(potential)
786 call hm%external_potentials%empty()
788 call hm%hm_base%end()
794 hm%is_copy_snapshot = .false.
810 type(
ions_t),
pointer :: ions_out
811 type(
zora_t),
pointer :: zora_out
815 class(*),
pointer :: ptr
817 logical :: runtime_initialized
822 runtime_initialized =
associated(hm_in%kpoints)
824 call iter%start(hm_in%external_potentials)
825 do while (iter%has_next())
826 ptr => iter%get_next()
829 call external_potentials_in%add(ptr)
831 call external_potentials_out%add(ext_pot)
836 call hm_in%external_potentials%empty()
839 hm_out%is_copy_snapshot = .
true.
844 if (
accel_is_enabled() .and. runtime_initialized .and.
associated(hm_out%der))
then
851 call hm_out%external_potentials%empty()
852 call iter%start(external_potentials_out)
853 do while (iter%has_next())
854 ptr => iter%get_next()
857 call hm_out%external_potentials%add(ptr)
862 call iter%start(external_potentials_in)
863 do while (iter%has_next())
864 ptr => iter%get_next()
867 call hm_in%external_potentials%add(ptr)
872 call external_potentials_out%empty()
873 call external_potentials_in%empty()
875 if (runtime_initialized)
then
879 if (
allocated(hm_in%energy))
then
880 if (.not.
allocated(hm_out%energy)) safe_allocate(hm_out%energy)
883 safe_deallocate_a(hm_out%energy)
890 if (
associated(hm_in%ions))
then
891 safe_allocate(ions_out)
892 ions_out = hm_in%ions
893 hm_out%ions => ions_out
894 hm_out%owns_ions = .
true.
895 call hm_out%v_ie_loc%bind(hm_out%psolver, hm_out%ions)
896 call hm_out%nlcc%bind(hm_out%ions)
899 hm_out%owns_ions = .false.
900 nullify(hm_out%v_ie_loc%atoms_dist)
901 nullify(hm_out%v_ie_loc%atom)
902 nullify(hm_out%v_ie_loc%pos)
903 nullify(hm_out%nlcc%atoms_dist)
904 nullify(hm_out%nlcc%atom)
905 nullify(hm_out%nlcc%pos)
908 if (hm_out%lda_u_level /=
dft_u_none .and.
associated(hm_out%ions))
then
915 if (
associated(hm_in%zora))
then
916 allocate(zora_out, source=hm_in%zora)
917 hm_out%zora => zora_out
931 logical :: runtime_initialized
935 runtime_initialized =
associated(hm_in%kpoints)
936 if (.not. runtime_initialized)
then
945 if (
associated(hm_in%xc))
then
946 if (hm_in%xc%compute_exchange(hm_in%theory_level))
then
959 if (hm_in%pcm%run_pcm)
then
983 integer,
intent(in) :: terms
1004 real(real64),
intent(in) ::
delta(:)
1005 real(real64),
intent(in) :: emin
1008 real(real64) :: emax
1016 hm%spectral_middle_point = (emax + emin) /
m_two
1017 hm%spectral_half_span = (emax - emin) /
m_two
1040 hm%inh_term = .
true.
1052 if (hm%inh_term)
then
1054 hm%inh_term = .false.
1066 if (.not. hm%adjoint)
then
1069 hm%abs_boundaries%mf = -hm%abs_boundaries%mf
1083 if (hm%adjoint)
then
1084 hm%adjoint = .false.
1086 hm%abs_boundaries%mf = -hm%abs_boundaries%mf
1098 class(
mesh_t),
intent(in) :: mesh
1100 class(
space_t),
intent(in) :: space
1102 real(real64),
optional,
intent(in) :: time
1104 integer :: ispin, ip, idir, iatom, ilaser
1105 real(real64) :: aa(space%dim), time_
1106 real(real64),
allocatable :: vp(:,:)
1109 real(real64) :: am(space%dim)
1114 this%current_time =
m_zero
1115 if (
present(time)) this%current_time = time
1120 call this%hm_base%clear(mesh%np)
1127 if (
present(time) .or. this%time_zero)
then
1130 if(
associated(lasers))
then
1131 do ilaser = 1, lasers%no_lasers
1132 select case (
laser_kind(lasers%lasers(ilaser)))
1134 do ispin = 1, this%d%spin_channels
1136 this%hm_base%potential(:, ispin), time_)
1142 safe_allocate(vp(1:mesh%np, 1:space%dim))
1143 vp(1:mesh%np, 1:space%dim) =
m_zero
1147 do idir = 1, space%dim
1148 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) + vp(ip, idir)/
p_c
1152 call laser_field(lasers%lasers(ilaser), this%hm_base%uniform_magnetic_field(1:space%dim), time_)
1153 safe_deallocate_a(vp)
1158 call laser_field(lasers%lasers(ilaser), aa, time_)
1159 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - aa/
p_c
1164 assert(
allocated(this%hm_base%uniform_vector_potential))
1166 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - am/
p_c
1172 if (
associated(gfield))
then
1175 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - aa/
p_c
1179 if (
allocated(this%ep%e_field) .and.
associated(gfield))
then
1180 this%hm_base%uniform_vector_potential(1:space%periodic_dim) = &
1181 this%hm_base%uniform_vector_potential(1:space%periodic_dim) - time_*this%ep%e_field(1:space%periodic_dim)
1185 if (
associated(this%xc_photons))
then
1186 if(this%xc_photons%lpfmf .and.
allocated(this%xc_photons%mf_vector_potential))
then
1189 this%hm_base%uniform_vector_potential(1:space%dim) = &
1190 this%hm_base%uniform_vector_potential(1:space%dim) - this%xc_photons%mf_vector_potential(1:space%dim)/
p_c
1197 if (
allocated(this%ep%a_static))
then
1202 do idir = 1, space%dim
1203 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) + this%ep%a_static(ip, idir)
1212 call this%hm_base%accel_copy_pot(mesh)
1215 if (
allocated(this%ep%b_field))
then
1218 this%hm_base%uniform_magnetic_field(idir) = this%hm_base%uniform_magnetic_field(idir) + this%ep%b_field(idir)
1223 call this%hm_base%update_magnetic_terms(mesh, this%ep%gyromagnetic_ratio, this%d%ispin)
1228 if (this%mxll%test_equad)
then
1240 integer :: ik, imat, nmat, max_npoints, offset
1242 integer :: iphase, nphase
1246 if ((.not. this%kpoints%gamma_only()) .or.
allocated(this%hm_base%uniform_vector_potential))
then
1250 do iatom = 1, this%ep%natoms
1251 call projector_init_phases(this%ep%proj(iatom), space%dim, this%d, this%der%boundaries, this%kpoints, &
1252 vec_pot = this%hm_base%uniform_vector_potential, vec_pot_var = this%hm_base%vector_potential)
1258 if (
allocated(this%hm_base%uniform_vector_potential))
then
1260 call this%phase%update(mesh, this%d%kpt, this%kpoints, this%d, space, this%hm_base%uniform_vector_potential)
1265 vec_pot = this%hm_base%uniform_vector_potential, vec_pot_var = this%hm_base%vector_potential)
1269 max_npoints = this%vnl%max_npoints
1270 nmat = this%vnl%nprojector_matrices
1273 if (this%phase%is_allocated() .and.
allocated(this%vnl%projector_matrices))
then
1276 if (this%der%boundaries%spiralBC) nphase = 3
1278 if (.not.
allocated(this%vnl%projector_phases))
then
1279 safe_allocate(this%vnl%projector_phases(1:max_npoints, 1:nphase, nmat, this%d%kpt%start:this%d%kpt%end))
1282 type_cmplx, this%vnl%total_points*nphase*this%d%kpt%nlocal)
1285 this%vnl%nphase = nphase
1290 do ik = this%d%kpt%start, this%d%kpt%end
1291 do imat = 1, this%vnl%nprojector_matrices
1292 iatom = this%vnl%projector_to_atom(imat)
1293 do iphase = 1, nphase
1295 do ip = 1, this%vnl%projector_matrices(imat)%npoints
1296 this%vnl%projector_phases(ip, iphase, imat, ik) = this%ep%proj(iatom)%phase(ip, iphase, ik)
1299 if (
accel_is_enabled() .and. this%vnl%projector_matrices(imat)%npoints > 0)
then
1301 this%vnl%projector_matrices(imat)%npoints, this%vnl%projector_phases(1:, iphase, imat, ik), &
1302 offset = offset, async=.
true.)
1304 offset = offset + this%vnl%projector_matrices(imat)%npoints
1325 class(
mesh_t),
intent(in) :: mesh
1326 logical,
optional,
intent(in) :: accumulate
1328 integer :: ispin, ip
1335 do ispin = 1, this%d%nspin
1338 this%hm_base%potential(ip, ispin) =
m_zero
1343 this%hm_base%Impotential =
m_zero
1348 do ispin = 1, this%d%nspin
1349 if (ispin <= 2)
then
1353 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + this%ep%vpsl(ip) + this%v_ext_pot(ip)
1357 if (this%pcm%run_pcm)
then
1358 if (this%pcm%solute)
then
1361 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + &
1362 this%pcm%v_e_rs(ip) + this%pcm%v_n_rs(ip)
1366 if (this%pcm%localf)
then
1369 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + &
1370 this%pcm%v_ext_rs(ip)
1380 this%hm_base%Impotential(ip, ispin) = this%hm_base%Impotential(ip, ispin) + this%abs_boundaries%mf(ip)
1391 call this%zora%update(this%der, this%hm_base%potential)
1395 do ispin = 1, this%d%nspin
1397 if (
allocated(this%hm_base%zeeman_pot))
then
1400 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + this%hm_base%zeeman_pot(ip, ispin)
1406 if (this%mxll%test_equad)
then
1409 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + this%mxll%e_quadrupole_pot(ip)
1418 call this%ks_pot%add_vhxc(this%hm_base%potential)
1420 call this%hm_base%accel_copy_pot(mesh)
1430 type(
grid_t),
intent(in) :: gr
1431 type(
ions_t),
target,
intent(inout) :: ions
1434 real(real64),
optional,
intent(in) :: time
1439 call epot_generate(this%ep, namespace, gr, this%ions, this%d)
1444 if (
allocated(this%ep%e_field) .and. space%periodic_dim < space%dim)
then
1450 this%v_ie_loc%atoms_dist => ions%atoms_dist
1451 this%v_ie_loc%atom => ions%atom
1452 call this%v_ie_loc%calculate()
1455 call lalg_axpy(gr%np,
m_one, this%v_ie_loc%potential(:,1), this%ep%vpsl)
1459 if (this%ep%nlcc)
then
1460 call this%nlcc%end()
1461 call this%nlcc%init(gr, ions)
1462 call this%nlcc%calculate()
1463 call lalg_copy(gr%np, this%nlcc%density(:,1), st%rho_core)
1466 call this%vnl%build(space, gr, this%ep)
1471 if (this%ep%non_local .and. .not. this%vnl%apply_projector_matrices)
then
1473 call messages_write(
'Relativistic pseudopotentials have not been fully implemented for GPUs.')
1476 call messages_write(
'Relativistic pseudopotentials have not been fully implemented for GPUs.',&
1478 call messages_write(
'Calculation will not be continued. To force execution, set AllowCPUonly = yes.')
1485 if (this%pcm%run_pcm)
then
1488 if (this%pcm%solute)
then
1495 if (this%pcm%localf .and.
allocated(this%v_static))
then
1496 call pcm_calc_pot_rs(this%pcm, gr, this%psolver, v_ext = this%ep%v_ext(1:gr%np_part))
1501 call lda_u_update_basis(this%lda_u, space, gr, ions, st, this%psolver, namespace, this%kpoints, &
1502 this%phase%is_allocated())
1512 time = this%current_time
1520 apply = this%is_applied_packed
1528 type(namespace_t),
intent(in) :: namespace
1529 class(space_t),
intent(in) :: space
1530 type(lattice_vectors_t),
intent(in) :: latt
1531 class(species_t),
intent(in) :: species
1532 real(real64),
intent(in) :: pos(1:space%dim)
1533 integer,
intent(in) :: ia
1534 class(mesh_t),
intent(in) :: mesh
1535 complex(real64),
intent(in) :: psi(:,:)
1536 complex(real64),
intent(out) :: vpsi(:,:)
1539 real(real64),
allocatable :: vlocal(:)
1542 safe_allocate(vlocal(1:mesh%np_part))
1544 call epot_local_potential(hm%ep, namespace, space, latt, mesh, species, pos, ia, vlocal)
1546 do idim = 1, hm%d%dim
1547 vpsi(1:mesh%np, idim) = vlocal(1:mesh%np) * psi(1:mesh%np, idim)
1550 safe_deallocate_a(vlocal)
1561 class(space_t),
intent(in) :: space
1562 class(mesh_t),
intent(in) :: mesh
1563 type(partner_list_t),
intent(in) :: ext_partners
1564 real(real64),
intent(in) :: time(1:2)
1565 real(real64),
intent(in) :: mu(1:2)
1567 integer :: ispin, ip, idir, iatom, ilaser, itime
1568 real(real64) :: aa(space%dim), bb(space%dim), time_
1569 real(real64),
allocatable :: vp(:,:)
1570 real(real64),
allocatable :: velectric(:)
1571 type(lasers_t),
pointer :: lasers
1572 type(gauge_field_t),
pointer :: gfield
1575 call profiling_in(
"HAMILTONIAN_ELEC_UPDATE_EXT_POT")
1577 this%current_time = m_zero
1578 this%current_time = time(1)
1581 call this%hm_base%clear(mesh%np)
1584 call this%hm_base%allocate_field(mesh, field_potential, &
1585 complex_potential = this%abs_boundaries%abtype == imaginary_absorbing)
1590 lasers => list_get_lasers(ext_partners)
1591 if(
associated(lasers))
then
1592 do ilaser = 1, lasers%no_lasers
1593 select case (laser_kind(lasers%lasers(ilaser)))
1594 case (e_field_scalar_potential, e_field_electric)
1595 safe_allocate(velectric(1:mesh%np))
1596 do ispin = 1, this%d%spin_channels
1598 call laser_potential(lasers%lasers(ilaser), mesh, velectric, time_)
1601 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + mu(itime) * velectric(ip)
1604 safe_deallocate_a(velectric)
1605 case (e_field_magnetic)
1606 call this%hm_base%allocate_field(mesh, field_vector_potential + field_uniform_magnetic_field, .false.)
1608 safe_allocate(vp(1:mesh%np, 1:space%dim))
1609 vp(1:mesh%np, 1:space%dim) = m_zero
1610 call laser_vector_potential(lasers%lasers(ilaser), mesh, vp, time_)
1611 do idir = 1, space%dim
1614 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) &
1615 - mu(itime) * vp(ip, idir)/p_c
1620 call laser_field(lasers%lasers(ilaser), bb(1:space%dim), time_)
1621 this%hm_base%uniform_magnetic_field = this%hm_base%uniform_magnetic_field &
1623 safe_deallocate_a(vp)
1624 case (e_field_vector_potential)
1625 call this%hm_base%allocate_field(mesh, field_uniform_vector_potential, .false.)
1628 call laser_field(lasers%lasers(ilaser), aa, time_)
1629 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) &
1630 - mu(itime) * aa/p_c
1636 gfield => list_get_gauge_field(ext_partners)
1637 if (
associated(gfield))
then
1638 call this%hm_base%allocate_field(mesh, field_uniform_vector_potential, .false.)
1639 call gauge_field_get_vec_pot(gfield, aa)
1640 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - aa/p_c
1647 if (
allocated(this%ep%e_field) .and.
associated(gfield))
then
1648 this%hm_base%uniform_vector_potential(1:space%periodic_dim) = &
1649 this%hm_base%uniform_vector_potential(1:space%periodic_dim) - time_*this%ep%e_field(1:space%periodic_dim)
1655 if (
allocated(this%ep%a_static))
then
1656 call this%hm_base%allocate_field(mesh, field_vector_potential, .false.)
1660 do idir = 1, space%dim
1661 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) + this%ep%a_static(ip, idir)
1667 call this%hm_base%accel_copy_pot(mesh)
1670 if (
allocated(this%ep%b_field))
then
1671 call this%hm_base%allocate_field(mesh, field_uniform_magnetic_field, .false.)
1673 this%hm_base%uniform_magnetic_field(idir) = this%hm_base%uniform_magnetic_field(idir) + this%ep%b_field(idir)
1677 call this%hm_base%update_magnetic_terms(mesh, this%ep%gyromagnetic_ratio, this%d%ispin)
1683 call profiling_out(
"HAMILTONIAN_ELEC_UPDATE_EXT_POT")
1689 integer :: ik, imat, nmat, max_npoints, offset, iphase, nphase
1693 if ((.not. this%kpoints%gamma_only()) .or.
allocated(this%hm_base%uniform_vector_potential))
then
1695 call profiling_in(
'UPDATE_PHASES')
1697 do iatom = 1, this%ep%natoms
1698 call projector_init_phases(this%ep%proj(iatom), space%dim, this%d, this%der%boundaries, this%kpoints, &
1699 vec_pot = this%hm_base%uniform_vector_potential, vec_pot_var = this%hm_base%vector_potential)
1702 call profiling_out(
'UPDATE_PHASES')
1705 if (
allocated(this%hm_base%uniform_vector_potential))
then
1706 call this%phase%update(mesh, this%d%kpt, this%kpoints, this%d, space, this%hm_base%uniform_vector_potential)
1709 max_npoints = this%vnl%max_npoints
1710 nmat = this%vnl%nprojector_matrices
1713 if (this%phase%is_allocated() .and.
allocated(this%vnl%projector_matrices))
then
1716 if (this%der%boundaries%spiralBC) nphase = 3
1718 if (.not.
allocated(this%vnl%projector_phases))
then
1719 safe_allocate(this%vnl%projector_phases(1:max_npoints, nphase, nmat, this%d%kpt%start:this%d%kpt%end))
1720 if (accel_is_enabled())
then
1721 call accel_create_buffer(this%vnl%buff_projector_phases, accel_mem_read_only, &
1722 type_cmplx, this%vnl%total_points*nphase*this%d%kpt%nlocal)
1727 do ik = this%d%kpt%start, this%d%kpt%end
1728 do imat = 1, this%vnl%nprojector_matrices
1729 iatom = this%vnl%projector_to_atom(imat)
1730 do iphase = 1, nphase
1732 do ip = 1, this%vnl%projector_matrices(imat)%npoints
1733 this%vnl%projector_phases(ip, iphase, imat, ik) = this%ep%proj(iatom)%phase(ip, iphase, ik)
1736 if (accel_is_enabled() .and. this%vnl%projector_matrices(imat)%npoints > 0)
then
1737 call accel_write_buffer(this%vnl%buff_projector_phases, &
1738 this%vnl%projector_matrices(imat)%npoints, this%vnl%projector_phases(1:, iphase, imat, ik), &
1741 offset = offset + this%vnl%projector_matrices(imat)%npoints
1755 logical,
intent(in) :: states_are_real
1759 if (hm%self_induced_magnetic)
then
1760 if (.not. states_are_real)
then
1763 message(1) =
'No current density for real states since it is identically zero.'
1764 call messages_warning(1)
1773 type(namespace_t),
intent(in) :: namespace
1774 type(grid_t),
intent(in) :: gr
1775 type(states_elec_t),
intent(inout) :: st
1776 type(states_elec_t),
intent(inout) :: hst
1778 integer :: ik, ib, ist
1779 complex(real64),
allocatable :: psi(:, :)
1780 complex(real64),
allocatable :: psiall(:, :, :, :)
1784 do ik = st%d%kpt%start, st%d%kpt%end
1785 do ib = st%group%block_start, st%group%block_end
1790 if (oct_exchange_enabled(hm%oct_exchange))
then
1792 safe_allocate(psiall(gr%np_part, 1:hst%d%dim, st%st_start:st%st_end, st%d%kpt%start:st%d%kpt%end))
1794 call states_elec_get_state(st, gr, psiall)
1796 call oct_exchange_prepare(hm%oct_exchange, gr, psiall, hm%xc, hm%psolver, namespace)
1798 safe_deallocate_a(psiall)
1800 safe_allocate(psi(gr%np_part, 1:hst%d%dim))
1804 call states_elec_get_state(hst, gr, ist, ik, psi)
1805 call oct_exchange_operator(hm%oct_exchange, namespace, gr, psi, ist, ik)
1806 call states_elec_set_state(hst, gr, ist, ik, psi)
1810 safe_deallocate_a(psi)
1832 type(namespace_t),
intent(in) :: namespace
1833 real(real64),
intent(in) :: mass
1837 if (parse_is_defined(namespace,
'ParticleMass'))
then
1838 message(1) =
'Attempting to redefine a non-unit electron mass'
1839 call messages_fatal(1)
1850 class(mesh_t),
intent(in) :: mesh
1851 real(real64),
contiguous,
intent(out) :: diag(:,:)
1852 integer,
intent(in) :: ik
1854 integer :: idim, ip, ispin
1856 real(real64),
allocatable :: ldiag(:)
1860 safe_allocate(ldiag(1:mesh%np))
1864 call derivatives_lapl_diag(hm%der, ldiag)
1866 do idim = 1, hm%d%dim
1867 diag(1:mesh%np, idim) = -m_half/hm%mass*ldiag(1:mesh%np)
1870 select case (hm%d%ispin)
1872 case (unpolarized, spin_polarized)
1873 ispin = hm%d%get_spin_index(ik)
1874 diag(1:mesh%np, 1) = diag(1:mesh%np, 1) + hm%ep%vpsl(1:mesh%np)
1878 diag(ip, 1) = diag(ip, 1) + hm%ep%vpsl(ip)
1879 diag(ip, 2) = diag(ip, 2) + hm%ep%vpsl(ip)
1884 call hm%ks_pot%add_vhxc(diag)
1893#include "hamiltonian_elec_inc.F90"
1896#include "complex.F90"
1897#include "hamiltonian_elec_inc.F90"
subroutine build_external_potentials()
subroutine external_potentials_checks()
subroutine build_interactions()
constant times a vector plus a vector
Copies a vector x, to a vector y.
integer, parameter, public imaginary_absorbing
subroutine, public absorbing_boundaries_end(this)
subroutine, public absorbing_boundaries_init(this, namespace, space, gr)
pure logical function, public accel_allow_cpu_only()
subroutine, public accel_finish()
pure logical function, public accel_is_enabled()
integer, parameter, public accel_mem_read_only
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
Module implementing boundary conditions in Octopus.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
real(real64) function, public derivatives_lapl_get_max_eigenvalue(this)
Get maximum eigenvalue of discrete Laplacian. For the star and star_general stencils,...
subroutine, public energy_copy(ein, eout)
subroutine, public epot_bind_poisson_solver(ep, psolver)
Bind the Poisson solver if the potential manages a density. The Poisson solver pointer is aliased whe...
logical function, public epot_have_external_potentials(ep)
integer, parameter, public scalar_relativistic_zora
subroutine, public epot_end(ep)
integer, parameter, public fully_relativistic_zora
subroutine, public epot_init(ep, namespace, gr, ions, psolver, ispin, xc_family, kpoints)
subroutine, public epot_generate(ep, namespace, mesh, ions, st_d)
subroutine, public exchange_operator_init(this, namespace, space, st, der, mc, stencil, kpoints, cam)
subroutine, public exchange_operator_end(this)
logical function, public list_has_gauge_field(partners)
type(gauge_field_t) function, pointer, public list_get_gauge_field(partners)
logical function, public list_has_lasers(partners)
type(lasers_t) function, pointer, public list_get_lasers(partners)
integer, parameter, public external_pot_from_file
potential, defined in a file
subroutine, public load_external_potentials(external_potentials, namespace)
integer, parameter, public external_pot_charge_density
user-defined function for charge density
integer, parameter, public external_pot_usdef
user-defined function for local potential
integer, parameter, public external_pot_static_efield
Static electric field.
integer, parameter, public external_pot_static_bfield
Static magnetic field.
subroutine, public external_potential_clone(pot_out, pot_in)
Deep-clone an external potential instance.
subroutine, public gauge_field_get_vec_pot(this, vec_pot)
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 p_c
Electron gyromagnetic ratio, see Phys. Rev. Lett. 130, 071801 (2023)
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
This module defines an abstract class for Hamiltonians.
integer, parameter, public field_uniform_magnetic_field
integer, parameter, public field_uniform_vector_potential
integer, parameter, public field_vector_potential
integer, parameter, public term_mgga
subroutine, public hamiltonian_elec_base_accel_rebuild(this, mesh)
Rebuild accelerator buffers after an intrinsic copy.
integer, parameter, public field_potential
pure logical function, public hamiltonian_elec_apply_packed(this)
subroutine, public hamiltonian_elec_set_inh(hm, st)
subroutine, public zvmask(mesh, hm, st)
subroutine, public zhamiltonian_elec_apply_batch(hm, namespace, mesh, psib, hpsib, terms, set_bc)
subroutine, public hamiltonian_elec_adjoint(hm)
subroutine, public hamiltonian_elec_end(hm)
subroutine, public zhamiltonian_elec_apply_single(hm, namespace, mesh, psi, hpsi, ist, ik, terms, set_bc, set_phase)
pure logical function hamiltonian_elec_needs_mgga_term(hm, terms)
logical function, public hamiltonian_elec_has_kick(hm)
logical function hamiltonian_elec_hermitian(hm)
subroutine, public dhamiltonian_elec_apply_single(hm, namespace, mesh, psi, hpsi, ist, ik, terms, set_bc, set_phase)
subroutine, public hamiltonian_elec_epot_generate(this, namespace, space, gr, ions, ext_partners, st, time)
real(real64) function, public hamiltonian_elec_get_time(this)
subroutine, public hamiltonian_elec_copy(hm_out, hm_in)
Deep-copy a hamiltonian_elec_t snapshot.
subroutine, public dvmask(mesh, hm, st)
logical function, public hamiltonian_elec_needs_current(hm, states_are_real)
subroutine, public hamiltonian_elec_remove_inh(hm)
subroutine, public zhamiltonian_elec_apply_atom(hm, namespace, space, latt, species, pos, ia, mesh, psi, vpsi)
subroutine hamiltonian_elec_release_copy_owned(hm)
Release owned pointer targets created by hamiltonian_elec_copy.
subroutine, public zhamiltonian_elec_apply_all(hm, namespace, gr, st, hst)
subroutine, public hamiltonian_elec_diagonal(hm, mesh, diag, ik)
subroutine, public hamiltonian_elec_update_pot(this, mesh, accumulate)
Update the KS potential of the electronic Hamiltonian.
integer, parameter, public velocity
subroutine hamiltonian_elec_update(this, mesh, namespace, space, ext_partners, time)
(re-)build the Hamiltonian for the next application:
subroutine hamiltonian_elec_copy_guard_supported(hm_in)
Hard-fail guard matrix for unsupported hamiltonian snapshots.
subroutine hamiltonian_elec_span(hm, delta, emin, namespace)
subroutine, public hamiltonian_elec_init(hm, namespace, space, gr, ions, ext_partners, st, theory_level, xc, mc, kpoints, need_exchange, xc_photons)
subroutine dhamiltonian_elec_apply(hm, namespace, mesh, psib, hpsib, terms, set_bc)
pure logical function, public hamiltonian_elec_inh_term(hm)
subroutine hamiltonian_elec_set_mass(this, namespace, mass)
set the effective electron mass, checking whether it was previously redefined.
subroutine, public dhamiltonian_elec_apply_batch(hm, namespace, mesh, psib, hpsib, terms, set_bc)
subroutine, public hamiltonian_elec_update_with_ext_pot(this, mesh, space, ext_partners, time, mu)
This is an extension of "hamiltonian_elec_update_pot" to be used by the CFM4 propagator....
subroutine, public hamiltonian_elec_not_adjoint(hm)
subroutine, public zhamiltonian_elec_external(this, mesh, psib, vpsib)
subroutine zhamiltonian_elec_apply(hm, namespace, mesh, psib, hpsib, terms, set_bc)
This module defines classes and functions for interaction partners.
subroutine, public kick_copy(kick_out, kick_in)
integer, parameter, public kick_magnon_mode
subroutine, public kick_end(kick)
subroutine, public kick_init(kick, namespace, space, kpoints, nspin)
pure integer function, public kick_get_type(kick)
A module to handle KS potential, without the external potential.
subroutine, public ks_potential_accel_rebuild(this)
Rebuild accelerator buffers after an intrinsic copy.
subroutine, public laser_vector_potential(laser, mesh, aa, time)
subroutine, public lasers_nondipole_laser_field_step(this, field, time)
Retrieves the NDSFA vector_potential correction. The nondipole field is obtained for consecutive time...
logical function, public lasers_with_nondipole_field(lasers)
Check if a nondipole SFA correction should be computed for the given laser.
integer, parameter, public e_field_electric
integer, parameter, public e_field_vector_potential
subroutine, public laser_potential(laser, mesh, pot, time)
integer, parameter, public e_field_scalar_potential
integer pure elemental function, public laser_kind(laser)
subroutine, public laser_field(laser, field, time)
Retrieves the value of either the electric or the magnetic field. If the laser is given by a scalar p...
integer, parameter, public e_field_magnetic
integer, parameter, public dft_u_none
subroutine, public lda_u_init(this, namespace, space, level, gr, ions, st, mc, kpoints)
subroutine, public lda_u_update_basis(this, space, gr, ions, st, psolver, namespace, kpoints, has_phase)
subroutine, public lda_u_accel_rebuild(this, kpt)
Rebuild DFT+U accelerator buffers after intrinsic assignment.
subroutine, public lda_u_rebind_after_copy(this, ions)
Rebind non-owning pointers after intrinsic assignment of lda_u_t.
subroutine, public lda_u_build_phase_correction(this, space, std, boundaries, namespace, kpoints, vec_pot, vec_pot_var)
Build the phase correction to the global phase for all orbitals.
subroutine, public lda_u_end(this)
This module implements fully polymorphic linked lists, and some specializations thereof.
This modules implements the routines for doing constrain DFT for noncollinear magnetism.
subroutine, public magnetic_constrain_copy(this_out, this_in)
Deep-copy magnetic constrain data.
subroutine, public magnetic_constrain_end(this)
Releases memory of the magnetic constrain.
subroutine, public magnetic_constrain_init(this, namespace, mesh, std, natoms, min_dist)
Initilializes the magnetic_constrain_t object.
This module is intended to contain "only mathematical" functions and procedures.
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_not_implemented(feature, namespace)
subroutine, public messages_warning(no_lines, all_nodes, namespace)
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_experimental(name, namespace)
This module handles the communicators for the various parallelization strategies.
subroutine, public mxll_coupling_init(this, d, gr, namespace, mass)
Parse variables and initialize Maxwell coupling.
subroutine, public set_electric_quadrupole_pot(this, mesh)
Computes the electric quadrupole potential where .
subroutine, public mxll_coupling_end(this)
Finalize and deallocate Maxwell coupling arrays.
subroutine, public mxll_coupling_calc(this, hm_base, mesh, d, space)
Add the Maxwell coupling to the electronic Hamiltonian.
subroutine, public mxll_coupling_copy(this_out, this_in, der_target)
Deep-copy Maxwell-electron coupling data and rebind derivatives.
subroutine, public nonlocal_pseudopotential_accel_rebuild(this, space, mesh)
Rebuild accelerator buffers after an intrinsic copy.
subroutine, public nonlocal_pseudopotential_rebind_projectors(this, epot)
Rebind projector matrix pointers (map, position) to a target epot.
logical function, public oct_exchange_enabled(this)
subroutine, public oct_exchange_remove(this)
this module contains the low-level part of the output system
Some general things and nomenclature:
logical function, public parse_is_defined(namespace, name)
subroutine, public pcm_calc_pot_rs(pcm, mesh, psolver, ions, v_h, v_ext, kick, time_present, kick_time)
subroutine, public pcm_end(pcm)
real(real64), dimension(:,:), allocatable delta
D_E matrix in JCP 139, 024105 (2013).
subroutine, public pcm_init(pcm, namespace, space, ions, grid, qtot, val_charge, external_potentials_present, kick_present)
Initializes the PCM calculation: reads the VdW molecular cavity and generates the PCM response matrix...
subroutine, public phase_accel_rebuild(phase, mesh, kpt)
Rebuild phase accelerator buffers after an intrinsic copy.
subroutine, public poisson_init(this, namespace, space, der, mc, stencil, qtot, label, solver, verbose, force_serial, force_cmplx)
subroutine, public poisson_end(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.
subroutine, public projector_init_phases(this, dim, std, bnd, kpoints, vec_pot, vec_pot_var)
subroutine, public scissor_end(this)
subroutine, public states_set_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_dim_copy(dout, din)
subroutine, public states_elec_dim_end(dim)
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
This module provides routines for communicating states when using states parallelization.
integer pure function, public symmetries_identity_index(this)
integer pure function, public symmetries_number(this)
type(type_t), parameter, public type_cmplx
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
This module defines the unit system, used for input and output.
type(unit_system_t), public units_inp
the units systems for reading and writing
type(xc_cam_t), parameter, public cam_exact_exchange
Use only Hartree Fock exact exchange.
integer, parameter, public xc_oep_x_slater
Slater approximation to the exact exchange.
integer, parameter, public func_x
logical pure function, public family_is_mgga_with_exc(xcs)
Is the xc function part of the mGGA family with an energy functional.
logical pure function, public family_is_hybrid(xcs)
Returns true if the functional is an hybrid functional.
This module implements the "photon-free" electron-photon exchange-correlation functional.
This module implements the ZORA terms for the Hamoiltonian.
Extension of space that contains the knowledge of the spin dimension.
Description of the grid, containing information on derivatives, stencil, and symmetries.
The abstract Hamiltonian class defines a skeleton for specific implementations.
abstract class for general interaction partners
iterator for the list of partners
Describes mesh distribution to nodes.
Stores all communicators and groups.
The states_elec_t class contains all electronic wave functions.
This class described the 'photon-exchange' electron-photon xc functionals, based on QEDFT.
This class is responsible for calculating and applying the ZORA.