(git:ed6f26b)
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
18 USE cp_dbcsr_api, ONLY: dbcsr_copy,&
21 USE cp_fm_types, ONLY: cp_fm_set_all,&
29 cp_p_file,&
50 USE kinds, ONLY: default_path_length,&
51 dp
52 USE machine, ONLY: m_walltime
54 USE pw_env_types, ONLY: pw_env_type
64 USE qs_ks_types, ONLY: qs_ks_did_change,&
68 USE qs_mo_types, ONLY: get_mo_set,&
72 USE qs_rho_types, ONLY: qs_rho_set,&
79 USE rt_propagation_types, ONLY: get_rtp,&
92#include "../base/base_uses.f90"
93
94 IMPLICIT NONE
95
96 PRIVATE
97
98 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'rt_propagation'
99
100 PUBLIC :: rt_prop_setup
101
102CONTAINS
103
104! **************************************************************************************************
105!> \brief creates rtp_type, gets the initial state, either by reading MO's
106!> from file or calling SCF run
107!> \param force_env ...
108!> \author Florian Schiffmann (02.09)
109! **************************************************************************************************
110
111 SUBROUTINE rt_prop_setup(force_env)
112 TYPE(force_env_type), POINTER :: force_env
113
114 INTEGER :: aspc_order
115 LOGICAL :: magnetic, vel_reprs
116 TYPE(dft_control_type), POINTER :: dft_control
117 TYPE(global_environment_type), POINTER :: globenv
118 TYPE(qs_energy_type), POINTER :: energy
119 TYPE(qs_environment_type), POINTER :: qs_env
120 TYPE(rt_prop_type), POINTER :: rtp
121 TYPE(rtp_control_type), POINTER :: rtp_control
122 TYPE(section_vals_type), POINTER :: hfx_sections, input, ls_scf_section, &
123 md_section, motion_section, &
124 print_moments_section, &
125 rtp_print_section
126
127 NULLIFY (qs_env, rtp_control, dft_control)
128
129 CALL cite_reference(andermatt2016)
130
131 CALL force_env_get(force_env=force_env, qs_env=qs_env, globenv=globenv)
132 CALL get_qs_env(qs_env, dft_control=dft_control, energy=energy)
133 rtp_control => dft_control%rtp_control
134
135 ! Takes care that an initial wavefunction/density is available
136 ! Can either be by performing an scf loop or reading a restart
137 CALL rt_initial_guess(qs_env, force_env, rtp_control)
138
139 ! Initializes the extrapolation
140 NULLIFY (rtp)
141 CALL get_qs_env(qs_env=qs_env, rtp=rtp, input=input)
142 aspc_order = rtp_control%aspc_order
143 CALL rtp_history_create(rtp, aspc_order)
144
145 ! Reads the simulation parameters from the input
146 motion_section => section_vals_get_subs_vals(force_env%root_section, "MOTION")
147 md_section => section_vals_get_subs_vals(motion_section, "MD")
148 hfx_sections => section_vals_get_subs_vals(force_env%root_section, "FORCE_EVAL%DFT%XC%HF")
149 print_moments_section => section_vals_get_subs_vals(force_env%root_section, "FORCE_EVAL%DFT%PRINT%MOMENTS")
150 CALL section_vals_val_get(md_section, "TIMESTEP", r_val=qs_env%rtp%dt)
151 CALL section_vals_val_get(md_section, "STEP_START_VAL", i_val=qs_env%rtp%i_start)
152 CALL section_vals_val_get(md_section, "STEPS", i_val=rtp%nsteps)
153 CALL section_vals_val_get(md_section, "MAX_STEPS", i_val=rtp%max_steps)
154
155 ls_scf_section => section_vals_get_subs_vals(input, "DFT%LS_SCF")
156 CALL section_vals_val_get(ls_scf_section, "EPS_FILTER", r_val=rtp%filter_eps)
157 IF (.NOT. qs_env%rtp%linear_scaling) rtp%filter_eps = 0.0_dp
158 IF (rtp_control%acc_ref < 1) rtp_control%acc_ref = 1
159 rtp%filter_eps_small = rtp%filter_eps/rtp_control%acc_ref
160 CALL section_vals_val_get(ls_scf_section, "EPS_LANCZOS", r_val=rtp%lanzcos_threshold)
161 CALL section_vals_val_get(ls_scf_section, "MAX_ITER_LANCZOS", i_val=rtp%lanzcos_max_iter)
162 CALL section_vals_val_get(ls_scf_section, "SIGN_SQRT_ORDER", i_val=rtp%newton_schulz_order)
163 CALL section_vals_get(hfx_sections, explicit=rtp%do_hfx)
164 CALL section_vals_val_get(print_moments_section, "MAGNETIC", l_val=magnetic)
165 CALL section_vals_val_get(print_moments_section, "VEL_REPRS", l_val=vel_reprs)
166
167 rtp%track_imag_density = (magnetic) .OR. (vel_reprs) .OR. (rtp_control%velocity_gauge) &
168 .OR. (rtp%do_hfx) .OR. (.NOT. rtp_control%fixed_ions)
169 rtp%propagate_complex_ks = rtp%do_hfx .OR. rtp_control%velocity_gauge
170
171 ! Marek : In case some print sections that apply so far only to RTBSE are present,
172 ! warn the user that the quantities will not be in fact printed out
173 rtp_print_section => section_vals_get_subs_vals(force_env%root_section, &
174 "FORCE_EVAL%DFT%REAL_TIME_PROPAGATION%PRINT")
175 CALL warn_section_unused(rtp_print_section, "POLARIZABILITY", &
176 "POLARIZABILITY printing not implemented for non-RTBSE code.")
177 CALL warn_section_unused(rtp_print_section, "MOMENTS", &
178 "MOMENTS not implemented: Use DFT%PRINT%MOMENTS for moments printing with TDDFT.")
179 CALL warn_section_unused(rtp_print_section, "MOMENTS_FT", &
180 "MOMENTS_FT printing not implemented for non-RTBSE code.")
181 CALL warn_section_unused(rtp_print_section, "DENSITY_MATRIX", &
182 "DENSITY_MATRIX printing not implemented for non-RTBSE code.")
183
184 CALL rt_init_complex_quantities(qs_env, imag_p=rtp%track_imag_density, &
185 imag_ks=rtp%propagate_complex_ks, imag_h=rtp_control%velocity_gauge)
186
187 ! Hmm, not really like to initialize with the structure of S but I reckon it is
188 ! done everywhere like this
189 IF (rtp%do_hfx) CALL rtp_hfx_rebuild(qs_env)
190
191 ! Setup the MO projection environment if required
192 IF (rtp_control%is_proj_mo) CALL init_mo_projection(qs_env, rtp_control)
193
194 CALL init_propagation_run(qs_env)
195 IF (.NOT. rtp_control%fixed_ions) THEN
196 !derivativs of the overlap needed for EMD
197 CALL calc_s_derivs(qs_env)
198 ! a bit hidden, but computes SinvH and SinvB (calc_SinvH for CN,EM and ARNOLDI)
199 ! make_etrs_exp in case of ETRS in combination with TAYLOR and PADE
200 END IF
201 CALL init_propagators(qs_env)
202 IF (rtp_control%fixed_ions) THEN
203 CALL run_propagation(qs_env, force_env, globenv)
204 ELSE
205 rtp_control%initial_step = .true.
206 CALL force_env_calc_energy_force(force_env, calc_force=.true.)
207 rtp_control%initial_step = .false.
208 rtp%energy_old = energy%total
209 END IF
210
211 END SUBROUTINE rt_prop_setup
212
213! **************************************************************************************************
214!> \brief calculates the matrices needed in the first step of EMD/RTP
215!> \param qs_env ...
216!> \author Florian Schiffmann (02.09)
217! **************************************************************************************************
218
219 SUBROUTINE init_propagation_run(qs_env)
220 TYPE(qs_environment_type), POINTER :: qs_env
221
222 REAL(kind=dp), PARAMETER :: zero = 0.0_dp
223
224 INTEGER :: i, ispin, re
225 INTEGER, DIMENSION(2) :: nelectron_spin
226 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new, mos_old
227 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, rho_new, rho_old
228 TYPE(dft_control_type), POINTER :: dft_control
229 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
230 TYPE(rt_prop_type), POINTER :: rtp
231 TYPE(rtp_control_type), POINTER :: rtp_control
232
233 NULLIFY (dft_control, rtp, rtp_control)
234
235 CALL cite_reference(andermatt2016)
236
237 CALL get_qs_env(qs_env, &
238 rtp=rtp, &
239 dft_control=dft_control)
240 rtp_control => dft_control%rtp_control
241
242 IF (rtp_control%initial_wfn == use_scf_wfn) THEN
243 IF (rtp_control%apply_delta_pulse .OR. rtp_control%apply_delta_pulse_mag) THEN
244 CALL apply_delta_pulse(qs_env, rtp, rtp_control)
245 ELSE
246 IF (.NOT. rtp%linear_scaling) THEN
247 CALL get_rtp(rtp=rtp, mos_old=mos_old)
248 CALL get_qs_env(qs_env, mos=mos)
249 DO i = 1, SIZE(mos)
250 CALL cp_fm_to_fm(mos(i)%mo_coeff, mos_old(2*i - 1))
251 CALL cp_fm_set_all(mos_old(2*i), zero, zero)
252 END DO
253 END IF
254 END IF
255 END IF
256
257 IF (.NOT. rtp%linear_scaling) THEN
258 CALL get_rtp(rtp=rtp, mos_old=mos_old, mos_new=mos_new)
259 DO i = 1, SIZE(mos_old)
260 CALL cp_fm_to_fm(mos_old(i), mos_new(i))
261 END DO
262 CALL calc_update_rho(qs_env)
263 ELSE
264 IF (rtp_control%initial_wfn == use_scf_wfn) THEN
265 CALL get_qs_env(qs_env, &
266 matrix_ks=matrix_ks, &
267 mos=mos, &
268 nelectron_spin=nelectron_spin)
269 IF (ASSOCIATED(mos)) THEN
270 !The wavefunction was minimized by an mo based algorith. P is therefore calculated from the mos
271 IF (ASSOCIATED(rtp%mos)) THEN
272 IF (ASSOCIATED(rtp%mos%old)) THEN
273 ! Delta kick was applied and the results is in rtp%mos%old
274 CALL rt_initialize_rho_from_mos(rtp, mos, mos_old=rtp%mos%old)
275 ELSE
276 CALL rt_initialize_rho_from_mos(rtp, mos)
277 END IF
278 ELSE
279 CALL rt_initialize_rho_from_mos(rtp, mos)
280 END IF
281 ELSE
282 !The wavefunction was minimized using a linear scaling method. The density matrix is therefore taken from the ls_scf_env.
283 CALL get_rtp(rtp=rtp, rho_old=rho_old, rho_new=rho_new)
284 DO ispin = 1, SIZE(rho_old)/2
285 re = 2*ispin - 1
286 CALL dbcsr_copy(rho_old(re)%matrix, qs_env%ls_scf_env%matrix_p(ispin))
287 CALL dbcsr_copy(rho_new(re)%matrix, qs_env%ls_scf_env%matrix_p(ispin))
288 END DO
289 END IF
290 CALL calc_update_rho_sparse(qs_env)
291 END IF
292 END IF
293 ! Modify KS matrix to include the additional terms in the velocity gauge
294 IF (rtp_control%velocity_gauge) THEN
295 ! As matrix_h and matrix_h_im are not updated by qs_ks_update_qs_env()
296 ! the non-gauge transformed non-local part has to be subtracted here
297 CALL velocity_gauge_ks_matrix(qs_env, subtract_nl_term=.true.)
298 END IF
299 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false.)
300
301 END SUBROUTINE init_propagation_run
302
303! **************************************************************************************************
304!> \brief performs the real RTP run, gets information from MD section
305!> uses MD as iteration level
306!> \param qs_env ...
307!> \param force_env ...
308!> \param globenv ...
309!> \author Florian Schiffmann (02.09)
310! **************************************************************************************************
311
312 SUBROUTINE run_propagation(qs_env, force_env, globenv)
313 TYPE(qs_environment_type), POINTER :: qs_env
314 TYPE(force_env_type), POINTER :: force_env
315 TYPE(global_environment_type), POINTER :: globenv
316
317 CHARACTER(len=*), PARAMETER :: routinen = 'run_propagation'
318
319 INTEGER :: aspc_order, handle, i_iter, i_step, &
320 max_iter, max_steps, output_unit
321 LOGICAL :: should_stop
322 REAL(kind=dp) :: eps_ener, time_iter_start, &
323 time_iter_stop, used_time
324 TYPE(cp_logger_type), POINTER :: logger
325 TYPE(dft_control_type), POINTER :: dft_control
326 TYPE(pw_env_type), POINTER :: pw_env
327 TYPE(qs_energy_type), POINTER :: energy
328 TYPE(rt_prop_type), POINTER :: rtp
329 TYPE(rtp_control_type), POINTER :: rtp_control
330 TYPE(section_vals_type), POINTER :: input, rtp_section
331
332 should_stop = .false.
333 CALL timeset(routinen, handle)
334
335 CALL cite_reference(andermatt2016)
336
337 NULLIFY (logger, dft_control, energy, rtp, rtp_control, input, rtp_section)
338 logger => cp_get_default_logger()
339
340 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, rtp=rtp, energy=energy, input=input)
341
342 rtp_control => dft_control%rtp_control
343 max_steps = min(rtp%nsteps, rtp%max_steps)
344 max_iter = rtp_control%max_iter
345 eps_ener = rtp_control%eps_ener
346
347 aspc_order = rtp_control%aspc_order
348
349 rtp%energy_old = energy%total
350 time_iter_start = m_walltime()
351 CALL cp_add_iter_level(logger%iter_info, "MD")
352 CALL cp_iterate(logger%iter_info, iter_nr=0)
353 IF (rtp%i_start >= max_steps) CALL cp_abort(__location__, &
354 "maximum step number smaller than initial step value")
355
356 rtp_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION")
357 output_unit = cp_print_key_unit_nr(logger, rtp_section, "PRINT%PROGRAM_RUN_INFO", &
358 extension=".scfLog")
359
360 DO i_step = rtp%i_start + 1, max_steps
361 IF (output_unit > 0) THEN
362 WRITE (output_unit, fmt="(/,(T2,A,T40,I6))") &
363 "Real time propagation step:", i_step
364 END IF
365 energy%efield_core = 0.0_dp
366 qs_env%sim_time = real(i_step, dp)*rtp%dt
367 CALL get_qs_env(qs_env, pw_env=pw_env)
368 pw_env%poisson_env%parameters%dbc_params%time = qs_env%sim_time
369 qs_env%sim_step = i_step
370 rtp%istep = i_step - rtp%i_start
371 CALL calculate_ecore_efield(qs_env, .false.)
372 IF (dft_control%apply_external_potential) THEN
373 IF (.NOT. dft_control%expot_control%static) THEN
374 dft_control%eval_external_potential = .true.
375 END IF
376 END IF
377 CALL external_c_potential(qs_env, calculate_forces=.false.)
378 CALL external_e_potential(qs_env)
379 CALL cp_iterate(logger%iter_info, last=(i_step == max_steps), iter_nr=i_step)
380 rtp%converged = .false.
381 DO i_iter = 1, max_iter
382 IF (i_step == rtp%i_start + 1 .AND. i_iter == 2 .AND. rtp_control%hfx_redistribute) &
383 CALL qs_ks_did_change(qs_env%ks_env, s_mstruct_changed=.true.)
384 rtp%iter = i_iter
385 CALL propagation_step(qs_env, rtp, rtp_control)
386 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false.)
387 rtp%energy_new = energy%total
388 IF (rtp%converged) EXIT
389 CALL rt_prop_output(qs_env, real_time_propagation, rtp%delta_iter)
390 END DO
391 IF (rtp%converged) THEN
392 CALL external_control(should_stop, "MD", globenv=globenv)
393 IF (should_stop) CALL cp_iterate(logger%iter_info, last=.true., iter_nr=i_step)
394 time_iter_stop = m_walltime()
395 used_time = time_iter_stop - time_iter_start
396 time_iter_start = time_iter_stop
397 CALL rt_prop_output(qs_env, real_time_propagation, delta_iter=rtp%delta_iter, used_time=used_time)
398 CALL rt_write_input_restart(force_env=force_env, qs_env=qs_env)
399 IF (should_stop) EXIT
400 ELSE
401 EXIT
402 END IF
403 END DO
404 CALL cp_rm_iter_level(logger%iter_info, "MD")
405
406 IF (.NOT. rtp%converged) &
407 CALL cp_abort(__location__, "propagation did not converge, "// &
408 "either increase MAX_ITER or use a smaller TIMESTEP")
409
410 CALL timestop(handle)
411
412 END SUBROUTINE run_propagation
413
414! **************************************************************************************************
415!> \brief overwrites some values in the input file such that the .restart
416!> file will contain the appropriate information
417!> \param md_env ...
418!> \param qs_env ...
419!> \param force_env ...
420!> \author Florian Schiffmann (02.09)
421! **************************************************************************************************
422
423 SUBROUTINE rt_write_input_restart(md_env, qs_env, force_env)
424 TYPE(md_environment_type), OPTIONAL, POINTER :: md_env
425 TYPE(qs_environment_type), OPTIONAL, POINTER :: qs_env
426 TYPE(force_env_type), POINTER :: force_env
427
428 CHARACTER(len=default_path_length) :: file_name
429 REAL(kind=dp), DIMENSION(:), POINTER :: tmp_vals
430 TYPE(cp_logger_type), POINTER :: logger
431 TYPE(dft_control_type), POINTER :: dft_control
432 TYPE(section_vals_type), POINTER :: dft_section, efield_section, &
433 motion_section, print_key, &
434 root_section, rt_section
435
436 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
437 root_section => force_env%root_section
438 motion_section => section_vals_get_subs_vals(root_section, "MOTION")
439 dft_section => section_vals_get_subs_vals(root_section, "FORCE_EVAL%DFT")
440 rt_section => section_vals_get_subs_vals(root_section, "FORCE_EVAL%DFT%REAL_TIME_PROPAGATION")
441
442 CALL section_vals_val_set(rt_section, "INITIAL_WFN", i_val=use_rt_restart)
443 CALL section_vals_val_set(rt_section, "APPLY_DELTA_PULSE", l_val=.false.)
444 CALL section_vals_val_set(rt_section, "APPLY_DELTA_PULSE_MAG", l_val=.false.)
445 CALL section_vals_val_set(rt_section, "APPLY_WFN_MIX_INIT_RESTART", l_val=.false.)
446
447 logger => cp_get_default_logger()
448
449 ! to continue propagating the TD wavefunction we need to read from the new .rtpwfn
450 IF (btest(cp_print_key_should_output(logger%iter_info, &
451 rt_section, "PRINT%RESTART"), cp_p_file)) THEN
452 print_key => section_vals_get_subs_vals(rt_section, "PRINT%RESTART")
453 file_name = cp_print_key_generate_filename(logger, print_key, &
454 extension=".rtpwfn", my_local=.false.)
455 CALL section_vals_val_set(dft_section, "WFN_RESTART_FILE_NAME", c_val=trim(file_name))
456 END IF
457
458 ! coming from RTP
459 IF (.NOT. PRESENT(md_env)) THEN
460 CALL section_vals_val_set(motion_section, "MD%STEP_START_VAL", i_val=force_env%qs_env%sim_step)
461 END IF
462
463 IF (dft_control%apply_vector_potential) THEN
464 efield_section => section_vals_get_subs_vals(root_section, "FORCE_EVAL%DFT%EFIELD")
465 NULLIFY (tmp_vals)
466 ALLOCATE (tmp_vals(3))
467 tmp_vals = dft_control%efield_fields(1)%efield%vec_pot_initial
468 CALL section_vals_val_set(efield_section, "VEC_POT_INITIAL", &
469 r_vals_ptr=tmp_vals, &
470 i_rep_section=1)
471 END IF
472
473 CALL write_restart(md_env=md_env, root_section=root_section)
474
475 END SUBROUTINE rt_write_input_restart
476
477! **************************************************************************************************
478!> \brief Creates the initial electronic states and allocates the necessary
479!> matrices
480!> \param qs_env ...
481!> \param force_env ...
482!> \param rtp_control ...
483!> \author Florian Schiffmann (02.09)
484! **************************************************************************************************
485
486 SUBROUTINE rt_initial_guess(qs_env, force_env, rtp_control)
487 TYPE(qs_environment_type), POINTER :: qs_env
488 TYPE(force_env_type), POINTER :: force_env
489 TYPE(rtp_control_type), POINTER :: rtp_control
490
491 INTEGER :: homo, ispin
492 LOGICAL :: energy_consistency
493 TYPE(cp_fm_type), POINTER :: mo_coeff
494 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
495 TYPE(dft_control_type), POINTER :: dft_control
496
497 NULLIFY (matrix_s, dft_control)
498 CALL get_qs_env(qs_env, dft_control=dft_control)
499
500 SELECT CASE (rtp_control%initial_wfn)
501 CASE (use_scf_wfn)
502 qs_env%sim_time = 0.0_dp
503 qs_env%sim_step = 0
504 energy_consistency = .true.
505 !in the linear scaling case we need a correct kohn-sham matrix, which we cannot get with consistent energies
506 IF (rtp_control%linear_scaling) energy_consistency = .false.
507 CALL force_env_calc_energy_force(force_env, calc_force=.false., &
508 consistent_energies=energy_consistency)
509 qs_env%run_rtp = .true.
510 ALLOCATE (qs_env%rtp)
511 CALL get_qs_env(qs_env, matrix_s=matrix_s)
512 IF (dft_control%do_admm) THEN
513 CALL hfx_admm_init(qs_env)
514 CALL rt_prop_create(qs_env%rtp, qs_env%mos, qs_env%mpools, dft_control, matrix_s(1)%matrix, &
515 rtp_control%linear_scaling, qs_env%admm_env%mos_aux_fit)
516 ELSE
517 CALL rt_prop_create(qs_env%rtp, qs_env%mos, qs_env%mpools, dft_control, matrix_s(1)%matrix, &
518 rtp_control%linear_scaling)
519 END IF
520
522 CALL qs_energies_init(qs_env, .false.)
523 IF (.NOT. rtp_control%linear_scaling .OR. rtp_control%initial_wfn == use_restart_wfn) THEN
524 DO ispin = 1, SIZE(qs_env%mos)
525 CALL get_mo_set(qs_env%mos(ispin), mo_coeff=mo_coeff, homo=homo)
526 IF (.NOT. ASSOCIATED(mo_coeff)) THEN
527 CALL init_mo_set(qs_env%mos(ispin), &
528 qs_env%mpools%ao_mo_fm_pools(ispin)%pool, &
529 name="qs_env%mo"//trim(adjustl(cp_to_string(ispin))))
530 END IF
531 END DO
532 IF (dft_control%do_admm) CALL hfx_admm_init(qs_env)
533 END IF
534 ALLOCATE (qs_env%rtp)
535 CALL get_qs_env(qs_env, matrix_s=matrix_s)
536 CALL rt_prop_create(qs_env%rtp, qs_env%mos, qs_env%mpools, dft_control, matrix_s(1)%matrix, &
537 rtp_control%linear_scaling, qs_env%admm_env%mos_aux_fit)
538 CALL get_restart_wfn(qs_env)
539
540 qs_env%run_rtp = .true.
541 END SELECT
542
543 END SUBROUTINE rt_initial_guess
544
545! **************************************************************************************************
546!> \brief ...
547!> \param qs_env ...
548!> \param imag_p ...
549!> \param imag_ks ...
550!> \param imag_h ...
551! **************************************************************************************************
552 SUBROUTINE rt_init_complex_quantities(qs_env, imag_p, imag_ks, imag_h)
553 TYPE(qs_environment_type), POINTER :: qs_env
554 LOGICAL, INTENT(in) :: imag_p, imag_ks, imag_h
555
556 TYPE(dft_control_type), POINTER :: dft_control
557 TYPE(qs_ks_env_type), POINTER :: ks_env
558 TYPE(qs_rho_type), POINTER :: rho
559 TYPE(rt_prop_type), POINTER :: rtp
560
561 NULLIFY (ks_env, rho, dft_control)
562
563 CALL get_qs_env(qs_env, &
564 dft_control=dft_control, &
565 ks_env=ks_env, &
566 rho=rho, &
567 rtp=rtp)
568
569 ! rho
570 CALL qs_rho_set(rho, complex_rho_ao=imag_p)
571 IF (imag_p) CALL allocate_rho_ao_imag_from_real(rho, qs_env)
572
573 ! ks
574 CALL set_ks_env(ks_env, complex_ks=imag_ks)
575 IF (imag_ks) THEN
576 CALL qs_ks_allocate_basics(qs_env, is_complex=imag_ks)
577 IF (.NOT. dft_control%rtp_control%fixed_ions) &
578 CALL rtp_create_sinvh_imag(rtp, dft_control%nspins)
579 END IF
580
581 ! h
582 IF (imag_h) CALL qs_matrix_h_allocate_imag_from_real(qs_env)
583
584 END SUBROUTINE rt_init_complex_quantities
585
586END MODULE rt_propagation
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public andermatt2016
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)
...
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 ...
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:147
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, 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, ecoul_1c, rho0_s_rs, rho0_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)
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, 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:428
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 ...
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 rt_prop_output(qs_env, run_type, delta_iter, used_time)
...
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 calc_s_derivs(qs_env)
Calculates dS/dR respectily the velocity weighted derivatves only needed for ehrenfest MD.
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...
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.