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