36 use,
intrinsic :: iso_fortran_env
85 type(propagator_base_t),
intent(inout) :: tro
86 type(propagator_base_t),
intent(in) :: tri
90 tro%method = tri%method
92 select case (tro%method)
94 tro%tdsk_size = tri%tdsk_size
98 tro%tdsk_size = tri%tdsk_size
102 tro%tdsk_size = tri%tdsk_size
110 tro%scf_propagation_steps = tri%scf_propagation_steps
112 tro%scf_threshold = tri%scf_threshold
119 subroutine propagator_elec_init(gr, namespace, st, tr, ks_pot, have_fields, family_is_mgga_with_exc, relax_cell)
120 type(grid_t),
intent(in) :: gr
121 type(namespace_t),
intent(in) :: namespace
122 type(states_elec_t),
intent(in) :: st
123 type(propagator_base_t),
intent(inout) :: tr
124 type(ks_potential_t),
intent(in) :: ks_pot
128 logical,
intent(in) :: have_fields
129 logical,
intent(in) :: family_is_mgga_with_exc
130 logical,
intent(in) :: relax_cell
134 if (st%requires_generalized_overlap)
then
301 select case (tr%method)
315 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)
319 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
320 message(2) =
'library is required if the "runge_kutta4" propagator is selected.'
321 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
331 tr%tdsk_size = st%d%dim * gr%np * (st%st_end - st%st_start + 1) * (st%d%kpt%end - st%d%kpt%start + 1)
335 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
336 message(2) =
'library is required if the "runge_kutta2" propagator is selected.'
337 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
346 tr%tdsk_size = st%d%dim*gr%np
350 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
351 message(2) =
'library is required if the "crank_nicolson_sparskit" propagator is selected.'
352 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
357 if (family_is_mgga_with_exc)
then
358 message(1) =
"Magnus propagator with MGGA"
374 if (have_fields)
then
387 message(1) =
"To move the ions or put in a gauge field, use one of the following propagators:"
388 message(2) =
"etrs, aetrs, cfmagnus4, crank-nicolson, rk2, rk4, or exp_mid."
402 message(1) =
"To relax the cell, use the one of the following propagators:"
403 message(2) =
"etrs, aetrs, cfmagnus4, crank-nicolson, or exp_mid."
408 select case (tr%method)
410 call ks_pot%init_interpolation(tr%vks_old, order = 4)
412 call ks_pot%init_interpolation(tr%vks_old)
437 call parse_variable(namespace,
'TDStepsWithSelfConsistency', 0, tr%scf_propagation_steps)
439 if (tr%scf_propagation_steps == -1) tr%scf_propagation_steps = huge(tr%scf_propagation_steps)
440 if (tr%scf_propagation_steps < 0)
call messages_input_error(namespace,
'TDStepsWithSelfConsistency',
'Cannot be negative')
442 if (tr%scf_propagation_steps /= 0)
then
446 call messages_write(
'TDStepsWithSelfConsistency only works with the ETRS/AETRS/CFM4 propagators')
465 call parse_variable(namespace,
'TDSCFThreshold', 1.0e-6_real64, tr%scf_threshold)
475 real(real64),
optional,
intent(in) :: threshold
479 tr%scf_propagation_steps = huge(1)
480 if (
present(threshold))
then
481 tr%scf_threshold = threshold
495 tr%scf_propagation_steps = -1
510 select case (tr%method)
520 if (
allocated(tr%st))
then
522 safe_deallocate_a(tr%st)
534 subroutine propagator_elec_dt(ks, namespace, space, hm, gr, st, tr, time, dt, nt, &
535 ions_dyn, ions, ext_partners, mc, outp, write_handler, scsteps, update_energy, qcchi, dmp)
536 type(
v_ks_t),
target,
intent(inout) :: ks
540 type(
grid_t),
target,
intent(inout) :: gr
543 real(real64),
intent(in) :: time
544 real(real64),
intent(in) :: dt
545 integer,
intent(in) :: nt
547 type(
ions_t),
intent(inout) :: ions
552 integer,
optional,
intent(out) :: scsteps
553 logical,
optional,
intent(in) :: update_energy
555 type(
dmp_t),
optional,
intent(inout) :: dmp
558 logical :: generate, update_energy_
559 real(real64) :: am(space%dim)
566 call hm%ks_pot%interpolation_new(tr%vks_old, time, dt)
568 if (
present(scsteps)) scsteps = 1
570 select case (tr%method)
573 call td_etrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
574 ions_dyn, ions, mc, tr%scf_threshold, scsteps)
576 call td_etrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
581 call td_aetrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
582 ions_dyn, ions, mc, tr%scf_threshold, scsteps)
584 call td_aetrs(namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
587 call td_caetrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, ions_dyn, ions, mc)
589 call exponential_midpoint(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
591 call exponential_midpoint_predictor(hm, ks, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, &
594 call td_crank_nicolson(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc, .false.)
596 call td_runge_kutta4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
598 call td_runge_kutta2(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
600 call td_crank_nicolson(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc, .
true.)
602 call td_magnus(hm, ext_partners, gr, st, tr, namespace, time, dt)
604 call td_qoct_tddft_propagator(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
606 if (
present(qcchi))
then
607 call td_explicit_runge_kutta4(ks, namespace, space, hm, gr, st, time, dt, ions_dyn, ions, ext_partners, qcchi)
609 call td_explicit_runge_kutta4(ks, namespace, space, hm, gr, st, time, dt, ions_dyn, ions, ext_partners)
613 call td_cfmagnus4_sc(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc, &
614 nt, tr%scf_threshold, scsteps)
616 call td_cfmagnus4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc, nt)
619 call td_explicit_magnus3(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
623 if (ions_dyn%is_active())
then
626 ions_dyn, ions, mc, abs(nt*dt), ions_dyn%ionic_scale*dt)
632 if(
associated(gfield))
then
639 if (generate .or. ions%has_time_dependent_species())
then
643 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
644 calc_eigenval = update_energy_, time = abs(nt*dt), calc_energy = update_energy_)
646 if (
present(dmp))
then
647 if (dmp%calculation_mode /= option__tddmpropagation__no_propagation)
then
648 call dm_propagation_run(dmp, namespace, space, gr, ions, st, mc, hm, ks, nt, dt, ext_partners, &
649 update_energy = update_energy_)
654 call ks%v_ks_photons%add_mean_field(ks%gr, space, hm%kpoints, st, abs(nt*dt), dt)
656 if (update_energy_)
call energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit = -1)
661 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, t = abs(nt*dt), dt = dt)
664 if (ions_dyn%cell_relax() .or. outp%what(option__output__stress))
then
666 if(ions_dyn%cell_relax())
then
667 call ions_dyn%update_stress(ions%space, st%stress_tensors%total, ions%latt%rlattice, ions%latt%rcell_volume)
671 if( ions_dyn%is_active())
then
673 call ions%update_kinetic_energy()
676 if(
associated(gfield))
then
688 if(
associated(lasers))
then
713 type(propagator_base_t),
intent(in) :: tr
715 select case (tr%method)
716 case (prop_etrs, prop_aetrs, prop_caetrs, prop_explicit_runge_kutta4)
728 subroutine propagator_elec_dt_bo(scf, namespace, space, gr, ks, st, hm, ions, ext_partners, mc, iter, dt, ions_dyn, scsteps)
729 type(scf_t),
intent(inout) :: scf
730 type(namespace_t),
intent(in) :: namespace
731 type(electron_space_t),
intent(in) :: space
732 type(grid_t),
intent(inout) :: gr
733 type(v_ks_t),
intent(inout) :: ks
734 type(states_elec_t),
intent(inout) :: st
735 type(hamiltonian_elec_t),
intent(inout) :: hm
736 type(ions_t),
intent(inout) :: ions
737 type(partner_list_t),
intent(in) :: ext_partners
738 type(multicomm_t),
intent(inout) :: mc
739 integer,
intent(in) :: iter
740 real(real64),
intent(in) :: dt
741 type(ion_dynamics_t),
intent(inout) :: ions_dyn
742 integer,
intent(inout) :: scsteps
744 type(gauge_field_t),
pointer :: gfield
749 call propagation_ops_elec_propagate_ions_and_cell(gr, hm, st, namespace, space, &
750 ions_dyn, ions, mc, iter*dt, dt)
752 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
754 call scf_run(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, &
755 verbosity = verb_compact, iters_done = scsteps)
758 if (ions_dyn%cell_relax())
then
759 if (.not. scf%calc_stress)
then
760 call stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
762 call ions_dyn%update_stress(ions%space, st%stress_tensors%total, ions%latt%rlattice, ions%latt%rcell_volume)
765 gfield => list_get_gauge_field(ext_partners)
766 if(
associated(gfield))
then
767 if (gauge_field_is_propagated(gfield))
then
768 call gauge_field_do_algorithmic_operation(gfield, op_verlet_compute_acc, dt, iter*dt)
773 if (hm%lda_u_level /= dft_u_none)
then
774 call messages_not_implemented(
"DFT+U with propagator_elec_dt_bo", namespace=namespace)
777 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
780 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
781 calc_eigenval = .
true., time = iter*dt, calc_energy = .
true.)
784 call energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit = -1)
786 call ion_dynamics_propagate_vel(ions_dyn, ions)
787 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
788 call ions%update_kinetic_energy()
790 if(
associated(gfield))
then
791 if (gauge_field_is_propagated(gfield))
then
792 call gauge_field_do_algorithmic_operation(gfield, op_verlet_compute_vel, dt, iter*dt)
subroutine, public dm_propagation_run(dmp, namespace, space, gr, ions, st, mc, hm, ks, iter, dt, ext_partners, update_energy)
Density matrix propagation.
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_get_force(this, gr, spin_channels, current, lrc)
subroutine, public gauge_field_do_algorithmic_operation(this, operation, dt, time)
logical pure function, public gauge_field_is_propagated(this)
integer, parameter, public independent_particles
Theory level.
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.
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, 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_not_implemented(feature, namespace)
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)
/* To use the profiling module, call profiling_in and profiling_out with the label of the region as a...
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)
subroutine, public propagation_ops_elec_update_hamiltonian(namespace, space, st, mesh, hm, ext_partners, 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_explicit_magnus3
integer, parameter, public prop_runge_kutta4
integer, parameter, public prop_explicit_runge_kutta4
integer, parameter, public prop_etrs
integer, parameter, public prop_exponential_midpoint_predictor
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_copy(tro, tri)
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, dmp)
Propagates st from time - dt to t. If dt<0, it propagates backwards from t+|dt| to t.
subroutine, public propagator_elec_dt_bo(scf, namespace, space, gr, ks, st, hm, ions, ext_partners, mc, iter, dt, ions_dyn, scsteps)
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_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, ETRS.
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.
subroutine, public exponential_midpoint_predictor(hm, ks, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
Exponential midpoint with prediction of the half time step This is equivalent to an explicit Magnus i...
subroutine, public exponential_midpoint(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
Exponential midpoint.
subroutine, public td_magnus(hm, ext_partners, gr, st, tr, namespace, time, dt)
Magnus propagator.
subroutine, public td_cfmagnus4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc, iter)
Commutator-free Magnus propagator of order 4. This method has been developed for linear systems and i...
subroutine, public td_explicit_magnus3(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
Third-order explicit Magnus propagator. This implements equation (22) from Casas, F....
subroutine, public td_cfmagnus4_sc(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc, iter, sctol, scsteps)
Commutator-free Magnus propagator of order 4 with self-consistency.
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)
subroutine, public states_elec_end(st)
finalize the states_elec_t object
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.