(git:15c1bfc)
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, qs_kind_set, particle_set, para_env, &
309 id_nr=id_nr, multiplicity=dft_control%multiplicity, &
310 dft_section=dft_section)
311 CALL set_uniform_occupation_mo_array(mo_array, nspin)
312
313 IF (dft_control%rtp_control%apply_wfn_mix_init_restart) &
314 CALL wfn_mix(mo_array, particle_set, dft_section, qs_kind_set, para_env, output_unit, &
315 for_rtp=.true.)
316
317 DO ispin = 1, nspin
318 CALL calculate_density_matrix(mo_array(ispin), p_rmpv(ispin)%matrix)
319 END DO
320 IF (rtp%linear_scaling) THEN
321 CALL get_rtp(rtp=rtp, rho_old=rho_old, rho_new=rho_new)
322 DO ispin = 1, nspin
323 re = 2*ispin - 1
324 im = 2*ispin
325 CALL cp_fm_get_info(mo_array(ispin)%mo_coeff, ncol_global=ncol)
326 CALL cp_fm_create(mos_occ, &
327 matrix_struct=mo_array(ispin)%mo_coeff%matrix_struct, &
328 name="mos_occ")
329 CALL cp_fm_to_fm(mo_array(ispin)%mo_coeff, mos_occ)
330 IF (mo_array(ispin)%uniform_occupation) THEN
331 alpha = 3.0_dp - real(nspin, dp)
332 CALL cp_fm_column_scale(mos_occ, mo_array(ispin)%occupation_numbers/alpha)
333 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_old(re)%matrix, &
334 matrix_v=mos_occ, &
335 ncol=ncol, &
336 alpha=alpha, keep_sparsity=.false.)
337 ELSE
338 alpha = 1.0_dp
339 CALL cp_fm_column_scale(mos_occ, mo_array(ispin)%occupation_numbers/alpha)
340 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_old(re)%matrix, &
341 matrix_v=mo_array(ispin)%mo_coeff, &
342 matrix_g=mos_occ, &
343 ncol=ncol, &
344 alpha=alpha, keep_sparsity=.false.)
345 END IF
346 CALL dbcsr_filter(rho_old(re)%matrix, rtp%filter_eps)
347 CALL dbcsr_copy(rho_new(re)%matrix, rho_old(re)%matrix)
348 CALL cp_fm_release(mos_occ)
349 END DO
350 CALL calc_update_rho_sparse(qs_env)
351 ELSE
352 CALL get_rtp(rtp=rtp, mos_old=mos_old)
353 DO i = 1, SIZE(qs_env%mos)
354 CALL cp_fm_to_fm(mo_array(i)%mo_coeff, mos_old(2*i - 1))
355 CALL cp_fm_set_all(mos_old(2*i), zero, zero)
356 END DO
357 END IF
358 CASE (use_rt_restart)
359 IF (rtp%linear_scaling) THEN
360 CALL get_rtp(rtp=rtp, rho_old=rho_old, rho_new=rho_new)
361 project_name = logger%iter_info%project_name
362 DO ispin = 1, nspin
363 re = 2*ispin - 1
364 im = 2*ispin
365 WRITE (file_name, '(A,I0,A)') trim(project_name)//"_LS_DM_SPIN_RE", ispin, "_RESTART.dm"
366 CALL dbcsr_get_info(rho_old(re)%matrix, distribution=dist)
367 CALL dbcsr_binary_read(file_name, distribution=dist, matrix_new=rho_old(re)%matrix)
368 cs_pos = dbcsr_checksum(rho_old(re)%matrix, pos=.true.)
369 IF (unit_nr > 0) THEN
370 WRITE (unit_nr, '(T2,A,E20.8)') "Read restart DM "//trim(file_name)//" with checksum: ", cs_pos
371 END IF
372 WRITE (file_name, '(A,I0,A)') trim(project_name)//"_LS_DM_SPIN_IM", ispin, "_RESTART.dm"
373 CALL dbcsr_get_info(rho_old(im)%matrix, distribution=dist)
374 CALL dbcsr_binary_read(file_name, distribution=dist, matrix_new=rho_old(im)%matrix)
375 cs_pos = dbcsr_checksum(rho_old(im)%matrix, pos=.true.)
376 IF (unit_nr > 0) THEN
377 WRITE (unit_nr, '(T2,A,E20.8)') "Read restart DM "//trim(file_name)//" with checksum: ", cs_pos
378 END IF
379 END DO
380 DO i = 1, SIZE(rho_new)
381 CALL dbcsr_copy(rho_new(i)%matrix, rho_old(i)%matrix)
382 END DO
383 CALL calc_update_rho_sparse(qs_env)
384 ELSE
385 CALL get_rtp(rtp=rtp, mos_old=mos_old)
386 CALL read_rt_mos_from_restart(mo_array, mos_old, qs_kind_set, particle_set, para_env, &
387 id_nr, dft_control%multiplicity, dft_section)
388 CALL set_uniform_occupation_mo_array(mo_array, nspin)
389 DO ispin = 1, nspin
390 CALL calculate_density_matrix(mo_array(ispin), &
391 p_rmpv(ispin)%matrix)
392 END DO
393 END IF
394 END SELECT
395
396 END SUBROUTINE get_restart_wfn
397
398! **************************************************************************************************
399!> \brief Set mo_array(ispin)%uniform_occupation after a restart
400!> \param mo_array ...
401!> \param nspin ...
402!> \author Guillaume Le Breton (03.23)
403! **************************************************************************************************
404
405 SUBROUTINE set_uniform_occupation_mo_array(mo_array, nspin)
406
407 TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
408 INTEGER :: nspin
409
410 INTEGER :: ispin, mo
411 LOGICAL :: is_uniform
412
413 DO ispin = 1, nspin
414 is_uniform = .true.
415 DO mo = 1, mo_array(ispin)%nmo
416 IF (mo_array(ispin)%occupation_numbers(mo) /= 0.0 .AND. &
417 mo_array(ispin)%occupation_numbers(mo) /= 1.0 .AND. &
418 mo_array(ispin)%occupation_numbers(mo) /= 2.0) &
419 is_uniform = .false.
420 END DO
421 mo_array(ispin)%uniform_occupation = is_uniform
422 END DO
423
424 END SUBROUTINE set_uniform_occupation_mo_array
425
426! **************************************************************************************************
427!> \brief calculates the density from the complex MOs and passes the density to
428!> qs_env.
429!> \param qs_env ...
430!> \author Florian Schiffmann (02.09)
431! **************************************************************************************************
432
433 SUBROUTINE calc_update_rho(qs_env)
434
435 TYPE(qs_environment_type), POINTER :: qs_env
436
437 CHARACTER(len=*), PARAMETER :: routinen = 'calc_update_rho'
438 REAL(kind=dp), PARAMETER :: one = 1.0_dp, zero = 0.0_dp
439
440 INTEGER :: handle, i, im, ncol, re
441 REAL(kind=dp) :: alpha
442 TYPE(cp_fm_type) :: mos_occ
443 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new
444 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao, rho_ao_im
445 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
446 TYPE(qs_ks_env_type), POINTER :: ks_env
447 TYPE(qs_rho_type), POINTER :: rho
448 TYPE(rt_prop_type), POINTER :: rtp
449
450 CALL timeset(routinen, handle)
451
452 NULLIFY (rho, ks_env, mos_new, rtp)
453 CALL get_qs_env(qs_env, &
454 ks_env=ks_env, &
455 rho=rho, &
456 rtp=rtp, &
457 mos=mos)
458 CALL get_rtp(rtp=rtp, mos_new=mos_new)
459 CALL qs_rho_get(rho_struct=rho, rho_ao=rho_ao)
460 DO i = 1, SIZE(mos_new)/2
461 re = 2*i - 1; im = 2*i
462 CALL dbcsr_set(rho_ao(i)%matrix, zero)
463 CALL cp_fm_get_info(mos_new(re), ncol_global=ncol)
464 CALL cp_fm_create(mos_occ, &
465 matrix_struct=mos(i)%mo_coeff%matrix_struct, &
466 name="mos_occ")
467 CALL cp_fm_to_fm(mos_new(re), mos_occ)
468 IF (mos(i)%uniform_occupation) THEN
469 alpha = 3*one - real(SIZE(mos_new)/2, dp)
470 CALL cp_fm_column_scale(mos_occ, mos(i)%occupation_numbers/alpha)
471 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_ao(i)%matrix, &
472 matrix_v=mos_occ, &
473 ncol=ncol, &
474 alpha=alpha)
475 ELSE
476 alpha = 1.0_dp
477 CALL cp_fm_column_scale(mos_occ, mos(i)%occupation_numbers/alpha)
478 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_ao(i)%matrix, &
479 matrix_v=mos_new(re), &
480 matrix_g=mos_occ, &
481 ncol=ncol, &
482 alpha=alpha)
483 END IF
484
485 ! It is actually complex conjugate but i*i=-1 therefore it must be added
486 CALL cp_fm_to_fm(mos_new(im), mos_occ)
487 IF (mos(i)%uniform_occupation) THEN
488 alpha = 3*one - real(SIZE(mos_new)/2, dp)
489 CALL cp_fm_column_scale(mos_occ, mos(i)%occupation_numbers/alpha)
490 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_ao(i)%matrix, &
491 matrix_v=mos_occ, &
492 ncol=ncol, &
493 alpha=alpha)
494 ELSE
495 alpha = 1.0_dp
496 CALL cp_fm_column_scale(mos_occ, mos(i)%occupation_numbers/alpha)
497 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=rho_ao(i)%matrix, &
498 matrix_v=mos_new(im), &
499 matrix_g=mos_occ, &
500 ncol=ncol, &
501 alpha=alpha)
502 END IF
503 CALL cp_fm_release(mos_occ)
504 END DO
505 CALL qs_rho_update_rho(rho, qs_env)
506
507 IF (rtp%track_imag_density) THEN
508 CALL qs_rho_get(rho_struct=rho, rho_ao_im=rho_ao_im)
509 CALL calculate_p_imaginary(qs_env, rtp, rho_ao_im, keep_sparsity=.true.)
510 CALL qs_rho_set(rho, rho_ao_im=rho_ao_im)
511 END IF
512
513 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
514
515 CALL timestop(handle)
516
517 END SUBROUTINE calc_update_rho
518
519! **************************************************************************************************
520!> \brief Copies the density matrix back into the qs_env%rho%rho_ao
521!> \param qs_env ...
522!> \author Samuel Andermatt (3.14)
523! **************************************************************************************************
524
525 SUBROUTINE calc_update_rho_sparse(qs_env)
526
527 TYPE(qs_environment_type), POINTER :: qs_env
528
529 CHARACTER(len=*), PARAMETER :: routinen = 'calc_update_rho_sparse'
530 REAL(kind=dp), PARAMETER :: zero = 0.0_dp
531
532 INTEGER :: handle, ispin
533 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao, rho_ao_im, rho_new
534 TYPE(dft_control_type), POINTER :: dft_control
535 TYPE(qs_ks_env_type), POINTER :: ks_env
536 TYPE(qs_rho_type), POINTER :: rho
537 TYPE(rt_prop_type), POINTER :: rtp
538 TYPE(rtp_control_type), POINTER :: rtp_control
539
540 NULLIFY (rho, ks_env, rtp, dft_control)
541 CALL timeset(routinen, handle)
542 CALL get_qs_env(qs_env, &
543 ks_env=ks_env, &
544 rho=rho, &
545 rtp=rtp, &
546 dft_control=dft_control)
547 rtp_control => dft_control%rtp_control
548 CALL get_rtp(rtp=rtp, rho_new=rho_new)
549 CALL qs_rho_get(rho_struct=rho, rho_ao=rho_ao)
550 IF (rtp%track_imag_density) CALL qs_rho_get(rho_struct=rho, rho_ao_im=rho_ao_im)
551 DO ispin = 1, SIZE(rho_ao)
552 CALL dbcsr_set(rho_ao(ispin)%matrix, zero)
553 CALL dbcsr_copy(rho_ao(ispin)%matrix, rho_new(ispin*2 - 1)%matrix, keep_sparsity=.true.)
554 IF (rtp%track_imag_density) THEN
555 CALL dbcsr_copy(rho_ao_im(ispin)%matrix, rho_new(ispin*2)%matrix, keep_sparsity=.true.)
556 END IF
557 END DO
558
559 CALL qs_rho_update_rho(rho, qs_env)
560 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
561
562 CALL timestop(handle)
563
564 END SUBROUTINE calc_update_rho_sparse
565
566! **************************************************************************************************
567!> \brief ...
568!> \param qs_env ...
569!> \param rtp ...
570!> \param matrix_p_im ...
571!> \param keep_sparsity ...
572! **************************************************************************************************
573 SUBROUTINE calculate_p_imaginary(qs_env, rtp, matrix_p_im, keep_sparsity)
574 TYPE(qs_environment_type), POINTER :: qs_env
575 TYPE(rt_prop_type), POINTER :: rtp
576 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p_im
577 LOGICAL, OPTIONAL :: keep_sparsity
578
579 INTEGER :: i, im, ncol, re
580 LOGICAL :: my_keep_sparsity
581 REAL(kind=dp) :: alpha
582 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new, mos_occ
583 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
584
585 CALL get_rtp(rtp=rtp, mos_new=mos_new)
586
587 my_keep_sparsity = .false.
588 IF (PRESENT(keep_sparsity)) my_keep_sparsity = keep_sparsity
589 CALL get_qs_env(qs_env, mos=mos)
590 ALLOCATE (mos_occ(SIZE(mos)*2))
591
592 DO i = 1, SIZE(mos_new)/2
593 re = 2*i - 1; im = 2*i
594 alpha = 3.0_dp - real(SIZE(matrix_p_im), dp)
595 CALL cp_fm_create(mos_occ(re), &
596 matrix_struct=mos(i)%mo_coeff%matrix_struct, &
597 name="mos_occ")
598 CALL cp_fm_create(mos_occ(im), &
599 matrix_struct=mos(i)%mo_coeff%matrix_struct, &
600 name="mos_occ")
601 CALL dbcsr_set(matrix_p_im(i)%matrix, 0.0_dp)
602 CALL cp_fm_get_info(mos_new(re), ncol_global=ncol)
603 CALL cp_fm_to_fm(mos_new(re), mos_occ(re))
604 CALL cp_fm_column_scale(mos_occ(re), mos(i)%occupation_numbers/alpha)
605 CALL cp_fm_to_fm(mos_new(im), mos_occ(im))
606 CALL cp_fm_column_scale(mos_occ(im), mos(i)%occupation_numbers/alpha)
607 CALL cp_dbcsr_plus_fm_fm_t(sparse_matrix=matrix_p_im(i)%matrix, &
608 matrix_v=mos_occ(im), &
609 matrix_g=mos_occ(re), &
610 ncol=ncol, &
611 keep_sparsity=my_keep_sparsity, &
612 alpha=2.0_dp*alpha, &
613 symmetry_mode=-1)
614 END DO
615 CALL cp_fm_release(mos_occ)
616
617 END SUBROUTINE calculate_p_imaginary
618
619! **************************************************************************************************
620!> \brief ...
621!> \param qs_env ...
622!> \param rtp ...
623! **************************************************************************************************
624 SUBROUTINE write_rtp_mos_to_output_unit(qs_env, rtp)
625 TYPE(qs_environment_type), POINTER :: qs_env
626 TYPE(rt_prop_type), POINTER :: rtp
627
628 CHARACTER(len=*), PARAMETER :: routinen = 'write_rtp_mos_to_output_unit'
629
630 CHARACTER(LEN=10) :: spin
631 CHARACTER(LEN=2*default_string_length) :: name
632 INTEGER :: handle, i, ispin, nao, nelectron, nmo, &
633 nspins
634 LOGICAL :: print_eigvecs, print_mo_info
635 REAL(kind=dp) :: flexible_electron_count, maxocc, n_el_f
636 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
637 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new
638 TYPE(cp_logger_type), POINTER :: logger
639 TYPE(mo_set_type) :: mo_set_rtp
640 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
641 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
642 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
643 TYPE(section_vals_type), POINTER :: dft_section, input
644
645 NULLIFY (atomic_kind_set, particle_set, qs_kind_set, input, mos, dft_section)
646
647 CALL timeset(routinen, handle)
648
649 CALL get_qs_env(qs_env, &
650 atomic_kind_set=atomic_kind_set, &
651 qs_kind_set=qs_kind_set, &
652 particle_set=particle_set, &
653 input=input, &
654 mos=mos)
655 ! Quick return, if no printout of MO information is requested
656 dft_section => section_vals_get_subs_vals(input, "DFT")
657 CALL section_vals_val_get(dft_section, "PRINT%MO%EIGENVECTORS", l_val=print_eigvecs)
658
659 NULLIFY (logger)
660 logger => cp_get_default_logger()
661 print_mo_info = (cp_print_key_should_output(logger%iter_info, &
662 dft_section, "PRINT%MO") /= 0) .OR. &
663 (qs_env%sim_step == 1)
664
665 IF ((.NOT. print_mo_info) .OR. (.NOT. print_eigvecs)) THEN
666 CALL timestop(handle)
667 RETURN
668 END IF
669
670 CALL get_rtp(rtp=rtp, mos_new=mos_new)
671
672 nspins = SIZE(mos_new)/2
673
674 DO ispin = 1, nspins
675 ! initiate mo_set
676 CALL get_mo_set(mo_set=mos(ispin), nao=nao, nmo=nmo, nelectron=nelectron, &
677 n_el_f=n_el_f, maxocc=maxocc, flexible_electron_count=flexible_electron_count)
678
679 CALL allocate_mo_set(mo_set_rtp, &
680 nao=nao, &
681 nmo=nmo, &
682 nelectron=nelectron, &
683 n_el_f=n_el_f, &
684 maxocc=maxocc, &
685 flexible_electron_count=flexible_electron_count)
686
687 WRITE (name, fmt="(A,I6)") "RTP MO SET, SPIN ", ispin
688 CALL init_mo_set(mo_set_rtp, fm_ref=mos_new(2*ispin - 1), name=name)
689
690 IF (nspins > 1) THEN
691 IF (ispin == 1) THEN
692 spin = "ALPHA SPIN"
693 ELSE
694 spin = "BETA SPIN"
695 END IF
696 ELSE
697 spin = ""
698 END IF
699
700 mo_set_rtp%occupation_numbers = mos(ispin)%occupation_numbers
701
702 !loop for real (odd) and imaginary (even) parts
703 DO i = 1, 0, -1
704 CALL cp_fm_to_fm(mos_new(2*ispin - i), mo_set_rtp%mo_coeff)
705 CALL write_mo_set_to_output_unit(mo_set_rtp, qs_kind_set, particle_set, &
706 dft_section, 4, 0, rtp=.true., spin=trim(spin), &
707 cpart=mod(i, 2), sim_step=qs_env%sim_step)
708 END DO
709
710 CALL deallocate_mo_set(mo_set_rtp)
711 END DO
712
713 CALL timestop(handle)
714
715 END SUBROUTINE write_rtp_mos_to_output_unit
716
717! **************************************************************************************************
718!> \brief Write the time dependent amplitude of the MOs in real grid.
719!> Very close to qs_scf_post_gpw/qs_scf_post_occ_cubes subroutine.
720!> \param qs_env ...
721!> \param rtp ...
722!> \author Guillaume Le Breton (11.22)
723! **************************************************************************************************
724 SUBROUTINE write_rtp_mo_cubes(qs_env, rtp)
725 TYPE(qs_environment_type), POINTER :: qs_env
726 TYPE(rt_prop_type), POINTER :: rtp
727
728 CHARACTER(LEN=*), PARAMETER :: routinen = 'write_rtp_mo_cubes'
729
730 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
731 INTEGER :: handle, homo, i, ir, ispin, ivector, &
732 n_rep, nhomo, nlist, nspins, &
733 rt_time_step, unit_nr
734 INTEGER, DIMENSION(:), POINTER :: list, list_index
735 LOGICAL :: append_cube, do_kpoints, mpi_io
736 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
737 TYPE(cell_type), POINTER :: cell
738 TYPE(cp_blacs_env_type), POINTER :: blacs_env
739 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new
740 TYPE(cp_fm_type), POINTER :: mo_coeff
741 TYPE(cp_logger_type), POINTER :: logger
742 TYPE(dft_control_type), POINTER :: dft_control
743 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
744 TYPE(mp_para_env_type), POINTER :: para_env
745 TYPE(particle_list_type), POINTER :: particles
746 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
747 TYPE(pw_c1d_gs_type) :: wf_g
748 TYPE(pw_env_type), POINTER :: pw_env
749 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
750 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
751 TYPE(pw_r3d_rs_type) :: density_r, wf_r
752 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
753 TYPE(qs_subsys_type), POINTER :: subsys
754 TYPE(section_vals_type), POINTER :: dft_section, input
755
756 CALL timeset(routinen, handle)
757
758 NULLIFY (logger, auxbas_pw_pool, pw_pools, pw_env)
759
760 ! Get all the info from qs:
761 CALL get_qs_env(qs_env, do_kpoints=do_kpoints, &
762 input=input)
763
764 ! Kill the run in the case of K points
765 IF (do_kpoints) THEN
766 cpabort("K points not handled yet for printing MO_CUBE")
767 END IF
768
769 dft_section => section_vals_get_subs_vals(input, "DFT")
770 logger => cp_get_default_logger()
771
772 ! Quick return if no print required
773 IF (.NOT. btest(cp_print_key_should_output(logger%iter_info, dft_section, &
774 "PRINT%MO_CUBES"), cp_p_file)) THEN
775 CALL timestop(handle)
776 RETURN
777 END IF
778
779 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, &
780 mos=mos, &
781 blacs_env=blacs_env, &
782 qs_kind_set=qs_kind_set, &
783 pw_env=pw_env, &
784 subsys=subsys, &
785 para_env=para_env, &
786 particle_set=particle_set, &
787 dft_control=dft_control)
788 CALL qs_subsys_get(subsys, particles=particles)
789
790 nspins = dft_control%nspins
791 rt_time_step = qs_env%sim_step
792
793 ! Setup the grids needed to compute a wavefunction given a vector
794 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
795 pw_pools=pw_pools)
796 CALL auxbas_pw_pool%create_pw(wf_r)
797 CALL auxbas_pw_pool%create_pw(wf_g)
798 CALL auxbas_pw_pool%create_pw(density_r)
799 CALL get_rtp(rtp=rtp, mos_new=mos_new)
800
801 DO ispin = 1, nspins
802 CALL get_mo_set(mo_set=mos(ispin), homo=homo)
803
804 nhomo = section_get_ival(dft_section, "PRINT%MO_CUBES%NHOMO")
805 append_cube = section_get_lval(dft_section, "PRINT%MO_CUBES%APPEND")
806 my_pos_cube = "REWIND"
807 IF (append_cube) THEN
808 my_pos_cube = "APPEND"
809 END IF
810 CALL section_vals_val_get(dft_section, "PRINT%MO_CUBES%HOMO_LIST", n_rep_val=n_rep)
811 IF (n_rep > 0) THEN ! write the cubes of the list
812 nlist = 0
813 DO ir = 1, n_rep
814 NULLIFY (list)
815 CALL section_vals_val_get(dft_section, "PRINT%MO_CUBES%HOMO_LIST", i_rep_val=ir, &
816 i_vals=list)
817 IF (ASSOCIATED(list)) THEN
818 CALL reallocate(list_index, 1, nlist + SIZE(list))
819 DO i = 1, SIZE(list)
820 list_index(i + nlist) = list(i)
821 END DO
822 nlist = nlist + SIZE(list)
823 END IF
824 END DO
825 ELSE
826
827 IF (nhomo == -1) nhomo = homo
828 nlist = homo - max(1, homo - nhomo + 1) + 1
829 ALLOCATE (list_index(nlist))
830 DO i = 1, nlist
831 list_index(i) = max(1, homo - nhomo + 1) + i - 1
832 END DO
833 END IF
834 DO i = 1, nlist
835 ivector = list_index(i)
836 CALL get_qs_env(qs_env=qs_env, &
837 atomic_kind_set=atomic_kind_set, &
838 qs_kind_set=qs_kind_set, &
839 cell=cell, &
840 particle_set=particle_set, &
841 pw_env=pw_env)
842
843 ! density_r contains the density of the MOs
844 CALL pw_zero(density_r)
845 mo_coeff => mos_new(2*ispin - 1)!Real coeff
846 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
847 cell, dft_control, particle_set, pw_env)
848 ! Adding the real part
849 CALL pw_multiply(density_r, wf_r, wf_r, 1.0_dp)
850
851 mo_coeff => mos_new(2*ispin) !Im coeff
852 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
853 cell, dft_control, particle_set, pw_env)
854 ! Adding the im part
855 CALL pw_multiply(density_r, wf_r, wf_r, 1.0_dp)
856
857 WRITE (filename, '(a4,I5.5,a1,I1.1)') "WFN_", ivector, "_", ispin
858 mpi_io = .true.
859 unit_nr = cp_print_key_unit_nr(logger, input, "DFT%PRINT%MO_CUBES", extension=".cube", &
860 middle_name=trim(filename), file_position=my_pos_cube, log_filename=.false., &
861 mpi_io=mpi_io)
862 WRITE (title, *) "DENSITY ", ivector, " spin ", ispin, " i.e. HOMO - ", ivector - homo
863 CALL cp_pw_to_cube(density_r, unit_nr, title, particles=particles, &
864 stride=section_get_ivals(dft_section, "PRINT%MO_CUBES%STRIDE"), mpi_io=mpi_io)
865 CALL cp_print_key_finished_output(unit_nr, logger, input, "DFT%PRINT%MO_CUBES", mpi_io=mpi_io)
866 END DO
867 IF (ASSOCIATED(list_index)) DEALLOCATE (list_index)
868 END DO
869
870 ! Deallocate grids needed to compute wavefunctions
871 CALL auxbas_pw_pool%give_back_pw(wf_r)
872 CALL auxbas_pw_pool%give_back_pw(wf_g)
873 CALL auxbas_pw_pool%give_back_pw(density_r)
874
875 CALL timestop(handle)
876
877 END SUBROUTINE write_rtp_mo_cubes
878
879! **************************************************************************************************
880!> \brief Warn about unused sections of the print section - only implemented for some of the methods
881!> \param section Parent section
882!> \param subsection_name Name of the subsection which is not used even when explicitly included
883!> \param error_message Message to display as warning
884!> \author Stepan Marek (01.25)
885! **************************************************************************************************
886 SUBROUTINE warn_section_unused(section, subsection_name, error_message)
887 TYPE(section_vals_type), POINTER :: section
888 CHARACTER(len=*) :: subsection_name, error_message
889
890 LOGICAL :: explicit
891 TYPE(section_vals_type), POINTER :: target_section
892
893 target_section => section_vals_get_subs_vals(section, subsection_name)
894 CALL section_vals_get(target_section, explicit=explicit)
895 IF (explicit) cpwarn(error_message)
896 END SUBROUTINE
897
898END 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, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
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:516
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:609
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)
Write MO information to output file (eigenvalues, occupation numbers, coefficients)
Definition qs_mo_io.F:1011
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.