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
169 mc, st%qtot, ions%latt)
179 type(
ions_t),
intent(inout) :: ions
186 if (ions_dyn%is_active())
then
199 real(real64),
intent(in) :: dt
200 real(real64),
intent(in) :: time
201 logical,
optional,
intent(in) :: save_gf
210 safe_allocate(wo%vecpot(1:gfield%space%dim))
211 safe_allocate(wo%vecpot_vel(1:gfield%space%dim))
227 class(
space_t),
intent(in) :: space
229 class(
mesh_t),
intent(in) :: mesh
239 if (
associated(gfield))
then
242 safe_deallocate_a(wo%vecpot)
243 safe_deallocate_a(wo%vecpot_vel)
244 call hm%update(mesh, namespace, space, ext_partners)
257 class(
mesh_t),
intent(in) :: mesh
259 real(real64),
intent(in) :: dt
267 do ik = st%d%kpt%start, st%d%kpt%end
269 do ib = st%group%block_start, st%group%block_end
273 call hm%phase%set_phase_corr(mesh, st%group%psib(ib, ik), async=.
true.)
275 call te%apply_batch(namespace, mesh, hm, st%group%psib(ib, ik), dt, &
276 inh_psib = hm%inh_st%group%psib(ib, ik))
278 call te%apply_batch(namespace, mesh, hm, st%group%psib(ib, ik), dt)
280 call hm%phase%unset_phase_corr(mesh, st%group%psib(ib, ik))
301 type(
grid_t),
intent(in) :: gr
303 real(real64),
intent(in) :: dt
304 real(real64),
optional,
intent(in) :: dt2
305 real(real64),
optional,
intent(in) :: vmagnus(:,:,:)
317 do ik = st%d%kpt%start, st%d%kpt%end
319 do ib = st%group%block_start, st%group%block_end
323 call hm%phase%set_phase_corr(gr, st%group%psib(ib, ik), async=.
true.)
324 if (
present(dt2))
then
325 call st%group%psib(ib, ik)%copy_to(zpsib_dt)
326 if (st%group%psib(ib, ik)%is_packed())
call zpsib_dt%do_pack(copy = .false.)
330 call te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik), dt, psib2 = zpsib_dt, &
331 deltat2 = dt2, inh_psib = hm%inh_st%group%psib(ib, ik))
333 call te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik), dt, psib2 = zpsib_dt, &
336 call hm%phase%unset_phase_corr(gr, st%group%psib(ib, ik), async=.
true.)
345 call te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik), dt, vmagnus=vmagnus, &
346 inh_psib = hm%inh_st%group%psib(ib, ik))
348 call te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik), dt, vmagnus=vmagnus)
350 call hm%phase%unset_phase_corr(gr, st%group%psib(ib, ik), async=.
true.)
375 integer,
intent(in) :: ib
376 integer,
intent(in) :: ik
379 if (hm%apply_packed())
then
381 call st%group%psib(ib, ik)%do_pack(async=.
true.)
391 integer,
intent(in) :: ib
392 integer,
intent(in) :: ik
395 if (hm%apply_packed())
then
397 call st%group%psib(ib, ik)%do_unpack(async=.
true.)
407 integer,
intent(in) :: ib
408 integer,
intent(in) :: ik
411 if (hm%apply_packed())
then
413 call st%group%psib(ib, ik)%finish_unpack()
422 class(
mesh_t),
intent(in) :: mesh
427 call hm%ks_pot%get_interpolated_potentials(vks_old, 0)
436 class(
mesh_t),
intent(in) :: mesh
439 real(real64),
parameter :: density_threshold = 1.0e-8_real64
442 if (.not. hm%mxll%calc_field_dip)
return
444 select case (hm%mxll%coupling_mode)
446 if (hm%mxll%add_electric_dip)
then
449 if (hm%mxll%add_magnetic_dip)
then
461 real(real64) :: field_dip(3)
462 real(real64),
intent(in) :: field_full(:,:)
464 real(real64),
allocatable :: total_density(:), mask_density(:)
465 real(real64) :: integral_mask
469 select case (hm%mxll%dipole_field)
471 safe_allocate(total_density(1:mesh%np))
472 safe_allocate(mask_density(
size(total_density)))
473 total_density = sum(st%rho(1:mesh%np,:), dim=2)
478 mask_density = merge(
m_one,
m_zero, total_density > density_threshold)
480 do idir = 1, mesh%box%dim
481 field_dip(idir) =
dmf_integrate(mesh, mask_density*field_full(:,idir))/integral_mask
483 safe_deallocate_a(total_density)
484 safe_deallocate_a(mask_density)
487 if (mesh%mpi_grp%rank == hm%mxll%center_of_mass_rankmin)
then
488 field_dip(1:3) = field_full(hm%mxll%center_of_mass_ip,1:3)
490 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 lda_u_update_occ_matrices(this, namespace, mesh, st, hm_base, 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