35 use,
intrinsic :: iso_fortran_env
83 type(propagator_base_t),
intent(inout) :: tro
84 type(propagator_base_t),
intent(in) :: tri
88 tro%method = tri%method
90 select case (tro%method)
92 safe_allocate_source_a(tro%vmagnus, tri%vmagnus)
95 tro%tdsk_size = tri%tdsk_size
99 tro%tdsk_size = tri%tdsk_size
103 tro%tdsk_size = tri%tdsk_size
111 tro%scf_propagation_steps = tri%scf_propagation_steps
113 tro%scf_threshold = tri%scf_threshold
120 subroutine propagator_elec_init(gr, namespace, st, tr, ks_pot, have_fields, family_is_mgga_with_exc)
121 type(grid_t),
intent(in) :: gr
122 type(namespace_t),
intent(in) :: namespace
123 type(states_elec_t),
intent(in) :: st
124 type(propagator_base_t),
intent(inout) :: tr
125 type(ks_potential_t),
intent(in) :: ks_pot
129 logical,
intent(in) :: have_fields
130 logical,
intent(in) :: family_is_mgga_with_exc
247 select case (tr%method)
260 tr%tdsk_size = 2 * st%d%dim * gr%np * (st%st_end - st%st_start + 1) * (st%d%kpt%end - st%d%kpt%start + 1)
264 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
265 message(2) =
'library is required if the "runge_kutta4" propagator is selected.'
266 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
276 tr%tdsk_size = st%d%dim * gr%np * (st%st_end - st%st_start + 1) * (st%d%kpt%end - st%d%kpt%start + 1)
280 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
281 message(2) =
'library is required if the "runge_kutta2" propagator is selected.'
282 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
291 tr%tdsk_size = st%d%dim*gr%np
295 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
296 message(2) =
'library is required if the "crank_nicolson_sparskit" propagator is selected.'
297 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
302 if (family_is_mgga_with_exc)
then
303 message(1) =
"Magnus propagator with MGGA"
306 safe_allocate(tr%vmagnus(1:gr%np, 1:st%d%nspin, 1:2))
318 if (have_fields)
then
328 message(1) =
"To move the ions or put in a gauge field, use the one of the following propagators:"
329 message(2) =
"etrs, aetrs, crank-nicolson, rk2, rk4, or exp_mid."
334 select case (tr%method)
336 call ks_pot%init_interpolation(tr%vks_old, order = 4)
338 call ks_pot%init_interpolation(tr%vks_old)
363 call parse_variable(namespace,
'TDStepsWithSelfConsistency', 0, tr%scf_propagation_steps)
365 if (tr%scf_propagation_steps == -1) tr%scf_propagation_steps = huge(tr%scf_propagation_steps)
366 if (tr%scf_propagation_steps < 0)
call messages_input_error(namespace,
'TDStepsWithSelfConsistency',
'Cannot be negative')
368 if (tr%scf_propagation_steps /= 0)
then
372 call messages_write(
'TDStepsWithSelfConsistency only works with the ETRS propagator')
391 call parse_variable(namespace,
'TDSCFThreshold', 1.0e-6_real64, tr%scf_threshold)
401 real(real64),
optional,
intent(in) :: threshold
405 tr%scf_propagation_steps = huge(1)
406 if (
present(threshold))
then
407 tr%scf_threshold = threshold
421 tr%scf_propagation_steps = -1
436 select case (tr%method)
438 assert(
allocated(tr%vmagnus))
439 safe_deallocate_a(tr%vmagnus)
459 subroutine propagator_elec_dt(ks, namespace, space, hm, gr, st, tr, time, dt, nt, &
460 ions_dyn, ions, ext_partners, outp, write_handler, scsteps, update_energy, qcchi)
461 type(
v_ks_t),
target,
intent(inout) :: ks
465 type(
grid_t),
target,
intent(inout) :: gr
468 real(real64),
intent(in) :: time
469 real(real64),
intent(in) :: dt
470 integer,
intent(in) :: nt
472 type(
ions_t),
intent(inout) :: ions
476 integer,
optional,
intent(out) :: scsteps
477 logical,
optional,
intent(in) :: update_energy
481 logical :: generate, update_energy_
482 real(real64) :: am(space%dim)
489 call hm%ks_pot%interpolation_new(tr%vks_old, time, dt)
491 if (
present(scsteps)) scsteps = 1
493 select case (tr%method)
496 call td_etrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
497 ions_dyn, ions, tr%scf_threshold, scsteps)
499 call td_etrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
503 call td_aetrs(namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
505 call td_caetrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, ions_dyn, ions)
507 call exponential_midpoint(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
509 call td_crank_nicolson(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, .false.)
511 call td_runge_kutta4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
513 call td_runge_kutta2(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
515 call td_crank_nicolson(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, .
true.)
517 call td_magnus(hm, ext_partners, gr, st, tr, namespace, time, dt)
519 call td_qoct_tddft_propagator(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
521 if (
present(qcchi))
then
522 call td_explicit_runge_kutta4(ks, namespace, space, hm, gr, st, time, dt, ions_dyn, ions, ext_partners, qcchi)
524 call td_explicit_runge_kutta4(ks, namespace, space, hm, gr, st, time, dt, ions_dyn, ions, ext_partners)
527 call td_cfmagnus4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, nt)
539 if(
associated(gfield))
then
545 if (generate .or. ions%has_time_dependent_species())
then
549 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
550 calc_eigenval = update_energy_, time = abs(nt*dt), calc_energy = update_energy_)
553 if (ks%xc_photon /= 0)
then
554 call ks%xc_photons%add_mean_field(ks%gr, space, hm%kpoints, st, abs(nt*dt), dt)
557 if (update_energy_)
call energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit = -1)
561 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, t = abs(nt*dt), dt = dt)
563 call ions%update_kinetic_energy()
565 if (outp%what(option__output__forces) .or. write_handler%out(
out_separate_forces)%write)
then
566 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, t = abs(nt*dt), dt = dt)
570 if (outp%what(option__output__stress))
then
574 if(
associated(gfield))
then
576 if(ks%xc%kernel_lrc_alpha>
m_epsilon)
then
590 if(
associated(lasers))
then
615 type(propagator_base_t),
intent(in) :: tr
617 select case (tr%method)
618 case (prop_etrs, prop_aetrs, prop_caetrs, prop_explicit_runge_kutta4)
630 subroutine propagator_elec_dt_bo(scf, namespace, space, gr, ks, st, hm, ions, ext_partners, mc, outp, iter, dt, ions_dyn, scsteps)
631 type(scf_t),
intent(inout) :: scf
632 type(namespace_t),
intent(in) :: namespace
633 type(electron_space_t),
intent(in) :: space
634 type(grid_t),
intent(inout) :: gr
635 type(v_ks_t),
intent(inout) :: ks
636 type(states_elec_t),
intent(inout) :: st
637 type(hamiltonian_elec_t),
intent(inout) :: hm
638 type(ions_t),
intent(inout) :: ions
639 type(partner_list_t),
intent(in) :: ext_partners
640 type(multicomm_t),
intent(inout) :: mc
641 type(output_t),
intent(inout) :: outp
642 integer,
intent(in) :: iter
643 real(real64),
intent(in) :: dt
644 type(ion_dynamics_t),
intent(inout) :: ions_dyn
645 integer,
intent(inout) :: scsteps
647 type(gauge_field_t),
pointer :: gfield
652 call ion_dynamics_propagate(ions_dyn, ions, iter*dt, dt, namespace)
653 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
655 call scf_run(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, &
656 verbosity = verb_compact, iters_done = scsteps)
658 gfield => list_get_gauge_field(ext_partners)
659 if(
associated(gfield))
then
660 if (gauge_field_is_propagated(gfield))
then
661 call gauge_field_do_algorithmic_operation(gfield, op_verlet_compute_acc, dt, iter*dt)
666 if (hm%lda_u_level /= dft_u_none)
then
667 call messages_not_implemented(
"DFT+U with propagator_elec_dt_bo", namespace=namespace)
670 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
673 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
674 calc_eigenval = .
true., time = iter*dt, calc_energy = .
true.)
677 call energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit = -1)
679 call ion_dynamics_propagate_vel(ions_dyn, ions)
680 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
681 call ions%update_kinetic_energy()
683 if(
associated(gfield))
then
684 if (gauge_field_is_propagated(gfield))
then
685 call gauge_field_do_algorithmic_operation(gfield, op_verlet_compute_vel, dt, iter*dt)
subroutine, public energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit, full)
This subroutine calculates the total energy of the system. Basically, it adds up the KS eigenvalues,...
subroutine, public exponential_copy(teo, tei)
subroutine, public exponential_init(te, namespace, full_batch)
type(gauge_field_t) function, pointer, public list_get_gauge_field(partners)
type(lasers_t) function, pointer, public list_get_lasers(partners)
subroutine, public forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old, t, dt)
subroutine, public gauge_field_do_algorithmic_operation(this, operation, dt, time)
subroutine, public gauge_field_get_force(this, gr, spin_channels, current, lrc_alpha)
logical pure function, public gauge_field_is_propagated(this)
real(real64), parameter, public m_epsilon
This module implements the underlying real-space grid.
subroutine, public hamiltonian_elec_epot_generate(this, namespace, space, gr, ions, ext_partners, st, time)
This module defines classes and functions for interaction partners.
subroutine, public ion_dynamics_propagate(this, ions, time, dt, namespace)
logical pure function, public ion_dynamics_ions_move(this)
subroutine, public ion_dynamics_propagate_vel(this, ions, atoms_moved)
A module to handle KS potential, without the external potential.
integer, parameter, public independent_particles
subroutine, public lasers_nondipole_laser_field_step(this, field, time)
Retrieves the NDSFA vector_potential correction. The nondipole field is obtained for consecutive time...
subroutine, public lasers_set_nondipole_parameters(this, ndfield, nd_integration_time)
Set parameters for nondipole SFA calculation.
logical function, public lasers_with_nondipole_field(lasers)
Check if a nondipole SFA correction should be computed for the given laser.
subroutine, public lda_u_update_occ_matrices(this, namespace, mesh, st, hm_base, phase, energy)
This module defines various routines, operating on mesh functions.
integer, public sp_distdot_mode
subroutine, public mesh_init_mesh_aux(mesh)
Initialise a pointer to the grid/mesh, that is globally exposed, such that low level mesh operations ...
subroutine, public messages_obsolete_variable(namespace, name, rep)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public messages_input_error(namespace, var, details, row, column)
subroutine, public messages_experimental(name, namespace)
This module handles the communicators for the various parallelization strategies.
This module holds the "opt_control_state_t" datatype, which contains a quantum-classical state.
this module contains the low-level part of the output system
subroutine, public potential_interpolation_copy(vkso, vksi)
subroutine, public potential_interpolation_end(potential_interpolation)
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.
integer, parameter, public prop_aetrs
integer, parameter, public prop_crank_nicolson_sparskit
integer, parameter, public prop_crank_nicolson
integer, parameter, public prop_runge_kutta2
integer, parameter, public prop_magnus
integer, parameter, public prop_cfmagnus4
integer, parameter, public prop_caetrs
integer, parameter, public prop_qoct_tddft_propagator
integer, parameter, public prop_exponential_midpoint
integer, parameter, public prop_runge_kutta4
integer, parameter, public prop_explicit_runge_kutta4
integer, parameter, public prop_etrs
subroutine, public td_crank_nicolson(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, use_sparskit)
Crank-Nicolson propagator.
subroutine, public propagator_elec_dt_bo(scf, namespace, space, gr, ks, st, hm, ions, ext_partners, mc, outp, iter, dt, ions_dyn, scsteps)
subroutine, public propagator_elec_copy(tro, tri)
subroutine, public propagator_elec_init(gr, namespace, st, tr, ks_pot, have_fields, family_is_mgga_with_exc)
subroutine, public propagator_elec_set_scf_prop(tr, threshold)
subroutine, public propagator_elec_dt(ks, namespace, space, hm, gr, st, tr, time, dt, nt, ions_dyn, ions, ext_partners, outp, write_handler, scsteps, update_energy, qcchi)
Propagates st from time - dt to t. If dt<0, it propagates backwards from t+|dt| to t.
subroutine, public propagator_elec_remove_scf_prop(tr)
logical pure function, public propagator_elec_ions_are_propagated(tr)
subroutine, public propagator_elec_end(tr)
subroutine, public td_caetrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, ions_dyn, ions)
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, 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)
Propagator with enforced time-reversal symmetry.
subroutine, public td_aetrs(namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
Propagator with approximate enforced time-reversal symmetry.
subroutine, public exponential_midpoint(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
Exponential midpoint.
subroutine, public td_cfmagnus4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, iter)
Commutator-free Magnus propagator of order 4.
subroutine, public td_magnus(hm, ext_partners, gr, st, tr, namespace, time, dt)
Magnus propagator.
subroutine, public td_qoct_tddft_propagator(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
Propagator specifically designed for the QOCT+TDDFT problem.
subroutine, public td_runge_kutta2(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
subroutine, public td_runge_kutta4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
subroutine, public td_explicit_runge_kutta4(ks, namespace, space, hm, gr, st, time, dt, ions_dyn, ions, ext_partners, qcchi)
subroutine, public propagator_rk_end()
type(algorithmic_operation_t), parameter, public op_verlet_compute_acc
type(algorithmic_operation_t), parameter, public op_verlet_compute_vel
subroutine, public sparskit_solver_init(namespace, n, sk, is_complex)
subroutine, public sparskit_solver_end(sk)
subroutine, public sparskit_solver_copy(sko, ski)
This module implements the calculation of the stress tensor.
subroutine, public stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
This computes the total stress on the lattice.
integer, parameter, public out_separate_forces
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 self_consistent_step()
Extension of space that contains the knowledge of the spin dimension.
Description of the grid, containing information on derivatives, stencil, and symmetries.
This is the datatype that contains the objects that are propagated: in principle this could be both t...
The states_elec_t class contains all electronic wave functions.
Time-dependent Write Properties.