45 use,
intrinsic :: iso_fortran_env
108 integer,
parameter,
public :: &
114 type(propagator_base_t),
public :: tr
115 type(scf_t),
public :: scf
116 type(ion_dynamics_t),
public :: ions_dyn
117 real(real64),
public :: dt
118 integer,
public :: max_iter
119 integer,
public :: iter
120 logical,
public :: recalculate_gs
121 integer,
public :: recalculate_gs_interval
123 type(pes_t),
public :: pesv
125 integer,
public :: dynamics
126 integer,
public :: energy_update_iter
127 real(real64) :: scissor
129 logical :: freeze_occ
131 integer :: freeze_orbitals
133 logical :: from_scratch = .false.
135 type(td_write_t),
public :: write_handler
136 type(restart_t) :: restart_load
137 type(restart_t) :: restart_dump
144 subroutine td_init(td, namespace, space, gr, ions, st, ks, hm, ext_partners, outp, dmp)
145 type(td_t),
intent(inout) :: td
146 type(namespace_t),
intent(in) :: namespace
147 class(space_t),
intent(in) :: space
148 type(grid_t),
intent(in) :: gr
149 type(ions_t),
intent(inout) :: ions
150 type(states_elec_t),
intent(in) :: st
151 type(v_ks_t),
intent(in) :: ks
152 type(hamiltonian_elec_t),
intent(in) :: hm
153 type(partner_list_t),
intent(in) :: ext_partners
154 type(output_t),
intent(in) :: outp
155 type(dmp_t),
intent(inout) :: dmp
158 real(real64) :: propagation_time
159 type(lasers_t),
pointer :: lasers
160 logical :: symmetrize
166 symmetrize = hm%kpoints%use_symmetries .or. st%symmetrize_density
169 if (td%ions_dyn%ions_move())
then
170 if (hm%kpoints%use_symmetries)
then
171 message(1) =
"KPoints symmetries cannot be used with moving ions."
172 message(2) =
"Please set KPointsSymmetries = no."
175 if (st%symmetrize_density)
then
176 message(1) =
"Symmetrization of the density cannot be used with moving ions."
177 message(2) =
"Please set SymmetrizeDensity = no."
199 write(
message(1),
'(a)')
'A positive value for TDTimeStep must be defined in the input file.'
207 call messages_write(
'You cannot set TDMaxSteps and TDPropagationTime at the same time')
236 if (propagation_time >
m_zero) default = nint(propagation_time/td%dt)
237 call parse_variable(namespace,
'TDMaxSteps', default, td%max_iter)
239 if (propagation_time <=
m_zero) propagation_time = td%dt*td%max_iter
244 if (td%max_iter < 1)
then
245 write(
message(1),
'(a,i6,a)')
"Input: '", td%max_iter,
"' is not a valid value for TDMaxSteps."
246 message(2) =
'(TDMaxSteps <= 1)'
255 call pes_init(td%pesv, namespace, space, gr, gr%box, st, 1, hm%kpoints, &
256 hm%abs_boundaries, ext_partners, td%max_iter, td%dt)
271 call parse_variable(namespace,
'TDDynamics', ehrenfest, td%dynamics)
274 if (td%dynamics .ne. ehrenfest)
then
275 if (.not. td%ions_dyn%is_active())
then
276 message(1) =
"TDDynamics=bo can only be used if MoveIons=yes or CellDynamics=yes"
297 call parse_variable(namespace,
'RecalculateGSDuringEvolution', .false., td%recalculate_gs)
298 if (hm%lda_u_level /=
dft_u_none .and. td%recalculate_gs)
then
314 call parse_variable(namespace,
'RecalculateGSInterval', 50, td%recalculate_gs_interval)
331 if (
associated(lasers) .and. st%system_grp%is_root())
then
333 call laser_write_info(lasers%lasers, dt=td%dt, max_iter=td%max_iter, namespace=namespace)
349 call parse_variable(namespace,
'TDEnergyUpdateIter', default, td%energy_update_iter)
350 if (td%energy_update_iter < 1)
then
354 if (gr%der%boundaries%spiralBC .and. hm%ep%reltype ==
spin_orbit)
then
355 message(1) =
"Generalized Bloch theorem cannot be used with spin-orbit coupling."
359 if (gr%der%boundaries%spiralBC)
then
360 if (any(abs(hm%kick%easy_axis(1:2)) >
m_epsilon))
then
361 message(1) =
"Generalized Bloch theorem cannot be used for an easy axis not along the z direction."
387 call parse_variable(namespace,
'TDFreezeOrbitals', 0, td%freeze_orbitals)
389 if (td%freeze_orbitals /= 0)
then
423 if (dmp%calculation_mode /= option__tddmpropagation__no_propagation)
then
425 call dmp%init(namespace, st, space, hm)
434 subroutine td_init_run(td, namespace, mc, gr, ions, st, ks, hm, ext_partners, outp, space, dmp, from_scratch)
435 type(
td_t),
intent(inout) :: td
438 type(
grid_t),
intent(inout) :: gr
439 type(
ions_t),
intent(inout) :: ions
441 type(
v_ks_t),
intent(inout) :: ks
444 type(
output_t),
intent(inout) :: outp
446 type(
dmp_t),
intent(inout) :: dmp
447 logical,
intent(inout) :: from_scratch
457 call ions%initialize()
459 td%from_scratch = from_scratch
461 if (.not. td%from_scratch)
then
463 if (td%from_scratch)
then
464 message(1) =
"Unable to read time-dependent restart information: Starting from scratch"
469 if (td%iter >= td%max_iter)
then
470 message(1) =
"All requested iterations have already been done. Use FromScratch = yes if you want to redo them."
473 td%iter = td%iter + 1
474 if ((td%ions_dyn%is_active()) .and. td%recalculate_gs)
call td%restart_load%end()
479 if (td%from_scratch)
then
483 call td_init_with_wavefunctions(td, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, outp, dmp, td%from_scratch)
490 type(
td_t),
intent(inout) :: td
493 type(
grid_t),
intent(inout) :: gr
494 type(
ions_t),
intent(inout) :: ions
497 class(
space_t),
intent(in) :: space
502 if (td%dynamics == ehrenfest)
then
508 call lda_u_init(hm%lda_u, namespace, space, hm%lda_u_level, gr, ions, st, mc, hm%kpoints)
515 call scf_init(td%scf, namespace, gr, ions, st, mc, hm, space)
524 type(
td_t),
intent(inout) :: td
526 type(
grid_t),
intent(inout) :: gr
528 type(
v_ks_t),
intent(inout) :: ks
531 class(
space_t),
intent(in) :: space
538 if(
associated(gfield))
then
545 call hm%update(gr, namespace, space, ext_partners, time = td%dt*td%iter)
555 type(
td_t),
intent(inout) :: td
563 if (td%dynamics ==
bo)
call scf_end(td%scf)
570 type(
td_t),
intent(inout) :: td
573 type(
dmp_t),
intent(inout) :: dmp
577 if (st%pack_states .and. hm%apply_packed())
call st%unpack()
579 call td%restart_dump%end()
584 if ((td%ions_dyn%is_active()).and. td%recalculate_gs)
call td%restart_load%end()
586 if (dmp%calculation_mode /= option__tddmpropagation__no_propagation)
then
594 subroutine td_run(td, namespace, mc, gr, ions, st, ks, hm, ext_partners, outp, space, dmp, from_scratch)
595 type(
td_t),
intent(inout) :: td
598 type(
grid_t),
intent(inout) :: gr
599 type(
ions_t),
intent(inout) :: ions
601 type(
v_ks_t),
intent(inout) :: ks
604 type(
output_t),
intent(inout) :: outp
606 type(
dmp_t),
intent(inout) :: dmp
607 logical,
intent(inout) :: from_scratch
610 integer :: iter, scsteps
611 real(real64) :: etime
612 real(real64) :: wall_time, simulation_time, speed_fs_per_day
613 character(len=20) :: fmt
621 propagation:
do iter = td%iter, td%max_iter
628 if (((iter-1)*td%dt <= hm%kick%time) .and. (iter*td%dt > hm%kick%time))
then
629 if (.not. hm%pcm%localf)
then
630 call kick_apply(space, gr, st, td%ions_dyn, ions, hm%kick, hm%psolver, hm%kpoints)
632 call kick_apply(space, gr, st, td%ions_dyn, ions, hm%kick, hm%psolver, hm%kpoints, pcm = hm%pcm)
634 call td_write_kick(outp, namespace, space, gr, hm%kick, ions, iter)
637 if (gr%der%boundaries%spiralBC) gr%der%boundaries%spiral = .
true.
642 select case (td%dynamics)
644 call propagator_elec_dt(ks, namespace, space, hm, gr, st, td%tr, iter*td%dt, td%dt, iter, td%ions_dyn, &
645 ions, ext_partners, mc, outp, td%write_handler, scsteps = scsteps, &
646 update_energy = (mod(iter, td%energy_update_iter) == 0) .or. (iter == td%max_iter))
648 call propagator_elec_dt_bo(td%scf, namespace, space, gr, ks, st, hm, ions, ext_partners, mc, iter, &
649 td%dt, td%ions_dyn, scsteps)
652 if (dmp%calculation_mode /= option__tddmpropagation__no_propagation)
then
653 call dm_propagation_run(dmp, namespace, space, gr, ions, st, mc, hm, ks, iter, td%dt, ext_partners, &
654 update_energy = (mod(iter, td%energy_update_iter) == 0) .or. (iter == td%max_iter))
667 if (td%pesv%calc_spm .or. td%pesv%calc_mask .or. td%pesv%calc_flux)
then
668 call pes_calc(td%pesv, namespace, space, gr, st, td%dt, iter, gr%der, hm%kpoints, ext_partners, stopping)
671 call td_write_iter(td%write_handler, namespace, space, outp, gr, st, hm, ions, ext_partners, &
672 hm%kick, ks, td%dt, iter, mc, td%recalculate_gs, dmp%adiabatic_st)
675 call td_check_point(td, namespace, mc, gr, ions, st, ks, hm, ext_partners, outp, space, &
676 iter, scsteps, etime, dmp, stopping, from_scratch)
688 simulation_time = td%dt * (iter - td%iter + 1)
690 if (speed_fs_per_day > 1e4 .or. speed_fs_per_day < 1e-3)
then
695 write(
message(1),
'(a,'//trim(fmt)//
',a)')
'Propagation speed: ', speed_fs_per_day,
' fs/day'
707 write(
message(1),
'(a7,1x,a14,a14,a10,a17)')
'Iter ',
'Time ',
'Energy ',
'SC Steps',
'Elapsed Time '
716 subroutine td_check_point(td, namespace, mc, gr, ions, st, ks, hm, ext_partners, outp, space, &
717 iter, scsteps, etime, dmp, stopping, from_scratch)
718 type(
td_t),
intent(inout) :: td
721 type(
grid_t),
intent(inout) :: gr
722 type(
ions_t),
intent(inout) :: ions
724 type(
v_ks_t),
intent(inout) :: ks
729 integer,
intent(in) :: iter
730 integer,
intent(in) :: scsteps
731 real(real64),
intent(inout) :: etime
732 type(
dmp_t),
intent(inout) :: dmp
733 logical,
intent(in) :: stopping
734 logical,
intent(inout) :: from_scratch
742 if (outp%anything_now(iter))
then
743 call td_write_output(namespace, space, gr, st, hm, ks, outp, ions, ext_partners, iter, td%dt)
749 call td_dump(td, namespace, space, gr, st, hm, ks, ext_partners, iter, ierr)
751 message(1) =
"Unable to write time-dependent restart information."
755 if (dmp%calculation_mode /= option__tddmpropagation__no_propagation .and. &
756 dmp%basis == option__tddmpropagationbasis__adiabatic)
then
757 call states_elec_dump(dmp%restart_dump, space, dmp%adiabatic_st, gr, hm%kpoints, ierr, iter=iter)
759 message(1) =
"Unable to write dm-adiabatic restart information."
764 call pes_output(td%pesv, namespace, space, gr, st, iter, outp, td%dt, ions)
767 if (mod(iter, td%recalculate_gs_interval) == 0 .or. iter == td%max_iter .or. stopping)
then
768 if ((td%ions_dyn%is_active()) .and. td%recalculate_gs)
then
770 call td_dump(td, namespace, space, gr, st, hm, ks, ext_partners, iter, ierr)
772 message(1) =
"Unable to write time-dependent restart information."
777 from_scratch = .false.
779 call electrons_ground_state_run(namespace, mc, gr, ions, ext_partners, st, ks, hm, outp, space, from_scratch)
782 call td_load(td%restart_load, namespace, space, gr, st, hm, ext_partners, td, ks, ierr)
784 message(1) =
"Unable to load TD states."
788 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
789 calc_eigenval=.
true., time = iter*td%dt, calc_energy=.
true.)
790 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, t = iter*td%dt, dt = td%dt)
791 assert(.not. td%ions_dyn%cell_relax())
802 type(
td_t),
intent(inout) :: td
804 type(
ions_t),
intent(inout) :: ions
806 integer,
intent(in) :: iter
807 integer,
intent(in) :: scsteps
808 real(real64),
intent(inout) :: etime
823 real(real64),
intent(inout) :: etime
833 subroutine td_init_with_wavefunctions(td, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, outp, dmp, from_scratch)
834 type(
td_t),
intent(inout) :: td
838 type(
grid_t),
intent(inout) :: gr
839 type(
ions_t),
intent(inout) :: ions
842 type(
v_ks_t),
intent(inout) :: ks
844 type(
output_t),
intent(inout) :: outp
845 type(
dmp_t),
intent(inout) :: dmp
846 logical,
intent(in) :: from_scratch
850 real(real64) :: ndinitial(space%dim)
851 logical :: freeze_hxc, freeze_occ, freeze_u
852 type(
restart_t) :: restart, restart_frozen
859 if (gr%der%boundaries%spiralBC)
then
860 if ((td%iter-1)*td%dt > hm%kick%time)
then
861 gr%der%boundaries%spiral = .
true.
863 hm%vnl%spin => st%spin
864 hm%phase%spin => st%spin
869 if (from_scratch)
then
876 if (td%freeze_orbitals > 0)
then
877 if (from_scratch)
then
888 message(1) =
"Unable to read frozen restart information."
893 write(
message(1),
'(a,i4,a,i4,a)')
'Info: The lowest', td%freeze_orbitals, &
894 ' orbitals have been frozen.', st%nst,
' will be propagated.'
898 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval=.
true., time = td%iter*td%dt)
899 else if (td%freeze_orbitals < 0)
then
902 write(
message(1),
'(a)')
'Info: The single-active-electron approximation will be used.'
904 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval=.
true., time = td%iter*td%dt)
905 if (from_scratch)
then
916 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval=.
true., time = td%iter*td%dt)
927 call parse_variable(namespace,
'TDFreezeHXC', .false., freeze_hxc)
929 write(
message(1),
'(a)')
'Info: Freezing Hartree and exchange-correlation potentials.'
932 if (.not. from_scratch)
then
935 call states_elec_load(restart_frozen, namespace, space, st, gr, hm%kpoints, ierr, label =
": gs")
937 call restart_frozen%end()
940 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval=.
true., time = td%iter*td%dt)
943 call states_elec_load(restart_frozen, namespace, space, st, gr, hm%kpoints, ierr, iter=td%iter, label =
": td")
944 call restart_frozen%end()
945 call hm%ks_pot%run_zero_iter(td%tr%vks_old)
953 x = minval(st%eigenval(st%st_start, :))
954 if (st%parallel_in_states)
then
955 call st%mpi_grp%bcast(x, 1, mpi_double_precision, 0)
957 call hm%update_span(gr%spacing(1:space%dim), x, namespace)
959 call states_elec_fermi(st, namespace, gr, compute_spin = .not. gr%der%boundaries%spiralBC)
970 call parse_variable(namespace,
'TDFreezeDFTUOccupations', .false., freeze_occ)
972 write(
message(1),
'(a)')
'Info: Freezing DFT+U occupation matrices that enters in the DFT+U potential.'
977 if (hm%lda_u_level /=
dft_u_none .and. .not. from_scratch)
then
979 call lda_u_load(restart_frozen, hm%lda_u, st, hm%energy%dft_u, ierr, occ_only = .
true.)
980 call restart_frozen%end()
993 write(
message(1),
'(a)')
'Info: Freezing the effective U of DFT+U.'
998 if (hm%lda_u_level ==
dft_u_acbn0 .and. .not. from_scratch)
then
1000 call lda_u_load(restart_frozen, hm%lda_u, st, hm%energy%dft_u, ierr, u_only = .
true.)
1001 call restart_frozen%end()
1002 write(
message(1),
'(a)')
'Loaded GS effective U of DFT+U'
1011 call td_write_init(td%write_handler, namespace, space, outp, gr, st, hm, ions, ext_partners, &
1012 ks, td%ions_dyn%is_active(), &
1017 if(
associated(lasers))
then
1019 ndinitial(1:space%dim)=
m_zero
1028 call scissor_init(hm%scissor, namespace, space, st, gr, hm%kpoints, hm%phase, td%scissor, mc)
1032 if (dmp%calculation_mode /= option__tddmpropagation__no_propagation)
then
1036 if (td%iter == 0)
then
1037 call td_run_zero_iter(td, namespace, space, gr, ions, st, ks, hm, ext_partners, outp, mc, dmp%adiabatic_st)
1041 if(
associated(gfield))
then
1044 if (abs(ks%xc%lrc%alpha) >
m_epsilon)
then
1051 td%iter = td%iter + 1
1054 if (td%ions_dyn%is_active() .and. td%recalculate_gs)
then
1062 if ((td%pesv%calc_spm .or. td%pesv%calc_mask) .and. from_scratch)
then
1066 if (st%pack_states .and. hm%apply_packed())
call st%pack()
1073 type(
td_t),
intent(inout) :: td
1076 type(
grid_t),
intent(inout) :: gr
1077 type(
ions_t),
intent(inout) :: ions
1080 type(
v_ks_t),
intent(inout) :: ks
1082 type(
output_t),
intent(inout) :: outp
1087 if (td%ions_dyn%ions_move())
then
1088 if (td%iter > 0)
then
1095 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval=.
true., time = td%iter*td%dt)
1098 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, t = td%iter*td%dt, dt = td%dt)
1100 call ions%update_kinetic_energy()
1102 if (outp%what(option__output__forces) .or. td%write_handler%out(
out_separate_forces)%write)
then
1103 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, t = td%iter*td%dt, dt = td%dt)
1107 if (outp%what(option__output__stress) .or. td%ions_dyn%cell_relax())
then
1109 if (td%ions_dyn%cell_relax())
then
1110 call td%ions_dyn%update_stress(ions%space, st%stress_tensors%total, ions%latt%rlattice, ions%latt%rcell_volume)
1119 type(
td_t),
intent(inout) :: td
1121 class(
space_t),
intent(in) :: space
1123 type(
grid_t),
intent(inout) :: gr
1126 type(
v_ks_t),
intent(inout) :: ks
1128 logical,
intent(inout) :: from_scratch
1136 if (td%freeze_orbitals > 0)
then
1142 call td_load(restart, namespace, space, gr, st, hm, ext_partners, td, ks, ierr)
1146 from_scratch = .
true.
1155 type(
td_t),
intent(inout) :: td
1157 class(
space_t),
intent(in) :: space
1159 type(
grid_t),
intent(inout) :: gr
1162 type(
v_ks_t),
intent(inout) :: ks
1172 if (.not. st%only_userdef_istates)
then
1174 call states_elec_load(restart, namespace, space, st, gr, hm%kpoints, ierr, label =
": gs")
1177 message(1) =
'Unable to read ground-state wavefunctions.'
1196 subroutine td_run_zero_iter(td, namespace, space, gr, ions, st, ks, hm, ext_partners, outp, mc, dmp_st)
1197 type(
td_t),
intent(inout) :: td
1200 type(
grid_t),
intent(inout) :: gr
1201 type(
ions_t),
intent(inout) :: ions
1203 type(
v_ks_t),
intent(inout) :: ks
1212 call td_write_iter(td%write_handler, namespace, space, outp, gr, st, hm, ions, ext_partners, &
1213 hm%kick, ks, td%dt, 0, mc, td%recalculate_gs, dmp_st)
1217 if (abs(hm%kick%time) <=
m_epsilon)
then
1218 if (.not. hm%pcm%localf)
then
1219 call kick_apply(space, gr, st, td%ions_dyn, ions, hm%kick, hm%psolver, hm%kpoints)
1221 call kick_apply(space, gr, st, td%ions_dyn, ions, hm%kick, hm%psolver, hm%kpoints, pcm = hm%pcm)
1223 call td_write_kick(outp, namespace, space, gr, hm%kick, ions, 0)
1226 if (gr%der%boundaries%spiralBC)
then
1227 gr%der%boundaries%spiral = .
true.
1230 call hm%ks_pot%run_zero_iter(td%tr%vks_old)
1232 if (any(outp%output_interval > 0))
then
1234 call td_write_output(namespace, space, gr, st, hm, ks, outp, ions, ext_partners, 0)
1244 type(
td_t),
intent(in) :: td
1246 type(
ions_t),
intent(inout) :: ions
1248 integer :: iatom, iter, iunit
1252 iunit =
io_open(
'td.general/coordinates', namespace, action=
'read', status=
'old', die=.false.)
1253 if (iunit == -1)
then
1254 message(1) =
"Could not open file '"//trim(
io_workpath(
'td.general/coordinates', namespace))//
"'."
1255 message(2) =
"Starting simulation from initial geometry."
1262 do iter = 0, td%iter - 1
1265 read(iunit,
'(32x)', advance=
'no')
1267 do iatom = 1, ions%natoms
1268 read(iunit,
'(3es24.16)', advance=
'no') ions%pos(:, iatom)
1271 do iatom = 1, ions%natoms
1272 read(iunit,
'(3es24.16)', advance=
'no') ions%vel(:, iatom)
1275 do iatom = 1, ions%natoms
1276 read(iunit,
'(3es24.16)', advance=
'no') ions%tot_force(:, iatom)
1286 subroutine td_dump(td, namespace, space, gr, st, hm, ks, ext_partners, iter, ierr)
1287 type(
td_t),
intent(in) :: td
1289 class(
space_t),
intent(in) :: space
1290 type(
grid_t),
intent(in) :: gr
1293 type(
v_ks_t),
intent(in) :: ks
1295 integer,
intent(in) :: iter
1296 integer,
intent(out) :: ierr
1299 integer :: err, err2
1305 if (td%restart_dump%skip())
then
1310 message(1) =
"Debug: Writing td restart."
1314 call states_elec_dump(td%restart_dump, space, st, gr, hm%kpoints, err, iter=iter)
1315 if (err /= 0) ierr = ierr + 1
1318 if (err /= 0) ierr = ierr + 1
1321 call lda_u_dump(td%restart_dump, namespace, hm%lda_u, st, gr, err)
1322 if (err /= 0) ierr = ierr + 1
1326 if (err2 /= 0) ierr = ierr + 2
1328 call pes_dump(td%pesv, namespace, td%restart_dump, st, gr, err)
1329 if (err /= 0) ierr = ierr + 4
1333 if(
associated(gfield))
then
1335 if (err /= 0) ierr = ierr + 8
1338 if (gr%der%boundaries%spiralBC)
then
1340 if (err /= 0) ierr = ierr + 8
1343 if (ks%has_photons)
then
1344 call mf_photons_dump(td%restart_dump, ks%pt_mx, gr, td%dt, ks%pt, err)
1345 if (err /= 0) ierr = ierr + 16
1348 if (ks%xc_photon /= 0)
then
1350 call ks%xc_photons%mf_dump(td%restart_dump, err)
1351 if (err /= 0) ierr = ierr + 32
1354 if (
allocated(st%frozen_rho))
then
1357 if (err /= 0) ierr = ierr + 64
1359 if (td%ions_dyn%ions_move() .or. td%ions_dyn%cell_relax())
then
1362 if (err /= 0) ierr = ierr + 128
1364 message(1) =
"Debug: Writing td restart done."
1371 subroutine td_load(restart, namespace, space, gr, st, hm, ext_partners, td, ks, ierr)
1374 class(
space_t),
intent(in) :: space
1375 type(
grid_t),
intent(in) :: gr
1379 type(
td_t),
intent(inout) :: td
1380 type(
v_ks_t),
intent(inout) :: ks
1381 integer,
intent(out) :: ierr
1383 integer :: err, err2
1389 if (restart%skip())
then
1395 message(1) =
"Debug: Reading td restart."
1399 call states_elec_load(restart, namespace, space, st, gr, hm%kpoints, err, iter=td%iter, label =
": td")
1406 if (err2 /= 0) ierr = ierr + 2
1409 call lda_u_load(restart, hm%lda_u, st, hm%energy%dft_u, err)
1410 if (err /= 0) ierr = ierr + 1
1415 if (td%pesv%calc_spm .or. td%pesv%calc_mask .or. td%pesv%calc_flux)
then
1416 call pes_load(td%pesv, namespace, restart, st, err)
1417 if (err /= 0) ierr = ierr + 4
1422 if (
associated(gfield))
then
1427 call hm%update(gr, namespace, space, ext_partners, time = td%dt*td%iter)
1432 if (ks%has_photons)
then
1434 if (err /= 0) ierr = ierr + 16
1437 if (ks%xc_photon /= 0)
then
1438 call ks%xc_photons%mf_load(restart, space, err)
1439 if (err /= 0) ierr = ierr + 32
1442 if (gr%der%boundaries%spiralBC)
then
1449 if (td%ions_dyn%is_active())
then
1451 if (err /= 0) ierr = ierr + 64
1454 message(1) =
"Debug: Reading td restart done."
1460 subroutine td_load_frozen(namespace, restart, space, mesh, st, hm, ierr)
1463 class(
space_t),
intent(in) :: space
1464 class(
mesh_t),
intent(in) :: mesh
1467 integer,
intent(out) :: ierr
1473 if (restart%skip())
then
1479 message(1) =
"Debug: Reading td frozen restart."
1482 safe_allocate(st%frozen_rho(1:mesh%np, 1:st%d%nspin))
1484 safe_allocate(st%frozen_tau(1:mesh%np, 1:st%d%nspin))
1485 safe_allocate(st%frozen_gdens(1:mesh%np, 1:space%dim, 1:st%d%nspin))
1486 safe_allocate(st%frozen_ldens(1:mesh%np, 1:st%d%nspin))
1491 message(1) =
"Debug: Reading td frozen restart done."
1499 type(
td_t),
intent(in) :: td
1510 type(
td_t),
intent(inout) :: td
1511 logical,
intent(in) :: from_scratch
1515 td%from_scratch = from_scratch
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
integer, parameter, public mask_absorbing
Module implementing boundary conditions in Octopus.
This module handles the calculation mode.
This module implements a calculator for the density and defines related functions.
subroutine, public states_elec_freeze_adjust_qtot(st)
subroutine, public states_elec_freeze_redistribute_states(st, namespace, mesh, mc, nn)
subroutine, public states_elec_freeze_orbitals(st, namespace, space, gr, mc, kpoints, n, family_is_mgga)
Calculate partial density for frozen orbitals.
subroutine, public density_calc(st, gr, density, istin)
Computes the density from the orbitals in st.
subroutine, public dm_propagation_init_run(dmp, namespace, space, gr, ions, st, hm, mc, from_scratch)
Initialise the adiabatic states prior to running TD propagation.
subroutine, public dm_end_run(system_grp, dmp)
subroutine, public dm_propagation_run(dmp, namespace, space, gr, ions, st, mc, hm, ks, iter, dt, ext_partners, update_energy)
Density matrix propagation.
A set of subroutines for performing the parts of a ground state calculation with an electrons system....
subroutine, public electrons_ground_state_run(namespace, mc, gr, ions, ext_partners, st, ks, hm, outp, space, fromScratch)
Run a ground state calculation for a system of electrons.
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,...
integer, parameter, public spin_orbit
logical function, public list_has_gauge_field(partners)
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_load(restart, gfield, ierr)
subroutine, public gauge_field_get_force(this, gr, spin_channels, current, lrc)
subroutine, public gauge_field_dump(restart, gfield, ierr)
logical pure function, public gauge_field_is_propagated(this)
logical pure function, public gauge_field_is_used(this)
subroutine, public gauge_field_init_vec_pot(this, qtot)
real(real64), parameter, public m_zero
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
subroutine, public zvmask(mesh, hm, st)
subroutine, public hamiltonian_elec_epot_generate(this, namespace, space, gr, ions, ext_partners, st, time)
subroutine, public dvmask(mesh, hm, st)
This module defines classes and functions for interaction partners.
subroutine, public io_close(iunit, grp)
subroutine, public io_skip_header(iunit)
character(len=max_path_len) function, public io_workpath(path, namespace)
construct path name from given name and namespace
subroutine, public io_debug_on_the_fly(namespace)
check if debug mode should be enabled or disabled on the fly
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
subroutine, public ion_dynamics_dump(this, restart, ierr)
subroutine, public ion_dynamics_propagate(this, ions, time, dt, namespace)
Interface for the ion/cell dynamics.
subroutine, public ion_dynamics_load(this, restart, ierr)
subroutine, public ion_dynamics_init(this, namespace, ions, symmetrize, symm)
subroutine, public ion_dynamics_end(this)
logical pure function, public ion_dynamics_drive_ions(this)
Is the ion dynamics activated or not.
subroutine, public kick_apply(space, mesh, st, ions_dyn, ions, kick, psolver, kpoints, pcm)
Applies the delta-function electric field where k = kick%delta_strength.
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 laser_write_info(lasers, namespace, dt, max_iter, iunit)
subroutine, public lda_u_dump(restart, namespace, this, st, mesh, ierr)
subroutine, public lda_u_write_u(this, iunit, namespace)
subroutine, public lda_u_load(restart, this, st, dftu_energy, ierr, occ_only, u_only)
subroutine, public lda_u_write_v(this, iunit, namespace)
integer, parameter, public dft_u_none
subroutine, public lda_u_init(this, namespace, space, level, gr, ions, st, mc, kpoints)
subroutine, public lda_u_freeze_occ(this)
subroutine, public lda_u_freeze_u(this)
subroutine, public lda_u_end(this)
subroutine, public lda_u_update_occ_matrices(this, namespace, mesh, st, phase, energy)
integer, parameter, public dft_u_acbn0
This module implements fully polymorphic linked lists, and some specializations thereof.
System information (time, memory, sysname)
This module defines the meshes, which are used in Octopus.
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
subroutine, public messages_not_implemented(feature, namespace)
character(len=512), private msg
subroutine, public messages_warning(no_lines, all_nodes, 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)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This module handles the communicators for the various parallelization strategies.
type(namespace_t), public global_namespace
this module contains the low-level part of the output system
this module contains the output system
logical function, public parse_is_defined(namespace, name)
subroutine, public pes_calc(pes, namespace, space, mesh, st, dt, iter, der, kpoints, ext_partners, stopping)
subroutine, public pes_init(pes, namespace, space, mesh, box, st, save_iter, kpoints, abs_boundaries, ext_partners, max_iter, dt)
subroutine, public pes_output(pes, namespace, space, gr, st, iter, outp, dt, ions)
subroutine, public pes_init_write(pes, mesh, st, namespace)
subroutine, public pes_end(pes)
subroutine, public pes_load(pes, namespace, restart, st, ierr)
subroutine, public pes_dump(pes, namespace, restart, st, mesh, ierr)
subroutine, public mf_photons_load(restart, this, gr, ierr)
subroutine, public mf_photons_dump(restart, this, gr, dt, pt_mode, ierr)
subroutine, public potential_interpolation_load(potential_interpolation, namespace, restart, mesh, nspin, err2)
subroutine, public potential_interpolation_dump(potential_interpolation, restart, mesh, nspin, err2)
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 propagator_elec_dt_bo(scf, namespace, space, gr, ks, st, hm, ions, ext_partners, mc, iter, dt, ions_dyn, scsteps)
subroutine, public propagator_elec_init(gr, namespace, st, tr, ks_pot, have_fields, family_is_mgga_with_exc, relax_cell)
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)
This module implements the basic propagator framework.
logical function, public clean_stop(comm)
returns true if a file named stop exists
integer, parameter, public restart_gs
integer, parameter, public restart_type_dump
integer, parameter, public restart_td
integer, parameter, public restart_type_load
subroutine, public scf_set_lower_bound_is_known(scf, known_lower_bound)
Set the flag lower_bound_is_known.
subroutine, public scf_init(scf, namespace, gr, ions, st, mc, hm, space)
subroutine, public scf_end(scf)
subroutine, public scissor_init(this, namespace, space, st, mesh, kpoints, phase, gap, mc)
pure logical function, public states_are_real(st)
subroutine, public states_elec_fermi(st, namespace, mesh, compute_spin)
calculate the Fermi level for the states in this object
subroutine, public states_elec_deallocate_wfns(st)
Deallocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public states_elec_allocate_wfns(st, mesh, wfs_type, skip, packed)
Allocates the KS wavefunctions defined within a states_elec_t structure.
This module handles reading and writing restart information for the states_elec_t.
subroutine, public states_elec_read_user_def_orbitals(mesh, namespace, space, st)
the routine reads formulas for user-defined wavefunctions from the input file and fills the respectiv...
subroutine, public states_elec_load_frozen(restart, space, st, mesh, ierr)
subroutine, public states_elec_transform(st, namespace, space, restart, mesh, kpoints, prefix)
subroutine, public states_elec_dump(restart, space, st, mesh, kpoints, ierr, iter, lr, verbose)
subroutine, public states_elec_load(restart, namespace, space, st, mesh, kpoints, ierr, iter, lr, lowest_missing, label, verbose, skip)
returns in ierr: <0 => Fatal error, or nothing read =0 => read all wavefunctions >0 => could only rea...
subroutine, public states_elec_load_spin(restart, st, ierr)
returns in ierr: <0 => Fatal error, or nothing read =0 => read all wavefunctions >0 => could only rea...
subroutine, public states_elec_dump_frozen(restart, space, st, mesh, ierr)
subroutine, public states_elec_dump_rho(restart, st, mesh, ierr, iter)
subroutine, public states_elec_dump_spin(restart, st, ierr)
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.
subroutine, public td_init_with_wavefunctions(td, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, outp, dmp, from_scratch)
subroutine, public td_end(td)
subroutine, public td_load_restart_from_gs(td, namespace, space, mc, gr, ext_partners, st, ks, hm)
subroutine td_print_message(td, namespace, ions, hm, iter, scsteps, etime)
subroutine td_run_zero_iter(td, namespace, space, gr, ions, st, ks, hm, ext_partners, outp, mc, dmp_st)
subroutine, public td_allocate_wavefunctions(td, namespace, mc, gr, ions, st, hm, space)
subroutine, public td_init(td, namespace, space, gr, ions, st, ks, hm, ext_partners, outp, dmp)
logical function, public td_get_from_scratch(td)
subroutine, public td_init_run(td, namespace, mc, gr, ions, st, ks, hm, ext_partners, outp, space, dmp, from_scratch)
subroutine td_load_frozen(namespace, restart, space, mesh, st, hm, ierr)
subroutine td_print_header(namespace)
subroutine, public td_run(td, namespace, mc, gr, ions, st, ks, hm, ext_partners, outp, space, dmp, from_scratch)
integer, parameter, public bo
subroutine td_load(restart, namespace, space, gr, st, hm, ext_partners, td, ks, ierr)
subroutine, public td_set_from_scratch(td, from_scratch)
subroutine, public td_dump(td, namespace, space, gr, st, hm, ks, ext_partners, iter, ierr)
subroutine td_read_coordinates(td, namespace, ions)
reads the pos and vel from coordinates file
subroutine, public td_init_gaugefield(td, namespace, gr, st, ks, hm, ext_partners, space)
subroutine td_update_elapsed_time(etime)
subroutine, public td_check_point(td, namespace, mc, gr, ions, st, ks, hm, ext_partners, outp, space, iter, scsteps, etime, dmp, stopping, from_scratch)
subroutine, public td_load_restart_from_td(td, namespace, space, mc, gr, ext_partners, st, ks, hm, from_scratch)
subroutine td_init_ions_and_forces(td, namespace, space, gr, ions, ext_partners, st, ks, hm, outp)
subroutine, public td_end_run(td, st, hm, dmp)
subroutine, public td_write_output(namespace, space, gr, st, hm, ks, outp, ions, ext_partners, iter, dt)
subroutine, public td_write_init(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, ks, ions_move, with_gauge_field, kick, iter, max_iter, dt, mc, dmp)
Initialize files to write when prograting in time.
subroutine, public td_write_iter(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, kick, ks, dt, iter, mc, recalculate_gs, dmp_st)
subroutine, public td_write_data(writ)
subroutine, public td_write_kick(outp, namespace, space, mesh, kick, ions, iter)
subroutine, public td_write_end(writ)
integer, parameter, public out_separate_forces
type(type_t), public type_cmplx
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
This module defines the unit system, used for input and output.
type(unit_t), public unit_femtosecond
Time in femtoseconds.
type(unit_system_t), public units_out
type(unit_system_t), public units_inp
the units systems for reading and writing
subroutine, public v_ks_freeze_hxc(ks)
subroutine, public v_ks_calculate_current(this, calc_cur)
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
This module provices a simple timer class which can be used to trigger the writing of a restart file ...
logical function, public walltimer_alarm(comm, print)
indicate whether time is up
real(real64) function, public walltimer_get_start_time()
Return the walltimer start time.
logical function, public restart_walltime_period_alarm(comm)
pure logical function, public family_is_mgga(family, only_collinear)
Is the xc function part of the mGGA family.
logical pure function, public family_is_mgga_with_exc(xcs)
Is the xc function part of the mGGA family with an energy functional.
Extension of space that contains the knowledge of the spin dimension.
Description of the grid, containing information on derivatives, stencil, and symmetries.
Describes mesh distribution to nodes.
Stores all communicators and groups.
The states_elec_t class contains all electronic wave functions.