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
268 do ik = st%d%kpt%start, st%d%kpt%end
270 do ib = st%group%block_start, st%group%block_end
274 call hm%phase%set_phase_corr(mesh, st%group%psib(ib, ik), async=.
true.)
276 call te%apply_batch(namespace, mesh, hm, st%group%psib(ib, ik), dt, &
277 inh_psib = hm%inh_st%group%psib(ib, ik))
279 call te%apply_batch(namespace, mesh, hm, st%group%psib(ib, ik), dt)
281 call hm%phase%unset_phase_corr(mesh, st%group%psib(ib, ik))
302 type(
grid_t),
intent(in) :: gr
304 real(real64),
intent(in) :: dt
305 real(real64),
optional,
intent(in) :: dt2
306 real(real64),
optional,
intent(in) :: vmagnus(:,:,:)
318 do ik = st%d%kpt%start, st%d%kpt%end
320 do ib = st%group%block_start, st%group%block_end
324 call hm%phase%set_phase_corr(gr, st%group%psib(ib, ik), async=.
true.)
325 if (
present(dt2))
then
326 call st%group%psib(ib, ik)%copy_to(zpsib_dt)
327 if (st%group%psib(ib, ik)%is_packed())
call zpsib_dt%do_pack(copy = .false.)
331 call te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik), dt, psib2 = zpsib_dt, &
332 deltat2 = dt2, inh_psib = hm%inh_st%group%psib(ib, ik))
334 call te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik), dt, psib2 = zpsib_dt, &
337 call hm%phase%unset_phase_corr(gr, st%group%psib(ib, ik), async=.
true.)
346 call te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik), dt, vmagnus=vmagnus, &
347 inh_psib = hm%inh_st%group%psib(ib, ik))
349 call te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik), dt, vmagnus=vmagnus)
351 call hm%phase%unset_phase_corr(gr, st%group%psib(ib, ik), async=.
true.)
376 integer,
intent(in) :: ib
377 integer,
intent(in) :: ik
380 if (hm%apply_packed())
then
382 call st%group%psib(ib, ik)%do_pack(async=.
true.)
392 integer,
intent(in) :: ib
393 integer,
intent(in) :: ik
396 if (hm%apply_packed())
then
398 call st%group%psib(ib, ik)%do_unpack(async=.
true.)
408 integer,
intent(in) :: ib
409 integer,
intent(in) :: ik
412 if (hm%apply_packed())
then
414 call st%group%psib(ib, ik)%finish_unpack()
423 class(
mesh_t),
intent(in) :: mesh
428 call hm%ks_pot%get_interpolated_potentials(vks_old, 0)
437 class(
mesh_t),
intent(in) :: mesh
440 real(real64),
parameter :: density_threshold = 1.0e-8_real64
443 if (.not. hm%mxll%calc_field_dip)
return
445 select case (hm%mxll%coupling_mode)
447 if (hm%mxll%add_electric_dip)
then
450 if (hm%mxll%add_magnetic_dip)
then
462 real(real64) :: field_dip(3)
463 real(real64),
intent(in) :: field_full(:,:)
465 real(real64),
allocatable :: total_density(:), mask_density(:)
466 real(real64) :: integral_mask
470 select case (hm%mxll%dipole_field)
472 safe_allocate(total_density(1:mesh%np))
473 safe_allocate(mask_density(
size(total_density)))
474 total_density = sum(st%rho(1:mesh%np,:), dim=2)
479 mask_density = merge(
m_one,
m_zero, total_density > density_threshold)
481 do idir = 1, mesh%box%dim
482 field_dip(idir) =
dmf_integrate(mesh, mask_density*field_full(:,idir))/integral_mask
484 safe_deallocate_a(total_density)
485 safe_deallocate_a(mask_density)
488 if (mesh%mpi_grp%rank == hm%mxll%center_of_mass_rankmin)
then
489 field_dip(1:3) = field_full(hm%mxll%center_of_mass_ip,1:3)
491 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_end(this, allreduce, symmetrize)
Finalize the density calculation.
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
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_exp_apply(te, namespace, st, mesh, hm, dt)
subroutine, public propagation_ops_elec_interpolate_get(hm, mesh, vks_old)
subroutine, public propagation_ops_do_pack(st, hm, ib, ik)
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_elec_move_ions(wo, gr, hm, st, namespace, space, ions_dyn, ions, ext_partners, mc, time, dt, save_pos)
subroutine, public propagation_ops_elec_fuse_density_exp_apply(te, namespace, st, gr, hm, dt, dt2, vmagnus)
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