75 subroutine td_etrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
77 type(v_ks_t),
intent(inout) :: ks
78 type(namespace_t),
intent(in) :: namespace
79 type(electron_space_t),
intent(in) :: space
80 type(hamiltonian_elec_t),
intent(inout) :: hm
81 type(partner_list_t),
intent(in) :: ext_partners
82 type(grid_t),
intent(inout) :: gr
83 type(states_elec_t),
intent(inout) :: st
84 type(propagator_base_t),
intent(inout) :: tr
85 real(real64),
intent(in) :: time
86 real(real64),
intent(in) :: dt
87 type(ion_dynamics_t),
intent(inout) :: ions_dyn
88 type(ions_t),
intent(inout) :: ions
89 type(multicomm_t),
intent(inout) :: mc
91 type(xc_copied_potentials_t) :: vhxc_t1, vhxc_t2
92 type(gauge_field_t),
pointer :: gfield
98 call hm%ks_pot%store_potentials(vhxc_t1)
102 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
103 calc_current = .false., calc_energy = .false., calc_eigenval = .false.)
105 call hm%ks_pot%store_potentials(vhxc_t2)
106 call hm%ks_pot%restore_potentials(vhxc_t1)
107 call hm%update(gr, namespace, space, ext_partners, time = time - dt)
119 ext_partners, mc, time, dt)
122 if(
associated(gfield))
then
127 call hm%ks_pot%restore_potentials(vhxc_t2)
140 subroutine td_etrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
141 ions_dyn, ions, mc, sctol, scsteps)
142 type(v_ks_t),
intent(inout) :: ks
143 type(namespace_t),
intent(in) :: namespace
144 type(electron_space_t),
intent(in) :: space
145 type(hamiltonian_elec_t),
intent(inout) :: hm
146 type(partner_list_t),
intent(in) :: ext_partners
147 type(grid_t),
intent(inout) :: gr
148 type(states_elec_t),
intent(inout) :: st
149 type(propagator_base_t),
intent(inout) :: tr
150 real(real64),
intent(in) :: time
151 real(real64),
intent(in) :: dt
152 type(ion_dynamics_t),
intent(inout) :: ions_dyn
153 type(ions_t),
intent(inout) :: ions
154 type(multicomm_t),
intent(inout) :: mc
155 real(real64),
intent(in) :: sctol
156 integer,
optional,
intent(out) :: scsteps
159 integer :: ik, ib, iter
160 class(wfs_elec_t),
allocatable :: psi2(:, :)
162 integer,
parameter :: niter = 10
163 type(gauge_field_t),
pointer :: gfield
164 type(xc_copied_potentials_t) :: vhxc_t1, vhxc_t2
170 call hm%ks_pot%store_potentials(vhxc_t1)
179 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
180 calc_current = .false., calc_energy = .false., calc_eigenval = .false.)
183 call hm%ks_pot%store_potentials(vhxc_t2)
184 call hm%ks_pot%restore_potentials(vhxc_t1)
192 ext_partners, mc, time, dt)
195 if(
associated(gfield))
then
199 call hm%ks_pot%restore_potentials(vhxc_t2)
203 safe_allocate_type_array(
wfs_elec_t, psi2, (st%group%block_start:st%group%block_end, st%d%kpt%start:st%d%kpt%end))
206 do ik = st%d%kpt%start, st%d%kpt%end
207 do ib = st%group%block_start, st%group%block_end
208 call st%group%psib(ib, ik)%copy_to(psi2(ib, ik), copy_data=.
true.)
214 call hm%ks_pot%store_potentials(vhxc_t2)
218 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
219 time = time, calc_current = .false., calc_energy = .false., calc_eigenval = .false.)
223 diff = hm%ks_pot%check_convergence(vhxc_t2, gr, st%rho, st%qtot)
231 if (abs(diff) <= sctol)
exit
233 if (iter /= niter)
then
235 do ik = st%d%kpt%start, st%d%kpt%end
236 do ib = st%group%block_start, st%group%block_end
237 call psi2(ib, ik)%copy_data_to(gr%np, st%group%psib(ib, ik))
252 if (
present(scsteps)) scsteps = iter
254 do ik = st%d%kpt%start, st%d%kpt%end
255 do ib = st%group%block_start, st%group%block_end
256 call psi2(ib, ik)%end()
260 safe_deallocate_a(psi2)
267 subroutine td_aetrs(namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
271 type(
grid_t),
intent(inout) :: gr
274 real(real64),
intent(in) :: time
275 real(real64),
intent(in) :: dt
277 type(
ions_t),
intent(inout) :: ions
293 ions, ext_partners, mc, time, dt)
297 if(
associated(gfield))
then
312 subroutine td_aetrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
313 ions_dyn, ions, mc, sctol, scsteps)
314 type(
v_ks_t),
intent(inout) :: ks
319 type(
grid_t),
intent(inout) :: gr
322 real(real64),
intent(in) :: time
323 real(real64),
intent(in) :: dt
325 type(
ions_t),
intent(inout) :: ions
327 real(real64),
intent(in) :: sctol
328 integer,
optional,
intent(out) :: scsteps
333 integer,
parameter :: niter = 10
353 ext_partners, mc, time, dt)
356 if (
associated(gfield))
then
366 call hm%ks_pot%store_potentials(vhxc_t2)
370 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
371 time = time, calc_current = .false., calc_energy = .false., calc_eigenval = .false.)
374 diff = hm%ks_pot%check_convergence(vhxc_t2, gr, st%rho, st%qtot)
382 if (diff <= sctol)
exit
384 if (iter /= niter)
then
397 if (
present(scsteps)) scsteps = iter
406 subroutine td_caetrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
408 type(
v_ks_t),
intent(inout) :: ks
413 type(
grid_t),
intent(inout) :: gr
416 real(real64),
intent(in) :: time
417 real(real64),
intent(in) :: dt
419 type(
ions_t),
intent(inout) :: ions
422 integer :: ik, ispin, ip, ib
424 complex(real64),
allocatable :: phase(:)
426 integer(int64) :: pnp
427 integer(int64),
dimension(3) :: gsizes, bsizes
435 call hm%ks_pot%get_interpolated_potentials(tr%vks_old, 2, storage=vold)
437 call hm%ks_pot%restore_potentials(vold)
441 call v_ks_calc_start(ks, namespace, space, hm, st, ions, ions%latt, ext_partners, &
442 time = time - dt, calc_energy = .false.)
447 call v_ks_calc_finish(ks, hm, namespace, space, ions%latt, st, ext_partners)
449 call hm%ks_pot%set_interpolated_potentials(tr%vks_old, 1)
451 call hm%ks_pot%perform_interpolation(tr%vks_old, (/time - dt, time -
m_two*dt, time -
m_three*dt/), time)
454 call hm%ks_pot%mix_potentials(vold, dt)
463 call vold%copy_vhxc_to_buffer(int(gr%np, int64), st%d%nspin, pnp, phase_buff)
471 ions, ext_partners, mc, time, dt)
474 if(
associated(gfield))
then
483 do ik = st%d%kpt%start, st%d%kpt%end
484 ispin = st%d%get_spin_index(ik)
486 do ib = st%group%block_start, st%group%block_end
487 if (hm%apply_packed())
then
488 call st%group%psib(ib, ik)%do_pack()
493 select case (st%group%psib(ib, ik)%status())
495 safe_allocate(phase(1:gr%np))
497 vv = vold%vhxc(ip, ispin)
498 phase(ip) = cmplx(
cos(vv), -
sin(vv), real64)
500 call batch_mul_mf(gr%np, phase, st%group%psib(ib, ik), st%group%psib(ib, ik))
501 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_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