(git:31876b5)
Loading...
Searching...
No Matches
rt_propagation_methods.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Routines for propagating the orbitals
10!> \author Florian Schiffmann (02.09)
11! **************************************************************************************************
13 USE bibliography, ONLY: kolafa2004,&
14 kuhne2007,&
16 cite_reference
17 USE cell_types, ONLY: cell_type
21 USE cp_cfm_types, ONLY: cp_cfm_create,&
26 USE cp_dbcsr_api, ONLY: &
31 dbcsr_type, dbcsr_type_antisymmetric
43 USE cp_fm_types, ONLY: cp_fm_create,&
53 USE cp_output_handling, ONLY: cp_p_file,&
56 USE input_constants, ONLY: do_arnoldi,&
57 do_bch,&
58 do_em,&
59 do_pade,&
64 USE kinds, ONLY: dp
66 USE mathlib, ONLY: binomial
69 USE pw_env_types, ONLY: pw_env_get,&
72 USE pw_types, ONLY: pw_c1d_gs_type,&
79 USE qs_ks_types, ONLY: set_ks_env
80 USE qs_loc_dipole, ONLY: loc_dipole
87 USE qs_mo_types, ONLY: get_mo_set,&
96 USE rt_propagation_types, ONLY: get_rtp,&
103#include "../base/base_uses.f90"
104
105 IMPLICIT NONE
106
107 PRIVATE
108
109 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'rt_propagation_methods'
110
111 PUBLIC :: propagation_step, &
113 calc_sinvh, &
116
117CONTAINS
118
119! **************************************************************************************************
120!> \brief performs a single propagation step a(t+Dt)=U(t+Dt,t)*a(0)
121!> and calculates the new exponential
122!> \param qs_env ...
123!> \param rtp ...
124!> \param rtp_control ...
125!> \author Florian Schiffmann (02.09)
126! **************************************************************************************************
127
128 SUBROUTINE propagation_step(qs_env, rtp, rtp_control)
129
130 TYPE(qs_environment_type), POINTER :: qs_env
131 TYPE(rt_prop_type), POINTER :: rtp
132 TYPE(rtp_control_type), POINTER :: rtp_control
133
134 CHARACTER(len=*), PARAMETER :: routinen = 'propagation_step'
135
136 INTEGER :: aspc_order, handle, i, im, re, unit_nr
137 TYPE(cell_type), POINTER :: cell
138 TYPE(cp_fm_type), DIMENSION(:), POINTER :: delta_mos, mos_new
139 TYPE(cp_logger_type), POINTER :: logger
140 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: delta_p, h_last_iter, ks_mix, ks_mix_im, &
141 matrix_ks, matrix_ks_im, matrix_s, &
142 rho_new
143 TYPE(dft_control_type), POINTER :: dft_control
144
145 CALL timeset(routinen, handle)
146
147 logger => cp_get_default_logger()
148 IF (logger%para_env%is_source()) THEN
149 unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
150 ELSE
151 unit_nr = -1
152 END IF
153
154 NULLIFY (cell, delta_p, rho_new, delta_mos, mos_new)
155 NULLIFY (ks_mix, ks_mix_im)
156 ! get everything needed and set some values
157 CALL get_qs_env(qs_env, cell=cell, matrix_s=matrix_s, dft_control=dft_control)
158
159 IF (rtp%iter == 1) THEN
160 CALL qs_energies_init(qs_env, .false.)
161 !the above recalculates matrix_s, but matrix not changed if ions are fixed
162 IF (rtp_control%fixed_ions) CALL set_ks_env(qs_env%ks_env, s_mstruct_changed=.false.)
163
164 ! add additional terms to matrix_h and matrix_h_im in the case of applied electric field,
165 ! either in the lengh or velocity gauge.
166 ! should be called after qs_energies_init and before qs_ks_update_qs_env
167 IF (dft_control%apply_efield_field) THEN
168 IF (any(cell%perd(1:3) /= 0)) &
169 cpabort("Length gauge (efield) and periodicity are not compatible")
171 ELSE IF (rtp_control%velocity_gauge) THEN
172 IF (dft_control%apply_vector_potential) &
173 CALL update_vector_potential(qs_env, dft_control)
174 CALL velocity_gauge_ks_matrix(qs_env, subtract_nl_term=.false.)
175 END IF
176
177 CALL get_qs_env(qs_env, matrix_s=matrix_s)
178 IF (.NOT. rtp_control%fixed_ions) THEN
179 CALL s_matrices_create(matrix_s, rtp)
180 END IF
181 rtp%delta_iter = 100.0_dp
182 rtp%mixing_factor = 1.0_dp
183 rtp%mixing = .false.
184 aspc_order = rtp_control%aspc_order
185 CALL aspc_extrapolate(rtp, matrix_s, aspc_order)
186 IF (rtp%linear_scaling) THEN
187 CALL calc_update_rho_sparse(qs_env)
188 ELSE
189 CALL calc_update_rho(qs_env)
190 END IF
191 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false.)
192 END IF
193 IF (.NOT. rtp_control%fixed_ions) THEN
194 CALL calc_s_derivs(qs_env)
195 END IF
196 rtp%converged = .false.
197
198 IF (rtp%linear_scaling) THEN
199 ! keep temporary copy of the starting density matrix to check for convergence
200 CALL get_rtp(rtp=rtp, rho_new=rho_new)
201 NULLIFY (delta_p)
202 CALL dbcsr_allocate_matrix_set(delta_p, SIZE(rho_new))
203 DO i = 1, SIZE(rho_new)
204 CALL dbcsr_init_p(delta_p(i)%matrix)
205 CALL dbcsr_create(delta_p(i)%matrix, template=rho_new(i)%matrix)
206 CALL dbcsr_copy(delta_p(i)%matrix, rho_new(i)%matrix)
207 END DO
208 ELSE
209 ! keep temporary copy of the starting mos to check for convergence
210 CALL get_rtp(rtp=rtp, mos_new=mos_new)
211 ALLOCATE (delta_mos(SIZE(mos_new)))
212 DO i = 1, SIZE(mos_new)
213 CALL cp_fm_create(delta_mos(i), &
214 matrix_struct=mos_new(i)%matrix_struct, &
215 name="delta_mos"//trim(adjustl(cp_to_string(i))))
216 CALL cp_fm_to_fm(mos_new(i), delta_mos(i))
217 END DO
218 END IF
219
220 CALL get_qs_env(qs_env, &
221 matrix_ks=matrix_ks, &
222 matrix_ks_im=matrix_ks_im)
223
224 CALL get_rtp(rtp=rtp, h_last_iter=h_last_iter)
225 IF (rtp%mixing) THEN
226 IF (unit_nr > 0) THEN
227 WRITE (unit_nr, '(t3,a,2f16.8)') "Mixing the Hamiltonians to improve robustness, mixing factor: ", rtp%mixing_factor
228 END IF
229 CALL dbcsr_allocate_matrix_set(ks_mix, SIZE(matrix_ks))
230 CALL dbcsr_allocate_matrix_set(ks_mix_im, SIZE(matrix_ks))
231 DO i = 1, SIZE(matrix_ks)
232 CALL dbcsr_init_p(ks_mix(i)%matrix)
233 CALL dbcsr_create(ks_mix(i)%matrix, template=matrix_ks(1)%matrix)
234 CALL dbcsr_init_p(ks_mix_im(i)%matrix)
235 CALL dbcsr_create(ks_mix_im(i)%matrix, template=matrix_ks(1)%matrix, matrix_type=dbcsr_type_antisymmetric)
236 END DO
237 DO i = 1, SIZE(matrix_ks)
238 re = 2*i - 1
239 im = 2*i
240 CALL dbcsr_add(ks_mix(i)%matrix, matrix_ks(i)%matrix, 0.0_dp, rtp%mixing_factor)
241 CALL dbcsr_add(ks_mix(i)%matrix, h_last_iter(re)%matrix, 1.0_dp, 1.0_dp - rtp%mixing_factor)
242 IF (rtp%propagate_complex_ks) THEN
243 CALL dbcsr_add(ks_mix_im(i)%matrix, matrix_ks_im(i)%matrix, 0.0_dp, rtp%mixing_factor)
244 CALL dbcsr_add(ks_mix_im(i)%matrix, h_last_iter(im)%matrix, 1.0_dp, 1.0_dp - rtp%mixing_factor)
245 END IF
246 END DO
247 CALL calc_sinvh(rtp, ks_mix, ks_mix_im, rtp_control)
248 DO i = 1, SIZE(matrix_ks)
249 re = 2*i - 1
250 im = 2*i
251 CALL dbcsr_copy(h_last_iter(re)%matrix, ks_mix(i)%matrix)
252 IF (rtp%propagate_complex_ks) THEN
253 CALL dbcsr_copy(h_last_iter(im)%matrix, ks_mix_im(i)%matrix)
254 END IF
255 END DO
256 CALL dbcsr_deallocate_matrix_set(ks_mix)
257 CALL dbcsr_deallocate_matrix_set(ks_mix_im)
258 ELSE
259 CALL calc_sinvh(rtp, matrix_ks, matrix_ks_im, rtp_control)
260 DO i = 1, SIZE(matrix_ks)
261 re = 2*i - 1
262 im = 2*i
263 CALL dbcsr_copy(h_last_iter(re)%matrix, matrix_ks(i)%matrix)
264 IF (rtp%propagate_complex_ks) THEN
265 CALL dbcsr_copy(h_last_iter(im)%matrix, matrix_ks_im(i)%matrix)
266 END IF
267 END DO
268 END IF
269
270 CALL compute_propagator_matrix(rtp, rtp_control%propagator)
271
272 SELECT CASE (rtp_control%mat_exp)
273 CASE (do_pade, do_taylor)
274 IF (rtp%linear_scaling) THEN
275 CALL propagate_exp_density(rtp, rtp_control)
276 CALL calc_update_rho_sparse(qs_env)
277 ELSE
278 CALL propagate_exp(rtp, rtp_control)
279 CALL calc_update_rho(qs_env)
280 END IF
281 CASE (do_arnoldi)
282 CALL propagate_arnoldi(rtp, rtp_control)
283 CALL calc_update_rho(qs_env)
284 CASE (do_bch)
285 CALL propagate_bch(rtp, rtp_control)
286 CALL calc_update_rho_sparse(qs_env)
287 END SELECT
288 CALL step_finalize(qs_env, rtp_control, delta_mos, delta_p)
289 IF (rtp%linear_scaling) THEN
290 CALL dbcsr_deallocate_matrix_set(delta_p)
291 ELSE
292 CALL cp_fm_release(delta_mos)
293 END IF
294
295 CALL timestop(handle)
296
297 END SUBROUTINE propagation_step
298
299! **************************************************************************************************
300!> \brief Performs all the stuff to finish the step:
301!> convergence checks
302!> copying stuff into right place for the next step
303!> updating the history for extrapolation
304!> \param qs_env ...
305!> \param rtp_control ...
306!> \param delta_mos ...
307!> \param delta_P ...
308!> \author Florian Schiffmann (02.09)
309! **************************************************************************************************
310
311 SUBROUTINE step_finalize(qs_env, rtp_control, delta_mos, delta_P)
312 TYPE(qs_environment_type), POINTER :: qs_env
313 TYPE(rtp_control_type), POINTER :: rtp_control
314 TYPE(cp_fm_type), DIMENSION(:), POINTER :: delta_mos
315 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: delta_p
316
317 CHARACTER(len=*), PARAMETER :: routinen = 'step_finalize'
318
319 INTEGER :: handle, i, ihist
320 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new, mos_old
321 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: exp_h_new, exp_h_old, matrix_ks, &
322 matrix_ks_im, rho_new, rho_old, s_mat
323 TYPE(qs_energy_type), POINTER :: energy
324 TYPE(rt_prop_type), POINTER :: rtp
325
326 CALL timeset(routinen, handle)
327
328 CALL get_qs_env(qs_env=qs_env, rtp=rtp, matrix_s=s_mat, &
329 matrix_ks=matrix_ks, matrix_ks_im=matrix_ks_im, energy=energy)
330 CALL get_rtp(rtp=rtp, exp_h_old=exp_h_old, exp_h_new=exp_h_new)
331
332 IF (rtp_control%sc_check_start < rtp%iter) THEN
333 rtp%delta_iter_old = rtp%delta_iter
334 IF (rtp%linear_scaling) THEN
335 CALL rt_convergence_density(rtp, delta_p, rtp%delta_iter)
336 ELSE
337 CALL rt_convergence(rtp, s_mat(1)%matrix, delta_mos, rtp%delta_iter)
338 END IF
339 rtp%converged = (rtp%delta_iter < rtp_control%eps_ener)
340 !Apply mixing if scf loop is not converging
341
342 !It would be better to redo the current step with mixixng,
343 !but currently the decision is made to use mixing from the next step on
344 IF (rtp_control%sc_check_start < rtp%iter + 1) THEN
345 IF (rtp%delta_iter/rtp%delta_iter_old > 0.9) THEN
346 rtp%mixing_factor = max(rtp%mixing_factor/2.0_dp, 0.125_dp)
347 rtp%mixing = .true.
348 END IF
349 END IF
350 END IF
351
352 IF (rtp%converged) THEN
353 IF (rtp%linear_scaling) THEN
354 CALL get_rtp(rtp=rtp, rho_old=rho_old, rho_new=rho_new)
355 CALL purify_mcweeny_complex_nonorth(rho_new, s_mat, rtp%filter_eps, rtp%filter_eps_small, &
356 rtp_control%mcweeny_max_iter, rtp_control%mcweeny_eps)
357 IF (rtp_control%mcweeny_max_iter > 0) CALL calc_update_rho_sparse(qs_env)
358 CALL report_density_occupation(rtp%filter_eps, rho_new)
359 DO i = 1, SIZE(rho_new)
360 CALL dbcsr_copy(rho_old(i)%matrix, rho_new(i)%matrix)
361 END DO
362 ELSE
363 CALL get_rtp(rtp=rtp, mos_old=mos_old, mos_new=mos_new)
364 DO i = 1, SIZE(mos_new)
365 CALL cp_fm_to_fm(mos_new(i), mos_old(i))
366 END DO
367 END IF
368 IF (rtp_control%propagator == do_em) CALL calc_sinvh(rtp, matrix_ks, matrix_ks_im, rtp_control)
369 DO i = 1, SIZE(exp_h_new)
370 CALL dbcsr_copy(exp_h_old(i)%matrix, exp_h_new(i)%matrix)
371 END DO
372 ihist = mod(rtp%istep, rtp_control%aspc_order) + 1
373 IF (rtp_control%fixed_ions) THEN
374 CALL put_data_to_history(rtp, rho=rho_new, mos=mos_new, ihist=ihist)
375 ELSE
376 CALL put_data_to_history(rtp, rho=rho_new, mos=mos_new, s_mat=s_mat, ihist=ihist)
377 END IF
378 END IF
379
380 rtp%energy_new = energy%total
381
382 CALL timestop(handle)
383
384 END SUBROUTINE step_finalize
385
386! **************************************************************************************************
387!> \brief computes the propagator matrix for EM/ETRS, RTP/EMD
388!> \param rtp ...
389!> \param propagator ...
390!> \author Florian Schiffmann (02.09)
391! **************************************************************************************************
392
393 SUBROUTINE compute_propagator_matrix(rtp, propagator)
394 TYPE(rt_prop_type), POINTER :: rtp
395 INTEGER :: propagator
396
397 CHARACTER(len=*), PARAMETER :: routinen = 'compute_propagator_matrix'
398
399 INTEGER :: handle, i
400 REAL(kind=dp) :: dt, prefac
401 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: exp_h_new, exp_h_old, propagator_matrix
402
403 CALL timeset(routinen, handle)
404 CALL get_rtp(rtp=rtp, exp_h_new=exp_h_new, exp_h_old=exp_h_old, &
405 propagator_matrix=propagator_matrix, dt=dt)
406
407 prefac = -0.5_dp*dt
408
409 DO i = 1, SIZE(exp_h_new)
410 CALL dbcsr_add(propagator_matrix(i)%matrix, exp_h_new(i)%matrix, 0.0_dp, prefac)
411 IF (propagator == do_em) &
412 CALL dbcsr_add(propagator_matrix(i)%matrix, exp_h_old(i)%matrix, 1.0_dp, prefac)
413 END DO
414
415 CALL timestop(handle)
416
417 END SUBROUTINE compute_propagator_matrix
418
419! **************************************************************************************************
420!> \brief computes S_inv*H, if needed Sinv*B and S_inv*H_imag and store these quantities to the
421!> \brief exp_H for the real and imag part (for RTP and EMD)
422!> \param rtp ...
423!> \param matrix_ks ...
424!> \param matrix_ks_im ...
425!> \param rtp_control ...
426!> \author Florian Schiffmann (02.09)
427! **************************************************************************************************
428
429 SUBROUTINE calc_sinvh(rtp, matrix_ks, matrix_ks_im, rtp_control)
430 TYPE(rt_prop_type), POINTER :: rtp
431 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_ks_im
432 TYPE(rtp_control_type), POINTER :: rtp_control
433
434 CHARACTER(len=*), PARAMETER :: routinen = 'calc_SinvH'
435 REAL(kind=dp), PARAMETER :: one = 1.0_dp, zero = 0.0_dp
436
437 INTEGER :: handle, im, ispin, re
438 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: exp_h, sinvb, sinvh, sinvh_imag
439 TYPE(dbcsr_type) :: matrix_ks_nosym
440 TYPE(dbcsr_type), POINTER :: b_mat, s_inv
441
442 CALL timeset(routinen, handle)
443 CALL get_rtp(rtp=rtp, s_inv=s_inv, exp_h_new=exp_h)
444 DO ispin = 1, SIZE(matrix_ks)
445 re = ispin*2 - 1
446 im = ispin*2
447 CALL dbcsr_set(exp_h(re)%matrix, zero)
448 CALL dbcsr_set(exp_h(im)%matrix, zero)
449 END DO
450 CALL dbcsr_create(matrix_ks_nosym, template=matrix_ks(1)%matrix, matrix_type="N")
451
452 ! Real part of S_inv x H -> imag part of exp_H
453 DO ispin = 1, SIZE(matrix_ks)
454 re = ispin*2 - 1
455 im = ispin*2
456 CALL dbcsr_desymmetrize(matrix_ks(ispin)%matrix, matrix_ks_nosym)
457 CALL dbcsr_multiply("N", "N", one, s_inv, matrix_ks_nosym, zero, exp_h(im)%matrix, &
458 filter_eps=rtp%filter_eps)
459 IF (.NOT. rtp_control%fixed_ions) THEN
460 CALL get_rtp(rtp=rtp, sinvh=sinvh)
461 CALL dbcsr_copy(sinvh(ispin)%matrix, exp_h(im)%matrix)
462 END IF
463 END DO
464
465 ! Imag part of S_inv x H -> real part of exp_H
466 IF (rtp%propagate_complex_ks) THEN
467 DO ispin = 1, SIZE(matrix_ks)
468 re = ispin*2 - 1
469 im = ispin*2
470 CALL dbcsr_set(matrix_ks_nosym, 0.0_dp)
471 CALL dbcsr_desymmetrize(matrix_ks_im(ispin)%matrix, matrix_ks_nosym)
472 ! - SinvH_imag is added to exp_H(re)%matrix
473 CALL dbcsr_multiply("N", "N", -one, s_inv, matrix_ks_nosym, zero, exp_h(re)%matrix, &
474 filter_eps=rtp%filter_eps)
475 IF (.NOT. rtp_control%fixed_ions) THEN
476 CALL get_rtp(rtp=rtp, sinvh_imag=sinvh_imag)
477 ! -SinvH_imag is saved
478 CALL dbcsr_copy(sinvh_imag(ispin)%matrix, exp_h(re)%matrix)
479 END IF
480 END DO
481 END IF
482 ! EMD case: the real part of exp_H should be updated with B
483 IF (.NOT. rtp_control%fixed_ions) THEN
484 CALL get_rtp(rtp=rtp, b_mat=b_mat, sinvb=sinvb)
485 CALL dbcsr_set(matrix_ks_nosym, 0.0_dp)
486 CALL dbcsr_multiply("N", "N", one, s_inv, b_mat, zero, matrix_ks_nosym, filter_eps=rtp%filter_eps)
487 DO ispin = 1, SIZE(matrix_ks)
488 re = ispin*2 - 1
489 im = ispin*2
490 ! + SinvB is added to exp_H(re)%matrix
491 CALL dbcsr_add(exp_h(re)%matrix, matrix_ks_nosym, 1.0_dp, 1.0_dp)
492 ! + SinvB is saved
493 CALL dbcsr_copy(sinvb(ispin)%matrix, matrix_ks_nosym)
494 END DO
495 END IF
496 ! Otherwise no real part for exp_H
497
498 CALL dbcsr_release(matrix_ks_nosym)
499 CALL timestop(handle)
500
501 END SUBROUTINE calc_sinvh
502
503! **************************************************************************************************
504!> \brief calculates the needed overlap-like matrices
505!> depending on the way the exponential is calculated, only S^-1 is needed
506!> \param s_mat ...
507!> \param rtp ...
508!> \author Florian Schiffmann (02.09)
509! **************************************************************************************************
510
511 SUBROUTINE s_matrices_create(s_mat, rtp)
512
513 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: s_mat
514 TYPE(rt_prop_type), POINTER :: rtp
515
516 CHARACTER(len=*), PARAMETER :: routinen = 's_matrices_create'
517 REAL(kind=dp), PARAMETER :: one = 1.0_dp, zero = 0.0_dp
518
519 INTEGER :: handle
520 TYPE(dbcsr_type), POINTER :: s_half, s_inv, s_minus_half
521
522 CALL timeset(routinen, handle)
523
524 CALL get_rtp(rtp=rtp, s_inv=s_inv)
525
526 IF (rtp%linear_scaling) THEN
527 CALL get_rtp(rtp=rtp, s_half=s_half, s_minus_half=s_minus_half)
528 CALL matrix_sqrt_newton_schulz(s_half, s_minus_half, s_mat(1)%matrix, rtp%filter_eps, &
529 rtp%newton_schulz_order, rtp%lanzcos_threshold, rtp%lanzcos_max_iter)
530 CALL dbcsr_multiply("N", "N", one, s_minus_half, s_minus_half, zero, s_inv, &
531 filter_eps=rtp%filter_eps)
532 ELSE
533 CALL dbcsr_copy(s_inv, s_mat(1)%matrix)
534 CALL cp_dbcsr_cholesky_decompose(s_inv, para_env=rtp%ao_ao_fmstruct%para_env, &
535 blacs_env=rtp%ao_ao_fmstruct%context)
536 CALL cp_dbcsr_cholesky_invert(s_inv, para_env=rtp%ao_ao_fmstruct%para_env, &
537 blacs_env=rtp%ao_ao_fmstruct%context, uplo_to_full=.true.)
538 END IF
539
540 CALL timestop(handle)
541 END SUBROUTINE s_matrices_create
542
543! **************************************************************************************************
544!> \brief Calculates the frobenius norm of a complex matrix represented by two real matrices
545!> \param frob_norm ...
546!> \param mat_re ...
547!> \param mat_im ...
548!> \author Samuel Andermatt (04.14)
549! **************************************************************************************************
550
551 SUBROUTINE complex_frobenius_norm(frob_norm, mat_re, mat_im)
552
553 REAL(kind=dp), INTENT(out) :: frob_norm
554 TYPE(dbcsr_type), POINTER :: mat_re, mat_im
555
556 CHARACTER(len=*), PARAMETER :: routinen = 'complex_frobenius_norm'
557 REAL(kind=dp), PARAMETER :: one = 1.0_dp, zero = 0.0_dp
558
559 INTEGER :: col_atom, handle, row_atom
560 LOGICAL :: found
561 REAL(dp), DIMENSION(:, :), POINTER :: block_values, block_values2
562 TYPE(dbcsr_iterator_type) :: iter
563 TYPE(dbcsr_type), POINTER :: tmp
564
565 CALL timeset(routinen, handle)
566
567 NULLIFY (tmp)
568 ALLOCATE (tmp)
569 CALL dbcsr_create(tmp, template=mat_re)
570 !make sure the tmp has the same sparsity pattern as the real and the complex part combined
571 CALL dbcsr_add(tmp, mat_re, zero, one)
572 CALL dbcsr_add(tmp, mat_im, zero, one)
573 CALL dbcsr_set(tmp, zero)
574 !calculate the hadamard product
575 CALL dbcsr_iterator_start(iter, tmp)
576 DO WHILE (dbcsr_iterator_blocks_left(iter))
577 CALL dbcsr_iterator_next_block(iter, row_atom, col_atom, block_values)
578 CALL dbcsr_get_block_p(mat_re, row_atom, col_atom, block_values2, found=found)
579 IF (found) THEN
580 block_values = block_values2*block_values2
581 END IF
582 CALL dbcsr_get_block_p(mat_im, row_atom, col_atom, block_values2, found=found)
583 IF (found) THEN
584 block_values = block_values + block_values2*block_values2
585 END IF
586 block_values = sqrt(block_values)
587 END DO
588 CALL dbcsr_iterator_stop(iter)
589 frob_norm = dbcsr_frobenius_norm(tmp)
590
592
593 CALL timestop(handle)
594
595 END SUBROUTINE complex_frobenius_norm
596
597! **************************************************************************************************
598!> \brief Does McWeeny for complex matrices in the non-orthogonal basis
599!> \param P ...
600!> \param s_mat ...
601!> \param eps ...
602!> \param eps_small ...
603!> \param max_iter ...
604!> \param threshold ...
605!> \author Samuel Andermatt (04.14)
606! **************************************************************************************************
607
608 SUBROUTINE purify_mcweeny_complex_nonorth(P, s_mat, eps, eps_small, max_iter, threshold)
609
610 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p, s_mat
611 REAL(kind=dp), INTENT(in) :: eps, eps_small
612 INTEGER, INTENT(in) :: max_iter
613 REAL(kind=dp), INTENT(in) :: threshold
614
615 CHARACTER(len=*), PARAMETER :: routinen = 'purify_mcweeny_complex_nonorth'
616 REAL(kind=dp), PARAMETER :: one = 1.0_dp, zero = 0.0_dp
617
618 INTEGER :: handle, i, im, imax, ispin, re, unit_nr
619 REAL(kind=dp) :: frob_norm
620 TYPE(cp_logger_type), POINTER :: logger
621 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ps, psp, tmp
622
623 CALL timeset(routinen, handle)
624
625 logger => cp_get_default_logger()
626 IF (logger%para_env%is_source()) THEN
627 unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
628 ELSE
629 unit_nr = -1
630 END IF
631
632 NULLIFY (tmp, ps, psp)
633 CALL dbcsr_allocate_matrix_set(tmp, SIZE(p))
634 CALL dbcsr_allocate_matrix_set(psp, SIZE(p))
635 CALL dbcsr_allocate_matrix_set(ps, SIZE(p))
636 DO i = 1, SIZE(p)
637 CALL dbcsr_init_p(ps(i)%matrix)
638 CALL dbcsr_create(ps(i)%matrix, template=p(1)%matrix)
639 CALL dbcsr_init_p(psp(i)%matrix)
640 CALL dbcsr_create(psp(i)%matrix, template=p(1)%matrix)
641 CALL dbcsr_init_p(tmp(i)%matrix)
642 CALL dbcsr_create(tmp(i)%matrix, template=p(1)%matrix)
643 END DO
644 IF (SIZE(p) == 2) THEN
645 CALL dbcsr_scale(p(1)%matrix, one/2)
646 CALL dbcsr_scale(p(2)%matrix, one/2)
647 END IF
648 DO ispin = 1, SIZE(p)/2
649 re = 2*ispin - 1
650 im = 2*ispin
651 imax = max(max_iter, 1) !if max_iter is 0 then only the deviation from idempotency needs to be calculated
652 DO i = 1, imax
653 CALL dbcsr_multiply("N", "N", one, p(re)%matrix, s_mat(1)%matrix, &
654 zero, ps(re)%matrix, filter_eps=eps_small)
655 CALL dbcsr_multiply("N", "N", one, p(im)%matrix, s_mat(1)%matrix, &
656 zero, ps(im)%matrix, filter_eps=eps_small)
657 CALL cp_complex_dbcsr_gemm_3("N", "N", one, ps(re)%matrix, ps(im)%matrix, &
658 p(re)%matrix, p(im)%matrix, zero, psp(re)%matrix, psp(im)%matrix, &
659 filter_eps=eps_small)
660 CALL dbcsr_copy(tmp(re)%matrix, psp(re)%matrix)
661 CALL dbcsr_copy(tmp(im)%matrix, psp(im)%matrix)
662 CALL dbcsr_add(tmp(re)%matrix, p(re)%matrix, 1.0_dp, -1.0_dp)
663 CALL dbcsr_add(tmp(im)%matrix, p(im)%matrix, 1.0_dp, -1.0_dp)
664 CALL complex_frobenius_norm(frob_norm, tmp(re)%matrix, tmp(im)%matrix)
665 IF (unit_nr > 0) WRITE (unit_nr, '(t3,a,2f16.8)') "Deviation from idempotency: ", frob_norm
666 IF (frob_norm > threshold .AND. max_iter > 0) THEN
667 CALL dbcsr_copy(p(re)%matrix, psp(re)%matrix)
668 CALL dbcsr_copy(p(im)%matrix, psp(im)%matrix)
669 CALL cp_complex_dbcsr_gemm_3("N", "N", -2.0_dp, ps(re)%matrix, ps(im)%matrix, &
670 psp(re)%matrix, psp(im)%matrix, 3.0_dp, p(re)%matrix, p(im)%matrix, &
671 filter_eps=eps_small)
672 CALL dbcsr_filter(p(re)%matrix, eps)
673 CALL dbcsr_filter(p(im)%matrix, eps)
674 !make sure P is exactly hermitian
675 CALL dbcsr_transposed(tmp(re)%matrix, p(re)%matrix)
676 CALL dbcsr_add(p(re)%matrix, tmp(re)%matrix, one/2, one/2)
677 CALL dbcsr_transposed(tmp(im)%matrix, p(im)%matrix)
678 CALL dbcsr_add(p(im)%matrix, tmp(im)%matrix, one/2, -one/2)
679 ELSE
680 EXIT
681 END IF
682 END DO
683 !make sure P is hermitian
684 CALL dbcsr_transposed(tmp(re)%matrix, p(re)%matrix)
685 CALL dbcsr_add(p(re)%matrix, tmp(re)%matrix, one/2, one/2)
686 CALL dbcsr_transposed(tmp(im)%matrix, p(im)%matrix)
687 CALL dbcsr_add(p(im)%matrix, tmp(im)%matrix, one/2, -one/2)
688 END DO
689 IF (SIZE(p) == 2) THEN
690 CALL dbcsr_scale(p(1)%matrix, one*2)
691 CALL dbcsr_scale(p(2)%matrix, one*2)
692 END IF
696
697 CALL timestop(handle)
698
699 END SUBROUTINE purify_mcweeny_complex_nonorth
700
701! **************************************************************************************************
702!> \brief ...
703!> \param rtp ...
704!> \param matrix_s ...
705!> \param aspc_order ...
706! **************************************************************************************************
707 SUBROUTINE aspc_extrapolate(rtp, matrix_s, aspc_order)
708 TYPE(rt_prop_type), POINTER :: rtp
709 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
710 INTEGER, INTENT(in) :: aspc_order
711
712 CHARACTER(len=*), PARAMETER :: routinen = 'aspc_extrapolate'
713 COMPLEX(KIND=dp), PARAMETER :: cone = (1.0_dp, 0.0_dp), &
714 czero = (0.0_dp, 0.0_dp)
715 REAL(kind=dp), PARAMETER :: one = 1.0_dp, zero = 0.0_dp
716
717 INTEGER :: handle, i, iaspc, icol_local, ihist, &
718 imat, k, kdbl, n, naspc, ncol_local, &
719 nmat
720 REAL(kind=dp) :: alpha
721 TYPE(cp_cfm_type) :: cfm_tmp, cfm_tmp1, csc
722 TYPE(cp_fm_struct_type), POINTER :: matrix_struct, matrix_struct_new
723 TYPE(cp_fm_type) :: fm_tmp, fm_tmp1, fm_tmp2
724 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new
725 TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: mo_hist
726 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_new, s_hist
727 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_hist
728
729 NULLIFY (rho_hist)
730 CALL timeset(routinen, handle)
731 CALL cite_reference(kolafa2004)
732 CALL cite_reference(kuhne2007)
733
734 IF (rtp%linear_scaling) THEN
735 CALL get_rtp(rtp=rtp, rho_new=rho_new)
736 ELSE
737 CALL get_rtp(rtp=rtp, mos_new=mos_new)
738 END IF
739
740 naspc = min(rtp%istep, aspc_order)
741 IF (rtp%linear_scaling) THEN
742 nmat = SIZE(rho_new)
743 rho_hist => rtp%history%rho_history
744 DO imat = 1, nmat
745 DO iaspc = 1, naspc
746 alpha = (-1.0_dp)**(iaspc + 1)*real(iaspc, kind=dp)* &
747 binomial(2*naspc, naspc - iaspc)/binomial(2*naspc - 2, naspc - 1)
748 ihist = mod(rtp%istep - iaspc, aspc_order) + 1
749 IF (iaspc == 1) THEN
750 CALL dbcsr_add(rho_new(imat)%matrix, rho_hist(imat, ihist)%matrix, zero, alpha)
751 ELSE
752 CALL dbcsr_add(rho_new(imat)%matrix, rho_hist(imat, ihist)%matrix, one, alpha)
753 END IF
754 END DO
755 END DO
756 ELSE
757 mo_hist => rtp%history%mo_history
758 nmat = SIZE(mos_new)
759 DO imat = 1, nmat
760 DO iaspc = 1, naspc
761 alpha = (-1.0_dp)**(iaspc + 1)*real(iaspc, kind=dp)* &
762 binomial(2*naspc, naspc - iaspc)/binomial(2*naspc - 2, naspc - 1)
763 ihist = mod(rtp%istep - iaspc, aspc_order) + 1
764 IF (iaspc == 1) THEN
765 CALL cp_fm_scale_and_add(zero, mos_new(imat), alpha, mo_hist(imat, ihist))
766 ELSE
767 CALL cp_fm_scale_and_add(one, mos_new(imat), alpha, mo_hist(imat, ihist))
768 END IF
769 END DO
770 END DO
771
772 mo_hist => rtp%history%mo_history
773 s_hist => rtp%history%s_history
774 DO i = 1, SIZE(mos_new)/2
775 NULLIFY (matrix_struct, matrix_struct_new)
776
777 CALL cp_fm_struct_double(matrix_struct, &
778 mos_new(2*i)%matrix_struct, &
779 mos_new(2*i)%matrix_struct%context, &
780 .true., .false.)
781
782 CALL cp_fm_create(fm_tmp, matrix_struct)
783 CALL cp_fm_create(fm_tmp1, matrix_struct)
784 CALL cp_fm_create(fm_tmp2, mos_new(2*i)%matrix_struct)
785 CALL cp_cfm_create(cfm_tmp, mos_new(2*i)%matrix_struct)
786 CALL cp_cfm_create(cfm_tmp1, mos_new(2*i)%matrix_struct)
787
788 CALL cp_fm_get_info(fm_tmp, ncol_global=kdbl)
789
790 CALL cp_fm_get_info(mos_new(2*i), &
791 nrow_global=n, &
792 ncol_global=k, &
793 ncol_local=ncol_local)
794
795 CALL cp_fm_struct_create(matrix_struct_new, &
796 template_fmstruct=mos_new(2*i)%matrix_struct, &
797 nrow_global=k, &
798 ncol_global=k)
799 CALL cp_cfm_create(csc, matrix_struct_new)
800
801 CALL cp_fm_struct_release(matrix_struct_new)
802 CALL cp_fm_struct_release(matrix_struct)
803
804 ! first the most recent
805
806! reorthogonalize vectors
807 DO icol_local = 1, ncol_local
808 fm_tmp%local_data(:, icol_local) = mos_new(2*i - 1)%local_data(:, icol_local)
809 fm_tmp%local_data(:, icol_local + ncol_local) = mos_new(2*i)%local_data(:, icol_local)
810 END DO
811
812 CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, fm_tmp, fm_tmp1, kdbl)
813
814 DO icol_local = 1, ncol_local
815 cfm_tmp%local_data(:, icol_local) = cmplx(fm_tmp1%local_data(:, icol_local), &
816 fm_tmp1%local_data(:, icol_local + ncol_local), dp)
817 cfm_tmp1%local_data(:, icol_local) = cmplx(mos_new(2*i - 1)%local_data(:, icol_local), &
818 mos_new(2*i)%local_data(:, icol_local), dp)
819 END DO
820 CALL parallel_gemm('C', 'N', k, k, n, cone, cfm_tmp1, cfm_tmp, czero, csc)
822 CALL cp_cfm_triangular_multiply(csc, cfm_tmp1, n_cols=k, side='R', invert_tr=.true.)
823 DO icol_local = 1, ncol_local
824 mos_new(2*i - 1)%local_data(:, icol_local) = real(cfm_tmp1%local_data(:, icol_local), dp)
825 mos_new(2*i)%local_data(:, icol_local) = aimag(cfm_tmp1%local_data(:, icol_local))
826 END DO
827
828! deallocate work matrices
829 CALL cp_cfm_release(csc)
830 CALL cp_fm_release(fm_tmp)
831 CALL cp_fm_release(fm_tmp1)
832 CALL cp_fm_release(fm_tmp2)
833 CALL cp_cfm_release(cfm_tmp)
834 CALL cp_cfm_release(cfm_tmp1)
835 END DO
836
837 END IF
838
839 CALL timestop(handle)
840
841 END SUBROUTINE aspc_extrapolate
842
843! **************************************************************************************************
844!> \brief ...
845!> \param rtp ...
846!> \param mos ...
847!> \param rho ...
848!> \param s_mat ...
849!> \param ihist ...
850! **************************************************************************************************
851 SUBROUTINE put_data_to_history(rtp, mos, rho, s_mat, ihist)
852 TYPE(rt_prop_type), POINTER :: rtp
853 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos
854 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho
855 TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
856 POINTER :: s_mat
857 INTEGER :: ihist
858
859 INTEGER :: i
860
861 IF (rtp%linear_scaling) THEN
862 DO i = 1, SIZE(rho)
863 CALL dbcsr_copy(rtp%history%rho_history(i, ihist)%matrix, rho(i)%matrix)
864 END DO
865 ELSE
866 DO i = 1, SIZE(mos)
867 CALL cp_fm_to_fm(mos(i), rtp%history%mo_history(i, ihist))
868 END DO
869 IF (PRESENT(s_mat)) THEN
870 IF (ASSOCIATED(rtp%history%s_history(ihist)%matrix)) THEN ! the sparsity might be different
871 ! (future struct:check)
872 CALL dbcsr_deallocate_matrix(rtp%history%s_history(ihist)%matrix)
873 END IF
874 ALLOCATE (rtp%history%s_history(ihist)%matrix)
875 CALL dbcsr_copy(rtp%history%s_history(ihist)%matrix, s_mat(1)%matrix)
876 END IF
877 END IF
878
879 END SUBROUTINE put_data_to_history
880
881! **************************************************************************************************
882!> \brief Computes Maximally localised Wannier functions and print properties according to
883!> FORCE_EVAL%DFT%LOCALIZE, adapted from qs_scf_post_gpw::scf_post_calculation_gpw
884!> \param qs_env QuickStep environment
885!> \param rtp Real time propagation environment
886!> \par History 03/2020 created [LS]
887!> \author Lukas Schreder
888! **************************************************************************************************
889 SUBROUTINE rtp_localize(qs_env, rtp)
890
891 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
892 TYPE(rt_prop_type), INTENT(IN), POINTER :: rtp
893
894 CHARACTER(len=*), PARAMETER :: routinen = 'rtp_localize'
895
896 INTEGER :: handle, ispin, output_unit
897 INTEGER, DIMENSION(:, :, :), POINTER :: marked_states
898 LOGICAL :: do_homo, do_mo_cubes, do_wannier_cubes, &
899 p_loc
900 REAL(kind=dp), DIMENSION(:), POINTER :: mo_eigenvalues
901 TYPE(cp_1d_r_p_type), DIMENSION(:), POINTER :: occupied_evals
902 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: mo_localized, occupied_orbs
903 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mo_coeff
904 TYPE(cp_logger_type), POINTER :: logger
905 TYPE(dft_control_type), POINTER :: dft_control
906 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
907 TYPE(particle_list_type), POINTER :: particles
908 TYPE(pw_c1d_gs_type) :: wf_g
909 TYPE(pw_env_type), POINTER :: pw_env
910 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
911 TYPE(pw_r3d_rs_type) :: wf_r
912 TYPE(qs_loc_env_type), POINTER :: qs_loc_env
913 TYPE(section_vals_type), POINTER :: dft_section, input, loc_print_section, &
914 loc_section, print_key
915
916 CALL timeset(routinen, handle)
917
918 ! Localization of propagated orbitals requires MO coefficients
919 IF (rtp%linear_scaling) THEN
920 CALL timestop(handle)
921 RETURN
922 END IF
923
924 CALL cite_reference(schreder2021)
925
926 NULLIFY (auxbas_pw_pool, dft_control, dft_section, input, loc_print_section, &
927 loc_section, logger, marked_states, mo_coeff, mo_eigenvalues, mos, &
928 occupied_evals, particles, print_key, pw_env, qs_loc_env)
929
930 logger => cp_get_default_logger()
931 output_unit = cp_logger_get_default_io_unit(logger)
932
933 IF (output_unit > 0) THEN
934 WRITE (unit=output_unit, fmt="(A)") "LOCALIZE| Localizing propagated orbitals"
935 END IF
936
937 ! get section properties
938 CALL get_qs_env(qs_env, dft_control=dft_control, input=input, pw_env=pw_env)
939 ! get propagated MO coeffs
940 CALL get_rtp(rtp, mos_new=mo_coeff)
941 dft_section => section_vals_get_subs_vals(input, "DFT")
942 loc_section => section_vals_get_subs_vals(dft_section, "LOCALIZE")
943 loc_print_section => section_vals_get_subs_vals(loc_section, "PRINT")
944
945 ! what properties to print out
946 print_key => section_vals_get_subs_vals(loc_print_section, "MOLECULAR_DIPOLES")
947 p_loc = btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)
948
949 print_key => section_vals_get_subs_vals(loc_print_section, "TOTAL_DIPOLE")
950 p_loc = p_loc &
951 .OR. btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)
952 print_key => section_vals_get_subs_vals(loc_print_section, "WANNIER_CENTERS")
953 p_loc = p_loc &
954 .OR. btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)
955 print_key => section_vals_get_subs_vals(loc_print_section, "WANNIER_SPREADS")
956 p_loc = p_loc &
957 .OR. btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)
958 print_key => section_vals_get_subs_vals(loc_print_section, "WANNIER_CUBES")
959 p_loc = p_loc &
960 .OR. btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)
961 print_key => section_vals_get_subs_vals(loc_print_section, "MOLECULAR_STATES")
962 p_loc = p_loc &
963 .OR. btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)
964 print_key => section_vals_get_subs_vals(loc_print_section, "MOLECULAR_MOMENTS")
965 p_loc = p_loc &
966 .OR. btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)
967 print_key => section_vals_get_subs_vals(loc_print_section, "LOCALIZED_MOMENTS")
968 p_loc = p_loc &
969 .OR. btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)
970 print_key => section_vals_get_subs_vals(loc_print_section, "WANNIER_STATES")
971 p_loc = p_loc &
972 .OR. btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)
973
974 do_wannier_cubes = btest(cp_print_key_should_output(logger%iter_info, loc_print_section, &
975 "WANNIER_CUBES"), cp_p_file)
976
977 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
978 CALL auxbas_pw_pool%create_pw(wf_r)
979 CALL auxbas_pw_pool%create_pw(wf_g)
980
981 IF (p_loc) THEN
982 ALLOCATE (occupied_evals(dft_control%nspins))
983 ALLOCATE (occupied_orbs(SIZE(mo_coeff)))
984 ALLOCATE (mo_localized(SIZE(mo_coeff)))
985 CALL get_qs_env(qs_env, mos=mos)
986 CALL get_rtp(rtp, mos_new=mo_coeff)
987 DO ispin = 1, SIZE(mo_coeff)
988 occupied_orbs(ispin) = mo_coeff(ispin)
989 CALL cp_fm_create(mo_localized(ispin), mo_coeff(ispin)%matrix_struct)
990 CALL cp_fm_to_fm(mo_coeff(ispin), mo_localized(ispin))
991 END DO
992
993 DO ispin = 1, dft_control%nspins
994 CALL get_mo_set(mos(ispin), eigenvalues=mo_eigenvalues)
995 occupied_evals(ispin)%array => mo_eigenvalues
996 END DO
997
998 do_homo = .true.
999 ALLOCATE (qs_loc_env)
1000 CALL qs_loc_env_create(qs_loc_env)
1001 CALL qs_loc_control_init(qs_loc_env, loc_section, do_homo=do_homo)
1002 CALL qs_loc_init(qs_env, qs_loc_env, loc_section, mo_localized, do_homo, do_mo_cubes)
1003 CALL get_localization_info(qs_env, qs_loc_env, loc_section, mo_localized, wf_r, wf_g, &
1004 particles, occupied_orbs, occupied_evals, marked_states)
1005 CALL loc_dipole(input, dft_control, qs_loc_env, logger, qs_env)
1006
1007 DO ispin = 1, SIZE(mo_localized)
1008 CALL cp_fm_release(mo_localized(ispin))
1009 END DO
1010 DEALLOCATE (mo_localized)
1011 DEALLOCATE (occupied_orbs)
1012 DEALLOCATE (occupied_evals)
1013 CALL qs_loc_env_release(qs_loc_env)
1014 DEALLOCATE (qs_loc_env)
1015 IF (ASSOCIATED(marked_states)) THEN
1016 DEALLOCATE (marked_states)
1017 END IF
1018 END IF
1019
1020 CALL auxbas_pw_pool%give_back_pw(wf_r)
1021 CALL auxbas_pw_pool%give_back_pw(wf_g)
1022
1023 CALL timestop(handle)
1024
1025 END SUBROUTINE rtp_localize
1026
1027END MODULE rt_propagation_methods
static int imax(int x, int y)
Returns the larger of two given integers (missing from the C standard)
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public kuhne2007
integer, save, public schreder2021
integer, save, public kolafa2004
Handles all functions related to the CELL.
Definition cell_types.F:15
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_triangular_multiply(triangular_matrix, matrix_b, side, transa_tr, invert_tr, uplo_tr, unit_diag_tr, n_rows, n_cols, alpha)
Multiplies in place by a triangular matrix: matrix_b = alpha op(triangular_matrix) matrix_b or (if si...
various cholesky decomposition related routines
subroutine, public cp_cfm_cholesky_decompose(matrix, n, info_out)
Used to replace a symmetric positive definite matrix M with its Cholesky decomposition U: M = U^T * U...
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_transposed(transposed, normal, shallow_data_copy, transpose_distribution, use_distribution)
...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_init_p(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, transposed)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
Interface to (sca)lapack for the Cholesky based procedures.
subroutine, public cp_dbcsr_cholesky_decompose(matrix, n, para_env, blacs_env)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
subroutine, public cp_dbcsr_cholesky_invert(matrix, n, para_env, blacs_env, uplo_to_full)
used to replace the cholesky decomposition by the inverse
real(dp) function, public dbcsr_frobenius_norm(matrix)
Compute the frobenius norm of a dbcsr matrix.
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_double(fmstruct, struct, context, col, row)
creates a struct with twice the number of blocks on each core. If matrix A has to be multiplied with ...
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
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_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer, 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...
all routins needed for a nonperiodic electric field
subroutine, public efield_potential_lengh_gauge(qs_env)
Replace the original implementation of the electric-electronic interaction in the length gauge....
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_bch
integer, parameter, public do_pade
integer, parameter, public do_taylor
integer, parameter, public do_em
integer, parameter, public do_arnoldi
objects that represent the structure of input sections and the data contained in an input section
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
Routines useful for iterative matrix calculations.
subroutine, public matrix_sqrt_newton_schulz(matrix_sqrt, matrix_sqrt_inv, matrix, threshold, order, eps_lanczos, max_iter_lanczos, symmetrize, converged, iounit)
compute the sqrt of a matrix via the sign function and the corresponding Newton-Schulz iterations the...
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Routines for calculating a complex matrix exponential with dbcsr matrices. Based on the code in matri...
subroutine, public cp_complex_dbcsr_gemm_3(transa, transb, alpha, a_re, a_im, b_re, b_im, beta, c_re, c_im, filter_eps)
Convenience function. Computes the matrix multiplications needed for the multiplication of complex sp...
Collection of simple mathematical functions and subroutines.
Definition mathlib.F:15
elemental real(kind=dp) function, public binomial(n, k)
The binomial coefficient n over k for 0 <= k <= n is calculated, otherwise zero is returned.
Definition mathlib.F:213
basic linear algebra operations for full matrixes
represent a simple array based list of the given type
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 ...
Utility subroutine for qs energy calculation.
subroutine, public qs_energies_init(qs_env, calc_forces)
Refactoring of qs_energies_scf. Driver routine for the initial setup and calculations for a qs energy...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
subroutine, public loc_dipole(input, dft_control, qs_loc_env, logger, qs_env)
Computes and prints the Dipole (using localized charges)
subroutine, public get_localization_info(qs_env, qs_loc_env, loc_section, mo_local, wf_r, wf_g, particles, coeff, evals, marked_states)
Performs localization of the orbitals.
New version of the module for the localization of the molecular orbitals This should be able to use d...
subroutine, public qs_loc_env_release(qs_loc_env)
...
subroutine, public qs_loc_env_create(qs_loc_env)
...
Some utilities for the construction of the localization environment.
subroutine, public qs_loc_control_init(qs_loc_env, loc_section, do_homo, do_mixed, do_xas, nloc_xas, spin_xas)
initializes everything needed for localization of the HOMOs
subroutine, public qs_loc_init(qs_env, qs_loc_env, localize_section, mos_localized, do_homo, do_mo_cubes, mo_loc_history, evals, tot_zeff_corr, do_mixed)
initializes everything needed for localization of the molecular orbitals
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
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.
Routines for calculating a complex matrix exponential.
subroutine, public propagate_exp(rtp, rtp_control)
performs propagations if explicit matrix exponentials are used ETRS: exp(i*H(t+dt)*dt/2)*exp(i*H(t)*d...
subroutine, public propagate_bch(rtp, rtp_control)
Propagation using the Baker-Campbell-Hausdorff expansion, currently only works for rtp.
subroutine, public propagate_exp_density(rtp, rtp_control)
Propagation of the density matrix instead of the atomic orbitals via a matrix exponential.
subroutine, public propagate_arnoldi(rtp, rtp_control)
computes U_prop*MOs using arnoldi subspace algorithm
Routines for propagating the orbitals.
subroutine, public rtp_localize(qs_env, rtp)
Computes Maximally localised Wannier functions and print properties according to FORCE_EVALDFTLOCALIZ...
subroutine, public calc_sinvh(rtp, matrix_ks, matrix_ks_im, rtp_control)
computes S_inv*H, if needed Sinv*B and S_inv*H_imag and store these quantities to the
subroutine, public propagation_step(qs_env, rtp, rtp_control)
performs a single propagation step a(t+Dt)=U(t+Dt,t)*a(0) and calculates the new exponential
subroutine, public put_data_to_history(rtp, mos, rho, s_mat, ihist)
...
subroutine, public s_matrices_create(s_mat, rtp)
calculates the needed overlap-like matrices depending on the way the exponential is calculated,...
Routine for the real time propagation output.
subroutine, public report_density_occupation(filter_eps, rho)
Reports the sparsity pattern of the complex density matrix.
subroutine, public rt_convergence(rtp, matrix_s, delta_mos, delta_eps)
computes the convergence criterion for RTP and EMD
subroutine, public rt_convergence_density(rtp, delta_p, delta_eps)
computes the convergence criterion for RTP and EMD based on the density matrix
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 calc_update_rho(qs_env)
calculates the density from the complex MOs and passes the density to qs_env.
Routines to perform the RTP in the velocity gauge.
subroutine, public velocity_gauge_ks_matrix(qs_env, subtract_nl_term)
...
subroutine, public update_vector_potential(qs_env, dft_control)
Update the vector potential in the case where a time-dependant electric field is apply.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a pointer to a 1d array
Represent a complex full matrix.
keeps the information about the structure of a full matrix
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...
contained for different pw related things
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
contains all the info needed by quickstep to calculate the spread of a selected set of orbitals and i...