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
125 call hm%ks_pot%restore_potentials(vhxc_t2)
137 subroutine td_etrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
138 ions_dyn, ions, mc, sctol, scsteps)
139 type(v_ks_t),
intent(inout) :: ks
140 type(namespace_t),
intent(in) :: namespace
141 type(electron_space_t),
intent(in) :: space
142 type(hamiltonian_elec_t),
intent(inout) :: hm
143 type(partner_list_t),
intent(in) :: ext_partners
144 type(grid_t),
intent(inout) :: gr
145 type(states_elec_t),
intent(inout) :: st
146 type(propagator_base_t),
intent(inout) :: tr
147 real(real64),
intent(in) :: time
148 real(real64),
intent(in) :: dt
149 type(ion_dynamics_t),
intent(inout) :: ions_dyn
150 type(ions_t),
intent(inout) :: ions
151 type(multicomm_t),
intent(inout) :: mc
152 real(real64),
intent(in) :: sctol
153 integer,
optional,
intent(out) :: scsteps
156 integer :: ik, ib, iter
157 class(wfs_elec_t),
allocatable :: psi2(:, :)
159 integer,
parameter :: niter = 10
160 type(gauge_field_t),
pointer :: gfield
161 type(xc_copied_potentials_t) :: vhxc_t1, vhxc_t2
167 call hm%ks_pot%store_potentials(vhxc_t1)
176 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
177 calc_current = .false., calc_energy = .false., calc_eigenval = .false.)
180 call hm%ks_pot%store_potentials(vhxc_t2)
181 call hm%ks_pot%restore_potentials(vhxc_t1)
189 ext_partners, mc, time, dt)
192 if(
associated(gfield))
then
196 call hm%ks_pot%restore_potentials(vhxc_t2)
200 safe_allocate_type_array(
wfs_elec_t, psi2, (st%group%block_start:st%group%block_end, st%d%kpt%start:st%d%kpt%end))
203 do ik = st%d%kpt%start, st%d%kpt%end
204 do ib = st%group%block_start, st%group%block_end
205 call st%group%psib(ib, ik)%copy_to(psi2(ib, ik), copy_data=.
true.)
211 call hm%ks_pot%store_potentials(vhxc_t2)
215 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
216 time = time, calc_current = .false., calc_energy = .false., calc_eigenval = .false.)
220 diff = hm%ks_pot%check_convergence(vhxc_t2, gr, st%rho, st%qtot)
228 if (diff <= sctol)
exit
230 if (iter /= niter)
then
232 do ik = st%d%kpt%start, st%d%kpt%end
233 do ib = st%group%block_start, st%group%block_end
234 call psi2(ib, ik)%copy_data_to(gr%np, st%group%psib(ib, ik))
249 if (
present(scsteps)) scsteps = iter
251 do ik = st%d%kpt%start, st%d%kpt%end
252 do ib = st%group%block_start, st%group%block_end
253 call psi2(ib, ik)%end()
257 safe_deallocate_a(psi2)
264 subroutine td_aetrs(namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
268 type(
grid_t),
intent(inout) :: gr
271 real(real64),
intent(in) :: time
272 real(real64),
intent(in) :: dt
274 type(
ions_t),
intent(inout) :: ions
290 ions, ext_partners, mc, time, dt)
294 if(
associated(gfield))
then
309 subroutine td_aetrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
310 ions_dyn, ions, mc, sctol, scsteps)
311 type(
v_ks_t),
intent(inout) :: ks
316 type(
grid_t),
intent(inout) :: gr
319 real(real64),
intent(in) :: time
320 real(real64),
intent(in) :: dt
322 type(
ions_t),
intent(inout) :: ions
324 real(real64),
intent(in) :: sctol
325 integer,
optional,
intent(out) :: scsteps
330 integer,
parameter :: niter = 10
350 ext_partners, mc, time, dt)
353 if (
associated(gfield))
then
363 call hm%ks_pot%store_potentials(vhxc_t2)
367 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
368 time = time, calc_current = .false., calc_energy = .false., calc_eigenval = .false.)
371 diff = hm%ks_pot%check_convergence(vhxc_t2, gr, st%rho, st%qtot)
379 if (diff <= sctol)
exit
381 if (iter /= niter)
then
394 if (
present(scsteps)) scsteps = iter
403 subroutine td_caetrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
405 type(
v_ks_t),
intent(inout) :: ks
410 type(
grid_t),
intent(inout) :: gr
413 real(real64),
intent(in) :: time
414 real(real64),
intent(in) :: dt
416 type(
ions_t),
intent(inout) :: ions
419 integer :: ik, ispin, ip, ist, ib
421 complex(real64) :: phase
423 integer(int64) :: pnp
424 integer(int64),
dimension(3) :: gsizes, bsizes
432 call hm%ks_pot%get_interpolated_potentials(tr%vks_old, 2, storage=vold)
434 call hm%ks_pot%restore_potentials(vold)
438 call v_ks_calc_start(ks, namespace, space, hm, st, ions, ions%latt, ext_partners, &
439 time = time - dt, calc_energy = .false.)
444 call v_ks_calc_finish(ks, hm, namespace, space, ions%latt, st, ext_partners)
446 call hm%ks_pot%set_interpolated_potentials(tr%vks_old, 1)
448 call hm%ks_pot%perform_interpolation(tr%vks_old, (/time - dt, time -
m_two*dt, time -
m_three*dt/), time)
451 call hm%ks_pot%mix_potentials(vold, dt)
460 call vold%copy_vhxc_to_buffer(int(gr%np, int64), st%d%nspin, pnp, phase_buff)
468 ions, ext_partners, mc, time, dt)
471 if(
associated(gfield))
then
480 do ik = st%d%kpt%start, st%d%kpt%end
481 ispin = st%d%get_spin_index(ik)
483 do ib = st%group%block_start, st%group%block_end
484 if (hm%apply_packed())
then
485 call st%group%psib(ib, ik)%do_pack()
490 select case (st%group%psib(ib, ik)%status())
493 vv = vold%vhxc(ip, ispin)
494 phase = cmplx(
cos(vv), -
sin(vv), real64)
495 do ist = 1, st%group%psib(ib, ik)%nst_linear
496 st%group%psib(ib, ik)%zff_linear(ip, ist) = st%group%psib(ib, ik)%zff_linear(ip, ist)*phase
501 vv = vold%vhxc(ip, ispin)
502 phase = cmplx(
cos(vv), -
sin(vv), real64)
503 do ist = 1, st%group%psib(ib, ik)%nst_linear
504 st%group%psib(ib, ik)%zff_pack(ist, ip) = st%group%psib(ib, ik)%zff_pack(ist, ip)*phase
521 call hm%phase%set_phase_corr(gr, st%group%psib(ib, ik))
523 call tr%te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik),
m_half*dt, &
524 inh_psib = hm%inh_st%group%psib(ib, ik))
526 call tr%te%apply_batch(namespace, gr, hm, st%group%psib(ib, ik),
m_half*dt)
528 call hm%phase%unset_phase_corr(gr, st%group%psib(ib, ik))
532 if (hm%apply_packed())
then
533 call st%group%psib(ib, ik)%do_unpack()
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 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)
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), 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