Octopus
propagation.F90
Go to the documentation of this file.
1!! Copyright (C) 2002-2006 M. Marques, A. Castro, A. Rubio, G. Bertsch
2!!
3!! This program is free software; you can redistribute it and/or modify
4!! it under the terms of the GNU General Public License as published by
5!! the Free Software Foundation; either version 2, or (at your option)
6!! any later version.
7!!
8!! This program is distributed in the hope that it will be useful,
9!! but WITHOUT ANY WARRANTY; without even the implied warranty of
10!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11!! GNU General Public License for more details.
12!!
13!! You should have received a copy of the GNU General Public License
14!! along with this program; if not, write to the Free Software
15!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16!! 02110-1301, USA.
17!!
18
19#include "global.h"
20
23 use batch_oct_m
26 use debug_oct_m
32 use epot_oct_m
35 use forces_oct_m
37 use global_oct_m
38 use grid_oct_m
42 use ions_oct_m
43 use, intrinsic :: iso_fortran_env
46 use lasers_oct_m
48 use loct_oct_m
49 use mesh_oct_m
52 use mpi_oct_m
57 use parser_oct_m
64 use space_oct_m
68 use target_oct_m
70 use td_oct_m
72 use v_ks_oct_m
73
74 implicit none
75
76 private
77
78 public :: &
82 fwd_step, &
83 bwd_step, &
84 bwd_step_2, &
85 oct_prop_t, &
89
90
91 type oct_prop_t
92 private
93 integer :: number_checkpoints
94 integer, allocatable :: iter(:)
95 integer :: niter
96 character(len=100) :: dirname
97 type(restart_t) :: restart_load
98 type(restart_t) :: restart_dump
99 end type oct_prop_t
100
101
103 integer :: niter_
104 integer :: number_checkpoints_
105 real(real64) :: eta_
106 real(real64) :: delta_
107 logical :: zbr98_
108 logical :: gradients_
109
110contains
111
117 subroutine propagation_mod_init(niter, eta, delta, number_checkpoints, zbr98, gradients)
118 integer, intent(in) :: niter
119 real(real64), intent(in) :: eta
120 real(real64), intent(in) :: delta
121 integer, intent(in) :: number_checkpoints
122 logical, intent(in) :: zbr98
123 logical, intent(in) :: gradients
124
125 assert(.not. (zbr98 .and. gradients))
126
127 push_sub(propagation_mod_init)
128
129 niter_ = niter
130 eta_ = eta
131 delta_ = delta
132 number_checkpoints_ = number_checkpoints
133 zbr98_ = zbr98
134 gradients_ = gradients
135
136 pop_sub(propagation_mod_init)
137 end subroutine propagation_mod_init
138 ! ---------------------------------------------------------
139
140
146 subroutine propagate_forward(sys, td, par, tg, qcpsi, prop, write_iter)
147 type(electrons_t), intent(inout) :: sys
148 type(td_t), intent(inout) :: td
149 type(controlfunction_t), intent(in) :: par
150 type(target_t), intent(inout) :: tg
151 type(opt_control_state_t), intent(inout) :: qcpsi
152 type(oct_prop_t), optional, intent(inout) :: prop
153 logical, optional, intent(in) :: write_iter
154
155 integer :: ii, istep, ierr
156 logical :: write_iter_ = .false.
157 type(td_write_t) :: write_handler
158 real(real64), allocatable :: x_initial(:,:)
159 logical :: vel_target_ = .false.
160 type(states_elec_t), pointer :: psi
161
162 real(real64) :: init_time, final_time
163
164 push_sub(propagate_forward)
165
166 message(1) = "Info: Forward propagation."
167 call messages_info(1, namespace=sys%namespace)
168
169 call controlfunction_to_h(par, sys%ext_partners)
170
171 write_iter_ = .false.
172 if (present(write_iter)) write_iter_ = write_iter
173
174 psi => opt_control_point_qs(qcpsi)
175 if (sys%st%pack_states .and. sys%hm%apply_packed()) call psi%pack()
176 call opt_control_get_classical(sys%ions, qcpsi)
177
178 if (write_iter_) then
179 call td_write_init(write_handler, sys%namespace, sys%space, sys%outp, sys%gr, sys%st, sys%hm, &
180 sys%ions, sys%ext_partners, sys%ks, td%ions_dyn%ions_move(), &
181 list_has_gauge_field(sys%ext_partners), sys%hm%kick, td%iter, td%max_iter, &
182 td%dt, sys%mc)
183 call td_write_data(write_handler)
184 end if
185
188 ! setup the Hamiltonian
189 call density_calc(psi, sys%gr, psi%rho)
190 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners, time = m_zero)
191 call sys%hm%ks_pot%run_zero_iter(td%tr%vks_old)
192 if (td%ions_dyn%ions_move()) then
193 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, &
194 sys%ext_partners, psi, time = m_zero)
195 call forces_calculate(sys%gr, sys%namespace, sys%ions, sys%hm, sys%ext_partners, psi, sys%ks, t = m_zero, dt = td%dt)
196 end if
199 if (target_type(tg) == oct_tg_hhgnew) then
201 end if
202
203 if (target_type(tg) == oct_tg_velocity .or. target_type(tg) == oct_tg_hhgnew) then
204 safe_allocate_source_a(x_initial, sys%ions%pos)
205 vel_target_ = .true.
206 sys%ions%vel = m_zero
207 sys%ions%tot_force = m_zero
208 end if
209
210 if (.not. target_move_ions(tg)) call epot_precalc_local_potential(sys%hm%ep, sys%namespace, sys%gr, sys%ions)
211
212 call target_tdcalc(tg, sys%namespace, sys%space, sys%hm, sys%gr, sys%ions, sys%ext_partners, psi, 0, td%max_iter)
213
214 if (present(prop)) then
215 call oct_prop_dump_states(prop, sys%space, 0, psi, sys%gr, sys%kpoints, ierr)
216 if (ierr /= 0) then
217 message(1) = "Unable to write OCT states restart."
218 call messages_warning(1, namespace=sys%namespace)
219 end if
220 end if
221
222 init_time = loct_clock()
223 if (mpi_grp_is_root(mpi_world)) call loct_progress_bar(-1, td%max_iter)
224
225 ii = 1
226 do istep = 1, td%max_iter
227 ! time-iterate wavefunctions
228
229 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, istep*td%dt, td%dt, istep, &
230 td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
231
232 if (present(prop)) then
233 call oct_prop_dump_states(prop, sys%space, istep, psi, sys%gr, sys%kpoints, ierr)
234 if (ierr /= 0) then
235 message(1) = "Unable to write OCT states restart."
236 call messages_warning(1, namespace=sys%namespace)
237 end if
238 end if
240 ! update
241 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners, time = istep*td%dt)
242 call energy_calc_total(sys%namespace, sys%space, sys%hm, sys%gr, psi, sys%ext_partners)
243
244 if (sys%hm%abs_boundaries%abtype == mask_absorbing) call zvmask(sys%gr, sys%hm, psi)
245
246 ! if td_target
247 call target_tdcalc(tg, sys%namespace, sys%space, sys%hm, sys%gr, sys%ions, sys%ext_partners, psi, istep, td%max_iter)
248
249 ! only write in final run
250 if (write_iter_) then
251 call td_write_iter(write_handler, sys%namespace, sys%space, sys%outp, sys%gr, psi, sys%hm, sys%ions, &
252 sys%ext_partners, sys%hm%kick, sys%ks, td%dt, istep, sys%mc, sys%td%recalculate_gs)
253 ii = ii + 1
254 if (any(ii == sys%outp%output_interval + 1) .or. istep == td%max_iter) then ! output
255 if (istep == td%max_iter) sys%outp%output_interval = ii - 1
256 ii = istep
257 call td_write_data(write_handler)
258 end if
259 end if
260
261 if ((mod(istep, 100) == 0) .and. mpi_grp_is_root(mpi_world)) call loct_progress_bar(istep, td%max_iter)
262 end do
263 if (mpi_grp_is_root(mpi_world)) write(stdout, '(1x)')
264
265 final_time = loct_clock()
266 write(message(1),'(a,f12.2,a)') 'Propagation time: ', final_time - init_time, ' seconds.'
267 call messages_info(1, namespace=sys%namespace)
268
269 if (vel_target_) then
270 sys%ions%pos = x_initial
271 safe_deallocate_a(x_initial)
272 end if
273
274 call opt_control_set_classical(sys%ions, qcpsi)
275
276 if (write_iter_) call td_write_end(write_handler)
277 if (sys%st%pack_states .and. sys%hm%apply_packed()) call psi%unpack()
278 nullify(psi)
279 pop_sub(propagate_forward)
280 end subroutine propagate_forward
281 ! ---------------------------------------------------------
282
283
288 subroutine propagate_backward(sys, td, qcpsi, prop)
289 type(electrons_t), intent(inout) :: sys
290 type(td_t), intent(inout) :: td
291 type(opt_control_state_t), intent(inout) :: qcpsi
292 type(oct_prop_t), intent(inout) :: prop
293
294 integer :: istep, ierr
295 type(states_elec_t), pointer :: psi
296
297 push_sub(propagate_backward)
298
299 message(1) = "Info: Backward propagation."
300 call messages_info(1, namespace=sys%namespace)
301
302 psi => opt_control_point_qs(qcpsi)
303 if (sys%st%pack_states .and. sys%hm%apply_packed()) call psi%pack()
304
305 call hamiltonian_elec_adjoint(sys%hm)
306
307 ! setup the Hamiltonian
308 call density_calc(psi, sys%gr, psi%rho)
309 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
310 call sys%hm%ks_pot%run_zero_iter(td%tr%vks_old)
311
312 call oct_prop_dump_states(prop, sys%space, td%max_iter, psi, sys%gr, sys%kpoints, ierr)
313 if (ierr /= 0) then
314 message(1) = "Unable to write OCT states restart."
315 call messages_warning(1, namespace=sys%namespace)
316 end if
317
318 if (mpi_grp_is_root(mpi_world)) call loct_progress_bar(-1, td%max_iter)
319
320 do istep = td%max_iter, 1, -1
321 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, &
322 (istep - 1)*td%dt, -td%dt, istep-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
323
324 call oct_prop_dump_states(prop, sys%space, istep - 1, psi, sys%gr, sys%kpoints, ierr)
325 if (ierr /= 0) then
326 message(1) = "Unable to write OCT states restart."
327 call messages_warning(1, namespace=sys%namespace)
328 end if
329
330 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
331 if (mod(istep, 100) == 0 .and. mpi_grp_is_root(mpi_world)) call loct_progress_bar(td%max_iter - istep + 1, td%max_iter)
332 end do
333
334 if (sys%st%pack_states .and. sys%hm%apply_packed()) call psi%unpack()
335 nullify(psi)
336 pop_sub(propagate_backward)
337 end subroutine propagate_backward
338 ! ---------------------------------------------------------
339
340
354 subroutine fwd_step(sys, td, tg, par, par_chi, qcpsi, prop_chi, prop_psi)
355 type(electrons_t), intent(inout) :: sys
356 type(td_t), intent(inout) :: td
357 type(target_t), intent(inout) :: tg
358 type(controlfunction_t), intent(inout) :: par
359 type(controlfunction_t), intent(in) :: par_chi
360 type(opt_control_state_t), intent(inout) :: qcpsi
361 type(oct_prop_t), intent(inout) :: prop_chi
362 type(oct_prop_t), intent(inout) :: prop_psi
363
364 integer :: i, ierr
365 logical :: aux_fwd_propagation
366 type(states_elec_t) :: psi2
367 type(opt_control_state_t) :: qcchi
368 type(controlfunction_t) :: par_prev
369 type(propagator_base_t) :: tr_chi, tr_psi2
370 type(states_elec_t), pointer :: psi, chi
371
372 push_sub(fwd_step)
373
374 message(1) = "Info: Forward propagation."
375 call messages_info(1, namespace=sys%namespace)
376
378
379 call opt_control_state_null(qcchi)
380 call opt_control_state_copy(qcchi, qcpsi)
382 psi => opt_control_point_qs(qcpsi)
383 chi => opt_control_point_qs(qcchi)
384 call propagator_elec_copy(tr_chi, td%tr)
385 ! The propagation of chi should not be self-consistent, because the Kohn-Sham
386 ! potential used is the one created by psi. Note, however, that it is likely that
387 ! the first two iterations are done self-consistently nonetheless.
389
390 aux_fwd_propagation = (target_mode(tg) == oct_targetmode_td .or. &
391 (sys%hm%theory_level /= independent_particles .and. &
392 .not. sys%ks%frozen_hxc))
393 if (aux_fwd_propagation) then
394 call states_elec_copy(psi2, psi)
395 call controlfunction_copy(par_prev, par)
396 if (sys%st%pack_states .and. sys%hm%apply_packed()) call psi2%pack()
397 end if
398
399 ! setup forward propagation
400 call density_calc(psi, sys%gr, psi%rho)
401 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
402 call sys%hm%ks_pot%run_zero_iter(td%tr%vks_old)
403 call sys%hm%ks_pot%run_zero_iter(tr_chi%vks_old)
404 if (aux_fwd_propagation) then
405 call propagator_elec_copy(tr_psi2, td%tr)
406 call sys%hm%ks_pot%run_zero_iter(tr_psi2%vks_old)
407 end if
408
409 call oct_prop_dump_states(prop_psi, sys%space, 0, psi, sys%gr, sys%kpoints, ierr)
410 if (ierr /= 0) then
411 message(1) = "Unable to write OCT states restart."
412 call messages_warning(1, namespace=sys%namespace)
413 end if
414 call oct_prop_load_states(prop_chi, sys%namespace, sys%space, chi, sys%gr, sys%kpoints, 0, ierr)
415 if (ierr /= 0) then
416 message(1) = "Unable to read OCT states restart."
417 call messages_fatal(1, namespace=sys%namespace)
418 end if
419
420 if (sys%st%pack_states .and. sys%hm%apply_packed()) call psi%pack()
421 if (sys%st%pack_states .and. sys%hm%apply_packed()) call chi%pack()
422
423 do i = 1, td%max_iter
424 call update_field(i, par, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par_chi, dir = 'f')
425 call update_hamiltonian_elec_chi(i, sys%namespace, sys%space, sys%gr, sys%ks, sys%hm, sys%ext_partners, &
426 td, tg, par_chi, sys%ions, psi2)
427 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners, time = (i - 1)*td%dt)
428 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, chi, tr_chi, i*td%dt, td%dt, i, &
429 td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
430 if (aux_fwd_propagation) then
431 call update_hamiltonian_elec_psi(i, sys%namespace, sys%space, sys%gr, sys%ks, sys%hm, sys%ext_partners, &
432 td, tg, par_prev, psi2, sys%ions)
433 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi2, tr_psi2, i*td%dt, td%dt, i, &
434 td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
435 end if
436 call update_hamiltonian_elec_psi(i, sys%namespace, sys%space, sys%gr, sys%ks, sys%hm, &
437 sys%ext_partners, td, tg, par, psi, sys%ions)
438 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners, time = (i - 1)*td%dt)
439 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, i*td%dt, td%dt, i, &
440 td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
441 call target_tdcalc(tg, sys%namespace, sys%space, sys%hm, sys%gr, sys%ions, sys%ext_partners, psi, i, td%max_iter)
442
443 call oct_prop_dump_states(prop_psi, sys%space, i, psi, sys%gr, sys%kpoints, ierr)
444 if (ierr /= 0) then
445 message(1) = "Unable to write OCT states restart."
446 call messages_warning(1, namespace=sys%namespace)
447 end if
448 call oct_prop_check(prop_chi, sys%namespace, sys%space, chi, sys%gr, sys%kpoints, i)
449 end do
450 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
452 call density_calc(psi, sys%gr, psi%rho)
453 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
454
455 if (target_mode(tg) == oct_targetmode_td .or. &
456 (sys%hm%theory_level /= independent_particles .and. (.not. sys%ks%frozen_hxc))) then
457 call states_elec_end(psi2)
458 call controlfunction_end(par_prev)
459 end if
460
462 if (aux_fwd_propagation) call propagator_elec_end(tr_psi2)
463 call states_elec_end(chi)
464 call propagator_elec_end(tr_chi)
465 if (sys%st%pack_states .and. sys%hm%apply_packed()) call psi%unpack()
466 nullify(psi)
467 nullify(chi)
468 pop_sub(fwd_step)
469 end subroutine fwd_step
470 ! ---------------------------------------------------------
471
472
482 subroutine bwd_step(sys, td, tg, par, par_chi, qcchi, prop_chi, prop_psi)
483 type(electrons_t), intent(inout) :: sys
484 type(td_t), intent(inout) :: td
485 type(target_t), intent(inout) :: tg
486 type(controlfunction_t), intent(in) :: par
487 type(controlfunction_t), intent(inout) :: par_chi
488 type(opt_control_state_t), intent(inout) :: qcchi
489 type(oct_prop_t), intent(inout) :: prop_chi
490 type(oct_prop_t), intent(inout) :: prop_psi
491
492 integer :: i, ierr
493 type(propagator_base_t) :: tr_chi
494 type(opt_control_state_t) :: qcpsi
495 type(states_elec_t), pointer :: chi, psi
496
497 push_sub(bwd_step)
498
499 message(1) = "Info: Backward propagation."
500 call messages_info(1, namespace=sys%namespace)
501
502 call controlfunction_to_realtime(par_chi)
503
504 chi => opt_control_point_qs(qcchi)
505 psi => opt_control_point_qs(qcpsi)
506
507 call propagator_elec_copy(tr_chi, td%tr)
508 ! The propagation of chi should not be self-consistent, because the Kohn-Sham
509 ! potential used is the one created by psi. Note, however, that it is likely that
510 ! the first two iterations are done self-consistently nonetheless.
512
513 call states_elec_copy(psi, chi)
514 call oct_prop_load_states(prop_psi, sys%namespace, sys%space, psi, sys%gr, sys%kpoints, td%max_iter, ierr)
515 if (ierr /= 0) then
516 message(1) = "Unable to read OCT states restart."
517 call messages_fatal(1, namespace=sys%namespace)
518 end if
519 if (sys%st%pack_states .and. sys%hm%apply_packed()) call psi%pack()
520 if (sys%st%pack_states .and. sys%hm%apply_packed()) call chi%pack()
521
522 call density_calc(psi, sys%gr, psi%rho)
523 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
524 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners)
525 call sys%hm%ks_pot%run_zero_iter(td%tr%vks_old)
526 call sys%hm%ks_pot%run_zero_iter(tr_chi%vks_old)
527
528 td%dt = -td%dt
529 call oct_prop_dump_states(prop_chi, sys%space, td%max_iter, chi, sys%gr, sys%kpoints, ierr)
530 if (ierr /= 0) then
531 message(1) = "Unable to write OCT states restart."
532 call messages_warning(1, namespace=sys%namespace)
533 end if
534
535 do i = td%max_iter, 1, -1
536 call oct_prop_check(prop_psi, sys%namespace, sys%space, psi, sys%gr, sys%kpoints, i)
537 call update_field(i, par_chi, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par, dir = 'b')
538 call update_hamiltonian_elec_chi(i-1, sys%namespace, sys%space, sys%gr, sys%ks, sys%hm, sys%ext_partners, &
539 td, tg, par_chi, sys%ions, psi)
540 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners, time = abs(i*td%dt))
541 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, chi, tr_chi, abs((i-1)*td%dt), td%dt, &
542 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
543 call oct_prop_dump_states(prop_chi, sys%space, i-1, chi, sys%gr, sys%kpoints, ierr)
544 if (ierr /= 0) then
545 message(1) = "Unable to write OCT states restart."
546 call messages_warning(1, namespace=sys%namespace)
547 end if
548 call update_hamiltonian_elec_psi(i-1, sys%namespace, sys%space, sys%gr, sys%ks, sys%hm, sys%ext_partners, &
549 td, tg, par, psi, sys%ions)
550 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners, time = abs(i*td%dt))
551 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, abs((i-1)*td%dt), td%dt, &
552 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
553 end do
554 td%dt = -td%dt
555 call update_field(0, par_chi, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par, dir = 'b')
556
557 call density_calc(psi, sys%gr, psi%rho)
558 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
559 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners)
560
561 call controlfunction_to_basis(par_chi)
562 call states_elec_end(psi)
563 call propagator_elec_end(tr_chi)
564 if (sys%st%pack_states .and. sys%hm%apply_packed()) call chi%unpack()
565 nullify(chi)
566 nullify(psi)
567 pop_sub(bwd_step)
568 end subroutine bwd_step
569 ! ---------------------------------------------------------
570
571
584 subroutine bwd_step_2(sys, td, tg, par, par_chi, qcchi, prop_chi, prop_psi)
585 type(electrons_t), intent(inout) :: sys
586 type(td_t), intent(inout) :: td
587 type(target_t), intent(inout) :: tg
588 type(controlfunction_t), intent(in) :: par
589 type(controlfunction_t), intent(inout) :: par_chi
590 type(opt_control_state_t), intent(inout) :: qcchi
591 type(oct_prop_t), intent(inout) :: prop_chi
592 type(oct_prop_t), intent(inout) :: prop_psi
593
594 integer :: i, ierr, ik, ib
595 logical :: freeze
596 type(propagator_base_t) :: tr_chi
597 type(opt_control_state_t) :: qcpsi
598 type(states_elec_t) :: st_ref
599 type(states_elec_t), pointer :: chi, psi
600 real(real64), pointer :: q(:, :), p(:, :)
601 real(real64), allocatable :: qtildehalf(:, :), qinitial(:, :)
602 real(real64), allocatable :: vhxc(:, :)
603 real(real64), allocatable :: fold(:, :), fnew(:, :)
604 type(ion_state_t) :: ions_state_initial, ions_state_final
605
606 real(real64) :: init_time, final_time
607
608 push_sub(bwd_step_2)
609
610 chi => opt_control_point_qs(qcchi)
611 q => opt_control_point_q(qcchi)
612 p => opt_control_point_p(qcchi)
613 safe_allocate(qtildehalf(1:sys%ions%natoms, 1:sys%ions%space%dim))
614 safe_allocate(qinitial(1:sys%ions%space%dim, 1:sys%ions%natoms))
615
616 call propagator_elec_copy(tr_chi, td%tr)
617 ! The propagation of chi should not be self-consistent, because the Kohn-Sham
618 ! potential used is the one created by psi. Note, however, that it is likely that
619 ! the first two iterations are done self-consistently nonetheless.
621
622 call opt_control_state_null(qcpsi)
623 call opt_control_state_copy(qcpsi, qcchi)
624 psi => opt_control_point_qs(qcpsi)
625 call oct_prop_load_states(prop_psi, sys%namespace, sys%space, psi, sys%gr, sys%kpoints, td%max_iter, ierr)
626 if (ierr /= 0) then
627 message(1) = "Unable to read OCT states restart."
628 call messages_fatal(1, namespace=sys%namespace)
629 end if
630
631 safe_allocate(vhxc(1:sys%gr%np, 1:sys%hm%d%nspin))
632
633 call density_calc(psi, sys%gr, psi%rho)
634 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
635 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners)
636 call sys%hm%ks_pot%run_zero_iter(td%tr%vks_old)
637 call sys%hm%ks_pot%run_zero_iter(tr_chi%vks_old)
638 td%dt = -td%dt
639 call oct_prop_dump_states(prop_chi, sys%space, td%max_iter, chi, sys%gr, sys%kpoints, ierr)
640 if (ierr /= 0) then
641 message(1) = "Unable to write OCT states restart."
642 call messages_warning(1, namespace=sys%namespace)
643 end if
644
645 call states_elec_copy(st_ref, psi)
646 if (sys%st%pack_states .and. sys%hm%apply_packed()) call psi%pack()
647 if (sys%st%pack_states .and. sys%hm%apply_packed()) call st_ref%pack()
648
649 if (td%ions_dyn%ions_move()) then
650 call forces_calculate(sys%gr, sys%namespace, sys%ions, sys%hm, sys%ext_partners, &
651 psi, sys%ks, t = td%max_iter*abs(td%dt), dt = td%dt)
652 end if
653
654 message(1) = "Info: Backward propagation."
655 call messages_info(1, namespace=sys%namespace)
656 if (mpi_grp_is_root(mpi_world)) call loct_progress_bar(-1, td%max_iter)
657
658 init_time = loct_clock()
659
660 do i = td%max_iter, 1, -1
661
662 call oct_prop_check(prop_psi, sys%namespace, sys%space, psi, sys%gr, sys%kpoints, i)
663 call update_field(i, par_chi, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par, dir = 'b')
664
665 select case (td%tr%method)
666
668
669 call update_hamiltonian_elec_psi(i-1, sys%namespace, sys%space, sys%gr, sys%ks, sys%hm, sys%ext_partners, &
670 td, tg, par, psi, sys%ions)
671 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, abs((i-1)*td%dt), td%dt, &
672 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler, qcchi = qcchi)
673
674 case default
675
676 if (td%ions_dyn%ions_move()) then
677 qtildehalf = q
678
679 call ion_dynamics_save_state(td%ions_dyn, sys%ions, ions_state_initial)
680 call ion_dynamics_propagate(td%ions_dyn, sys%ions, abs((i-1)*td%dt), m_half * td%dt, sys%namespace)
681 qinitial = sys%ions%pos
682 call ion_dynamics_restore_state(td%ions_dyn, sys%ions, ions_state_initial)
683
684 safe_allocate(fold(1:sys%ions%natoms, 1:sys%ions%space%dim))
685 safe_allocate(fnew(1:sys%ions%natoms, 1:sys%ions%space%dim))
686 call forces_costate_calculate(sys%gr, sys%namespace, sys%ions, sys%hm, psi, chi, fold, q)
687
688 call ion_dynamics_verlet_step1(sys%ions, qtildehalf, p, fold, m_half * td%dt)
689 call ion_dynamics_verlet_step1(sys%ions, q, p, fold, td%dt)
690 end if
691
692 if (td%ions_dyn%cell_relax()) then
693 call messages_not_implemented("OCT with cell dynamics")
694 end if
695
696 ! Here propagate psi one full step, and then simply interpolate to get the state
697 ! at half the time interval. Perhaps one could gain some accuracy by performing two
698 ! successive propagations of half time step.
699 call update_hamiltonian_elec_psi(i-1, sys%namespace, sys%space, sys%gr, sys%ks, sys%hm, sys%ext_partners, &
700 td, tg, par, psi, sys%ions)
701
702 do ik = psi%d%kpt%start, psi%d%kpt%end
703 do ib = psi%group%block_start, psi%group%block_end
704 call psi%group%psib(ib, ik)%copy_data_to(sys%gr%np, st_ref%group%psib(ib, ik))
705 end do
706 end do
707
708 vhxc(:, :) = sys%hm%ks_pot%vhxc(:, :)
709 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, psi, td%tr, abs((i-1)*td%dt), td%dt, &
710 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
711
712 if (td%ions_dyn%ions_move()) then
713 call ion_dynamics_save_state(td%ions_dyn, sys%ions, ions_state_final)
714 sys%ions%pos = qinitial
715 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, &
716 sys%ext_partners, psi, time = abs((i-1)*td%dt))
717 end if
718
719 do ik = psi%d%kpt%start, psi%d%kpt%end
720 do ib = psi%group%block_start, psi%group%block_end
721 call batch_scal(sys%gr%np, cmplx(m_half, m_zero, real64) , &
722 st_ref%group%psib(ib, ik))
723 call batch_axpy(sys%gr%np, cmplx(m_half, m_zero, real64) , &
724 psi%group%psib(ib, ik), st_ref%group%psib(ib, ik))
725 end do
726 end do
727
728 sys%hm%ks_pot%vhxc(:, :) = m_half * (sys%hm%ks_pot%vhxc(:, :) + vhxc(:, :))
729 call update_hamiltonian_elec_chi(i-1, sys%namespace, sys%space, sys%gr, sys%ks, sys%hm, sys%ext_partners, &
730 td, tg, par, sys%ions, st_ref, qtildehalf)
731 freeze = ion_dynamics_freeze(td%ions_dyn)
732 call propagator_elec_dt(sys%ks, sys%namespace, sys%space, sys%hm, sys%gr, chi, tr_chi, abs((i-1)*td%dt), td%dt, &
733 i-1, td%ions_dyn, sys%ions, sys%ext_partners, sys%mc, sys%outp, td%write_handler)
734 if (freeze) call ion_dynamics_unfreeze(td%ions_dyn)
735
736 if (td%ions_dyn%ions_move()) then
737 call ion_dynamics_restore_state(td%ions_dyn, sys%ions, ions_state_final)
738 call hamiltonian_elec_epot_generate(sys%hm, sys%namespace, sys%space, sys%gr, sys%ions, &
739 sys%ext_partners, psi, time = abs((i-1)*td%dt))
740 call forces_calculate(sys%gr, sys%namespace, sys%ions, sys%hm, sys%ext_partners, &
741 psi, sys%ks, t = abs((i-1)*td%dt), dt = td%dt)
742 call forces_costate_calculate(sys%gr, sys%namespace, sys%ions, sys%hm, psi, chi, fnew, q)
743 call ion_dynamics_verlet_step2(sys%ions, p, fold, fnew, td%dt)
744 safe_deallocate_a(fold)
745 safe_deallocate_a(fnew)
746 end if
747
748 sys%hm%ks_pot%vhxc(:, :) = vhxc(:, :)
749
750 end select
751
752 call oct_prop_dump_states(prop_chi, sys%space, i-1, chi, sys%gr, sys%kpoints, ierr)
753 if (ierr /= 0) then
754 message(1) = "Unable to write OCT states restart."
755 call messages_warning(1, namespace=sys%namespace)
756 end if
757
758 if ((mod(i, 100) == 0).and. mpi_grp_is_root(mpi_world)) call loct_progress_bar(td%max_iter-i, td%max_iter)
759 end do
760 if (mpi_grp_is_root(mpi_world)) then
761 call loct_progress_bar(td%max_iter, td%max_iter)
762 write(stdout, '(1x)')
763 end if
764
765 final_time = loct_clock()
766 write(message(1),'(a,f12.2,a)') 'Propagation time: ', final_time - init_time, ' seconds.'
767 call messages_info(1, namespace=sys%namespace)
768
769 call states_elec_end(st_ref)
770
771 td%dt = -td%dt
772 call update_hamiltonian_elec_psi(0, sys%namespace, sys%space, sys%gr, sys%ks, sys%hm, sys%ext_partners, &
773 td, tg, par, psi, sys%ions)
774 call update_field(0, par_chi, sys%space, sys%gr, sys%hm, sys%ext_partners, sys%ions, qcpsi, qcchi, par, dir = 'b')
775
776 call density_calc(psi, sys%gr, psi%rho)
777 call v_ks_calc(sys%ks, sys%namespace, sys%space, sys%hm, psi, sys%ions, sys%ext_partners)
778 call sys%hm%update(sys%gr, sys%namespace, sys%space, sys%ext_partners)
779
780 call propagator_elec_end(tr_chi)
781
782 safe_deallocate_a(vhxc)
783 call states_elec_end(psi)
784
785 nullify(chi)
786 nullify(psi)
787 nullify(q)
788 nullify(p)
789 safe_deallocate_a(qtildehalf)
790 safe_deallocate_a(qinitial)
791 pop_sub(bwd_step_2)
792 end subroutine bwd_step_2
793 ! ----------------------------------------------------------
794
795
796 ! ----------------------------------------------------------
797 !
798 ! ----------------------------------------------------------
799 subroutine update_hamiltonian_elec_chi(iter, namespace, space, gr, ks, hm, ext_partners, td, tg, par_chi, ions, st, qtildehalf)
800 integer, intent(in) :: iter
801 type(namespace_t), intent(in) :: namespace
802 class(space_t), intent(in) :: space
803 type(grid_t), intent(inout) :: gr
804 type(v_ks_t), intent(inout) :: ks
805 type(hamiltonian_elec_t), intent(inout) :: hm
806 type(partner_list_t), intent(in) :: ext_partners
807 type(td_t), intent(inout) :: td
808 type(target_t), intent(inout) :: tg
809 type(controlfunction_t), intent(in) :: par_chi
810 type(ions_t), intent(in) :: ions
811 type(states_elec_t), intent(inout) :: st
812 real(real64), optional, intent(in) :: qtildehalf(:, :)
813
814 type(states_elec_t) :: inh
815 type(perturbation_ionic_t), pointer :: pert
816 integer :: j, iatom, idim
817 complex(real64), allocatable :: dvpsi(:, :, :), zpsi(:, :), inhzpsi(:, :)
818 integer :: ist, ik, ib
819
821
822 assert(.not. st%parallel_in_states)
823 assert(.not. st%d%kpt%parallel)
824
825 if (target_mode(tg) == oct_targetmode_td) then
826 call states_elec_copy(inh, st)
827 call target_inh(st, gr, hm%kpoints, tg, abs(td%dt)*iter, inh, iter)
828 call hamiltonian_elec_set_inh(hm, inh)
829 call states_elec_end(inh)
830 end if
831
832 if (td%ions_dyn%ions_move()) then
833 call states_elec_copy(inh, st)
834 safe_allocate(dvpsi(1:gr%np_part, 1:st%d%dim, 1:space%dim))
835 do ik = inh%d%kpt%start, inh%d%kpt%end
836 do ib = inh%group%block_start, inh%group%block_end
837 call batch_set_zero(inh%group%psib(ib, ik))
838 end do
839 end do
840 safe_allocate(zpsi(1:gr%np_part, 1:st%d%dim))
841 safe_allocate(inhzpsi(1:gr%np_part, 1:st%d%dim))
842 do ist = 1, st%nst
843 do ik = 1, st%nik
844
845 call states_elec_get_state(st, gr, ist, ik, zpsi)
846 call states_elec_get_state(inh, gr, ist, ik, inhzpsi)
847
848 pert => perturbation_ionic_t(namespace, ions)
849 do iatom = 1, ions%natoms
850 call pert%setup_atom(iatom)
851 do idim = 1, space%dim
852 call pert%setup_dir(idim)
853 call pert%zapply(namespace, space, gr, hm, ik, zpsi(:, :), dvpsi(:, :, idim))
854
855 call lalg_axpy(gr%np, st%d%dim, -st%occ(ist, ik)*qtildehalf(iatom, idim), &
856 dvpsi(:, :, idim), inhzpsi(:, :))
857 end do
858 end do
859 safe_deallocate_p(pert)
860 call states_elec_set_state(inh, gr, ist, ik, inhzpsi)
861 end do
862 end do
863
864 safe_deallocate_a(zpsi)
865 safe_deallocate_a(inhzpsi)
866 safe_deallocate_a(dvpsi)
867 call hamiltonian_elec_set_inh(hm, inh)
868 call states_elec_end(inh)
869 end if
870
871 if (hm%theory_level /= independent_particles .and. (.not. ks%frozen_hxc)) then
872 call density_calc(st, gr, st%rho)
873 call oct_exchange_set(hm%oct_exchange, st, gr)
874 end if
875
877
878 do j = iter - 2, iter + 2
879 if (j >= 0 .and. j <= td%max_iter) then
880 call controlfunction_to_h_val(par_chi, ext_partners, j+1)
881 end if
882 end do
883
885 end subroutine update_hamiltonian_elec_chi
886 ! ---------------------------------------------------------
887
888
889 ! ----------------------------------------------------------
890 !
891 ! ----------------------------------------------------------
892 subroutine update_hamiltonian_elec_psi(iter, namespace, space, gr, ks, hm, ext_partners, td, tg, par, st, ions)
893 integer, intent(in) :: iter
894 type(namespace_t), intent(in) :: namespace
895 type(electron_space_t), intent(in) :: space
896 type(grid_t), intent(inout) :: gr
897 type(v_ks_t), intent(inout) :: ks
898 type(hamiltonian_elec_t), intent(inout) :: hm
899 type(partner_list_t), intent(in) :: ext_partners
900 type(td_t), intent(inout) :: td
901 type(target_t), intent(inout) :: tg
902 type(controlfunction_t), intent(in) :: par
903 type(states_elec_t), intent(inout) :: st
904 type(ions_t), intent(in) :: ions
905
906 integer :: j
907
909
910 if (target_mode(tg) == oct_targetmode_td) then
912 end if
913
914 if (td%ions_dyn%ions_move()) then
916 end if
917
918 if (hm%theory_level /= independent_particles .and. (.not. ks%frozen_hxc)) then
919 call oct_exchange_remove(hm%oct_exchange)
920 end if
921
923
924 do j = iter - 2, iter + 2
925 if (j >= 0 .and. j <= td%max_iter) then
926 call controlfunction_to_h_val(par, ext_partners, j+1)
927 end if
928 end do
929 if (hm%theory_level /= independent_particles .and. (.not. ks%frozen_hxc)) then
930 call density_calc(st, gr, st%rho)
931 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
932 call hm%update(gr, namespace, space, ext_partners)
933 end if
934
936 end subroutine update_hamiltonian_elec_psi
937 ! ---------------------------------------------------------
938
939
940 ! ---------------------------------------------------------
941 subroutine calculate_g(space, gr, hm, lasers, psi, chi, dl, dq)
942 class(space_t), intent(in) :: space
943 type(grid_t), intent(inout) :: gr
944 type(hamiltonian_elec_t), intent(in) :: hm
945 type(lasers_t), intent(in) :: lasers
946 type(states_elec_t), intent(inout) :: psi
947 type(states_elec_t), intent(inout) :: chi
948 complex(real64), intent(inout) :: dl(:), dq(:)
949
950 complex(real64), allocatable :: zpsi(:, :), zoppsi(:, :)
951 integer :: no_parameters, j, ik, p
952
953 push_sub(calculate_g)
954
955 no_parameters = lasers%no_lasers
956
957 safe_allocate(zpsi(1:gr%np_part, 1:chi%d%dim))
958 safe_allocate(zoppsi(1:gr%np_part, 1:chi%d%dim))
959
960 do j = 1, no_parameters
961
962 dl(j) = m_z0
963 do ik = 1, psi%nik
964 do p = 1, psi%nst
965
966 call states_elec_get_state(psi, gr, p, ik, zpsi)
967
968 zoppsi = m_z0
969 if (allocated(hm%ep%a_static)) then
970 call vlaser_operator_linear(lasers%lasers(j), gr%der, hm%d, zpsi, &
971 zoppsi, ik, hm%ep%gyromagnetic_ratio, hm%ep%a_static)
972 else
973 call vlaser_operator_linear(lasers%lasers(j), gr%der, hm%d, zpsi, &
974 zoppsi, ik, hm%ep%gyromagnetic_ratio)
975 end if
976
977 call states_elec_get_state(chi, gr, p, ik, zpsi)
978 dl(j) = dl(j) + zmf_dotp(gr, psi%d%dim, zpsi, zoppsi)
979 end do
980 end do
981
982 ! The quadratic part should only be computed if necessary.
983 if (laser_kind(lasers%lasers(j)) == e_field_magnetic) then
984
985 dq(j) = m_z0
986 do ik = 1, psi%nik
987 do p = 1, psi%nst
988 zoppsi = m_z0
989
990 call states_elec_get_state(psi, gr, p, ik, zpsi)
991 call vlaser_operator_quadratic(lasers%lasers(j), gr, space, zpsi, zoppsi)
992
993 call states_elec_get_state(chi, gr, p, ik, zpsi)
994 dq(j) = dq(j) + zmf_dotp(gr, psi%d%dim, zpsi, zoppsi)
995
996 end do
997 end do
998
999 else
1000 dq(j) = m_z0
1001 end if
1002 end do
1003
1004 safe_deallocate_a(zpsi)
1005 safe_deallocate_a(zoppsi)
1006
1007 pop_sub(calculate_g)
1008 end subroutine calculate_g
1009 ! ---------------------------------------------------------
1010
1011
1012
1013
1026 subroutine update_field(iter, cp, space, gr, hm, ext_partners, ions, qcpsi, qcchi, cpp, dir)
1027 class(space_t), intent(in) :: space
1028 integer, intent(in) :: iter
1029 type(controlfunction_t), intent(inout) :: cp
1030 type(grid_t), intent(inout) :: gr
1031 type(hamiltonian_elec_t), intent(in) :: hm
1032 type(partner_list_t), intent(in) :: ext_partners
1033 type(ions_t), intent(in) :: ions
1034 type(opt_control_state_t), intent(inout) :: qcpsi
1035 type(opt_control_state_t), intent(inout) :: qcchi
1036 type(controlfunction_t), intent(in) :: cpp
1037 character(len=1), intent(in) :: dir
1038
1039 complex(real64) :: d1, pol(3)
1040 complex(real64), allocatable :: dl(:), dq(:), zpsi(:, :), zchi(:, :)
1041 real(real64), allocatable :: d(:)
1042 integer :: j, no_parameters, iatom
1043 type(states_elec_t), pointer :: psi, chi
1044 real(real64), pointer :: q(:, :)
1045 type(lasers_t), pointer :: lasers
1046
1047 push_sub(update_field)
1048
1049 psi => opt_control_point_qs(qcpsi)
1050 chi => opt_control_point_qs(qcchi)
1051 q => opt_control_point_q(qcchi)
1052
1053 no_parameters = controlfunction_number(cp)
1054
1055 safe_allocate(dl(1:no_parameters))
1056 safe_allocate(dq(1:no_parameters))
1057 safe_allocate( d(1:no_parameters))
1058
1059
1060 lasers => list_get_lasers(ext_partners)
1061 if(associated(lasers)) then
1062 call calculate_g(space, gr, hm, lasers, psi, chi, dl, dq)
1063 end if
1064
1065 d1 = m_z1
1066 if (zbr98_) then
1067 safe_allocate(zpsi(1:gr%np, 1:psi%d%dim))
1068 safe_allocate(zchi(1:gr%np, 1:chi%d%dim))
1069
1070 call states_elec_get_state(psi, gr, 1, 1, zpsi)
1071 call states_elec_get_state(chi, gr, 1, 1, zchi)
1072
1073 d1 = zmf_dotp(gr, psi%d%dim, zpsi, zchi)
1074 do j = 1, no_parameters
1075 d(j) = aimag(d1*dl(j)) / controlfunction_alpha(cp, j)
1076 end do
1077
1078 safe_deallocate_a(zpsi)
1079 safe_deallocate_a(zchi)
1080
1081 elseif (gradients_) then
1082 do j = 1, no_parameters
1083 d(j) = m_two * aimag(dl(j))
1084 end do
1085 else
1086 do j = 1, no_parameters
1087 d(j) = aimag(dl(j)) / controlfunction_alpha(cp, j)
1088 end do
1089 end if
1090
1091 ! This is for the classical target.
1092 if (dir == 'b' .and. associated(lasers)) then
1093 pol = laser_polarization(lasers%lasers(1))
1094 do iatom = 1, ions%natoms
1095 d(1) = d(1) - ions%charge(iatom) * real(sum(pol(1:ions%space%dim)*q(iatom, 1:ions%space%dim)), real64)
1096 end do
1097 end if
1098
1099
1100 if (dir == 'f') then
1101 call controlfunction_update(cp, cpp, dir, iter, delta_, d, dq)
1102 else
1103 call controlfunction_update(cp, cpp, dir, iter, eta_, d, dq)
1104 end if
1105
1106 nullify(q)
1107 nullify(psi)
1108 nullify(chi)
1109 safe_deallocate_a(d)
1110 safe_deallocate_a(dl)
1111 safe_deallocate_a(dq)
1112 pop_sub(update_field)
1113 end subroutine update_field
1114 ! ---------------------------------------------------------
1115
1116
1117 ! ---------------------------------------------------------
1118 subroutine oct_prop_init(prop, namespace, dirname, mesh, mc)
1119 type(oct_prop_t), intent(inout) :: prop
1120 type(namespace_t), intent(in) :: namespace
1121 character(len=*), intent(in) :: dirname
1122 class(mesh_t), intent(in) :: mesh
1123 type(multicomm_t), intent(in) :: mc
1124
1125 integer :: j, ierr
1126
1127 push_sub(oct_prop_init)
1128
1129 prop%dirname = dirname
1130 prop%niter = niter_
1131 prop%number_checkpoints = number_checkpoints_
1132
1133 ! The OCT_DIR//trim(dirname) will be used to write and read information during the calculation,
1134 ! so they need to use the same path.
1135 call restart_init(prop%restart_dump, namespace, restart_oct, restart_type_dump, mc, ierr, mesh=mesh)
1136 call restart_init(prop%restart_load, namespace, restart_oct, restart_type_load, mc, ierr, mesh=mesh)
1137
1138 safe_allocate(prop%iter(1:prop%number_checkpoints+2))
1139 prop%iter(1) = 0
1140 do j = 1, prop%number_checkpoints
1141 prop%iter(j+1) = nint(real(niter_, real64) /(prop%number_checkpoints+1) * j)
1142 end do
1143 prop%iter(prop%number_checkpoints+2) = niter_
1144
1145 pop_sub(oct_prop_init)
1146 end subroutine oct_prop_init
1147 ! ---------------------------------------------------------
1148
1149
1150 ! ---------------------------------------------------------
1151 subroutine oct_prop_end(prop)
1152 type(oct_prop_t), intent(inout) :: prop
1153
1154 push_sub(oct_prop_end)
1155
1156 call restart_end(prop%restart_load)
1157 call restart_end(prop%restart_dump)
1158
1159 safe_deallocate_a(prop%iter)
1160 ! This routine should maybe delete the files?
1161
1162 pop_sub(oct_prop_end)
1163 end subroutine oct_prop_end
1164 ! ---------------------------------------------------------
1165
1166
1167 ! ---------------------------------------------------------
1168 subroutine oct_prop_check(prop, namespace, space, psi, mesh, kpoints, iter)
1169 type(oct_prop_t), intent(inout) :: prop
1170 type(namespace_t), intent(in) :: namespace
1171 class(space_t), intent(in) :: space
1172 type(states_elec_t), intent(inout) :: psi
1173 class(mesh_t), intent(in) :: mesh
1174 type(kpoints_t), intent(in) :: kpoints
1175 integer, intent(in) :: iter
1176
1177 type(states_elec_t) :: stored_st
1178 character(len=80) :: dirname
1179 integer :: j, ierr
1180 complex(real64) :: overlap, prev_overlap
1181 real(real64), parameter :: WARNING_THRESHOLD = 1.0e-2_real64
1182
1183 push_sub(oct_prop_check)
1184
1185 do j = 1, prop%number_checkpoints + 2
1186 if (prop%iter(j) == iter) then
1187 call states_elec_copy(stored_st, psi)
1188 write(dirname,'(a, i4.4)') trim(prop%dirname), j
1189 call restart_open_dir(prop%restart_load, dirname, ierr)
1190 if (ierr == 0) then
1191 call states_elec_load(prop%restart_load, namespace, space, stored_st, mesh, kpoints, ierr, verbose=.false.)
1192 end if
1193 if (ierr /= 0) then
1194 message(1) = "Unable to read wavefunctions from '"//trim(dirname)//"'."
1195 call messages_fatal(1, namespace=namespace)
1196 end if
1197 call restart_close_dir(prop%restart_load)
1198 prev_overlap = zstates_elec_mpdotp(namespace, mesh, stored_st, stored_st)
1199 overlap = zstates_elec_mpdotp(namespace, mesh, stored_st, psi)
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
1204 call messages_warning(2, namespace=namespace)
1205 end if
1206 ! Restore state only if the number of checkpoints is larger than zero.
1207 if (prop%number_checkpoints > 0) then
1208 call states_elec_end(psi)
1209 call states_elec_copy(psi, stored_st)
1210 end if
1211 call states_elec_end(stored_st)
1212 end if
1213 end do
1214 pop_sub(oct_prop_check)
1215 end subroutine oct_prop_check
1216 ! ---------------------------------------------------------
1217
1218
1219 ! ---------------------------------------------------------
1220 subroutine oct_prop_dump_states(prop, space, iter, psi, mesh, kpoints, ierr)
1221 type(oct_prop_t), intent(inout) :: prop
1222 class(space_t), intent(in) :: space
1223 integer, intent(in) :: iter
1224 type(states_elec_t), intent(in) :: psi
1225 class(mesh_t), intent(in) :: mesh
1226 type(kpoints_t), intent(in) :: kpoints
1227 integer, intent(out) :: ierr
1228
1229 integer :: j, err
1230 character(len=80) :: dirname
1231
1232 push_sub(oct_prop_dump_states)
1233
1234 ierr = 0
1235
1236 if (restart_skip(prop%restart_dump)) then
1237 pop_sub(oct_prop_dump_states)
1238 return
1239 end if
1240
1241 message(1) = "Debug: Writing OCT propagation states restart."
1242 call messages_info(1, debug_only=.true.)
1243
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 restart_open_dir(prop%restart_dump, dirname, err)
1248 if (err == 0) then
1249 call states_elec_dump(prop%restart_dump, space, psi, mesh, kpoints, err, iter, verbose = .false.)
1250 end if
1251 if (err /= 0) then
1252 message(1) = "Unable to write wavefunctions to '"//trim(dirname)//"'."
1253 call messages_warning(1)
1254 ierr = ierr + 2**j
1255 end if
1256 call restart_close_dir(prop%restart_dump)
1257 end if
1258 end do
1259
1260 message(1) = "Debug: Writing OCT propagation states restart done."
1261 call messages_info(1, debug_only=.true.)
1262
1263 pop_sub(oct_prop_dump_states)
1264 end subroutine oct_prop_dump_states
1265 ! ---------------------------------------------------------
1266
1267
1268 ! ---------------------------------------------------------
1269 subroutine oct_prop_load_states(prop, namespace, space, psi, mesh, kpoints, iter, ierr)
1270 type(oct_prop_t), intent(inout) :: prop
1271 type(namespace_t), intent(in) :: namespace
1272 class(space_t), intent(in) :: space
1273 type(states_elec_t), intent(inout) :: psi
1274 class(mesh_t), intent(in) :: mesh
1275 type(kpoints_t), intent(in) :: kpoints
1276 integer, intent(in) :: iter
1277 integer, intent(out) :: ierr
1278
1279 integer :: j, err
1280 character(len=80) :: dirname
1281
1282 push_sub(oct_prop_load_states)
1283
1284 ierr = 0
1285
1286 if (restart_skip(prop%restart_load)) then
1287 ierr = -1
1288 pop_sub(oct_prop_load_states)
1289 return
1290 end if
1291
1292 message(1) = "Debug: Reading OCT propagation states restart."
1293 call messages_info(1, namespace=namespace, debug_only=.true.)
1294
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 restart_open_dir(prop%restart_load, dirname, err)
1299 if (err == 0) then
1300 call states_elec_load(prop%restart_load, namespace, space, psi, mesh, kpoints, err, verbose=.false.)
1301 end if
1302 if (err /= 0) then
1303 message(1) = "Unable to read wavefunctions from '"//trim(dirname)//"'."
1304 call messages_warning(1, namespace=namespace)
1305 ierr = ierr + 2**j
1306 end if
1307 call restart_close_dir(prop%restart_load)
1308 end if
1309 end do
1310
1311 message(1) = "Debug: Reading OCT propagation states restart done."
1312 call messages_info(1, namespace=namespace, debug_only=.true.)
1314 pop_sub(oct_prop_load_states)
1315 end subroutine oct_prop_load_states
1316 ! ---------------------------------------------------------
1317
1318 ! ---------------------------------------------------------
1319 subroutine vlaser_operator_quadratic(laser, mesh, space, psi, hpsi)
1320 type(laser_t), intent(in) :: laser
1321 class(mesh_t), intent(in) :: mesh
1322 class(space_t), intent(in) :: space
1323 complex(real64), intent(inout) :: psi(:,:)
1324 complex(real64), intent(inout) :: hpsi(:,:)
1325
1326 integer :: ip
1327 logical :: vector_potential, magnetic_field
1328
1329 real(real64) :: a_field(3), a_field_prime(3), bb(3), b_prime(3)
1330 real(real64), allocatable :: aa(:, :), a_prime(:, :)
1331
1333
1334 a_field = m_zero
1335
1336 vector_potential = .false.
1337 magnetic_field = .false.
1338
1339 select case (laser_kind(laser))
1340 case (e_field_electric) ! do nothing
1341 case (e_field_magnetic)
1342 if (.not. allocated(aa)) then
1343 safe_allocate(aa(1:mesh%np_part, 1:space%dim))
1344 aa = m_zero
1345 safe_allocate(a_prime(1:mesh%np_part, 1:space%dim))
1346 end if
1347 a_prime = m_zero
1348 call laser_vector_potential(laser, mesh, a_prime)
1349 aa = aa + a_prime
1350 b_prime = m_zero
1351 call laser_field(laser, b_prime(1:space%dim))
1352 bb = bb + b_prime
1353 magnetic_field = .true.
1355 a_field_prime = m_zero
1356 call laser_field(laser, a_field_prime(1:space%dim))
1357 a_field = a_field + a_field_prime
1358 vector_potential = .true.
1359 end select
1360
1361 if (magnetic_field) then
1362 do ip = 1, mesh%np
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
1365 end do
1366 safe_deallocate_a(aa)
1367 safe_deallocate_a(a_prime)
1368 end if
1369 if (vector_potential) then
1370 do ip = 1, mesh%np
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
1373 end do
1374 end if
1375
1377 end subroutine vlaser_operator_quadratic
1378
1379 ! ---------------------------------------------------------
1380 subroutine vlaser_operator_linear(laser, der, std, psi, hpsi, ik, gyromagnetic_ratio, a_static)
1381 type(laser_t), intent(in) :: laser
1382 type(derivatives_t), intent(in) :: der
1383 type(states_elec_dim_t), intent(in) :: std
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(:,:)
1389
1390 integer :: ip, idim
1391 logical :: electric_field, vector_potential, magnetic_field
1392 complex(real64), allocatable :: grad(:, :, :), lhpsi(:, :)
1393
1394 real(real64) :: a_field(3), a_field_prime(3), bb(3), b_prime(3)
1395
1396 real(real64), allocatable :: vv(:), pot(:), aa(:, :), a_prime(:, :)
1397
1398 push_sub(vlaser_operator_linear)
1399
1400 a_field = m_zero
1401
1402 electric_field = .false.
1403 vector_potential = .false.
1404 magnetic_field = .false.
1405
1406 select case (laser_kind(laser))
1408 if (.not. allocated(vv)) then
1409 safe_allocate(vv(1:der%mesh%np))
1410 end if
1411 vv = m_zero
1412 call laser_potential(laser, der%mesh, vv)
1413 electric_field = .true.
1414
1415 case (e_field_electric)
1416 if (.not. allocated(vv)) then
1417 safe_allocate(vv(1:der%mesh%np))
1418 vv = m_zero
1419 safe_allocate(pot(1:der%mesh%np))
1420 end if
1421 pot = m_zero
1422 call laser_potential(laser, der%mesh, pot)
1423 call lalg_axpy(der%mesh%np, m_one, pot, vv)
1424 electric_field = .true.
1425 safe_deallocate_a(pot)
1426
1427 case (e_field_magnetic)
1428 if (.not. allocated(aa)) then
1429 safe_allocate(aa(1:der%mesh%np_part, 1:der%dim))
1430 aa = m_zero
1431 safe_allocate(a_prime(1:der%mesh%np_part, 1:der%dim))
1432 end if
1433 a_prime = m_zero
1434 call laser_vector_potential(laser, der%mesh, a_prime)
1435 aa = aa + a_prime
1436 b_prime = m_zero
1437 call laser_field(laser, b_prime(1:der%dim))
1438 bb = bb + b_prime
1439 magnetic_field = .true.
1441 a_field_prime = m_zero
1442 call laser_field(laser, a_field_prime(1:der%dim))
1443 a_field = a_field + a_field_prime
1444 vector_potential = .true.
1445 end select
1446
1447 if (electric_field) then
1448 do idim = 1, std%dim
1449 hpsi(1:der%mesh%np, idim)= hpsi(1:der%mesh%np, idim) + vv(1:der%mesh%np) * psi(1:der%mesh%np, idim)
1450 end do
1451 safe_deallocate_a(vv)
1452 end if
1453
1454 if (magnetic_field) then
1455 safe_allocate(grad(1:der%mesh%np_part, 1:der%dim, 1:std%dim))
1456
1457 do idim = 1, std%dim
1458 call zderivatives_grad(der, psi(:, idim), grad(:, :, idim))
1459 end do
1460
1461 ! If there is a static magnetic field, its associated vector potential is coupled with
1462 ! the time-dependent one defined as a "laser" (ideally one should just add them all and
1463 ! do the calculation only once...). Note that h%ep%a_static already has been divided
1464 ! by P_c, and therefore here we only divide by P_c, and not P_c**2.
1465 !
1466 ! We put a minus sign, since for the moment vector potential for
1467 ! lasers and for the static magnetic field use a different
1468 ! convetion.
1469 if (present(a_static)) then
1470 do ip = 1, der%mesh%np
1471 hpsi(ip, :) = hpsi(ip, :) - dot_product(aa(ip, 1:der%dim), a_static(ip, 1:der%dim)) * psi(ip, :) / p_c
1472 end do
1473 end if
1474
1475 select case (std%ispin)
1477 do ip = 1, der%mesh%np
1478 hpsi(ip, 1) = hpsi(ip, 1) - m_zi * dot_product(aa(ip, 1:der%dim), grad(ip, 1:der%dim, 1)) / p_c
1479 end do
1480 case (spinors)
1481 do ip = 1, der%mesh%np
1482 do idim = 1, std%dim
1483 hpsi(ip, idim) = hpsi(ip, idim) - m_zi * &
1484 dot_product(aa(ip, 1:der%dim), grad(ip, 1:der%dim, idim)) / p_c
1485 end do
1486 end do
1487 end select
1488
1489
1490 select case (std%ispin)
1491 case (spin_polarized)
1492 safe_allocate(lhpsi(1:der%mesh%np, 1:std%dim))
1493 if (modulo(ik+1, 2) == 0) then ! we have a spin down
1494 lhpsi(1:der%mesh%np, 1) = - m_half / p_c * norm2(bb) * psi(1:der%mesh%np, 1)
1495 else
1496 lhpsi(1:der%mesh%np, 1) = + m_half / p_c * norm2(bb) * psi(1:der%mesh%np, 1)
1497 end if
1498 hpsi(1:der%mesh%np, :) = hpsi(1:der%mesh%np, :) + (gyromagnetic_ratio * m_half) * lhpsi(1:der%mesh%np, :)
1499 safe_deallocate_a(lhpsi)
1500
1501 case (spinors)
1502 safe_allocate(lhpsi(1:der%mesh%np, 1:std%dim))
1503 lhpsi(1:der%mesh%np, 1) = m_half / p_c * (bb(3) * psi(1:der%mesh%np, 1) &
1504 + cmplx(bb(1), -bb(2), real64) * psi(1:der%mesh%np, 2))
1505 lhpsi(1:der%mesh%np, 2) = m_half / p_c * (-bb(3) * psi(1:der%mesh%np, 2) &
1506 + cmplx(bb(1), bb(2), real64) * psi(1:der%mesh%np, 1))
1507 hpsi(1:der%mesh%np, :) = hpsi(1:der%mesh%np, :) + (gyromagnetic_ratio * m_half) * lhpsi(1:der%mesh%np, :)
1508 safe_deallocate_a(lhpsi)
1509 end select
1510
1511 safe_deallocate_a(grad)
1512 safe_deallocate_a(aa)
1513 safe_deallocate_a(a_prime)
1514 end if
1515
1516 if (vector_potential) then
1517 safe_allocate(grad(1:der%mesh%np_part, 1:der%dim, 1:std%dim))
1518
1519 do idim = 1, std%dim
1520 call zderivatives_grad(der, psi(:, idim), grad(:, :, idim))
1521 end do
1522
1523 select case (std%ispin)
1525 do ip = 1, der%mesh%np
1526 hpsi(ip, 1) = hpsi(ip, 1) - m_zi * dot_product(a_field(1:der%dim), grad(ip, 1:der%dim, 1)) / p_c
1527 end do
1528 case (spinors)
1529 do ip = 1, der%mesh%np
1530 do idim = 1, std%dim
1531 hpsi(ip, idim) = hpsi(ip, idim) - m_zi * &
1532 dot_product(a_field(1:der%dim), grad(ip, 1:der%dim, idim)) / p_c
1533 end do
1534 end do
1535 end select
1536 safe_deallocate_a(grad)
1537 end if
1538
1539 pop_sub(vlaser_operator_linear)
1540 end subroutine vlaser_operator_linear
1541
1542
1543end module propagation_oct_m
1544
1545!! Local Variables:
1546!! mode: f90
1547!! coding: utf-8
1548!! End:
batchified version of the BLAS axpy routine:
Definition: batch_ops.F90:154
scale a batch by a constant or vector
Definition: batch_ops.F90:162
constant times a vector plus a vector
Definition: lalg_basic.F90:171
integer, parameter, public mask_absorbing
This module implements batches of mesh functions.
Definition: batch.F90:133
This module implements common operations on batches of mesh functions.
Definition: batch_ops.F90:116
subroutine, public batch_set_zero(this, np, async)
fill all mesh functions of the batch with zero
Definition: batch_ops.F90:242
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.
Definition: density.F90:120
subroutine, public density_calc(st, gr, density, istin)
Computes the density from the orbitals in st.
Definition: density.F90:610
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)
Definition: epot.F90:574
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)
Definition: forces.F90:218
subroutine, public forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old, t, dt)
Definition: forces.F90:339
real(real64), parameter, public m_two
Definition: global.F90:190
real(real64), parameter, public m_zero
Definition: global.F90:188
complex(real64), parameter, public m_z0
Definition: global.F90:198
complex(real64), parameter, public m_zi
Definition: global.F90:202
complex(real64), parameter, public m_z1
Definition: global.F90:199
real(real64), parameter, public m_half
Definition: global.F90:194
real(real64), parameter, public p_c
Electron gyromagnetic ratio, see Phys. Rev. Lett. 130, 071801 (2023)
Definition: global.F90:224
real(real64), parameter, public m_one
Definition: global.F90:189
This module implements the underlying real-space grid.
Definition: grid.F90:117
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.
integer, parameter, public independent_particles
complex(real64) function, dimension(3), public laser_polarization(laser)
Definition: lasers.F90:727
subroutine, public laser_vector_potential(laser, mesh, aa, time)
Definition: lasers.F90:1079
integer, parameter, public e_field_electric
Definition: lasers.F90:177
integer, parameter, public e_field_vector_potential
Definition: lasers.F90:177
subroutine, public laser_potential(laser, mesh, pot, time)
Definition: lasers.F90:1044
integer, parameter, public e_field_scalar_potential
Definition: lasers.F90:177
integer pure elemental function, public laser_kind(laser)
Definition: lasers.F90:716
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...
Definition: lasers.F90:1116
integer, parameter, public e_field_magnetic
Definition: lasers.F90:177
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
Definition: mesh.F90:118
subroutine, public messages_not_implemented(feature, namespace)
Definition: messages.F90:1113
subroutine, public messages_warning(no_lines, all_nodes, namespace)
Definition: messages.F90:537
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
Definition: messages.F90:160
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
Definition: messages.F90:414
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
Definition: messages.F90:616
logical function mpi_grp_is_root(grp)
Is the current MPI process of grpcomm, root.
Definition: mpi.F90:434
type(mpi_grp_t), public mpi_world
Definition: mpi.F90:270
This module handles the communicators for the various parallelization strategies.
Definition: multicomm.F90:145
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
Definition: restart.F90:200
subroutine, public restart_init(restart, namespace, data_type, type, mc, ierr, mesh, dir, exact)
Initializes a restart object.
Definition: restart.F90:517
integer, parameter, public restart_type_dump
Definition: restart.F90:246
logical pure function, public restart_skip(restart)
Returns true if the restart information should neither be read nor written. This might happen because...
Definition: restart.F90:970
subroutine, public restart_open_dir(restart, dirname, ierr)
Change the restart directory to dirname, where "dirname" is a subdirectory of the base restart direct...
Definition: restart.F90:773
integer, parameter, public restart_type_load
Definition: restart.F90:246
subroutine, public restart_end(restart)
Definition: restart.F90:723
subroutine, public restart_close_dir(restart)
Change back to the base directory. To be called after restart_open_dir.
Definition: restart.F90:807
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...
integer, parameter, public oct_tg_velocity
Definition: target_low.F90:212
integer, parameter, public oct_tg_hhgnew
Definition: target_low.F90:212
integer pure function, public target_type(tg)
Definition: target_low.F90:265
integer, parameter, public oct_targetmode_td
Definition: target_low.F90:227
integer pure function, public target_mode(tg)
Definition: target_low.F90:243
logical pure function, public target_move_ions(tg)
Definition: target_low.F90:281
subroutine, public target_init_propagation(tg)
This routine performs all the things that must be initialized prior to a forward evolution,...
Definition: target.F90:186
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.
Definition: target.F90:487
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...
Definition: target.F90:444
Definition: td.F90:114
subroutine, public td_write_data(writ)
Definition: td_write.F90:1203
subroutine, public td_write_end(writ)
Definition: td_write.F90:987
subroutine, public td_write_iter(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, kick, ks, dt, iter, mc, recalculate_gs)
Definition: td_write.F90:1034
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.
Definition: td_write.F90:373
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
Definition: v_ks.F90:736
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.
Definition: electrons.F90:218
Description of the grid, containing information on derivatives, stencil, and symmetries.
Definition: grid.F90:169
Describes mesh distribution to nodes.
Definition: mesh.F90:186
Stores all communicators and groups.
Definition: multicomm.F90:206
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.
int true(void)