49 use,
intrinsic :: iso_fortran_env
137 type(space_t),
private :: space
138 type(states_elec_dim_t) :: d
139 type(hamiltonian_elec_base_t) :: hm_base
140 type(phase_t) :: phase
141 type(energy_t),
allocatable :: energy
142 type(absorbing_boundaries_t) :: abs_boundaries
143 type(ks_potential_t) :: ks_pot
144 real(real64),
allocatable :: vberry(:,:)
146 type(derivatives_t),
pointer,
private :: der
148 type(nonlocal_pseudopotential_t) :: vnl
150 type(ions_t),
pointer :: ions
151 logical,
private :: owns_ions = .false.
152 logical,
private :: is_copy_snapshot = .false.
153 real(real64) :: exx_coef
155 type(poisson_t) :: psolver
158 logical :: self_induced_magnetic
159 real(real64),
allocatable :: a_ind(:, :)
160 real(real64),
allocatable :: b_ind(:, :)
162 integer :: theory_level
163 type(xc_t),
pointer :: xc
164 type(xc_photons_t),
pointer :: xc_photons
170 logical,
private :: adjoint
173 real(real64),
private :: mass
176 logical,
private :: inh_term
177 type(states_elec_t) :: inh_st
181 type(oct_exchange_t) :: oct_exchange
183 type(scissor_t) :: scissor
185 real(real64) :: current_time
186 logical,
private :: is_applied_packed
189 type(lda_u_t) :: lda_u
190 integer :: lda_u_level
192 logical,
public :: time_zero
194 type(exchange_operator_t),
public :: exxop
196 type(kpoints_t),
pointer,
public :: kpoints => null()
198 type(partner_list_t) :: external_potentials
199 real(real64),
allocatable,
public :: v_ext_pot(:)
200 real(real64),
allocatable,
public :: v_static(:)
202 type(ion_electron_local_potential_t) :: v_ie_loc
205 type(magnetic_constrain_t) :: magnetic_constrain
211 type(mxll_coupling_t) :: mxll
212 type(zora_t),
pointer :: zora => null()
225 integer,
public,
parameter :: &
234 mc, kpoints, need_exchange, xc_photons)
238 type(
grid_t),
target,
intent(inout) :: gr
239 type(
ions_t),
target,
intent(inout) :: ions
242 integer,
intent(in) :: theory_level
243 type(
xc_t),
target,
intent(in) :: xc
246 logical,
optional,
intent(in) :: need_exchange
250 logical :: need_exchange_
251 real(real64) :: rashba_coupling
258 hm%theory_level = theory_level
261 hm%kpoints => kpoints
287 if (space%dim /= 2)
then
288 write(
message(1),
'(a)')
'Rashba spin-orbit coupling can only be used for two-dimensional systems.'
294 call hm%hm_base%init(hm%d%nspin, hm%mass, rashba_coupling)
297 assert(
associated(gr%der%lapl))
298 hm%hm_base%kinetic => gr%der%lapl
300 safe_allocate(hm%energy)
305 hm%owns_ions = .false.
306 hm%is_copy_snapshot = .false.
309 if(
present(xc_photons))
then
310 hm%xc_photons => xc_photons
312 hm%xc_photons => null()
321 call poisson_init(hm%psolver, namespace, space, gr%der, mc, gr%stencil, st%qtot)
324 call epot_init(hm%ep, namespace, gr, hm%ions, hm%psolver, hm%d%ispin, hm%xc%family, hm%kpoints)
325 call kick_init(hm%kick, namespace, space, hm%kpoints, hm%d%ispin)
327 hm%zora =>
zora_t(namespace, hm%der, hm%d, hm%ep, hm%mass)
330 call hm%v_ie_loc%init(gr, hm%psolver, hm%ions, namespace)
332 call hm%nlcc%init(gr, hm%ions)
333 safe_allocate(st%rho_core(1:gr%np))
366 call parse_variable(namespace,
'CalculateSelfInducedMagneticField', .false., hm%self_induced_magnetic)
367 if (hm%self_induced_magnetic)
then
368 safe_allocate(hm%a_ind(1:gr%np_part, 1:space%dim))
369 safe_allocate(hm%b_ind(1:gr%np_part, 1:space%dim))
377 hm%inh_term = .false.
382 call hm%phase%init(gr, hm%d%kpt, hm%kpoints, st%d, space)
402 call lda_u_init(hm%lda_u, namespace, space, hm%lda_u_level, gr, ions, st, mc, hm%kpoints)
411 if(hm%lda_u_level /=
dft_u_none .and. hm%phase%is_allocated())
then
426 call parse_variable(namespace,
'HamiltonianApplyPacked', .
true., hm%is_applied_packed)
428 if (hm%theory_level ==
hartree_fock .and. st%parallel_in_states)
then
433 .and. st%parallel_in_states)
then
452 if (hm%xc%compute_exchange(hm%theory_level) .or. need_exchange_)
then
457 else if (
bitand(hm%xc%family, xc_family_oep) /= 0 .or. hm%theory_level ==
rdmft)
then
459 hm%kpoints, hm%xc%cam)
460 if (hm%theory_level ==
rdmft) hm%exxop%useACE = .false.
469 if (gr%use_curvilinear)
then
471 hm%is_applied_packed = .false.
472 call messages_write(
'Cannot use GPUs as curvilinear coordinates are used.')
475 call messages_write(
'Cannot use GPUs as curvilinear coordinates are used.', new_line = .
true.)
476 call messages_write(
'Calculation will not be continued. To force execution, set AllowCPUonly = yes.')
506 if (
associated(hm%xc_photons))
then
507 if (hm%xc_photons%wants_to_renormalize_mass())
then
509 call hm%set_mass(namespace, hm%xc_photons%get_renormalized_mass())
513 if (hm%xc%compute_exchange(hm%theory_level) .or. need_exchange_)
call hm%exxop%write_info(namespace)
523 class(*),
pointer :: potential
528 safe_allocate(hm%v_ext_pot(1:gr%np))
529 hm%v_ext_pot(1:gr%np) =
m_zero
531 call iter%start(hm%external_potentials)
532 do while (iter%has_next())
533 potential => iter%get_next()
534 select type (potential)
537 call potential%allocate_memory(gr)
538 call potential%calculate(namespace, gr, hm%psolver)
541 select case (potential%type)
547 message(1) =
"Cannot use static magnetic field with real wavefunctions"
551 if (.not.
allocated(hm%ep%b_field))
then
552 safe_allocate(hm%ep%b_field(1:3))
553 hm%ep%b_field(1:3) =
m_zero
555 hm%ep%b_field(1:3) = hm%ep%b_field(1:3) + potential%b_field(1:3)
557 if (.not.
allocated(hm%ep%a_static))
then
558 safe_allocate(hm%ep%a_static(1:gr%np, 1:space%dim))
559 hm%ep%a_static(1:gr%np, 1:space%dim) =
m_zero
561 call lalg_axpy(gr%np, space%dim,
m_one, potential%a_static, hm%ep%a_static)
564 if (.not.
allocated(hm%ep%e_field))
then
565 safe_allocate(hm%ep%e_field(1:space%dim))
566 hm%ep%e_field(1:space%dim) =
m_zero
568 hm%ep%e_field(1:space%dim) = hm%ep%e_field(1:space%dim) + potential%e_field(1:space%dim)
571 if (space%periodic_dim < space%dim)
then
572 if (.not.
allocated(hm%v_static))
then
573 safe_allocate(hm%v_static(1:gr%np))
574 hm%v_static(1:gr%np) =
m_zero
576 if (.not.
allocated(hm%ep%v_ext))
then
577 safe_allocate(hm%ep%v_ext(1:gr%np_part))
578 hm%ep%v_ext(1:gr%np_part) =
m_zero
584 if (hm%kpoints%use_symmetries)
then
588 message(1) =
"The StaticElectricField breaks (at least) one of the symmetries used to reduce the k-points."
589 message(2) =
"Set SymmetryBreakDir equal to StaticElectricField."
596 call potential%deallocate_memory()
609 class(*),
pointer :: potential
613 call iter%start(hm%external_potentials)
614 do while (iter%has_next())
615 potential => iter%get_next()
616 select type (potential)
620 message(1) =
"Applying StaticElectricField in a periodic direction is only accurate for large supercells."
621 message(2) =
"Single-point Berry phase is not appropriate when k-point sampling is needed."
637 logical :: external_potentials_present
638 logical :: kick_present
642 if (
allocated(hm%ep%e_field) .and. space%is_periodic() .and. .not.
list_has_gauge_field(ext_partners))
then
645 if (any(abs(hm%ep%e_field(1:space%periodic_dim)) >
m_epsilon))
then
646 safe_allocate(hm%vberry(1:gr%np, 1:hm%d%nspin))
657 call pcm_init(hm%pcm, namespace, space, ions, gr, st%qtot, st%val_charge, external_potentials_present, kick_present)
658 if (hm%pcm%run_pcm)
then
681 if (hm%is_copy_snapshot)
then
688 call hm%hm_base%end()
694 safe_deallocate_a(hm%vberry)
695 safe_deallocate_a(hm%a_ind)
696 safe_deallocate_a(hm%b_ind)
697 safe_deallocate_a(hm%v_ext_pot)
699 safe_deallocate_p(hm%zora)
707 if (hm%owns_ions .and.
associated(hm%ions))
then
710 if (
allocated(hm%ions%species))
then
711 safe_deallocate_a(hm%ions%species)
714 safe_deallocate_p(hm%ions)
715 hm%owns_ions = .false.
718 hm%owns_ions = .false.
730 safe_deallocate_a(hm%energy)
732 if (hm%pcm%run_pcm)
call pcm_end(hm%pcm)
734 call hm%v_ie_loc%end()
737 call iter%start(hm%external_potentials)
738 do while (iter%has_next())
739 potential => iter%get_next()
740 safe_deallocate_p(potential)
742 call hm%external_potentials%empty()
743 safe_deallocate_a(hm%v_static)
749 hm%is_copy_snapshot = .false.
766 if (hm%owns_ions .and.
associated(hm%ions))
then
767 if (
allocated(hm%ions%species))
then
768 safe_deallocate_a(hm%ions%species)
771 safe_deallocate_p(hm%ions)
772 hm%owns_ions = .false.
775 hm%owns_ions = .false.
778 if (
associated(hm%zora))
then
779 safe_deallocate_p(hm%zora)
782 call iter%start(hm%external_potentials)
783 do while (iter%has_next())
784 potential => iter%get_next()
785 safe_deallocate_p(potential)
787 call hm%external_potentials%empty()
789 hm%is_copy_snapshot = .false.
805 type(
ions_t),
pointer :: ions_out
806 type(
zora_t),
pointer :: zora_out
810 class(*),
pointer :: ptr
812 logical :: runtime_initialized
817 runtime_initialized =
associated(hm_in%kpoints)
819 call iter%start(hm_in%external_potentials)
820 do while (iter%has_next())
821 ptr => iter%get_next()
824 call external_potentials_in%add(ptr)
826 call external_potentials_out%add(ext_pot)
831 call hm_in%external_potentials%empty()
834 hm_out%is_copy_snapshot = .
true.
839 if (
accel_is_enabled() .and. runtime_initialized .and.
associated(hm_out%der))
then
846 call hm_out%external_potentials%empty()
847 call iter%start(external_potentials_out)
848 do while (iter%has_next())
849 ptr => iter%get_next()
852 call hm_out%external_potentials%add(ptr)
857 call iter%start(external_potentials_in)
858 do while (iter%has_next())
859 ptr => iter%get_next()
862 call hm_in%external_potentials%add(ptr)
867 call external_potentials_out%empty()
868 call external_potentials_in%empty()
870 if (runtime_initialized)
then
874 if (
allocated(hm_in%energy))
then
875 if (.not.
allocated(hm_out%energy)) safe_allocate(hm_out%energy)
878 safe_deallocate_a(hm_out%energy)
885 if (
associated(hm_in%ions))
then
886 safe_allocate(ions_out)
887 ions_out = hm_in%ions
888 hm_out%ions => ions_out
889 hm_out%owns_ions = .
true.
890 call hm_out%v_ie_loc%bind(hm_out%psolver, hm_out%ions)
891 call hm_out%nlcc%bind(hm_out%ions)
894 hm_out%owns_ions = .false.
895 nullify(hm_out%v_ie_loc%atoms_dist)
896 nullify(hm_out%v_ie_loc%atom)
897 nullify(hm_out%v_ie_loc%pos)
898 nullify(hm_out%nlcc%atoms_dist)
899 nullify(hm_out%nlcc%atom)
900 nullify(hm_out%nlcc%pos)
903 if (hm_out%lda_u_level /=
dft_u_none .and.
associated(hm_out%ions))
then
910 if (
associated(hm_in%zora))
then
911 allocate(zora_out, source=hm_in%zora)
912 hm_out%zora => zora_out
926 logical :: runtime_initialized
930 runtime_initialized =
associated(hm_in%kpoints)
931 if (.not. runtime_initialized)
then
940 if (
associated(hm_in%xc))
then
941 if (hm_in%xc%compute_exchange(hm_in%theory_level))
then
954 if (hm_in%pcm%run_pcm)
then
978 integer,
intent(in) :: terms
999 real(real64),
intent(in) ::
delta(:)
1000 real(real64),
intent(in) :: emin
1003 real(real64) :: emax
1011 hm%spectral_middle_point = (emax + emin) /
m_two
1012 hm%spectral_half_span = (emax - emin) /
m_two
1035 hm%inh_term = .
true.
1047 if (hm%inh_term)
then
1049 hm%inh_term = .false.
1061 if (.not. hm%adjoint)
then
1064 hm%abs_boundaries%mf = -hm%abs_boundaries%mf
1078 if (hm%adjoint)
then
1079 hm%adjoint = .false.
1081 hm%abs_boundaries%mf = -hm%abs_boundaries%mf
1093 class(
mesh_t),
intent(in) :: mesh
1095 class(
space_t),
intent(in) :: space
1097 real(real64),
optional,
intent(in) :: time
1099 integer :: ispin, ip, idir, iatom, ilaser
1100 real(real64) :: aa(space%dim), time_
1101 real(real64),
allocatable :: vp(:,:)
1104 real(real64) :: am(space%dim)
1109 this%current_time =
m_zero
1110 if (
present(time)) this%current_time = time
1115 call this%hm_base%clear(mesh%np)
1122 if (
present(time) .or. this%time_zero)
then
1125 if(
associated(lasers))
then
1126 do ilaser = 1, lasers%no_lasers
1127 select case (
laser_kind(lasers%lasers(ilaser)))
1129 do ispin = 1, this%d%spin_channels
1131 this%hm_base%potential(:, ispin), time_)
1137 safe_allocate(vp(1:mesh%np, 1:space%dim))
1138 vp(1:mesh%np, 1:space%dim) =
m_zero
1142 do idir = 1, space%dim
1143 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) + vp(ip, idir)/
p_c
1147 call laser_field(lasers%lasers(ilaser), this%hm_base%uniform_magnetic_field(1:space%dim), time_)
1148 safe_deallocate_a(vp)
1153 call laser_field(lasers%lasers(ilaser), aa, time_)
1154 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - aa/
p_c
1159 assert(
allocated(this%hm_base%uniform_vector_potential))
1161 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - am/
p_c
1167 if (
associated(gfield))
then
1170 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - aa/
p_c
1174 if (
allocated(this%ep%e_field) .and.
associated(gfield))
then
1175 this%hm_base%uniform_vector_potential(1:space%periodic_dim) = &
1176 this%hm_base%uniform_vector_potential(1:space%periodic_dim) - time_*this%ep%e_field(1:space%periodic_dim)
1180 if (
associated(this%xc_photons))
then
1181 if(this%xc_photons%lpfmf .and.
allocated(this%xc_photons%mf_vector_potential))
then
1184 this%hm_base%uniform_vector_potential(1:space%dim) = &
1185 this%hm_base%uniform_vector_potential(1:space%dim) - this%xc_photons%mf_vector_potential(1:space%dim)/
p_c
1192 if (
allocated(this%ep%a_static))
then
1197 do idir = 1, space%dim
1198 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) + this%ep%a_static(ip, idir)
1207 call this%hm_base%accel_copy_pot(mesh)
1210 if (
allocated(this%ep%b_field))
then
1213 this%hm_base%uniform_magnetic_field(idir) = this%hm_base%uniform_magnetic_field(idir) + this%ep%b_field(idir)
1218 call this%hm_base%update_magnetic_terms(mesh, this%ep%gyromagnetic_ratio, this%d%ispin)
1223 if (this%mxll%test_equad)
then
1235 integer :: ik, imat, nmat, max_npoints, offset
1237 integer :: iphase, nphase
1241 if ((.not. this%kpoints%gamma_only()) .or.
allocated(this%hm_base%uniform_vector_potential))
then
1245 do iatom = 1, this%ep%natoms
1246 call projector_init_phases(this%ep%proj(iatom), space%dim, this%d, this%der%boundaries, this%kpoints, &
1247 vec_pot = this%hm_base%uniform_vector_potential, vec_pot_var = this%hm_base%vector_potential)
1253 if (
allocated(this%hm_base%uniform_vector_potential))
then
1255 call this%phase%update(mesh, this%d%kpt, this%kpoints, this%d, space, this%hm_base%uniform_vector_potential)
1260 vec_pot = this%hm_base%uniform_vector_potential, vec_pot_var = this%hm_base%vector_potential)
1264 max_npoints = this%vnl%max_npoints
1265 nmat = this%vnl%nprojector_matrices
1268 if (this%phase%is_allocated() .and.
allocated(this%vnl%projector_matrices))
then
1271 if (this%der%boundaries%spiralBC) nphase = 3
1273 if (.not.
allocated(this%vnl%projector_phases))
then
1274 safe_allocate(this%vnl%projector_phases(1:max_npoints, 1:nphase, nmat, this%d%kpt%start:this%d%kpt%end))
1277 type_cmplx, this%vnl%total_points*nphase*this%d%kpt%nlocal)
1280 this%vnl%nphase = nphase
1285 do ik = this%d%kpt%start, this%d%kpt%end
1286 do imat = 1, this%vnl%nprojector_matrices
1287 iatom = this%vnl%projector_to_atom(imat)
1288 do iphase = 1, nphase
1290 do ip = 1, this%vnl%projector_matrices(imat)%npoints
1291 this%vnl%projector_phases(ip, iphase, imat, ik) = this%ep%proj(iatom)%phase(ip, iphase, ik)
1294 if (
accel_is_enabled() .and. this%vnl%projector_matrices(imat)%npoints > 0)
then
1296 this%vnl%projector_matrices(imat)%npoints, this%vnl%projector_phases(1:, iphase, imat, ik), &
1297 offset = offset, async=.
true.)
1299 offset = offset + this%vnl%projector_matrices(imat)%npoints
1320 class(
mesh_t),
intent(in) :: mesh
1321 logical,
optional,
intent(in) :: accumulate
1323 integer :: ispin, ip
1330 do ispin = 1, this%d%nspin
1333 this%hm_base%potential(ip, ispin) =
m_zero
1340 do ispin = 1, this%d%nspin
1341 if (ispin <= 2)
then
1345 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + this%ep%vpsl(ip) + this%v_ext_pot(ip)
1349 if (this%pcm%run_pcm)
then
1350 if (this%pcm%solute)
then
1353 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + &
1354 this%pcm%v_e_rs(ip) + this%pcm%v_n_rs(ip)
1358 if (this%pcm%localf)
then
1361 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + &
1362 this%pcm%v_ext_rs(ip)
1372 this%hm_base%Impotential(ip, ispin) = this%hm_base%Impotential(ip, ispin) + this%abs_boundaries%mf(ip)
1383 call this%zora%update(this%der, this%hm_base%potential)
1387 do ispin = 1, this%d%nspin
1389 if (
allocated(this%hm_base%zeeman_pot))
then
1392 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + this%hm_base%zeeman_pot(ip, ispin)
1398 if (this%mxll%test_equad)
then
1401 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + this%mxll%e_quadrupole_pot(ip)
1410 call this%ks_pot%add_vhxc(this%hm_base%potential)
1412 call this%hm_base%accel_copy_pot(mesh)
1422 type(
grid_t),
intent(in) :: gr
1423 type(
ions_t),
target,
intent(inout) :: ions
1426 real(real64),
optional,
intent(in) :: time
1431 call epot_generate(this%ep, namespace, gr, this%ions, this%d)
1436 if (
allocated(this%ep%e_field) .and. space%periodic_dim < space%dim)
then
1442 this%v_ie_loc%atoms_dist => ions%atoms_dist
1443 this%v_ie_loc%atom => ions%atom
1444 call this%v_ie_loc%calculate()
1447 call lalg_axpy(gr%np,
m_one, this%v_ie_loc%potential(:,1), this%ep%vpsl)
1451 if (this%ep%nlcc)
then
1452 call this%nlcc%end()
1453 call this%nlcc%init(gr, ions)
1454 call this%nlcc%calculate()
1455 call lalg_copy(gr%np, this%nlcc%density(:,1), st%rho_core)
1458 call this%vnl%build(space, gr, this%ep)
1463 if (this%ep%non_local .and. .not. this%vnl%apply_projector_matrices)
then
1465 call messages_write(
'Relativistic pseudopotentials have not been fully implemented for GPUs.')
1468 call messages_write(
'Relativistic pseudopotentials have not been fully implemented for GPUs.',&
1470 call messages_write(
'Calculation will not be continued. To force execution, set AllowCPUonly = yes.')
1477 if (this%pcm%run_pcm)
then
1480 if (this%pcm%solute)
then
1487 if (this%pcm%localf .and.
allocated(this%v_static))
then
1488 call pcm_calc_pot_rs(this%pcm, gr, this%psolver, v_ext = this%ep%v_ext(1:gr%np_part))
1493 call lda_u_update_basis(this%lda_u, space, gr, ions, st, this%psolver, namespace, this%kpoints, &
1494 this%phase%is_allocated())
1504 time = this%current_time
1512 apply = this%is_applied_packed
1520 type(namespace_t),
intent(in) :: namespace
1521 class(space_t),
intent(in) :: space
1522 type(lattice_vectors_t),
intent(in) :: latt
1523 class(species_t),
intent(in) :: species
1524 real(real64),
intent(in) :: pos(1:space%dim)
1525 integer,
intent(in) :: ia
1526 class(mesh_t),
intent(in) :: mesh
1527 complex(real64),
intent(in) :: psi(:,:)
1528 complex(real64),
intent(out) :: vpsi(:,:)
1531 real(real64),
allocatable :: vlocal(:)
1534 safe_allocate(vlocal(1:mesh%np_part))
1536 call epot_local_potential(hm%ep, namespace, space, latt, mesh, species, pos, ia, vlocal)
1538 do idim = 1, hm%d%dim
1539 vpsi(1:mesh%np, idim) = vlocal(1:mesh%np) * psi(1:mesh%np, idim)
1542 safe_deallocate_a(vlocal)
1553 class(space_t),
intent(in) :: space
1554 class(mesh_t),
intent(in) :: mesh
1555 type(partner_list_t),
intent(in) :: ext_partners
1556 real(real64),
intent(in) :: time(1:2)
1557 real(real64),
intent(in) :: mu(1:2)
1559 integer :: ispin, ip, idir, iatom, ilaser, itime
1560 real(real64) :: aa(space%dim), time_
1561 real(real64),
allocatable :: vp(:,:)
1562 real(real64),
allocatable :: velectric(:)
1563 type(lasers_t),
pointer :: lasers
1564 type(gauge_field_t),
pointer :: gfield
1567 call profiling_in(
"HAMILTONIAN_ELEC_UPDATE_EXT_POT")
1569 this%current_time = m_zero
1570 this%current_time = time(1)
1573 call this%hm_base%clear(mesh%np)
1576 call this%hm_base%allocate_field(mesh, field_potential, &
1577 complex_potential = this%abs_boundaries%abtype == imaginary_absorbing)
1582 lasers => list_get_lasers(ext_partners)
1583 if(
associated(lasers))
then
1584 do ilaser = 1, lasers%no_lasers
1585 select case (laser_kind(lasers%lasers(ilaser)))
1586 case (e_field_scalar_potential, e_field_electric)
1587 safe_allocate(velectric(1:mesh%np))
1588 do ispin = 1, this%d%spin_channels
1590 call laser_potential(lasers%lasers(ilaser), mesh, velectric, time_)
1593 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + mu(itime) * velectric(ip)
1596 safe_deallocate_a(velectric)
1597 case (e_field_magnetic)
1598 call this%hm_base%allocate_field(mesh, field_vector_potential + field_uniform_magnetic_field, .false.)
1600 safe_allocate(vp(1:mesh%np, 1:space%dim))
1601 vp(1:mesh%np, 1:space%dim) = m_zero
1602 call laser_vector_potential(lasers%lasers(ilaser), mesh, vp, time_)
1603 do idir = 1, space%dim
1606 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) &
1607 - mu(itime) * vp(ip, idir)/p_c
1611 call laser_field(lasers%lasers(ilaser), this%hm_base%uniform_magnetic_field(1:space%dim), time_)
1612 safe_deallocate_a(vp)
1613 case (e_field_vector_potential)
1614 call this%hm_base%allocate_field(mesh, field_uniform_vector_potential, .false.)
1617 call laser_field(lasers%lasers(ilaser), aa, time_)
1618 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) &
1619 - mu(itime) * aa/p_c
1625 gfield => list_get_gauge_field(ext_partners)
1626 if (
associated(gfield))
then
1627 call this%hm_base%allocate_field(mesh, field_uniform_vector_potential, .false.)
1628 call gauge_field_get_vec_pot(gfield, aa)
1629 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - aa/p_c
1636 if (
allocated(this%ep%e_field) .and.
associated(gfield))
then
1637 this%hm_base%uniform_vector_potential(1:space%periodic_dim) = &
1638 this%hm_base%uniform_vector_potential(1:space%periodic_dim) - time_*this%ep%e_field(1:space%periodic_dim)
1644 if (
allocated(this%ep%a_static))
then
1645 call this%hm_base%allocate_field(mesh, field_vector_potential, .false.)
1649 do idir = 1, space%dim
1650 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) + this%ep%a_static(ip, idir)
1656 call this%hm_base%accel_copy_pot(mesh)
1659 if (
allocated(this%ep%b_field))
then
1660 call this%hm_base%allocate_field(mesh, field_uniform_magnetic_field, .false.)
1662 this%hm_base%uniform_magnetic_field(idir) = this%hm_base%uniform_magnetic_field(idir) + this%ep%b_field(idir)
1666 call this%hm_base%update_magnetic_terms(mesh, this%ep%gyromagnetic_ratio, this%d%ispin)
1672 call profiling_out(
"HAMILTONIAN_ELEC_UPDATE_EXT_POT")
1678 integer :: ik, imat, nmat, max_npoints, offset, iphase, nphase
1682 if ((.not. this%kpoints%gamma_only()) .or.
allocated(this%hm_base%uniform_vector_potential))
then
1684 call profiling_in(
'UPDATE_PHASES')
1686 do iatom = 1, this%ep%natoms
1687 call projector_init_phases(this%ep%proj(iatom), space%dim, this%d, this%der%boundaries, this%kpoints, &
1688 vec_pot = this%hm_base%uniform_vector_potential, vec_pot_var = this%hm_base%vector_potential)
1691 call profiling_out(
'UPDATE_PHASES')
1694 if (
allocated(this%hm_base%uniform_vector_potential))
then
1695 call this%phase%update(mesh, this%d%kpt, this%kpoints, this%d, space, this%hm_base%uniform_vector_potential)
1698 max_npoints = this%vnl%max_npoints
1699 nmat = this%vnl%nprojector_matrices
1702 if (this%phase%is_allocated() .and.
allocated(this%vnl%projector_matrices))
then
1705 if (this%der%boundaries%spiralBC) nphase = 3
1707 if (.not.
allocated(this%vnl%projector_phases))
then
1708 safe_allocate(this%vnl%projector_phases(1:max_npoints, nphase, nmat, this%d%kpt%start:this%d%kpt%end))
1709 if (accel_is_enabled())
then
1710 call accel_create_buffer(this%vnl%buff_projector_phases, accel_mem_read_only, &
1711 type_cmplx, this%vnl%total_points*nphase*this%d%kpt%nlocal)
1716 do ik = this%d%kpt%start, this%d%kpt%end
1717 do imat = 1, this%vnl%nprojector_matrices
1718 iatom = this%vnl%projector_to_atom(imat)
1719 do iphase = 1, nphase
1721 do ip = 1, this%vnl%projector_matrices(imat)%npoints
1722 this%vnl%projector_phases(ip, imat, iphase, ik) = this%ep%proj(iatom)%phase(ip, iphase, ik)
1725 if (accel_is_enabled() .and. this%vnl%projector_matrices(imat)%npoints > 0)
then
1726 call accel_write_buffer(this%vnl%buff_projector_phases, &
1727 this%vnl%projector_matrices(imat)%npoints, this%vnl%projector_phases(1:, iphase, imat, ik), &
1730 offset = offset + this%vnl%projector_matrices(imat)%npoints
1744 logical,
intent(in) :: states_are_real
1748 if (hm%self_induced_magnetic)
then
1749 if (.not. states_are_real)
then
1752 message(1) =
'No current density for real states since it is identically zero.'
1753 call messages_warning(1)
1762 type(namespace_t),
intent(in) :: namespace
1763 type(grid_t),
intent(in) :: gr
1764 type(states_elec_t),
intent(inout) :: st
1765 type(states_elec_t),
intent(inout) :: hst
1767 integer :: ik, ib, ist
1768 complex(real64),
allocatable :: psi(:, :)
1769 complex(real64),
allocatable :: psiall(:, :, :, :)
1773 do ik = st%d%kpt%start, st%d%kpt%end
1774 do ib = st%group%block_start, st%group%block_end
1779 if (oct_exchange_enabled(hm%oct_exchange))
then
1781 safe_allocate(psiall(gr%np_part, 1:hst%d%dim, st%st_start:st%st_end, st%d%kpt%start:st%d%kpt%end))
1783 call states_elec_get_state(st, gr, psiall)
1785 call oct_exchange_prepare(hm%oct_exchange, gr, psiall, hm%xc, hm%psolver, namespace)
1787 safe_deallocate_a(psiall)
1789 safe_allocate(psi(gr%np_part, 1:hst%d%dim))
1793 call states_elec_get_state(hst, gr, ist, ik, psi)
1794 call oct_exchange_operator(hm%oct_exchange, namespace, gr, psi, ist, ik)
1795 call states_elec_set_state(hst, gr, ist, ik, psi)
1799 safe_deallocate_a(psi)
1821 type(namespace_t),
intent(in) :: namespace
1822 real(real64),
intent(in) :: mass
1826 if (parse_is_defined(namespace,
'ParticleMass'))
then
1827 message(1) =
'Attempting to redefine a non-unit electron mass'
1828 call messages_fatal(1)
1839 class(mesh_t),
intent(in) :: mesh
1840 real(real64),
contiguous,
intent(out) :: diag(:,:)
1841 integer,
intent(in) :: ik
1843 integer :: idim, ip, ispin
1845 real(real64),
allocatable :: ldiag(:)
1849 safe_allocate(ldiag(1:mesh%np))
1853 call derivatives_lapl_diag(hm%der, ldiag)
1855 do idim = 1, hm%d%dim
1856 diag(1:mesh%np, idim) = -m_half/hm%mass*ldiag(1:mesh%np)
1859 select case (hm%d%ispin)
1861 case (unpolarized, spin_polarized)
1862 ispin = hm%d%get_spin_index(ik)
1863 diag(1:mesh%np, 1) = diag(1:mesh%np, 1) + hm%ep%vpsl(1:mesh%np)
1867 diag(ip, 1) = diag(ip, 1) + hm%ep%vpsl(ip)
1868 diag(ip, 2) = diag(ip, 2) + hm%ep%vpsl(ip)
1873 call hm%ks_pot%add_vhxc(diag)
1882#include "hamiltonian_elec_inc.F90"
1885#include "complex.F90"
1886#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), 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.