(git:f56c6e3)
Loading...
Searching...
No Matches
rt_propagation.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Routines for the real time propagation.
10!> \author Florian Schiffmann (02.09)
11! **************************************************************************************************
12
14 USE bibliography, ONLY: andermatt2016,&
15 cite_reference
16 USE cell_types, ONLY: cell_type
19 USE cp_dbcsr_api, ONLY: dbcsr_copy,&
25 USE cp_fm_types, ONLY: cp_fm_set_all,&
34 cp_p_file,&
55 USE kinds, ONLY: default_path_length,&
56 dp
57 USE machine, ONLY: m_walltime
60 USE pw_env_types, ONLY: pw_env_type
70 USE qs_ks_types, ONLY: qs_ks_did_change,&
74 USE qs_mo_types, ONLY: get_mo_set,&
79 USE qs_rho_types, ONLY: qs_rho_set,&
86 print_ft,&
89 USE rt_propagation_types, ONLY: get_rtp,&
104#include "../base/base_uses.f90"
105
106 IMPLICIT NONE
107
108 PRIVATE
109
110 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'rt_propagation'
111
112 PUBLIC :: rt_prop_setup
113
114CONTAINS
115
116! **************************************************************************************************
117!> \brief creates rtp_type, gets the initial state, either by reading MO's
118!> from file or calling SCF run
119!> \param force_env ...
120!> \author Florian Schiffmann (02.09)
121! **************************************************************************************************
122
123 SUBROUTINE rt_prop_setup(force_env)
124 TYPE(force_env_type), POINTER :: force_env
125
126 INTEGER :: aspc_order
127 LOGICAL :: magnetic, vel_reprs
128 TYPE(dft_control_type), POINTER :: dft_control
129 TYPE(global_environment_type), POINTER :: globenv
130 TYPE(qs_energy_type), POINTER :: energy
131 TYPE(qs_environment_type), POINTER :: qs_env
132 TYPE(rt_prop_type), POINTER :: rtp
133 TYPE(rtp_control_type), POINTER :: rtp_control
134 TYPE(section_vals_type), POINTER :: hfx_sections, input, ls_scf_section, md_section, &
135 motion_section, print_moments_section, rtp_print_section, rtp_section
136
137 NULLIFY (qs_env, rtp_control, dft_control)
138
139 CALL cite_reference(andermatt2016)
140
141 CALL force_env_get(force_env=force_env, qs_env=qs_env, globenv=globenv)
142 CALL get_qs_env(qs_env, dft_control=dft_control, energy=energy)
143 rtp_control => dft_control%rtp_control
144
145 ! Takes care that an initial wavefunction/density is available
146 ! Can either be by performing an scf loop or reading a restart
147 CALL rt_initial_guess(qs_env, force_env, rtp_control)
148
149 ! Initializes the extrapolation
150 NULLIFY (rtp)
151 CALL get_qs_env(qs_env=qs_env, rtp=rtp, input=input)
152 aspc_order = rtp_control%aspc_order
153 CALL rtp_history_create(rtp, aspc_order)
154
155 ! Reads the simulation parameters from the input
156 motion_section => section_vals_get_subs_vals(force_env%root_section, "MOTION")
157 md_section => section_vals_get_subs_vals(motion_section, "MD")
158 hfx_sections => section_vals_get_subs_vals(force_env%root_section, "FORCE_EVAL%DFT%XC%HF")
159 rtp_section => section_vals_get_subs_vals(force_env%root_section, "FORCE_EVAL%DFT%REAL_TIME_PROPAGATION")
160 print_moments_section => section_vals_get_subs_vals(force_env%root_section, "FORCE_EVAL%DFT%PRINT%MOMENTS")
161 CALL section_vals_val_get(md_section, "TIMESTEP", r_val=qs_env%rtp%dt)
162 CALL section_vals_val_get(md_section, "STEP_START_VAL", i_val=qs_env%rtp%i_start)
163 CALL section_vals_val_get(md_section, "STEPS", i_val=rtp%nsteps)
164 CALL section_vals_val_get(md_section, "MAX_STEPS", i_val=rtp%max_steps)
165
166 ls_scf_section => section_vals_get_subs_vals(input, "DFT%LS_SCF")
167 CALL section_vals_val_get(ls_scf_section, "EPS_FILTER", r_val=rtp%filter_eps)
168 IF (.NOT. qs_env%rtp%linear_scaling) rtp%filter_eps = 0.0_dp
169 IF (rtp_control%acc_ref < 1) rtp_control%acc_ref = 1
170 rtp%filter_eps_small = rtp%filter_eps/rtp_control%acc_ref
171 CALL section_vals_val_get(ls_scf_section, "EPS_LANCZOS", r_val=rtp%lanzcos_threshold)
172 CALL section_vals_val_get(ls_scf_section, "MAX_ITER_LANCZOS", i_val=rtp%lanzcos_max_iter)
173 CALL section_vals_val_get(ls_scf_section, "SIGN_SQRT_ORDER", i_val=rtp%newton_schulz_order)
174 CALL section_vals_get(hfx_sections, explicit=rtp%do_hfx)
175 CALL section_vals_val_get(print_moments_section, "MAGNETIC", l_val=magnetic)
176 CALL section_vals_val_get(print_moments_section, "VEL_REPRS", l_val=vel_reprs)
177
178 rtp%track_imag_density = (magnetic) .OR. (vel_reprs) .OR. (rtp_control%velocity_gauge) &
179 .OR. (rtp%do_hfx) .OR. (.NOT. rtp_control%fixed_ions)
180 rtp%propagate_complex_ks = rtp%do_hfx .OR. rtp_control%velocity_gauge
181
182 ! Marek : In case some print sections that apply so far only to RTBSE are present,
183 ! warn the user that the quantities will not be in fact printed out
184 rtp_print_section => section_vals_get_subs_vals(rtp_section, "PRINT")
185 CALL warn_section_unused(rtp_print_section, "DENSITY_MATRIX", &
186 "DENSITY_MATRIX printing not implemented for non-RTBSE code.")
187
188 CALL rt_init_complex_quantities(qs_env, imag_p=rtp%track_imag_density, &
189 imag_ks=rtp%propagate_complex_ks, imag_h=rtp_control%velocity_gauge)
190
191 IF (rtp_control%save_local_moments) CALL rt_init_local_moments(rtp, qs_env)
192
193 ! Hmm, not really like to initialize with the structure of S but I reckon it is
194 ! done everywhere like this
195 IF (rtp%do_hfx) CALL rtp_hfx_rebuild(qs_env)
196
197 ! Setup the MO projection environment if required
198 IF (rtp_control%is_proj_mo) CALL init_mo_projection(qs_env, rtp_control)
199
200 CALL init_propagation_run(qs_env)
201 IF (.NOT. rtp_control%fixed_ions) THEN
202 !derivativs of the overlap needed for EMD
203 CALL calc_s_derivs(qs_env)
204 ! a bit hidden, but computes SinvH and SinvB (calc_SinvH for CN,EM and ARNOLDI)
205 ! make_etrs_exp in case of ETRS in combination with TAYLOR and PADE
206 END IF
207 CALL init_propagators(qs_env)
208 IF (rtp_control%fixed_ions) THEN
209 CALL run_propagation(qs_env, force_env, globenv)
210 ELSE
211 rtp_control%initial_step = .true.
212 CALL force_env_calc_energy_force(force_env, calc_force=.true.)
213 rtp_control%initial_step = .false.
214 rtp%energy_old = energy%total
215 END IF
216
217 IF (rtp_control%save_local_moments) THEN
218 ! Call routines for outputs and deallocations of FT observables
219 CALL final_ft_output(qs_env)
220 END IF
221
222 IF (ASSOCIATED(rtp_control%print_pol_elements)) DEALLOCATE (rtp_control%print_pol_elements)
223
224 END SUBROUTINE rt_prop_setup
225
226! **************************************************************************************************
227!> \brief calculates the matrices needed in the first step of EMD/RTP
228!> \param qs_env ...
229!> \author Florian Schiffmann (02.09)
230! **************************************************************************************************
231
232 SUBROUTINE init_propagation_run(qs_env)
233 TYPE(qs_environment_type), POINTER :: qs_env
234
235 REAL(kind=dp), PARAMETER :: zero = 0.0_dp
236
237 INTEGER :: i, ispin, re
238 INTEGER, DIMENSION(2) :: nelectron_spin
239 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new, mos_old
240 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, rho_new, rho_old
241 TYPE(dft_control_type), POINTER :: dft_control
242 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
243 TYPE(rt_prop_type), POINTER :: rtp
244 TYPE(rtp_control_type), POINTER :: rtp_control
245
246 NULLIFY (dft_control, rtp, rtp_control)
247
248 CALL cite_reference(andermatt2016)
249
250 CALL get_qs_env(qs_env, &
251 rtp=rtp, &
252 dft_control=dft_control)
253 rtp_control => dft_control%rtp_control
254
255 IF (rtp_control%initial_wfn == use_scf_wfn) THEN
256 IF (rtp_control%apply_delta_pulse .OR. rtp_control%apply_delta_pulse_mag) THEN
257 CALL apply_delta_pulse(qs_env, rtp, rtp_control)
258 ELSE
259 IF (.NOT. rtp%linear_scaling) THEN
260 CALL get_rtp(rtp=rtp, mos_old=mos_old)
261 CALL get_qs_env(qs_env, mos=mos)
262 DO i = 1, SIZE(mos)
263 CALL cp_fm_to_fm(mos(i)%mo_coeff, mos_old(2*i - 1))
264 CALL cp_fm_set_all(mos_old(2*i), zero, zero)
265 END DO
266 END IF
267 END IF
268 END IF
269
270 IF (.NOT. rtp%linear_scaling) THEN
271 CALL get_rtp(rtp=rtp, mos_old=mos_old, mos_new=mos_new)
272 DO i = 1, SIZE(mos_old)
273 CALL cp_fm_to_fm(mos_old(i), mos_new(i))
274 END DO
275 CALL calc_update_rho(qs_env)
276 ELSE
277 IF (rtp_control%initial_wfn == use_scf_wfn) THEN
278 CALL get_qs_env(qs_env, &
279 matrix_ks=matrix_ks, &
280 mos=mos, &
281 nelectron_spin=nelectron_spin)
282 IF (ASSOCIATED(mos)) THEN
283 !The wavefunction was minimized by an mo based algorith. P is therefore calculated from the mos
284 IF (ASSOCIATED(rtp%mos)) THEN
285 IF (ASSOCIATED(rtp%mos%old)) THEN
286 ! Delta kick was applied and the results is in rtp%mos%old
287 CALL rt_initialize_rho_from_mos(rtp, mos, mos_old=rtp%mos%old)
288 ELSE
289 CALL rt_initialize_rho_from_mos(rtp, mos)
290 END IF
291 ELSE
292 CALL rt_initialize_rho_from_mos(rtp, mos)
293 END IF
294 ELSE
295 !The wavefunction was minimized using a linear scaling method. The density matrix is therefore taken from the ls_scf_env.
296 CALL get_rtp(rtp=rtp, rho_old=rho_old, rho_new=rho_new)
297 DO ispin = 1, SIZE(rho_old)/2
298 re = 2*ispin - 1
299 CALL dbcsr_copy(rho_old(re)%matrix, qs_env%ls_scf_env%matrix_p(ispin))
300 CALL dbcsr_copy(rho_new(re)%matrix, qs_env%ls_scf_env%matrix_p(ispin))
301 END DO
302 END IF
303 CALL calc_update_rho_sparse(qs_env)
304 END IF
305 END IF
306 ! Modify KS matrix to include the additional terms in the velocity gauge
307 IF (rtp_control%velocity_gauge) THEN
308 ! As matrix_h and matrix_h_im are not updated by qs_ks_update_qs_env()
309 ! the non-gauge transformed non-local part has to be subtracted here
310 CALL velocity_gauge_ks_matrix(qs_env, subtract_nl_term=.true.)
311 END IF
312 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false.)
313
314 END SUBROUTINE init_propagation_run
315
316! **************************************************************************************************
317!> \brief performs the real RTP run, gets information from MD section
318!> uses MD as iteration level
319!> \param qs_env ...
320!> \param force_env ...
321!> \param globenv ...
322!> \author Florian Schiffmann (02.09)
323! **************************************************************************************************
324
325 SUBROUTINE run_propagation(qs_env, force_env, globenv)
326 TYPE(qs_environment_type), POINTER :: qs_env
327 TYPE(force_env_type), POINTER :: force_env
328 TYPE(global_environment_type), POINTER :: globenv
329
330 CHARACTER(len=*), PARAMETER :: routinen = 'run_propagation'
331
332 INTEGER :: aspc_order, handle, i_iter, i_step, &
333 max_iter, max_steps, output_unit
334 LOGICAL :: moments_read, should_stop
335 REAL(kind=dp) :: eps_ener, time_iter_start, &
336 time_iter_stop, used_time
337 TYPE(cp_logger_type), POINTER :: logger
338 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_new
339 TYPE(dft_control_type), POINTER :: dft_control
340 TYPE(pw_env_type), POINTER :: pw_env
341 TYPE(qs_energy_type), POINTER :: energy
342 TYPE(rt_prop_type), POINTER :: rtp
343 TYPE(rtp_control_type), POINTER :: rtp_control
344 TYPE(section_vals_type), POINTER :: input, moments_section, rtp_section
345
346 should_stop = .false.
347 CALL timeset(routinen, handle)
348
349 CALL cite_reference(andermatt2016)
350
351 NULLIFY (logger, dft_control, energy, rtp, rtp_control, input, rtp_section)
352 logger => cp_get_default_logger()
353
354 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, rtp=rtp, energy=energy, input=input)
355
356 rtp_control => dft_control%rtp_control
357 max_steps = min(rtp%nsteps, rtp%max_steps)
358 max_iter = rtp_control%max_iter
359 eps_ener = rtp_control%eps_ener
360
361 aspc_order = rtp_control%aspc_order
362
363 rtp%energy_old = energy%total
364 time_iter_start = m_walltime()
365 CALL cp_add_iter_level(logger%iter_info, "MD")
366 CALL cp_iterate(logger%iter_info, iter_nr=0)
367 IF (rtp%i_start >= max_steps) CALL cp_abort(__location__, &
368 "maximum step number smaller than initial step value")
369
370 rtp_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION")
371 output_unit = cp_print_key_unit_nr(logger, rtp_section, "PRINT%PROGRAM_RUN_INFO", &
372 extension=".scfLog")
373 ! Add the zero iteration moments to the moment trace
374 IF (rtp_control%save_local_moments) THEN
375 CALL get_rtp(rtp, rho_new=rho_new)
376 moments_section => section_vals_get_subs_vals(rtp_section, "PRINT%MOMENTS")
377 ! TODO : Conditions on when not to read the files
378 CALL read_moments(moments_section, 0, rtp%i_start, rtp%moments, rtp%times, moments_read)
379 ! Recalculate the field at times in the trace/Read the field from the files
380 CALL recalculate_fields(rtp%fields, rtp%times, 0, rtp%i_start, dft_control)
381 IF (.NOT. moments_read) THEN
382 CALL calc_local_moment(rtp%local_moments, rho_new, rtp%local_moments_work, rtp%moments(:, :, 1))
383 qs_env%sim_time = real(rtp%i_start, dp)*rtp%dt
384 rtp%times(1) = qs_env%sim_time
385 CALL print_moments(moments_section, output_unit, rtp%moments(:, :, 1), &
386 qs_env%sim_time, rtp%track_imag_density)
387 END IF
388 END IF
389
390 DO i_step = rtp%i_start + 1, max_steps
391 IF (output_unit > 0) THEN
392 WRITE (output_unit, fmt="(/,(T2,A,T40,I6))") &
393 "Real time propagation step:", i_step
394 END IF
395 energy%efield_core = 0.0_dp
396 qs_env%sim_time = real(i_step, dp)*rtp%dt
397 CALL get_qs_env(qs_env, pw_env=pw_env)
398 pw_env%poisson_env%parameters%dbc_params%time = qs_env%sim_time
399 qs_env%sim_step = i_step
400 rtp%istep = i_step - rtp%i_start
401 CALL calculate_ecore_efield(qs_env, .false.)
402 IF (dft_control%apply_external_potential) THEN
403 IF (.NOT. dft_control%expot_control%static) THEN
404 dft_control%eval_external_potential = .true.
405 END IF
406 END IF
407 CALL external_c_potential(qs_env, calculate_forces=.false.)
408 CALL external_e_potential(qs_env)
409 CALL cp_iterate(logger%iter_info, last=(i_step == max_steps), iter_nr=i_step)
410 rtp%converged = .false.
411 DO i_iter = 1, max_iter
412 IF (i_step == rtp%i_start + 1 .AND. i_iter == 2 .AND. rtp_control%hfx_redistribute) &
413 CALL qs_ks_did_change(qs_env%ks_env, s_mstruct_changed=.true.)
414 rtp%iter = i_iter
415 CALL propagation_step(qs_env, rtp, rtp_control)
416 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false.)
417 rtp%energy_new = energy%total
418 IF (rtp%converged) EXIT
419 CALL rt_prop_output(qs_env, real_time_propagation, rtp%delta_iter)
420 END DO
421 IF (rtp%converged) THEN
422 CALL external_control(should_stop, "MD", globenv=globenv)
423 IF (should_stop) CALL cp_iterate(logger%iter_info, last=.true., iter_nr=i_step)
424 time_iter_stop = m_walltime()
425 used_time = time_iter_stop - time_iter_start
426 time_iter_start = time_iter_stop
427 CALL rt_prop_output(qs_env, real_time_propagation, delta_iter=rtp%delta_iter, used_time=used_time)
428 CALL rt_write_input_restart(force_env=force_env, qs_env=qs_env)
429 IF (should_stop) EXIT
430 ELSE
431 EXIT
432 END IF
433 END DO
434 CALL cp_rm_iter_level(logger%iter_info, "MD")
435
436 IF (.NOT. rtp%converged) &
437 CALL cp_abort(__location__, "propagation did not converge, "// &
438 "either increase MAX_ITER or use a smaller TIMESTEP")
439
440 CALL timestop(handle)
441
442 END SUBROUTINE run_propagation
443
444! **************************************************************************************************
445!> \brief overwrites some values in the input file such that the .restart
446!> file will contain the appropriate information
447!> \param md_env ...
448!> \param qs_env ...
449!> \param force_env ...
450!> \author Florian Schiffmann (02.09)
451! **************************************************************************************************
452
453 SUBROUTINE rt_write_input_restart(md_env, qs_env, force_env)
454 TYPE(md_environment_type), OPTIONAL, POINTER :: md_env
455 TYPE(qs_environment_type), OPTIONAL, POINTER :: qs_env
456 TYPE(force_env_type), POINTER :: force_env
457
458 CHARACTER(len=default_path_length) :: file_name
459 REAL(kind=dp), DIMENSION(:), POINTER :: tmp_vals
460 TYPE(cp_logger_type), POINTER :: logger
461 TYPE(dft_control_type), POINTER :: dft_control
462 TYPE(section_vals_type), POINTER :: dft_section, efield_section, &
463 motion_section, print_key, &
464 root_section, rt_section
465
466 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
467 root_section => force_env%root_section
468 motion_section => section_vals_get_subs_vals(root_section, "MOTION")
469 dft_section => section_vals_get_subs_vals(root_section, "FORCE_EVAL%DFT")
470 rt_section => section_vals_get_subs_vals(root_section, "FORCE_EVAL%DFT%REAL_TIME_PROPAGATION")
471
472 CALL section_vals_val_set(rt_section, "INITIAL_WFN", i_val=use_rt_restart)
473 CALL section_vals_val_set(rt_section, "APPLY_DELTA_PULSE", l_val=.false.)
474 CALL section_vals_val_set(rt_section, "APPLY_DELTA_PULSE_MAG", l_val=.false.)
475 CALL section_vals_val_set(rt_section, "APPLY_WFN_MIX_INIT_RESTART", l_val=.false.)
476
477 logger => cp_get_default_logger()
478
479 ! to continue propagating the TD wavefunction we need to read from the new .rtpwfn
480 IF (btest(cp_print_key_should_output(logger%iter_info, &
481 rt_section, "PRINT%RESTART"), cp_p_file)) THEN
482 print_key => section_vals_get_subs_vals(rt_section, "PRINT%RESTART")
483 file_name = cp_print_key_generate_filename(logger, print_key, &
484 extension=".rtpwfn", my_local=.false.)
485 CALL section_vals_val_set(dft_section, "WFN_RESTART_FILE_NAME", c_val=trim(file_name))
486 END IF
487
488 ! coming from RTP
489 IF (.NOT. PRESENT(md_env)) THEN
490 CALL section_vals_val_set(motion_section, "MD%STEP_START_VAL", i_val=force_env%qs_env%sim_step)
491 END IF
492
493 IF (dft_control%apply_vector_potential) THEN
494 efield_section => section_vals_get_subs_vals(root_section, "FORCE_EVAL%DFT%EFIELD")
495 NULLIFY (tmp_vals)
496 ALLOCATE (tmp_vals(3))
497 tmp_vals = dft_control%efield_fields(1)%efield%vec_pot_initial
498 CALL section_vals_val_set(efield_section, "VEC_POT_INITIAL", &
499 r_vals_ptr=tmp_vals, &
500 i_rep_section=1)
501 END IF
502
503 CALL write_restart(md_env=md_env, root_section=root_section)
504
505 END SUBROUTINE rt_write_input_restart
506
507! **************************************************************************************************
508!> \brief Creates the initial electronic states and allocates the necessary
509!> matrices
510!> \param qs_env ...
511!> \param force_env ...
512!> \param rtp_control ...
513!> \author Florian Schiffmann (02.09)
514! **************************************************************************************************
515
516 SUBROUTINE rt_initial_guess(qs_env, force_env, rtp_control)
517 TYPE(qs_environment_type), POINTER :: qs_env
518 TYPE(force_env_type), POINTER :: force_env
519 TYPE(rtp_control_type), POINTER :: rtp_control
520
521 INTEGER :: homo, ispin
522 LOGICAL :: energy_consistency
523 TYPE(cp_fm_type), POINTER :: mo_coeff
524 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
525 TYPE(dft_control_type), POINTER :: dft_control
526
527 NULLIFY (matrix_s, dft_control)
528 CALL get_qs_env(qs_env, dft_control=dft_control)
529 cpassert(ASSOCIATED(qs_env))
530
531 SELECT CASE (rtp_control%initial_wfn)
532 CASE (use_scf_wfn)
533 qs_env%sim_time = 0.0_dp
534 qs_env%sim_step = 0
535 energy_consistency = .true.
536 !in the linear scaling case we need a correct kohn-sham matrix, which we cannot get with consistent energies
537 IF (rtp_control%linear_scaling) energy_consistency = .false.
538 CALL force_env_calc_energy_force(force_env, calc_force=.false., &
539 consistent_energies=energy_consistency)
540 qs_env%run_rtp = .true.
541 ALLOCATE (qs_env%rtp)
542 CALL get_qs_env(qs_env, matrix_s=matrix_s)
543 IF (dft_control%do_admm) THEN
544 CALL hfx_admm_init(qs_env)
545 CALL rt_prop_create(qs_env%rtp, qs_env%mos, qs_env%mpools, dft_control, matrix_s(1)%matrix, &
546 rtp_control%linear_scaling, qs_env%admm_env%mos_aux_fit)
547 ELSE
548 CALL rt_prop_create(qs_env%rtp, qs_env%mos, qs_env%mpools, dft_control, matrix_s(1)%matrix, &
549 rtp_control%linear_scaling)
550 END IF
551
553 CALL qs_energies_init(qs_env, .false.)
554 IF (.NOT. rtp_control%linear_scaling .OR. rtp_control%initial_wfn == use_restart_wfn) THEN
555 DO ispin = 1, SIZE(qs_env%mos)
556 CALL get_mo_set(qs_env%mos(ispin), mo_coeff=mo_coeff, homo=homo)
557 IF (.NOT. ASSOCIATED(mo_coeff)) THEN
558 CALL init_mo_set(qs_env%mos(ispin), &
559 qs_env%mpools%ao_mo_fm_pools(ispin)%pool, &
560 name="qs_env%mo"//trim(adjustl(cp_to_string(ispin))))
561 END IF
562 END DO
563 IF (dft_control%do_admm) CALL hfx_admm_init(qs_env)
564 END IF
565 ALLOCATE (qs_env%rtp)
566 CALL get_qs_env(qs_env, matrix_s=matrix_s)
567 CALL rt_prop_create(qs_env%rtp, qs_env%mos, qs_env%mpools, dft_control, matrix_s(1)%matrix, &
568 rtp_control%linear_scaling, qs_env%admm_env%mos_aux_fit)
569 CALL get_restart_wfn(qs_env)
570 cpassert(ASSOCIATED(qs_env))
571
572 qs_env%run_rtp = .true.
573 END SELECT
574
575 END SUBROUTINE rt_initial_guess
576
577! **************************************************************************************************
578!> \brief ...
579!> \param qs_env ...
580!> \param imag_p ...
581!> \param imag_ks ...
582!> \param imag_h ...
583! **************************************************************************************************
584 SUBROUTINE rt_init_complex_quantities(qs_env, imag_p, imag_ks, imag_h)
585 TYPE(qs_environment_type), POINTER :: qs_env
586 LOGICAL, INTENT(in) :: imag_p, imag_ks, imag_h
587
588 TYPE(dft_control_type), POINTER :: dft_control
589 TYPE(qs_ks_env_type), POINTER :: ks_env
590 TYPE(qs_rho_type), POINTER :: rho
591 TYPE(rt_prop_type), POINTER :: rtp
592
593 NULLIFY (ks_env, rho, dft_control)
594
595 CALL get_qs_env(qs_env, &
596 dft_control=dft_control, &
597 ks_env=ks_env, &
598 rho=rho, &
599 rtp=rtp)
600
601 ! rho
602 CALL qs_rho_set(rho, complex_rho_ao=imag_p)
603 IF (imag_p) CALL allocate_rho_ao_imag_from_real(rho, qs_env)
604
605 ! ks
606 CALL set_ks_env(ks_env, complex_ks=imag_ks)
607 IF (imag_ks) THEN
608 CALL qs_ks_allocate_basics(qs_env, is_complex=imag_ks)
609 IF (.NOT. dft_control%rtp_control%fixed_ions) &
610 CALL rtp_create_sinvh_imag(rtp, dft_control%nspins)
611 END IF
612
613 ! h
614 IF (imag_h) CALL qs_matrix_h_allocate_imag_from_real(qs_env)
615
616 END SUBROUTINE rt_init_complex_quantities
617
618! **************************************************************************************************
619!> \brief Allocates and fills the local moment matrices (only available for linear scaling)
620!> \param rtp Real time propagtion properties - local moment matrices are stored there
621!> \param qs_env QS environment necessary for moment matrix calculation
622! **************************************************************************************************
623 SUBROUTINE rt_init_local_moments(rtp, qs_env)
624 TYPE(rt_prop_type), POINTER :: rtp
625 TYPE(qs_environment_type), POINTER :: qs_env
626
627 INTEGER :: k, nspin, output_unit
628 REAL(kind=dp), DIMENSION(3) :: reference_point
629 TYPE(cp_logger_type), POINTER :: logger
630 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, rho_old
631 TYPE(dft_control_type), POINTER :: dft_control
632 TYPE(rtp_control_type), POINTER :: rtc
633 TYPE(section_vals_type), POINTER :: input, moments_section
634
635 logger => cp_get_default_logger()
636 output_unit = cp_logger_get_default_io_unit(logger)
637
638 CALL get_qs_env(qs_env, dft_control=dft_control, matrix_s=matrix_s, input=input)
639 rtc => dft_control%rtp_control
640 moments_section => section_vals_get_subs_vals(input, &
641 "DFT%REAL_TIME_PROPAGATION%PRINT%MOMENTS")
642
643 ! Construct the local moments matrix - copy from matrix_s structure
644 ! NOTE : construction where blocks are allocated by neighbour lists does not seem to work,
645 ! so doing a copy instead of:
646 ! CALL dbcsr_create(rtp%local_moments(k)%matrix, template=matrix_s(1)%matrix, &
647 ! name="Local moment")
648 ! CALL cp_dbcsr_alloc_block_from_nbl(rtp%local_moments(k)%matrix, sab_all)
649 NULLIFY (rtp%local_moments)
650 ALLOCATE (rtp%local_moments(3))
651 DO k = 1, 3
652 NULLIFY (rtp%local_moments(k)%matrix)
653 ALLOCATE (rtp%local_moments(k)%matrix)
654 CALL dbcsr_create(rtp%local_moments(k)%matrix, template=matrix_s(1)%matrix, name="Local moment")
655 CALL dbcsr_copy(rtp%local_moments(k)%matrix, matrix_s(1)%matrix)
656 CALL dbcsr_set(rtp%local_moments(k)%matrix, 0.0_dp)
657 END DO
658 ! Workspace allocation
659 NULLIFY (rtp%local_moments_work)
660 ALLOCATE (rtp%local_moments_work)
661 CALL dbcsr_create(rtp%local_moments_work, template=rtp%local_moments(1)%matrix, name="tmp")
662 CALL dbcsr_copy(rtp%local_moments_work, rtp%local_moments(1)%matrix)
663
664 CALL get_reference_point(rpoint=reference_point, qs_env=qs_env, &
665 reference=rtc%moment_trace_ref_type, ref_point=rtc%moment_trace_user_ref_point)
666
667 CALL build_local_moment_matrix(qs_env, rtp%local_moments, 1, reference_point)
668
669 ! Allocate the moments trace and output start moments
670 CALL get_rtp(rtp, rho_old=rho_old)
671 nspin = SIZE(rho_old)/2
672 ALLOCATE (rtp%moments(SIZE(rho_old)/2, 3, rtp%nsteps + 1), source=cmplx(0.0, 0.0, kind=dp))
673 NULLIFY (rtp%times)
674 ALLOCATE (rtp%times(rtp%nsteps + 1))
675 NULLIFY (rtp%fields)
676 ALLOCATE (rtp%fields(3, rtp%nsteps + 1), source=cmplx(0.0, 0.0, kind=dp))
677
678 END SUBROUTINE rt_init_local_moments
679
680! **************************************************************************************************
681!> \brief Allocates and fills the local moment matrices (only available for linear scaling)
682!> \param qs_env QS environment necessary for moment matrix calculation
683! **************************************************************************************************
684 SUBROUTINE final_ft_output(qs_env)
685 TYPE(qs_environment_type), POINTER :: qs_env
686
687 INTEGER :: k, unit_nr
688 TYPE(cell_type), POINTER :: cell
689 TYPE(cp_logger_type), POINTER :: logger
690 TYPE(dft_control_type), POINTER :: dft_control
691 TYPE(rt_prop_type), POINTER :: rtp
692 TYPE(section_vals_type), POINTER :: input, rtp_section
693
694 CALL get_qs_env(qs_env, cell=cell, rtp=rtp, input=input, dft_control=dft_control)
695 rtp_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION")
696 logger => cp_get_default_logger()
697 unit_nr = cp_logger_get_default_io_unit(logger)
698 CALL print_ft(rtp_section, rtp%moments, rtp%times, rtp%fields, dft_control%rtp_control, &
699 info_opt=unit_nr, cell=cell)
700 ! Deallocating the local moments matrices and array
701 DO k = 1, 3
702 CALL dbcsr_release(rtp%local_moments(k)%matrix)
703 DEALLOCATE (rtp%local_moments(k)%matrix)
704 END DO
705 DEALLOCATE (rtp%local_moments)
706 CALL dbcsr_release(rtp%local_moments_work)
707 DEALLOCATE (rtp%local_moments_work)
708 DEALLOCATE (rtp%moments)
709 DEALLOCATE (rtp%times)
710 DEALLOCATE (rtp%fields)
711 END SUBROUTINE final_ft_output
712
713END MODULE rt_propagation
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public andermatt2016
Handles all functions related to the CELL.
Definition cell_types.F:15
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
Routines to handle the external control of CP2K.
subroutine, public external_control(should_stop, flag, globenv, target_time, start_time, force_check)
External manipulations during a run : when the <PROJECT_NAME>.EXIT_$runtype command is sent the progr...
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
character(len=default_path_length) function, public cp_print_key_generate_filename(logger, print_key, middle_name, extension, my_local)
Utility function that returns a unit number to write the print key. Might open a file with a unique f...
integer, parameter, public cp_p_file
subroutine, public cp_iterate(iteration_info, last, iter_nr, increment, iter_nr_out)
adds one to the actual iteration
subroutine, public cp_rm_iter_level(iteration_info, level_name, n_rlevel_att)
Removes an iteration level.
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
subroutine, public cp_add_iter_level(iteration_info, level_name, n_rlevel_new)
Adds an iteration level.
all routins needed for a nonperiodic electric field
subroutine, public calculate_ecore_efield(qs_env, calculate_forces)
Computes the force and the energy due to a efield on the cores Note: In the velocity gauge,...
Interface for the force calculations.
recursive subroutine, public force_env_calc_energy_force(force_env, calc_force, consistent_energies, skip_external_control, eval_energy_forces, require_consistent_energy_force, linres, calc_stress_tensor)
Interface routine for force and energy calculations.
Interface for the force calculations.
recursive subroutine, public force_env_get(force_env, in_use, fist_env, qs_env, meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, method_name_id, root_section, mixed_env, nnp_env, embed_env, ipi_env)
returns various attributes about the force environment
Define type storing the global information of a run. Keep the amount of stored data small....
Utilities for hfx and admm methods.
subroutine, public hfx_admm_init(qs_env, calculate_forces)
...
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public use_restart_wfn
integer, parameter, public use_scf_wfn
integer, parameter, public use_rt_restart
integer, parameter, public real_time_propagation
Set of routines to dump the restart file of CP2K.
subroutine, public write_restart(md_env, force_env, root_section, coords, vels, pint_env, helium_env)
checks if a restart needs to be written and does so, updating all necessary fields in the input file....
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_val_set(section_vals, keyword_name, i_rep_section, i_rep_val, val, l_val, i_val, r_val, c_val, l_vals_ptr, i_vals_ptr, r_vals_ptr, c_vals_ptr)
sets the requested value
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_path_length
Definition kinds.F:58
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition machine.F:153
Calculates the moment integrals <a|r^m|b>
subroutine, public get_reference_point(rpoint, drpoint, qs_env, fist_env, reference, ref_point, ifirst, ilast)
...
container for various plainwaves related things
Calculation of the core Hamiltonian integral matrix <a|H|b> over Cartesian Gaussian-type functions.
subroutine, public qs_matrix_h_allocate_imag_from_real(qs_env)
(Re-)allocates matrix_h_im from matrix_h
Utility subroutine for qs energy calculation.
subroutine, public qs_energies_init(qs_env, calc_forces)
Refactoring of qs_energies_scf. Driver routine for the initial setup and calculations for a qs energy...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Routines to handle an external electrostatic field The external field can be generic and is provided ...
subroutine, public external_c_potential(qs_env, calculate_forces)
Computes the force and the energy due to the external potential on the cores.
subroutine, public external_e_potential(qs_env)
Computes the external potential on the grid.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public qs_ks_allocate_basics(qs_env, is_complex)
Allocate ks_matrix if necessary, take current overlap matrix as template.
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, vppl, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
Definition and initialisation of the mo data type.
Definition qs_mo_io.F:21
subroutine, public wfn_restart_file_name(filename, exist, section, logger, kp, xas, rtp)
...
Definition qs_mo_io.F:450
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
Definition qs_moments.F:14
subroutine, public build_local_moment_matrix(qs_env, moments, nmoments, ref_point, ref_points, basis_type)
...
Definition qs_moments.F:560
methods of the rho structure (defined in qs_rho_types)
subroutine, public allocate_rho_ao_imag_from_real(rho, qs_env)
(Re-)allocates rho_ao_im from real part rho_ao
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_set(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
...
Routines to apply a delta pulse for RTP and EMD.
subroutine, public apply_delta_pulse(qs_env, rtp, rtp_control)
Interface to call the delta pulse depending on the type of calculation.
Utility functions that are needed for RTP/EMD in combination with HF or hybrid functionals (needs to ...
subroutine, public rtp_hfx_rebuild(qs_env)
rebuilds the structures of P and KS (imaginary) in case S changed
Function related to MO projection in RTP calculations.
subroutine, public init_mo_projection(qs_env, rtp_control)
Initialize the mo projection objects for time dependent run.
Routines for propagating the orbitals.
subroutine, public propagation_step(qs_env, rtp, rtp_control)
performs a single propagation step a(t+Dt)=U(t+Dt,t)*a(0) and calculates the new exponential
Routine for the real time propagation output.
subroutine, public print_ft(rtp_section, moments, times, fields, rtc, info_opt, cell)
Calculate and print the Fourier transforms + polarizabilites from moment trace.
subroutine, public rt_prop_output(qs_env, run_type, delta_iter, used_time)
...
subroutine, public print_moments(moments_section, info_unit, moments, time, imag_opt)
Print the dipole moments into a file.
subroutine, public calc_local_moment(moment_matrices, density_matrices, work, moment, imag_opt)
Calculate the values of real/imaginary parts of moments in all directions.
Types and set_get for real time propagation depending on runtype and diagonalization method different...
subroutine, public rt_prop_create(rtp, mos, mpools, dft_control, template, linear_scaling, mos_aux)
...
subroutine, public rtp_create_sinvh_imag(rtp, nspins)
Initialize SinvH_imag for rtp.
subroutine, public rtp_history_create(rtp, aspc_order)
...
subroutine, public get_rtp(rtp, exp_h_old, exp_h_new, h_last_iter, rho_old, rho_next, rho_new, mos, mos_new, mos_old, mos_next, s_inv, s_half, s_minus_half, b_mat, c_mat, propagator_matrix, mixing, mixing_factor, s_der, dt, nsteps, sinvh, sinvh_imag, sinvb, admm_mos)
...
Routines needed for EMD.
subroutine, public calc_update_rho_sparse(qs_env)
Copies the density matrix back into the qs_envrhorho_ao.
subroutine, public recalculate_fields(fields, times, orig_start, i_start, dft_control)
Recalculates the field for index range given by orig_start and i_start, with times taken from the tim...
subroutine, public calc_s_derivs(qs_env)
Calculates dS/dR respectily the velocity weighted derivatves only needed for ehrenfest MD.
subroutine, public read_moments(moments_section, orig_start, current_start, moments, times, mom_read)
Attempt to read the moments from a previously written file.
subroutine, public calc_update_rho(qs_env)
calculates the density from the complex MOs and passes the density to qs_env.
subroutine, public warn_section_unused(section, subsection_name, error_message)
Warn about unused sections of the print section - only implemented for some of the methods.
subroutine, public get_restart_wfn(qs_env)
reads the restart file. At the moment only SCF (means only real)
Routines to perform the RTP in the velocity gauge.
subroutine, public velocity_gauge_ks_matrix(qs_env, subtract_nl_term)
...
Routines for the real time propagation.
subroutine, public rt_prop_setup(force_env)
creates rtp_type, gets the initial state, either by reading MO's from file or calling SCF run
Routines for that prepare rtp and EMD.
subroutine, public init_propagators(qs_env)
prepares the initial matrices for the propagators
subroutine, public rt_initialize_rho_from_mos(rtp, mos, mos_old)
Computes the density matrix from the mos Update: Initialized the density matrix from complex mos (for...
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
wrapper to abstract the force evaluation of the various methods
contains the initially parsed file and the initial parallel environment
contained for different pw related things
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.