37 use,
intrinsic :: iso_fortran_env
75 type(ion_state_t) :: ions_state
76 real(real64),
allocatable :: vecpot(:), vecpot_vel(:)
84 type(namespace_t),
intent(in) :: namespace
85 class(space_t),
intent(in) :: space
86 type(states_elec_t),
intent(inout) :: st
87 class(mesh_t),
intent(in) :: mesh
88 type(hamiltonian_elec_t),
intent(inout) :: hm
89 type(partner_list_t),
intent(in) :: ext_partners
90 real(real64),
intent(in) :: time
98 call hm%update(mesh, namespace, space, ext_partners, time = time)
109 ext_partners, mc, time, dt, save_pos)
110 class(propagation_ops_elec_t),
intent(inout) :: wo
111 type(grid_t),
intent(inout) :: gr
112 type(hamiltonian_elec_t),
intent(inout) :: hm
113 type(states_elec_t),
intent(inout) :: st
114 type(namespace_t),
intent(in) :: namespace
115 type(electron_space_t),
intent(in) :: space
116 type(ion_dynamics_t),
intent(inout) :: ions_dyn
117 type(ions_t),
intent(inout) :: ions
118 type(partner_list_t),
intent(in) :: ext_partners
119 type(multicomm_t),
intent(inout) :: mc
120 real(real64),
intent(in) :: time
121 real(real64),
intent(in) :: dt
122 logical,
optional,
intent(in) :: save_pos
124 real(real64) :: dt_ions
131 if (ions_dyn%is_active())
then
132 dt_ions = dt * ions_dyn%ionic_scale
151 type(grid_t),
intent(inout) :: gr
152 type(hamiltonian_elec_t),
intent(inout) :: hm
153 type(states_elec_t),
intent(inout) :: st
154 type(namespace_t),
intent(in) :: namespace
155 type(electron_space_t),
intent(in) :: space
156 type(ion_dynamics_t),
intent(inout) :: ions_dyn
157 type(ions_t),
intent(inout) :: ions
158 type(multicomm_t),
intent(inout) :: mc
159 real(real64),
intent(in) :: time
160 real(real64),
intent(in) :: dt_ions
167 if (ions_dyn%cell_relax())
then
170 mc, st%qtot, ions%latt)
180 type(
ions_t),
intent(inout) :: ions
187 if (ions_dyn%is_active())
then
200 real(real64),
intent(in) :: dt
201 real(real64),
intent(in) :: time
202 logical,
optional,
intent(in) :: save_gf
211 safe_allocate(wo%vecpot(1:gfield%space%dim))
212 safe_allocate(wo%vecpot_vel(1:gfield%space%dim))
228 class(
space_t),
intent(in) :: space
230 class(
mesh_t),
intent(in) :: mesh
240 if (
associated(gfield))
then
243 safe_deallocate_a(wo%vecpot)
244 safe_deallocate_a(wo%vecpot_vel)
245 call hm%update(mesh, namespace, space, ext_partners)
258 class(
mesh_t),
intent(in) :: mesh
260 real(real64),
intent(in) :: dt
269 do ik = st%d%kpt%start, st%d%kpt%end
271 do ib = st%group%block_start, st%group%block_end
275 call hm%phase%set_phase_corr(mesh, st%group%psib(ib, ik), async=.
true.)
277 call te%apply_batch(namespace, mesh, hm, st%group%psib(ib, ik), dt, &
278 inh_psib = hm%inh_st%group%psib(ib, ik), op=op)
280 call te%apply_batch(namespace, mesh, hm, st%group%psib(ib, ik), dt, op=op)
282 call hm%phase%unset_phase_corr(mesh, st%group%psib(ib, ik))
318 type(
grid_t),
intent(in) :: gr
320 real(real64),
intent(in) :: dt
321 real(real64),
optional,
intent(in) :: dt2
323 type(
states_elec_t),
optional,
target,
intent(inout) :: st_td
335 if (
present(st_td))
then
341 if (
present(dt2) .and. .not.
present(st_td))
then
342 safe_allocate(zpsib_dt)
345 do ik = st%d%kpt%start, st%d%kpt%end
348 do ib = st%group%block_start, st%group%block_end
355 call hm%phase%set_phase_corr(gr, st%group%psib(ib, ik), async=.
true.)
357 if (
present(dt2))
then
358 if (
present(st_td))
then
359 zpsib_dt => st_td%group%psib(ib, ik)
362 call st%group%psib(ib, ik)%copy_to(zpsib_dt)
363 if (st%group%psib(ib, ik)%is_packed())
call zpsib_dt%do_pack(copy = .false.)
368 call te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik), dt, psib2 = zpsib_dt, &
369 deltat2 = dt2, inh_psib = hm%inh_st%group%psib(ib, ik), op = op)
371 call te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik), dt, psib2 = zpsib_dt, &
372 deltat2 = dt2, op = op)
375 call hm%phase%unset_phase_corr(gr, st%group%psib(ib, ik), async=.
true.)
380 if (
present(st_td))
then
381 call hm%phase%unset_phase_corr(gr, zpsib_dt, async=.
true.)
390 call te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik), dt, &
391 inh_psib = hm%inh_st%group%psib(ib, ik), op = op)
393 call te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik), dt, op = op)
395 call hm%phase%unset_phase_corr(gr, st%group%psib(ib, ik), async=.
true.)
402 if (ib-1 >= st%group%block_start)
then
414 if (
present(dt2) .and. .not.
present(st_td))
then
415 safe_deallocate_p(zpsib_dt)
429 integer,
intent(in) :: ib
430 integer,
intent(in) :: ik
431 logical,
optional,
intent(in) :: copy
438 if (hm%apply_packed())
then
440 call st%group%psib(ib, ik)%do_pack(copy=copy_, async=.
true.)
452 integer,
intent(in) :: ib
453 integer,
intent(in) :: ik
456 if (hm%apply_packed())
then
458 call st%group%psib(ib, ik)%do_unpack(async=.
true.)
468 integer,
intent(in) :: ib
469 integer,
intent(in) :: ik
472 if (hm%apply_packed())
then
474 call st%group%psib(ib, ik)%finish_unpack()
487 call hm%ks_pot%get_interpolated_potentials(vks_old, 0)
496 class(
mesh_t),
intent(in) :: mesh
499 real(real64),
parameter :: density_threshold = 1.0e-8_real64
502 if (.not. hm%mxll%calc_field_dip)
return
504 select case (hm%mxll%coupling_mode)
506 if (hm%mxll%add_electric_dip)
then
509 if (hm%mxll%add_magnetic_dip)
then
521 real(real64) :: field_dip(3)
522 real(real64),
contiguous,
intent(in) :: field_full(:,:)
524 real(real64),
allocatable :: total_density(:), mask_density(:)
525 real(real64) :: integral_mask
529 select case (hm%mxll%dipole_field)
531 safe_allocate(total_density(1:mesh%np))
532 safe_allocate(mask_density(
size(total_density)))
533 total_density = sum(st%rho(1:mesh%np, 1:st%d%spin_channels), dim=2)
538 mask_density = merge(
m_one,
m_zero, total_density > density_threshold)
540 do idir = 1, mesh%box%dim
541 field_dip(idir) =
dmf_integrate(mesh, mask_density*field_full(:,idir))/integral_mask
543 safe_deallocate_a(total_density)
544 safe_deallocate_a(mask_density)
547 if (mesh%mpi_grp%rank == hm%mxll%center_of_mass_rankmin)
then
548 field_dip(1:3) = field_full(hm%mxll%center_of_mass_ip,1:3)
550 call mesh%allreduce(field_dip(:))
subroutine, public accel_finish()
subroutine, public accel_set_stream(stream_number)
This module implements batches of mesh functions.
This module implements a calculator for the density and defines related functions.
subroutine, public density_calc_accumulate(this, psib, async)
Accumulate weighted orbital densities for a batch psib.
subroutine, public density_calc_init(this, st, gr, density)
initialize the density calculator
subroutine, public density_calc_end(this, allreduce, symmetrize, buff_density)
Finalize the density calculation.
type(gauge_field_t) function, pointer, public list_get_gauge_field(partners)
subroutine, public gauge_field_set_vec_pot_vel(this, vec_pot_vel)
subroutine, public gauge_field_set_vec_pot(this, vec_pot)
subroutine, public gauge_field_get_vec_pot(this, vec_pot)
subroutine, public gauge_field_do_algorithmic_operation(this, operation, dt, time)
subroutine, public gauge_field_get_vec_pot_vel(this, vec_pot_vel)
logical pure function, public gauge_field_is_propagated(this)
real(real64), parameter, public m_zero
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
subroutine, public hamiltonian_elec_epot_generate(this, namespace, space, gr, ions, ext_partners, st, time)
pure logical function, public hamiltonian_elec_inh_term(hm)
This module defines classes and functions for interaction partners.
subroutine, public ion_dynamics_restore_state(this, ions, state)
subroutine, public ion_dynamics_propagate(this, ions, time, dt, namespace)
Interface for the ion/cell dynamics.
subroutine, public ion_dynamics_save_state(this, ions, state)
subroutine, public electrons_lattice_vectors_update(namespace, gr, space, psolver, kpoints, mc, qtot, new_latt)
subroutine, public ion_dynamics_box_update(namespace, gr, space, new_latt)
subroutine, public lda_u_update_occ_matrices(this, namespace, mesh, st, phase, energy)
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
This module handles the communicators for the various parallelization strategies.
integer, parameter, public length_gauge_dipole
integer, parameter, public dipole_average
integer, parameter, public velocity_gauge_dipole
integer, parameter, public multipolar_expansion
integer, parameter, public dipole_at_com
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 propagation_ops_elec_restore_ions(wo, ions_dyn, ions)
subroutine, public propagation_ops_elec_propagate_gauge_field(wo, gfield, dt, time, save_gf)
subroutine, public propagation_ops_do_unpack(st, hm, ib, ik)
subroutine, public propagation_ops_elec_propagate_ions_and_cell(gr, hm, st, namespace, space, ions_dyn, ions, mc, time, dt_ions)
subroutine, public propagation_ops_elec_update_hamiltonian(namespace, space, st, mesh, hm, ext_partners, time)
subroutine, public propagation_ops_elec_fuse_density_exp_apply(te, namespace, st, gr, hm, dt, dt2, op, st_td)
Apply to all states, and accumulate the density in the same pass.
subroutine, public propagation_ops_elec_interpolate_get(hm, vks_old)
subroutine, public propagation_ops_elec_restore_gauge_field(wo, namespace, space, hm, mesh, ext_partners)
subroutine, public propagation_ops_finish_unpack(st, hm, ib, ik)
subroutine calculate_mxll_dipole_field(hm, mesh, st)
subroutine, public propagation_ops_do_pack(st, hm, ib, ik, copy)
subroutine, public propagation_ops_elec_move_ions(wo, gr, hm, st, namespace, space, ions_dyn, ions, ext_partners, mc, time, dt, save_pos)
subroutine, public propagation_ops_elec_exp_apply(te, namespace, st, mesh, hm, dt, op)
type(algorithmic_operation_t), parameter, public op_verlet_compute_acc
real(real64) function, dimension(3) get_field_dip(field_full)
Description of the grid, containing information on derivatives, stencil, and symmetries.
Describes mesh distribution to nodes.
The states_elec_t class contains all electronic wave functions.
batches of electronic states