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.