(git:8917686)
Loading...
Searching...
No Matches
rt_delta_pulse.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 to apply a delta pulse for RTP and EMD
10! **************************************************************************************************
11
13 USE bibliography, ONLY: mattiat2019,&
15 cite_reference
16 USE cell_types, ONLY: cell_type
21 USE cp_cfm_diag, ONLY: cp_cfm_heevd
22 USE cp_cfm_types, ONLY: cp_cfm_create,&
28 USE cp_dbcsr_api, ONLY: &
30 dbcsr_init_p, dbcsr_p_type, dbcsr_set, dbcsr_type, dbcsr_type_antisymmetric, &
31 dbcsr_type_symmetric
44 USE cp_fm_diag, ONLY: cp_fm_syevd
48 USE cp_fm_types, ONLY: cp_fm_create,&
62 USE kinds, ONLY: dp
63 USE mathconstants, ONLY: one,&
64 twopi,&
65 zero
74 USE qs_mo_types, ONLY: get_mo_set,&
80 USE rt_propagation_types, ONLY: get_rtp,&
83#include "../base/base_uses.f90"
84
85 IMPLICIT NONE
86
87 PRIVATE
88
89 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'rt_delta_pulse'
90
91 PUBLIC :: apply_delta_pulse
92
93CONTAINS
94
95! **************************************************************************************************
96!> \brief Interface to call the delta pulse depending on the type of calculation.
97!> \param qs_env ...
98!> \param rtp ...
99!> \param rtp_control ...
100!> \author Update: Guillaume Le Breton (2023.01)
101! **************************************************************************************************
102
103 SUBROUTINE apply_delta_pulse(qs_env, rtp, rtp_control)
104 TYPE(qs_environment_type), POINTER :: qs_env
105 TYPE(rt_prop_type), POINTER :: rtp
106 TYPE(rtp_control_type), POINTER :: rtp_control
107
108 CHARACTER(LEN=3), DIMENSION(3) :: rlab
109 INTEGER :: i, output_unit
110 LOGICAL :: my_apply_pulse, periodic
111 REAL(kind=dp), DIMENSION(3) :: kvec
112 TYPE(cell_type), POINTER :: cell
113 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_new, mos_old
114 TYPE(cp_logger_type), POINTER :: logger
115 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
116 TYPE(dft_control_type), POINTER :: dft_control
117 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
118 TYPE(section_vals_type), POINTER :: input, rtp_section
119
120 NULLIFY (logger, input, rtp_section)
121
122 logger => cp_get_default_logger()
123 CALL get_qs_env(qs_env, &
124 cell=cell, &
125 input=input, &
126 dft_control=dft_control, &
127 matrix_s=matrix_s)
128 rtp_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION")
129 output_unit = cp_print_key_unit_nr(logger, rtp_section, "PRINT%PROGRAM_RUN_INFO", &
130 extension=".scfLog")
131 rlab = [CHARACTER(LEN=3) :: "X", "Y", "Z"]
132 periodic = any(cell%perd > 0) ! periodic cell
133 my_apply_pulse = .true.
134 CALL get_qs_env(qs_env, mos=mos)
135
136 IF (rtp%linear_scaling) THEN
137 IF (.NOT. ASSOCIATED(mos)) THEN
138 CALL cp_warn(__location__, "Delta Pulse not implemented for Linear-Scaling based ground "// &
139 "state calculation. If you want to perform a Linear-Scaling RTP from a "// &
140 "Linear-Scaling GS calculation you can do the following: (i) LSCF froms "// &
141 "scratch, (ii) MO-based SCF (for 1 SCF loop for instance) with the LSCF "// &
142 "result as a restart and (iii) linear scaling RTP + delta kick (for 1 "// &
143 "SCF loop for instance).")
144 my_apply_pulse = .false.
145 ELSE
146 ! create temporary mos_old and mos_new to use delta kick routine designed for MOs-based RTP
147 CALL rt_prop_create_mos(rtp, mos, qs_env%mpools, dft_control, &
148 init_mos_old=.true., init_mos_new=.true., &
149 init_mos_next=.false., init_mos_admn=.false.)
150 END IF
151 END IF
152
153 IF (my_apply_pulse) THEN
154 ! The amplitude of the perturbation for all the method, modulo some prefactor:
155 kvec(:) = cell%h_inv(1, :)*rtp_control%delta_pulse_direction(1) + &
156 cell%h_inv(2, :)*rtp_control%delta_pulse_direction(2) + &
157 cell%h_inv(3, :)*rtp_control%delta_pulse_direction(3)
158 kvec = kvec*twopi*rtp_control%delta_pulse_scale
159
160 CALL get_rtp(rtp=rtp, mos_old=mos_old, mos_new=mos_new)
161 IF (rtp_control%apply_delta_pulse) THEN
162 IF (dft_control%qs_control%dftb) THEN
163 CALL build_dftb_overlap(qs_env, 1, matrix_s)
164 END IF
165 IF (rtp_control%periodic) THEN
166 IF (output_unit > 0) THEN
167 WRITE (unit=output_unit, fmt="(/,(T3,A,T40))") &
168 "An Electric Delta Kick within periodic condition is applied before running RTP. "// &
169 "Its amplitude in atomic unit is:"
170 WRITE (output_unit, "(T3,3(A,A,E16.8,1X))") &
171 (trim(rlab(i)), "=", -kvec(i), i=1, 3)
172 END IF
173 CALL apply_delta_pulse_electric_periodic(qs_env, mos_old, mos_new, -kvec)
174 ELSE
175 cpwarn_if(periodic, "This application of the delta pulse is not compatible with PBC!")
176 IF (output_unit > 0) THEN
177 WRITE (unit=output_unit, fmt="(/,(T3,A,T40))") &
178 "An Electric Delta Kick within the length gauge is applied before running RTP. "// &
179 "Its amplitude in atomic unit is:"
180 WRITE (output_unit, "(T3,3(A,A,E16.8,1X))") &
181 (trim(rlab(i)), "=", -kvec(i), i=1, 3)
182 END IF
183 CALL apply_delta_pulse_electric(qs_env, mos_old, mos_new, -kvec)
184 END IF
185 ELSE IF (rtp_control%apply_delta_pulse_mag) THEN
186 cpwarn_if(periodic, "This application of the delta pulse is not compatible with PBC!")
187 ! The prefactor (strength of the magnetic field, should be divided by 2c)
188 IF (output_unit > 0) THEN
189 WRITE (unit=output_unit, fmt="(/,(T3,A,T40))") &
190 "A Magnetic Delta Kick is applied before running RTP. "// &
191 "Its amplitude in atomic unit is:"
192 WRITE (output_unit, "(T3,3(A,A,E16.8,1X))") &
193 (trim(rlab(i)), "=", -kvec(i)/2, i=1, 3)
194 END IF
195 CALL apply_delta_pulse_mag(qs_env, mos_old, mos_new, -kvec(:)/2)
196 ELSE
197 cpabort("Code error: this case should not happen!")
198 END IF
199 END IF
200
201 END SUBROUTINE apply_delta_pulse
202
203! **************************************************************************************************
204!> \brief uses perturbation theory to get the proper initial conditions
205!> The len_rep option is NOT compatible with periodic boundary conditions!
206!> \param qs_env ...
207!> \param mos_old ...
208!> \param mos_new ...
209!> \param kvec ...
210!> \author Joost & Martin (2011)
211! **************************************************************************************************
212
213 SUBROUTINE apply_delta_pulse_electric_periodic(qs_env, mos_old, mos_new, kvec)
214 TYPE(qs_environment_type), POINTER :: qs_env
215 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_old, mos_new
216 REAL(kind=dp), DIMENSION(3) :: kvec
217
218 CHARACTER(len=*), PARAMETER :: routinen = 'apply_delta_pulse_electric_periodic'
219
220 INTEGER :: handle, icol, idir, irow, ispin, nao, &
221 ncol_local, nmo, nrow_local, nvirt, &
222 reference
223 INTEGER, DIMENSION(:), POINTER :: col_indices, row_indices
224 LOGICAL :: com_nl, len_rep, periodic
225 REAL(kind=dp) :: eps_ppnl, factor
226 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :), &
227 POINTER :: local_data
228 REAL(kind=dp), DIMENSION(3) :: rcc
229 REAL(kind=dp), DIMENSION(:), POINTER :: eigenvalues, ref_point
230 TYPE(cell_type), POINTER :: cell
231 TYPE(cp_fm_struct_type), POINTER :: fm_struct, fm_struct_tmp
232 TYPE(cp_fm_type) :: eigenvectors, mat_ks, mat_tmp, momentum, &
233 s_chol, virtuals
234 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_r, matrix_rv, matrix_s
235 TYPE(dft_control_type), POINTER :: dft_control
236 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
237 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
238 POINTER :: sab_orb, sap_ppnl
239 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
240 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
241 TYPE(rt_prop_type), POINTER :: rtp
242 TYPE(rtp_control_type), POINTER :: rtp_control
243 TYPE(section_vals_type), POINTER :: input
244
245 CALL timeset(routinen, handle)
246
247 NULLIFY (cell, mos, rtp, matrix_s, matrix_ks, input, dft_control, particle_set, fm_struct)
248 ! we need the overlap and ks matrix for a full diagonalization
249 CALL get_qs_env(qs_env, &
250 cell=cell, &
251 mos=mos, &
252 rtp=rtp, &
253 matrix_s=matrix_s, &
254 matrix_ks=matrix_ks, &
255 dft_control=dft_control, &
256 input=input, &
257 particle_set=particle_set)
258
259 rtp_control => dft_control%rtp_control
260 periodic = any(cell%perd > 0) ! periodic cell
261
262 ! relevant input parameters
263 com_nl = section_get_lval(section_vals=input, keyword_name="DFT%REAL_TIME_PROPAGATION%COM_NL")
264 len_rep = section_get_lval(section_vals=input, keyword_name="DFT%REAL_TIME_PROPAGATION%LEN_REP")
265
266 ! calculate non-local commutator if necessary
267 IF (com_nl) THEN
268 CALL cite_reference(mattiat2019)
269 NULLIFY (qs_kind_set, sab_orb, sap_ppnl)
270 CALL get_qs_env(qs_env, &
271 sap_ppnl=sap_ppnl, &
272 sab_orb=sab_orb, &
273 qs_kind_set=qs_kind_set)
274 eps_ppnl = dft_control%qs_control%eps_ppnl
275
276 NULLIFY (matrix_rv)
277 CALL dbcsr_allocate_matrix_set(matrix_rv, 3)
278 DO idir = 1, 3
279 CALL dbcsr_init_p(matrix_rv(idir)%matrix)
280 CALL dbcsr_create(matrix_rv(idir)%matrix, template=matrix_s(1)%matrix, &
281 matrix_type=dbcsr_type_antisymmetric)
282 CALL cp_dbcsr_alloc_block_from_nbl(matrix_rv(idir)%matrix, sab_orb)
283 CALL dbcsr_set(matrix_rv(idir)%matrix, 0._dp)
284 END DO
285 CALL build_com_mom_nl(qs_kind_set, sab_orb, sap_ppnl, eps_ppnl, particle_set, cell, matrix_rv=matrix_rv)
286 END IF
287
288 ! calculate dipole moment matrix if required, NOT for periodic boundary conditions!
289 IF (len_rep) THEN
290 CALL cite_reference(mattiat2022)
291 cpwarn_if(periodic, "This application of the delta pulse is not compatible with PBC!")
292 ! get reference point
293 reference = section_get_ival(section_vals=input, &
294 keyword_name="DFT%PRINT%MOMENTS%REFERENCE")
295 NULLIFY (ref_point)
296 CALL section_vals_val_get(input, "DFT%PRINT%MOMENTS%REF_POINT", r_vals=ref_point)
297 CALL get_reference_point(rcc, qs_env=qs_env, reference=reference, ref_point=ref_point)
298
299 NULLIFY (sab_orb)
300 CALL get_qs_env(qs_env, sab_orb=sab_orb)
301 ! calculate dipole moment operator
302 NULLIFY (matrix_r)
303 CALL dbcsr_allocate_matrix_set(matrix_r, 3)
304 DO idir = 1, 3
305 CALL dbcsr_init_p(matrix_r(idir)%matrix)
306 CALL dbcsr_create(matrix_r(idir)%matrix, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_symmetric)
307 CALL cp_dbcsr_alloc_block_from_nbl(matrix_r(idir)%matrix, sab_orb)
308 CALL dbcsr_set(matrix_r(idir)%matrix, 0._dp)
309 END DO
310 CALL build_local_moment_matrix(qs_env, matrix_r, 1, rcc)
311 END IF
312
313 IF (rtp_control%velocity_gauge) THEN
314 rtp_control%vec_pot = rtp_control%vec_pot + kvec
315 END IF
316
317 ! struct for fm matrices
318 fm_struct => rtp%ao_ao_fmstruct
319
320 ! create matrices and get Cholesky decomposition of S
321 CALL cp_fm_create(mat_ks, matrix_struct=fm_struct, name="mat_ks")
322 CALL cp_fm_create(eigenvectors, matrix_struct=fm_struct, name="eigenvectors")
323 CALL cp_fm_create(s_chol, matrix_struct=fm_struct, name="S_chol")
324 CALL copy_dbcsr_to_fm(matrix_s(1)%matrix, s_chol)
325 CALL cp_fm_cholesky_decompose(s_chol)
326
327 ! get number of atomic orbitals
328 CALL dbcsr_get_info(matrix_s(1)%matrix, nfullrows_total=nao)
329
330 DO ispin = 1, SIZE(matrix_ks)
331 ! diagonalize KS matrix to get occ and virt mos
332 ALLOCATE (eigenvalues(nao))
333 CALL cp_fm_create(mat_tmp, matrix_struct=fm_struct, name="mat_tmp")
334 CALL copy_dbcsr_to_fm(matrix_ks(ispin)%matrix, mat_ks)
335 CALL cp_fm_cholesky_reduce(mat_ks, s_chol)
336 CALL cp_fm_syevd(mat_ks, mat_tmp, eigenvalues)
337 CALL cp_fm_cholesky_restore(mat_tmp, nao, s_chol, eigenvectors, "SOLVE")
338
339 ! virtuals
340 CALL get_mo_set(mo_set=mos(ispin), nmo=nmo)
341 nvirt = nao - nmo
342 CALL cp_fm_struct_create(fm_struct_tmp, para_env=fm_struct%para_env, context=fm_struct%context, &
343 nrow_global=nao, ncol_global=nvirt)
344 CALL cp_fm_create(virtuals, matrix_struct=fm_struct_tmp, name="virtuals")
345 CALL cp_fm_struct_release(fm_struct_tmp)
346 CALL cp_fm_to_fm(eigenvectors, virtuals, nvirt, nmo + 1, 1)
347
348 ! occupied
349 CALL cp_fm_to_fm(eigenvectors, mos_old(2*ispin - 1), nmo, 1, 1)
350
351 CALL cp_fm_struct_create(fm_struct_tmp, para_env=fm_struct%para_env, context=fm_struct%context, &
352 nrow_global=nvirt, ncol_global=nmo)
353 CALL cp_fm_create(momentum, matrix_struct=fm_struct_tmp, name="momentum")
354 CALL cp_fm_struct_release(fm_struct_tmp)
355
356 ! the momentum operator (in a given direction)
357 CALL cp_fm_set_all(mos_new(2*ispin - 1), 0.0_dp)
358
359 DO idir = 1, 3
360 factor = kvec(idir)
361 IF (factor /= 0.0_dp) THEN
362 IF (.NOT. len_rep) THEN
363 CALL cp_dbcsr_sm_fm_multiply(matrix_s(idir + 1)%matrix, mos_old(2*ispin - 1), &
364 mos_old(2*ispin), ncol=nmo)
365 ELSE
366 CALL cp_dbcsr_sm_fm_multiply(matrix_r(idir)%matrix, mos_old(2*ispin - 1), &
367 mos_old(2*ispin), ncol=nmo)
368 END IF
369
370 CALL cp_fm_scale_and_add(1.0_dp, mos_new(2*ispin - 1), factor, mos_old(2*ispin))
371 IF (com_nl) THEN
372 CALL cp_fm_set_all(mos_old(2*ispin), 0.0_dp)
373 CALL cp_dbcsr_sm_fm_multiply(matrix_rv(idir)%matrix, mos_old(2*ispin - 1), &
374 mos_old(2*ispin), ncol=nmo)
375 CALL cp_fm_scale_and_add(1.0_dp, mos_new(2*ispin - 1), factor, mos_old(2*ispin))
376 END IF
377 END IF
378 END DO
379
380 CALL parallel_gemm('T', 'N', nvirt, nmo, nao, 1.0_dp, virtuals, mos_new(2*ispin - 1), 0.0_dp, momentum)
381
382 ! the tricky bit ... rescale by the eigenvalue difference
383 IF (.NOT. len_rep) THEN
384 CALL cp_fm_get_info(momentum, nrow_local=nrow_local, ncol_local=ncol_local, &
385 row_indices=row_indices, col_indices=col_indices, local_data=local_data)
386 DO icol = 1, ncol_local
387 DO irow = 1, nrow_local
388 factor = 1/(eigenvalues(col_indices(icol)) - eigenvalues(nmo + row_indices(irow)))
389 local_data(irow, icol) = factor*local_data(irow, icol)
390 END DO
391 END DO
392 END IF
393 CALL cp_fm_release(mat_tmp)
394 DEALLOCATE (eigenvalues)
395
396 ! now obtain the initial condition in mos_old
397 CALL cp_fm_to_fm(eigenvectors, mos_old(2*ispin - 1), nmo, 1, 1)
398 CALL parallel_gemm("N", "N", nao, nmo, nvirt, 1.0_dp, virtuals, momentum, 0.0_dp, mos_old(2*ispin))
399
400 CALL cp_fm_release(virtuals)
401 CALL cp_fm_release(momentum)
402 END DO
403
404 ! release matrices
405 CALL cp_fm_release(s_chol)
406 CALL cp_fm_release(mat_ks)
407 CALL cp_fm_release(eigenvectors)
408 IF (com_nl) CALL dbcsr_deallocate_matrix_set(matrix_rv)
409 IF (len_rep) CALL dbcsr_deallocate_matrix_set(matrix_r)
410
411 ! orthonormalize afterwards
412 CALL orthonormalize_complex_mos(qs_env, mos_old)
413
414 CALL timestop(handle)
415
416 END SUBROUTINE apply_delta_pulse_electric_periodic
417
418! **************************************************************************************************
419!> \brief applies exp(ikr) to the wavefunction.... stored in mos_old...
420!> \param qs_env ...
421!> \param mos_old ...
422!> \param mos_new ...
423!> \param kvec ...
424!> \author Joost & Martin (2011)
425! **************************************************************************************************
426
427 SUBROUTINE apply_delta_pulse_electric(qs_env, mos_old, mos_new, kvec)
428 TYPE(qs_environment_type), POINTER :: qs_env
429 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_old, mos_new
430 REAL(kind=dp), DIMENSION(3) :: kvec
431
432 CHARACTER(len=*), PARAMETER :: routinen = 'apply_delta_pulse_electric'
433
434 INTEGER :: handle, i, nao, nmo
435 TYPE(cell_type), POINTER :: cell
436 TYPE(cp_fm_type) :: s_inv_fm, tmp
437 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
438 TYPE(dbcsr_type), POINTER :: cosmat, sinmat
439 TYPE(dft_control_type), POINTER :: dft_control
440 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
441 TYPE(rt_prop_type), POINTER :: rtp
442 TYPE(rtp_control_type), POINTER :: rtp_control
443
444 CALL timeset(routinen, handle)
445 NULLIFY (cell, dft_control, matrix_s, mos, rtp, rtp_control)
446 CALL get_qs_env(qs_env, &
447 cell=cell, &
448 dft_control=dft_control, &
449 matrix_s=matrix_s, &
450 mos=mos, &
451 rtp=rtp)
452 rtp_control => dft_control%rtp_control
453
454 IF (rtp_control%velocity_gauge) THEN
455 rtp_control%vec_pot = rtp_control%vec_pot + kvec
456 END IF
457
458 ! calculate exponentials (= Berry moments)
459 NULLIFY (cosmat, sinmat)
460 ALLOCATE (cosmat, sinmat)
461 CALL dbcsr_copy(cosmat, matrix_s(1)%matrix, 'COS MOM')
462 CALL dbcsr_copy(sinmat, matrix_s(1)%matrix, 'SIN MOM')
463 CALL build_berry_moment_matrix(qs_env, cosmat, sinmat, kvec)
464
465 ! need inverse of overlap matrix
466 CALL cp_fm_create(s_inv_fm, matrix_struct=rtp%ao_ao_fmstruct, name="S_inv_fm")
467 CALL cp_fm_create(tmp, matrix_struct=rtp%ao_ao_fmstruct, name="tmp_mat")
468 CALL copy_dbcsr_to_fm(matrix_s(1)%matrix, s_inv_fm)
469 CALL cp_fm_cholesky_decompose(s_inv_fm)
470 CALL cp_fm_cholesky_invert(s_inv_fm)
471 CALL cp_fm_uplo_to_full(s_inv_fm, tmp)
472 CALL cp_fm_release(tmp)
473
474 DO i = 1, SIZE(mos)
475 ! apply exponentials to mo coefficients
476 CALL get_mo_set(mos(i), nao=nao, nmo=nmo)
477 CALL cp_dbcsr_sm_fm_multiply(cosmat, mos(i)%mo_coeff, mos_new(2*i - 1), ncol=nmo)
478 CALL cp_dbcsr_sm_fm_multiply(sinmat, mos(i)%mo_coeff, mos_new(2*i), ncol=nmo)
479
480 CALL parallel_gemm("N", "N", nao, nmo, nao, 1.0_dp, s_inv_fm, mos_new(2*i - 1), 0.0_dp, mos_old(2*i - 1))
481 CALL parallel_gemm("N", "N", nao, nmo, nao, 1.0_dp, s_inv_fm, mos_new(2*i), 0.0_dp, mos_old(2*i))
482 END DO
483
484 CALL cp_fm_release(s_inv_fm)
485 CALL dbcsr_deallocate_matrix(cosmat)
486 CALL dbcsr_deallocate_matrix(sinmat)
487
488 ! orthonormalize afterwards
489 CALL orthonormalize_complex_mos(qs_env, mos_old)
490
491 CALL timestop(handle)
492
493 END SUBROUTINE apply_delta_pulse_electric
494
495! **************************************************************************************************
496!> \brief apply magnetic delta pulse to linear order
497!> \param qs_env ...
498!> \param mos_old ...
499!> \param mos_new ...
500!> \param kvec ...
501! **************************************************************************************************
502 SUBROUTINE apply_delta_pulse_mag(qs_env, mos_old, mos_new, kvec)
503 TYPE(qs_environment_type), POINTER :: qs_env
504 TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_old, mos_new
505 REAL(kind=dp), DIMENSION(3) :: kvec
506
507 CHARACTER(len=*), PARAMETER :: routinen = 'apply_delta_pulse_mag'
508
509 INTEGER :: gauge_orig, handle, idir, ispin, nao, &
510 nmo, nrow_global, nvirt
511 REAL(kind=dp) :: eps_ppnl, factor
512 REAL(kind=dp), DIMENSION(3) :: rcc
513 REAL(kind=dp), DIMENSION(:), POINTER :: eigenvalues, ref_point
514 TYPE(cell_type), POINTER :: cell
515 TYPE(cp_fm_struct_type), POINTER :: fm_struct_tmp
516 TYPE(cp_fm_type) :: eigenvectors, mat_ks, perturbation, &
517 s_chol, virtuals
518 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_mag, matrix_nl, &
519 matrix_s
520 TYPE(dft_control_type), POINTER :: dft_control
521 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
522 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
523 POINTER :: sab_all, sab_orb, sap_ppnl
524 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
525 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
526 TYPE(rt_prop_type), POINTER :: rtp
527 TYPE(section_vals_type), POINTER :: input
528
529 CALL timeset(routinen, handle)
530
531 CALL cite_reference(mattiat2022)
532
533 NULLIFY (rtp, dft_control, matrix_ks, matrix_s, input, mos, cell, sab_orb, sab_all, sap_ppnl, &
534 qs_kind_set, particle_set)
535
536 CALL get_qs_env(qs_env, &
537 rtp=rtp, &
538 dft_control=dft_control, &
539 mos=mos, &
540 matrix_ks=matrix_ks, &
541 matrix_s=matrix_s, &
542 input=input, &
543 cell=cell, &
544 sab_orb=sab_orb, &
545 sab_all=sab_all, &
546 sap_ppnl=sap_ppnl)
547
548 gauge_orig = section_get_ival(section_vals=input, &
549 keyword_name="DFT%REAL_TIME_PROPAGATION%GAUGE_ORIG")
550 NULLIFY (ref_point)
551 CALL section_vals_val_get(input, "DFT%REAL_TIME_PROPAGATION%GAUGE_ORIG_MANUAL", r_vals=ref_point)
552 CALL get_reference_point(rcc, qs_env=qs_env, reference=gauge_orig, ref_point=ref_point)
553
554 ! Create fm matrices
555 CALL cp_fm_create(s_chol, matrix_struct=rtp%ao_ao_fmstruct, name='Cholesky S')
556 CALL cp_fm_create(eigenvectors, matrix_struct=rtp%ao_ao_fmstruct, name="gs evecs fm")
557 CALL cp_fm_create(mat_ks, matrix_struct=rtp%ao_ao_fmstruct, name='KS matrix')
558
559 ! get nrows_global
560 CALL cp_fm_get_info(mat_ks, nrow_global=nrow_global)
561
562 ! cholesky decomposition of overlap matrix
563 CALL copy_dbcsr_to_fm(matrix_s(1)%matrix, s_chol)
564 CALL cp_fm_cholesky_decompose(s_chol)
565
566 ! initiate perturbation matrix
567 NULLIFY (matrix_mag)
568 CALL dbcsr_allocate_matrix_set(matrix_mag, 3)
569 DO idir = 1, 3
570 CALL dbcsr_init_p(matrix_mag(idir)%matrix)
571 CALL dbcsr_create(matrix_mag(idir)%matrix, template=matrix_s(1)%matrix, &
572 matrix_type=dbcsr_type_antisymmetric)
573 CALL cp_dbcsr_alloc_block_from_nbl(matrix_mag(idir)%matrix, sab_orb)
574 CALL dbcsr_set(matrix_mag(idir)%matrix, 0._dp)
575 END DO
576 ! construct magnetic dipole moment matrix
577 CALL build_local_magmom_matrix(qs_env, matrix_mag, 1, ref_point=rcc)
578
579 ! work matrix for non-local potential part if necessary
580 NULLIFY (matrix_nl)
581 IF (ASSOCIATED(sap_ppnl)) THEN
582 CALL dbcsr_allocate_matrix_set(matrix_nl, 3)
583 DO idir = 1, 3
584 CALL dbcsr_init_p(matrix_nl(idir)%matrix)
585 CALL dbcsr_create(matrix_nl(idir)%matrix, template=matrix_s(1)%matrix, &
586 matrix_type=dbcsr_type_antisymmetric)
587 CALL cp_dbcsr_alloc_block_from_nbl(matrix_nl(idir)%matrix, sab_orb)
588 CALL dbcsr_set(matrix_nl(idir)%matrix, 0._dp)
589 END DO
590 ! construct non-local contribution
591 CALL get_qs_env(qs_env, &
592 qs_kind_set=qs_kind_set, &
593 particle_set=particle_set)
594 eps_ppnl = dft_control%qs_control%eps_ppnl
595
596 CALL build_com_nl_mag(qs_kind_set, sab_orb, sap_ppnl, eps_ppnl, particle_set, matrix_nl, rcc, cell)
597
598 DO idir = 1, 3
599 CALL dbcsr_add(matrix_mag(idir)%matrix, matrix_nl(idir)%matrix, -one, one)
600 END DO
601
602 CALL dbcsr_deallocate_matrix_set(matrix_nl)
603 END IF
604
605 DO ispin = 1, dft_control%nspins
606 ! allocate eigenvalues
607 NULLIFY (eigenvalues)
608 ALLOCATE (eigenvalues(nrow_global))
609 ! diagonalize KS matrix in AO basis using Cholesky decomp. of S
610 CALL copy_dbcsr_to_fm(matrix_ks(ispin)%matrix, mat_ks)
611 CALL cp_fm_cholesky_reduce(mat_ks, s_chol)
612 CALL cp_fm_syevd(mat_ks, eigenvectors, eigenvalues)
613 CALL cp_fm_triangular_multiply(s_chol, eigenvectors, invert_tr=.true.)
614
615 ! virtuals
616 CALL get_mo_set(mo_set=mos(ispin), nao=nao, nmo=nmo)
617 nvirt = nao - nmo
618 CALL cp_fm_struct_create(fm_struct_tmp, para_env=rtp%ao_ao_fmstruct%para_env, context=rtp%ao_ao_fmstruct%context, &
619 nrow_global=nrow_global, ncol_global=nvirt)
620 CALL cp_fm_create(virtuals, matrix_struct=fm_struct_tmp, name="virtuals")
621 CALL cp_fm_struct_release(fm_struct_tmp)
622 CALL cp_fm_to_fm(eigenvectors, virtuals, nvirt, nmo + 1, 1)
623
624 ! occupied
625 CALL cp_fm_to_fm(eigenvectors, mos_old(2*ispin - 1), nmo, 1, 1)
626
627 CALL cp_fm_struct_create(fm_struct_tmp, para_env=rtp%ao_ao_fmstruct%para_env, context=rtp%ao_ao_fmstruct%context, &
628 nrow_global=nvirt, ncol_global=nmo)
629 CALL cp_fm_create(perturbation, matrix_struct=fm_struct_tmp, name="perturbation")
630 CALL cp_fm_struct_release(fm_struct_tmp)
631
632 ! apply perturbation
633 CALL cp_fm_set_all(mos_new(2*ispin - 1), 0.0_dp)
634
635 DO idir = 1, 3
636 factor = kvec(idir)
637 IF (factor /= 0.0_dp) THEN
638 CALL cp_dbcsr_sm_fm_multiply(matrix_mag(idir)%matrix, mos_old(2*ispin - 1), &
639 mos_old(2*ispin), ncol=nmo)
640 CALL cp_fm_scale_and_add(1.0_dp, mos_new(2*ispin - 1), factor, mos_old(2*ispin))
641 END IF
642 END DO
643
644 CALL parallel_gemm('T', 'N', nvirt, nmo, nao, 1.0_dp, virtuals, mos_new(2*ispin - 1), 0.0_dp, perturbation)
645
646 DEALLOCATE (eigenvalues)
647
648 ! now obtain the initial condition in mos_old
649 CALL cp_fm_to_fm(eigenvectors, mos_old(2*ispin - 1), nmo, 1, 1)
650 CALL parallel_gemm("N", "N", nao, nmo, nvirt, 1.0_dp, virtuals, perturbation, 0.0_dp, mos_old(2*ispin))
651
652 CALL cp_fm_release(virtuals)
653 CALL cp_fm_release(perturbation)
654 END DO
655
656 ! deallocations
657 CALL cp_fm_release(s_chol)
658 CALL cp_fm_release(mat_ks)
659 CALL cp_fm_release(eigenvectors)
660 CALL dbcsr_deallocate_matrix_set(matrix_mag)
661
662 ! orthonormalize afterwards
663 CALL orthonormalize_complex_mos(qs_env, mos_old)
664
665 CALL timestop(handle)
666
667 END SUBROUTINE apply_delta_pulse_mag
668
669! **************************************************************************************************
670!> \brief orthonormalize complex mos, e. g. after non-unitary transformations using Löwdin's algorithm
671!> \param qs_env ...
672!> \param coeffs ...
673! **************************************************************************************************
674 SUBROUTINE orthonormalize_complex_mos(qs_env, coeffs)
675 TYPE(qs_environment_type), POINTER :: qs_env
676 TYPE(cp_fm_type), DIMENSION(:), INTENT(INOUT), &
677 POINTER :: coeffs
678
679 COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:) :: eigenvalues_sqrt
680 INTEGER :: im, ispin, j, nao, nmo, nspins, re
681 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: eigenvalues
682 TYPE(cp_blacs_env_type), POINTER :: blacs_env
683 TYPE(cp_cfm_type) :: oo_c, oo_v, oo_vt
684 TYPE(cp_fm_struct_type), POINTER :: fm_struct_tmp
685 TYPE(cp_fm_type) :: oo_1, oo_2, s_fm, tmp
686 TYPE(cp_fm_type), DIMENSION(2) :: coeffs_tmp
687 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
688 TYPE(dft_control_type), POINTER :: dft_control
689 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
690 TYPE(mp_para_env_type), POINTER :: para_env
691
692 NULLIFY (para_env, blacs_env, dft_control, matrix_s, mos)
693 CALL get_qs_env(qs_env, &
694 blacs_env=blacs_env, &
695 dft_control=dft_control, &
696 matrix_s=matrix_s, &
697 mos=mos, &
698 para_env=para_env)
699 nspins = dft_control%nspins
700 CALL cp_fm_get_info(coeffs(1), nrow_global=nao)
701
702 ! get overlap matrix
703 CALL cp_fm_struct_create(fm_struct_tmp, nrow_global=nao, ncol_global=nao, &
704 context=blacs_env, para_env=para_env)
705 CALL cp_fm_create(s_fm, matrix_struct=fm_struct_tmp, name="overlap fm")
706 CALL cp_fm_struct_release(fm_struct_tmp)
707 ! copy overlap matrix
708 CALL copy_dbcsr_to_fm(matrix_s(1)%matrix, s_fm)
709
710 DO ispin = 1, nspins
711 CALL get_mo_set(mos(ispin), nmo=nmo)
712 CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
713 nrow_global=nmo, ncol_global=nmo)
714 CALL cp_fm_create(oo_1, matrix_struct=fm_struct_tmp, name="oo_1")
715 CALL cp_fm_create(oo_2, matrix_struct=fm_struct_tmp, name="oo_2")
716 CALL cp_fm_struct_release(fm_struct_tmp)
717
718 CALL cp_fm_create(tmp, matrix_struct=coeffs(2*ispin - 1)%matrix_struct, name="tmp_mat")
719 ! get the complex overlap matrix in MO basis
720 ! x^T S x + y^T S y + i (-y^TS x+x^T S y)
721 CALL parallel_gemm("N", "N", nao, nmo, nao, 1.0_dp, s_fm, coeffs(2*ispin - 1), 0.0_dp, tmp)
722 CALL parallel_gemm("T", "N", nmo, nmo, nao, 1.0_dp, coeffs(2*ispin - 1), tmp, 0.0_dp, oo_1)
723 CALL parallel_gemm("T", "N", nmo, nmo, nao, -1.0_dp, coeffs(2*ispin), tmp, 0.0_dp, oo_2)
724
725 CALL parallel_gemm("N", "N", nao, nmo, nao, 1.0_dp, s_fm, coeffs(2*ispin), 0.0_dp, tmp)
726 CALL parallel_gemm("T", "N", nmo, nmo, nao, 1.0_dp, coeffs(2*ispin), tmp, 1.0_dp, oo_1)
727 CALL parallel_gemm("T", "N", nmo, nmo, nao, 1.0_dp, coeffs(2*ispin - 1), tmp, 1.0_dp, oo_2)
728 CALL cp_fm_release(tmp)
729
730 ! complex Löwdin
731 CALL cp_cfm_create(oo_c, oo_1%matrix_struct)
732 CALL cp_cfm_create(oo_v, oo_1%matrix_struct)
733 CALL cp_cfm_create(oo_vt, oo_1%matrix_struct)
734 oo_c%local_data = cmplx(oo_1%local_data, oo_2%local_data, kind=dp)
735
736 ALLOCATE (eigenvalues(nmo))
737 ALLOCATE (eigenvalues_sqrt(nmo))
738 CALL cp_cfm_heevd(oo_c, oo_v, eigenvalues)
739 eigenvalues_sqrt(:) = cmplx(one/sqrt(eigenvalues(:)), zero, dp)
740 CALL cp_cfm_to_cfm(oo_v, oo_vt)
741 CALL cp_cfm_column_scale(oo_v, eigenvalues_sqrt)
742 DEALLOCATE (eigenvalues)
743 DEALLOCATE (eigenvalues_sqrt)
744 CALL parallel_gemm('N', 'C', nmo, nmo, nmo, (1.0_dp, 0.0_dp), &
745 oo_v, oo_vt, (0.0_dp, 0.0_dp), oo_c)
746 oo_1%local_data = real(oo_c%local_data, kind=dp)
747 oo_2%local_data = aimag(oo_c%local_data)
748 CALL cp_cfm_release(oo_c)
749 CALL cp_cfm_release(oo_v)
750 CALL cp_cfm_release(oo_vt)
751
752 ! transform coefficients accordingly
753 DO j = 1, 2
754 CALL cp_fm_create(coeffs_tmp(j), matrix_struct=coeffs(2*(ispin - 1) + j)%matrix_struct)
755 END DO
756
757 ! indices for coeffs_tmp
758 re = 1
759 im = 2
760 CALL parallel_gemm("N", "N", nao, nmo, nmo, one, coeffs(2*ispin - 1), oo_1, zero, coeffs_tmp(re))
761 CALL parallel_gemm("N", "N", nao, nmo, nmo, one, coeffs(2*ispin - 1), oo_2, zero, coeffs_tmp(im))
762
763 CALL parallel_gemm("N", "N", nao, nmo, nmo, -one, coeffs(2*ispin), oo_2, zero, coeffs(2*ispin - 1))
764 CALL cp_fm_scale_and_add(one, coeffs(2*ispin - 1), one, coeffs_tmp(re))
765
766 CALL parallel_gemm("N", "N", nao, nmo, nmo, one, coeffs(2*ispin), oo_1, one, coeffs_tmp(im))
767 CALL cp_fm_to_fm(coeffs_tmp(im), coeffs(2*ispin))
768
769 DO j = 1, 2
770 CALL cp_fm_release(coeffs_tmp(j))
771 END DO
772 CALL cp_fm_release(oo_1)
773 CALL cp_fm_release(oo_2)
774 END DO
775 CALL cp_fm_release(s_fm)
776
777 END SUBROUTINE orthonormalize_complex_mos
778
779END MODULE rt_delta_pulse
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public mattiat2022
integer, save, public mattiat2019
Handles all functions related to the CELL.
Definition cell_types.F:15
Calculation of the non-local pseudopotential contribution to the core Hamiltonian <a|V(non-local)|b> ...
subroutine, public build_com_mom_nl(qs_kind_set, sab_all, sap_ppnl, eps_ppnl, particle_set, cell, matrix_rv, matrix_rxrv, matrix_rrv, matrix_rvr, matrix_rrv_vrr, matrix_r_rxvr, matrix_rxvr_r, matrix_r_doublecom, pseudoatom, ref_point)
Calculate [r,Vnl] (matrix_rv), r x [r,Vnl] (matrix_rxrv) or [rr,Vnl] (matrix_rrv) in AO basis....
subroutine, public build_com_nl_mag(qs_kind_set, sab_all, sap_ppnl, eps_ppnl, particle_set, matrix_mag_nl, refpoint, cell)
calculate \sum_R_ps (R_ps - R_nu) x [V_nl, r] summing over all pseudized atoms R
methods related to the blacs parallel environment
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_column_scale(matrix_a, scaling)
Scales columns of the full matrix by corresponding factors.
used for collecting diagonalization schemes available for cp_cfm_type
Definition cp_cfm_diag.F:14
subroutine, public cp_cfm_heevd(matrix, eigenvectors, eigenvalues)
Perform a diagonalisation of a complex matrix.
Definition cp_cfm_diag.F:74
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_deallocate_matrix(matrix)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_init_p(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
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
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS 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....
subroutine, public cp_fm_uplo_to_full(matrix, work, uplo)
given a triangular matrix according to uplo, computes the corresponding full matrix
subroutine, public cp_fm_triangular_multiply(triangular_matrix, matrix_b, side, transpose_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_fm_cholesky_invert(matrix, n, info_out)
used to replace the cholesky decomposition by the inverse
subroutine, public cp_fm_cholesky_restore(fm_matrix, neig, fm_matrixb, fm_matrixout, op, pos, transa)
apply Cholesky decomposition op can be "SOLVE" (out = U^-1 * in) or "MULTIPLY" (out = U * in) pos can...
subroutine, public cp_fm_cholesky_decompose(matrix, n, info_out)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
subroutine, public cp_fm_cholesky_reduce(matrix, matrixb, itype)
reduce a matrix pencil A,B to normal form B has to be cholesky decomposed with cp_fm_cholesky_decompo...
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
Definition cp_fm_diag.F:17
subroutine, public cp_fm_syevd(matrix, eigenvectors, eigenvalues, info)
Computes all eigenvalues and vectors of a real symmetric matrix significantly faster than syevx,...
Definition cp_fm_diag.F:573
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_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_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
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)
...
objects that represent the structure of input sections and the data contained in an input section
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
Definition of mathematical constants and functions.
real(kind=dp), parameter, public one
real(kind=dp), parameter, public twopi
real(kind=dp), parameter, public zero
Interface to the message passing library MPI.
Calculates the moment integrals <a|r^m|b>
subroutine, public get_reference_point(rpoint, drpoint, qs_env, fist_env, reference, ref_point, ifirst, ilast)
...
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
Calculation of Overlap and Hamiltonian matrices in DFTB.
subroutine, public build_dftb_overlap(qs_env, nderivative, matrix_s)
...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
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.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
Definition qs_moments.F:14
subroutine, public build_local_magmom_matrix(qs_env, magmom, nmoments, ref_point, ref_points, basis_type)
...
subroutine, public build_local_moment_matrix(qs_env, moments, nmoments, ref_point, ref_points, basis_type)
...
Definition qs_moments.F:593
subroutine, public build_berry_moment_matrix(qs_env, cosmat, sinmat, kvec, sab_orb_external, basis_type)
...
Define the neighbor list data types and the corresponding functionality.
Routines to apply a delta pulse for RTP and EMD.
subroutine, public apply_delta_pulse(qs_env, rtp, rtp_control)
Interface to call the delta pulse depending on the type of calculation.
Types and set_get for real time propagation depending on runtype and diagonalization method different...
subroutine, public rt_prop_create_mos(rtp, mos, mpools, dft_control, mos_aux, init_mos_old, init_mos_new, init_mos_next, init_mos_admn)
Initialize the mos for rtp.
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)
...
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
Represent a 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...
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.