43 use,
intrinsic :: iso_fortran_env
90 integer :: number_checkpoints
91 integer,
allocatable :: iter(:)
93 character(len=100) :: dirname
94 type(restart_t) :: restart_load
95 type(restart_t) :: restart_dump
101 integer :: number_checkpoints_
103 real(real64) :: delta_
105 logical :: gradients_
115 integer,
intent(in) :: niter
116 real(real64),
intent(in) :: eta
117 real(real64),
intent(in) :: delta
118 integer,
intent(in) :: number_checkpoints
119 logical,
intent(in) :: zbr98
120 logical,
intent(in) :: gradients
122 assert(.not. (zbr98 .and. gradients))
129 number_checkpoints_ = number_checkpoints
131 gradients_ = gradients
144 type(electrons_t),
intent(inout) :: sys
145 type(td_t),
intent(inout) :: td
146 type(controlfunction_t),
intent(in) :: par
147 type(target_t),
intent(inout) :: tg
148 type(opt_control_state_t),
intent(inout) :: qcpsi
149 type(oct_prop_t),
optional,
intent(inout) :: prop
150 logical,
optional,
intent(in) :: write_iter
152 integer :: ii, istep, ierr
153 logical :: write_iter_ = .false.
154 type(td_write_t) :: write_handler
155 real(real64),
allocatable :: x_initial(:,:)
156 logical :: vel_target_ = .false.
157 type(states_elec_t),
pointer :: psi
159 real(real64) :: init_time, final_time
163 message(1) =
"Info: Forward propagation."
168 write_iter_ = .false.
169 if (
present(write_iter)) write_iter_ = write_iter
172 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%pack()
175 if (write_iter_)
then
176 call td_write_init(write_handler, sys%namespace, sys%space, sys%outp, sys%gr, sys%st, sys%hm, &
187 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners, time =
m_zero)
191 sys%ext_partners, psi, time =
m_zero)
192 call forces_calculate(sys%gr, sys%namespace, sys%ions, sys%hm, sys%ext_partners, psi, sys%ks, t =
m_zero, dt = td%dt)
201 safe_allocate_source_a(x_initial, sys%ions%pos)
204 sys%ions%tot_force =
m_zero
209 call target_tdcalc(tg, sys%namespace, sys%space, sys%hm, sys%gr, sys%ions, sys%ext_partners, psi, 0, td%max_iter)
211 if (
present(prop))
then
214 message(1) =
"Unable to write OCT states restart."
223 do istep = 1, td%max_iter
226 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, istep*td%dt, td%dt, istep, &
227 td%ions_dyn, sys%ions, sys%ext_partners, sys%outp, td%write_handler)
229 if (
present(prop))
then
232 message(1) =
"Unable to write OCT states restart."
238 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners, time = istep*td%dt)
239 call energy_calc_total(sys%namespace, sys%space, sys%hm, sys%gr, psi, sys%ext_partners)
244 call target_tdcalc(tg, sys%namespace, sys%space, sys%hm, sys%gr, sys%ions, sys%ext_partners, psi, istep, td%max_iter)
247 if (write_iter_)
then
248 call td_write_iter(write_handler, sys%namespace, sys%space, sys%outp, sys%gr, psi, sys%hm, sys%ions, &
249 sys%ext_partners, sys%hm%kick, sys%ks, td%dt, istep, sys%mc, sys%td%recalculate_gs)
251 if (any(ii == sys%outp%output_interval + 1) .or. istep == td%max_iter)
then
252 if (istep == td%max_iter) sys%outp%output_interval = ii - 1
263 write(
message(1),
'(a,f12.2,a)')
'Propagation time: ', final_time - init_time,
' seconds.'
266 if (vel_target_)
then
267 sys%ions%pos = x_initial
268 safe_deallocate_a(x_initial)
274 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%unpack()
287 type(
td_t),
intent(inout) :: td
291 integer :: istep, ierr
296 message(1) =
"Info: Backward propagation."
300 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%pack()
306 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
311 message(1) =
"Unable to write OCT states restart."
317 do istep = td%max_iter, 1, -1
318 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, &
319 (istep - 1)*td%dt, -td%dt, istep-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%outp, td%write_handler)
323 message(1) =
"Unable to write OCT states restart."
327 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
331 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%unpack()
351 subroutine fwd_step(sys, td, tg, par, par_chi, qcpsi, prop_chi, prop_psi)
353 type(
td_t),
intent(inout) :: td
362 logical :: aux_fwd_propagation
372 message(1) =
"Info: Forward propagation."
390 .not. sys%ks%frozen_hxc))
391 if (aux_fwd_propagation)
then
394 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi2%pack()
399 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
402 if (aux_fwd_propagation)
then
409 message(1) =
"Unable to write OCT states restart."
412 call oct_prop_load_states(prop_chi, sys%namespace, sys%space, chi, sys%gr, sys%kpoints, 0, ierr)
414 message(1) =
"Unable to read OCT states restart."
418 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%pack()
419 if (sys%st%pack_states .and. sys%hm%apply_packed())
call chi%pack()
421 do i = 1, td%max_iter
422 call update_field(i, par, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par_chi, dir =
'f')
424 td, tg, par_chi, sys%ions, psi2)
425 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners, time = (i - 1)*td%dt)
426 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, chi, tr_chi, i*td%dt, td%dt, i, &
427 td%ions_dyn, sys%ions, sys%ext_partners, sys%outp, td%write_handler)
428 if (aux_fwd_propagation)
then
430 td, tg, par_prev, psi2, sys%ions)
431 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi2, tr_psi2, i*td%dt, td%dt, i, &
432 td%ions_dyn, sys%ions, sys%ext_partners, sys%outp, td%write_handler)
435 sys%ext_partners, td, tg, par, psi, sys%ions)
436 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners, time = (i - 1)*td%dt)
437 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, i*td%dt, td%dt, i, &
438 td%ions_dyn, sys%ions, sys%ext_partners, sys%outp, td%write_handler)
439 call target_tdcalc(tg, sys%namespace, sys%space, sys%hm, sys%gr, sys%ions, sys%ext_partners, psi, i, td%max_iter)
443 message(1) =
"Unable to write OCT states restart."
446 call oct_prop_check(prop_chi, sys%namespace, sys%space, chi, sys%gr, sys%kpoints, i)
448 call update_field(td%max_iter+1, par, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par_chi, dir =
'f')
451 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
463 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%unpack()
480 subroutine bwd_step(sys, td, tg, par, par_chi, qcchi, prop_chi, prop_psi)
482 type(
td_t),
intent(inout) :: td
497 message(1) =
"Info: Backward propagation."
512 call oct_prop_load_states(prop_psi, sys%namespace, sys%space, psi, sys%gr, sys%kpoints, td%max_iter, ierr)
514 message(1) =
"Unable to read OCT states restart."
517 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%pack()
518 if (sys%st%pack_states .and. sys%hm%apply_packed())
call chi%pack()
521 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
522 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners)
529 message(1) =
"Unable to write OCT states restart."
533 do i = td%max_iter, 1, -1
534 call oct_prop_check(prop_psi, sys%namespace, sys%space, psi, sys%gr, sys%kpoints, i)
535 call update_field(i, par_chi, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par, dir =
'b')
537 td, tg, par_chi, sys%ions, psi)
538 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners, time = abs(i*td%dt))
539 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, chi, tr_chi, abs((i-1)*td%dt), td%dt, &
540 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%outp, td%write_handler)
543 message(1) =
"Unable to write OCT states restart."
547 td, tg, par, psi, sys%ions)
548 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners, time = abs(i*td%dt))
549 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, abs((i-1)*td%dt), td%dt, &
550 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%outp, td%write_handler)
553 call update_field(0, par_chi, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par, dir =
'b')
556 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
557 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners)
562 if (sys%st%pack_states .and. sys%hm%apply_packed())
call chi%unpack()
582 subroutine bwd_step_2(sys, td, tg, par, par_chi, qcchi, prop_chi, prop_psi)
584 type(
td_t),
intent(inout) :: td
592 integer :: i, ierr, ik, ib
598 real(real64),
pointer :: q(:, :), p(:, :)
599 real(real64),
allocatable :: qtildehalf(:, :), qinitial(:, :)
600 real(real64),
allocatable :: vhxc(:, :)
601 real(real64),
allocatable :: fold(:, :), fnew(:, :)
602 type(
ion_state_t) :: ions_state_initial, ions_state_final
604 real(real64) :: init_time, final_time
611 safe_allocate(qtildehalf(1:sys%ions%natoms, 1:sys%ions%space%dim))
612 safe_allocate(qinitial(1:sys%ions%space%dim, 1:sys%ions%natoms))
623 call oct_prop_load_states(prop_psi, sys%namespace, sys%space, psi, sys%gr, sys%kpoints, td%max_iter, ierr)
625 message(1) =
"Unable to read OCT states restart."
629 safe_allocate(vhxc(1:sys%gr%np, 1:sys%hm%d%nspin))
632 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
633 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners)
639 message(1) =
"Unable to write OCT states restart."
644 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%pack()
645 if (sys%st%pack_states .and. sys%hm%apply_packed())
call st_ref%pack()
648 call forces_calculate(sys%gr, sys%namespace, sys%ions, sys%hm, sys%ext_partners, &
649 psi, sys%ks, t = td%max_iter*abs(td%dt), dt = td%dt)
652 message(1) =
"Info: Backward propagation."
658 do i = td%max_iter, 1, -1
660 call oct_prop_check(prop_psi, sys%namespace, sys%space, psi, sys%gr, sys%kpoints, i)
661 call update_field(i, par_chi, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par, dir =
'b')
663 select case (td%tr%method)
668 td, tg, par, psi, sys%ions)
669 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, abs((i-1)*td%dt), td%dt, &
670 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%outp, td%write_handler, qcchi = qcchi)
679 qinitial = sys%ions%pos
682 safe_allocate(fold(1:sys%ions%natoms, 1:sys%ions%space%dim))
683 safe_allocate(fnew(1:sys%ions%natoms, 1:sys%ions%space%dim))
694 td, tg, par, psi, sys%ions)
696 do ik = psi%d%kpt%start, psi%d%kpt%end
697 do ib = psi%group%block_start, psi%group%block_end
698 call psi%group%psib(ib, ik)%copy_data_to(sys%gr%np, st_ref%group%psib(ib, ik))
702 vhxc(:, :) = sys%hm%vhxc(:, :)
703 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, abs((i-1)*td%dt), td%dt, &
704 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%outp, td%write_handler)
708 sys%ions%pos = qinitial
710 sys%ext_partners, psi, time = abs((i-1)*td%dt))
713 do ik = psi%d%kpt%start, psi%d%kpt%end
714 do ib = psi%group%block_start, psi%group%block_end
716 st_ref%group%psib(ib, ik))
718 psi%group%psib(ib, ik), st_ref%group%psib(ib, ik))
722 sys%hm%vhxc(:, :) =
m_half * (sys%hm%vhxc(:, :) + vhxc(:, :))
724 td, tg, par, sys%ions, st_ref, qtildehalf)
726 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, chi, tr_chi, abs((i-1)*td%dt), td%dt, &
727 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%outp, td%write_handler)
733 sys%ext_partners, psi, time = abs((i-1)*td%dt))
734 call forces_calculate(sys%gr, sys%namespace, sys%ions, sys%hm, sys%ext_partners, &
735 psi, sys%ks, t = abs((i-1)*td%dt), dt = td%dt)
738 safe_deallocate_a(fold)
739 safe_deallocate_a(fnew)
742 sys%hm%vhxc(:, :) = vhxc(:, :)
748 message(1) =
"Unable to write OCT states restart."
756 write(stdout,
'(1x)')
760 write(
message(1),
'(a,f12.2,a)')
'Propagation time: ', final_time - init_time,
' seconds.'
767 td, tg, par, psi, sys%ions)
768 call update_field(0, par_chi, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par, dir =
'b')
771 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
772 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners)
776 safe_deallocate_a(vhxc)
783 safe_deallocate_a(qtildehalf)
784 safe_deallocate_a(qinitial)
793 subroutine update_hamiltonian_elec_chi(iter, namespace, space, gr, ks, hm, ext_partners, td, tg, par_chi, ions, st, qtildehalf)
794 integer,
intent(in) :: iter
796 class(
space_t),
intent(in) :: space
797 type(
grid_t),
intent(inout) :: gr
798 type(
v_ks_t),
intent(inout) :: ks
801 type(
td_t),
intent(inout) :: td
804 type(
ions_t),
intent(in) :: ions
806 real(real64),
optional,
intent(in) :: qtildehalf(:, :)
810 integer :: j, iatom, idim
811 complex(real64),
allocatable :: dvpsi(:, :, :), zpsi(:, :), inhzpsi(:, :)
812 integer :: ist, ik, ib
816 assert(.not. st%parallel_in_states)
817 assert(.not. st%d%kpt%parallel)
821 call target_inh(st, gr, hm%kpoints, tg, abs(td%dt)*iter, inh, iter)
828 safe_allocate(dvpsi(1:gr%np_part, 1:st%d%dim, 1:space%dim))
829 do ik = inh%d%kpt%start, inh%d%kpt%end
830 do ib = inh%group%block_start, inh%group%block_end
834 safe_allocate(zpsi(1:gr%np_part, 1:st%d%dim))
835 safe_allocate(inhzpsi(1:gr%np_part, 1:st%d%dim))
843 do iatom = 1, ions%natoms
844 call pert%setup_atom(iatom)
845 do idim = 1, space%dim
846 call pert%setup_dir(idim)
847 call pert%zapply(namespace, space, gr, hm, ik, zpsi(:, :), dvpsi(:, :, idim))
849 call lalg_axpy(gr%np, st%d%dim, -st%occ(ist, ik)*qtildehalf(iatom, idim), &
850 dvpsi(:, :, idim), inhzpsi(:, :))
853 safe_deallocate_p(pert)
858 safe_deallocate_a(zpsi)
859 safe_deallocate_a(inhzpsi)
860 safe_deallocate_a(dvpsi)
872 do j = iter - 2, iter + 2
873 if (j >= 0 .and. j <= td%max_iter)
then
886 subroutine update_hamiltonian_elec_psi(iter, namespace, space, gr, ks, hm, ext_partners, td, tg, par, st, ions)
887 integer,
intent(in) :: iter
890 type(
grid_t),
intent(inout) :: gr
891 type(
v_ks_t),
intent(inout) :: ks
894 type(
td_t),
intent(inout) :: td
898 type(
ions_t),
intent(in) :: ions
918 do j = iter - 2, iter + 2
919 if (j >= 0 .and. j <= td%max_iter)
then
925 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
926 call hm%update(gr, namespace, space, ext_partners)
935 subroutine calculate_g(space, gr, hm, lasers, psi, chi, dl, dq)
936 class(
space_t),
intent(in) :: space
937 type(
grid_t),
intent(inout) :: gr
939 type(
lasers_t),
intent(in) :: lasers
942 complex(real64),
intent(inout) :: dl(:), dq(:)
944 complex(real64),
allocatable :: zpsi(:, :), zoppsi(:, :)
945 integer :: no_parameters, j, ik, p
949 no_parameters = lasers%no_lasers
951 safe_allocate(zpsi(1:gr%np_part, 1:chi%d%dim))
952 safe_allocate(zoppsi(1:gr%np_part, 1:chi%d%dim))
954 do j = 1, no_parameters
963 if (
allocated(hm%ep%a_static))
then
965 zoppsi, ik, hm%ep%gyromagnetic_ratio, hm%ep%a_static)
968 zoppsi, ik, hm%ep%gyromagnetic_ratio)
972 dl(j) = dl(j) +
zmf_dotp(gr, psi%d%dim, zpsi, zoppsi)
988 dq(j) = dq(j) +
zmf_dotp(gr, psi%d%dim, zpsi, zoppsi)
998 safe_deallocate_a(zpsi)
999 safe_deallocate_a(zoppsi)
1020 subroutine update_field(iter, cp, space, gr, hm, ext_partners, ions, qcpsi, qcchi, cpp, dir)
1021 class(
space_t),
intent(in) :: space
1022 integer,
intent(in) :: iter
1024 type(
grid_t),
intent(inout) :: gr
1027 type(
ions_t),
intent(in) :: ions
1031 character(len=1),
intent(in) :: dir
1033 complex(real64) :: d1, pol(3)
1034 complex(real64),
allocatable :: dl(:), dq(:), zpsi(:, :), zchi(:, :)
1035 real(real64),
allocatable :: d(:)
1036 integer :: j, no_parameters, iatom
1038 real(real64),
pointer :: q(:, :)
1049 safe_allocate(dl(1:no_parameters))
1050 safe_allocate(dq(1:no_parameters))
1051 safe_allocate( d(1:no_parameters))
1055 if(
associated(lasers))
then
1056 call calculate_g(space, gr, hm, lasers, psi, chi, dl, dq)
1061 safe_allocate(zpsi(1:gr%np, 1:psi%d%dim))
1062 safe_allocate(zchi(1:gr%np, 1:chi%d%dim))
1067 d1 =
zmf_dotp(gr, psi%d%dim, zpsi, zchi)
1068 do j = 1, no_parameters
1072 safe_deallocate_a(zpsi)
1073 safe_deallocate_a(zchi)
1075 elseif (gradients_)
then
1076 do j = 1, no_parameters
1077 d(j) =
m_two * aimag(dl(j))
1080 do j = 1, no_parameters
1086 if (dir ==
'b' .and.
associated(lasers))
then
1088 do iatom = 1, ions%natoms
1089 d(1) = d(1) - ions%charge(iatom) * real(sum(pol(1:ions%space%dim)*q(iatom, 1:ions%space%dim)), real64)
1094 if (dir ==
'f')
then
1103 safe_deallocate_a(d)
1104 safe_deallocate_a(dl)
1105 safe_deallocate_a(dq)
1112 subroutine oct_prop_init(prop, namespace, dirname, mesh, mc)
1115 character(len=*),
intent(in) :: dirname
1116 class(
mesh_t),
intent(in) :: mesh
1123 prop%dirname = dirname
1125 prop%number_checkpoints = number_checkpoints_
1132 safe_allocate(prop%iter(1:prop%number_checkpoints+2))
1134 do j = 1, prop%number_checkpoints
1135 prop%iter(j+1) = nint(real(niter_, real64) /(prop%number_checkpoints+1) * j)
1137 prop%iter(prop%number_checkpoints+2) = niter_
1153 safe_deallocate_a(prop%iter)
1162 subroutine oct_prop_check(prop, namespace, space, psi, mesh, kpoints, iter)
1165 class(
space_t),
intent(in) :: space
1167 class(
mesh_t),
intent(in) :: mesh
1169 integer,
intent(in) :: iter
1172 character(len=80) :: dirname
1174 complex(real64) :: overlap, prev_overlap
1175 real(real64),
parameter :: WARNING_THRESHOLD = 1.0e-2_real64
1179 do j = 1, prop%number_checkpoints + 2
1180 if (prop%iter(j) == iter)
then
1182 write(dirname,
'(a, i4.4)') trim(prop%dirname), j
1185 call states_elec_load(prop%restart_load, namespace, space, stored_st, mesh, kpoints, ierr, verbose=.false.)
1188 message(1) =
"Unable to read wavefunctions from '"//trim(dirname)//
"'."
1194 if (abs(overlap - prev_overlap) > warning_threshold)
then
1195 write(
message(1),
'(a,es13.4)') &
1196 "Forward-backward propagation produced an error of", abs(overlap-prev_overlap)
1197 write(
message(2),
'(a,i8)')
"Iter = ", iter
1201 if (prop%number_checkpoints > 0)
then
1216 class(
space_t),
intent(in) :: space
1217 integer,
intent(in) :: iter
1219 class(
mesh_t),
intent(in) :: mesh
1221 integer,
intent(out) :: ierr
1224 character(len=80) :: dirname
1235 if (
debug%info)
then
1236 message(1) =
"Debug: Writing OCT propagation states restart."
1240 do j = 1, prop%number_checkpoints + 2
1241 if (prop%iter(j) == iter)
then
1242 write(dirname,
'(a,i4.4)') trim(prop%dirname), j
1245 call states_elec_dump(prop%restart_dump, space, psi, mesh, kpoints, err, iter, verbose = .false.)
1248 message(1) =
"Unable to write wavefunctions to '"//trim(dirname)//
"'."
1256 if (
debug%info)
then
1257 message(1) =
"Debug: Writing OCT propagation states restart done."
1270 class(
space_t),
intent(in) :: space
1272 class(
mesh_t),
intent(in) :: mesh
1274 integer,
intent(in) :: iter
1275 integer,
intent(out) :: ierr
1278 character(len=80) :: dirname
1290 if (
debug%info)
then
1291 message(1) =
"Debug: Reading OCT propagation states restart."
1295 do j = 1, prop%number_checkpoints + 2
1296 if (prop%iter(j) == iter)
then
1297 write(dirname,
'(a, i4.4)') trim(prop%dirname), j
1300 call states_elec_load(prop%restart_load, namespace, space, psi, mesh, kpoints, err, verbose=.false.)
1303 message(1) =
"Unable to read wavefunctions from '"//trim(dirname)//
"'."
1311 if (
debug%info)
then
1312 message(1) =
"Debug: Reading OCT propagation states restart done."
1322 type(
laser_t),
intent(in) :: laser
1323 class(
mesh_t),
intent(in) :: mesh
1324 class(
space_t),
intent(in) :: space
1325 complex(real64),
intent(inout) :: psi(:,:)
1326 complex(real64),
intent(inout) :: hpsi(:,:)
1329 logical :: vector_potential, magnetic_field
1331 real(real64) :: a_field(3), a_field_prime(3), bb(3), b_prime(3)
1332 real(real64),
allocatable :: aa(:, :), a_prime(:, :)
1338 vector_potential = .false.
1339 magnetic_field = .false.
1344 if (.not.
allocated(aa))
then
1345 safe_allocate(aa(1:mesh%np_part, 1:space%dim))
1347 safe_allocate(a_prime(1:mesh%np_part, 1:space%dim))
1355 magnetic_field = .
true.
1358 call laser_field(laser, a_field_prime(1:space%dim))
1359 a_field = a_field + a_field_prime
1363 if (magnetic_field)
then
1365 hpsi(ip, :) = hpsi(ip, :) +
m_half * &
1366 dot_product(aa(ip, 1:space%dim), aa(ip, 1:space%dim)) * psi(ip, :) /
p_c**2
1368 safe_deallocate_a(aa)
1369 safe_deallocate_a(a_prime)
1371 if (vector_potential)
then
1373 hpsi(ip, :) = hpsi(ip, :) +
m_half * &
1374 dot_product(a_field(1:space%dim), a_field(1:space%dim))*psi(ip, :) /
p_c**2
1383 type(
laser_t),
intent(in) :: laser
1386 complex(real64),
intent(inout) :: psi(:,:)
1387 complex(real64),
intent(inout) :: hpsi(:,:)
1388 integer,
intent(in) :: ik
1389 real(real64),
intent(in) :: gyromagnetic_ratio
1390 real(real64),
optional,
intent(in) :: a_static(:,:)
1393 logical :: electric_field, vector_potential, magnetic_field
1394 complex(real64),
allocatable :: grad(:, :, :), lhpsi(:, :)
1396 real(real64) :: a_field(3), a_field_prime(3), bb(3), b_prime(3)
1398 real(real64),
allocatable :: vv(:), pot(:), aa(:, :), a_prime(:, :)
1404 electric_field = .false.
1405 vector_potential = .false.
1406 magnetic_field = .false.
1410 if (.not.
allocated(vv))
then
1411 safe_allocate(vv(1:der%mesh%np))
1415 electric_field = .
true.
1418 if (.not.
allocated(vv))
then
1419 safe_allocate(vv(1:der%mesh%np))
1421 safe_allocate(pot(1:der%mesh%np))
1426 electric_field = .
true.
1427 safe_deallocate_a(pot)
1430 if (.not.
allocated(aa))
then
1431 safe_allocate(aa(1:der%mesh%np_part, 1:der%dim))
1433 safe_allocate(a_prime(1:der%mesh%np_part, 1:der%dim))
1441 magnetic_field = .
true.
1445 a_field = a_field + a_field_prime
1446 vector_potential = .
true.
1449 if (electric_field)
then
1450 do idim = 1, std%dim
1451 hpsi(1:der%mesh%np, idim)= hpsi(1:der%mesh%np, idim) + vv(1:der%mesh%np) * psi(1:der%mesh%np, idim)
1453 safe_deallocate_a(vv)
1456 if (magnetic_field)
then
1457 safe_allocate(grad(1:der%mesh%np_part, 1:der%dim, 1:std%dim))
1459 do idim = 1, std%dim
1471 if (
present(a_static))
then
1472 do ip = 1, der%mesh%np
1473 hpsi(ip, :) = hpsi(ip, :) - dot_product(aa(ip, 1:der%dim), a_static(ip, 1:der%dim)) * psi(ip, :) /
p_c
1477 select case (std%ispin)
1479 do ip = 1, der%mesh%np
1480 hpsi(ip, 1) = hpsi(ip, 1) -
m_zi * dot_product(aa(ip, 1:der%dim), grad(ip, 1:der%dim, 1)) /
p_c
1483 do ip = 1, der%mesh%np
1484 do idim = 1, std%dim
1485 hpsi(ip, idim) = hpsi(ip, idim) -
m_zi * &
1486 dot_product(aa(ip, 1:der%dim), grad(ip, 1:der%dim, idim)) /
p_c
1492 select case (std%ispin)
1494 safe_allocate(lhpsi(1:der%mesh%np, 1:std%dim))
1495 if (modulo(ik+1, 2) == 0)
then
1496 lhpsi(1:der%mesh%np, 1) = -
m_half /
p_c * norm2(bb) * psi(1:der%mesh%np, 1)
1498 lhpsi(1:der%mesh%np, 1) = +
m_half /
p_c * norm2(bb) * psi(1:der%mesh%np, 1)
1500 hpsi(1:der%mesh%np, :) = hpsi(1:der%mesh%np, :) + (gyromagnetic_ratio *
m_half) * lhpsi(1:der%mesh%np, :)
1501 safe_deallocate_a(lhpsi)
1504 safe_allocate(lhpsi(1:der%mesh%np, 1:std%dim))
1505 lhpsi(1:der%mesh%np, 1) =
m_half /
p_c * (bb(3) * psi(1:der%mesh%np, 1) &
1506 + (bb(1) -
m_zi * bb(2)) * psi(1:der%mesh%np, 2))
1507 lhpsi(1:der%mesh%np, 2) =
m_half /
p_c * (-bb(3) * psi(1:der%mesh%np, 2) &
1508 + (bb(1) +
m_zi * bb(2)) * psi(1:der%mesh%np, 1))
1509 hpsi(1:der%mesh%np, :) = hpsi(1:der%mesh%np, :) + (gyromagnetic_ratio *
m_half) * lhpsi(1:der%mesh%np, :)
1510 safe_deallocate_a(lhpsi)
1513 safe_deallocate_a(grad)
1514 safe_deallocate_a(aa)
1515 safe_deallocate_a(a_prime)
1518 if (vector_potential)
then
1519 safe_allocate(grad(1:der%mesh%np_part, 1:der%dim, 1:std%dim))
1521 do idim = 1, std%dim
1525 select case (std%ispin)
1527 do ip = 1, der%mesh%np
1528 hpsi(ip, 1) = hpsi(ip, 1) -
m_zi * dot_product(a_field(1:der%dim), grad(ip, 1:der%dim, 1)) /
p_c
1531 do ip = 1, der%mesh%np
1532 do idim = 1, std%dim
1533 hpsi(ip, idim) = hpsi(ip, idim) -
m_zi * &
1534 dot_product(a_field(1:der%dim), grad(ip, 1:der%dim, idim)) /
p_c
1538 safe_deallocate_a(grad)
batchified version of the BLAS axpy routine:
scale a batch by a constant or vector
constant times a vector plus a vector
integer, parameter, public mask_absorbing
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
subroutine, public batch_set_zero(this, np, async)
fill all mesh functions of the batch with zero
This module contains the definition of the data type that holds a "control function" used for OCT run...
subroutine, public controlfunction_to_h_val(cp, ext_partners, val)
subroutine, public controlfunction_to_realtime(par)
subroutine, public controlfunction_update(cp, cpp, dir, iter, mu, dd, dq)
Update the control function(s) given in "cp", according to the formula cp = (1 - mu) * cpp + mu * dd ...
subroutine, public controlfunction_end(cp)
real(real64) pure function, public controlfunction_alpha(par, ipar)
integer pure function, public controlfunction_number(par)
subroutine, public controlfunction_copy(cp_out, cp_in)
subroutine, public controlfunction_to_h(cp, ext_partners)
subroutine, public controlfunction_to_basis(par)
type(debug_t), save, public debug
This module implements a calculator for the density and defines related functions.
subroutine, public density_calc(st, gr, density, istin)
Computes the density from the orbitals in st.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public zderivatives_grad(der, ff, op_ff, ghost_update, set_bc, to_cartesian)
apply the gradient to a mesh function
integer, parameter, public unpolarized
Parameters...
integer, parameter, public spinors
integer, parameter, public spin_polarized
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 epot_precalc_local_potential(ep, namespace, gr, ions)
logical function, public list_has_gauge_field(partners)
type(lasers_t) function, pointer, public list_get_lasers(partners)
subroutine, public forces_costate_calculate(gr, namespace, ions, hm, psi, chi, ff, qq)
subroutine, public forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old, t, dt)
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
complex(real64), parameter, public m_z0
complex(real64), parameter, public m_zi
complex(real64), parameter, public m_z1
real(real64), parameter, public m_half
real(real64), parameter, public p_c
Electron gyromagnetic ratio, see Phys. Rev. Lett. 130, 071801 (2023)
This module implements the underlying real-space grid.
subroutine, public hamiltonian_elec_set_inh(hm, st)
subroutine, public zvmask(mesh, hm, st)
subroutine, public hamiltonian_elec_adjoint(hm)
integer, parameter, public independent_particles
subroutine, public hamiltonian_elec_epot_generate(this, namespace, space, gr, ions, ext_partners, st, time)
subroutine, public hamiltonian_elec_remove_inh(hm)
subroutine, public hamiltonian_elec_not_adjoint(hm)
This module defines classes and functions for interaction partners.
subroutine, public ion_dynamics_verlet_step2(ions, v, fold, fnew, dt)
A bare verlet integrator.
subroutine, public ion_dynamics_verlet_step1(ions, q, v, fold, dt)
A bare verlet integrator.
subroutine, public ion_dynamics_restore_state(this, ions, state)
subroutine, public ion_dynamics_propagate(this, ions, time, dt, namespace)
subroutine, public ion_dynamics_save_state(this, ions, state)
logical pure function, public ion_dynamics_ions_move(this)
subroutine, public ion_dynamics_unfreeze(this)
Unfreezes the ionic movement.
logical function, public ion_dynamics_freeze(this)
Freezes the ionic movement.
complex(real64) function, dimension(3), public laser_polarization(laser)
subroutine, public laser_vector_potential(laser, mesh, aa, time)
integer, parameter, public e_field_electric
integer, parameter, public e_field_vector_potential
subroutine, public laser_potential(laser, mesh, pot, time)
integer, parameter, public e_field_scalar_potential
integer pure elemental function, public laser_kind(laser)
subroutine, public laser_field(laser, field, time)
Retrieves the value of either the electric or the magnetic field. If the laser is given by a scalar p...
integer, parameter, public e_field_magnetic
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_warning(no_lines, all_nodes, namespace)
subroutine, public messages_info(no_lines, iunit, verbose_limit, stress, all_nodes, namespace)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
logical function mpi_grp_is_root(grp)
Is the current MPI process of grpcomm, root.
type(mpi_grp_t), public mpi_world
This module handles the communicators for the various parallelization strategies.
subroutine, public oct_exchange_remove(this)
subroutine, public oct_exchange_set(this, st, mesh)
This module holds the "opt_control_state_t" datatype, which contains a quantum-classical state.
real(real64) function, dimension(:, :), pointer, public opt_control_point_p(ocs)
subroutine, public opt_control_set_classical(ions, ocs)
real(real64) function, dimension(:, :), pointer, public opt_control_point_q(ocs)
type(states_elec_t) function, pointer, public opt_control_point_qs(ocs)
subroutine, public opt_control_state_null(ocs)
subroutine, public opt_control_state_copy(ocsout, ocsin)
subroutine, public opt_control_get_classical(ions, ocs)
subroutine, public propagation_mod_init(niter, eta, delta, number_checkpoints, zbr98, gradients)
This subroutine must be called before any QOCT propagations are done. It simply stores in the module ...
subroutine, public oct_prop_end(prop)
subroutine update_hamiltonian_elec_chi(iter, namespace, space, gr, ks, hm, ext_partners, td, tg, par_chi, ions, st, qtildehalf)
subroutine update_hamiltonian_elec_psi(iter, namespace, space, gr, ks, hm, ext_partners, td, tg, par, st, ions)
subroutine oct_prop_load_states(prop, namespace, space, psi, mesh, kpoints, iter, ierr)
subroutine, public bwd_step(sys, td, tg, par, par_chi, qcchi, prop_chi, prop_psi)
subroutine update_field(iter, cp, space, gr, hm, ext_partners, ions, qcpsi, qcchi, cpp, dir)
Calculates the value of the control functions at iteration iter, from the state psi and the Lagrange-...
subroutine vlaser_operator_linear(laser, der, std, psi, hpsi, ik, gyromagnetic_ratio, a_static)
subroutine, public propagate_forward(sys, td, par, tg, qcpsi, prop, write_iter)
subroutine calculate_g(space, gr, hm, lasers, psi, chi, dl, dq)
subroutine, public oct_prop_check(prop, namespace, space, psi, mesh, kpoints, iter)
subroutine, public fwd_step(sys, td, tg, par, par_chi, qcpsi, prop_chi, prop_psi)
subroutine, public propagate_backward(sys, td, qcpsi, prop)
subroutine vlaser_operator_quadratic(laser, mesh, space, psi, hpsi)
subroutine, public oct_prop_init(prop, namespace, dirname, mesh, mc)
subroutine oct_prop_dump_states(prop, space, iter, psi, mesh, kpoints, ierr)
subroutine, public bwd_step_2(sys, td, tg, par, par_chi, qcchi, prop_chi, prop_psi)
integer, parameter, public prop_explicit_runge_kutta4
subroutine, public propagator_elec_copy(tro, tri)
subroutine, public propagator_elec_run_zero_iter(hm, gr, tr)
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)
subroutine, public propagator_elec_end(tr)
integer, parameter, public restart_oct
subroutine, public restart_init(restart, namespace, data_type, type, mc, ierr, mesh, dir, exact)
Initializes a restart object.
integer, parameter, public restart_type_dump
logical pure function, public restart_skip(restart)
Returns true if the restart information should neither be read nor written. This might happen because...
subroutine, public restart_open_dir(restart, dirname, ierr)
Change the restart directory to dirname, where "dirname" is a subdirectory of the base restart direct...
integer, parameter, public restart_type_load
subroutine, public restart_end(restart)
subroutine, public restart_close_dir(restart)
Change back to the base directory. To be called after restart_open_dir.
This module handles spin dimensions of the states and the k-point distribution.
subroutine, public states_elec_end(st)
finalize the states_elec_t object
subroutine, public states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special)
make a (selective) copy of a states_elec_t object
This module handles reading and writing restart information for the states_elec_t.
subroutine, public states_elec_dump(restart, space, st, mesh, kpoints, ierr, iter, lr, st_start_writing, 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...
logical pure function, public target_move_ions(tg)
integer, parameter, public oct_tg_hhgnew
integer, parameter, public oct_targetmode_td
subroutine, public target_init_propagation(tg)
This routine performs all the things that must be initialized prior to a forward evolution,...
integer, parameter, public oct_tg_velocity
integer pure function, public target_type(tg)
subroutine, public target_inh(psi, gr, kpoints, tg, time, inh, iter)
Calculates the inhomogeneous term that appears in the equation for chi, and places it into inh.
subroutine, public target_tdcalc(tg, namespace, space, hm, gr, ions, ext_partners, psi, time, max_time)
Calculates, at a given point in time marked by the integer index, the integrand of the target functio...
integer pure function, public target_mode(tg)
subroutine, public td_write_data(writ)
subroutine, public td_write_end(writ)
subroutine, public td_write_iter(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, kick, ks, dt, iter, mc, recalculate_gs)
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)
Initialize files to write when prograting in time.
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
This is the data type used to hold a control function.
class representing derivatives
Extension of space that contains the knowledge of the spin dimension.
Class describing the electron system.
Description of the grid, containing information on derivatives, stencil, and symmetries.
Describes mesh distribution to nodes.
Stores all communicators and groups.
This is the datatype that contains the objects that are propagated: in principle this could be both t...
class for organizing spins and k-points
The states_elec_t class contains all electronic wave functions.