(git:98357aa)
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-2026 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,&
35 cp_p_file,&
56 USE kinds, ONLY: default_path_length,&
57 dp
58 USE machine, ONLY: m_walltime
61 USE pw_env_types, ONLY: pw_env_type
71 USE qs_ks_types, ONLY: qs_ks_did_change,&
75 USE qs_mo_types, ONLY: get_mo_set,&
80 USE qs_rho_types, ONLY: qs_rho_set,&
88 print_ft,&
91 USE rt_propagation_types, ONLY: get_rtp,&
106#include "../base/base_uses.f90"
107
108 IMPLICIT NONE
109
110 PRIVATE
111
112 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'rt_propagation'
113
114 PUBLIC :: rt_prop_setup
115
116CONTAINS
117
118! **************************************************************************************************
119!> \brief creates rtp_type, gets the initial state, either by reading MO's
120!> from file or calling SCF run
121!> \param force_env ...
122!> \author Florian Schiffmann (02.09)
123! **************************************************************************************************
124
125 SUBROUTINE rt_prop_setup(force_env)
126 TYPE(force_env_type), POINTER :: force_env
127
128 INTEGER :: aspc_order
129 LOGICAL :: magnetic, vel_reprs
130 TYPE(dft_control_type), POINTER :: dft_control
131 TYPE(global_environment_type), POINTER :: globenv
132 TYPE(qs_energy_type), POINTER :: energy
133 TYPE(qs_environment_type), POINTER :: qs_env
134 TYPE(rt_prop_type), POINTER :: rtp
135 TYPE(rtp_control_type), POINTER :: rtp_control
136 TYPE(section_vals_type), POINTER :: hfx_sections, input, ls_scf_section, md_section, &
137 motion_section, print_moments_section, rtp_print_section, rtp_section
138
139 NULLIFY (qs_env, rtp_control, dft_control)
140
141 CALL cite_reference(andermatt2016)
142
143 CALL force_env_get(force_env=force_env, qs_env=qs_env, globenv=globenv)
144 CALL get_qs_env(qs_env, dft_control=dft_control, energy=energy)
145 rtp_control => dft_control%rtp_control
146
147 ! Takes care that an initial wavefunction/density is available
148 ! Can either be by performing an scf loop or reading a restart
149 CALL rt_initial_guess(qs_env, force_env, rtp_control)
150
151 ! Initializes the extrapolation
152 NULLIFY (rtp)
153 CALL get_qs_env(qs_env=qs_env, rtp=rtp, input=input)
154 aspc_order = rtp_control%aspc_order
155 CALL rtp_history_create(rtp, aspc_order)
156
157 ! Reads the simulation parameters from the input
158 motion_section => section_vals_get_subs_vals(force_env%root_section, "MOTION")
159 md_section => section_vals_get_subs_vals(motion_section, "MD")
160 hfx_sections => section_vals_get_subs_vals(force_env%root_section, "FORCE_EVAL%DFT%XC%HF")
161 rtp_section => section_vals_get_subs_vals(force_env%root_section, "FORCE_EVAL%DFT%REAL_TIME_PROPAGATION")
162 print_moments_section => section_vals_get_subs_vals(force_env%root_section, "FORCE_EVAL%DFT%PRINT%MOMENTS")
163 CALL section_vals_val_get(md_section, "TIMESTEP", r_val=qs_env%rtp%dt)
164 CALL section_vals_val_get(md_section, "STEP_START_VAL", i_val=qs_env%rtp%i_start)
165 CALL section_vals_val_get(md_section, "STEPS", i_val=rtp%nsteps)
166 CALL section_vals_val_get(md_section, "MAX_STEPS", i_val=rtp%max_steps)
167
168 ls_scf_section => section_vals_get_subs_vals(input, "DFT%LS_SCF")
169 CALL section_vals_val_get(ls_scf_section, "EPS_FILTER", r_val=rtp%filter_eps)
170 IF (.NOT. qs_env%rtp%linear_scaling) rtp%filter_eps = 0.0_dp
171 IF (rtp_control%acc_ref < 1) rtp_control%acc_ref = 1
172 rtp%filter_eps_small = rtp%filter_eps/rtp_control%acc_ref
173 CALL section_vals_val_get(ls_scf_section, "EPS_LANCZOS", r_val=rtp%lanzcos_threshold)
174 CALL section_vals_val_get(ls_scf_section, "MAX_ITER_LANCZOS", i_val=rtp%lanzcos_max_iter)
175 CALL section_vals_val_get(ls_scf_section, "SIGN_SQRT_ORDER", i_val=rtp%newton_schulz_order)
176 CALL section_vals_get(hfx_sections, explicit=rtp%do_hfx)
177 CALL section_vals_val_get(print_moments_section, "MAGNETIC", l_val=magnetic)
178 CALL section_vals_val_get(print_moments_section, "VEL_REPRS", l_val=vel_reprs)
179
180 rtp%track_imag_density = (magnetic) .OR. (vel_reprs) .OR. (rtp_control%velocity_gauge) &
181 .OR. (rtp%do_hfx) .OR. (.NOT. rtp_control%fixed_ions)
182 rtp%propagate_complex_ks = rtp%do_hfx .OR. rtp_control%velocity_gauge
183
184 ! Marek : In case some print sections that apply so far only to RTBSE are present,
185 ! warn the user that the quantities will not be in fact printed out
186 rtp_print_section => section_vals_get_subs_vals(rtp_section, "PRINT")
187 CALL warn_section_unused(rtp_print_section, "DENSITY_MATRIX", &
188 "DENSITY_MATRIX printing not implemented for non-RTBSE code.")
189
190 CALL rt_init_complex_quantities(qs_env, imag_p=rtp%track_imag_density, &
191 imag_ks=rtp%propagate_complex_ks, imag_h=rtp_control%velocity_gauge)
192
193 IF (rtp_control%save_local_moments) CALL rt_init_local_moments(rtp, qs_env)
194
195 ! Hmm, not really like to initialize with the structure of S but I reckon it is
196 ! done everywhere like this
197 IF (rtp%do_hfx) CALL rtp_hfx_rebuild(qs_env)
198
199 ! Setup the MO projection environment if required
200 IF (rtp_control%is_proj_mo) CALL init_mo_projection(qs_env, rtp_control)
201
202 CALL init_propagation_run(qs_env)
203 IF (.NOT. rtp_control%fixed_ions) THEN
204 !derivativs of the overlap needed for EMD
205 CALL calc_s_derivs(qs_env)
206 ! a bit hidden, but computes SinvH and SinvB (calc_SinvH for CN,EM and ARNOLDI)
207 ! make_etrs_exp in case of ETRS in combination with TAYLOR and PADE
208 END IF
209 CALL init_propagators(qs_env)
210 IF (rtp_control%fixed_ions) THEN
211 CALL run_propagation(qs_env, force_env, globenv)
212 ELSE
213 rtp_control%initial_step = .true.
214 CALL force_env_calc_energy_force(force_env, calc_force=.true.)
215 rtp_control%initial_step = .false.
216 rtp%energy_old = energy%total
217 END IF
218
219 IF (rtp_control%save_local_moments) THEN
220 ! Call routines for outputs and deallocations of FT observables
221 CALL final_ft_output(qs_env)
222 END IF
223
224 IF (ASSOCIATED(rtp_control%print_pol_elements)) DEALLOCATE (rtp_control%print_pol_elements)
225
226 END SUBROUTINE rt_prop_setup
227
228! **************************************************************************************************
229!> \brief calculates the matrices needed in the first step of EMD/RTP
230!> \param qs_env ...
231!> \author Florian Schiffmann (02.09)
232! **************************************************************************************************
233
234 SUBROUTINE init_propagation_run(qs_env)
235 TYPE(qs_environment_type), POINTER :: qs_env
236
237 REAL(kind=dp), PARAMETER :: zero = 0.0_dp
238
239 INTEGER :: i, ispin, re
240 INTEGER, DIMENSION(2) :: nelectron_spin
241 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new, mos_old
242 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, rho_new, rho_old
243 TYPE(dft_control_type), POINTER :: dft_control
244 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
245 TYPE(rt_prop_type), POINTER :: rtp
246 TYPE(rtp_control_type), POINTER :: rtp_control
247
248 NULLIFY (dft_control, rtp, rtp_control)
249
250 CALL cite_reference(andermatt2016)
251
252 CALL get_qs_env(qs_env, &
253 rtp=rtp, &
254 dft_control=dft_control)
255 rtp_control => dft_control%rtp_control
256
257 IF (rtp_control%initial_wfn == use_scf_wfn) THEN
258 IF (rtp_control%apply_delta_pulse .OR. rtp_control%apply_delta_pulse_mag) THEN
259 CALL apply_delta_pulse(qs_env, rtp, rtp_control)
260 ELSE
261 IF (.NOT. rtp%linear_scaling) THEN
262 CALL get_rtp(rtp=rtp, mos_old=mos_old)
263 CALL get_qs_env(qs_env, mos=mos)
264 DO i = 1, SIZE(mos)
265 CALL cp_fm_to_fm(mos(i)%mo_coeff, mos_old(2*i - 1))
266 CALL cp_fm_set_all(mos_old(2*i), zero, zero)
267 END DO
268 END IF
269 END IF
270 END IF
271
272 IF (.NOT. rtp%linear_scaling) THEN
273 CALL get_rtp(rtp=rtp, mos_old=mos_old, mos_new=mos_new)
274 DO i = 1, SIZE(mos_old)
275 CALL cp_fm_to_fm(mos_old(i), mos_new(i))
276 END DO
277 CALL calc_update_rho(qs_env)
278 ELSE
279 IF (rtp_control%initial_wfn == use_scf_wfn) THEN
280 CALL get_qs_env(qs_env, &
281 matrix_ks=matrix_ks, &
282 mos=mos, &
283 nelectron_spin=nelectron_spin)
284 IF (ASSOCIATED(mos)) THEN
285 !The wavefunction was minimized by an mo based algorith. P is therefore calculated from the mos
286 IF (ASSOCIATED(rtp%mos)) THEN
287 IF (ASSOCIATED(rtp%mos%old)) THEN
288 ! Delta kick was applied and the results is in rtp%mos%old
289 CALL rt_initialize_rho_from_mos(rtp, mos, mos_old=rtp%mos%old)
290 ELSE
291 CALL rt_initialize_rho_from_mos(rtp, mos)
292 END IF
293 ELSE
294 CALL rt_initialize_rho_from_mos(rtp, mos)
295 END IF
296 ELSE
297 ! The wavefunction was minimized using a linear scaling method.
298 ! The density matrix is therefore taken from the ls_scf_env.
299 CALL get_rtp(rtp=rtp, rho_old=rho_old, rho_new=rho_new)
300 DO ispin = 1, SIZE(rho_old)/2
301 re = 2*ispin - 1
302 CALL dbcsr_copy(rho_old(re)%matrix, qs_env%ls_scf_env%matrix_p(ispin))
303 CALL dbcsr_copy(rho_new(re)%matrix, qs_env%ls_scf_env%matrix_p(ispin))
304 END DO
305 END IF
306 CALL calc_update_rho_sparse(qs_env)
307 END IF
308 END IF
309 ! Modify KS matrix to include the additional terms in the velocity gauge
310 IF (rtp_control%velocity_gauge) THEN
311 ! As matrix_h and matrix_h_im are not updated by qs_ks_update_qs_env()
312 ! the non-gauge transformed non-local part has to be subtracted here
313 CALL velocity_gauge_ks_matrix(qs_env, subtract_nl_term=.true.)
314 END IF
315 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false.)
316
317 END SUBROUTINE init_propagation_run
318
319! **************************************************************************************************
320!> \brief performs the real RTP run, gets information from MD section
321!> uses MD as iteration level
322!> \param qs_env ...
323!> \param force_env ...
324!> \param globenv ...
325!> \author Florian Schiffmann (02.09)
326! **************************************************************************************************
327
328 SUBROUTINE run_propagation(qs_env, force_env, globenv)
329 TYPE(qs_environment_type), POINTER :: qs_env
330 TYPE(force_env_type), POINTER :: force_env
331 TYPE(global_environment_type), POINTER :: globenv
332
333 CHARACTER(len=*), PARAMETER :: routinen = 'run_propagation'
334
335 INTEGER :: aspc_order, handle, i_iter, i_step, &
336 max_iter, max_steps, output_unit, &
337 unit_nr
338 LOGICAL :: moments_read, should_stop
339 REAL(kind=dp) :: eps_ener, time_iter_start, &
340 time_iter_stop, used_time
341 TYPE(cp_logger_type), POINTER :: logger
342 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_new
343 TYPE(dft_control_type), POINTER :: dft_control
344 TYPE(pw_env_type), POINTER :: pw_env
345 TYPE(qs_energy_type), POINTER :: energy
346 TYPE(rt_prop_type), POINTER :: rtp
347 TYPE(rtp_control_type), POINTER :: rtp_control
348 TYPE(section_vals_type), POINTER :: input, moments_section, rtp_section
349
350 should_stop = .false.
351 CALL timeset(routinen, handle)
352
353 CALL cite_reference(andermatt2016)
354
355 NULLIFY (logger, dft_control, energy, rtp, rtp_control, input, rtp_section)
356 logger => cp_get_default_logger()
357 IF (logger%para_env%is_source()) THEN
358 unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
359 ELSE
360 unit_nr = -1
361 END IF
362
363 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, rtp=rtp, energy=energy, input=input)
364
365 rtp_control => dft_control%rtp_control
366 max_steps = min(rtp%nsteps, rtp%max_steps)
367 max_iter = rtp_control%max_iter
368 eps_ener = rtp_control%eps_ener
369
370 aspc_order = rtp_control%aspc_order
371
372 rtp%energy_old = energy%total
373 time_iter_start = m_walltime()
374 CALL cp_add_iter_level(logger%iter_info, "MD")
375 CALL cp_iterate(logger%iter_info, iter_nr=0)
376 IF (rtp%i_start >= max_steps) CALL cp_abort(__location__, &
377 "maximum step number smaller than initial step value")
378
379 rtp_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION")
380 output_unit = cp_print_key_unit_nr(logger, rtp_section, "PRINT%PROGRAM_RUN_INFO", &
381 extension=".scfLog")
382 ! Add the zero iteration moments to the moment trace
383 IF (rtp_control%save_local_moments) THEN
384 CALL get_rtp(rtp, rho_new=rho_new)
385 moments_section => section_vals_get_subs_vals(rtp_section, "PRINT%MOMENTS")
386 ! TODO : Conditions on when not to read the files
387 CALL read_moments(moments_section, 0, rtp%i_start, rtp%moments, rtp%times, moments_read)
388 ! Recalculate the field at times in the trace/Read the field from the files
389 CALL recalculate_fields(rtp%fields, rtp%times, 0, rtp%i_start, dft_control)
390 IF (.NOT. moments_read) THEN
391 CALL calc_local_moment(rtp%local_moments, rho_new, rtp%local_moments_work, rtp%moments(:, :, 1))
392 qs_env%sim_time = real(rtp%i_start, dp)*rtp%dt
393 rtp%times(1) = qs_env%sim_time
394 CALL print_moments(moments_section, output_unit, rtp%moments(:, :, 1), &
395 qs_env%sim_time, rtp%track_imag_density)
396 END IF
397 END IF
398
399 DO i_step = rtp%i_start + 1, max_steps
400 IF (output_unit > 0) THEN
401 WRITE (output_unit, fmt="(/,(T2,A,T40,I6))") &
402 "Real time propagation step:", i_step
403 END IF
404 energy%efield_core = 0.0_dp
405 qs_env%sim_time = real(i_step, dp)*rtp%dt
406 CALL get_qs_env(qs_env, pw_env=pw_env)
407 pw_env%poisson_env%parameters%dbc_params%time = qs_env%sim_time
408 qs_env%sim_step = i_step
409 rtp%istep = i_step - rtp%i_start
410 CALL calculate_ecore_efield(qs_env, .false.)
411 IF (dft_control%apply_external_potential) THEN
412 IF (.NOT. dft_control%expot_control%static) THEN
413 dft_control%eval_external_potential = .true.
414 END IF
415 END IF
416 CALL external_c_potential(qs_env, calculate_forces=.false.)
417 CALL external_e_potential(qs_env)
418 CALL cp_iterate(logger%iter_info, last=(i_step == max_steps), iter_nr=i_step)
419 rtp%converged = .false.
420 DO i_iter = 1, max_iter
421 IF (i_step == rtp%i_start + 1 .AND. i_iter == 2 .AND. rtp_control%hfx_redistribute) THEN
422 CALL qs_ks_did_change(qs_env%ks_env, s_mstruct_changed=.true.)
423 END IF
424 rtp%iter = i_iter
425 CALL propagation_step(qs_env, rtp, rtp_control)
426 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false.)
427 rtp%energy_new = energy%total
428 IF (rtp%converged) EXIT
429 CALL rt_prop_output(qs_env, real_time_propagation, rtp%delta_iter)
430 END DO
431 IF (rtp%converged) THEN
432 CALL external_control(should_stop, "MD", globenv=globenv)
433 IF (should_stop) CALL cp_iterate(logger%iter_info, last=.true., iter_nr=i_step)
434 time_iter_stop = m_walltime()
435 used_time = time_iter_stop - time_iter_start
436 time_iter_start = time_iter_stop
437 CALL rt_prop_output(qs_env, real_time_propagation, delta_iter=rtp%delta_iter, used_time=used_time)
438 CALL rt_write_input_restart(force_env=force_env, qs_env=qs_env)
439 IF (modulo(i_step, dft_control%localize_each) == 0) THEN
440 CALL rtp_localize(qs_env, rtp)
441 END IF
442 IF (should_stop) EXIT
443 ELSE
444 EXIT
445 END IF
446 END DO
447 CALL cp_rm_iter_level(logger%iter_info, "MD")
448
449 IF (.NOT. rtp%converged) THEN
450 CALL cp_abort(__location__, "propagation did not converge, "// &
451 "either increase MAX_ITER or use a smaller TIMESTEP")
452 END IF
453
454 CALL timestop(handle)
455
456 END SUBROUTINE run_propagation
457
458! **************************************************************************************************
459!> \brief overwrites some values in the input file such that the .restart
460!> file will contain the appropriate information
461!> \param md_env ...
462!> \param qs_env ...
463!> \param force_env ...
464!> \author Florian Schiffmann (02.09)
465! **************************************************************************************************
466
467 SUBROUTINE rt_write_input_restart(md_env, qs_env, force_env)
468 TYPE(md_environment_type), OPTIONAL, POINTER :: md_env
469 TYPE(qs_environment_type), OPTIONAL, POINTER :: qs_env
470 TYPE(force_env_type), POINTER :: force_env
471
472 CHARACTER(len=default_path_length) :: file_name
473 REAL(kind=dp), DIMENSION(:), POINTER :: tmp_vals
474 TYPE(cp_logger_type), POINTER :: logger
475 TYPE(dft_control_type), POINTER :: dft_control
476 TYPE(section_vals_type), POINTER :: dft_section, efield_section, &
477 motion_section, print_key, &
478 root_section, rt_section
479
480 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
481 root_section => force_env%root_section
482 motion_section => section_vals_get_subs_vals(root_section, "MOTION")
483 dft_section => section_vals_get_subs_vals(root_section, "FORCE_EVAL%DFT")
484 rt_section => section_vals_get_subs_vals(root_section, "FORCE_EVAL%DFT%REAL_TIME_PROPAGATION")
485
486 CALL section_vals_val_set(rt_section, "INITIAL_WFN", i_val=use_rt_restart)
487 CALL section_vals_val_set(rt_section, "APPLY_DELTA_PULSE", l_val=.false.)
488 CALL section_vals_val_set(rt_section, "APPLY_DELTA_PULSE_MAG", l_val=.false.)
489 CALL section_vals_val_set(rt_section, "APPLY_WFN_MIX_INIT_RESTART", l_val=.false.)
490
491 logger => cp_get_default_logger()
492
493 ! to continue propagating the TD wavefunction we need to read from the new .rtpwfn
494 IF (btest(cp_print_key_should_output(logger%iter_info, &
495 rt_section, "PRINT%RESTART"), cp_p_file)) THEN
496 print_key => section_vals_get_subs_vals(rt_section, "PRINT%RESTART")
497 file_name = cp_print_key_generate_filename(logger, print_key, &
498 extension=".rtpwfn", my_local=.false.)
499 CALL section_vals_val_set(dft_section, "WFN_RESTART_FILE_NAME", c_val=trim(file_name))
500 END IF
501
502 ! coming from RTP
503 IF (.NOT. PRESENT(md_env)) THEN
504 CALL section_vals_val_set(motion_section, "MD%STEP_START_VAL", i_val=force_env%qs_env%sim_step)
505 END IF
506
507 IF (dft_control%apply_vector_potential) THEN
508 efield_section => section_vals_get_subs_vals(root_section, "FORCE_EVAL%DFT%EFIELD")
509 NULLIFY (tmp_vals)
510 ALLOCATE (tmp_vals(3))
511 tmp_vals = dft_control%efield_fields(1)%efield%vec_pot_initial
512 CALL section_vals_val_set(efield_section, "VEC_POT_INITIAL", &
513 r_vals_ptr=tmp_vals, &
514 i_rep_section=1)
515 END IF
516
517 CALL write_restart(md_env=md_env, root_section=root_section)
518
519 END SUBROUTINE rt_write_input_restart
520
521! **************************************************************************************************
522!> \brief Creates the initial electronic states and allocates the necessary
523!> matrices
524!> \param qs_env ...
525!> \param force_env ...
526!> \param rtp_control ...
527!> \author Florian Schiffmann (02.09)
528! **************************************************************************************************
529
530 SUBROUTINE rt_initial_guess(qs_env, force_env, rtp_control)
531 TYPE(qs_environment_type), POINTER :: qs_env
532 TYPE(force_env_type), POINTER :: force_env
533 TYPE(rtp_control_type), POINTER :: rtp_control
534
535 INTEGER :: homo, ispin
536 LOGICAL :: energy_consistency
537 TYPE(cp_fm_type), POINTER :: mo_coeff
538 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
539 TYPE(dft_control_type), POINTER :: dft_control
540
541 NULLIFY (matrix_s, dft_control)
542 CALL get_qs_env(qs_env, dft_control=dft_control)
543 cpassert(ASSOCIATED(qs_env))
544
545 SELECT CASE (rtp_control%initial_wfn)
546 CASE (use_scf_wfn)
547 qs_env%sim_time = 0.0_dp
548 qs_env%sim_step = 0
549 energy_consistency = .true.
550 !in the linear scaling case we need a correct kohn-sham matrix, which we cannot get with consistent energies
551 IF (rtp_control%linear_scaling) energy_consistency = .false.
552 CALL force_env_calc_energy_force(force_env, calc_force=.false., &
553 consistent_energies=energy_consistency)
554 qs_env%run_rtp = .true.
555 ALLOCATE (qs_env%rtp)
556 CALL get_qs_env(qs_env, matrix_s=matrix_s)
557 IF (dft_control%do_admm) THEN
558 CALL hfx_admm_init(qs_env)
559 CALL rt_prop_create(qs_env%rtp, qs_env%mos, qs_env%mpools, dft_control, matrix_s(1)%matrix, &
560 rtp_control%linear_scaling, qs_env%admm_env%mos_aux_fit)
561 ELSE
562 CALL rt_prop_create(qs_env%rtp, qs_env%mos, qs_env%mpools, dft_control, matrix_s(1)%matrix, &
563 rtp_control%linear_scaling)
564 END IF
565
567 CALL qs_energies_init(qs_env, .false.)
568 IF (.NOT. rtp_control%linear_scaling .OR. rtp_control%initial_wfn == use_restart_wfn) THEN
569 DO ispin = 1, SIZE(qs_env%mos)
570 CALL get_mo_set(qs_env%mos(ispin), mo_coeff=mo_coeff, homo=homo)
571 IF (.NOT. ASSOCIATED(mo_coeff)) THEN
572 CALL init_mo_set(qs_env%mos(ispin), &
573 qs_env%mpools%ao_mo_fm_pools(ispin)%pool, &
574 name="qs_env%mo"//trim(adjustl(cp_to_string(ispin))))
575 END IF
576 END DO
577 IF (dft_control%do_admm) CALL hfx_admm_init(qs_env)
578 END IF
579 ALLOCATE (qs_env%rtp)
580 CALL get_qs_env(qs_env, matrix_s=matrix_s)
581 CALL rt_prop_create(qs_env%rtp, qs_env%mos, qs_env%mpools, dft_control, matrix_s(1)%matrix, &
582 rtp_control%linear_scaling, qs_env%admm_env%mos_aux_fit)
583 CALL get_restart_wfn(qs_env)
584 cpassert(ASSOCIATED(qs_env))
585
586 qs_env%run_rtp = .true.
587 END SELECT
588
589 END SUBROUTINE rt_initial_guess
590
591! **************************************************************************************************
592!> \brief ...
593!> \param qs_env ...
594!> \param imag_p ...
595!> \param imag_ks ...
596!> \param imag_h ...
597! **************************************************************************************************
598 SUBROUTINE rt_init_complex_quantities(qs_env, imag_p, imag_ks, imag_h)
599 TYPE(qs_environment_type), POINTER :: qs_env
600 LOGICAL, INTENT(in) :: imag_p, imag_ks, imag_h
601
602 TYPE(dft_control_type), POINTER :: dft_control
603 TYPE(qs_ks_env_type), POINTER :: ks_env
604 TYPE(qs_rho_type), POINTER :: rho
605 TYPE(rt_prop_type), POINTER :: rtp
606
607 NULLIFY (ks_env, rho, dft_control)
608
609 CALL get_qs_env(qs_env, &
610 dft_control=dft_control, &
611 ks_env=ks_env, &
612 rho=rho, &
613 rtp=rtp)
614
615 ! rho
616 CALL qs_rho_set(rho, complex_rho_ao=imag_p)
617 IF (imag_p) CALL allocate_rho_ao_imag_from_real(rho, qs_env)
618
619 ! ks
620 CALL set_ks_env(ks_env, complex_ks=imag_ks)
621 IF (imag_ks) THEN
622 CALL qs_ks_allocate_basics(qs_env, is_complex=imag_ks)
623 IF (.NOT. dft_control%rtp_control%fixed_ions) THEN
624 CALL rtp_create_sinvh_imag(rtp, dft_control%nspins)
625 END IF
626 END IF
627
628 ! h
629 IF (imag_h) CALL qs_matrix_h_allocate_imag_from_real(qs_env)
630
631 END SUBROUTINE rt_init_complex_quantities
632
633! **************************************************************************************************
634!> \brief Allocates and fills the local moment matrices (only available for linear scaling)
635!> \param rtp Real time propagtion properties - local moment matrices are stored there
636!> \param qs_env QS environment necessary for moment matrix calculation
637! **************************************************************************************************
638 SUBROUTINE rt_init_local_moments(rtp, qs_env)
639 TYPE(rt_prop_type), POINTER :: rtp
640 TYPE(qs_environment_type), POINTER :: qs_env
641
642 INTEGER :: k, nspin, output_unit
643 REAL(kind=dp), DIMENSION(3) :: reference_point
644 TYPE(cp_logger_type), POINTER :: logger
645 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, rho_old
646 TYPE(dft_control_type), POINTER :: dft_control
647 TYPE(rtp_control_type), POINTER :: rtc
648 TYPE(section_vals_type), POINTER :: input, moments_section
649
650 logger => cp_get_default_logger()
651 output_unit = cp_logger_get_default_io_unit(logger)
652
653 CALL get_qs_env(qs_env, dft_control=dft_control, matrix_s=matrix_s, input=input)
654 rtc => dft_control%rtp_control
655 moments_section => section_vals_get_subs_vals(input, &
656 "DFT%REAL_TIME_PROPAGATION%PRINT%MOMENTS")
657
658 ! Construct the local moments matrix - copy from matrix_s structure
659 ! NOTE : construction where blocks are allocated by neighbour lists does not seem to work,
660 ! so doing a copy instead of:
661 ! CALL dbcsr_create(rtp%local_moments(k)%matrix, template=matrix_s(1)%matrix, &
662 ! name="Local moment")
663 ! CALL cp_dbcsr_alloc_block_from_nbl(rtp%local_moments(k)%matrix, sab_all)
664 NULLIFY (rtp%local_moments)
665 ALLOCATE (rtp%local_moments(3))
666 DO k = 1, 3
667 NULLIFY (rtp%local_moments(k)%matrix)
668 ALLOCATE (rtp%local_moments(k)%matrix)
669 CALL dbcsr_create(rtp%local_moments(k)%matrix, template=matrix_s(1)%matrix, name="Local moment")
670 CALL dbcsr_copy(rtp%local_moments(k)%matrix, matrix_s(1)%matrix)
671 CALL dbcsr_set(rtp%local_moments(k)%matrix, 0.0_dp)
672 END DO
673 ! Workspace allocation
674 NULLIFY (rtp%local_moments_work)
675 ALLOCATE (rtp%local_moments_work)
676 CALL dbcsr_create(rtp%local_moments_work, template=rtp%local_moments(1)%matrix, name="tmp")
677 CALL dbcsr_copy(rtp%local_moments_work, rtp%local_moments(1)%matrix)
678
679 CALL get_reference_point(rpoint=reference_point, qs_env=qs_env, &
680 reference=rtc%moment_trace_ref_type, ref_point=rtc%moment_trace_user_ref_point)
681
682 CALL build_local_moment_matrix(qs_env, rtp%local_moments, 1, reference_point)
683
684 ! Allocate the moments trace and output start moments
685 CALL get_rtp(rtp, rho_old=rho_old)
686 nspin = SIZE(rho_old)/2
687 ALLOCATE (rtp%moments(SIZE(rho_old)/2, 3, rtp%nsteps + 1), source=cmplx(0.0, 0.0, kind=dp))
688 NULLIFY (rtp%times)
689 ALLOCATE (rtp%times(rtp%nsteps + 1))
690 NULLIFY (rtp%fields)
691 ALLOCATE (rtp%fields(3, rtp%nsteps + 1), source=cmplx(0.0, 0.0, kind=dp))
692
693 END SUBROUTINE rt_init_local_moments
694
695! **************************************************************************************************
696!> \brief Allocates and fills the local moment matrices (only available for linear scaling)
697!> \param qs_env QS environment necessary for moment matrix calculation
698! **************************************************************************************************
699 SUBROUTINE final_ft_output(qs_env)
700 TYPE(qs_environment_type), POINTER :: qs_env
701
702 INTEGER :: k, unit_nr
703 TYPE(cell_type), POINTER :: cell
704 TYPE(cp_logger_type), POINTER :: logger
705 TYPE(dft_control_type), POINTER :: dft_control
706 TYPE(rt_prop_type), POINTER :: rtp
707 TYPE(section_vals_type), POINTER :: input, rtp_section
708
709 CALL get_qs_env(qs_env, cell=cell, rtp=rtp, input=input, dft_control=dft_control)
710 rtp_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION")
711 logger => cp_get_default_logger()
712 unit_nr = cp_logger_get_default_io_unit(logger)
713 CALL print_ft(rtp_section, rtp%moments, rtp%times, rtp%fields, dft_control%rtp_control, &
714 info_opt=unit_nr, cell=cell)
715 ! Deallocating the local moments matrices and array
716 DO k = 1, 3
717 CALL dbcsr_release(rtp%local_moments(k)%matrix)
718 DEALLOCATE (rtp%local_moments(k)%matrix)
719 END DO
720 DEALLOCATE (rtp%local_moments)
721 CALL dbcsr_release(rtp%local_moments_work)
722 DEALLOCATE (rtp%local_moments_work)
723 DEALLOCATE (rtp%moments)
724 DEALLOCATE (rtp%times)
725 DEALLOCATE (rtp%fields)
726 END SUBROUTINE final_ft_output
727
728END MODULE rt_propagation
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
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 ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
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, ext_xc_section)
...
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:141
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, mimic, 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, matrix_vhxc, 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, xcint_weights, 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, exc_accint, 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_vhxc, 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, xcint_weights, 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:458
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name, counter)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
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.
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:593
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 rtp_localize(qs_env, rtp)
Computes Maximally localised Wannier functions and print properties according to FORCE_EVALDFTLOCALIZ...
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, append_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:60
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.