74 subroutine td_etrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
76 type(v_ks_t),
intent(inout) :: ks
77 type(namespace_t),
intent(in) :: namespace
78 type(electron_space_t),
intent(in) :: space
79 type(hamiltonian_elec_t),
intent(inout) :: hm
80 type(partner_list_t),
intent(in) :: ext_partners
81 type(grid_t),
intent(inout) :: gr
82 type(states_elec_t),
intent(inout) :: st
83 type(propagator_base_t),
intent(inout) :: tr
84 real(real64),
intent(in) :: time
85 real(real64),
intent(in) :: dt
86 type(ion_dynamics_t),
intent(inout) :: ions_dyn
87 type(ions_t),
intent(inout) :: ions
88 type(multicomm_t),
intent(inout) :: mc
90 type(xc_copied_potentials_t) :: vhxc_t1, vhxc_t2
91 type(gauge_field_t),
pointer :: gfield
97 call hm%ks_pot%store_potentials(vhxc_t1)
101 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
102 calc_current = .false., calc_energy = .false., calc_eigenval = .false.)
104 call hm%ks_pot%store_potentials(vhxc_t2)
105 call hm%ks_pot%restore_potentials(vhxc_t1)
106 call hm%update(gr, namespace, space, ext_partners, time = time - dt)
118 ext_partners, mc, time, dt)
121 if(
associated(gfield))
then
126 call hm%ks_pot%restore_potentials(vhxc_t2)
139 subroutine td_etrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
140 ions_dyn, ions, mc, sctol, scsteps)
141 type(v_ks_t),
intent(inout) :: ks
142 type(namespace_t),
intent(in) :: namespace
143 type(electron_space_t),
intent(in) :: space
144 type(hamiltonian_elec_t),
intent(inout) :: hm
145 type(partner_list_t),
intent(in) :: ext_partners
146 type(grid_t),
intent(inout) :: gr
147 type(states_elec_t),
intent(inout) :: st
148 type(propagator_base_t),
intent(inout) :: tr
149 real(real64),
intent(in) :: time
150 real(real64),
intent(in) :: dt
151 type(ion_dynamics_t),
intent(inout) :: ions_dyn
152 type(ions_t),
intent(inout) :: ions
153 type(multicomm_t),
intent(inout) :: mc
154 real(real64),
intent(in) :: sctol
155 integer,
optional,
intent(out) :: scsteps
158 integer :: ik, ib, iter
159 class(wfs_elec_t),
allocatable :: psi2(:, :)
161 integer,
parameter :: niter = 10
162 type(gauge_field_t),
pointer :: gfield
163 type(xc_copied_potentials_t) :: vhxc_t1, vhxc_t2
169 call hm%ks_pot%store_potentials(vhxc_t1)
178 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
179 calc_current = .false., calc_energy = .false., calc_eigenval = .false.)
182 call hm%ks_pot%store_potentials(vhxc_t2)
183 call hm%ks_pot%restore_potentials(vhxc_t1)
191 ext_partners, mc, time, dt)
194 if(
associated(gfield))
then
198 call hm%ks_pot%restore_potentials(vhxc_t2)
202 safe_allocate_type_array(
wfs_elec_t, psi2, (st%group%block_start:st%group%block_end, st%d%kpt%start:st%d%kpt%end))
205 do ik = st%d%kpt%start, st%d%kpt%end
206 do ib = st%group%block_start, st%group%block_end
207 call st%group%psib(ib, ik)%copy_to(psi2(ib, ik), copy_data=.
true.)
213 call hm%ks_pot%store_potentials(vhxc_t2)
217 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
218 time = time, calc_current = .false., calc_energy = .false., calc_eigenval = .false.)
222 diff = hm%ks_pot%check_convergence(vhxc_t2, gr, st%rho, st%qtot)
230 if (abs(diff) <= sctol)
exit
232 if (iter /= niter)
then
234 do ik = st%d%kpt%start, st%d%kpt%end
235 do ib = st%group%block_start, st%group%block_end
236 call psi2(ib, ik)%copy_data_to(gr%np, st%group%psib(ib, ik))
251 if (
present(scsteps)) scsteps = iter
253 do ik = st%d%kpt%start, st%d%kpt%end
254 do ib = st%group%block_start, st%group%block_end
255 call psi2(ib, ik)%end()
259 safe_deallocate_a(psi2)
266 subroutine td_aetrs(namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
270 type(
grid_t),
intent(inout) :: gr
273 real(real64),
intent(in) :: time
274 real(real64),
intent(in) :: dt
276 type(
ions_t),
intent(inout) :: ions
292 ions, ext_partners, mc, time, dt)
296 if(
associated(gfield))
then
311 subroutine td_aetrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
312 ions_dyn, ions, mc, sctol, scsteps)
313 type(
v_ks_t),
intent(inout) :: ks
318 type(
grid_t),
intent(inout) :: gr
321 real(real64),
intent(in) :: time
322 real(real64),
intent(in) :: dt
324 type(
ions_t),
intent(inout) :: ions
326 real(real64),
intent(in) :: sctol
327 integer,
optional,
intent(out) :: scsteps
332 integer,
parameter :: niter = 10
352 ext_partners, mc, time, dt)
355 if (
associated(gfield))
then
365 call hm%ks_pot%store_potentials(vhxc_t2)
369 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
370 time = time, calc_current = .false., calc_energy = .false., calc_eigenval = .false.)
373 diff = hm%ks_pot%check_convergence(vhxc_t2, gr, st%rho, st%qtot)
381 if (diff <= sctol)
exit
383 if (iter /= niter)
then
396 if (
present(scsteps)) scsteps = iter
405 subroutine td_caetrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
407 type(
v_ks_t),
intent(inout) :: ks
412 type(
grid_t),
intent(inout) :: gr
415 real(real64),
intent(in) :: time
416 real(real64),
intent(in) :: dt
418 type(
ions_t),
intent(inout) :: ions
421 integer :: ik, ispin, ip, ib
423 complex(real64),
allocatable :: phase(:)
425 integer(int64) :: pnp
426 integer(int64),
dimension(3) :: gsizes, bsizes
434 call hm%ks_pot%get_interpolated_potentials(tr%vks_old, 2, storage=vold)
436 call hm%ks_pot%restore_potentials(vold)
440 call v_ks_calc_start(ks, namespace, space, hm, st, ions, ions%latt, ext_partners, &
441 time = time - dt, calc_energy = .false.)
446 call v_ks_calc_finish(ks, hm, namespace, space, ions%latt, st, ext_partners)
448 call hm%ks_pot%set_interpolated_potentials(tr%vks_old, 1)
450 call hm%ks_pot%perform_interpolation(tr%vks_old, (/time - dt, time -
m_two*dt, time -
m_three*dt/), time)
453 call hm%ks_pot%mix_potentials(vold, dt)
462 call vold%copy_vhxc_to_buffer(int(gr%np, int64), st%d%nspin, pnp, phase_buff)
470 ions, ext_partners, mc, time, dt)
473 if(
associated(gfield))
then
482 do ik = st%d%kpt%start, st%d%kpt%end
483 ispin = st%d%get_spin_index(ik)
485 do ib = st%group%block_start, st%group%block_end
486 if (hm%apply_packed())
then
487 call st%group%psib(ib, ik)%do_pack()
492 select case (st%group%psib(ib, ik)%status())
494 safe_allocate(phase(1:gr%np))
496 vv = vold%vhxc(ip, ispin)
497 phase(ip) = cmplx(
cos(vv), -
sin(vv), real64)
499 call batch_mul_mf(gr%np, phase, st%group%psib(ib, ik), st%group%psib(ib, ik))
500 safe_deallocate_a(phase)
516 call hm%phase%set_phase_corr(gr, st%group%psib(ib, ik))
518 call tr%te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik),
m_half*dt, &
519 inh_psib = hm%inh_st%group%psib(ib, ik))
521 call tr%te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik),
m_half*dt)
523 call hm%phase%unset_phase_corr(gr, st%group%psib(ib, ik))
527 if (hm%apply_packed())
then
528 call st%group%psib(ib, ik)%do_unpack()
batchified multiplication by mesh function with optional conjugation:
double sin(double __x) __attribute__((__nothrow__
double cos(double __x) __attribute__((__nothrow__
subroutine, public accel_free_buffer(this, async)
type(accel_kernel_t), target, save, public kernel_phase
pure logical function, public accel_is_enabled()
integer, parameter, public accel_mem_read_only
This module implements batches of mesh functions.
integer, parameter, public batch_not_packed
functions are stored in CPU memory, unpacked order
integer, parameter, public batch_device_packed
functions are stored in device memory in packed order
integer, parameter, public batch_packed
functions are stored in CPU memory, in transposed (packed) order
This module implements common operations on 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)
real(real64), parameter, public m_two
integer, parameter, public independent_particles
Theory level.
real(real64), parameter, public m_half
real(real64), parameter, public m_three
This module implements the underlying real-space grid.
pure logical function, public hamiltonian_elec_inh_term(hm)
This module defines classes and functions for interaction partners.
A module to handle KS potential, without the external potential.
subroutine, public lda_u_write_u(this, iunit, namespace)
subroutine, public lda_u_write_v(this, iunit, namespace)
integer, parameter, public dft_u_none
subroutine, public lda_u_update_occ_matrices(this, namespace, mesh, st, phase, energy)
This module is intended to contain "only mathematical" functions and procedures.
This module defines various routines, operating on mesh functions.
subroutine, public messages_not_implemented(feature, namespace)
subroutine, public messages_new_line()
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This module handles the communicators for the various parallelization strategies.
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_propagate_gauge_field(wo, gfield, dt, time, save_gf)
subroutine, public propagation_ops_elec_update_hamiltonian(namespace, space, st, mesh, hm, ext_partners, time)
subroutine, public propagation_ops_elec_interpolate_get(hm, vks_old)
subroutine, public propagation_ops_elec_fuse_density_exp_apply(te, namespace, st, gr, hm, dt, dt2, op)
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)
subroutine, public td_aetrs(namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
Propagator with approximate enforced time-reversal symmetry.
subroutine, public td_etrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, ions_dyn, ions, mc, sctol, scsteps)
Propagator with enforced time-reversal symmetry and self-consistency.
subroutine, public td_etrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, ions_dyn, ions, mc)
Propagator with enforced time-reversal symmetry.
subroutine, public td_caetrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, ions_dyn, ions, mc)
Propagator with approximate enforced time-reversal symmetry.
subroutine, public td_aetrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, ions_dyn, ions, mc, sctol, scsteps)
Propagator with approximate enforced time-reversal symmetry and self-consistency.
This module handles spin dimensions of the states and the k-point distribution.
This module handles groups of electronic batches and their parallel distribution.
subroutine, public states_elec_group_copy(d, group_in, group_out, copy_data, special)
make a copy of a group
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
type(type_t), parameter, public type_float
subroutine, public v_ks_calc_finish(ks, hm, namespace, space, latt, st, ext_partners, force_semilocal)
subroutine, public v_ks_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, calc_energy, force_semilocal)
This routine starts the calculation of the Kohn-Sham potential. The routine v_ks_calc_finish must be ...
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
logical pure function, public family_is_mgga_with_exc(xcs)
Is the xc function part of the mGGA family with an energy functional.
Extension of space that contains the knowledge of the spin dimension.
Description of the grid, containing information on derivatives, stencil, and symmetries.
Stores all communicators and groups.
The states_elec_t class contains all electronic wave functions.
batches of electronic states