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 real(real64) :: exx_coef
153 type(poisson_t) :: psolver
156 logical :: self_induced_magnetic
157 real(real64),
allocatable :: a_ind(:, :)
158 real(real64),
allocatable :: b_ind(:, :)
160 integer :: theory_level
161 type(xc_t),
pointer :: xc
162 type(xc_photons_t),
pointer :: xc_photons
168 logical,
private :: adjoint
171 real(real64),
private :: mass
174 logical,
private :: inh_term
175 type(states_elec_t) :: inh_st
179 type(oct_exchange_t) :: oct_exchange
181 type(scissor_t) :: scissor
183 real(real64) :: current_time
184 logical,
private :: is_applied_packed
187 type(lda_u_t) :: lda_u
188 integer :: lda_u_level
190 logical,
public :: time_zero
192 type(exchange_operator_t),
public :: exxop
194 type(kpoints_t),
pointer,
public :: kpoints => null()
196 type(partner_list_t) :: external_potentials
197 real(real64),
allocatable,
public :: v_ext_pot(:)
198 real(real64),
allocatable,
public :: v_static(:)
200 type(ion_electron_local_potential_t) :: v_ie_loc
203 type(magnetic_constrain_t) :: magnetic_constrain
209 type(mxll_coupling_t) :: mxll
210 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
247 type(
xc_photons_t),
optional,
target,
intent(in) :: xc_photons
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)
307 if(
present(xc_photons))
then
308 hm%xc_photons => xc_photons
310 hm%xc_photons => null()
319 call poisson_init(hm%psolver, namespace, space, gr%der, mc, gr%stencil, st%qtot)
322 call epot_init(hm%ep, namespace, gr, hm%ions, hm%psolver, hm%d%ispin, hm%xc%family, hm%kpoints)
323 call kick_init(hm%kick, namespace, space, hm%kpoints, hm%d%ispin)
325 hm%zora =>
zora_t(namespace, hm%der, hm%d, hm%ep, hm%mass)
328 call hm%v_ie_loc%init(gr, hm%psolver, hm%ions, namespace)
330 call hm%nlcc%init(gr, hm%ions)
331 safe_allocate(st%rho_core(1:gr%np))
364 call parse_variable(namespace,
'CalculateSelfInducedMagneticField', .false., hm%self_induced_magnetic)
365 if (hm%self_induced_magnetic)
then
366 safe_allocate(hm%a_ind(1:gr%np_part, 1:space%dim))
367 safe_allocate(hm%b_ind(1:gr%np_part, 1:space%dim))
375 hm%inh_term = .false.
380 call hm%phase%init(gr, hm%d%kpt, hm%kpoints, st%d, space)
400 call lda_u_init(hm%lda_u, namespace, space, hm%lda_u_level, gr, ions, st, mc, &
401 hm%kpoints, hm%phase%is_allocated())
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
453 .or. hm%theory_level ==
rdmft .or. need_exchange_ .or. &
456 .or.
bitand(hm%xc%family, xc_family_oep) /= 0)
then
461 else if (
bitand(hm%xc%family, xc_family_oep) /= 0 .or. hm%theory_level ==
rdmft)
then
463 hm%kpoints, hm%xc%cam)
464 if (hm%theory_level ==
rdmft) hm%exxop%useACE = .false.
473 if (gr%use_curvilinear)
then
475 hm%is_applied_packed = .false.
476 call messages_write(
'Cannot use CUDA or OpenCL as curvilinear coordinates are used.')
479 call messages_write(
'Cannot use CUDA or OpenCL as curvilinear coordinates are used.', new_line = .
true.)
480 call messages_write(
'Calculation will not be continued. To force execution, set AllowCPUonly = yes.')
510 if (
associated(hm%xc_photons))
then
511 if (hm%xc_photons%wants_to_renormalize_mass())
then
513 call hm%set_mass(namespace, hm%xc_photons%get_renormalized_mass())
526 class(*),
pointer :: potential
531 safe_allocate(hm%v_ext_pot(1:gr%np))
532 hm%v_ext_pot(1:gr%np) =
m_zero
534 call iter%start(hm%external_potentials)
535 do while (iter%has_next())
536 potential => iter%get_next()
537 select type (potential)
540 call potential%allocate_memory(gr)
541 call potential%calculate(namespace, gr, hm%psolver)
544 select case (potential%type)
550 message(1) =
"Cannot use static magnetic field with real wavefunctions"
554 if (.not.
allocated(hm%ep%b_field))
then
555 safe_allocate(hm%ep%b_field(1:3))
556 hm%ep%b_field(1:3) =
m_zero
558 hm%ep%b_field(1:3) = hm%ep%b_field(1:3) + potential%b_field(1:3)
560 if (.not.
allocated(hm%ep%a_static))
then
561 safe_allocate(hm%ep%a_static(1:gr%np, 1:space%dim))
562 hm%ep%a_static(1:gr%np, 1:space%dim) =
m_zero
564 call lalg_axpy(gr%np, space%dim,
m_one, potential%a_static, hm%ep%a_static)
567 if (.not.
allocated(hm%ep%e_field))
then
568 safe_allocate(hm%ep%e_field(1:space%dim))
569 hm%ep%e_field(1:space%dim) =
m_zero
571 hm%ep%e_field(1:space%dim) = hm%ep%e_field(1:space%dim) + potential%e_field(1:space%dim)
574 if (space%periodic_dim < space%dim)
then
575 if (.not.
allocated(hm%v_static))
then
576 safe_allocate(hm%v_static(1:gr%np))
577 hm%v_static(1:gr%np) =
m_zero
579 if (.not.
allocated(hm%ep%v_ext))
then
580 safe_allocate(hm%ep%v_ext(1:gr%np_part))
581 hm%ep%v_ext(1:gr%np_part) =
m_zero
587 if (hm%kpoints%use_symmetries)
then
591 message(1) =
"The StaticElectricField breaks (at least) one of the symmetries used to reduce the k-points."
592 message(2) =
"Set SymmetryBreakDir equal to StaticElectricField."
599 call potential%deallocate_memory()
612 class(*),
pointer :: potential
616 call iter%start(hm%external_potentials)
617 do while (iter%has_next())
618 potential => iter%get_next()
619 select type (potential)
623 message(1) =
"Applying StaticElectricField in a periodic direction is only accurate for large supercells."
624 message(2) =
"Single-point Berry phase is not appropriate when k-point sampling is needed."
640 logical :: external_potentials_present
641 logical :: kick_present
645 if (
allocated(hm%ep%e_field) .and. space%is_periodic() .and. .not.
list_has_gauge_field(ext_partners))
then
648 if (any(abs(hm%ep%e_field(1:space%periodic_dim)) >
m_epsilon))
then
649 safe_allocate(hm%vberry(1:gr%np, 1:hm%d%nspin))
660 call pcm_init(hm%pcm, namespace, space, ions, gr, st%qtot, st%val_charge, external_potentials_present, kick_present)
661 if (hm%pcm%run_pcm)
then
682 call hm%hm_base%end()
688 safe_deallocate_a(hm%vberry)
689 safe_deallocate_a(hm%a_ind)
690 safe_deallocate_a(hm%b_ind)
691 safe_deallocate_a(hm%v_ext_pot)
693 safe_deallocate_p(hm%zora)
712 safe_deallocate_a(hm%energy)
714 if (hm%pcm%run_pcm)
call pcm_end(hm%pcm)
716 call hm%v_ie_loc%end()
719 call iter%start(hm%external_potentials)
720 do while (iter%has_next())
721 potential => iter%get_next()
722 safe_deallocate_p(potential)
724 call hm%external_potentials%empty()
725 safe_deallocate_a(hm%v_static)
751 integer,
intent(in) :: terms
772 real(real64),
intent(in) ::
delta(:)
773 real(real64),
intent(in) :: emin
784 hm%spectral_middle_point = (emax + emin) /
m_two
785 hm%spectral_half_span = (emax - emin) /
m_two
820 if (hm%inh_term)
then
822 hm%inh_term = .false.
834 if (.not. hm%adjoint)
then
837 hm%abs_boundaries%mf = -hm%abs_boundaries%mf
854 hm%abs_boundaries%mf = -hm%abs_boundaries%mf
866 class(
mesh_t),
intent(in) :: mesh
868 class(
space_t),
intent(in) :: space
870 real(real64),
optional,
intent(in) :: time
872 integer :: ispin, ip, idir, iatom, ilaser
873 real(real64) :: aa(space%dim), time_
874 real(real64),
allocatable :: vp(:,:)
877 real(real64) :: am(space%dim)
882 this%current_time =
m_zero
883 if (
present(time)) this%current_time = time
888 call this%hm_base%clear(mesh%np)
895 if (
present(time) .or. this%time_zero)
then
898 if(
associated(lasers))
then
899 do ilaser = 1, lasers%no_lasers
900 select case (
laser_kind(lasers%lasers(ilaser)))
902 do ispin = 1, this%d%spin_channels
904 this%hm_base%potential(:, ispin), time_)
910 safe_allocate(vp(1:mesh%np, 1:space%dim))
911 vp(1:mesh%np, 1:space%dim) =
m_zero
915 do idir = 1, space%dim
916 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) + vp(ip, idir)/
p_c
920 call laser_field(lasers%lasers(ilaser), this%hm_base%uniform_magnetic_field(1:space%dim), time_)
921 safe_deallocate_a(vp)
927 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - aa/
p_c
932 assert(
allocated(this%hm_base%uniform_vector_potential))
934 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - am/
p_c
940 if (
associated(gfield))
then
943 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - aa/
p_c
947 if (
allocated(this%ep%e_field) .and.
associated(gfield))
then
948 this%hm_base%uniform_vector_potential(1:space%periodic_dim) = &
949 this%hm_base%uniform_vector_potential(1:space%periodic_dim) - time_*this%ep%e_field(1:space%periodic_dim)
953 if (
associated(this%xc_photons))
then
954 if(this%xc_photons%lpfmf .and.
allocated(this%xc_photons%mf_vector_potential))
then
957 this%hm_base%uniform_vector_potential(1:space%dim) = &
958 this%hm_base%uniform_vector_potential(1:space%dim) - this%xc_photons%mf_vector_potential(1:space%dim)/
p_c
965 if (
allocated(this%ep%a_static))
then
970 do idir = 1, space%dim
971 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) + this%ep%a_static(ip, idir)
980 call this%hm_base%accel_copy_pot(mesh)
983 if (
allocated(this%ep%b_field))
then
986 this%hm_base%uniform_magnetic_field(idir) = this%hm_base%uniform_magnetic_field(idir) + this%ep%b_field(idir)
991 call this%hm_base%update_magnetic_terms(mesh, this%ep%gyromagnetic_ratio, this%d%ispin)
996 if (this%mxll%test_equad)
then
1008 integer :: ik, imat, nmat, max_npoints, offset
1010 integer :: iphase, nphase
1014 if ((.not. this%kpoints%gamma_only()) .or.
allocated(this%hm_base%uniform_vector_potential))
then
1018 do iatom = 1, this%ep%natoms
1019 call projector_init_phases(this%ep%proj(iatom), space%dim, this%d, this%der%boundaries, this%kpoints, &
1020 vec_pot = this%hm_base%uniform_vector_potential, vec_pot_var = this%hm_base%vector_potential)
1026 if (
allocated(this%hm_base%uniform_vector_potential))
then
1028 call this%phase%update(mesh, this%d%kpt, this%kpoints, this%d, space, this%hm_base%uniform_vector_potential)
1033 vec_pot = this%hm_base%uniform_vector_potential, vec_pot_var = this%hm_base%vector_potential)
1037 max_npoints = this%vnl%max_npoints
1038 nmat = this%vnl%nprojector_matrices
1041 if (this%phase%is_allocated() .and.
allocated(this%vnl%projector_matrices))
then
1044 if (this%der%boundaries%spiralBC) nphase = 3
1046 if (.not.
allocated(this%vnl%projector_phases))
then
1047 safe_allocate(this%vnl%projector_phases(1:max_npoints, 1:nphase, nmat, this%d%kpt%start:this%d%kpt%end))
1050 type_cmplx, this%vnl%total_points*nphase*this%d%kpt%nlocal)
1053 this%vnl%nphase = nphase
1058 do ik = this%d%kpt%start, this%d%kpt%end
1059 do imat = 1, this%vnl%nprojector_matrices
1060 iatom = this%vnl%projector_to_atom(imat)
1061 do iphase = 1, nphase
1063 do ip = 1, this%vnl%projector_matrices(imat)%npoints
1064 this%vnl%projector_phases(ip, iphase, imat, ik) = this%ep%proj(iatom)%phase(ip, iphase, ik)
1067 if (
accel_is_enabled() .and. this%vnl%projector_matrices(imat)%npoints > 0)
then
1069 this%vnl%projector_matrices(imat)%npoints, this%vnl%projector_phases(1:, iphase, imat, ik), &
1070 offset = offset, async=.
true.)
1072 offset = offset + this%vnl%projector_matrices(imat)%npoints
1093 class(
mesh_t),
intent(in) :: mesh
1094 logical,
optional,
intent(in) :: accumulate
1096 integer :: ispin, ip
1103 do ispin = 1, this%d%nspin
1106 this%hm_base%potential(ip, ispin) =
m_zero
1113 do ispin = 1, this%d%nspin
1114 if (ispin <= 2)
then
1118 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + this%ep%vpsl(ip) + this%v_ext_pot(ip)
1122 if (this%pcm%run_pcm)
then
1123 if (this%pcm%solute)
then
1126 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + &
1127 this%pcm%v_e_rs(ip) + this%pcm%v_n_rs(ip)
1131 if (this%pcm%localf)
then
1134 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + &
1135 this%pcm%v_ext_rs(ip)
1145 this%hm_base%Impotential(ip, ispin) = this%hm_base%Impotential(ip, ispin) + this%abs_boundaries%mf(ip)
1156 call this%zora%update(this%der, this%hm_base%potential)
1160 do ispin = 1, this%d%nspin
1162 if (
allocated(this%hm_base%zeeman_pot))
then
1165 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + this%hm_base%zeeman_pot(ip, ispin)
1171 if (this%mxll%test_equad)
then
1174 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + this%mxll%e_quadrupole_pot(ip)
1183 call this%ks_pot%add_vhxc(this%hm_base%potential)
1185 call this%hm_base%accel_copy_pot(mesh)
1195 type(
grid_t),
intent(in) :: gr
1196 type(
ions_t),
target,
intent(inout) :: ions
1199 real(real64),
optional,
intent(in) :: time
1204 call epot_generate(this%ep, namespace, gr, this%ions, this%d)
1209 if (
allocated(this%ep%e_field) .and. space%periodic_dim < space%dim)
then
1215 this%v_ie_loc%atoms_dist => ions%atoms_dist
1216 this%v_ie_loc%atom => ions%atom
1217 call this%v_ie_loc%calculate()
1220 call lalg_axpy(gr%np,
m_one, this%v_ie_loc%potential(:,1), this%ep%vpsl)
1224 if (this%ep%nlcc)
then
1225 this%nlcc%atoms_dist => ions%atoms_dist
1226 this%nlcc%atom => ions%atom
1227 call this%nlcc%calculate()
1228 call lalg_copy(gr%np, this%nlcc%density(:,1), st%rho_core)
1231 call this%vnl%build(space, gr, this%ep)
1236 if (this%ep%non_local .and. .not. this%vnl%apply_projector_matrices)
then
1238 call messages_write(
'Relativistic pseudopotentials have not been fully implemented for CUDA or OpenCL.')
1241 call messages_write(
'Relativistic pseudopotentials have not been fully implemented for CUDA or OpenCL.',&
1243 call messages_write(
'Calculation will not be continued. To force execution, set AllowCPUonly = yes.')
1250 if (this%pcm%run_pcm)
then
1253 if (this%pcm%solute)
then
1260 if (this%pcm%localf .and.
allocated(this%v_static))
then
1261 call pcm_calc_pot_rs(this%pcm, gr, this%psolver, v_ext = this%ep%v_ext(1:gr%np_part))
1266 call lda_u_update_basis(this%lda_u, space, gr, ions, st, this%psolver, namespace, this%kpoints, &
1267 this%phase%is_allocated())
1277 time = this%current_time
1285 apply = this%is_applied_packed
1293 type(namespace_t),
intent(in) :: namespace
1294 class(space_t),
intent(in) :: space
1295 type(lattice_vectors_t),
intent(in) :: latt
1296 class(species_t),
intent(in) :: species
1297 real(real64),
intent(in) :: pos(1:space%dim)
1298 integer,
intent(in) :: ia
1299 class(mesh_t),
intent(in) :: mesh
1300 complex(real64),
intent(in) :: psi(:,:)
1301 complex(real64),
intent(out) :: vpsi(:,:)
1304 real(real64),
allocatable :: vlocal(:)
1307 safe_allocate(vlocal(1:mesh%np_part))
1309 call epot_local_potential(hm%ep, namespace, space, latt, mesh, species, pos, ia, vlocal)
1311 do idim = 1, hm%d%dim
1312 vpsi(1:mesh%np, idim) = vlocal(1:mesh%np) * psi(1:mesh%np, idim)
1315 safe_deallocate_a(vlocal)
1326 class(space_t),
intent(in) :: space
1327 class(mesh_t),
intent(in) :: mesh
1328 type(partner_list_t),
intent(in) :: ext_partners
1329 real(real64),
intent(in) :: time(1:2)
1330 real(real64),
intent(in) :: mu(1:2)
1332 integer :: ispin, ip, idir, iatom, ilaser, itime
1333 real(real64) :: aa(space%dim), time_
1334 real(real64),
allocatable :: vp(:,:)
1335 real(real64),
allocatable :: velectric(:)
1336 type(lasers_t),
pointer :: lasers
1337 type(gauge_field_t),
pointer :: gfield
1340 call profiling_in(
"HAMILTONIAN_ELEC_UPDATE_EXT_POT")
1342 this%current_time = m_zero
1343 this%current_time = time(1)
1346 call this%hm_base%clear(mesh%np)
1349 call this%hm_base%allocate_field(mesh, field_potential, &
1350 complex_potential = this%abs_boundaries%abtype == imaginary_absorbing)
1355 lasers => list_get_lasers(ext_partners)
1356 if(
associated(lasers))
then
1357 do ilaser = 1, lasers%no_lasers
1358 select case (laser_kind(lasers%lasers(ilaser)))
1359 case (e_field_scalar_potential, e_field_electric)
1360 safe_allocate(velectric(1:mesh%np))
1361 do ispin = 1, this%d%spin_channels
1363 call laser_potential(lasers%lasers(ilaser), mesh, velectric, time_)
1366 this%hm_base%potential(ip, ispin) = this%hm_base%potential(ip, ispin) + mu(itime) * velectric(ip)
1369 safe_deallocate_a(velectric)
1370 case (e_field_magnetic)
1371 call this%hm_base%allocate_field(mesh, field_vector_potential + field_uniform_magnetic_field, .false.)
1373 safe_allocate(vp(1:mesh%np, 1:space%dim))
1374 vp(1:mesh%np, 1:space%dim) = m_zero
1375 call laser_vector_potential(lasers%lasers(ilaser), mesh, vp, time_)
1376 do idir = 1, space%dim
1379 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) &
1380 - mu(itime) * vp(ip, idir)/p_c
1384 call laser_field(lasers%lasers(ilaser), this%hm_base%uniform_magnetic_field(1:space%dim), time_)
1385 safe_deallocate_a(vp)
1386 case (e_field_vector_potential)
1387 call this%hm_base%allocate_field(mesh, field_uniform_vector_potential, .false.)
1390 call laser_field(lasers%lasers(ilaser), aa, time_)
1391 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) &
1392 - mu(itime) * aa/p_c
1398 gfield => list_get_gauge_field(ext_partners)
1399 if (
associated(gfield))
then
1400 call this%hm_base%allocate_field(mesh, field_uniform_vector_potential, .false.)
1401 call gauge_field_get_vec_pot(gfield, aa)
1402 this%hm_base%uniform_vector_potential(1:space%dim) = this%hm_base%uniform_vector_potential(1:space%dim) - aa/p_c
1409 if (
allocated(this%ep%e_field) .and.
associated(gfield))
then
1410 this%hm_base%uniform_vector_potential(1:space%periodic_dim) = &
1411 this%hm_base%uniform_vector_potential(1:space%periodic_dim) - time_*this%ep%e_field(1:space%periodic_dim)
1417 if (
allocated(this%ep%a_static))
then
1418 call this%hm_base%allocate_field(mesh, field_vector_potential, .false.)
1422 do idir = 1, space%dim
1423 this%hm_base%vector_potential(idir, ip) = this%hm_base%vector_potential(idir, ip) + this%ep%a_static(ip, idir)
1429 call this%hm_base%accel_copy_pot(mesh)
1432 if (
allocated(this%ep%b_field))
then
1433 call this%hm_base%allocate_field(mesh, field_uniform_magnetic_field, .false.)
1435 this%hm_base%uniform_magnetic_field(idir) = this%hm_base%uniform_magnetic_field(idir) + this%ep%b_field(idir)
1439 call this%hm_base%update_magnetic_terms(mesh, this%ep%gyromagnetic_ratio, this%d%ispin)
1445 call profiling_out(
"HAMILTONIAN_ELEC_UPDATE_EXT_POT")
1451 integer :: ik, imat, nmat, max_npoints, offset, iphase, nphase
1455 if ((.not. this%kpoints%gamma_only()) .or.
allocated(this%hm_base%uniform_vector_potential))
then
1457 call profiling_in(
'UPDATE_PHASES')
1459 do iatom = 1, this%ep%natoms
1460 call projector_init_phases(this%ep%proj(iatom), space%dim, this%d, this%der%boundaries, this%kpoints, &
1461 vec_pot = this%hm_base%uniform_vector_potential, vec_pot_var = this%hm_base%vector_potential)
1464 call profiling_out(
'UPDATE_PHASES')
1467 if (
allocated(this%hm_base%uniform_vector_potential))
then
1468 call this%phase%update(mesh, this%d%kpt, this%kpoints, this%d, space, this%hm_base%uniform_vector_potential)
1471 max_npoints = this%vnl%max_npoints
1472 nmat = this%vnl%nprojector_matrices
1475 if (this%phase%is_allocated() .and.
allocated(this%vnl%projector_matrices))
then
1478 if (this%der%boundaries%spiralBC) nphase = 3
1480 if (.not.
allocated(this%vnl%projector_phases))
then
1481 safe_allocate(this%vnl%projector_phases(1:max_npoints, nphase, nmat, this%d%kpt%start:this%d%kpt%end))
1482 if (accel_is_enabled())
then
1483 call accel_create_buffer(this%vnl%buff_projector_phases, accel_mem_read_only, &
1484 type_cmplx, this%vnl%total_points*nphase*this%d%kpt%nlocal)
1489 do ik = this%d%kpt%start, this%d%kpt%end
1490 do imat = 1, this%vnl%nprojector_matrices
1491 iatom = this%vnl%projector_to_atom(imat)
1492 do iphase = 1, nphase
1494 do ip = 1, this%vnl%projector_matrices(imat)%npoints
1495 this%vnl%projector_phases(ip, imat, iphase, ik) = this%ep%proj(iatom)%phase(ip, iphase, ik)
1498 if (accel_is_enabled() .and. this%vnl%projector_matrices(imat)%npoints > 0)
then
1499 call accel_write_buffer(this%vnl%buff_projector_phases, &
1500 this%vnl%projector_matrices(imat)%npoints, this%vnl%projector_phases(1:, iphase, imat, ik), &
1503 offset = offset + this%vnl%projector_matrices(imat)%npoints
1517 logical,
intent(in) :: states_are_real
1521 if (hm%self_induced_magnetic)
then
1522 if (.not. states_are_real)
then
1525 message(1) =
'No current density for real states since it is identically zero.'
1526 call messages_warning(1)
1535 type(namespace_t),
intent(in) :: namespace
1536 type(grid_t),
intent(in) :: gr
1537 type(states_elec_t),
intent(inout) :: st
1538 type(states_elec_t),
intent(inout) :: hst
1540 integer :: ik, ib, ist
1541 complex(real64),
allocatable :: psi(:, :)
1542 complex(real64),
allocatable :: psiall(:, :, :, :)
1546 do ik = st%d%kpt%start, st%d%kpt%end
1547 do ib = st%group%block_start, st%group%block_end
1552 if (oct_exchange_enabled(hm%oct_exchange))
then
1554 safe_allocate(psiall(gr%np_part, 1:hst%d%dim, st%st_start:st%st_end, st%d%kpt%start:st%d%kpt%end))
1556 call states_elec_get_state(st, gr, psiall)
1558 call oct_exchange_prepare(hm%oct_exchange, gr, psiall, hm%xc, hm%psolver, namespace)
1560 safe_deallocate_a(psiall)
1562 safe_allocate(psi(gr%np_part, 1:hst%d%dim))
1566 call states_elec_get_state(hst, gr, ist, ik, psi)
1567 call oct_exchange_operator(hm%oct_exchange, namespace, gr, psi, ist, ik)
1568 call states_elec_set_state(hst, gr, ist, ik, psi)
1572 safe_deallocate_a(psi)
1582 subroutine magnus(hm, namespace, mesh, psi, hpsi, ik, vmagnus, set_phase)
1584 type(namespace_t),
intent(in) :: namespace
1585 class(mesh_t),
intent(in) :: mesh
1586 complex(real64),
contiguous,
intent(inout) :: psi(:,:)
1587 complex(real64),
contiguous,
intent(out) :: hpsi(:,:)
1588 integer,
intent(in) :: ik
1589 real(real64),
intent(in) :: vmagnus(:, :, :)
1590 logical,
optional,
intent(in) :: set_phase
1592 complex(real64),
allocatable :: auxpsi(:, :), aux2psi(:, :)
1593 integer :: idim, ispin
1598 if (hm%d%dim /= 1)
then
1599 call messages_not_implemented(
"Magnus with spinors", namespace=namespace)
1602 safe_allocate( auxpsi(1:mesh%np_part, 1:hm%d%dim))
1603 safe_allocate(aux2psi(1:mesh%np, 1:hm%d%dim))
1605 ispin = hm%d%get_spin_index(ik)
1609 terms = term_kinetic + term_non_local_potential, set_phase = set_phase)
1612 do idim = 1, hm%d%dim
1613 call lalg_copy(mesh%np, auxpsi(:, idim), hpsi(:, idim))
1614 hpsi(1:mesh%np, idim) = hpsi(1:mesh%np, idim) + hm%ep%Vpsl(1:mesh%np)*psi(1:mesh%np,idim)
1615 call vborders(mesh, hm, psi(:, idim), hpsi(:, idim))
1617 hpsi(1:mesh%np, 1) = hpsi(1:mesh%np, 1) + vmagnus(1:mesh%np, ispin, 2)*psi(1:mesh%np, 1)
1620 hpsi(1:mesh%np, 1) = hpsi(1:mesh%np, 1) - m_zi*vmagnus(1:mesh%np, ispin, 1)*auxpsi(1:mesh%np, 1)
1623 auxpsi(1:mesh%np, 1) = vmagnus(1:mesh%np, ispin, 1)*psi(1:mesh%np, 1)
1625 terms = term_kinetic + term_non_local_potential, set_phase = set_phase)
1626 hpsi(1:mesh%np, 1) = hpsi(1:mesh%np, 1) + m_zi*aux2psi(1:mesh%np, 1)
1628 safe_deallocate_a(auxpsi)
1629 safe_deallocate_a(aux2psi)
1634 subroutine vborders (mesh, hm, psi, hpsi)
1635 class(mesh_t),
intent(in) :: mesh
1637 complex(real64),
intent(in) :: psi(:)
1638 complex(real64),
intent(inout) :: hpsi(:)
1644 if (hm%abs_boundaries%abtype == imaginary_absorbing)
then
1646 hpsi(ip) = hpsi(ip) + m_zi*hm%abs_boundaries%mf(ip)*psi(ip)
1668 type(namespace_t),
intent(in) :: namespace
1669 real(real64),
intent(in) :: mass
1673 if (parse_is_defined(namespace,
'ParticleMass'))
then
1674 message(1) =
'Attempting to redefine a non-unit electron mass'
1675 call messages_fatal(1)
1692 type(grid_t),
intent(in) :: gr
1693 type(distributed_t),
intent(in) :: kpt
1694 type(wfs_elec_t),
intent(in) :: psib
1695 type(wfs_elec_t),
intent(out) :: psib_with_phase
1697 integer :: k_offset, n_boundary_points
1701 call psib%copy_to(psib_with_phase)
1702 if (hm%phase%is_allocated())
then
1703 call hm%phase%apply_to(gr, gr%np, conjugate = .false., psib = psib_with_phase, src = psib, async=.
true.)
1706 k_offset = psib%ik - kpt%start
1707 n_boundary_points = int(gr%np_part - gr%np)
1708 call boundaries_set(gr%der%boundaries, gr, psib_with_phase, phase_correction = hm%phase%phase_corr(:, psib%ik), &
1709 buff_phase_corr = hm%phase%buff_phase_corr, offset=k_offset*n_boundary_points, async=.
true.)
1711 call psib%copy_data_to(gr%np, psib_with_phase)
1712 call boundaries_set(gr%der%boundaries, gr, psib_with_phase)
1715 call psib_with_phase%do_pack(copy = .
true.)
1723 class(mesh_t),
intent(in) :: mesh
1724 real(real64),
contiguous,
intent(out) :: diag(:,:)
1725 integer,
intent(in) :: ik
1727 integer :: idim, ip, ispin
1729 real(real64),
allocatable :: ldiag(:)
1733 safe_allocate(ldiag(1:mesh%np))
1737 call derivatives_lapl_diag(hm%der, ldiag)
1739 do idim = 1, hm%d%dim
1740 diag(1:mesh%np, idim) = -m_half/hm%mass*ldiag(1:mesh%np)
1743 select case (hm%d%ispin)
1745 case (unpolarized, spin_polarized)
1746 ispin = hm%d%get_spin_index(ik)
1747 diag(1:mesh%np, 1) = diag(1:mesh%np, 1) + hm%ep%vpsl(1:mesh%np)
1751 diag(ip, 1) = diag(ip, 1) + hm%ep%vpsl(ip)
1752 diag(ip, 2) = diag(ip, 2) + hm%ep%vpsl(ip)
1757 call hm%ks_pot%add_vhxc(diag)
1766#include "hamiltonian_elec_inc.F90"
1769#include "complex.F90"
1770#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,...
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 gauge_field_get_vec_pot(this, vec_pot)
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
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
integer, parameter, public field_potential
subroutine vborders(mesh, hm, psi, hpsi)
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 hamiltonian_elec_copy_and_set_phase(hm, gr, kpt, psib, psib_with_phase)
Copy a batch to another batch and apply the Bloch phase to it.
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)
subroutine, public magnus(hm, namespace, mesh, psi, hpsi, ik, vmagnus, set_phase)
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 dvmask(mesh, hm, st)
logical function, public hamiltonian_elec_needs_current(hm, states_are_real)
subroutine, public hamiltonian_elec_remove_inh(hm)
subroutine zhamiltonian_elec_magnus_apply(hm, namespace, mesh, psib, hpsib, vmagnus)
subroutine, public zhamiltonian_elec_apply_atom(hm, namespace, space, latt, species, pos, ia, mesh, psi, vpsi)
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 dhamiltonian_elec_magnus_apply(hm, namespace, mesh, psib, hpsib, vmagnus)
subroutine hamiltonian_elec_update(this, mesh, namespace, space, ext_partners, time)
(re-)build the Hamiltonian for the next application:
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 zhamiltonian_elec_apply(hm, namespace, mesh, psib, hpsib, terms, set_bc)
This module defines classes and functions for interaction partners.
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.
integer, parameter, public rdmft
integer, parameter, public hartree
integer, parameter, public hartree_fock
integer, parameter, public independent_particles
integer, parameter, public generalized_kohn_sham_dft
integer, parameter, public kohn_sham_dft
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_update_basis(this, space, gr, ions, st, psolver, namespace, kpoints, has_phase)
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)
subroutine, public lda_u_init(this, namespace, space, level, gr, ions, st, mc, kpoints, has_phase)
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_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.
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 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.