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 call hm%hm_base%end()
795 hm%is_copy_snapshot = .false.
811 type(
ions_t),
pointer :: ions_out
812 type(
zora_t),
pointer :: zora_out
816 class(*),
pointer :: ptr
818 logical :: runtime_initialized
823 runtime_initialized =
associated(hm_in%kpoints)
825 call iter%start(hm_in%external_potentials)
826 do while (iter%has_next())
827 ptr => iter%get_next()
830 call external_potentials_in%add(ptr)
832 call external_potentials_out%add(ext_pot)
837 call hm_in%external_potentials%empty()
840 hm_out%is_copy_snapshot = .
true.
845 if (
accel_is_enabled() .and. runtime_initialized .and.
associated(hm_out%der))
then
852 call hm_out%external_potentials%empty()
853 call iter%start(external_potentials_out)
854 do while (iter%has_next())
855 ptr => iter%get_next()
858 call hm_out%external_potentials%add(ptr)
863 call iter%start(external_potentials_in)
864 do while (iter%has_next())
865 ptr => iter%get_next()
868 call hm_in%external_potentials%add(ptr)
873 call external_potentials_out%empty()
874 call external_potentials_in%empty()
876 if (runtime_initialized)
then
880 if (
allocated(hm_in%energy))
then
881 if (.not.
allocated(hm_out%energy)) safe_allocate(hm_out%energy)
884 safe_deallocate_a(hm_out%energy)
891 if (
associated(hm_in%ions))
then
892 safe_allocate(ions_out)
893 ions_out = hm_in%ions
894 hm_out%ions => ions_out
895 hm_out%owns_ions = .
true.
896 call hm_out%v_ie_loc%bind(hm_out%psolver, hm_out%ions)
897 call hm_out%nlcc%bind(hm_out%ions)
900 hm_out%owns_ions = .false.
901 nullify(hm_out%v_ie_loc%atoms_dist)
902 nullify(hm_out%v_ie_loc%atom)
903 nullify(hm_out%v_ie_loc%pos)
904 nullify(hm_out%nlcc%atoms_dist)
905 nullify(hm_out%nlcc%atom)
906 nullify(hm_out%nlcc%pos)
909 if (hm_out%lda_u_level /=
dft_u_none .and.
associated(hm_out%ions))
then
916 if (
associated(hm_in%zora))
then
917 allocate(zora_out, source=hm_in%zora)
918 hm_out%zora => zora_out
932 logical :: runtime_initialized
936 runtime_initialized =
associated(hm_in%kpoints)
937 if (.not. runtime_initialized)
then
946 if (
associated(hm_in%xc))
then
947 if (hm_in%xc%compute_exchange(hm_in%theory_level))
then
960 if (hm_in%pcm%run_pcm)
then
984 integer,
intent(in) :: terms
1005 real(real64),
intent(in) ::
delta(:)
1006 real(real64),
intent(in) :: emin
1009 real(real64) :: emax
1017 hm%spectral_middle_point = (emax + emin) /
m_two
1018 hm%spectral_half_span = (emax - emin) /
m_two
1041 hm%inh_term = .
true.
1053 if (hm%inh_term)
then
1055 hm%inh_term = .false.
1067 if (.not. hm%adjoint)
then
1070 hm%abs_boundaries%mf = -hm%abs_boundaries%mf
1084 if (hm%adjoint)
then
1085 hm%adjoint = .false.
1087 hm%abs_boundaries%mf = -hm%abs_boundaries%mf
1099 class(
mesh_t),
intent(in) :: mesh
1101 class(
space_t),
intent(in) :: space
1103 real(real64),
optional,
intent(in) :: time
1105 integer :: ispin, ip, idir, iatom, ilaser
1106 real(real64) :: aa(space%dim), time_
1107 real(real64),
allocatable :: vp(:,:)
1110 real(real64) :: am(space%dim)
1115 this%current_time =
m_zero
1116 if (
present(time)) this%current_time = time
1121 call this%hm_base%clear(mesh%np)
1128 if (
present(time) .or. this%time_zero)
then
1131 if(
associated(lasers))
then
1132 do ilaser = 1, lasers%no_lasers
1133 select case (
laser_kind(lasers%lasers(ilaser)))
1135 do ispin = 1, this%d%spin_channels
1137 this%hm_base%potential(:, ispin), time_)
1143 safe_allocate(vp(1:mesh%np, 1:space%dim))
1144 vp(1:mesh%np, 1:space%dim) =
m_zero
1148 do idir = 1, space%dim
1149 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) + vp(ip, idir)/
p_c
1153 call laser_field(lasers%lasers(ilaser), this%hm_base%uniform_magnetic_field(1:space%dim), time_)
1154 safe_deallocate_a(vp)
1159 call laser_field(lasers%lasers(ilaser), aa, time_)
1160 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - aa/
p_c
1165 assert(
allocated(this%hm_base%uniform_vector_potential))
1167 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - am/
p_c
1173 if (
associated(gfield))
then
1176 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - aa/
p_c
1180 if (
allocated(this%ep%e_field) .and.
associated(gfield))
then
1181 this%hm_base%uniform_vector_potential(1:space%periodic_dim) = &
1182 this%hm_base%uniform_vector_potential(1:space%periodic_dim) - time_*this%ep%e_field(1:space%periodic_dim)
1186 if (
associated(this%xc_photons))
then
1187 if(this%xc_photons%lpfmf .and.
allocated(this%xc_photons%mf_vector_potential))
then
1190 this%hm_base%uniform_vector_potential(1:space%dim) = &
1191 this%hm_base%uniform_vector_potential(1:space%dim) - this%xc_photons%mf_vector_potential(1:space%dim)/
p_c
1198 if (
allocated(this%ep%a_static))
then
1203 do idir = 1, space%dim
1204 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) + this%ep%a_static(ip, idir)
1213 call this%hm_base%accel_copy_pot(mesh)
1216 if (
allocated(this%ep%b_field))
then
1219 this%hm_base%uniform_magnetic_field(idir) = this%hm_base%uniform_magnetic_field(idir) + this%ep%b_field(idir)
1224 call this%hm_base%update_magnetic_terms(mesh, this%ep%gyromagnetic_ratio, this%d%ispin)
1229 if (this%mxll%test_equad)
then
1241 integer :: ik, imat, nmat, max_npoints, offset
1243 integer :: iphase, nphase
1247 if ((.not. this%kpoints%gamma_only()) .or.
allocated(this%hm_base%uniform_vector_potential))
then
1251 do iatom = 1, this%ep%natoms
1252 call projector_init_phases(this%ep%proj(iatom), space%dim, this%d, this%der%boundaries, this%kpoints, &
1253 vec_pot = this%hm_base%uniform_vector_potential, vec_pot_var = this%hm_base%vector_potential)
1259 if (
allocated(this%hm_base%uniform_vector_potential))
then
1261 call this%phase%update(mesh, this%d%kpt, this%kpoints, this%d, space, this%hm_base%uniform_vector_potential)
1266 vec_pot = this%hm_base%uniform_vector_potential, vec_pot_var = this%hm_base%vector_potential)
1270 max_npoints = this%vnl%max_npoints
1271 nmat = this%vnl%nprojector_matrices
1274 if (this%phase%is_allocated() .and.
allocated(this%vnl%projector_matrices))
then
1277 if (this%der%boundaries%spiralBC) nphase = 3
1279 if (.not.
allocated(this%vnl%projector_phases))
then
1280 safe_allocate(this%vnl%projector_phases(1:max_npoints, 1:nphase, nmat, this%d%kpt%start:this%d%kpt%end))
1283 type_cmplx, this%vnl%total_points*nphase*this%d%kpt%nlocal)
1286 this%vnl%nphase = nphase
1291 do ik = this%d%kpt%start, this%d%kpt%end
1292 do imat = 1, this%vnl%nprojector_matrices
1293 iatom = this%vnl%projector_to_atom(imat)
1294 do iphase = 1, nphase
1296 do ip = 1, this%vnl%projector_matrices(imat)%npoints
1297 this%vnl%projector_phases(ip, iphase, imat, ik) = this%ep%proj(iatom)%phase(ip, iphase, ik)
1300 if (
accel_is_enabled() .and. this%vnl%projector_matrices(imat)%npoints > 0)
then
1302 this%vnl%projector_matrices(imat)%npoints, this%vnl%projector_phases(1:, iphase, imat, ik), &
1303 offset = offset, async=.
true.)
1305 offset = offset + this%vnl%projector_matrices(imat)%npoints
1326 class(
mesh_t),
intent(in) :: mesh
1327 logical,
optional,
intent(in) :: accumulate
1329 integer :: ispin, ip
1336 do ispin = 1, this%d%nspin
1339 this%hm_base%potential(ip, ispin) =
m_zero
1346 do ispin = 1, this%d%nspin
1347 if (ispin <= 2)
then
1351 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + this%ep%vpsl(ip) + this%v_ext_pot(ip)
1355 if (this%pcm%run_pcm)
then
1356 if (this%pcm%solute)
then
1359 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + &
1360 this%pcm%v_e_rs(ip) + this%pcm%v_n_rs(ip)
1364 if (this%pcm%localf)
then
1367 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + &
1368 this%pcm%v_ext_rs(ip)
1378 this%hm_base%Impotential(ip, ispin) = this%hm_base%Impotential(ip, ispin) + this%abs_boundaries%mf(ip)
1389 call this%zora%update(this%der, this%hm_base%potential)
1393 do ispin = 1, this%d%nspin
1395 if (
allocated(this%hm_base%zeeman_pot))
then
1398 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + this%hm_base%zeeman_pot(ip, ispin)
1404 if (this%mxll%test_equad)
then
1407 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + this%mxll%e_quadrupole_pot(ip)
1416 call this%ks_pot%add_vhxc(this%hm_base%potential)
1418 call this%hm_base%accel_copy_pot(mesh)
1428 type(
grid_t),
intent(in) :: gr
1429 type(
ions_t),
target,
intent(inout) :: ions
1432 real(real64),
optional,
intent(in) :: time
1437 call epot_generate(this%ep, namespace, gr, this%ions, this%d)
1442 if (
allocated(this%ep%e_field) .and. space%periodic_dim < space%dim)
then
1448 this%v_ie_loc%atoms_dist => ions%atoms_dist
1449 this%v_ie_loc%atom => ions%atom
1450 call this%v_ie_loc%calculate()
1453 call lalg_axpy(gr%np,
m_one, this%v_ie_loc%potential(:,1), this%ep%vpsl)
1457 if (this%ep%nlcc)
then
1458 call this%nlcc%end()
1459 call this%nlcc%init(gr, ions)
1460 call this%nlcc%calculate()
1461 call lalg_copy(gr%np, this%nlcc%density(:,1), st%rho_core)
1464 call this%vnl%build(space, gr, this%ep)
1469 if (this%ep%non_local .and. .not. this%vnl%apply_projector_matrices)
then
1471 call messages_write(
'Relativistic pseudopotentials have not been fully implemented for GPUs.')
1474 call messages_write(
'Relativistic pseudopotentials have not been fully implemented for GPUs.',&
1476 call messages_write(
'Calculation will not be continued. To force execution, set AllowCPUonly = yes.')
1483 if (this%pcm%run_pcm)
then
1486 if (this%pcm%solute)
then
1493 if (this%pcm%localf .and.
allocated(this%v_static))
then
1494 call pcm_calc_pot_rs(this%pcm, gr, this%psolver, v_ext = this%ep%v_ext(1:gr%np_part))
1499 call lda_u_update_basis(this%lda_u, space, gr, ions, st, this%psolver, namespace, this%kpoints, &
1500 this%phase%is_allocated())
1510 time = this%current_time
1518 apply = this%is_applied_packed
1526 type(namespace_t),
intent(in) :: namespace
1527 class(space_t),
intent(in) :: space
1528 type(lattice_vectors_t),
intent(in) :: latt
1529 class(species_t),
intent(in) :: species
1530 real(real64),
intent(in) :: pos(1:space%dim)
1531 integer,
intent(in) :: ia
1532 class(mesh_t),
intent(in) :: mesh
1533 complex(real64),
intent(in) :: psi(:,:)
1534 complex(real64),
intent(out) :: vpsi(:,:)
1537 real(real64),
allocatable :: vlocal(:)
1540 safe_allocate(vlocal(1:mesh%np_part))
1542 call epot_local_potential(hm%ep, namespace, space, latt, mesh, species, pos, ia, vlocal)
1544 do idim = 1, hm%d%dim
1545 vpsi(1:mesh%np, idim) = vlocal(1:mesh%np) * psi(1:mesh%np, idim)
1548 safe_deallocate_a(vlocal)
1559 class(space_t),
intent(in) :: space
1560 class(mesh_t),
intent(in) :: mesh
1561 type(partner_list_t),
intent(in) :: ext_partners
1562 real(real64),
intent(in) :: time(1:2)
1563 real(real64),
intent(in) :: mu(1:2)
1565 integer :: ispin, ip, idir, iatom, ilaser, itime
1566 real(real64) :: aa(space%dim), time_
1567 real(real64),
allocatable :: vp(:,:)
1568 real(real64),
allocatable :: velectric(:)
1569 type(lasers_t),
pointer :: lasers
1570 type(gauge_field_t),
pointer :: gfield
1573 call profiling_in(
"HAMILTONIAN_ELEC_UPDATE_EXT_POT")
1575 this%current_time = m_zero
1576 this%current_time = time(1)
1579 call this%hm_base%clear(mesh%np)
1582 call this%hm_base%allocate_field(mesh, field_potential, &
1583 complex_potential = this%abs_boundaries%abtype == imaginary_absorbing)
1588 lasers => list_get_lasers(ext_partners)
1589 if(
associated(lasers))
then
1590 do ilaser = 1, lasers%no_lasers
1591 select case (laser_kind(lasers%lasers(ilaser)))
1592 case (e_field_scalar_potential, e_field_electric)
1593 safe_allocate(velectric(1:mesh%np))
1594 do ispin = 1, this%d%spin_channels
1596 call laser_potential(lasers%lasers(ilaser), mesh, velectric, time_)
1599 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + mu(itime) * velectric(ip)
1602 safe_deallocate_a(velectric)
1603 case (e_field_magnetic)
1604 call this%hm_base%allocate_field(mesh, field_vector_potential + field_uniform_magnetic_field, .false.)
1606 safe_allocate(vp(1:mesh%np, 1:space%dim))
1607 vp(1:mesh%np, 1:space%dim) = m_zero
1608 call laser_vector_potential(lasers%lasers(ilaser), mesh, vp, time_)
1609 do idir = 1, space%dim
1612 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) &
1613 - mu(itime) * vp(ip, idir)/p_c
1617 call laser_field(lasers%lasers(ilaser), this%hm_base%uniform_magnetic_field(1:space%dim), time_)
1618 safe_deallocate_a(vp)
1619 case (e_field_vector_potential)
1620 call this%hm_base%allocate_field(mesh, field_uniform_vector_potential, .false.)
1623 call laser_field(lasers%lasers(ilaser), aa, time_)
1624 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) &
1625 - mu(itime) * aa/p_c
1631 gfield => list_get_gauge_field(ext_partners)
1632 if (
associated(gfield))
then
1633 call this%hm_base%allocate_field(mesh, field_uniform_vector_potential, .false.)
1634 call gauge_field_get_vec_pot(gfield, aa)
1635 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - aa/p_c
1642 if (
allocated(this%ep%e_field) .and.
associated(gfield))
then
1643 this%hm_base%uniform_vector_potential(1:space%periodic_dim) = &
1644 this%hm_base%uniform_vector_potential(1:space%periodic_dim) - time_*this%ep%e_field(1:space%periodic_dim)
1650 if (
allocated(this%ep%a_static))
then
1651 call this%hm_base%allocate_field(mesh, field_vector_potential, .false.)
1655 do idir = 1, space%dim
1656 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) + this%ep%a_static(ip, idir)
1662 call this%hm_base%accel_copy_pot(mesh)
1665 if (
allocated(this%ep%b_field))
then
1666 call this%hm_base%allocate_field(mesh, field_uniform_magnetic_field, .false.)
1668 this%hm_base%uniform_magnetic_field(idir) = this%hm_base%uniform_magnetic_field(idir) + this%ep%b_field(idir)
1672 call this%hm_base%update_magnetic_terms(mesh, this%ep%gyromagnetic_ratio, this%d%ispin)
1678 call profiling_out(
"HAMILTONIAN_ELEC_UPDATE_EXT_POT")
1684 integer :: ik, imat, nmat, max_npoints, offset, iphase, nphase
1688 if ((.not. this%kpoints%gamma_only()) .or.
allocated(this%hm_base%uniform_vector_potential))
then
1690 call profiling_in(
'UPDATE_PHASES')
1692 do iatom = 1, this%ep%natoms
1693 call projector_init_phases(this%ep%proj(iatom), space%dim, this%d, this%der%boundaries, this%kpoints, &
1694 vec_pot = this%hm_base%uniform_vector_potential, vec_pot_var = this%hm_base%vector_potential)
1697 call profiling_out(
'UPDATE_PHASES')
1700 if (
allocated(this%hm_base%uniform_vector_potential))
then
1701 call this%phase%update(mesh, this%d%kpt, this%kpoints, this%d, space, this%hm_base%uniform_vector_potential)
1704 max_npoints = this%vnl%max_npoints
1705 nmat = this%vnl%nprojector_matrices
1708 if (this%phase%is_allocated() .and.
allocated(this%vnl%projector_matrices))
then
1711 if (this%der%boundaries%spiralBC) nphase = 3
1713 if (.not.
allocated(this%vnl%projector_phases))
then
1714 safe_allocate(this%vnl%projector_phases(1:max_npoints, nphase, nmat, this%d%kpt%start:this%d%kpt%end))
1715 if (accel_is_enabled())
then
1716 call accel_create_buffer(this%vnl%buff_projector_phases, accel_mem_read_only, &
1717 type_cmplx, this%vnl%total_points*nphase*this%d%kpt%nlocal)
1722 do ik = this%d%kpt%start, this%d%kpt%end
1723 do imat = 1, this%vnl%nprojector_matrices
1724 iatom = this%vnl%projector_to_atom(imat)
1725 do iphase = 1, nphase
1727 do ip = 1, this%vnl%projector_matrices(imat)%npoints
1728 this%vnl%projector_phases(ip, imat, iphase, ik) = this%ep%proj(iatom)%phase(ip, iphase, ik)
1731 if (accel_is_enabled() .and. this%vnl%projector_matrices(imat)%npoints > 0)
then
1732 call accel_write_buffer(this%vnl%buff_projector_phases, &
1733 this%vnl%projector_matrices(imat)%npoints, this%vnl%projector_phases(1:, iphase, imat, ik), &
1736 offset = offset + this%vnl%projector_matrices(imat)%npoints
1750 logical,
intent(in) :: states_are_real
1754 if (hm%self_induced_magnetic)
then
1755 if (.not. states_are_real)
then
1758 message(1) =
'No current density for real states since it is identically zero.'
1759 call messages_warning(1)
1768 type(namespace_t),
intent(in) :: namespace
1769 type(grid_t),
intent(in) :: gr
1770 type(states_elec_t),
intent(inout) :: st
1771 type(states_elec_t),
intent(inout) :: hst
1773 integer :: ik, ib, ist
1774 complex(real64),
allocatable :: psi(:, :)
1775 complex(real64),
allocatable :: psiall(:, :, :, :)
1779 do ik = st%d%kpt%start, st%d%kpt%end
1780 do ib = st%group%block_start, st%group%block_end
1785 if (oct_exchange_enabled(hm%oct_exchange))
then
1787 safe_allocate(psiall(gr%np_part, 1:hst%d%dim, st%st_start:st%st_end, st%d%kpt%start:st%d%kpt%end))
1789 call states_elec_get_state(st, gr, psiall)
1791 call oct_exchange_prepare(hm%oct_exchange, gr, psiall, hm%xc, hm%psolver, namespace)
1793 safe_deallocate_a(psiall)
1795 safe_allocate(psi(gr%np_part, 1:hst%d%dim))
1799 call states_elec_get_state(hst, gr, ist, ik, psi)
1800 call oct_exchange_operator(hm%oct_exchange, namespace, gr, psi, ist, ik)
1801 call states_elec_set_state(hst, gr, ist, ik, psi)
1805 safe_deallocate_a(psi)
1827 type(namespace_t),
intent(in) :: namespace
1828 real(real64),
intent(in) :: mass
1832 if (parse_is_defined(namespace,
'ParticleMass'))
then
1833 message(1) =
'Attempting to redefine a non-unit electron mass'
1834 call messages_fatal(1)
1845 class(mesh_t),
intent(in) :: mesh
1846 real(real64),
contiguous,
intent(out) :: diag(:,:)
1847 integer,
intent(in) :: ik
1849 integer :: idim, ip, ispin
1851 real(real64),
allocatable :: ldiag(:)
1855 safe_allocate(ldiag(1:mesh%np))
1859 call derivatives_lapl_diag(hm%der, ldiag)
1861 do idim = 1, hm%d%dim
1862 diag(1:mesh%np, idim) = -m_half/hm%mass*ldiag(1:mesh%np)
1865 select case (hm%d%ispin)
1867 case (unpolarized, spin_polarized)
1868 ispin = hm%d%get_spin_index(ik)
1869 diag(1:mesh%np, 1) = diag(1:mesh%np, 1) + hm%ep%vpsl(1:mesh%np)
1873 diag(ip, 1) = diag(ip, 1) + hm%ep%vpsl(ip)
1874 diag(ip, 2) = diag(ip, 2) + hm%ep%vpsl(ip)
1879 call hm%ks_pot%add_vhxc(diag)
1888#include "hamiltonian_elec_inc.F90"
1891#include "complex.F90"
1892#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.