43 use,
intrinsic :: iso_fortran_env
92 integer :: number_checkpoints
93 integer,
allocatable :: iter(:)
95 character(len=100) :: dirname
96 type(restart_t) :: restart_load
97 type(restart_t) :: restart_dump
103 integer :: number_checkpoints_
105 real(real64) :: delta_
107 logical :: gradients_
117 integer,
intent(in) :: niter
118 real(real64),
intent(in) :: eta
119 real(real64),
intent(in) :: delta
120 integer,
intent(in) :: number_checkpoints
121 logical,
intent(in) :: zbr98
122 logical,
intent(in) :: gradients
124 assert(.not. (zbr98 .and. gradients))
131 number_checkpoints_ = number_checkpoints
133 gradients_ = gradients
146 type(electrons_t),
intent(inout) :: sys
147 type(td_t),
intent(inout) :: td
148 type(controlfunction_t),
intent(in) :: par
149 class(target_t),
intent(inout) :: tg
150 type(opt_control_state_t),
intent(inout) :: qcpsi
151 type(oct_prop_t),
optional,
intent(inout) :: prop
152 logical,
optional,
intent(in) :: write_iter
154 integer :: ii, istep, ierr
155 logical :: write_iter_
156 type(td_write_t) :: write_handler
157 real(real64),
allocatable :: x_initial(:,:)
158 logical :: vel_target_
159 type(states_elec_t),
pointer :: psi
161 real(real64) :: init_time, final_time
165 message(1) =
"Info: Forward propagation."
170 vel_target_ = .false.
174 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%pack()
177 if (write_iter_)
then
178 call td_write_init(write_handler, sys%namespace, sys%space, sys%outp, sys%gr, sys%st, sys%hm, &
179 sys%ions, sys%ext_partners, sys%ks, td%ions_dyn%ions_move(), &
181 td%dt, sys%mc, sys%dmp)
189 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners, time =
m_zero)
190 call sys%hm%ks_pot%run_zero_iter(td%tr%vks_old)
191 if (td%ions_dyn%ions_move())
then
193 sys%ext_partners, psi, time =
m_zero)
194 call forces_calculate(sys%gr, sys%namespace, sys%ions, sys%hm, sys%ext_partners, psi, sys%ks, t =
m_zero, dt = td%dt)
203 safe_allocate_source_a(x_initial, sys%ions%pos)
206 sys%ions%tot_force =
m_zero
211 call target_tdcalc(tg, sys%namespace, sys%space, sys%hm, sys%gr, sys%ions, sys%ext_partners, psi, 0, td%max_iter)
213 if (
present(prop))
then
216 message(1) =
"Unable to write OCT states restart."
225 do istep = 1, td%max_iter
228 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, istep*td%dt, td%dt, istep, &
229 td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
231 if (
present(prop))
then
234 message(1) =
"Unable to write OCT states restart."
240 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners, time = istep*td%dt)
241 call energy_calc_total(sys%namespace, sys%space, sys%hm, sys%gr, psi, sys%ext_partners)
246 call target_tdcalc(tg, sys%namespace, sys%space, sys%hm, sys%gr, sys%ions, sys%ext_partners, psi, istep, td%max_iter)
249 if (write_iter_)
then
250 call td_write_iter(write_handler, sys%namespace, sys%space, sys%outp, sys%gr, psi, sys%hm, sys%ions, &
251 sys%ext_partners, sys%hm%kick, sys%ks, td%dt, istep, sys%mc, sys%td%recalculate_gs, sys%dmp%adiabatic_st)
253 if (any(ii == sys%outp%output_interval + 1) .or. istep == td%max_iter)
then
254 if (istep == td%max_iter) sys%outp%output_interval = ii - 1
260 if ((mod(istep, 100) == 0) .and. sys%st%system_grp%is_root())
call loct_progress_bar(istep, td%max_iter)
262 if (sys%st%system_grp%is_root())
write(stdout,
'(1x)')
265 write(
message(1),
'(a,f12.2,a)')
'Propagation time: ', final_time - init_time,
' seconds.'
268 if (vel_target_)
then
269 sys%ions%pos = x_initial
270 safe_deallocate_a(x_initial)
276 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%unpack()
289 type(
td_t),
intent(inout) :: td
293 integer :: istep, ierr
298 message(1) =
"Info: Backward propagation."
302 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%pack()
308 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
309 call sys%hm%ks_pot%run_zero_iter(td%tr%vks_old)
313 message(1) =
"Unable to write OCT states restart."
319 do istep = td%max_iter, 1, -1
320 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, &
321 (istep - 1)*td%dt, -td%dt, istep-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
325 message(1) =
"Unable to write OCT states restart."
329 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
330 if (mod(istep, 100) == 0 .and. sys%st%system_grp%is_root())
call loct_progress_bar(td%max_iter - istep + 1, td%max_iter)
333 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%unpack()
353 subroutine fwd_step(sys, td, tg, par, par_chi, qcpsi, prop_chi, prop_psi)
355 type(
td_t),
intent(inout) :: td
356 class(
target_t),
intent(inout) :: tg
364 logical :: aux_fwd_propagation
373 message(1) =
"Info: Forward propagation."
391 .not. sys%ks%frozen_hxc))
392 if (aux_fwd_propagation)
then
395 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi2%pack()
400 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
401 call sys%hm%ks_pot%run_zero_iter(td%tr%vks_old)
402 call sys%hm%ks_pot%run_zero_iter(tr_chi%vks_old)
403 if (aux_fwd_propagation)
then
405 call sys%hm%ks_pot%run_zero_iter(tr_psi2%vks_old)
410 message(1) =
"Unable to write OCT states restart."
413 call oct_prop_load_states(prop_chi, sys%namespace, sys%space, chi, sys%gr, sys%kpoints, 0, ierr)
415 message(1) =
"Unable to read OCT states restart."
419 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%pack()
420 if (sys%st%pack_states .and. sys%hm%apply_packed())
call chi%pack()
422 do i = 1, td%max_iter
423 call update_field(i, par, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par_chi, dir =
'f')
425 td, tg, par_chi, sys%ions, psi2)
426 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners, time = (i - 1)*td%dt)
427 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, chi, tr_chi, i*td%dt, td%dt, i, &
428 td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
429 if (aux_fwd_propagation)
then
431 td, tg, par_prev, psi2, sys%ions)
432 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi2, tr_psi2, i*td%dt, td%dt, i, &
433 td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
436 sys%ext_partners, td, tg, par, psi, sys%ions)
437 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners, time = (i - 1)*td%dt)
438 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, i*td%dt, td%dt, i, &
439 td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
440 call target_tdcalc(tg, sys%namespace, sys%space, sys%hm, sys%gr, sys%ions, sys%ext_partners, psi, i, td%max_iter)
444 message(1) =
"Unable to write OCT states restart."
447 call oct_prop_check(prop_chi, sys%namespace, sys%space, chi, sys%gr, sys%kpoints, i)
449 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')
452 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
464 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%unpack()
481 subroutine bwd_step(sys, td, tg, par, par_chi, qcchi, prop_chi, prop_psi)
483 type(
td_t),
intent(inout) :: td
484 class(
target_t),
intent(inout) :: tg
498 message(1) =
"Info: Backward propagation."
513 call oct_prop_load_states(prop_psi, sys%namespace, sys%space, psi, sys%gr, sys%kpoints, td%max_iter, ierr)
515 message(1) =
"Unable to read OCT states restart."
518 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%pack()
519 if (sys%st%pack_states .and. sys%hm%apply_packed())
call chi%pack()
522 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
523 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners)
524 call sys%hm%ks_pot%run_zero_iter(td%tr%vks_old)
525 call sys%hm%ks_pot%run_zero_iter(tr_chi%vks_old)
530 message(1) =
"Unable to write OCT states restart."
534 do i = td%max_iter, 1, -1
535 call oct_prop_check(prop_psi, sys%namespace, sys%space, psi, sys%gr, sys%kpoints, i)
536 call update_field(i, par_chi, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par, dir =
'b')
538 td, tg, par_chi, sys%ions, psi)
539 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners, time = abs(i*td%dt))
540 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, chi, tr_chi, abs((i-1)*td%dt), td%dt, &
541 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
544 message(1) =
"Unable to write OCT states restart."
548 td, tg, par, psi, sys%ions)
549 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners, time = abs(i*td%dt))
550 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, abs((i-1)*td%dt), td%dt, &
551 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
554 call update_field(0, par_chi, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par, dir =
'b')
557 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
558 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners)
563 if (sys%st%pack_states .and. sys%hm%apply_packed())
call chi%unpack()
583 subroutine bwd_step_2(sys, td, tg, par, par_chi, qcchi, prop_chi, prop_psi)
585 type(
td_t),
intent(inout) :: td
586 class(
target_t),
intent(inout) :: tg
593 integer :: i, ierr, ik, ib
599 real(real64),
pointer :: q(:, :), p(:, :)
600 real(real64),
allocatable :: qtildehalf(:, :), qinitial(:, :)
601 real(real64),
allocatable :: vhxc(:, :)
602 real(real64),
allocatable :: fold(:, :), fnew(:, :)
603 type(
ion_state_t) :: ions_state_initial, ions_state_final
605 real(real64) :: init_time, final_time
612 safe_allocate(qtildehalf(1:sys%ions%natoms, 1:sys%ions%space%dim))
613 safe_allocate(qinitial(1:sys%ions%space%dim, 1:sys%ions%natoms))
624 call oct_prop_load_states(prop_psi, sys%namespace, sys%space, psi, sys%gr, sys%kpoints, td%max_iter, ierr)
626 message(1) =
"Unable to read OCT states restart."
630 safe_allocate(vhxc(1:sys%gr%np, 1:sys%hm%d%nspin))
633 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
634 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners)
635 call sys%hm%ks_pot%run_zero_iter(td%tr%vks_old)
636 call sys%hm%ks_pot%run_zero_iter(tr_chi%vks_old)
640 message(1) =
"Unable to write OCT states restart."
645 if (sys%st%pack_states .and. sys%hm%apply_packed())
call psi%pack()
646 if (sys%st%pack_states .and. sys%hm%apply_packed())
call st_ref%pack()
648 if (td%ions_dyn%ions_move())
then
649 call forces_calculate(sys%gr, sys%namespace, sys%ions, sys%hm, sys%ext_partners, &
650 psi, sys%ks, t = td%max_iter*abs(td%dt), dt = td%dt)
653 message(1) =
"Info: Backward propagation."
659 do i = td%max_iter, 1, -1
661 call oct_prop_check(prop_psi, sys%namespace, sys%space, psi, sys%gr, sys%kpoints, i)
662 call update_field(i, par_chi, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par, dir =
'b')
664 select case (td%tr%method)
669 td, tg, par, psi, sys%ions)
670 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, abs((i-1)*td%dt), td%dt, &
671 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler, qcchi = qcchi)
675 if (td%ions_dyn%ions_move())
then
680 qinitial = sys%ions%pos
683 safe_allocate(fold(1:sys%ions%natoms, 1:sys%ions%space%dim))
684 safe_allocate(fnew(1:sys%ions%natoms, 1:sys%ions%space%dim))
691 if (td%ions_dyn%cell_relax())
then
699 td, tg, par, psi, sys%ions)
701 do ik = psi%d%kpt%start, psi%d%kpt%end
702 do ib = psi%group%block_start, psi%group%block_end
703 call psi%group%psib(ib, ik)%copy_data_to(sys%gr%np, st_ref%group%psib(ib, ik))
707 vhxc(:, :) = sys%hm%ks_pot%vhxc(:, :)
708 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, abs((i-1)*td%dt), td%dt, &
709 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
711 if (td%ions_dyn%ions_move())
then
713 sys%ions%pos = qinitial
715 sys%ext_partners, psi, time = abs((i-1)*td%dt))
718 do ik = psi%d%kpt%start, psi%d%kpt%end
719 do ib = psi%group%block_start, psi%group%block_end
721 cmplx(
m_half,
m_zero, real64), st_ref%group%psib(ib, ik))
725 sys%hm%ks_pot%vhxc(:, :) =
m_half * (sys%hm%ks_pot%vhxc(:, :) + vhxc(:, :))
727 td, tg, par, sys%ions, st_ref, qtildehalf)
729 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, chi, tr_chi, abs((i-1)*td%dt), td%dt, &
730 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
733 if (td%ions_dyn%ions_move())
then
736 sys%ext_partners, psi, time = abs((i-1)*td%dt))
737 call forces_calculate(sys%gr, sys%namespace, sys%ions, sys%hm, sys%ext_partners, &
738 psi, sys%ks, t = abs((i-1)*td%dt), dt = td%dt)
741 safe_deallocate_a(fold)
742 safe_deallocate_a(fnew)
745 sys%hm%ks_pot%vhxc(:, :) = vhxc(:, :)
751 message(1) =
"Unable to write OCT states restart."
755 if ((mod(i, 100) == 0).and. sys%st%system_grp%is_root())
call loct_progress_bar(td%max_iter-i, td%max_iter)
757 if (sys%st%system_grp%is_root())
then
759 write(stdout,
'(1x)')
763 write(
message(1),
'(a,f12.2,a)')
'Propagation time: ', final_time - init_time,
' seconds.'
770 td, tg, par, psi, sys%ions)
771 call update_field(0, par_chi, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par, dir =
'b')
774 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
775 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners)
779 safe_deallocate_a(vhxc)
786 safe_deallocate_a(qtildehalf)
787 safe_deallocate_a(qinitial)
796 subroutine update_hamiltonian_elec_chi(iter, namespace, space, gr, ks, hm, ext_partners, td, tg, par_chi, ions, st, qtildehalf)
797 integer,
intent(in) :: iter
799 class(
space_t),
intent(in) :: space
800 type(
grid_t),
intent(inout) :: gr
801 type(
v_ks_t),
intent(inout) :: ks
804 type(
td_t),
intent(inout) :: td
805 class(
target_t),
intent(inout) :: tg
807 type(
ions_t),
intent(in) :: ions
809 real(real64),
optional,
intent(in) :: qtildehalf(:, :)
813 integer :: j, iatom, idim
814 complex(real64),
allocatable :: dvpsi(:, :, :), zpsi(:, :), inhzpsi(:, :)
815 integer :: ist, ik, ib
819 assert(.not. st%parallel_in_states)
820 assert(.not. st%d%kpt%parallel)
824 call target_inh(st, gr, hm%kpoints, tg, abs(td%dt)*iter, inh, iter)
829 if (td%ions_dyn%ions_move())
then
830 assert(
present(qtildehalf))
833 safe_allocate(dvpsi(1:gr%np_part, 1:st%d%dim, 1:space%dim))
834 do ik = inh%d%kpt%start, inh%d%kpt%end
835 do ib = inh%group%block_start, inh%group%block_end
839 safe_allocate(zpsi(1:gr%np_part, 1:st%d%dim))
840 safe_allocate(inhzpsi(1:gr%np_part, 1:st%d%dim))
848 do iatom = 1, ions%natoms
849 call pert%setup_atom(iatom)
850 do idim = 1, space%dim
851 call pert%setup_dir(idim)
852 call pert%zapply(namespace, space, gr, hm, ik, zpsi(:, :), dvpsi(:, :, idim))
854 call lalg_axpy(gr%np, st%d%dim, -st%occ(ist, ik)*qtildehalf(iatom, idim), &
855 dvpsi(:, :, idim), inhzpsi(:, :))
858 safe_deallocate_p(pert)
863 safe_deallocate_a(zpsi)
864 safe_deallocate_a(inhzpsi)
865 safe_deallocate_a(dvpsi)
877 do j = iter - 2, iter + 2
878 if (j >= 0 .and. j <= td%max_iter)
then
891 subroutine update_hamiltonian_elec_psi(iter, namespace, space, gr, ks, hm, ext_partners, td, tg, par, st, ions)
892 integer,
intent(in) :: iter
895 type(
grid_t),
intent(inout) :: gr
896 type(
v_ks_t),
intent(inout) :: ks
899 type(
td_t),
intent(inout) :: td
900 class(
target_t),
intent(inout) :: tg
903 type(
ions_t),
intent(in) :: ions
913 if (td%ions_dyn%ions_move())
then
923 do j = iter - 2, iter + 2
924 if (j >= 0 .and. j <= td%max_iter)
then
930 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
931 call hm%update(gr, namespace, space, ext_partners)
940 subroutine calculate_g(space, gr, hm, lasers, psi, chi, dl, dq)
941 class(
space_t),
intent(in) :: space
942 type(
grid_t),
intent(inout) :: gr
944 type(
lasers_t),
intent(in) :: lasers
947 complex(real64),
intent(inout) :: dl(:), dq(:)
949 complex(real64),
allocatable :: zpsi(:, :), zoppsi(:, :)
950 integer :: no_parameters, j, ik, p
954 no_parameters = lasers%no_lasers
956 safe_allocate(zpsi(1:gr%np_part, 1:chi%d%dim))
957 safe_allocate(zoppsi(1:gr%np_part, 1:chi%d%dim))
959 do j = 1, no_parameters
968 if (
allocated(hm%ep%a_static))
then
970 zoppsi, ik, hm%ep%gyromagnetic_ratio, hm%ep%a_static)
973 zoppsi, ik, hm%ep%gyromagnetic_ratio)
977 dl(j) = dl(j) +
zmf_dotp(gr, psi%d%dim, zpsi, zoppsi)
993 dq(j) = dq(j) +
zmf_dotp(gr, psi%d%dim, zpsi, zoppsi)
1003 safe_deallocate_a(zpsi)
1004 safe_deallocate_a(zoppsi)
1025 subroutine update_field(iter, cp, space, gr, hm, ext_partners, ions, qcpsi, qcchi, cpp, dir)
1026 class(
space_t),
intent(in) :: space
1027 integer,
intent(in) :: iter
1029 type(
grid_t),
intent(inout) :: gr
1032 type(
ions_t),
intent(in) :: ions
1036 character(len=1),
intent(in) :: dir
1038 complex(real64) :: d1, pol(3)
1039 complex(real64),
allocatable :: dl(:), dq(:), zpsi(:, :), zchi(:, :)
1040 real(real64),
allocatable :: d(:)
1041 integer :: j, no_parameters, iatom
1043 real(real64),
pointer :: q(:, :)
1054 safe_allocate(dl(1:no_parameters))
1055 safe_allocate(dq(1:no_parameters))
1056 safe_allocate( d(1:no_parameters))
1060 if(
associated(lasers))
then
1061 call calculate_g(space, gr, hm, lasers, psi, chi, dl, dq)
1066 safe_allocate(zpsi(1:gr%np, 1:psi%d%dim))
1067 safe_allocate(zchi(1:gr%np, 1:chi%d%dim))
1072 d1 =
zmf_dotp(gr, psi%d%dim, zpsi, zchi)
1073 do j = 1, no_parameters
1077 safe_deallocate_a(zpsi)
1078 safe_deallocate_a(zchi)
1080 elseif (gradients_)
then
1081 do j = 1, no_parameters
1082 d(j) =
m_two * aimag(dl(j))
1085 do j = 1, no_parameters
1091 if (dir ==
'b' .and.
associated(lasers))
then
1093 do iatom = 1, ions%natoms
1094 d(1) = d(1) - ions%charge(iatom) * real(sum(pol(1:ions%space%dim)*q(iatom, 1:ions%space%dim)), real64)
1099 if (dir ==
'f')
then
1108 safe_deallocate_a(d)
1109 safe_deallocate_a(dl)
1110 safe_deallocate_a(dq)
1117 subroutine oct_prop_init(prop, namespace, dirname, mesh, mc)
1120 character(len=*),
intent(in) :: dirname
1121 class(
mesh_t),
intent(in) :: mesh
1128 prop%dirname = dirname
1130 prop%number_checkpoints = number_checkpoints_
1137 safe_allocate(prop%iter(1:prop%number_checkpoints+2))
1139 do j = 1, prop%number_checkpoints
1140 prop%iter(j+1) = nint(real(niter_, real64) /(prop%number_checkpoints+1) * j)
1142 prop%iter(prop%number_checkpoints+2) = niter_
1155 call prop%restart_load%end()
1156 call prop%restart_dump%end()
1158 safe_deallocate_a(prop%iter)
1167 subroutine oct_prop_check(prop, namespace, space, psi, mesh, kpoints, iter)
1170 class(
space_t),
intent(in) :: space
1172 class(
mesh_t),
intent(in) :: mesh
1174 integer,
intent(in) :: iter
1177 character(len=80) :: dirname
1179 complex(real64) :: overlap, prev_overlap
1180 real(real64),
parameter :: WARNING_THRESHOLD = 1.0e-2_real64
1184 do j = 1, prop%number_checkpoints + 2
1185 if (prop%iter(j) == iter)
then
1187 write(dirname,
'(a, i4.4)') trim(prop%dirname), j
1188 call prop%restart_load%open_dir(dirname, ierr)
1190 call states_elec_load(prop%restart_load, namespace, space, stored_st, mesh, kpoints, &
1191 fixed_occ=.
true., ierr=ierr, verbose=.false.)
1194 message(1) =
"Unable to read wavefunctions from '"//trim(dirname)//
"'."
1197 call prop%restart_load%close_dir()
1200 if (abs(overlap - prev_overlap) > warning_threshold)
then
1201 write(
message(1),
'(a,es13.4)') &
1202 "Forward-backward propagation produced an error of", abs(overlap-prev_overlap)
1203 write(
message(2),
'(a,i8)')
"Iter = ", iter
1207 if (prop%number_checkpoints > 0)
then
1222 class(
space_t),
intent(in) :: space
1223 integer,
intent(in) :: iter
1225 class(
mesh_t),
intent(in) :: mesh
1227 integer,
intent(out) :: ierr
1230 character(len=80) :: dirname
1236 if (prop%restart_dump%skip())
then
1241 message(1) =
"Debug: Writing OCT propagation states restart."
1244 do j = 1, prop%number_checkpoints + 2
1245 if (prop%iter(j) == iter)
then
1246 write(dirname,
'(a,i4.4)') trim(prop%dirname), j
1247 call prop%restart_dump%open_dir(dirname, err)
1249 call states_elec_dump(prop%restart_dump, space, psi, mesh, kpoints, err, iter, verbose = .false.)
1252 message(1) =
"Unable to write wavefunctions to '"//trim(dirname)//
"'."
1256 call prop%restart_dump%close_dir()
1260 message(1) =
"Debug: Writing OCT propagation states restart done."
1272 class(
space_t),
intent(in) :: space
1274 class(
mesh_t),
intent(in) :: mesh
1276 integer,
intent(in) :: iter
1277 integer,
intent(out) :: ierr
1280 character(len=80) :: dirname
1286 if (prop%restart_load%skip())
then
1292 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
1298 call prop%restart_load%open_dir(dirname, err)
1300 call states_elec_load(prop%restart_load, namespace, space, psi, mesh, kpoints, &
1301 fixed_occ=.
true., ierr=err, verbose=.false.)
1304 message(1) =
"Unable to read wavefunctions from '"//trim(dirname)//
"'."
1308 call prop%restart_load%close_dir()
1312 message(1) =
"Debug: Reading OCT propagation states restart done."
1321 type(
laser_t),
intent(in) :: laser
1322 class(
mesh_t),
intent(in) :: mesh
1323 class(
space_t),
intent(in) :: space
1324 complex(real64),
intent(inout) :: psi(:,:)
1325 complex(real64),
intent(inout) :: hpsi(:,:)
1328 logical :: vector_potential, magnetic_field
1330 real(real64) :: a_field(3), a_field_prime(3), b_prime(3)
1331 real(real64),
allocatable :: aa(:, :), a_prime(:, :)
1337 vector_potential = .false.
1338 magnetic_field = .false.
1343 if (.not.
allocated(aa))
then
1344 safe_allocate(aa(1:mesh%np_part, 1:space%dim))
1346 safe_allocate(a_prime(1:mesh%np_part, 1:space%dim))
1353 magnetic_field = .
true.
1356 call laser_field(laser, a_field_prime(1:space%dim))
1357 a_field = a_field + a_field_prime
1358 vector_potential = .
true.
1361 if (magnetic_field)
then
1363 hpsi(ip, :) = hpsi(ip, :) +
m_half * &
1364 dot_product(aa(ip, 1:space%dim), aa(ip, 1:space%dim)) * psi(ip, :) /
p_c**2
1366 safe_deallocate_a(aa)
1367 safe_deallocate_a(a_prime)
1369 if (vector_potential)
then
1371 hpsi(ip, :) = hpsi(ip, :) +
m_half * &
1372 dot_product(a_field(1:space%dim), a_field(1:space%dim))*psi(ip, :) /
p_c**2
1381 type(
laser_t),
intent(in) :: laser
1384 complex(real64),
contiguous,
intent(inout) :: psi(:,:)
1385 complex(real64),
intent(inout) :: hpsi(:,:)
1386 integer,
intent(in) :: ik
1387 real(real64),
intent(in) :: gyromagnetic_ratio
1388 real(real64),
optional,
intent(in) :: a_static(:,:)
1391 logical :: electric_field, vector_potential, magnetic_field
1392 complex(real64),
allocatable :: grad(:, :, :), lhpsi(:, :)
1394 real(real64) :: a_field(3), a_field_prime(3), bb(3), b_prime(3)
1396 real(real64),
allocatable :: vv(:), pot(:), aa(:, :), a_prime(:, :)
1403 electric_field = .false.
1404 vector_potential = .false.
1405 magnetic_field = .false.
1409 if (.not.
allocated(vv))
then
1410 safe_allocate(vv(1:der%mesh%np))
1414 electric_field = .
true.
1417 if (.not.
allocated(vv))
then
1418 safe_allocate(vv(1:der%mesh%np))
1420 safe_allocate(pot(1:der%mesh%np))
1425 electric_field = .
true.
1426 safe_deallocate_a(pot)
1429 if (.not.
allocated(aa))
then
1430 safe_allocate(aa(1:der%mesh%np_part, 1:der%dim))
1432 safe_allocate(a_prime(1:der%mesh%np_part, 1:der%dim))
1440 magnetic_field = .
true.
1444 a_field = a_field + a_field_prime
1445 vector_potential = .
true.
1448 if (electric_field)
then
1449 do idim = 1, std%dim
1450 hpsi(1:der%mesh%np, idim)= hpsi(1:der%mesh%np, idim) + vv(1:der%mesh%np) * psi(1:der%mesh%np, idim)
1452 safe_deallocate_a(vv)
1455 if (magnetic_field)
then
1456 safe_allocate(grad(1:der%mesh%np_part, 1:der%dim, 1:std%dim))
1458 do idim = 1, std%dim
1470 if (
present(a_static))
then
1471 do ip = 1, der%mesh%np
1472 hpsi(ip, :) = hpsi(ip, :) - dot_product(aa(ip, 1:der%dim), a_static(ip, 1:der%dim)) * psi(ip, :) /
p_c
1476 select case (std%ispin)
1478 do ip = 1, der%mesh%np
1479 hpsi(ip, 1) = hpsi(ip, 1) -
m_zi * dot_product(aa(ip, 1:der%dim), grad(ip, 1:der%dim, 1)) /
p_c
1482 do ip = 1, der%mesh%np
1483 do idim = 1, std%dim
1484 hpsi(ip, idim) = hpsi(ip, idim) -
m_zi * &
1485 dot_product(aa(ip, 1:der%dim), grad(ip, 1:der%dim, idim)) /
p_c
1491 select case (std%ispin)
1493 safe_allocate(lhpsi(1:der%mesh%np, 1:std%dim))
1494 if (modulo(ik+1, 2) == 0)
then
1495 lhpsi(1:der%mesh%np, 1) = -
m_half /
p_c * norm2(bb) * psi(1:der%mesh%np, 1)
1497 lhpsi(1:der%mesh%np, 1) = +
m_half /
p_c * norm2(bb) * psi(1:der%mesh%np, 1)
1499 hpsi(1:der%mesh%np, :) = hpsi(1:der%mesh%np, :) + (gyromagnetic_ratio *
m_half) * lhpsi(1:der%mesh%np, :)
1500 safe_deallocate_a(lhpsi)
1503 safe_allocate(lhpsi(1:der%mesh%np, 1:std%dim))
1504 lhpsi(1:der%mesh%np, 1) =
m_half /
p_c * (bb(3) * psi(1:der%mesh%np, 1) &
1505 + cmplx(bb(1), -bb(2), real64) * psi(1:der%mesh%np, 2))
1506 lhpsi(1:der%mesh%np, 2) =
m_half /
p_c * (-bb(3) * psi(1:der%mesh%np, 2) &
1507 + cmplx(bb(1), bb(2), real64) * psi(1:der%mesh%np, 1))
1508 hpsi(1:der%mesh%np, :) = hpsi(1:der%mesh%np, :) + (gyromagnetic_ratio *
m_half) * lhpsi(1:der%mesh%np, :)
1509 safe_deallocate_a(lhpsi)
1512 safe_deallocate_a(grad)
1513 safe_deallocate_a(aa)
1514 safe_deallocate_a(a_prime)
1517 if (vector_potential)
then
1518 safe_allocate(grad(1:der%mesh%np_part, 1:der%dim, 1:std%dim))
1520 do idim = 1, std%dim
1524 select case (std%ispin)
1526 do ip = 1, der%mesh%np
1527 hpsi(ip, 1) = hpsi(ip, 1) -
m_zi * dot_product(a_field(1:der%dim), grad(ip, 1:der%dim, 1)) /
p_c
1530 do ip = 1, der%mesh%np
1531 do idim = 1, std%dim
1532 hpsi(ip, idim) = hpsi(ip, idim) -
m_zi * &
1533 dot_product(a_field(1:der%dim), grad(ip, 1:der%dim, idim)) /
p_c
1537 safe_deallocate_a(grad)
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)
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
integer, parameter, public independent_particles
Theory level.
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)
real(real64), parameter, public m_one
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)
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)
Interface for the ion/cell dynamics.
subroutine, public ion_dynamics_save_state(this, ions, state)
subroutine, public ion_dynamics_unfreeze(this)
Unfreezes the ionic movement.
logical function, public ion_dynamics_freeze(this)
Freezes the ionic movement.
A module to handle KS potential, without the external potential.
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
System information (time, memory, sysname)
subroutine, public loct_progress_bar(a, maxcount)
A wrapper around the progress bar, such that it can be silenced without needing to dress the call wit...
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_not_implemented(feature, namespace)
subroutine, public messages_warning(no_lines, 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)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
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_remove_scf_prop(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)
integer, parameter, public restart_oct
integer, parameter, public restart_type_dump
integer, parameter, public restart_type_load
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_load(restart, namespace, space, st, mesh, kpoints, fixed_occ, 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_dump(restart, space, st, mesh, kpoints, ierr, iter, lr, verbose)
Optimal-control targets: abstract base class and public interface.
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_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_end(writ)
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.
Abstract optimal-control target.