(git:98357aa)
Loading...
Searching...
No Matches
rt_propagation_utils.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 needed for EMD
10!> \author Florian Schiffmann (02.09)
11! **************************************************************************************************
12
15 USE cell_types, ONLY: cell_type
19 USE cp_dbcsr_api, ONLY: &
27 USE cp_files, ONLY: close_file,&
31 USE cp_fm_types, ONLY: cp_fm_create,&
41 USE cp_output_handling, ONLY: cp_p_file,&
47 USE efield_utils, ONLY: make_field
57 USE kinds, ONLY: default_path_length,&
59 dp
60 USE mathconstants, ONLY: zero
63 USE orbital_pointers, ONLY: ncoset
66 USE physcon, ONLY: femtoseconds
67 USE pw_env_types, ONLY: pw_env_get,&
69 USE pw_methods, ONLY: pw_multiply,&
71 USE pw_pool_types, ONLY: pw_pool_p_type,&
73 USE pw_types, ONLY: pw_c1d_gs_type,&
81 USE qs_ks_types, ONLY: qs_ks_did_change,&
86 USE qs_mo_types, ONLY: allocate_mo_set,&
94 USE qs_rho_types, ONLY: qs_rho_get,&
97 USE qs_scf_wfn_mix, ONLY: wfn_mix
100 USE rt_propagation_types, ONLY: get_rtp,&
102#include "../base/base_uses.f90"
103
104 IMPLICIT NONE
105 PRIVATE
106
107 PUBLIC :: get_restart_wfn, &
115 read_moments, &
117
118 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'rt_propagation_utils'
119
120CONTAINS
121
122! **************************************************************************************************
123!> \brief Calculates dS/dR respectily the velocity weighted derivatves
124!> only needed for ehrenfest MD.
125!>
126!> \param qs_env the qs environment
127!> \par History
128!> 02.2009 created [Manuel Guidon]
129!> 02.2014 switched to dbcsr matrices [Samuel Andermatt]
130!> \author Florian Schiffmann
131! **************************************************************************************************
132 SUBROUTINE calc_s_derivs(qs_env)
133 TYPE(qs_environment_type), POINTER :: qs_env
134
135 CHARACTER(LEN=*), PARAMETER :: routinen = 'calc_S_derivs'
136 REAL(kind=dp), PARAMETER :: one = 1.0_dp, zero = 0.0_dp
137
138 INTEGER :: col_atom, handle, i, j, m, maxder, n, &
139 nder, row_atom
140 INTEGER, DIMENSION(6, 2) :: c_map_mat
141 LOGICAL :: return_s_derivatives
142 REAL(dp), DIMENSION(:, :), POINTER :: block_values
143 TYPE(dbcsr_iterator_type) :: iter
144 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: c_mat, s_der, s_derivs
145 TYPE(dbcsr_type), POINTER :: b_mat, tmp_mat, tmp_mat2
146 TYPE(dft_control_type), POINTER :: dft_control
147 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
148 POINTER :: sab_orb
149 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
150 TYPE(qs_ks_env_type), POINTER :: ks_env
151 TYPE(rt_prop_type), POINTER :: rtp
152
153 CALL timeset(routinen, handle)
154
155 return_s_derivatives = .true.
156
157 NULLIFY (particle_set)
158 NULLIFY (rtp)
159 NULLIFY (s_derivs)
160 NULLIFY (dft_control)
161 NULLIFY (ks_env)
162
163 CALL get_qs_env(qs_env=qs_env, &
164 rtp=rtp, &
165 particle_set=particle_set, &
166 sab_orb=sab_orb, &
167 dft_control=dft_control, &
168 ks_env=ks_env)
169
170 CALL get_rtp(rtp=rtp, b_mat=b_mat, c_mat=c_mat, s_der=s_der)
171
172 nder = 2
173 maxder = ncoset(nder)
174
175 NULLIFY (tmp_mat)
176 ALLOCATE (tmp_mat)
177 CALL dbcsr_create(tmp_mat, template=s_der(1)%matrix, matrix_type="N")
178
179 IF (rtp%iter < 2) THEN
180 ! calculate the overlap derivative matrices
181 IF (dft_control%qs_control%dftb) THEN
182 CALL build_dftb_overlap(qs_env, nder, s_derivs)
183 ELSE
184 CALL build_overlap_matrix(ks_env, nderivative=nder, matrix_s=s_derivs, &
185 basis_type_a="ORB", basis_type_b="ORB", sab_nl=sab_orb)
186 END IF
187
188 NULLIFY (tmp_mat2)
189 ALLOCATE (tmp_mat2)
190 CALL dbcsr_create(tmp_mat2, template=s_der(1)%matrix, matrix_type="S")
191 DO m = 1, 9
192 CALL dbcsr_copy(tmp_mat2, s_derivs(m + 1)%matrix)
193 CALL dbcsr_desymmetrize(tmp_mat2, s_der(m)%matrix)
194 CALL dbcsr_scale(s_der(m)%matrix, -one)
195 CALL dbcsr_filter(s_der(m)%matrix, rtp%filter_eps)
196 !The diagonal should be zero
197 CALL dbcsr_iterator_start(iter, s_der(m)%matrix)
198 DO WHILE (dbcsr_iterator_blocks_left(iter))
199 CALL dbcsr_iterator_next_block(iter, row_atom, col_atom, block_values)
200 IF (row_atom == col_atom) block_values = 0.0_dp
201 END DO
202 CALL dbcsr_iterator_stop(iter)
203 END DO
204 CALL dbcsr_deallocate_matrix_set(s_derivs)
205 CALL dbcsr_deallocate_matrix(tmp_mat2)
206 END IF
207
208 !calculate scalar product v(Rb)*<alpha|d/dRb beta> (B_mat), and store the first derivatives
209
210 CALL dbcsr_set(b_mat, zero)
211 DO m = 1, 3
212 CALL dbcsr_copy(tmp_mat, s_der(m)%matrix)
213 CALL dbcsr_iterator_start(iter, tmp_mat)
214 DO WHILE (dbcsr_iterator_blocks_left(iter))
215 CALL dbcsr_iterator_next_block(iter, row_atom, col_atom, block_values)
216 IF (row_atom == col_atom) block_values = 0.0_dp
217 block_values = block_values*particle_set(col_atom)%v(m)
218 END DO
219 CALL dbcsr_iterator_stop(iter)
220 CALL dbcsr_add(b_mat, tmp_mat, one, one)
221 END DO
222 CALL dbcsr_filter(b_mat, rtp%filter_eps)
223 !calculate C matrix: v(Rb)*<d/dRa alpha| d/dRb beta>
224
225 c_map_mat = 0
226 n = 0
227 DO j = 1, 3
228 DO m = j, 3
229 n = n + 1
230 c_map_mat(n, 1) = j
231 IF (m == j) cycle
232 c_map_mat(n, 2) = m
233 END DO
234 END DO
235
236 DO i = 1, 3
237 CALL dbcsr_set(c_mat(i)%matrix, zero)
238 END DO
239 DO m = 1, 6
240 CALL dbcsr_copy(tmp_mat, s_der(m + 3)%matrix)
241 DO j = 1, 2
242 IF (c_map_mat(m, j) == 0) cycle
243 CALL dbcsr_add(c_mat(c_map_mat(m, j))%matrix, tmp_mat, one, one)
244 END DO
245 END DO
246
247 DO m = 1, 3
248 CALL dbcsr_iterator_start(iter, c_mat(m)%matrix)
249 DO WHILE (dbcsr_iterator_blocks_left(iter))
250 CALL dbcsr_iterator_next_block(iter, row_atom, col_atom, block_values)
251 block_values = block_values*particle_set(row_atom)%v(m)
252 END DO
253 CALL dbcsr_iterator_stop(iter)
254 CALL dbcsr_filter(c_mat(m)%matrix, rtp%filter_eps)
255 END DO
256
257 CALL dbcsr_deallocate_matrix(tmp_mat)
258 CALL timestop(handle)
259 END SUBROUTINE calc_s_derivs
260
261! **************************************************************************************************
262!> \brief reads the restart file. At the moment only SCF (means only real)
263!> \param qs_env ...
264!> \author Florian Schiffmann (02.09)
265! **************************************************************************************************
266
267 SUBROUTINE get_restart_wfn(qs_env)
268 TYPE(qs_environment_type), POINTER :: qs_env
269
270 CHARACTER(LEN=default_path_length) :: file_name, project_name
271 INTEGER :: i, id_nr, im, ispin, ncol, nspin, &
272 output_unit, re, unit_nr
273 REAL(kind=dp) :: alpha, cs_pos
274 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
275 TYPE(cp_fm_type) :: mos_occ
276 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_old
277 TYPE(cp_logger_type), POINTER :: logger
278 TYPE(dbcsr_distribution_type) :: dist
279 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_rmpv, rho_new, rho_old
280 TYPE(dft_control_type), POINTER :: dft_control
281 TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
282 TYPE(mp_para_env_type), POINTER :: para_env
283 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
284 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
285 TYPE(qs_rho_type), POINTER :: rho_struct
286 TYPE(rt_prop_type), POINTER :: rtp
287 TYPE(section_vals_type), POINTER :: dft_section, input
288
289 NULLIFY (atomic_kind_set, qs_kind_set, mo_array, particle_set, rho_struct, para_env)
290
291 CALL get_qs_env(qs_env, &
292 qs_kind_set=qs_kind_set, &
293 atomic_kind_set=atomic_kind_set, &
294 particle_set=particle_set, &
295 mos=mo_array, &
296 input=input, &
297 rtp=rtp, &
298 dft_control=dft_control, &
299 rho=rho_struct, &
300 para_env=para_env)
301 logger => cp_get_default_logger()
302 output_unit = cp_logger_get_default_io_unit(logger)
303
304 IF (logger%para_env%is_source()) THEN
305 unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
306 ELSE
307 unit_nr = -1
308 END IF
309
310 id_nr = 0
311 nspin = SIZE(mo_array)
312 CALL qs_rho_get(rho_struct, rho_ao=p_rmpv)
313 dft_section => section_vals_get_subs_vals(input, "DFT")
314 SELECT CASE (dft_control%rtp_control%initial_wfn)
315 CASE (use_restart_wfn)
316 CALL read_mo_set_from_restart(mo_array, qs_kind_set, particle_set, para_env, &
317 id_nr=id_nr, multiplicity=dft_control%multiplicity, &
318 dft_section=dft_section)
319 CALL set_uniform_occupation_mo_array(mo_array, nspin)
320
321 IF (dft_control%rtp_control%apply_wfn_mix_init_restart) THEN
322 CALL wfn_mix(mo_array, particle_set, dft_section, qs_kind_set, para_env, output_unit, &
323 for_rtp=.true.)
324 END IF
325
326 DO ispin = 1, nspin
327 CALL calculate_density_matrix(mo_array(ispin), p_rmpv(ispin)%matrix)
328 END DO
329 IF (rtp%linear_scaling) THEN
330 CALL get_rtp(rtp=rtp, rho_old=rho_old, rho_new=rho_new)
331 DO ispin = 1, nspin
332 re = 2*ispin - 1
333 im = 2*ispin
334 CALL cp_fm_get_info(mo_array(ispin)%mo_coeff, ncol_global=ncol)
335 CALL cp_fm_create(mos_occ, &
336 matrix_struct=mo_array(ispin)%mo_coeff%matrix_struct, &
337 name="mos_occ")
338 CALL cp_fm_to_fm(mo_array(ispin)%mo_coeff, mos_occ)
339 IF (mo_array(ispin)%uniform_occupation) THEN
340 alpha = 3.0_dp - real(nspin, dp)
341 CALL cp_fm_column_scale(mos_occ, mo_array(ispin)%occupation_numbers/alpha)
342 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_old(re)%matrix, &
343 matrix_v=mos_occ, &
344 ncol=ncol, &
345 alpha=alpha, keep_sparsity=.false.)
346 ELSE
347 alpha = 1.0_dp
348 CALL cp_fm_column_scale(mos_occ, mo_array(ispin)%occupation_numbers/alpha)
349 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_old(re)%matrix, &
350 matrix_v=mo_array(ispin)%mo_coeff, &
351 matrix_g=mos_occ, &
352 ncol=ncol, &
353 alpha=alpha, keep_sparsity=.false.)
354 END IF
355 CALL dbcsr_filter(rho_old(re)%matrix, rtp%filter_eps)
356 CALL dbcsr_copy(rho_new(re)%matrix, rho_old(re)%matrix)
357 CALL cp_fm_release(mos_occ)
358 END DO
359 CALL calc_update_rho_sparse(qs_env)
360 ELSE
361 CALL get_rtp(rtp=rtp, mos_old=mos_old)
362 DO i = 1, SIZE(qs_env%mos)
363 CALL cp_fm_to_fm(mo_array(i)%mo_coeff, mos_old(2*i - 1))
364 CALL cp_fm_set_all(mos_old(2*i), zero, zero)
365 END DO
366 END IF
367 CASE (use_rt_restart)
368 IF (rtp%linear_scaling) THEN
369 CALL get_rtp(rtp=rtp, rho_old=rho_old, rho_new=rho_new)
370 project_name = logger%iter_info%project_name
371 DO ispin = 1, nspin
372 re = 2*ispin - 1
373 im = 2*ispin
374 WRITE (file_name, '(A,I0,A)') trim(project_name)//"_LS_DM_SPIN_RE", ispin, "_RESTART.dm"
375 CALL dbcsr_get_info(rho_old(re)%matrix, distribution=dist)
376 CALL dbcsr_binary_read(file_name, distribution=dist, matrix_new=rho_old(re)%matrix)
377 cs_pos = dbcsr_checksum(rho_old(re)%matrix, pos=.true.)
378 IF (unit_nr > 0) THEN
379 WRITE (unit_nr, '(T2,A,E20.8)') "Read restart DM "//trim(file_name)//" with checksum: ", cs_pos
380 END IF
381 WRITE (file_name, '(A,I0,A)') trim(project_name)//"_LS_DM_SPIN_IM", ispin, "_RESTART.dm"
382 CALL dbcsr_get_info(rho_old(im)%matrix, distribution=dist)
383 CALL dbcsr_binary_read(file_name, distribution=dist, matrix_new=rho_old(im)%matrix)
384 cs_pos = dbcsr_checksum(rho_old(im)%matrix, pos=.true.)
385 IF (unit_nr > 0) THEN
386 WRITE (unit_nr, '(T2,A,E20.8)') "Read restart DM "//trim(file_name)//" with checksum: ", cs_pos
387 END IF
388 END DO
389 DO i = 1, SIZE(rho_new)
390 CALL dbcsr_copy(rho_new(i)%matrix, rho_old(i)%matrix)
391 END DO
392 CALL calc_update_rho_sparse(qs_env)
393 ELSE
394 CALL get_rtp(rtp=rtp, mos_old=mos_old)
395 CALL read_rt_mos_from_restart(mo_array, mos_old, qs_kind_set, particle_set, para_env, &
396 id_nr, dft_control%multiplicity, dft_section)
397 CALL set_uniform_occupation_mo_array(mo_array, nspin)
398 DO ispin = 1, nspin
399 CALL calculate_density_matrix(mo_array(ispin), &
400 p_rmpv(ispin)%matrix)
401 END DO
402 END IF
403 END SELECT
404
405 END SUBROUTINE get_restart_wfn
406
407! **************************************************************************************************
408!> \brief Set mo_array(ispin)%uniform_occupation after a restart
409!> \param mo_array ...
410!> \param nspin ...
411!> \author Guillaume Le Breton (03.23)
412! **************************************************************************************************
413
414 SUBROUTINE set_uniform_occupation_mo_array(mo_array, nspin)
415
416 TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
417 INTEGER :: nspin
418
419 INTEGER :: ispin, mo
420 LOGICAL :: is_uniform
421
422 DO ispin = 1, nspin
423 is_uniform = .true.
424 DO mo = 1, mo_array(ispin)%nmo
425 IF (mo_array(ispin)%occupation_numbers(mo) /= 0.0 .AND. &
426 mo_array(ispin)%occupation_numbers(mo) /= 1.0 .AND. &
427 mo_array(ispin)%occupation_numbers(mo) /= 2.0) THEN
428 is_uniform = .false.
429 END IF
430 END DO
431 mo_array(ispin)%uniform_occupation = is_uniform
432 END DO
433
434 END SUBROUTINE set_uniform_occupation_mo_array
435
436! **************************************************************************************************
437!> \brief calculates the density from the complex MOs and passes the density to
438!> qs_env.
439!> \param qs_env ...
440!> \author Florian Schiffmann (02.09)
441! **************************************************************************************************
442
443 SUBROUTINE calc_update_rho(qs_env)
444
445 TYPE(qs_environment_type), POINTER :: qs_env
446
447 CHARACTER(len=*), PARAMETER :: routinen = 'calc_update_rho'
448 REAL(kind=dp), PARAMETER :: one = 1.0_dp, zero = 0.0_dp
449
450 INTEGER :: handle, i, im, ncol, re
451 REAL(kind=dp) :: alpha
452 TYPE(cp_fm_type) :: mos_occ
453 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new
454 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao, rho_ao_im
455 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
456 TYPE(qs_ks_env_type), POINTER :: ks_env
457 TYPE(qs_rho_type), POINTER :: rho
458 TYPE(rt_prop_type), POINTER :: rtp
459
460 CALL timeset(routinen, handle)
461
462 NULLIFY (rho, ks_env, mos_new, rtp)
463 CALL get_qs_env(qs_env, &
464 ks_env=ks_env, &
465 rho=rho, &
466 rtp=rtp, &
467 mos=mos)
468 CALL get_rtp(rtp=rtp, mos_new=mos_new)
469 CALL qs_rho_get(rho_struct=rho, rho_ao=rho_ao)
470 DO i = 1, SIZE(mos_new)/2
471 re = 2*i - 1; im = 2*i
472 CALL dbcsr_set(rho_ao(i)%matrix, zero)
473 CALL cp_fm_get_info(mos_new(re), ncol_global=ncol)
474 CALL cp_fm_create(mos_occ, &
475 matrix_struct=mos(i)%mo_coeff%matrix_struct, &
476 name="mos_occ")
477 CALL cp_fm_to_fm(mos_new(re), mos_occ)
478 IF (mos(i)%uniform_occupation) THEN
479 alpha = 3*one - real(SIZE(mos_new)/2, dp)
480 CALL cp_fm_column_scale(mos_occ, mos(i)%occupation_numbers/alpha)
481 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_ao(i)%matrix, &
482 matrix_v=mos_occ, &
483 ncol=ncol, &
484 alpha=alpha)
485 ELSE
486 alpha = 1.0_dp
487 CALL cp_fm_column_scale(mos_occ, mos(i)%occupation_numbers/alpha)
488 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_ao(i)%matrix, &
489 matrix_v=mos_new(re), &
490 matrix_g=mos_occ, &
491 ncol=ncol, &
492 alpha=alpha)
493 END IF
494
495 ! It is actually complex conjugate but i*i=-1 therefore it must be added
496 CALL cp_fm_to_fm(mos_new(im), mos_occ)
497 IF (mos(i)%uniform_occupation) THEN
498 alpha = 3*one - real(SIZE(mos_new)/2, dp)
499 CALL cp_fm_column_scale(mos_occ, mos(i)%occupation_numbers/alpha)
500 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_ao(i)%matrix, &
501 matrix_v=mos_occ, &
502 ncol=ncol, &
503 alpha=alpha)
504 ELSE
505 alpha = 1.0_dp
506 CALL cp_fm_column_scale(mos_occ, mos(i)%occupation_numbers/alpha)
507 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_ao(i)%matrix, &
508 matrix_v=mos_new(im), &
509 matrix_g=mos_occ, &
510 ncol=ncol, &
511 alpha=alpha)
512 END IF
513 CALL cp_fm_release(mos_occ)
514 END DO
515 CALL qs_rho_update_rho(rho, qs_env)
516
517 IF (rtp%track_imag_density) THEN
518 CALL qs_rho_get(rho_struct=rho, rho_ao_im=rho_ao_im)
519 CALL calculate_p_imaginary(qs_env, rtp, rho_ao_im, keep_sparsity=.true.)
520 CALL qs_rho_set(rho, rho_ao_im=rho_ao_im)
521 END IF
522
523 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
524
525 CALL timestop(handle)
526
527 END SUBROUTINE calc_update_rho
528
529! **************************************************************************************************
530!> \brief Copies the density matrix back into the qs_env%rho%rho_ao
531!> \param qs_env ...
532!> \author Samuel Andermatt (3.14)
533! **************************************************************************************************
534
535 SUBROUTINE calc_update_rho_sparse(qs_env)
536
537 TYPE(qs_environment_type), POINTER :: qs_env
538
539 CHARACTER(len=*), PARAMETER :: routinen = 'calc_update_rho_sparse'
540 REAL(kind=dp), PARAMETER :: zero = 0.0_dp
541
542 INTEGER :: handle, ispin
543 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao, rho_ao_im, rho_new
544 TYPE(dft_control_type), POINTER :: dft_control
545 TYPE(qs_ks_env_type), POINTER :: ks_env
546 TYPE(qs_rho_type), POINTER :: rho
547 TYPE(rt_prop_type), POINTER :: rtp
548 TYPE(rtp_control_type), POINTER :: rtp_control
549
550 NULLIFY (rho, ks_env, rtp, dft_control)
551 CALL timeset(routinen, handle)
552 CALL get_qs_env(qs_env, &
553 ks_env=ks_env, &
554 rho=rho, &
555 rtp=rtp, &
556 dft_control=dft_control)
557 rtp_control => dft_control%rtp_control
558 CALL get_rtp(rtp=rtp, rho_new=rho_new)
559 CALL qs_rho_get(rho_struct=rho, rho_ao=rho_ao)
560 IF (rtp%track_imag_density) CALL qs_rho_get(rho_struct=rho, rho_ao_im=rho_ao_im)
561 DO ispin = 1, SIZE(rho_ao)
562 CALL dbcsr_set(rho_ao(ispin)%matrix, zero)
563 CALL dbcsr_copy(rho_ao(ispin)%matrix, rho_new(ispin*2 - 1)%matrix, keep_sparsity=.true.)
564 IF (rtp%track_imag_density) THEN
565 CALL dbcsr_copy(rho_ao_im(ispin)%matrix, rho_new(ispin*2)%matrix, keep_sparsity=.true.)
566 END IF
567 END DO
568
569 CALL qs_rho_update_rho(rho, qs_env)
570 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
571
572 CALL timestop(handle)
573
574 END SUBROUTINE calc_update_rho_sparse
575
576! **************************************************************************************************
577!> \brief ...
578!> \param qs_env ...
579!> \param rtp ...
580!> \param matrix_p_im ...
581!> \param keep_sparsity ...
582! **************************************************************************************************
583 SUBROUTINE calculate_p_imaginary(qs_env, rtp, matrix_p_im, keep_sparsity)
584 TYPE(qs_environment_type), POINTER :: qs_env
585 TYPE(rt_prop_type), POINTER :: rtp
586 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p_im
587 LOGICAL, OPTIONAL :: keep_sparsity
588
589 INTEGER :: i, im, ncol, re
590 LOGICAL :: my_keep_sparsity
591 REAL(kind=dp) :: alpha
592 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new, mos_occ
593 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
594
595 CALL get_rtp(rtp=rtp, mos_new=mos_new)
596
597 my_keep_sparsity = .false.
598 IF (PRESENT(keep_sparsity)) my_keep_sparsity = keep_sparsity
599 CALL get_qs_env(qs_env, mos=mos)
600 ALLOCATE (mos_occ(SIZE(mos)*2))
601
602 DO i = 1, SIZE(mos_new)/2
603 re = 2*i - 1; im = 2*i
604 alpha = 3.0_dp - real(SIZE(matrix_p_im), dp)
605 CALL cp_fm_create(mos_occ(re), &
606 matrix_struct=mos(i)%mo_coeff%matrix_struct, &
607 name="mos_occ")
608 CALL cp_fm_create(mos_occ(im), &
609 matrix_struct=mos(i)%mo_coeff%matrix_struct, &
610 name="mos_occ")
611 CALL dbcsr_set(matrix_p_im(i)%matrix, 0.0_dp)
612 CALL cp_fm_get_info(mos_new(re), ncol_global=ncol)
613 CALL cp_fm_to_fm(mos_new(re), mos_occ(re))
614 CALL cp_fm_column_scale(mos_occ(re), mos(i)%occupation_numbers/alpha)
615 CALL cp_fm_to_fm(mos_new(im), mos_occ(im))
616 CALL cp_fm_column_scale(mos_occ(im), mos(i)%occupation_numbers/alpha)
617 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=matrix_p_im(i)%matrix, &
618 matrix_v=mos_occ(im), &
619 matrix_g=mos_occ(re), &
620 ncol=ncol, &
621 keep_sparsity=my_keep_sparsity, &
622 alpha=2.0_dp*alpha, &
623 symmetry_mode=-1)
624 END DO
625 CALL cp_fm_release(mos_occ)
626
627 END SUBROUTINE calculate_p_imaginary
628
629! **************************************************************************************************
630!> \brief ...
631!> \param qs_env ...
632!> \param rtp ...
633! **************************************************************************************************
634 SUBROUTINE write_rtp_mos_to_output_unit(qs_env, rtp)
635 TYPE(qs_environment_type), POINTER :: qs_env
636 TYPE(rt_prop_type), POINTER :: rtp
637
638 CHARACTER(len=*), PARAMETER :: routinen = 'write_rtp_mos_to_output_unit'
639
640 CHARACTER(LEN=10) :: spin
641 CHARACTER(LEN=2*default_string_length) :: name
642 INTEGER :: handle, i, ispin, nao, nelectron, nmo, &
643 nspins
644 LOGICAL :: print_eigvecs, print_mo_info
645 REAL(kind=dp) :: flexible_electron_count, maxocc, n_el_f
646 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
647 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new
648 TYPE(cp_logger_type), POINTER :: logger
649 TYPE(mo_set_type) :: mo_set_rtp
650 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
651 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
652 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
653 TYPE(section_vals_type), POINTER :: dft_section, input
654
655 NULLIFY (atomic_kind_set, particle_set, qs_kind_set, input, mos, dft_section)
656
657 CALL timeset(routinen, handle)
658
659 CALL get_qs_env(qs_env, &
660 atomic_kind_set=atomic_kind_set, &
661 qs_kind_set=qs_kind_set, &
662 particle_set=particle_set, &
663 input=input, &
664 mos=mos)
665 ! Quick return, if no printout of MO information is requested
666 dft_section => section_vals_get_subs_vals(input, "DFT")
667 CALL section_vals_val_get(dft_section, "PRINT%MO%EIGENVECTORS", l_val=print_eigvecs)
668
669 NULLIFY (logger)
670 logger => cp_get_default_logger()
671 print_mo_info = (cp_print_key_should_output(logger%iter_info, &
672 dft_section, "PRINT%MO") /= 0) .OR. &
673 (qs_env%sim_step == 1)
674
675 IF ((.NOT. print_mo_info) .OR. (.NOT. print_eigvecs)) THEN
676 CALL timestop(handle)
677 RETURN
678 END IF
679
680 CALL get_rtp(rtp=rtp, mos_new=mos_new)
681
682 nspins = SIZE(mos_new)/2
683
684 DO ispin = 1, nspins
685 ! initiate mo_set
686 CALL get_mo_set(mo_set=mos(ispin), nao=nao, nmo=nmo, nelectron=nelectron, &
687 n_el_f=n_el_f, maxocc=maxocc, flexible_electron_count=flexible_electron_count)
688
689 CALL allocate_mo_set(mo_set_rtp, &
690 nao=nao, &
691 nmo=nmo, &
692 nelectron=nelectron, &
693 n_el_f=n_el_f, &
694 maxocc=maxocc, &
695 flexible_electron_count=flexible_electron_count)
696
697 WRITE (name, fmt="(A,I6)") "RTP MO SET, SPIN ", ispin
698 CALL init_mo_set(mo_set_rtp, fm_ref=mos_new(2*ispin - 1), name=name)
699
700 IF (nspins > 1) THEN
701 IF (ispin == 1) THEN
702 spin = "ALPHA SPIN"
703 ELSE
704 spin = "BETA SPIN"
705 END IF
706 ELSE
707 spin = ""
708 END IF
709
710 mo_set_rtp%occupation_numbers = mos(ispin)%occupation_numbers
711
712 !loop for real (odd) and imaginary (even) parts
713 DO i = 1, 0, -1
714 CALL cp_fm_to_fm(mos_new(2*ispin - i), mo_set_rtp%mo_coeff)
715 CALL write_mo_set_to_output_unit(mo_set_rtp, qs_kind_set, particle_set, &
716 dft_section, 4, 0, rtp=.true., spin=trim(spin), &
717 cpart=mod(i, 2), sim_step=qs_env%sim_step)
718 END DO
719
720 CALL deallocate_mo_set(mo_set_rtp)
721 END DO
722
723 CALL timestop(handle)
724
725 END SUBROUTINE write_rtp_mos_to_output_unit
726
727! **************************************************************************************************
728!> \brief Write the time dependent amplitude of the MOs in real grid.
729!> Very close to qs_scf_post_gpw/qs_scf_post_occ_cubes subroutine.
730!> \param qs_env ...
731!> \param rtp ...
732!> \author Guillaume Le Breton (11.22)
733! **************************************************************************************************
734 SUBROUTINE write_rtp_mo_cubes(qs_env, rtp)
735 TYPE(qs_environment_type), POINTER :: qs_env
736 TYPE(rt_prop_type), POINTER :: rtp
737
738 CHARACTER(LEN=*), PARAMETER :: routinen = 'write_rtp_mo_cubes'
739
740 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
741 INTEGER :: handle, homo, i, ir, ispin, ivector, &
742 n_rep, nhomo, nlist, nspins, &
743 rt_time_step, unit_nr
744 INTEGER, DIMENSION(:), POINTER :: list, list_index
745 LOGICAL :: append_cube, do_kpoints, mpi_io
746 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
747 TYPE(cell_type), POINTER :: cell
748 TYPE(cp_blacs_env_type), POINTER :: blacs_env
749 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new
750 TYPE(cp_fm_type), POINTER :: mo_coeff
751 TYPE(cp_logger_type), POINTER :: logger
752 TYPE(dft_control_type), POINTER :: dft_control
753 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
754 TYPE(mp_para_env_type), POINTER :: para_env
755 TYPE(particle_list_type), POINTER :: particles
756 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
757 TYPE(pw_c1d_gs_type) :: wf_g
758 TYPE(pw_env_type), POINTER :: pw_env
759 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
760 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
761 TYPE(pw_r3d_rs_type) :: density_r, wf_r
762 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
763 TYPE(qs_subsys_type), POINTER :: subsys
764 TYPE(section_vals_type), POINTER :: dft_section, input
765
766 CALL timeset(routinen, handle)
767
768 NULLIFY (logger, auxbas_pw_pool, pw_pools, pw_env)
769
770 ! Get all the info from qs:
771 CALL get_qs_env(qs_env, do_kpoints=do_kpoints, &
772 input=input)
773
774 ! Kill the run in the case of K points
775 IF (do_kpoints) THEN
776 cpabort("K points not handled yet for printing MO_CUBE")
777 END IF
778
779 dft_section => section_vals_get_subs_vals(input, "DFT")
780 logger => cp_get_default_logger()
781
782 ! Quick return if no print required
783 IF (.NOT. btest(cp_print_key_should_output(logger%iter_info, dft_section, &
784 "PRINT%MO_CUBES"), cp_p_file)) THEN
785 CALL timestop(handle)
786 RETURN
787 END IF
788
789 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, &
790 mos=mos, &
791 blacs_env=blacs_env, &
792 qs_kind_set=qs_kind_set, &
793 pw_env=pw_env, &
794 subsys=subsys, &
795 para_env=para_env, &
796 particle_set=particle_set, &
797 dft_control=dft_control)
798 CALL qs_subsys_get(subsys, particles=particles)
799
800 nspins = dft_control%nspins
801 rt_time_step = qs_env%sim_step
802
803 ! Setup the grids needed to compute a wavefunction given a vector
804 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
805 pw_pools=pw_pools)
806 CALL auxbas_pw_pool%create_pw(wf_r)
807 CALL auxbas_pw_pool%create_pw(wf_g)
808 CALL auxbas_pw_pool%create_pw(density_r)
809 CALL get_rtp(rtp=rtp, mos_new=mos_new)
810
811 DO ispin = 1, nspins
812 CALL get_mo_set(mo_set=mos(ispin), homo=homo)
813
814 nhomo = section_get_ival(dft_section, "PRINT%MO_CUBES%NHOMO")
815 append_cube = section_get_lval(dft_section, "PRINT%MO_CUBES%APPEND")
816 my_pos_cube = "REWIND"
817 IF (append_cube) THEN
818 my_pos_cube = "APPEND"
819 END IF
820 CALL section_vals_val_get(dft_section, "PRINT%MO_CUBES%HOMO_LIST", n_rep_val=n_rep)
821 IF (n_rep > 0) THEN ! write the cubes of the list
822 nlist = 0
823 DO ir = 1, n_rep
824 NULLIFY (list)
825 CALL section_vals_val_get(dft_section, "PRINT%MO_CUBES%HOMO_LIST", i_rep_val=ir, &
826 i_vals=list)
827 IF (ASSOCIATED(list)) THEN
828 CALL reallocate(list_index, 1, nlist + SIZE(list))
829 DO i = 1, SIZE(list)
830 list_index(i + nlist) = list(i)
831 END DO
832 nlist = nlist + SIZE(list)
833 END IF
834 END DO
835 ELSE
836
837 IF (nhomo == -1) nhomo = homo
838 nlist = homo - max(1, homo - nhomo + 1) + 1
839 ALLOCATE (list_index(nlist))
840 DO i = 1, nlist
841 list_index(i) = max(1, homo - nhomo + 1) + i - 1
842 END DO
843 END IF
844 DO i = 1, nlist
845 ivector = list_index(i)
846 CALL get_qs_env(qs_env=qs_env, &
847 atomic_kind_set=atomic_kind_set, &
848 qs_kind_set=qs_kind_set, &
849 cell=cell, &
850 particle_set=particle_set, &
851 pw_env=pw_env)
852
853 ! density_r contains the density of the MOs
854 CALL pw_zero(density_r)
855 mo_coeff => mos_new(2*ispin - 1)!Real coeff
856 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
857 cell, dft_control, particle_set, pw_env)
858 ! Adding the real part
859 CALL pw_multiply(density_r, wf_r, wf_r, 1.0_dp)
860
861 mo_coeff => mos_new(2*ispin) !Im coeff
862 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
863 cell, dft_control, particle_set, pw_env)
864 ! Adding the im part
865 CALL pw_multiply(density_r, wf_r, wf_r, 1.0_dp)
866
867 WRITE (filename, '(a4,I5.5,a1,I1.1)') "WFN_", ivector, "_", ispin
868 mpi_io = .true.
869 unit_nr = cp_print_key_unit_nr(logger, input, "DFT%PRINT%MO_CUBES", extension=".cube", &
870 middle_name=trim(filename), file_position=my_pos_cube, log_filename=.false., &
871 mpi_io=mpi_io)
872 WRITE (title, *) "DENSITY ", ivector, " spin ", ispin, " i.e. HOMO - ", ivector - homo
873 CALL cp_pw_to_cube(density_r, unit_nr, title, particles=particles, &
874 stride=section_get_ivals(dft_section, "PRINT%MO_CUBES%STRIDE"), mpi_io=mpi_io)
875 CALL cp_print_key_finished_output(unit_nr, logger, input, "DFT%PRINT%MO_CUBES", mpi_io=mpi_io)
876 END DO
877 IF (ASSOCIATED(list_index)) DEALLOCATE (list_index)
878 END DO
879
880 ! Deallocate grids needed to compute wavefunctions
881 CALL auxbas_pw_pool%give_back_pw(wf_r)
882 CALL auxbas_pw_pool%give_back_pw(wf_g)
883 CALL auxbas_pw_pool%give_back_pw(density_r)
884
885 CALL timestop(handle)
886
887 END SUBROUTINE write_rtp_mo_cubes
888
889! **************************************************************************************************
890!> \brief Warn about unused sections of the print section - only implemented for some of the methods
891!> \param section Parent section
892!> \param subsection_name Name of the subsection which is not used even when explicitly included
893!> \param error_message Message to display as warning
894!> \author Stepan Marek (01.25)
895! **************************************************************************************************
896 SUBROUTINE warn_section_unused(section, subsection_name, error_message)
897 TYPE(section_vals_type), POINTER :: section
898 CHARACTER(len=*) :: subsection_name, error_message
899
900 LOGICAL :: explicit
901 TYPE(section_vals_type), POINTER :: target_section
902
903 target_section => section_vals_get_subs_vals(section, subsection_name)
904 CALL section_vals_get(target_section, explicit=explicit)
905 IF (explicit) cpwarn(error_message)
906 END SUBROUTINE warn_section_unused
907! **************************************************************************************************
908!> \brief Attempt to read the moments from a previously written file
909!> \param moments_section Print key section for the moments trace
910!> \param orig_start Index from which the original calculation started (given by input file)
911!> \param current_start The current start index from which the calculation continues
912!> \param moments Moment trace, where the read entries are overwritten
913!> \param times Optional time trace, where again the read entries are overwritten
914!> \param mom_read Whether moments were actually read
915!> \author Stepan Marek (11.25)
916! **************************************************************************************************
917 SUBROUTINE read_moments(moments_section, orig_start, current_start, moments, times, mom_read)
918 TYPE(section_vals_type), POINTER :: moments_section
919 INTEGER :: orig_start, current_start
920 COMPLEX(kind=dp), DIMENSION(:, :, :), POINTER :: moments
921 REAL(kind=dp), DIMENSION(:), OPTIONAL, POINTER :: times
922 LOGICAL, OPTIONAL :: mom_read
923
924 CHARACTER(len=14), DIMENSION(4) :: file_extensions
925 CHARACTER(len=default_path_length) :: save_name_im, save_name_re
926 INTEGER :: i, k, max_n, n, n_spin, unit_im, unit_re
927 REAL(kind=dp) :: time
928 REAL(kind=dp), DIMENSION(3) :: moments_im, moments_re
929 TYPE(cp_logger_type), POINTER :: logger
930
931! Whether at least some moments where extracted from the files
932
933 file_extensions(1) = "_SPIN_A_RE.dat"
934 file_extensions(2) = "_SPIN_A_IM.dat"
935 file_extensions(3) = "_SPIN_B_RE.dat"
936 file_extensions(4) = "_SPIN_B_IM.dat"
937
938 IF (PRESENT(mom_read)) mom_read = .false.
939
940 n_spin = SIZE(moments, 1)
941
942 logger => cp_get_default_logger()
943 max_n = current_start - orig_start + 1
944
945 DO i = 1, n_spin
946 ! Open the relevant files
947 save_name_re = cp_print_key_generate_filename(logger, moments_section, &
948 extension=file_extensions(2*i - 1), my_local=.false.)
949 save_name_im = cp_print_key_generate_filename(logger, moments_section, &
950 extension=file_extensions(2*i), my_local=.false.)
951 IF (file_exists(save_name_re) .AND. file_exists(save_name_im)) THEN
952 CALL open_file(save_name_re, file_status="OLD", file_form="FORMATTED", file_action="READ", &
953 unit_number=unit_re)
954 CALL open_file(save_name_im, file_status="OLD", file_form="FORMATTED", file_action="READ", &
955 unit_number=unit_im)
956 ! Skip the headers
957 READ (unit_re, '()')
958 READ (unit_im, '()')
959 DO n = 1, max_n
960 ! Read the data
961 READ (unit_re, '(E20.8E3,E20.8E3,E20.8E3,E20.8E3,E20.8E3)') time, &
962 moments_re(1), moments_re(2), moments_re(3)
963 READ (unit_im, '(E20.8E3,E20.8E3,E20.8E3,E20.8E3,E20.8E3)') time, &
964 moments_im(1), moments_im(2), moments_im(3)
965 DO k = 1, 3
966 moments(i, k, n) = cmplx(moments_re(k), moments_im(k), kind=dp)
967 END DO
968 IF (PRESENT(times)) THEN
969 times(n) = time/femtoseconds
970 END IF
971 END DO
972 IF (PRESENT(mom_read)) mom_read = .true.
973 CALL close_file(unit_re)
974 CALL close_file(unit_im)
975 ELSE
976 moments(i, :, 1:max_n) = cmplx(0.0, 0.0, kind=dp)
977 cpwarn("Could not read at least one moments file - missing trace is set to zero.")
978 END IF
979 END DO
980 END SUBROUTINE read_moments
981
982! **************************************************************************************************
983!> \brief Recalculates the field for index range given by orig_start and i_start,
984!> with times taken from the times array
985!> \param fields Array, where relevant indices are recalculated
986!> \param times Array of input times
987!> \param orig_start original start (in case of restarts)
988!> \param i_start current start
989!> \param dft_control DFT parameters
990!> \date 11.2025
991!> \author Stepan Marek
992! **************************************************************************************************
993 SUBROUTINE recalculate_fields(fields, times, orig_start, i_start, dft_control)
994 COMPLEX(kind=dp), DIMENSION(:, :), POINTER :: fields
995 REAL(kind=dp), DIMENSION(:), POINTER :: times
996 INTEGER :: orig_start, i_start
997 TYPE(dft_control_type), POINTER :: dft_control
998
999 INTEGER :: i, max_n
1000 REAL(kind=dp), DIMENSION(3) :: field
1001
1002 max_n = i_start - orig_start + 1
1003
1004 IF (dft_control%rtp_control%apply_delta_pulse .OR. &
1005 dft_control%rtp_control%apply_delta_pulse_mag) THEN
1006 fields(:, 1:max_n) = 0.0_dp
1007 ELSE
1008 DO i = 1, max_n
1009 CALL make_field(dft_control, field, i + orig_start - 1, times(i))
1010 fields(:, i) = field(:)
1011 END DO
1012 END IF
1013 END SUBROUTINE recalculate_fields
1014
1015END MODULE rt_propagation_utils
Define the atomic kind types and their sub types.
Handles all functions related to the CELL.
Definition cell_types.F:15
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_binary_read(filepath, distribution, matrix_new)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
real(kind=dp) function, public dbcsr_checksum(matrix, pos)
Calculates the checksum of a DBCSR matrix.
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
Utility routines to open and close files. Tracking of preconnections.
Definition cp_files.F:16
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
Definition cp_files.F:311
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
Definition cp_files.F:122
logical function, public file_exists(file_name)
Checks if file exists, considering also the file discovery mechanism.
Definition cp_files.F:504
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
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
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
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...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
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...
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
...
all routins needed for a nonperiodic electric field
subroutine, public make_field(dft_control, field, sim_step, sim_time)
computes the amplitude of the efield within a given envelop
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_rt_restart
objects that represent the structure of input sections and the data contained in an input section
integer function, dimension(:), pointer, public section_get_ivals(section_vals, keyword_name)
...
integer function, public section_get_ival(section_vals, keyword_name)
...
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
logical function, public section_get_lval(section_vals, keyword_name)
...
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
integer, parameter, public default_path_length
Definition kinds.F:58
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition list.F:24
Definition of mathematical constants and functions.
real(kind=dp), parameter, public one
real(kind=dp), parameter, public zero
Utility routines for the memory handling.
Interface to the message passing library MPI.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
represent a simple array based list of the given type
Define the data structure for the particle information.
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public femtoseconds
Definition physcon.F:153
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_wavefunction(mo_vectors, ivector, rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env, basis_type)
maps a given wavefunction on the grid
collects routines that calculate density matrices
Calculation of Overlap and Hamiltonian matrices in DFTB.
subroutine, public build_dftb_overlap(qs_env, nderivative, matrix_s)
...
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.
Define the quickstep kind type and their sub types.
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 read_mo_set_from_restart(mo_array, qs_kind_set, particle_set, para_env, id_nr, multiplicity, dft_section, natom_mismatch, cdft, out_unit)
...
Definition qs_mo_io.F:524
subroutine, public read_rt_mos_from_restart(mo_array, rt_mos, qs_kind_set, particle_set, para_env, id_nr, multiplicity, dft_section)
...
Definition qs_mo_io.F:617
subroutine, public write_mo_set_to_output_unit(mo_set, qs_kind_set, particle_set, dft_section, before, kpoint, final_mos, spin, solver_method, rtp, cpart, sim_step, umo_set, qs_env)
Write MO information to output file (eigenvalues, occupation numbers, coefficients)
Definition qs_mo_io.F:1023
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 allocate_mo_set(mo_set, nao, nmo, nelectron, n_el_f, maxocc, flexible_electron_count)
Allocates a mo set and partially initializes it (nao,nmo,nelectron, and flexible_electron_count are v...
subroutine, public deallocate_mo_set(mo_set)
Deallocate a wavefunction data structure.
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.
Define the neighbor list data types and the corresponding functionality.
Calculation of overlap matrix, its derivatives and forces.
Definition qs_overlap.F:19
subroutine, public build_overlap_matrix(ks_env, matrix_s, matrixkp_s, matrix_name, nderivative, basis_type_a, basis_type_b, sab_nl, calculate_forces, matrix_p, matrixkp_p, ext_kpoints)
Calculation of the overlap matrix over Cartesian Gaussian functions.
Definition qs_overlap.F:121
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
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)
...
subroutine, public qs_rho_get(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)
returns info about the density described by this object. If some representation is not available an e...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, unoccupied_orbs, scf_env, matrix_s, marked_states, for_rtp)
writes a new 'mixed' set of mos to restart file, without touching the current MOs
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
Types and set_get for real time propagation depending on runtype and diagonalization method different...
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 write_rtp_mos_to_output_unit(qs_env, rtp)
...
subroutine, public write_rtp_mo_cubes(qs_env, rtp)
Write the time dependent amplitude of the MOs in real grid. Very close to qs_scf_post_gpw/qs_scf_post...
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 calculate_p_imaginary(qs_env, rtp, matrix_p_im, keep_sparsity)
...
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)
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
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...
stores all the informations relevant to an mpi environment
contained for different pw related things
to create arrays of pools
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.
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.