35 use,
intrinsic :: iso_fortran_env
84 type(propagator_base_t),
intent(inout) :: tro
85 type(propagator_base_t),
intent(in) :: tri
89 tro%method = tri%method
91 select case (tro%method)
93 safe_allocate_source_a(tro%vmagnus, tri%vmagnus)
96 tro%tdsk_size = tri%tdsk_size
100 tro%tdsk_size = tri%tdsk_size
104 tro%tdsk_size = tri%tdsk_size
112 tro%scf_propagation_steps = tri%scf_propagation_steps
114 tro%scf_threshold = tri%scf_threshold
121 subroutine propagator_elec_init(gr, namespace, st, tr, ks_pot, have_fields, family_is_mgga_with_exc, relax_cell)
122 type(grid_t),
intent(in) :: gr
123 type(namespace_t),
intent(in) :: namespace
124 type(states_elec_t),
intent(in) :: st
125 type(propagator_base_t),
intent(inout) :: tr
126 type(ks_potential_t),
intent(in) :: ks_pot
130 logical,
intent(in) :: have_fields
131 logical,
intent(in) :: family_is_mgga_with_exc
132 logical,
intent(in) :: relax_cell
249 select case (tr%method)
262 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)
266 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
267 message(2) =
'library is required if the "runge_kutta4" propagator is selected.'
268 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
278 tr%tdsk_size = st%d%dim * gr%np * (st%st_end - st%st_start + 1) * (st%d%kpt%end - st%d%kpt%start + 1)
282 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
283 message(2) =
'library is required if the "runge_kutta2" propagator is selected.'
284 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
293 tr%tdsk_size = st%d%dim*gr%np
297 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
298 message(2) =
'library is required if the "crank_nicolson_sparskit" propagator is selected.'
299 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
304 if (family_is_mgga_with_exc)
then
305 message(1) =
"Magnus propagator with MGGA"
308 safe_allocate(tr%vmagnus(1:gr%np, 1:st%d%nspin, 1:2))
320 if (have_fields)
then
330 message(1) =
"To move the ions or put in a gauge field, use one of the following propagators:"
331 message(2) =
"etrs, aetrs, crank-nicolson, rk2, rk4, or exp_mid."
342 message(1) =
"To relax the cell, use the one of the following propagators:"
343 message(2) =
"etrs, aetrs, crank-nicolson, or exp_mid."
348 select case (tr%method)
350 call ks_pot%init_interpolation(tr%vks_old, order = 4)
352 call ks_pot%init_interpolation(tr%vks_old)
377 call parse_variable(namespace,
'TDStepsWithSelfConsistency', 0, tr%scf_propagation_steps)
379 if (tr%scf_propagation_steps == -1) tr%scf_propagation_steps = huge(tr%scf_propagation_steps)
380 if (tr%scf_propagation_steps < 0)
call messages_input_error(namespace,
'TDStepsWithSelfConsistency',
'Cannot be negative')
382 if (tr%scf_propagation_steps /= 0)
then
386 call messages_write(
'TDStepsWithSelfConsistency only works with the ETRS propagator')
405 call parse_variable(namespace,
'TDSCFThreshold', 1.0e-6_real64, tr%scf_threshold)
415 real(real64),
optional,
intent(in) :: threshold
419 tr%scf_propagation_steps = huge(1)
420 if (
present(threshold))
then
421 tr%scf_threshold = threshold
435 tr%scf_propagation_steps = -1
450 select case (tr%method)
452 assert(
allocated(tr%vmagnus))
453 safe_deallocate_a(tr%vmagnus)
473 subroutine propagator_elec_dt(ks, namespace, space, hm, gr, st, tr, time, dt, nt, &
474 ions_dyn, ions, ext_partners, mc, outp, write_handler, scsteps, update_energy, qcchi)
475 type(
v_ks_t),
target,
intent(inout) :: ks
479 type(
grid_t),
target,
intent(inout) :: gr
482 real(real64),
intent(in) :: time
483 real(real64),
intent(in) :: dt
484 integer,
intent(in) :: nt
486 type(
ions_t),
intent(inout) :: ions
491 integer,
optional,
intent(out) :: scsteps
492 logical,
optional,
intent(in) :: update_energy
496 logical :: generate, update_energy_
497 real(real64) :: am(space%dim)
504 call hm%ks_pot%interpolation_new(tr%vks_old, time, dt)
506 if (
present(scsteps)) scsteps = 1
508 select case (tr%method)
511 call td_etrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
512 ions_dyn, ions, mc, tr%scf_threshold, scsteps)
514 call td_etrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
518 call td_aetrs(namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
520 call td_caetrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, ions_dyn, ions, mc)
522 call exponential_midpoint(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
524 call td_crank_nicolson(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc, .false.)
526 call td_runge_kutta4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
528 call td_runge_kutta2(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
530 call td_crank_nicolson(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc, .
true.)
532 call td_magnus(hm, ext_partners, gr, st, tr, namespace, time, dt)
534 call td_qoct_tddft_propagator(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
536 if (
present(qcchi))
then
537 call td_explicit_runge_kutta4(ks, namespace, space, hm, gr, st, time, dt, ions_dyn, ions, ext_partners, qcchi)
539 call td_explicit_runge_kutta4(ks, namespace, space, hm, gr, st, time, dt, ions_dyn, ions, ext_partners)
542 call td_cfmagnus4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, nt)
546 if (ions_dyn%is_active())
then
549 ions_dyn, ions, mc, abs(nt*dt), ions_dyn%ionic_scale*dt)
555 if(
associated(gfield))
then
561 if (generate .or. ions%has_time_dependent_species())
then
565 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
566 calc_eigenval = update_energy_, time = abs(nt*dt), calc_energy = update_energy_)
569 if (ks%xc_photon /= 0)
then
570 call ks%xc_photons%add_mean_field(ks%gr, space, hm%kpoints, st, abs(nt*dt), dt)
573 if (update_energy_)
call energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit = -1)
578 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, t = abs(nt*dt), dt = dt)
581 if (ions_dyn%cell_relax() .or. outp%what(option__output__stress))
then
583 if(ions_dyn%cell_relax())
then
584 call ions_dyn%update_stress(ions%space, st%stress_tensors%total, ions%latt%rlattice, ions%latt%rcell_volume)
588 if( ions_dyn%is_active())
then
590 call ions%update_kinetic_energy()
593 if(
associated(gfield))
then
595 if(ks%xc%kernel_lrc_alpha>
m_epsilon)
then
609 if(
associated(lasers))
then
634 type(propagator_base_t),
intent(in) :: tr
636 select case (tr%method)
637 case (prop_etrs, prop_aetrs, prop_caetrs, prop_explicit_runge_kutta4)
649 subroutine propagator_elec_dt_bo(scf, namespace, space, gr, ks, st, hm, ions, ext_partners, mc, outp, iter, dt, ions_dyn, scsteps)
650 type(scf_t),
intent(inout) :: scf
651 type(namespace_t),
intent(in) :: namespace
652 type(electron_space_t),
intent(in) :: space
653 type(grid_t),
intent(inout) :: gr
654 type(v_ks_t),
intent(inout) :: ks
655 type(states_elec_t),
intent(inout) :: st
656 type(hamiltonian_elec_t),
intent(inout) :: hm
657 type(ions_t),
intent(inout) :: ions
658 type(partner_list_t),
intent(in) :: ext_partners
659 type(multicomm_t),
intent(inout) :: mc
660 type(output_t),
intent(inout) :: outp
661 integer,
intent(in) :: iter
662 real(real64),
intent(in) :: dt
663 type(ion_dynamics_t),
intent(inout) :: ions_dyn
664 integer,
intent(inout) :: scsteps
666 type(gauge_field_t),
pointer :: gfield
671 call propagation_ops_elec_propagate_ions_and_cell(gr, hm, st, namespace, space, &
672 ions_dyn, ions, mc, iter*dt, dt)
674 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
676 call scf_run(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, &
677 verbosity = verb_compact, iters_done = scsteps)
680 if (ions_dyn%cell_relax())
then
681 if (.not. scf%calc_stress)
then
682 call stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
684 call ions_dyn%update_stress(ions%space, st%stress_tensors%total, ions%latt%rlattice, ions%latt%rcell_volume)
687 gfield => list_get_gauge_field(ext_partners)
688 if(
associated(gfield))
then
689 if (gauge_field_is_propagated(gfield))
then
690 call gauge_field_do_algorithmic_operation(gfield, op_verlet_compute_acc, dt, iter*dt)
695 if (hm%lda_u_level /= dft_u_none)
then
696 call messages_not_implemented(
"DFT+U with propagator_elec_dt_bo", namespace=namespace)
699 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
702 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
703 calc_eigenval = .
true., time = iter*dt, calc_energy = .
true.)
706 call energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit = -1)
708 call ion_dynamics_propagate_vel(ions_dyn, ions)
709 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
710 call ions%update_kinetic_energy()
712 if(
associated(gfield))
then
713 if (gauge_field_is_propagated(gfield))
then
714 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_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.
subroutine, public propagation_ops_elec_propagate_ions_and_cell(gr, hm, st, namespace, space, ions_dyn, ions, mc, time, dt_ions)
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, mc, 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_set_scf_prop(tr, threshold)
subroutine, public propagator_elec_init(gr, namespace, st, tr, ks_pot, have_fields, family_is_mgga_with_exc, relax_cell)
subroutine, public propagator_elec_remove_scf_prop(tr)
logical pure function, public propagator_elec_ions_are_propagated(tr)
subroutine, public propagator_elec_dt(ks, namespace, space, hm, gr, st, tr, time, dt, nt, ions_dyn, ions, ext_partners, mc, 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_end(tr)
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 exponential_midpoint(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
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, mc)
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.
Stores all communicators and groups.
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.