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
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
128 logical,
intent(in) :: have_fields
129 logical,
intent(in) :: family_is_mgga_with_exc
240 select case (tr%method)
253 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)
257 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
258 message(2) =
'library is required if the "runge_kutta4" propagator is selected.'
259 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
269 tr%tdsk_size = st%d%dim * gr%np * (st%st_end - st%st_start + 1) * (st%d%kpt%end - st%d%kpt%start + 1)
273 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
274 message(2) =
'library is required if the "runge_kutta2" propagator is selected.'
275 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
284 tr%tdsk_size = st%d%dim*gr%np
288 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
289 message(2) =
'library is required if the "crank_nicolson_sparskit" propagator is selected.'
290 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
295 if (family_is_mgga_with_exc)
then
296 message(1) =
"Magnus propagator with MGGA"
299 safe_allocate(tr%vmagnus(1:gr%np, 1:st%d%nspin, 1:2))
311 if (have_fields)
then
321 message(1) =
"To move the ions or put in a gauge field, use the one of the following propagators:"
322 message(2) =
"etrs, aetrs, crank-nicolson, rk2, rk4, or exp_mid."
327 select case (tr%method)
356 call parse_variable(namespace,
'TDStepsWithSelfConsistency', 0, tr%scf_propagation_steps)
358 if (tr%scf_propagation_steps == -1) tr%scf_propagation_steps = huge(tr%scf_propagation_steps)
359 if (tr%scf_propagation_steps < 0)
call messages_input_error(namespace,
'TDStepsWithSelfConsistency',
'Cannot be negative')
361 if (tr%scf_propagation_steps /= 0)
then
365 call messages_write(
'TDStepsWithSelfConsistency only works with the ETRS propagator')
384 call parse_variable(namespace,
'TDSCFThreshold', 1.0e-6_real64, tr%scf_threshold)
394 real(real64),
optional,
intent(in) :: threshold
398 tr%scf_propagation_steps = huge(1)
399 if (
present(threshold))
then
400 tr%scf_threshold = threshold
414 tr%scf_propagation_steps = -1
429 select case (tr%method)
431 assert(
allocated(tr%vmagnus))
432 safe_deallocate_a(tr%vmagnus)
447 type(
grid_t),
intent(in) :: gr
462 subroutine propagator_elec_dt(ks, namespace, space, hm, gr, st, tr, time, dt, nt, &
463 ions_dyn, ions, ext_partners, outp, write_handler, scsteps, update_energy, qcchi)
464 type(
v_ks_t),
target,
intent(inout) :: ks
468 type(
grid_t),
target,
intent(inout) :: gr
471 real(real64),
intent(in) :: time
472 real(real64),
intent(in) :: dt
473 integer,
intent(in) :: nt
475 type(
ions_t),
intent(inout) :: ions
479 integer,
optional,
intent(out) :: scsteps
480 logical,
optional,
intent(in) :: update_energy
484 logical :: generate, update_energy_
485 real(real64) :: am(space%dim)
494 if (
present(scsteps)) scsteps = 1
496 select case (tr%method)
499 call td_etrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
500 ions_dyn, ions, tr%scf_threshold, scsteps)
502 call td_etrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
506 call td_aetrs(namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
508 call td_caetrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, ions_dyn, ions)
510 call exponential_midpoint(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
512 call td_crank_nicolson(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, .false.)
514 call td_runge_kutta4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
516 call td_runge_kutta2(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
518 call td_crank_nicolson(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, .
true.)
520 call td_magnus(hm, ext_partners, gr, st, tr, namespace, time, dt)
522 call td_qoct_tddft_propagator(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
524 if (
present(qcchi))
then
525 call td_explicit_runge_kutta4(ks, namespace, space, hm, gr, st, time, dt, ions_dyn, ions, ext_partners, qcchi)
527 call td_explicit_runge_kutta4(ks, namespace, space, hm, gr, st, time, dt, ions_dyn, ions, ext_partners)
530 call td_cfmagnus4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, nt)
542 if(
associated(gfield))
then
548 if (generate .or. ions%has_time_dependent_species())
then
552 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
553 calc_eigenval = update_energy_, time = abs(nt*dt), calc_energy = update_energy_)
556 if (ks%xc_photon /= 0)
then
557 call ks%xc_photons%add_mean_field(ks%gr, space, hm%kpoints, st, abs(nt*dt), dt)
560 if (update_energy_)
call energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit = -1)
564 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, t = abs(nt*dt), dt = dt)
566 call ions%update_kinetic_energy()
568 if (outp%what(option__output__forces) .or. write_handler%out(
out_separate_forces)%write)
then
569 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, t = abs(nt*dt), dt = dt)
573 if (outp%what(option__output__stress))
then
577 if(
associated(gfield))
then
579 if(ks%xc%kernel_lrc_alpha>
m_epsilon)
then
593 if(
associated(lasers))
then
618 type(propagator_base_t),
intent(in) :: tr
620 select case (tr%method)
621 case (prop_etrs, prop_aetrs, prop_caetrs, prop_explicit_runge_kutta4)
633 subroutine propagator_elec_dt_bo(scf, namespace, space, gr, ks, st, hm, ions, ext_partners, mc, outp, iter, dt, ions_dyn, scsteps)
634 type(scf_t),
intent(inout) :: scf
635 type(namespace_t),
intent(in) :: namespace
636 type(electron_space_t),
intent(in) :: space
637 type(grid_t),
intent(inout) :: gr
638 type(v_ks_t),
intent(inout) :: ks
639 type(states_elec_t),
intent(inout) :: st
640 type(hamiltonian_elec_t),
intent(inout) :: hm
641 type(ions_t),
intent(inout) :: ions
642 type(partner_list_t),
intent(in) :: ext_partners
643 type(multicomm_t),
intent(inout) :: mc
644 type(output_t),
intent(inout) :: outp
645 integer,
intent(in) :: iter
646 real(real64),
intent(in) :: dt
647 type(ion_dynamics_t),
intent(inout) :: ions_dyn
648 integer,
intent(inout) :: scsteps
650 type(gauge_field_t),
pointer :: gfield
655 call ion_dynamics_propagate(ions_dyn, ions, iter*dt, dt, namespace)
656 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
658 call scf_run(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, &
659 verbosity = verb_compact, iters_done = scsteps)
661 gfield => list_get_gauge_field(ext_partners)
662 if(
associated(gfield))
then
663 if (gauge_field_is_propagated(gfield))
then
664 call gauge_field_do_algorithmic_operation(gfield, op_verlet_compute_acc, dt, iter*dt)
669 if (hm%lda_u_level /= dft_u_none)
then
670 call messages_not_implemented(
"DFT+U with propagator_elec_dt_bo", namespace=namespace)
673 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
676 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
677 calc_eigenval = .
true., time = iter*dt, calc_energy = .
true.)
680 call energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit = -1)
682 call ion_dynamics_propagate_vel(ions_dyn, ions)
683 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
684 call ions%update_kinetic_energy()
686 if(
associated(gfield))
then
687 if (gauge_field_is_propagated(gfield))
then
688 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.
integer, parameter, public independent_particles
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)
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 output system
subroutine, public potential_interpolation_copy(vkso, vksi)
subroutine, public potential_interpolation_end(potential_interpolation)
subroutine, public potential_interpolation_new(potential_interpolation, np, nspin, time, dt, vhxc, vtau)
subroutine, public potential_interpolation_run_zero_iter(potential_interpolation, np, nspin, vhxc, vtau)
subroutine, public potential_interpolation_init(potential_interpolation, np, nspin, mgga_with_exc, order)
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_run_zero_iter(hm, gr, tr)
subroutine, public propagator_elec_init(gr, namespace, st, tr, 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)
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.