(git:ed6f26b)
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-2025 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: &
28 USE cp_fm_types, ONLY: cp_fm_create,&
38 USE cp_output_handling, ONLY: cp_p_file,&
52 USE kinds, ONLY: default_path_length,&
54 dp
55 USE mathconstants, ONLY: zero
58 USE orbital_pointers, ONLY: ncoset
61 USE pw_env_types, ONLY: pw_env_get,&
63 USE pw_methods, ONLY: pw_multiply,&
65 USE pw_pool_types, ONLY: pw_pool_p_type,&
67 USE pw_types, ONLY: pw_c1d_gs_type,&
75 USE qs_ks_types, ONLY: qs_ks_did_change,&
80 USE qs_mo_types, ONLY: allocate_mo_set,&
88 USE qs_rho_types, ONLY: qs_rho_get,&
91 USE qs_scf_wfn_mix, ONLY: wfn_mix
94 USE rt_propagation_types, ONLY: get_rtp,&
96#include "../base/base_uses.f90"
97
98 IMPLICIT NONE
99 PRIVATE
100
101 PUBLIC :: get_restart_wfn, &
109
110 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'rt_propagation_utils'
111
112CONTAINS
113
114! **************************************************************************************************
115!> \brief Calculates dS/dR respectily the velocity weighted derivatves
116!> only needed for ehrenfest MD.
117!>
118!> \param qs_env the qs environment
119!> \par History
120!> 02.2009 created [Manuel Guidon]
121!> 02.2014 switched to dbcsr matrices [Samuel Andermatt]
122!> \author Florian Schiffmann
123! **************************************************************************************************
124 SUBROUTINE calc_s_derivs(qs_env)
125 TYPE(qs_environment_type), POINTER :: qs_env
126
127 CHARACTER(LEN=*), PARAMETER :: routinen = 'calc_S_derivs'
128 REAL(kind=dp), PARAMETER :: one = 1.0_dp, zero = 0.0_dp
129
130 INTEGER :: col_atom, handle, i, j, m, maxder, n, &
131 nder, row_atom
132 INTEGER, DIMENSION(6, 2) :: c_map_mat
133 LOGICAL :: return_s_derivatives
134 REAL(dp), DIMENSION(:, :), POINTER :: block_values
135 TYPE(dbcsr_iterator_type) :: iter
136 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: c_mat, s_der, s_derivs
137 TYPE(dbcsr_type), POINTER :: b_mat, tmp_mat, tmp_mat2
138 TYPE(dft_control_type), POINTER :: dft_control
139 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
140 POINTER :: sab_orb
141 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
142 TYPE(qs_ks_env_type), POINTER :: ks_env
143 TYPE(rt_prop_type), POINTER :: rtp
144
145 CALL timeset(routinen, handle)
146
147 return_s_derivatives = .true.
148
149 NULLIFY (particle_set)
150 NULLIFY (rtp)
151 NULLIFY (s_derivs)
152 NULLIFY (dft_control)
153 NULLIFY (ks_env)
154
155 CALL get_qs_env(qs_env=qs_env, &
156 rtp=rtp, &
157 particle_set=particle_set, &
158 sab_orb=sab_orb, &
159 dft_control=dft_control, &
160 ks_env=ks_env)
161
162 CALL get_rtp(rtp=rtp, b_mat=b_mat, c_mat=c_mat, s_der=s_der)
163
164 nder = 2
165 maxder = ncoset(nder)
166
167 NULLIFY (tmp_mat)
168 ALLOCATE (tmp_mat)
169 CALL dbcsr_create(tmp_mat, template=s_der(1)%matrix, matrix_type="N")
170
171 IF (rtp%iter < 2) THEN
172 ! calculate the overlap derivative matrices
173 IF (dft_control%qs_control%dftb) THEN
174 CALL build_dftb_overlap(qs_env, nder, s_derivs)
175 ELSE
176 CALL build_overlap_matrix(ks_env, nderivative=nder, matrix_s=s_derivs, &
177 basis_type_a="ORB", basis_type_b="ORB", sab_nl=sab_orb)
178 END IF
179
180 NULLIFY (tmp_mat2)
181 ALLOCATE (tmp_mat2)
182 CALL dbcsr_create(tmp_mat2, template=s_der(1)%matrix, matrix_type="S")
183 DO m = 1, 9
184 CALL dbcsr_copy(tmp_mat2, s_derivs(m + 1)%matrix)
185 CALL dbcsr_desymmetrize(tmp_mat2, s_der(m)%matrix)
186 CALL dbcsr_scale(s_der(m)%matrix, -one)
187 CALL dbcsr_filter(s_der(m)%matrix, rtp%filter_eps)
188 !The diagonal should be zero
189 CALL dbcsr_iterator_start(iter, s_der(m)%matrix)
190 DO WHILE (dbcsr_iterator_blocks_left(iter))
191 CALL dbcsr_iterator_next_block(iter, row_atom, col_atom, block_values)
192 IF (row_atom == col_atom) block_values = 0.0_dp
193 END DO
194 CALL dbcsr_iterator_stop(iter)
195 END DO
196 CALL dbcsr_deallocate_matrix_set(s_derivs)
197 CALL dbcsr_deallocate_matrix(tmp_mat2)
198 END IF
199
200 !calculate scalar product v(Rb)*<alpha|d/dRb beta> (B_mat), and store the first derivatives
201
202 CALL dbcsr_set(b_mat, zero)
203 DO m = 1, 3
204 CALL dbcsr_copy(tmp_mat, s_der(m)%matrix)
205 CALL dbcsr_iterator_start(iter, tmp_mat)
206 DO WHILE (dbcsr_iterator_blocks_left(iter))
207 CALL dbcsr_iterator_next_block(iter, row_atom, col_atom, block_values)
208 IF (row_atom == col_atom) block_values = 0.0_dp
209 block_values = block_values*particle_set(col_atom)%v(m)
210 END DO
211 CALL dbcsr_iterator_stop(iter)
212 CALL dbcsr_add(b_mat, tmp_mat, one, one)
213 END DO
214 CALL dbcsr_filter(b_mat, rtp%filter_eps)
215 !calculate C matrix: v(Rb)*<d/dRa alpha| d/dRb beta>
216
217 c_map_mat = 0
218 n = 0
219 DO j = 1, 3
220 DO m = j, 3
221 n = n + 1
222 c_map_mat(n, 1) = j
223 IF (m == j) cycle
224 c_map_mat(n, 2) = m
225 END DO
226 END DO
227
228 DO i = 1, 3
229 CALL dbcsr_set(c_mat(i)%matrix, zero)
230 END DO
231 DO m = 1, 6
232 CALL dbcsr_copy(tmp_mat, s_der(m + 3)%matrix)
233 DO j = 1, 2
234 IF (c_map_mat(m, j) == 0) cycle
235 CALL dbcsr_add(c_mat(c_map_mat(m, j))%matrix, tmp_mat, one, one)
236 END DO
237 END DO
238
239 DO m = 1, 3
240 CALL dbcsr_iterator_start(iter, c_mat(m)%matrix)
241 DO WHILE (dbcsr_iterator_blocks_left(iter))
242 CALL dbcsr_iterator_next_block(iter, row_atom, col_atom, block_values)
243 block_values = block_values*particle_set(row_atom)%v(m)
244 END DO
245 CALL dbcsr_iterator_stop(iter)
246 CALL dbcsr_filter(c_mat(m)%matrix, rtp%filter_eps)
247 END DO
248
249 CALL dbcsr_deallocate_matrix(tmp_mat)
250 CALL timestop(handle)
251 END SUBROUTINE
252
253! **************************************************************************************************
254!> \brief reads the restart file. At the moment only SCF (means only real)
255!> \param qs_env ...
256!> \author Florian Schiffmann (02.09)
257! **************************************************************************************************
258
259 SUBROUTINE get_restart_wfn(qs_env)
260 TYPE(qs_environment_type), POINTER :: qs_env
261
262 CHARACTER(LEN=default_path_length) :: file_name, project_name
263 INTEGER :: i, id_nr, im, ispin, ncol, nspin, &
264 output_unit, re, unit_nr
265 REAL(kind=dp) :: alpha, cs_pos
266 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
267 TYPE(cp_fm_type) :: mos_occ
268 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_old
269 TYPE(cp_logger_type), POINTER :: logger
270 TYPE(dbcsr_distribution_type) :: dist
271 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_rmpv, rho_new, rho_old
272 TYPE(dft_control_type), POINTER :: dft_control
273 TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
274 TYPE(mp_para_env_type), POINTER :: para_env
275 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
276 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
277 TYPE(qs_rho_type), POINTER :: rho_struct
278 TYPE(rt_prop_type), POINTER :: rtp
279 TYPE(section_vals_type), POINTER :: dft_section, input
280
281 NULLIFY (atomic_kind_set, qs_kind_set, mo_array, particle_set, rho_struct, para_env)
282
283 CALL get_qs_env(qs_env, &
284 qs_kind_set=qs_kind_set, &
285 atomic_kind_set=atomic_kind_set, &
286 particle_set=particle_set, &
287 mos=mo_array, &
288 input=input, &
289 rtp=rtp, &
290 dft_control=dft_control, &
291 rho=rho_struct, &
292 para_env=para_env)
293 logger => cp_get_default_logger()
294 output_unit = cp_logger_get_default_io_unit(logger)
295
296 IF (logger%para_env%is_source()) THEN
297 unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
298 ELSE
299 unit_nr = -1
300 END IF
301
302 id_nr = 0
303 nspin = SIZE(mo_array)
304 CALL qs_rho_get(rho_struct, rho_ao=p_rmpv)
305 dft_section => section_vals_get_subs_vals(input, "DFT")
306 SELECT CASE (dft_control%rtp_control%initial_wfn)
307 CASE (use_restart_wfn)
308 CALL read_mo_set_from_restart(mo_array, atomic_kind_set, qs_kind_set, particle_set, para_env, &
309 id_nr=id_nr, multiplicity=dft_control%multiplicity, dft_section=dft_section)
310 CALL set_uniform_occupation_mo_array(mo_array, nspin)
311
312 IF (dft_control%rtp_control%apply_wfn_mix_init_restart) &
313 CALL wfn_mix(mo_array, particle_set, dft_section, qs_kind_set, para_env, output_unit, &
314 for_rtp=.true.)
315
316 DO ispin = 1, nspin
317 CALL calculate_density_matrix(mo_array(ispin), p_rmpv(ispin)%matrix)
318 END DO
319 IF (rtp%linear_scaling) THEN
320 CALL get_rtp(rtp=rtp, rho_old=rho_old, rho_new=rho_new)
321 DO ispin = 1, nspin
322 re = 2*ispin - 1
323 im = 2*ispin
324 CALL cp_fm_get_info(mo_array(ispin)%mo_coeff, ncol_global=ncol)
325 CALL cp_fm_create(mos_occ, &
326 matrix_struct=mo_array(ispin)%mo_coeff%matrix_struct, &
327 name="mos_occ")
328 CALL cp_fm_to_fm(mo_array(ispin)%mo_coeff, mos_occ)
329 IF (mo_array(ispin)%uniform_occupation) THEN
330 alpha = 3.0_dp - real(nspin, dp)
331 CALL cp_fm_column_scale(mos_occ, mo_array(ispin)%occupation_numbers/alpha)
332 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_old(re)%matrix, &
333 matrix_v=mos_occ, &
334 ncol=ncol, &
335 alpha=alpha, keep_sparsity=.false.)
336 ELSE
337 alpha = 1.0_dp
338 CALL cp_fm_column_scale(mos_occ, mo_array(ispin)%occupation_numbers/alpha)
339 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_old(re)%matrix, &
340 matrix_v=mo_array(ispin)%mo_coeff, &
341 matrix_g=mos_occ, &
342 ncol=ncol, &
343 alpha=alpha, keep_sparsity=.false.)
344 END IF
345 CALL dbcsr_filter(rho_old(re)%matrix, rtp%filter_eps)
346 CALL dbcsr_copy(rho_new(re)%matrix, rho_old(re)%matrix)
347 CALL cp_fm_release(mos_occ)
348 END DO
349 CALL calc_update_rho_sparse(qs_env)
350 ELSE
351 CALL get_rtp(rtp=rtp, mos_old=mos_old)
352 DO i = 1, SIZE(qs_env%mos)
353 CALL cp_fm_to_fm(mo_array(i)%mo_coeff, mos_old(2*i - 1))
354 CALL cp_fm_set_all(mos_old(2*i), zero, zero)
355 END DO
356 END IF
357 CASE (use_rt_restart)
358 IF (rtp%linear_scaling) THEN
359 CALL get_rtp(rtp=rtp, rho_old=rho_old, rho_new=rho_new)
360 project_name = logger%iter_info%project_name
361 DO ispin = 1, nspin
362 re = 2*ispin - 1
363 im = 2*ispin
364 WRITE (file_name, '(A,I0,A)') trim(project_name)//"_LS_DM_SPIN_RE", ispin, "_RESTART.dm"
365 CALL dbcsr_get_info(rho_old(re)%matrix, distribution=dist)
366 CALL dbcsr_binary_read(file_name, distribution=dist, matrix_new=rho_old(re)%matrix)
367 cs_pos = dbcsr_checksum(rho_old(re)%matrix, pos=.true.)
368 IF (unit_nr > 0) THEN
369 WRITE (unit_nr, '(T2,A,E20.8)') "Read restart DM "//trim(file_name)//" with checksum: ", cs_pos
370 END IF
371 WRITE (file_name, '(A,I0,A)') trim(project_name)//"_LS_DM_SPIN_IM", ispin, "_RESTART.dm"
372 CALL dbcsr_get_info(rho_old(im)%matrix, distribution=dist)
373 CALL dbcsr_binary_read(file_name, distribution=dist, matrix_new=rho_old(im)%matrix)
374 cs_pos = dbcsr_checksum(rho_old(im)%matrix, pos=.true.)
375 IF (unit_nr > 0) THEN
376 WRITE (unit_nr, '(T2,A,E20.8)') "Read restart DM "//trim(file_name)//" with checksum: ", cs_pos
377 END IF
378 END DO
379 DO i = 1, SIZE(rho_new)
380 CALL dbcsr_copy(rho_new(i)%matrix, rho_old(i)%matrix)
381 END DO
382 CALL calc_update_rho_sparse(qs_env)
383 ELSE
384 CALL get_rtp(rtp=rtp, mos_old=mos_old)
385 CALL read_rt_mos_from_restart(mo_array, mos_old, atomic_kind_set, qs_kind_set, particle_set, para_env, &
386 id_nr, dft_control%multiplicity, dft_section)
387 CALL set_uniform_occupation_mo_array(mo_array, nspin)
388 DO ispin = 1, nspin
389 CALL calculate_density_matrix(mo_array(ispin), &
390 p_rmpv(ispin)%matrix)
391 END DO
392 END IF
393 END SELECT
394
395 END SUBROUTINE get_restart_wfn
396
397! **************************************************************************************************
398!> \brief Set mo_array(ispin)%uniform_occupation after a restart
399!> \param mo_array ...
400!> \param nspin ...
401!> \author Guillaume Le Breton (03.23)
402! **************************************************************************************************
403
404 SUBROUTINE set_uniform_occupation_mo_array(mo_array, nspin)
405
406 TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
407 INTEGER :: nspin
408
409 INTEGER :: ispin, mo
410 LOGICAL :: is_uniform
411
412 DO ispin = 1, nspin
413 is_uniform = .true.
414 DO mo = 1, mo_array(ispin)%nmo
415 IF (mo_array(ispin)%occupation_numbers(mo) /= 0.0 .AND. &
416 mo_array(ispin)%occupation_numbers(mo) /= 1.0 .AND. &
417 mo_array(ispin)%occupation_numbers(mo) /= 2.0) &
418 is_uniform = .false.
419 END DO
420 mo_array(ispin)%uniform_occupation = is_uniform
421 END DO
422
423 END SUBROUTINE set_uniform_occupation_mo_array
424
425! **************************************************************************************************
426!> \brief calculates the density from the complex MOs and passes the density to
427!> qs_env.
428!> \param qs_env ...
429!> \author Florian Schiffmann (02.09)
430! **************************************************************************************************
431
432 SUBROUTINE calc_update_rho(qs_env)
433
434 TYPE(qs_environment_type), POINTER :: qs_env
435
436 CHARACTER(len=*), PARAMETER :: routinen = 'calc_update_rho'
437 REAL(kind=dp), PARAMETER :: one = 1.0_dp, zero = 0.0_dp
438
439 INTEGER :: handle, i, im, ncol, re
440 REAL(kind=dp) :: alpha
441 TYPE(cp_fm_type) :: mos_occ
442 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new
443 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao, rho_ao_im
444 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
445 TYPE(qs_ks_env_type), POINTER :: ks_env
446 TYPE(qs_rho_type), POINTER :: rho
447 TYPE(rt_prop_type), POINTER :: rtp
448
449 CALL timeset(routinen, handle)
450
451 NULLIFY (rho, ks_env, mos_new, rtp)
452 CALL get_qs_env(qs_env, &
453 ks_env=ks_env, &
454 rho=rho, &
455 rtp=rtp, &
456 mos=mos)
457 CALL get_rtp(rtp=rtp, mos_new=mos_new)
458 CALL qs_rho_get(rho_struct=rho, rho_ao=rho_ao)
459 DO i = 1, SIZE(mos_new)/2
460 re = 2*i - 1; im = 2*i
461 CALL dbcsr_set(rho_ao(i)%matrix, zero)
462 CALL cp_fm_get_info(mos_new(re), ncol_global=ncol)
463 CALL cp_fm_create(mos_occ, &
464 matrix_struct=mos(i)%mo_coeff%matrix_struct, &
465 name="mos_occ")
466 CALL cp_fm_to_fm(mos_new(re), mos_occ)
467 IF (mos(i)%uniform_occupation) THEN
468 alpha = 3*one - real(SIZE(mos_new)/2, dp)
469 CALL cp_fm_column_scale(mos_occ, mos(i)%occupation_numbers/alpha)
470 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_ao(i)%matrix, &
471 matrix_v=mos_occ, &
472 ncol=ncol, &
473 alpha=alpha)
474 ELSE
475 alpha = 1.0_dp
476 CALL cp_fm_column_scale(mos_occ, mos(i)%occupation_numbers/alpha)
477 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_ao(i)%matrix, &
478 matrix_v=mos_new(re), &
479 matrix_g=mos_occ, &
480 ncol=ncol, &
481 alpha=alpha)
482 END IF
483
484 ! It is actually complex conjugate but i*i=-1 therefore it must be added
485 CALL cp_fm_to_fm(mos_new(im), mos_occ)
486 IF (mos(i)%uniform_occupation) THEN
487 alpha = 3*one - real(SIZE(mos_new)/2, dp)
488 CALL cp_fm_column_scale(mos_occ, mos(i)%occupation_numbers/alpha)
489 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_ao(i)%matrix, &
490 matrix_v=mos_occ, &
491 ncol=ncol, &
492 alpha=alpha)
493 ELSE
494 alpha = 1.0_dp
495 CALL cp_fm_column_scale(mos_occ, mos(i)%occupation_numbers/alpha)
496 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_ao(i)%matrix, &
497 matrix_v=mos_new(im), &
498 matrix_g=mos_occ, &
499 ncol=ncol, &
500 alpha=alpha)
501 END IF
502 CALL cp_fm_release(mos_occ)
503 END DO
504 CALL qs_rho_update_rho(rho, qs_env)
505
506 IF (rtp%track_imag_density) THEN
507 CALL qs_rho_get(rho_struct=rho, rho_ao_im=rho_ao_im)
508 CALL calculate_p_imaginary(qs_env, rtp, rho_ao_im, keep_sparsity=.true.)
509 CALL qs_rho_set(rho, rho_ao_im=rho_ao_im)
510 END IF
511
512 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
513
514 CALL timestop(handle)
515
516 END SUBROUTINE calc_update_rho
517
518! **************************************************************************************************
519!> \brief Copies the density matrix back into the qs_env%rho%rho_ao
520!> \param qs_env ...
521!> \author Samuel Andermatt (3.14)
522! **************************************************************************************************
523
524 SUBROUTINE calc_update_rho_sparse(qs_env)
525
526 TYPE(qs_environment_type), POINTER :: qs_env
527
528 CHARACTER(len=*), PARAMETER :: routinen = 'calc_update_rho_sparse'
529 REAL(kind=dp), PARAMETER :: zero = 0.0_dp
530
531 INTEGER :: handle, ispin
532 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao, rho_ao_im, rho_new
533 TYPE(dft_control_type), POINTER :: dft_control
534 TYPE(qs_ks_env_type), POINTER :: ks_env
535 TYPE(qs_rho_type), POINTER :: rho
536 TYPE(rt_prop_type), POINTER :: rtp
537 TYPE(rtp_control_type), POINTER :: rtp_control
538
539 NULLIFY (rho, ks_env, rtp, dft_control)
540 CALL timeset(routinen, handle)
541 CALL get_qs_env(qs_env, &
542 ks_env=ks_env, &
543 rho=rho, &
544 rtp=rtp, &
545 dft_control=dft_control)
546 rtp_control => dft_control%rtp_control
547 CALL get_rtp(rtp=rtp, rho_new=rho_new)
548 CALL qs_rho_get(rho_struct=rho, rho_ao=rho_ao)
549 IF (rtp%track_imag_density) CALL qs_rho_get(rho_struct=rho, rho_ao_im=rho_ao_im)
550 DO ispin = 1, SIZE(rho_ao)
551 CALL dbcsr_set(rho_ao(ispin)%matrix, zero)
552 CALL dbcsr_copy(rho_ao(ispin)%matrix, rho_new(ispin*2 - 1)%matrix, keep_sparsity=.true.)
553 IF (rtp%track_imag_density) THEN
554 CALL dbcsr_copy(rho_ao_im(ispin)%matrix, rho_new(ispin*2)%matrix, keep_sparsity=.true.)
555 END IF
556 END DO
557
558 CALL qs_rho_update_rho(rho, qs_env)
559 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
560
561 CALL timestop(handle)
562
563 END SUBROUTINE calc_update_rho_sparse
564
565! **************************************************************************************************
566!> \brief ...
567!> \param qs_env ...
568!> \param rtp ...
569!> \param matrix_p_im ...
570!> \param keep_sparsity ...
571! **************************************************************************************************
572 SUBROUTINE calculate_p_imaginary(qs_env, rtp, matrix_p_im, keep_sparsity)
573 TYPE(qs_environment_type), POINTER :: qs_env
574 TYPE(rt_prop_type), POINTER :: rtp
575 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p_im
576 LOGICAL, OPTIONAL :: keep_sparsity
577
578 INTEGER :: i, im, ncol, re
579 LOGICAL :: my_keep_sparsity
580 REAL(kind=dp) :: alpha
581 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new, mos_occ
582 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
583
584 CALL get_rtp(rtp=rtp, mos_new=mos_new)
585
586 my_keep_sparsity = .false.
587 IF (PRESENT(keep_sparsity)) my_keep_sparsity = keep_sparsity
588 CALL get_qs_env(qs_env, mos=mos)
589 ALLOCATE (mos_occ(SIZE(mos)*2))
590
591 DO i = 1, SIZE(mos_new)/2
592 re = 2*i - 1; im = 2*i
593 alpha = 3.0_dp - real(SIZE(matrix_p_im), dp)
594 CALL cp_fm_create(mos_occ(re), &
595 matrix_struct=mos(i)%mo_coeff%matrix_struct, &
596 name="mos_occ")
597 CALL cp_fm_create(mos_occ(im), &
598 matrix_struct=mos(i)%mo_coeff%matrix_struct, &
599 name="mos_occ")
600 CALL dbcsr_set(matrix_p_im(i)%matrix, 0.0_dp)
601 CALL cp_fm_get_info(mos_new(re), ncol_global=ncol)
602 CALL cp_fm_to_fm(mos_new(re), mos_occ(re))
603 CALL cp_fm_column_scale(mos_occ(re), mos(i)%occupation_numbers/alpha)
604 CALL cp_fm_to_fm(mos_new(im), mos_occ(im))
605 CALL cp_fm_column_scale(mos_occ(im), mos(i)%occupation_numbers/alpha)
606 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=matrix_p_im(i)%matrix, &
607 matrix_v=mos_occ(im), &
608 matrix_g=mos_occ(re), &
609 ncol=ncol, &
610 keep_sparsity=my_keep_sparsity, &
611 alpha=2.0_dp*alpha, &
612 symmetry_mode=-1)
613 END DO
614 CALL cp_fm_release(mos_occ)
615
616 END SUBROUTINE calculate_p_imaginary
617
618! **************************************************************************************************
619!> \brief ...
620!> \param qs_env ...
621!> \param rtp ...
622! **************************************************************************************************
623 SUBROUTINE write_rtp_mos_to_output_unit(qs_env, rtp)
624 TYPE(qs_environment_type), POINTER :: qs_env
625 TYPE(rt_prop_type), POINTER :: rtp
626
627 CHARACTER(len=*), PARAMETER :: routinen = 'write_rtp_mos_to_output_unit'
628
629 CHARACTER(LEN=10) :: spin
630 CHARACTER(LEN=2*default_string_length) :: name
631 INTEGER :: handle, i, ispin, nao, nelectron, nmo, &
632 nspins
633 LOGICAL :: print_eigvecs, print_mo_info
634 REAL(kind=dp) :: flexible_electron_count, maxocc, n_el_f
635 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
636 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new
637 TYPE(cp_logger_type), POINTER :: logger
638 TYPE(mo_set_type) :: mo_set_rtp
639 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
640 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
641 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
642 TYPE(section_vals_type), POINTER :: dft_section, input
643
644 NULLIFY (atomic_kind_set, particle_set, qs_kind_set, input, mos, dft_section)
645
646 CALL timeset(routinen, handle)
647
648 CALL get_qs_env(qs_env, &
649 atomic_kind_set=atomic_kind_set, &
650 qs_kind_set=qs_kind_set, &
651 particle_set=particle_set, &
652 input=input, &
653 mos=mos)
654 ! Quick return, if no printout of MO information is requested
655 dft_section => section_vals_get_subs_vals(input, "DFT")
656 CALL section_vals_val_get(dft_section, "PRINT%MO%EIGENVECTORS", l_val=print_eigvecs)
657
658 NULLIFY (logger)
659 logger => cp_get_default_logger()
660 print_mo_info = (cp_print_key_should_output(logger%iter_info, &
661 dft_section, "PRINT%MO") /= 0) .OR. &
662 (qs_env%sim_step == 1)
663
664 IF ((.NOT. print_mo_info) .OR. (.NOT. print_eigvecs)) THEN
665 CALL timestop(handle)
666 RETURN
667 END IF
668
669 CALL get_rtp(rtp=rtp, mos_new=mos_new)
670
671 nspins = SIZE(mos_new)/2
672
673 DO ispin = 1, nspins
674 ! initiate mo_set
675 CALL get_mo_set(mo_set=mos(ispin), nao=nao, nmo=nmo, nelectron=nelectron, &
676 n_el_f=n_el_f, maxocc=maxocc, flexible_electron_count=flexible_electron_count)
677
678 CALL allocate_mo_set(mo_set_rtp, &
679 nao=nao, &
680 nmo=nmo, &
681 nelectron=nelectron, &
682 n_el_f=n_el_f, &
683 maxocc=maxocc, &
684 flexible_electron_count=flexible_electron_count)
685
686 WRITE (name, fmt="(A,I6)") "RTP MO SET, SPIN ", ispin
687 CALL init_mo_set(mo_set_rtp, fm_ref=mos_new(2*ispin - 1), name=name)
688
689 IF (nspins > 1) THEN
690 IF (ispin == 1) THEN
691 spin = "ALPHA SPIN"
692 ELSE
693 spin = "BETA SPIN"
694 END IF
695 ELSE
696 spin = ""
697 END IF
698
699 mo_set_rtp%occupation_numbers = mos(ispin)%occupation_numbers
700
701 !loop for real (odd) and imaginary (even) parts
702 DO i = 1, 0, -1
703 CALL cp_fm_to_fm(mos_new(2*ispin - i), mo_set_rtp%mo_coeff)
704 CALL write_mo_set_to_output_unit(mo_set_rtp, atomic_kind_set, qs_kind_set, particle_set, &
705 dft_section, 4, 0, rtp=.true., spin=trim(spin), cpart=mod(i, 2), sim_step=qs_env%sim_step)
706 END DO
707
708 CALL deallocate_mo_set(mo_set_rtp)
709 END DO
710
711 CALL timestop(handle)
712
713 END SUBROUTINE write_rtp_mos_to_output_unit
714
715! **************************************************************************************************
716!> \brief Write the time dependent amplitude of the MOs in real grid.
717!> Very close to qs_scf_post_gpw/qs_scf_post_occ_cubes subroutine.
718!> \param qs_env ...
719!> \param rtp ...
720!> \author Guillaume Le Breton (11.22)
721! **************************************************************************************************
722 SUBROUTINE write_rtp_mo_cubes(qs_env, rtp)
723 TYPE(qs_environment_type), POINTER :: qs_env
724 TYPE(rt_prop_type), POINTER :: rtp
725
726 CHARACTER(LEN=*), PARAMETER :: routinen = 'write_rtp_mo_cubes'
727
728 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
729 INTEGER :: handle, homo, i, ir, ispin, ivector, &
730 n_rep, nhomo, nlist, nspins, &
731 rt_time_step, unit_nr
732 INTEGER, DIMENSION(:), POINTER :: list, list_index
733 LOGICAL :: append_cube, do_kpoints, mpi_io
734 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
735 TYPE(cell_type), POINTER :: cell
736 TYPE(cp_blacs_env_type), POINTER :: blacs_env
737 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new
738 TYPE(cp_fm_type), POINTER :: mo_coeff
739 TYPE(cp_logger_type), POINTER :: logger
740 TYPE(dft_control_type), POINTER :: dft_control
741 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
742 TYPE(mp_para_env_type), POINTER :: para_env
743 TYPE(particle_list_type), POINTER :: particles
744 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
745 TYPE(pw_c1d_gs_type) :: wf_g
746 TYPE(pw_env_type), POINTER :: pw_env
747 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
748 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
749 TYPE(pw_r3d_rs_type) :: density_r, wf_r
750 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
751 TYPE(qs_subsys_type), POINTER :: subsys
752 TYPE(section_vals_type), POINTER :: dft_section, input
753
754 CALL timeset(routinen, handle)
755
756 NULLIFY (logger, auxbas_pw_pool, pw_pools, pw_env)
757
758 ! Get all the info from qs:
759 CALL get_qs_env(qs_env, do_kpoints=do_kpoints, &
760 input=input)
761
762 ! Kill the run in the case of K points
763 IF (do_kpoints) THEN
764 cpabort("K points not handled yet for printing MO_CUBE")
765 END IF
766
767 dft_section => section_vals_get_subs_vals(input, "DFT")
768 logger => cp_get_default_logger()
769
770 ! Quick return if no print required
771 IF (.NOT. btest(cp_print_key_should_output(logger%iter_info, dft_section, &
772 "PRINT%MO_CUBES"), cp_p_file)) THEN
773 CALL timestop(handle)
774 RETURN
775 END IF
776
777 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, &
778 mos=mos, &
779 blacs_env=blacs_env, &
780 qs_kind_set=qs_kind_set, &
781 pw_env=pw_env, &
782 subsys=subsys, &
783 para_env=para_env, &
784 particle_set=particle_set, &
785 dft_control=dft_control)
786 CALL qs_subsys_get(subsys, particles=particles)
787
788 nspins = dft_control%nspins
789 rt_time_step = qs_env%sim_step
790
791 ! Setup the grids needed to compute a wavefunction given a vector
792 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
793 pw_pools=pw_pools)
794 CALL auxbas_pw_pool%create_pw(wf_r)
795 CALL auxbas_pw_pool%create_pw(wf_g)
796 CALL auxbas_pw_pool%create_pw(density_r)
797 CALL get_rtp(rtp=rtp, mos_new=mos_new)
798
799 DO ispin = 1, nspins
800 CALL get_mo_set(mo_set=mos(ispin), homo=homo)
801
802 nhomo = section_get_ival(dft_section, "PRINT%MO_CUBES%NHOMO")
803 append_cube = section_get_lval(dft_section, "PRINT%MO_CUBES%APPEND")
804 my_pos_cube = "REWIND"
805 IF (append_cube) THEN
806 my_pos_cube = "APPEND"
807 END IF
808 CALL section_vals_val_get(dft_section, "PRINT%MO_CUBES%HOMO_LIST", n_rep_val=n_rep)
809 IF (n_rep > 0) THEN ! write the cubes of the list
810 nlist = 0
811 DO ir = 1, n_rep
812 NULLIFY (list)
813 CALL section_vals_val_get(dft_section, "PRINT%MO_CUBES%HOMO_LIST", i_rep_val=ir, &
814 i_vals=list)
815 IF (ASSOCIATED(list)) THEN
816 CALL reallocate(list_index, 1, nlist + SIZE(list))
817 DO i = 1, SIZE(list)
818 list_index(i + nlist) = list(i)
819 END DO
820 nlist = nlist + SIZE(list)
821 END IF
822 END DO
823 ELSE
824
825 IF (nhomo == -1) nhomo = homo
826 nlist = homo - max(1, homo - nhomo + 1) + 1
827 ALLOCATE (list_index(nlist))
828 DO i = 1, nlist
829 list_index(i) = max(1, homo - nhomo + 1) + i - 1
830 END DO
831 END IF
832 DO i = 1, nlist
833 ivector = list_index(i)
834 CALL get_qs_env(qs_env=qs_env, &
835 atomic_kind_set=atomic_kind_set, &
836 qs_kind_set=qs_kind_set, &
837 cell=cell, &
838 particle_set=particle_set, &
839 pw_env=pw_env)
840
841 ! density_r contains the density of the MOs
842 CALL pw_zero(density_r)
843 mo_coeff => mos_new(2*ispin - 1)!Real coeff
844 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
845 cell, dft_control, particle_set, pw_env)
846 ! Adding the real part
847 CALL pw_multiply(density_r, wf_r, wf_r, 1.0_dp)
848
849 mo_coeff => mos_new(2*ispin) !Im coeff
850 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
851 cell, dft_control, particle_set, pw_env)
852 ! Adding the im part
853 CALL pw_multiply(density_r, wf_r, wf_r, 1.0_dp)
854
855 WRITE (filename, '(a4,I5.5,a1,I1.1)') "WFN_", ivector, "_", ispin
856 mpi_io = .true.
857 unit_nr = cp_print_key_unit_nr(logger, input, "DFT%PRINT%MO_CUBES", extension=".cube", &
858 middle_name=trim(filename), file_position=my_pos_cube, log_filename=.false., &
859 mpi_io=mpi_io)
860 WRITE (title, *) "DENSITY ", ivector, " spin ", ispin, " i.e. HOMO - ", ivector - homo
861 CALL cp_pw_to_cube(density_r, unit_nr, title, particles=particles, &
862 stride=section_get_ivals(dft_section, "PRINT%MO_CUBES%STRIDE"), mpi_io=mpi_io)
863 CALL cp_print_key_finished_output(unit_nr, logger, input, "DFT%PRINT%MO_CUBES", mpi_io=mpi_io)
864 END DO
865 IF (ASSOCIATED(list_index)) DEALLOCATE (list_index)
866 END DO
867
868 ! Deallocate grids needed to compute wavefunctions
869 CALL auxbas_pw_pool%give_back_pw(wf_r)
870 CALL auxbas_pw_pool%give_back_pw(wf_g)
871 CALL auxbas_pw_pool%give_back_pw(density_r)
872
873 CALL timestop(handle)
874
875 END SUBROUTINE write_rtp_mo_cubes
876
877! **************************************************************************************************
878!> \brief Warn about unused sections of the print section - only implemented for some of the methods
879!> \param section Parent section
880!> \param subsection_name Name of the subsection which is not used even when explicitly included
881!> \param error_message Message to display as warning
882!> \author Stepan Marek (01.25)
883! **************************************************************************************************
884 SUBROUTINE warn_section_unused(section, subsection_name, error_message)
885 TYPE(section_vals_type), POINTER :: section
886 CHARACTER(len=*) :: subsection_name, error_message
887
888 LOGICAL :: explicit
889 TYPE(section_vals_type), POINTER :: target_section
890
891 target_section => section_vals_get_subs_vals(section, subsection_name)
892 CALL section_vals_get(target_section, explicit=explicit)
893 IF (explicit) cpwarn(error_message)
894 END SUBROUTINE
895
896END 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)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
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_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,...
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, use_sp)
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)
...
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, stride, zero_tails, silent, mpi_io)
...
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.
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, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
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_rt_mos_from_restart(mo_array, rt_mos, atomic_kind_set, qs_kind_set, particle_set, para_env, id_nr, multiplicity, dft_section)
...
Definition qs_mo_io.F:591
subroutine, public write_mo_set_to_output_unit(mo_set, atomic_kind_set, qs_kind_set, particle_set, dft_section, before, kpoint, final_mos, spin, solver_method, rtp, cpart, sim_step, umo_set)
Write MO information to output file (eigenvalues, occupation numbers, coefficients)
Definition qs_mo_io.F:995
subroutine, public read_mo_set_from_restart(mo_array, atomic_kind_set, qs_kind_set, particle_set, para_env, id_nr, multiplicity, dft_section, natom_mismatch, cdft, out_unit)
...
Definition qs_mo_io.F:495
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
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.
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
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)
Calculation of the overlap matrix over Cartesian Gaussian functions.
Definition qs_overlap.F:120
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 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 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:55
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.