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 tro%tdsk_size = tri%tdsk_size
97 tro%tdsk_size = tri%tdsk_size
101 tro%tdsk_size = tri%tdsk_size
109 tro%scf_propagation_steps = tri%scf_propagation_steps
111 tro%scf_threshold = tri%scf_threshold
118 subroutine propagator_elec_init(gr, namespace, st, tr, ks_pot, have_fields, family_is_mgga_with_exc, relax_cell)
119 type(grid_t),
intent(in) :: gr
120 type(namespace_t),
intent(in) :: namespace
121 type(states_elec_t),
intent(in) :: st
122 type(propagator_base_t),
intent(inout) :: tr
123 type(ks_potential_t),
intent(in) :: ks_pot
127 logical,
intent(in) :: have_fields
128 logical,
intent(in) :: family_is_mgga_with_exc
129 logical,
intent(in) :: relax_cell
261 select case (tr%method)
275 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)
279 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
280 message(2) =
'library is required if the "runge_kutta4" propagator is selected.'
281 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
291 tr%tdsk_size = st%d%dim * gr%np * (st%st_end - st%st_start + 1) * (st%d%kpt%end - st%d%kpt%start + 1)
295 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
296 message(2) =
'library is required if the "runge_kutta2" propagator is selected.'
297 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
306 tr%tdsk_size = st%d%dim*gr%np
310 message(1) =
'Octopus was not compiled with support for the SPARSKIT library. This'
311 message(2) =
'library is required if the "crank_nicolson_sparskit" propagator is selected.'
312 message(3) =
'Try using a different propagation scheme or recompile with SPARSKIT support.'
317 if (family_is_mgga_with_exc)
then
318 message(1) =
"Magnus propagator with MGGA"
332 if (have_fields)
then
343 message(1) =
"To move the ions or put in a gauge field, use one of the following propagators:"
344 message(2) =
"etrs, aetrs, crank-nicolson, rk2, rk4, or exp_mid."
356 message(1) =
"To relax the cell, use the one of the following propagators:"
357 message(2) =
"etrs, aetrs, crank-nicolson, or exp_mid."
362 select case (tr%method)
364 call ks_pot%init_interpolation(tr%vks_old, order = 4)
366 call ks_pot%init_interpolation(tr%vks_old)
391 call parse_variable(namespace,
'TDStepsWithSelfConsistency', 0, tr%scf_propagation_steps)
393 if (tr%scf_propagation_steps == -1) tr%scf_propagation_steps = huge(tr%scf_propagation_steps)
394 if (tr%scf_propagation_steps < 0)
call messages_input_error(namespace,
'TDStepsWithSelfConsistency',
'Cannot be negative')
396 if (tr%scf_propagation_steps /= 0)
then
400 call messages_write(
'TDStepsWithSelfConsistency only works with the ETRS propagator')
419 call parse_variable(namespace,
'TDSCFThreshold', 1.0e-6_real64, tr%scf_threshold)
429 real(real64),
optional,
intent(in) :: threshold
433 tr%scf_propagation_steps = huge(1)
434 if (
present(threshold))
then
435 tr%scf_threshold = threshold
449 tr%scf_propagation_steps = -1
464 select case (tr%method)
483 subroutine propagator_elec_dt(ks, namespace, space, hm, gr, st, tr, time, dt, nt, &
484 ions_dyn, ions, ext_partners, mc, outp, write_handler, scsteps, update_energy, qcchi)
485 type(
v_ks_t),
target,
intent(inout) :: ks
489 type(
grid_t),
target,
intent(inout) :: gr
492 real(real64),
intent(in) :: time
493 real(real64),
intent(in) :: dt
494 integer,
intent(in) :: nt
496 type(
ions_t),
intent(inout) :: ions
501 integer,
optional,
intent(out) :: scsteps
502 logical,
optional,
intent(in) :: update_energy
506 logical :: generate, update_energy_
507 real(real64) :: am(space%dim)
514 call hm%ks_pot%interpolation_new(tr%vks_old, time, dt)
516 if (
present(scsteps)) scsteps = 1
518 select case (tr%method)
521 call td_etrs_sc(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
522 ions_dyn, ions, mc, tr%scf_threshold, scsteps)
524 call td_etrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, &
528 call td_aetrs(namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
530 call td_caetrs(ks, namespace, space, hm, ext_partners, gr, st, tr, time, dt, ions_dyn, ions, mc)
532 call exponential_midpoint(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
534 call exponential_midpoint_predictor(hm, ks, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, &
537 call td_crank_nicolson(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc, .false.)
539 call td_runge_kutta4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
541 call td_runge_kutta2(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners)
543 call td_crank_nicolson(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc, .
true.)
545 call td_magnus(hm, ext_partners, gr, st, tr, namespace, time, dt)
547 call td_qoct_tddft_propagator(hm, namespace, space, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, mc)
549 if (
present(qcchi))
then
550 call td_explicit_runge_kutta4(ks, namespace, space, hm, gr, st, time, dt, ions_dyn, ions, ext_partners, qcchi)
552 call td_explicit_runge_kutta4(ks, namespace, space, hm, gr, st, time, dt, ions_dyn, ions, ext_partners)
555 call td_cfmagnus4(ks, namespace, space, hm, gr, st, tr, time, dt, ions_dyn, ions, ext_partners, nt)
559 if (ions_dyn%is_active())
then
562 ions_dyn, ions, mc, abs(nt*dt), ions_dyn%ionic_scale*dt)
568 if(
associated(gfield))
then
575 if (generate .or. ions%has_time_dependent_species())
then
579 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
580 calc_eigenval = update_energy_, time = abs(nt*dt), calc_energy = update_energy_)
583 if (ks%xc_photon /= 0)
then
584 call ks%xc_photons%add_mean_field(ks%gr, space, hm%kpoints, st, abs(nt*dt), dt)
587 if (update_energy_)
call energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit = -1)
592 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, t = abs(nt*dt), dt = dt)
595 if (ions_dyn%cell_relax() .or. outp%what(option__output__stress))
then
597 if(ions_dyn%cell_relax())
then
598 call ions_dyn%update_stress(ions%space, st%stress_tensors%total, ions%latt%rlattice, ions%latt%rcell_volume)
602 if( ions_dyn%is_active())
then
604 call ions%update_kinetic_energy()
607 if(
associated(gfield))
then
619 if(
associated(lasers))
then
644 type(propagator_base_t),
intent(in) :: tr
646 select case (tr%method)
647 case (prop_etrs, prop_aetrs, prop_caetrs, prop_explicit_runge_kutta4)
659 subroutine propagator_elec_dt_bo(scf, namespace, space, gr, ks, st, hm, ions, ext_partners, mc, iter, dt, ions_dyn, scsteps)
660 type(scf_t),
intent(inout) :: scf
661 type(namespace_t),
intent(in) :: namespace
662 type(electron_space_t),
intent(in) :: space
663 type(grid_t),
intent(inout) :: gr
664 type(v_ks_t),
intent(inout) :: ks
665 type(states_elec_t),
intent(inout) :: st
666 type(hamiltonian_elec_t),
intent(inout) :: hm
667 type(ions_t),
intent(inout) :: ions
668 type(partner_list_t),
intent(in) :: ext_partners
669 type(multicomm_t),
intent(inout) :: mc
670 integer,
intent(in) :: iter
671 real(real64),
intent(in) :: dt
672 type(ion_dynamics_t),
intent(inout) :: ions_dyn
673 integer,
intent(inout) :: scsteps
675 type(gauge_field_t),
pointer :: gfield
680 call propagation_ops_elec_propagate_ions_and_cell(gr, hm, st, namespace, space, &
681 ions_dyn, ions, mc, iter*dt, dt)
683 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
685 call scf_run(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, &
686 verbosity = verb_compact, iters_done = scsteps)
689 if (ions_dyn%cell_relax())
then
690 if (.not. scf%calc_stress)
then
691 call stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
693 call ions_dyn%update_stress(ions%space, st%stress_tensors%total, ions%latt%rlattice, ions%latt%rcell_volume)
696 gfield => list_get_gauge_field(ext_partners)
697 if(
associated(gfield))
then
698 if (gauge_field_is_propagated(gfield))
then
699 call gauge_field_do_algorithmic_operation(gfield, op_verlet_compute_acc, dt, iter*dt)
704 if (hm%lda_u_level /= dft_u_none)
then
705 call messages_not_implemented(
"DFT+U with propagator_elec_dt_bo", namespace=namespace)
708 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
711 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
712 calc_eigenval = .
true., time = iter*dt, calc_energy = .
true.)
715 call energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit = -1)
717 call ion_dynamics_propagate_vel(ions_dyn, ions)
718 call hamiltonian_elec_epot_generate(hm, namespace, space, gr, ions, ext_partners, st, time = iter*dt)
719 call ions%update_kinetic_energy()
721 if(
associated(gfield))
then
722 if (gauge_field_is_propagated(gfield))
then
723 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_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_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)
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_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_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_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_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_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.