(git:375a5ce)
Loading...
Searching...
No Matches
qs_tddfpt2_forces.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
9 USE admm_types, ONLY: admm_type,&
14 USE bibliography, ONLY: hehn2022,&
15 hehn2024,&
17 cite_reference
20 USE cp_dbcsr_api, ONLY: &
22 dbcsr_release, dbcsr_scale, dbcsr_set, dbcsr_type, dbcsr_type_antisymmetric
51 USE hfx_ri, ONLY: hfx_ri_update_ks
52 USE hfx_types, ONLY: hfx_type
55 oe_shift,&
63 USE kinds, ONLY: default_string_length,&
64 dp
66 USE mulliken, ONLY: ao_charges
69 USE pw_env_types, ONLY: pw_env_get,&
71 USE pw_methods, ONLY: pw_axpy,&
72 pw_scale,&
78 USE pw_types, ONLY: pw_c1d_gs_type,&
92 USE qs_fxc, ONLY: qs_fxc_create
94 USE qs_integrate_potential, ONLY: integrate_v_rspace
96 USE qs_kind_types, ONLY: get_qs_kind,&
99 USE qs_ks_atom, ONLY: update_ks_atom
102 USE qs_ks_types, ONLY: qs_ks_env_type
106 USE qs_mo_types, ONLY: get_mo_set,&
113 USE qs_rho0_methods, ONLY: init_rho0
118 USE qs_rho_types, ONLY: qs_rho_create,&
119 qs_rho_get,&
120 qs_rho_set,&
131 USE xtb_types, ONLY: get_xtb_atom_param,&
133#include "./base/base_uses.f90"
134
135 IMPLICIT NONE
136
137 PRIVATE
138
139 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_tddfpt2_forces'
140
141 PUBLIC :: tddfpt_forces_main
142
143! **************************************************************************************************
144
145CONTAINS
146
147! **************************************************************************************************
148!> \brief Perform TDDFPT gradient calculation. This routine calculates the response vector R of Eq. 49
149!> in J. Chem. Theory Comput. 2022, 18, 4186−4202 (https://doi.org/10.1021/acs.jctc.2c00144)
150!> in ex_env%cpmos and a few contributions to the gradient.
151!> \param qs_env Quickstep environment
152!> \param gs_mos ...
153!> \param ex_env Holds: Response vector ex_env%cpmos = R
154!> Difference density ex_env%matrix_pe = T
155!> Matrix ex_env%matrix_hz = H_munu[T]
156!> \param kernel_env ...
157!> \param sub_env ...
158!> \param work_matrices ...
159!> \par History
160!> * 10.2022 created JHU
161! **************************************************************************************************
162 SUBROUTINE tddfpt_forces_main(qs_env, gs_mos, ex_env, kernel_env, sub_env, work_matrices)
163 TYPE(qs_environment_type), POINTER :: qs_env
164 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
165 POINTER :: gs_mos
166 TYPE(excited_energy_type), POINTER :: ex_env
167 TYPE(kernel_env_type) :: kernel_env
168 TYPE(tddfpt_subgroup_env_type) :: sub_env
169 TYPE(tddfpt_work_matrices) :: work_matrices
170
171 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_forces_main'
172
173 INTEGER :: handle, ispin, nspins, spin
174 LOGICAL :: do_sf
175 TYPE(admm_type), POINTER :: admm_env
176 TYPE(cp_fm_struct_type), POINTER :: matrix_struct
177 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_pe_asymm, matrix_pe_symm, &
178 matrix_s, matrix_s_aux_fit
179 TYPE(dft_control_type), POINTER :: dft_control
180 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
181
182 CALL timeset(routinen, handle)
183
184 CALL get_qs_env(qs_env, dft_control=dft_control)
185
186 CALL cite_reference(hehn2022)
187 CALL cite_reference(hehn2024)
188 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc) CALL cite_reference(sertcan2024)
189
190 nspins = dft_control%nspins
191 tddfpt_control => dft_control%tddfpt2_control
192 IF (tddfpt_control%spinflip == no_sf_tddfpt) THEN
193 do_sf = .false.
194 ELSE
195 do_sf = .true.
196 END IF
197
198 ! disable RES-TDDFPT for now
199 DO ispin = 1, nspins
200 IF (gs_mos(ispin)%nmo_occ /= gs_mos(ispin)%nmo_active) THEN
201 CALL cp_abort(__location__, "RES-TDDFPT Forces NYA")
202 END IF
203 END DO
204
205 ! rhs of linres equation
206 IF (ASSOCIATED(ex_env%cpmos)) THEN
207 DO ispin = 1, SIZE(ex_env%cpmos)
208 CALL cp_fm_release(ex_env%cpmos(ispin))
209 END DO
210 DEALLOCATE (ex_env%cpmos)
211 END IF
212 ALLOCATE (ex_env%cpmos(nspins))
213 ! Create and initialize rectangular matrices of nao*occ dimension for alpha and beta R vectors
214 ! for the Z-vector equation system: AZ=-R
215 DO ispin = 1, nspins
216 CALL cp_fm_get_info(gs_mos(ispin)%mos_occ, matrix_struct=matrix_struct)
217 CALL cp_fm_create(ex_env%cpmos(ispin), matrix_struct)
218 CALL cp_fm_set_all(ex_env%cpmos(ispin), 0.0_dp)
219 END DO
220 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
221 NULLIFY (matrix_pe_asymm, matrix_pe_symm)
222
223 ! Build difference density matrix_pe = X*X^T - (C*X^T*S*X*C^T + (C*X^T*S*X*C^T)^T)/2
224 !
225 CALL dbcsr_allocate_matrix_set(ex_env%matrix_pe, nspins)
226 CALL dbcsr_allocate_matrix_set(matrix_pe_symm, nspins)
227 CALL dbcsr_allocate_matrix_set(matrix_pe_asymm, nspins)
228 DO ispin = 1, nspins
229
230 ! Initialize matrix_pe as a sparse matrix with zeros
231 ALLOCATE (ex_env%matrix_pe(ispin)%matrix)
232 CALL dbcsr_create(ex_env%matrix_pe(ispin)%matrix, template=matrix_s(1)%matrix)
233 CALL dbcsr_copy(ex_env%matrix_pe(ispin)%matrix, matrix_s(1)%matrix)
234 CALL dbcsr_set(ex_env%matrix_pe(ispin)%matrix, 0.0_dp)
235
236 ALLOCATE (matrix_pe_symm(ispin)%matrix)
237 CALL dbcsr_create(matrix_pe_symm(ispin)%matrix, template=matrix_s(1)%matrix)
238 CALL dbcsr_copy(matrix_pe_symm(ispin)%matrix, ex_env%matrix_pe(ispin)%matrix)
239
240 ALLOCATE (matrix_pe_asymm(ispin)%matrix)
241 CALL dbcsr_create(matrix_pe_asymm(ispin)%matrix, template=matrix_s(1)%matrix, &
242 matrix_type=dbcsr_type_antisymmetric)
243 CALL dbcsr_complete_redistribute(ex_env%matrix_pe(ispin)%matrix, matrix_pe_asymm(ispin)%matrix)
244
245 IF (do_sf) THEN
246 spin = 1
247 ELSE
248 spin = ispin
249 END IF
250 ! Add difference density to matrix_pe
251 CALL tddfpt_resvec1(ex_env%evect(spin), gs_mos(spin)%mos_active, &
252 matrix_s(1)%matrix, ex_env%matrix_pe(ispin)%matrix, ispin, do_sf)
253 END DO
254 !
255 ! Project the difference density into auxiliary basis for ADMM
256 IF (dft_control%do_admm) THEN
257 CALL get_qs_env(qs_env, admm_env=admm_env)
258 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
259 CALL dbcsr_allocate_matrix_set(ex_env%matrix_pe_admm, nspins)
260 DO ispin = 1, nspins
261 ALLOCATE (ex_env%matrix_pe_admm(ispin)%matrix)
262 CALL dbcsr_create(ex_env%matrix_pe_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
263 CALL dbcsr_copy(ex_env%matrix_pe_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
264 CALL dbcsr_set(ex_env%matrix_pe_admm(ispin)%matrix, 0.0_dp)
265 CALL tddfpt_resvec1_admm(ex_env%matrix_pe(ispin)%matrix, &
266 admm_env, ex_env%matrix_pe_admm(ispin)%matrix)
267 END DO
268 END IF
269 !
270 CALL dbcsr_allocate_matrix_set(ex_env%matrix_hz, nspins)
271 DO ispin = 1, nspins
272 ALLOCATE (ex_env%matrix_hz(ispin)%matrix)
273 CALL dbcsr_create(ex_env%matrix_hz(ispin)%matrix, template=matrix_s(1)%matrix)
274 CALL dbcsr_copy(ex_env%matrix_hz(ispin)%matrix, matrix_s(1)%matrix)
275 CALL dbcsr_set(ex_env%matrix_hz(ispin)%matrix, 0.0_dp)
276 END DO
277 ! Calculate first term of R vector: H_{\mu i\sigma}[T]
278 IF (dft_control%qs_control%xtb) THEN
279 CALL tddfpt_resvec2_xtb(qs_env, ex_env%matrix_pe, gs_mos, ex_env%matrix_hz, ex_env%cpmos)
280 ELSE
281 CALL tddfpt_resvec2(qs_env, ex_env%matrix_pe, ex_env%matrix_pe_admm, &
282 gs_mos, ex_env%matrix_hz, ex_env%cpmos)
283 END IF
284 !
285 CALL dbcsr_allocate_matrix_set(ex_env%matrix_px1, SIZE(ex_env%evect, 1))
286 CALL dbcsr_allocate_matrix_set(ex_env%matrix_px1_asymm, SIZE(ex_env%evect, 1))
287 DO ispin = 1, SIZE(ex_env%evect, 1)
288 ALLOCATE (ex_env%matrix_px1(ispin)%matrix)
289 CALL dbcsr_create(ex_env%matrix_px1(ispin)%matrix, template=matrix_s(1)%matrix)
290 CALL dbcsr_copy(ex_env%matrix_px1(ispin)%matrix, matrix_s(1)%matrix)
291 CALL dbcsr_set(ex_env%matrix_px1(ispin)%matrix, 0.0_dp)
292
293 ALLOCATE (ex_env%matrix_px1_asymm(ispin)%matrix)
294 CALL dbcsr_create(ex_env%matrix_px1_asymm(ispin)%matrix, template=matrix_s(1)%matrix, &
295 matrix_type=dbcsr_type_antisymmetric)
296 CALL dbcsr_complete_redistribute(ex_env%matrix_px1(ispin)%matrix, ex_env%matrix_px1_asymm(ispin)%matrix)
297 END DO
298 ! Kernel ADMM
299 IF (tddfpt_control%do_admm) THEN
300 CALL get_qs_env(qs_env, admm_env=admm_env)
301 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
302 CALL dbcsr_allocate_matrix_set(ex_env%matrix_px1_admm, SIZE(ex_env%evect, 1))
303 CALL dbcsr_allocate_matrix_set(ex_env%matrix_px1_admm_asymm, SIZE(ex_env%evect, 1))
304 DO ispin = 1, SIZE(ex_env%evect, 1)
305 ALLOCATE (ex_env%matrix_px1_admm(ispin)%matrix)
306 CALL dbcsr_create(ex_env%matrix_px1_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
307 CALL dbcsr_copy(ex_env%matrix_px1_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
308 CALL dbcsr_set(ex_env%matrix_px1_admm(ispin)%matrix, 0.0_dp)
309
310 ALLOCATE (ex_env%matrix_px1_admm_asymm(ispin)%matrix)
311 CALL dbcsr_create(ex_env%matrix_px1_admm_asymm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix, &
312 matrix_type=dbcsr_type_antisymmetric)
313 CALL dbcsr_complete_redistribute(ex_env%matrix_px1_admm(ispin)%matrix, &
314 ex_env%matrix_px1_admm_asymm(ispin)%matrix)
315 END DO
316 END IF
317 ! TDA forces. Calculates and adds all missing terms for the response vector, Eq. 49.
318 CALL tddfpt_forces(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices)
319 ! Rotate res vector cpmos into original frame of occupied orbitals.
320 CALL tddfpt_resvec3(qs_env, ex_env%cpmos, work_matrices)
321
322 CALL dbcsr_deallocate_matrix_set(matrix_pe_symm)
323 CALL dbcsr_deallocate_matrix_set(matrix_pe_asymm)
324
325 CALL timestop(handle)
326
327 END SUBROUTINE tddfpt_forces_main
328
329! **************************************************************************************************
330!> \brief Calculate direct tddft forces
331!> \param qs_env ...
332!> \param ex_env ...
333!> \param gs_mos ...
334!> \param kernel_env ...
335!> \param sub_env ...
336!> \param work_matrices ...
337!> \par History
338!> * 01.2020 screated [JGH]
339! **************************************************************************************************
340 SUBROUTINE tddfpt_forces(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices)
341
342 TYPE(qs_environment_type), POINTER :: qs_env
343 TYPE(excited_energy_type), POINTER :: ex_env
344 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
345 POINTER :: gs_mos
346 TYPE(kernel_env_type), INTENT(IN) :: kernel_env
347 TYPE(tddfpt_subgroup_env_type) :: sub_env
348 TYPE(tddfpt_work_matrices) :: work_matrices
349
350 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_forces'
351
352 INTEGER :: handle
353 INTEGER, ALLOCATABLE, DIMENSION(:) :: natom_of_kind
354 LOGICAL :: debug_forces
355 REAL(kind=dp) :: ehartree, exc
356 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
357 TYPE(dft_control_type), POINTER :: dft_control
358 TYPE(qs_force_type), DIMENSION(:), POINTER :: ks_force, td_force
359
360 CALL timeset(routinen, handle)
361
362 ! for extended debug output
363 debug_forces = ex_env%debug_forces
364 ! prepare force array
365 CALL get_qs_env(qs_env, dft_control=dft_control, force=ks_force, &
366 atomic_kind_set=atomic_kind_set)
367 CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, natom_of_kind=natom_of_kind)
368 NULLIFY (td_force)
369 CALL allocate_qs_force(td_force, natom_of_kind)
370 DEALLOCATE (natom_of_kind)
371 CALL zero_qs_force(td_force)
372 CALL set_qs_env(qs_env, force=td_force)
373 !
374 IF (dft_control%qs_control%xtb) THEN
375 CALL tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, &
376 work_matrices, debug_forces)
377 ELSE
378 !
379 CALL exstate_potential_release(ex_env)
380 ! Build the values of hartree, fock and exchange-correlation potential on the grid
381 CALL ks_ref_potential(qs_env, ex_env%vh_rspace, ex_env%vxc_rspace, &
382 ex_env%vtau_rspace, ex_env%vadmm_rspace, ehartree, exc, &
383 vadmm_tau_rspace=ex_env%vadmm_tau_rspace)
384 CALL ks_ref_potential_atom(qs_env, ex_env%local_rho_set, ex_env%local_rho_set_admm, &
385 ex_env%vh_rspace)
386 CALL tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, &
387 work_matrices, debug_forces)
388 END IF
389 !
390 ! add TD and KS forces
391 CALL get_qs_env(qs_env, force=td_force)
392 CALL sum_qs_force(ks_force, td_force)
393 CALL set_qs_env(qs_env, force=ks_force)
394 CALL deallocate_qs_force(td_force)
395 !
396 CALL timestop(handle)
397
398 END SUBROUTINE tddfpt_forces
399
400! **************************************************************************************************
401!> \brief Calculate direct tddft forces.
402!> J. Chem. Theory Comput. 2022, 18, 7, 4186–4202 (https://doi.org/10.1021/acs.jctc.2c00144)
403!> \param qs_env ...
404!> \param ex_env Holds on exit
405!> cpmos = R, Response vector, Eq. 49.
406!> matrix_pe = T, Difference density, Eq. 44.
407!> matrix_wx1 = CK[D^X]X^T, Third term of Eq. 51.
408!> matrix_wz = CX^T(\omegaS - K)XC^T, Last term of Eq. 51.
409!> \param gs_mos ...
410!> \param kernel_env ...
411!> \param sub_env ...
412!> \param work_matrices ...
413!> \param debug_forces ...
414!> \par History
415!> * 01.2020 screated [JGH]
416! **************************************************************************************************
417 SUBROUTINE tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, &
418 debug_forces)
419
420 TYPE(qs_environment_type), POINTER :: qs_env
421 TYPE(excited_energy_type), POINTER :: ex_env
422 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
423 POINTER :: gs_mos
424 TYPE(kernel_env_type), INTENT(IN) :: kernel_env
425 TYPE(tddfpt_subgroup_env_type) :: sub_env
426 TYPE(tddfpt_work_matrices) :: work_matrices
427 LOGICAL :: debug_forces
428
429 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_force_direct'
430
431 INTEGER :: handle, iounit, ispin, nact, natom, &
432 nspins, spin
433 LOGICAL :: do_sf
434 REAL(kind=dp) :: evalue
435 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: ftot1, ftot2
436 REAL(kind=dp), DIMENSION(3) :: fodeb
437 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
438 TYPE(cp_fm_type), DIMENSION(:), POINTER :: evect
439 TYPE(cp_logger_type), POINTER :: logger
440 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s, matrix_wx1, &
441 matrix_wz, scrm
442 TYPE(dft_control_type), POINTER :: dft_control
443 TYPE(mp_para_env_type), POINTER :: para_env
444 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
445 POINTER :: sab_orb
446 TYPE(qs_force_type), DIMENSION(:), POINTER :: force
447 TYPE(qs_ks_env_type), POINTER :: ks_env
448 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
449
450 CALL timeset(routinen, handle)
451
452 logger => cp_get_default_logger()
453 IF (logger%para_env%is_source()) THEN
454 iounit = cp_logger_get_default_unit_nr(logger, local=.true.)
455 ELSE
456 iounit = -1
457 END IF
458
459 evect => ex_env%evect
460
461 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env, para_env=para_env, &
462 sab_orb=sab_orb, dft_control=dft_control, force=force)
463 NULLIFY (tddfpt_control)
464 tddfpt_control => dft_control%tddfpt2_control
465 IF (tddfpt_control%spinflip == no_sf_tddfpt) THEN
466 do_sf = .false.
467 ELSE
468 do_sf = .true.
469 END IF
470 nspins = dft_control%nspins
471
472 IF (debug_forces) THEN
473 CALL get_qs_env(qs_env, natom=natom, atomic_kind_set=atomic_kind_set)
474 ALLOCATE (ftot1(3, natom))
475 CALL total_qs_force(ftot1, force, atomic_kind_set)
476 END IF
477
478 ! Build last terms of the response vector, Eq. 49, and third term of Lambda_munu, Eq. 51.
479 ! the response vector is in ex_env%cpmos and Lambda is in ex_env%matrix_wx1
480 CALL tddfpt_kernel_force(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, debug_forces)
481
482 ! Overlap matrix, build the Lambda matrix, Eq. 51.
483 NULLIFY (matrix_wx1, matrix_wz)
484 CALL dbcsr_allocate_matrix_set(matrix_wz, nspins)
485 matrix_wx1 => ex_env%matrix_wx1
486 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks)
487 DO ispin = 1, nspins
488 IF (do_sf) THEN
489 spin = 1
490 ELSE
491 spin = ispin
492 END IF
493 ! Create and initialize the Lambda matrix as a sparse matrix
494 ALLOCATE (matrix_wz(ispin)%matrix)
495 CALL dbcsr_create(matrix=matrix_wz(ispin)%matrix, template=matrix_s(1)%matrix)
496 CALL cp_dbcsr_alloc_block_from_nbl(matrix_wz(ispin)%matrix, sab_orb)
497 CALL dbcsr_set(matrix_wz(ispin)%matrix, 0.0_dp)
498 ! For spin-flip excitations only the beta component of the Lambda matrix
499 ! contains the excitation energy term
500 IF (.NOT. (do_sf .AND. (ispin == 1))) THEN
501 CALL cp_fm_get_info(evect(spin), ncol_global=nact)
502 CALL cp_dbcsr_plus_fm_fm_t(matrix_wz(ispin)%matrix, matrix_v=evect(spin), ncol=nact)
503 evalue = ex_env%evalue
504 IF (tddfpt_control%oe_corr == oe_shift) THEN
505 evalue = ex_env%evalue - tddfpt_control%ev_shift
506 END IF
507 CALL dbcsr_scale(matrix_wz(ispin)%matrix, evalue)
508 END IF
509 ! For spin-flip excitations only the alpha component of the Lambda matrix
510 ! contains the occupied MO energy term
511 IF (.NOT. (do_sf .AND. (ispin == 2))) THEN
512 CALL calculate_wx_matrix(gs_mos(ispin)%mos_active, evect(spin), matrix_ks(ispin)%matrix, &
513 matrix_wz(ispin)%matrix)
514 END IF
515 END DO
516 IF (nspins == 2) THEN
517 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
518 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
519 END IF
520 NULLIFY (scrm)
521 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
522 ! Calculate the force contribution of matrix_xz into the force in ks_env.
523 ! force%overlap = Tr(dS*matrix_wz), last term of Eq. 51.
524 CALL build_overlap_matrix(ks_env, matrix_s=scrm, &
525 matrix_name="OVERLAP MATRIX", &
526 basis_type_a="ORB", basis_type_b="ORB", &
527 sab_nl=sab_orb, calculate_forces=.true., &
528 matrix_p=matrix_wz(1)%matrix)
530 CALL dbcsr_deallocate_matrix_set(matrix_wz)
531 IF (debug_forces) THEN
532 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
533 CALL para_env%sum(fodeb)
534 IF (iounit > 0) WRITE (iounit, "(T3,A,T33,3F16.8)") "DEBUG:: Wx*dS ", fodeb
535 END IF
536
537 ! Overlap matrix. Build a part of the first term of Lamda, Eq. 51, corresponding to
538 ! the second term of Eq. 41. matrix_wz = C*X^T*(omega*S - K)*X*C^T
539 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks)
540 NULLIFY (matrix_wz)
541 CALL dbcsr_allocate_matrix_set(matrix_wz, nspins)
542 DO ispin = 1, nspins
543 ALLOCATE (matrix_wz(ispin)%matrix)
544 CALL dbcsr_create(matrix=matrix_wz(ispin)%matrix, template=matrix_s(1)%matrix)
545 CALL cp_dbcsr_alloc_block_from_nbl(matrix_wz(ispin)%matrix, sab_orb)
546 CALL dbcsr_set(matrix_wz(ispin)%matrix, 0.0_dp)
547 ! For spin-flip excitations only the alpha component of Lambda has contributions
548 ! of this term, so skip beta
549 IF (.NOT. (do_sf .AND. (ispin == 2))) THEN
550 evalue = ex_env%evalue
551 IF (tddfpt_control%oe_corr == oe_shift) THEN
552 evalue = ex_env%evalue - tddfpt_control%ev_shift
553 END IF
554 IF (do_sf) THEN
555 spin = 2
556 ELSE
557 spin = ispin
558 END IF
559 CALL calculate_xwx_matrix(gs_mos(ispin)%mos_active, evect(ispin), matrix_s(1)%matrix, &
560 matrix_ks(spin)%matrix, matrix_wz(ispin)%matrix, evalue)
561 END IF
562 END DO
563 IF (nspins == 2) THEN
564 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
565 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
566 END IF
567 NULLIFY (scrm)
568 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
569 CALL build_overlap_matrix(ks_env, matrix_s=scrm, &
570 matrix_name="OVERLAP MATRIX", &
571 basis_type_a="ORB", basis_type_b="ORB", &
572 sab_nl=sab_orb, calculate_forces=.true., &
573 matrix_p=matrix_wz(1)%matrix)
575 CALL dbcsr_deallocate_matrix_set(matrix_wz)
576 IF (debug_forces) THEN
577 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
578 CALL para_env%sum(fodeb)
579 IF (iounit > 0) WRITE (iounit, "(T3,A,T33,3F16.8)") "DEBUG:: xWx*dS ", fodeb
580 END IF
581
582 ! Compute force contribution of the first term of Eq. 41 in the first term of Eq. 51
583 ! that was calculated in tddfpt_kernel_force,
584 ! force%overlap = 0.5C*H[T]*C^T
585 IF (ASSOCIATED(matrix_wx1)) THEN
586 IF (nspins == 2 .AND. .NOT. do_sf) THEN
587 CALL dbcsr_add(matrix_wx1(1)%matrix, matrix_wx1(2)%matrix, &
588 alpha_scalar=0.5_dp, beta_scalar=0.5_dp)
589 ELSE IF (nspins == 2 .AND. do_sf) THEN
590 CALL dbcsr_add(matrix_wx1(1)%matrix, matrix_wx1(2)%matrix, &
591 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
592 END IF
593 NULLIFY (scrm)
594 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
595 CALL build_overlap_matrix(ks_env, matrix_s=scrm, &
596 matrix_name="OVERLAP MATRIX", &
597 basis_type_a="ORB", basis_type_b="ORB", &
598 sab_nl=sab_orb, calculate_forces=.true., &
599 matrix_p=matrix_wx1(1)%matrix)
601 IF (debug_forces) THEN
602 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
603 CALL para_env%sum(fodeb)
604 IF (iounit > 0) WRITE (iounit, "(T3,A,T33,3F16.8)") "DEBUG:: D^XKP*dS ", fodeb
605 END IF
606 END IF
607
608 IF (debug_forces) THEN
609 ALLOCATE (ftot2(3, natom))
610 CALL total_qs_force(ftot2, force, atomic_kind_set)
611 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
612 CALL para_env%sum(fodeb)
613 IF (iounit > 0) WRITE (iounit, "(T3,A,T30,3F16.8)") "DEBUG:: Excitation Force", fodeb
614 DEALLOCATE (ftot1, ftot2)
615 END IF
616
617 CALL timestop(handle)
618
619 END SUBROUTINE tddfpt_force_direct
620
621! **************************************************************************************************
622!> \brief Build the spin difference density,
623!> matrix_pe = matrix_pe + X*X^T - (C*X^T*S*X*C^T + (C*X^T*S*X*C^T)^T)/2
624!> \param evect ...
625!> \param mos_active ...
626!> \param matrix_s ...
627!> \param matrix_pe ...
628!> \param spin ...
629!> \param do_sf ...
630! **************************************************************************************************
631 SUBROUTINE tddfpt_resvec1(evect, mos_active, matrix_s, matrix_pe, spin, do_sf)
632
633 TYPE(cp_fm_type), INTENT(IN) :: evect, mos_active
634 TYPE(dbcsr_type), POINTER :: matrix_s, matrix_pe
635 INTEGER, INTENT(IN) :: spin
636 LOGICAL, INTENT(IN) :: do_sf
637
638 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_resvec1'
639
640 INTEGER :: handle, iounit, nact, nao, norb
641 REAL(kind=dp) :: tmp
642 TYPE(cp_fm_struct_type), POINTER :: fmstruct, fmstruct2
643 TYPE(cp_fm_type) :: cxmat, xxmat
644 TYPE(cp_logger_type), POINTER :: logger
645
646 CALL timeset(routinen, handle)
647 CALL cp_fm_get_info(mos_active, nrow_global=nao, ncol_global=norb)
648 CALL cp_fm_get_info(evect, nrow_global=nao, ncol_global=nact)
649 cpassert(norb == nact)
650
651 ! matrix_pe = X*X^T
652 IF (.NOT. do_sf .OR. (do_sf .AND. (spin == 2))) THEN
653 CALL cp_dbcsr_plus_fm_fm_t(matrix_pe, matrix_v=evect, ncol=norb)
654 END IF
655
656 ! matrix_pe = matrix_pe - (C*X^T*S*X*C^T + (C*X^T*S*X*C^T)^T)/2
657 IF (.NOT. do_sf .OR. (do_sf .AND. (spin == 1))) THEN
658 CALL cp_fm_get_info(evect, matrix_struct=fmstruct)
659 NULLIFY (fmstruct2)
660 CALL cp_fm_struct_create(fmstruct=fmstruct2, template_fmstruct=fmstruct, &
661 nrow_global=norb, ncol_global=norb)
662 CALL cp_fm_create(xxmat, matrix_struct=fmstruct2)
663 CALL cp_fm_struct_release(fmstruct2)
664 CALL cp_fm_create(cxmat, matrix_struct=fmstruct)
665 ! S*X
666 CALL cp_dbcsr_sm_fm_multiply(matrix_s, evect, cxmat, norb, alpha=1.0_dp, beta=0.0_dp)
667 ! (S*X)^T*X
668 CALL parallel_gemm('T', 'N', norb, norb, nao, 1.0_dp, cxmat, evect, 0.0_dp, xxmat)
669 ! C*X^T*S*X
670 CALL parallel_gemm('N', 'N', nao, norb, norb, 1.0_dp, mos_active, xxmat, 0.0_dp, cxmat)
671 CALL cp_fm_release(xxmat)
672 ! matrix_pe = matrix_pe - (C*(C^T*X^T*S*X)^T + C^T*(C^T*X^T*S*X))/2
673 CALL cp_dbcsr_plus_fm_fm_t(matrix_pe, matrix_v=mos_active, matrix_g=cxmat, &
674 ncol=norb, alpha=-1.0_dp, symmetry_mode=1)
675 CALL cp_fm_release(cxmat)
676 END IF
677 !
678 ! Test for Tr(Pe*S)=0
679 CALL dbcsr_dot(matrix_pe, matrix_s, tmp)
680 IF (.NOT. do_sf) THEN
681 IF (abs(tmp) > 1.e-08_dp) THEN
682 logger => cp_get_default_logger()
683 IF (logger%para_env%is_source()) THEN
684 iounit = cp_logger_get_default_unit_nr(logger, local=.true.)
685 ELSE
686 iounit = -1
687 END IF
688 cpwarn("Electron count of excitation density matrix is non-zero.")
689 IF (iounit > 0) THEN
690 WRITE (iounit, "(T2,A,T61,G20.10)") "Measured electron count is ", tmp
691 WRITE (iounit, "(T2,A,/)") repeat("*", 79)
692 END IF
693 END IF
694 ELSE IF (spin == 1) THEN
695 IF (abs(tmp + 1) > 1.e-08_dp) THEN
696 logger => cp_get_default_logger()
697 IF (logger%para_env%is_source()) THEN
698 iounit = cp_logger_get_default_unit_nr(logger, local=.true.)
699 ELSE
700 iounit = -1
701 END IF
702 cpwarn("Count of occupied occupation number change is not -1.")
703 IF (iounit > 0) THEN
704 WRITE (iounit, "(T2,A,T61,G20.10)") "Measured electron count is ", tmp
705 WRITE (iounit, "(T2,A,/)") repeat("*", 79)
706 END IF
707 END IF
708 ELSE IF (spin == 2) THEN
709 IF (abs(tmp - 1) > 1.e-08_dp) THEN
710 logger => cp_get_default_logger()
711 IF (logger%para_env%is_source()) THEN
712 iounit = cp_logger_get_default_unit_nr(logger, local=.true.)
713 ELSE
714 iounit = -1
715 END IF
716 cpwarn("Count of unoccupied occupation number change is not 1.")
717 IF (iounit > 0) THEN
718 WRITE (iounit, "(T2,A,T61,G20.10)") "Measured electron count is ", tmp
719 WRITE (iounit, "(T2,A,/)") repeat("*", 79)
720 END IF
721 END IF
722 END IF
723 !
724
725 CALL timestop(handle)
726
727 END SUBROUTINE tddfpt_resvec1
728
729! **************************************************************************************************
730!> \brief PA = A * P * A(T)
731!> \param matrix_pe ...
732!> \param admm_env ...
733!> \param matrix_pe_admm ...
734! **************************************************************************************************
735 SUBROUTINE tddfpt_resvec1_admm(matrix_pe, admm_env, matrix_pe_admm)
736
737 TYPE(dbcsr_type), POINTER :: matrix_pe
738 TYPE(admm_type), POINTER :: admm_env
739 TYPE(dbcsr_type), POINTER :: matrix_pe_admm
740
741 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_resvec1_admm'
742
743 INTEGER :: handle, nao, nao_aux
744
745 CALL timeset(routinen, handle)
746 !
747 nao_aux = admm_env%nao_aux_fit
748 nao = admm_env%nao_orb
749 !
750 CALL copy_dbcsr_to_fm(matrix_pe, admm_env%work_orb_orb)
751 CALL parallel_gemm('N', 'N', nao_aux, nao, nao, &
752 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
753 admm_env%work_aux_orb)
754 CALL parallel_gemm('N', 'T', nao_aux, nao_aux, nao, &
755 1.0_dp, admm_env%work_aux_orb, admm_env%A, 0.0_dp, &
756 admm_env%work_aux_aux)
757 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_pe_admm, keep_sparsity=.true.)
758 !
759 CALL timestop(handle)
760
761 END SUBROUTINE tddfpt_resvec1_admm
762
763! **************************************************************************************************
764!> \brief Calculates the action of the H operator as in the first term of equation 49 in
765!> https://doi.org/10.1021/acs.jctc.2c00144 (J. Chem. Theory Comput. 2022, 18, 4186−4202)
766!> cpmos = H_{\mu i\sigma}[matrix_pe]
767!> \param qs_env ...
768!> \param matrix_pe Input square matrix with the size of the number of atomic orbitals squared nao^2
769!> \param matrix_pe_admm ...
770!> \param gs_mos ...
771!> \param matrix_hz Holds H_{\mu\nu\sigma}[matrix_pe] on exit
772!> \param cpmos ...
773! **************************************************************************************************
774 SUBROUTINE tddfpt_resvec2(qs_env, matrix_pe, matrix_pe_admm, gs_mos, matrix_hz, cpmos)
775
776 TYPE(qs_environment_type), POINTER :: qs_env
777 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_pe, matrix_pe_admm
778 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
779 POINTER :: gs_mos
780 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_hz
781 TYPE(cp_fm_type), DIMENSION(:), INTENT(INOUT) :: cpmos
782
783 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_resvec2'
784
785 CHARACTER(LEN=default_string_length) :: basis_type
786 INTEGER :: handle, iounit, ispin, mspin, n_rep_hf, &
787 nao, nao_aux, natom, norb, nspins
788 LOGICAL :: distribute_fock_matrix, do_hfx, do_onecenter, gapw, gapw_xc, &
789 hfx_treat_lsd_in_core, needs_tau_response, s_mstruct_changed
790 REAL(kind=dp) :: eh1, focc, rhotot, thartree
791 REAL(kind=dp), DIMENSION(2) :: total_rho
792 REAL(kind=dp), DIMENSION(:), POINTER :: qlm_tot
793 TYPE(admm_type), POINTER :: admm_env
794 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
795 TYPE(cp_fm_type), POINTER :: mos
796 TYPE(cp_logger_type), POINTER :: logger
797 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: msaux
798 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mhz, mpe
799 TYPE(dbcsr_type), POINTER :: dbwork
800 TYPE(dft_control_type), POINTER :: dft_control
801 TYPE(hartree_local_type), POINTER :: hartree_local
802 TYPE(hfx_type), DIMENSION(:, :), POINTER :: x_data
803 TYPE(local_rho_type), POINTER :: local_rho_set, local_rho_set_admm
804 TYPE(mp_para_env_type), POINTER :: para_env
805 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
806 POINTER :: sab, sab_aux_fit
807 TYPE(oce_matrix_type), POINTER :: oce
808 TYPE(pw_c1d_gs_type) :: rho_tot_gspace, v_hartree_gspace
809 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g, rho_g_aux, rhoz_g_aux, &
810 rhoz_tau_g_aux, trho_g, trho_tau_g, &
811 trho_xc_g, trho_xc_tau_g
812 TYPE(pw_env_type), POINTER :: pw_env
813 TYPE(pw_poisson_type), POINTER :: poisson_env
814 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
815 TYPE(pw_r3d_rs_type) :: v_hartree_rspace
816 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r, rho_r_aux, rhoz_r_aux, &
817 rhoz_tau_r_aux, trho_r, trho_tau_r, &
818 trho_xc_r, trho_xc_tau_r, v_xc, &
819 v_xc_tau
820 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
821 TYPE(qs_ks_env_type), POINTER :: ks_env
822 TYPE(qs_rho_type), POINTER :: rho, rho_aux_fit, rho_fxc, rhoz_aux, trho
823 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho1_atom_set, rho_atom_set
824 TYPE(section_vals_type), POINTER :: hfx_section, input, xc_fun_section, &
825 xc_section
826 TYPE(task_list_type), POINTER :: task_list
827 TYPE(xc_rho_cflags_type) :: needs
828
829 CALL timeset(routinen, handle)
830
831 NULLIFY (pw_env)
832 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, ks_env=ks_env, &
833 dft_control=dft_control, para_env=para_env)
834 cpassert(ASSOCIATED(pw_env))
835 nspins = dft_control%nspins
836 gapw = dft_control%qs_control%gapw
837 gapw_xc = dft_control%qs_control%gapw_xc
838
839 cpassert(.NOT. dft_control%tddfpt2_control%do_exck)
840 cpassert(.NOT. dft_control%tddfpt2_control%do_hfxsr)
841 cpassert(.NOT. dft_control%tddfpt2_control%do_hfxlr)
842
843 NULLIFY (auxbas_pw_pool, poisson_env)
844 ! gets the tmp grids
845 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
846 poisson_env=poisson_env)
847
848 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
849 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
850 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
851
852 CALL get_qs_env(qs_env, input=input)
853 IF (dft_control%do_admm) THEN
854 CALL get_qs_env(qs_env, admm_env=admm_env)
855 xc_section => admm_env%xc_section_primary
856 ELSE
857 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
858 END IF
859 xc_fun_section => section_vals_get_subs_vals(xc_section, "XC_FUNCTIONAL")
860 needs = xc_functionals_get_needs(xc_fun_section, (nspins == 2), .true.)
861 needs_tau_response = needs%tau .OR. needs%tau_spin
862
863 NULLIFY (trho_tau_r, trho_tau_g, trho_xc_tau_r, trho_xc_tau_g)
864 ALLOCATE (trho_r(nspins), trho_g(nspins))
865 DO ispin = 1, nspins
866 CALL auxbas_pw_pool%create_pw(trho_r(ispin))
867 CALL auxbas_pw_pool%create_pw(trho_g(ispin))
868 END DO
869 IF (needs_tau_response) THEN
870 ALLOCATE (trho_tau_r(nspins), trho_tau_g(nspins))
871 DO ispin = 1, nspins
872 CALL auxbas_pw_pool%create_pw(trho_tau_r(ispin))
873 CALL auxbas_pw_pool%create_pw(trho_tau_g(ispin))
874 END DO
875 END IF
876 IF (gapw_xc) THEN
877 ALLOCATE (trho_xc_r(nspins), trho_xc_g(nspins))
878 DO ispin = 1, nspins
879 CALL auxbas_pw_pool%create_pw(trho_xc_r(ispin))
880 CALL auxbas_pw_pool%create_pw(trho_xc_g(ispin))
881 END DO
882 IF (needs_tau_response) THEN
883 ALLOCATE (trho_xc_tau_r(nspins), trho_xc_tau_g(nspins))
884 DO ispin = 1, nspins
885 CALL auxbas_pw_pool%create_pw(trho_xc_tau_r(ispin))
886 CALL auxbas_pw_pool%create_pw(trho_xc_tau_g(ispin))
887 END DO
888 END IF
889 END IF
890
891 ! GAPW/GAPW_XC initializations
892 NULLIFY (hartree_local, local_rho_set)
893 IF (gapw) THEN
894 CALL get_qs_env(qs_env, &
895 atomic_kind_set=atomic_kind_set, &
896 natom=natom, &
897 qs_kind_set=qs_kind_set)
898 CALL local_rho_set_create(local_rho_set)
899 CALL allocate_rho_atom_internals(local_rho_set%rho_atom_set, atomic_kind_set, &
900 qs_kind_set, dft_control, para_env)
901 CALL init_rho0(local_rho_set, qs_env, dft_control%qs_control%gapw_control, &
902 zcore=0.0_dp)
903 CALL rho0_s_grid_create(pw_env, local_rho_set%rho0_mpole)
904 CALL hartree_local_create(hartree_local)
905 CALL init_coulomb_local(hartree_local, natom)
906 ELSE IF (gapw_xc) THEN
907 CALL get_qs_env(qs_env, &
908 atomic_kind_set=atomic_kind_set, &
909 qs_kind_set=qs_kind_set)
910 CALL local_rho_set_create(local_rho_set)
911 CALL allocate_rho_atom_internals(local_rho_set%rho_atom_set, atomic_kind_set, &
912 qs_kind_set, dft_control, para_env)
913 END IF
914
915 total_rho = 0.0_dp
916 CALL pw_zero(rho_tot_gspace)
917 DO ispin = 1, nspins
918 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=matrix_pe(ispin)%matrix, &
919 rho=trho_r(ispin), &
920 rho_gspace=trho_g(ispin), &
921 soft_valid=gapw, &
922 total_rho=total_rho(ispin))
923 IF (needs_tau_response) THEN
924 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=matrix_pe(ispin)%matrix, &
925 rho=trho_tau_r(ispin), &
926 rho_gspace=trho_tau_g(ispin), &
927 soft_valid=gapw, &
928 compute_tau=.true.)
929 END IF
930 CALL pw_axpy(trho_g(ispin), rho_tot_gspace)
931 IF (gapw_xc) THEN
932 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=matrix_pe(ispin)%matrix, &
933 rho=trho_xc_r(ispin), &
934 rho_gspace=trho_xc_g(ispin), &
935 soft_valid=gapw_xc, &
936 total_rho=rhotot)
937 IF (needs_tau_response) THEN
938 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=matrix_pe(ispin)%matrix, &
939 rho=trho_xc_tau_r(ispin), &
940 rho_gspace=trho_xc_tau_g(ispin), &
941 soft_valid=gapw_xc, &
942 compute_tau=.true.)
943 END IF
944 END IF
945 END DO
946
947 ! GAPW o GAPW_XC require the calculation of hard and soft local densities
948 IF (gapw .OR. gapw_xc) THEN
949 CALL get_qs_env(qs_env=qs_env, oce=oce, sab_orb=sab)
950 CALL calculate_rho_atom_coeff(qs_env, matrix_pe, local_rho_set%rho_atom_set, &
951 qs_kind_set, oce, sab, para_env)
952 CALL prepare_gapw_den(qs_env, local_rho_set, do_rho0=gapw)
953 END IF
954 rhotot = sum(total_rho)
955 IF (gapw) THEN
956 CALL get_rho0_mpole(local_rho_set%rho0_mpole, qlm_tot=qlm_tot)
957 rhotot = rhotot + local_rho_set%rho0_mpole%total_rho0_h
958 CALL pw_axpy(local_rho_set%rho0_mpole%rho0_s_gs, rho_tot_gspace)
959 IF (ASSOCIATED(local_rho_set%rho0_mpole%rhoz_cneo_s_gs)) THEN
960 CALL pw_axpy(local_rho_set%rho0_mpole%rhoz_cneo_s_gs, rho_tot_gspace)
961 END IF
962 END IF
963
964 IF (abs(rhotot) > 1.e-05_dp) THEN
965 logger => cp_get_default_logger()
966 IF (logger%para_env%is_source()) THEN
967 iounit = cp_logger_get_default_unit_nr(logger, local=.true.)
968 ELSE
969 iounit = -1
970 END IF
971 cpwarn("Real space electron count of excitation density is non-zero.")
972 IF (iounit > 0) THEN
973 WRITE (iounit, "(T2,A,T61,G20.10)") "Measured electron count is ", rhotot
974 WRITE (iounit, "(T2,A,/)") repeat("*", 79)
975 END IF
976 END IF
977
978 ! calculate associated hartree potential
979 CALL pw_poisson_solve(poisson_env, rho_tot_gspace, thartree, &
980 v_hartree_gspace)
981 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
982 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
983 IF (gapw) THEN
984 CALL vh_1c_gg_integrals(qs_env, thartree, hartree_local%ecoul_1c, &
985 local_rho_set, para_env, tddft=.true.)
986 CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace, para_env, &
987 calculate_forces=.false., &
988 local_rho_set=local_rho_set)
989 END IF
990
991 ! Fxc*drho term
992 CALL get_qs_env(qs_env, rho=rho)
993 CALL qs_rho_get(rho, rho_r=rho_r, rho_g=rho_g)
994 !
995 NULLIFY (v_xc, v_xc_tau)
996 ALLOCATE (trho)
997 CALL qs_rho_create(trho)
998 IF (gapw_xc) THEN
999 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_fxc)
1000 IF (needs_tau_response) THEN
1001 CALL qs_rho_set(trho, rho_r=trho_xc_r, tau_r=trho_xc_tau_r, &
1002 rho_r_valid=.true., tau_r_valid=.true.)
1003 ELSE
1004 CALL qs_rho_set(trho, rho_r=trho_xc_r, rho_r_valid=.true.)
1005 END IF
1006 ELSE
1007 rho_fxc => rho
1008 IF (needs_tau_response) THEN
1009 CALL qs_rho_set(trho, rho_r=trho_r, tau_r=trho_tau_r, &
1010 rho_r_valid=.true., tau_r_valid=.true.)
1011 ELSE
1012 CALL qs_rho_set(trho, rho_r=trho_r, rho_r_valid=.true.)
1013 END IF
1014 END IF
1015 IF (gapw .OR. gapw_xc) THEN
1016 do_onecenter = .true.
1017 CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
1018 rho1_atom_set => local_rho_set%rho_atom_set
1019 ELSE
1020 do_onecenter = .false.
1021 END IF
1022 CALL qs_fxc_create(qs_env, rho_fxc, trho, rho_atom_set, xc_section, &
1023 do_onecenter, v_xc, v_xc_tau, rho1_atom_set)
1024 DEALLOCATE (trho)
1025
1026 DO ispin = 1, nspins
1027 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
1028 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1029 END DO
1030 IF (gapw_xc) THEN
1031 DO ispin = 1, nspins
1032 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_hartree_rspace, &
1033 hmat=matrix_hz(ispin), &
1034 calculate_forces=.false.)
1035 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
1036 hmat=matrix_hz(ispin), &
1037 gapw=gapw_xc, calculate_forces=.false.)
1038 END DO
1039 ELSE
1040 ! vtot = v_xc(ispin) + v_hartree
1041 DO ispin = 1, nspins
1042 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
1043 hmat=matrix_hz(ispin), &
1044 gapw=gapw, calculate_forces=.false.)
1045 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_hartree_rspace, &
1046 hmat=matrix_hz(ispin), &
1047 gapw=gapw, calculate_forces=.false.)
1048 END DO
1049 END IF
1050 IF (gapw .OR. gapw_xc) THEN
1051 mhz(1:nspins, 1:1) => matrix_hz(1:nspins)
1052 mpe(1:nspins, 1:1) => matrix_pe(1:nspins)
1053 CALL update_ks_atom(qs_env, mhz, mpe, forces=.false., &
1054 rho_atom_external=local_rho_set%rho_atom_set)
1055 END IF
1056
1057 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
1058 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
1059 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1060 DO ispin = 1, nspins
1061 CALL auxbas_pw_pool%give_back_pw(trho_r(ispin))
1062 CALL auxbas_pw_pool%give_back_pw(trho_g(ispin))
1063 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1064 END DO
1065 DEALLOCATE (trho_r, trho_g, v_xc)
1066 IF (ASSOCIATED(trho_tau_r)) THEN
1067 DO ispin = 1, nspins
1068 CALL auxbas_pw_pool%give_back_pw(trho_tau_r(ispin))
1069 CALL auxbas_pw_pool%give_back_pw(trho_tau_g(ispin))
1070 END DO
1071 DEALLOCATE (trho_tau_r, trho_tau_g)
1072 END IF
1073 IF (gapw_xc) THEN
1074 DO ispin = 1, nspins
1075 CALL auxbas_pw_pool%give_back_pw(trho_xc_r(ispin))
1076 CALL auxbas_pw_pool%give_back_pw(trho_xc_g(ispin))
1077 END DO
1078 DEALLOCATE (trho_xc_r, trho_xc_g)
1079 IF (ASSOCIATED(trho_xc_tau_r)) THEN
1080 DO ispin = 1, nspins
1081 CALL auxbas_pw_pool%give_back_pw(trho_xc_tau_r(ispin))
1082 CALL auxbas_pw_pool%give_back_pw(trho_xc_tau_g(ispin))
1083 END DO
1084 DEALLOCATE (trho_xc_tau_r, trho_xc_tau_g)
1085 END IF
1086 END IF
1087 IF (ASSOCIATED(v_xc_tau)) THEN
1088 DO ispin = 1, nspins
1089 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
1090 END DO
1091 DEALLOCATE (v_xc_tau)
1092 END IF
1093 IF (dft_control%do_admm) THEN
1094 IF (qs_env%admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
1095 ! add ADMM xc_section_aux terms: f_x[rhoz_ADMM]
1096 CALL get_qs_env(qs_env, admm_env=admm_env)
1097 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_s_aux_fit=msaux, &
1098 task_list_aux_fit=task_list)
1099 basis_type = "AUX_FIT"
1100 !
1101 NULLIFY (mpe, mhz)
1102 ALLOCATE (mpe(nspins, 1))
1103 CALL dbcsr_allocate_matrix_set(mhz, nspins, 1)
1104 DO ispin = 1, nspins
1105 ALLOCATE (mhz(ispin, 1)%matrix)
1106 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=msaux(1)%matrix)
1107 CALL dbcsr_copy(mhz(ispin, 1)%matrix, msaux(1)%matrix)
1108 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
1109 mpe(ispin, 1)%matrix => matrix_pe_admm(ispin)%matrix
1110 END DO
1111 !
1112 ! GAPW/GAPW_XC initializations
1113 NULLIFY (local_rho_set_admm)
1114 IF (admm_env%do_gapw) THEN
1115 basis_type = "AUX_FIT_SOFT"
1116 task_list => admm_env%admm_gapw_env%task_list
1117 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
1118 CALL get_admm_env(admm_env, sab_aux_fit=sab_aux_fit)
1119 CALL local_rho_set_create(local_rho_set_admm)
1120 CALL allocate_rho_atom_internals(local_rho_set_admm%rho_atom_set, atomic_kind_set, &
1121 admm_env%admm_gapw_env%admm_kind_set, dft_control, para_env)
1122 CALL calculate_rho_atom_coeff(qs_env, matrix_pe_admm, &
1123 rho_atom_set=local_rho_set_admm%rho_atom_set, &
1124 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
1125 oce=admm_env%admm_gapw_env%oce, sab=sab_aux_fit, para_env=para_env)
1126 CALL prepare_gapw_den(qs_env, local_rho_set=local_rho_set_admm, &
1127 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
1128 END IF
1129 !
1130 xc_section => admm_env%xc_section_aux
1131 xc_fun_section => section_vals_get_subs_vals(xc_section, "XC_FUNCTIONAL")
1132 needs = xc_functionals_get_needs(xc_fun_section, (nspins == 2), .true.)
1133 needs_tau_response = needs%tau .OR. needs%tau_spin
1134 !
1135 NULLIFY (rho_g_aux, rho_r_aux, rhoz_g_aux, rhoz_r_aux, rhoz_tau_g_aux, rhoz_tau_r_aux)
1136 CALL qs_rho_get(rho_aux_fit, rho_r=rho_r_aux, rho_g=rho_g_aux)
1137 ! rhoz_aux
1138 ALLOCATE (rhoz_r_aux(nspins), rhoz_g_aux(nspins))
1139 DO ispin = 1, nspins
1140 CALL auxbas_pw_pool%create_pw(rhoz_r_aux(ispin))
1141 CALL auxbas_pw_pool%create_pw(rhoz_g_aux(ispin))
1142 END DO
1143 IF (needs_tau_response) THEN
1144 ALLOCATE (rhoz_tau_r_aux(nspins), rhoz_tau_g_aux(nspins))
1145 DO ispin = 1, nspins
1146 CALL auxbas_pw_pool%create_pw(rhoz_tau_r_aux(ispin))
1147 CALL auxbas_pw_pool%create_pw(rhoz_tau_g_aux(ispin))
1148 END DO
1149 END IF
1150 DO ispin = 1, nspins
1151 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=mpe(ispin, 1)%matrix, &
1152 rho=rhoz_r_aux(ispin), rho_gspace=rhoz_g_aux(ispin), &
1153 basis_type=basis_type, &
1154 task_list_external=task_list)
1155 IF (needs_tau_response) THEN
1156 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=mpe(ispin, 1)%matrix, &
1157 rho=rhoz_tau_r_aux(ispin), rho_gspace=rhoz_tau_g_aux(ispin), &
1158 basis_type=basis_type, task_list_external=task_list, &
1159 compute_tau=.true.)
1160 END IF
1161 END DO
1162 !
1163 NULLIFY (v_xc, v_xc_tau)
1164 ALLOCATE (rhoz_aux)
1165 CALL qs_rho_create(rhoz_aux)
1166 IF (needs_tau_response) THEN
1167 CALL qs_rho_set(rhoz_aux, rho_r=rhoz_r_aux, tau_r=rhoz_tau_r_aux, &
1168 rho_r_valid=.true., tau_r_valid=.true.)
1169 ELSE
1170 CALL qs_rho_set(rhoz_aux, rho_r=rhoz_r_aux, rho_r_valid=.true.)
1171 END IF
1172 IF (admm_env%do_gapw) THEN
1173 do_onecenter = .true.
1174 rho_atom_set => admm_env%admm_gapw_env%local_rho_set%rho_atom_set
1175 rho1_atom_set => local_rho_set_admm%rho_atom_set
1176 qs_kind_set => admm_env%admm_gapw_env%admm_kind_set
1177 ELSE
1178 do_onecenter = .false.
1179 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
1180 END IF
1181 CALL qs_fxc_create(qs_env, rho_aux_fit, rhoz_aux, rho_atom_set, xc_section, &
1182 do_onecenter, v_xc, v_xc_tau, rho1_atom_set, &
1183 kind_set_external=qs_kind_set)
1184 DEALLOCATE (rhoz_aux)
1185 !
1186 DO ispin = 1, nspins
1187 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1188 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
1189 hmat=mhz(ispin, 1), basis_type=basis_type, &
1190 calculate_forces=.false., &
1191 task_list_external=task_list)
1192 END DO
1193 DO ispin = 1, nspins
1194 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1195 CALL auxbas_pw_pool%give_back_pw(rhoz_r_aux(ispin))
1196 CALL auxbas_pw_pool%give_back_pw(rhoz_g_aux(ispin))
1197 END DO
1198 DEALLOCATE (v_xc, rhoz_r_aux, rhoz_g_aux)
1199 IF (ASSOCIATED(v_xc_tau)) THEN
1200 DO ispin = 1, nspins
1201 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
1202 END DO
1203 DEALLOCATE (v_xc_tau)
1204 END IF
1205 IF (ASSOCIATED(rhoz_tau_r_aux)) THEN
1206 DO ispin = 1, nspins
1207 CALL auxbas_pw_pool%give_back_pw(rhoz_tau_r_aux(ispin))
1208 CALL auxbas_pw_pool%give_back_pw(rhoz_tau_g_aux(ispin))
1209 END DO
1210 DEALLOCATE (rhoz_tau_r_aux, rhoz_tau_g_aux)
1211 END IF
1212 !
1213 IF (admm_env%do_gapw) THEN
1214 rho_atom_set => admm_env%admm_gapw_env%local_rho_set%rho_atom_set
1215 rho1_atom_set => local_rho_set_admm%rho_atom_set
1216 CALL update_ks_atom(qs_env, mhz(:, 1), matrix_pe_admm, forces=.false., tddft=.false., &
1217 rho_atom_external=rho1_atom_set, &
1218 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
1219 oce_external=admm_env%admm_gapw_env%oce, &
1220 sab_external=sab_aux_fit)
1221 END IF
1222 !
1223 nao = admm_env%nao_orb
1224 nao_aux = admm_env%nao_aux_fit
1225 ALLOCATE (dbwork)
1226 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
1227 DO ispin = 1, nspins
1228 CALL cp_dbcsr_sm_fm_multiply(mhz(ispin, 1)%matrix, admm_env%A, &
1229 admm_env%work_aux_orb, nao)
1230 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, &
1231 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1232 admm_env%work_orb_orb)
1233 CALL dbcsr_copy(dbwork, matrix_hz(1)%matrix)
1234 CALL dbcsr_set(dbwork, 0.0_dp)
1235 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbwork, keep_sparsity=.true.)
1236 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
1237 END DO
1238 CALL dbcsr_release(dbwork)
1239 DEALLOCATE (dbwork)
1241 DEALLOCATE (mpe)
1242 IF (admm_env%do_gapw) THEN
1243 IF (ASSOCIATED(local_rho_set_admm)) CALL local_rho_set_release(local_rho_set_admm)
1244 END IF
1245 END IF
1246 END IF
1247 IF (gapw .OR. gapw_xc) THEN
1248 IF (ASSOCIATED(local_rho_set)) CALL local_rho_set_release(local_rho_set)
1249 IF (ASSOCIATED(hartree_local)) CALL hartree_local_release(hartree_local)
1250 END IF
1251
1252 ! HFX
1253 hfx_section => section_vals_get_subs_vals(xc_section, "HF")
1254 CALL section_vals_get(hfx_section, explicit=do_hfx)
1255 IF (do_hfx) THEN
1256 CALL section_vals_get(hfx_section, n_repetition=n_rep_hf)
1257 cpassert(n_rep_hf == 1)
1258 CALL section_vals_val_get(hfx_section, "TREAT_LSD_IN_CORE", l_val=hfx_treat_lsd_in_core, &
1259 i_rep_section=1)
1260 mspin = 1
1261 IF (hfx_treat_lsd_in_core) mspin = nspins
1262 !
1263 CALL get_qs_env(qs_env=qs_env, rho=rho, x_data=x_data, para_env=para_env, &
1264 s_mstruct_changed=s_mstruct_changed)
1265 distribute_fock_matrix = .true.
1266 IF (dft_control%do_admm) THEN
1267 CALL get_qs_env(qs_env, admm_env=admm_env)
1268 CALL get_admm_env(admm_env, matrix_s_aux_fit=msaux)
1269 NULLIFY (mpe, mhz)
1270 ALLOCATE (mpe(nspins, 1))
1271 CALL dbcsr_allocate_matrix_set(mhz, nspins, 1)
1272 DO ispin = 1, nspins
1273 ALLOCATE (mhz(ispin, 1)%matrix)
1274 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=msaux(1)%matrix)
1275 CALL dbcsr_copy(mhz(ispin, 1)%matrix, msaux(1)%matrix)
1276 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
1277 mpe(ispin, 1)%matrix => matrix_pe_admm(ispin)%matrix
1278 END DO
1279 IF (x_data(1, 1)%do_hfx_ri) THEN
1280 eh1 = 0.0_dp
1281 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpe, &
1282 geometry_did_change=s_mstruct_changed, nspins=nspins, &
1283 hf_fraction=x_data(1, 1)%general_parameter%fraction)
1284 ELSE
1285 DO ispin = 1, mspin
1286 eh1 = 0.0
1287 CALL integrate_four_center(qs_env, x_data, mhz, eh1, mpe, hfx_section, &
1288 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
1289 ispin=ispin)
1290 END DO
1291 END IF
1292 !
1293 cpassert(ASSOCIATED(admm_env%work_aux_orb))
1294 cpassert(ASSOCIATED(admm_env%work_orb_orb))
1295 nao = admm_env%nao_orb
1296 nao_aux = admm_env%nao_aux_fit
1297 ALLOCATE (dbwork)
1298 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
1299 DO ispin = 1, nspins
1300 CALL cp_dbcsr_sm_fm_multiply(mhz(ispin, 1)%matrix, admm_env%A, &
1301 admm_env%work_aux_orb, nao)
1302 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, &
1303 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1304 admm_env%work_orb_orb)
1305 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
1306 CALL dbcsr_set(dbwork, 0.0_dp)
1307 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbwork, keep_sparsity=.true.)
1308 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
1309 END DO
1310 CALL dbcsr_release(dbwork)
1311 DEALLOCATE (dbwork)
1313 DEALLOCATE (mpe)
1314 ELSE
1315 NULLIFY (mpe, mhz)
1316 ALLOCATE (mpe(nspins, 1), mhz(nspins, 1))
1317 DO ispin = 1, nspins
1318 mhz(ispin, 1)%matrix => matrix_hz(ispin)%matrix
1319 mpe(ispin, 1)%matrix => matrix_pe(ispin)%matrix
1320 END DO
1321 IF (x_data(1, 1)%do_hfx_ri) THEN
1322 eh1 = 0.0_dp
1323 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpe, &
1324 geometry_did_change=s_mstruct_changed, nspins=nspins, &
1325 hf_fraction=x_data(1, 1)%general_parameter%fraction)
1326 ELSE
1327 DO ispin = 1, mspin
1328 eh1 = 0.0
1329 CALL integrate_four_center(qs_env, x_data, mhz, eh1, mpe, hfx_section, &
1330 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
1331 ispin=ispin)
1332 END DO
1333 END IF
1334 DEALLOCATE (mpe, mhz)
1335 END IF
1336 END IF
1337
1338 focc = 4.0_dp
1339 IF (nspins == 2) focc = 2.0_dp
1340 DO ispin = 1, nspins
1341 mos => gs_mos(ispin)%mos_occ
1342 CALL cp_fm_get_info(mos, ncol_global=norb)
1343 CALL cp_dbcsr_sm_fm_multiply(matrix_hz(ispin)%matrix, mos, cpmos(ispin), &
1344 norb, alpha=focc, beta=0.0_dp)
1345 END DO
1346
1347 CALL timestop(handle)
1348
1349 END SUBROUTINE tddfpt_resvec2
1350
1351! **************************************************************************************************
1352!> \brief ...
1353!> \param qs_env ...
1354!> \param matrix_pe ...
1355!> \param gs_mos ...
1356!> \param matrix_hz ...
1357!> \param cpmos ...
1358! **************************************************************************************************
1359 SUBROUTINE tddfpt_resvec2_xtb(qs_env, matrix_pe, gs_mos, matrix_hz, cpmos)
1360
1361 TYPE(qs_environment_type), POINTER :: qs_env
1362 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_pe
1363 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
1364 POINTER :: gs_mos
1365 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_hz
1366 TYPE(cp_fm_type), DIMENSION(:), INTENT(INOUT) :: cpmos
1367
1368 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_resvec2_xtb'
1369
1370 INTEGER :: atom_a, handle, iatom, ikind, is, ispin, &
1371 na, natom, natorb, nkind, norb, ns, &
1372 nsgf, nspins
1373 INTEGER, DIMENSION(25) :: lao
1374 INTEGER, DIMENSION(5) :: occ
1375 REAL(dp), ALLOCATABLE, DIMENSION(:) :: mcharge, mcharge1
1376 REAL(dp), ALLOCATABLE, DIMENSION(:, :) :: aocg, aocg1, charges, charges1
1377 REAL(kind=dp) :: focc
1378 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1379 TYPE(cp_fm_type), POINTER :: mos
1380 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_matrix
1381 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_p, matrix_s
1382 TYPE(dbcsr_type), POINTER :: s_matrix
1383 TYPE(dft_control_type), POINTER :: dft_control
1384 TYPE(mp_para_env_type), POINTER :: para_env
1385 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1386 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1387 TYPE(qs_rho_type), POINTER :: rho
1388 TYPE(xtb_atom_type), POINTER :: xtb_kind
1389
1390 CALL timeset(routinen, handle)
1391
1392 cpassert(ASSOCIATED(matrix_pe))
1393
1394 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
1395 nspins = dft_control%nspins
1396
1397 DO ispin = 1, nspins
1398 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
1399 END DO
1400
1401 IF (dft_control%qs_control%xtb_control%coulomb_interaction) THEN
1402 ! Mulliken charges
1403 CALL get_qs_env(qs_env, rho=rho, particle_set=particle_set, &
1404 matrix_s_kp=matrix_s, para_env=para_env)
1405 natom = SIZE(particle_set)
1406 CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
1407 ALLOCATE (mcharge(natom), charges(natom, 5))
1408 ALLOCATE (mcharge1(natom), charges1(natom, 5))
1409 charges = 0.0_dp
1410 charges1 = 0.0_dp
1411 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
1412 nkind = SIZE(atomic_kind_set)
1413 CALL get_qs_kind_set(qs_kind_set, maxsgf=nsgf)
1414 ALLOCATE (aocg(nsgf, natom))
1415 aocg = 0.0_dp
1416 ALLOCATE (aocg1(nsgf, natom))
1417 aocg1 = 0.0_dp
1418 p_matrix => matrix_p(:, 1)
1419 s_matrix => matrix_s(1, 1)%matrix
1420 CALL ao_charges(p_matrix, s_matrix, aocg, para_env)
1421 CALL ao_charges(matrix_pe, s_matrix, aocg1, para_env)
1422 IF (nspins == 2) aocg1 = 0.5_dp*aocg1
1423 DO ikind = 1, nkind
1424 CALL get_atomic_kind(atomic_kind_set(ikind), natom=na)
1425 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
1426 CALL get_xtb_atom_param(xtb_kind, natorb=natorb, lao=lao, occupation=occ)
1427 DO iatom = 1, na
1428 atom_a = atomic_kind_set(ikind)%atom_list(iatom)
1429 charges(atom_a, :) = real(occ(:), kind=dp)
1430 DO is = 1, natorb
1431 ns = lao(is) + 1
1432 charges(atom_a, ns) = charges(atom_a, ns) - aocg(is, atom_a)
1433 charges1(atom_a, ns) = charges1(atom_a, ns) - aocg1(is, atom_a)
1434 END DO
1435 END DO
1436 END DO
1437 DEALLOCATE (aocg, aocg1)
1438 DO iatom = 1, natom
1439 mcharge(iatom) = sum(charges(iatom, :))
1440 mcharge1(iatom) = sum(charges1(iatom, :))
1441 END DO
1442 ! Coulomb Kernel
1443 CALL xtb_coulomb_hessian(qs_env, matrix_hz, charges1, mcharge1, mcharge, &
1444 matrix_pe)
1445 !
1446 DEALLOCATE (charges, mcharge, charges1, mcharge1)
1447 END IF
1448
1449 focc = 2.0_dp
1450 DO ispin = 1, nspins
1451 mos => gs_mos(ispin)%mos_occ
1452 CALL cp_fm_get_info(mos, ncol_global=norb)
1453 CALL cp_dbcsr_sm_fm_multiply(matrix_hz(ispin)%matrix, mos, cpmos(ispin), &
1454 norb, alpha=focc, beta=0.0_dp)
1455 END DO
1456
1457 CALL timestop(handle)
1458
1459 END SUBROUTINE tddfpt_resvec2_xtb
1460
1461! **************************************************************************************************
1462!> \brief ...
1463!> \param qs_env ...
1464!> \param cpmos ...
1465!> \param work ...
1466! **************************************************************************************************
1467 SUBROUTINE tddfpt_resvec3(qs_env, cpmos, work)
1468
1469 TYPE(qs_environment_type), POINTER :: qs_env
1470 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: cpmos
1471 TYPE(tddfpt_work_matrices) :: work
1472
1473 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_resvec3'
1474
1475 INTEGER :: handle, ispin, nao, norb, nspins
1476 TYPE(cp_fm_struct_type), POINTER :: fmstruct
1477 TYPE(cp_fm_type) :: cvec, umat
1478 TYPE(cp_fm_type), POINTER :: omos
1479 TYPE(dft_control_type), POINTER :: dft_control
1480 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1481
1482 CALL timeset(routinen, handle)
1483
1484 CALL get_qs_env(qs_env, mos=mos, dft_control=dft_control)
1485 nspins = dft_control%nspins
1486
1487 DO ispin = 1, nspins
1488 CALL get_mo_set(mos(ispin), mo_coeff=omos)
1489 associate(rvecs => cpmos(ispin))
1490 CALL cp_fm_get_info(rvecs, nrow_global=nao, ncol_global=norb)
1491 CALL cp_fm_create(cvec, rvecs%matrix_struct, "cvec")
1492 CALL cp_fm_struct_create(fmstruct, context=rvecs%matrix_struct%context, nrow_global=norb, &
1493 ncol_global=norb, para_env=rvecs%matrix_struct%para_env)
1494 CALL cp_fm_create(umat, fmstruct, "umat")
1495 CALL cp_fm_struct_release(fmstruct)
1496 !
1497 CALL parallel_gemm("T", "N", norb, norb, nao, 1.0_dp, omos, work%S_C0(ispin), 0.0_dp, umat)
1498 CALL cp_fm_copy_general(rvecs, cvec, rvecs%matrix_struct%para_env)
1499 CALL parallel_gemm("N", "T", nao, norb, norb, 1.0_dp, cvec, umat, 0.0_dp, rvecs)
1500 END associate
1501 CALL cp_fm_release(cvec)
1502 CALL cp_fm_release(umat)
1503 END DO
1504
1505 CALL timestop(handle)
1506
1507 END SUBROUTINE tddfpt_resvec3
1508
1509! **************************************************************************************************
1510!> \brief Calculate direct tddft forces
1511!> \param qs_env ...
1512!> \param ex_env ...
1513!> \param gs_mos ...
1514!> \param kernel_env ...
1515!> \param sub_env ...
1516!> \param work_matrices ...
1517!> \param debug_forces ...
1518!> \par History
1519!> * 01.2020 screated [JGH]
1520! **************************************************************************************************
1521 SUBROUTINE tddfpt_kernel_force(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, debug_forces)
1522
1523 TYPE(qs_environment_type), POINTER :: qs_env
1524 TYPE(excited_energy_type), POINTER :: ex_env
1525 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
1526 POINTER :: gs_mos
1527 TYPE(kernel_env_type), INTENT(IN) :: kernel_env
1528 TYPE(tddfpt_subgroup_env_type) :: sub_env
1529 TYPE(tddfpt_work_matrices) :: work_matrices
1530 LOGICAL, INTENT(IN) :: debug_forces
1531
1532 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_kernel_force'
1533
1534 INTEGER :: handle
1535 TYPE(dft_control_type), POINTER :: dft_control
1536 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
1537
1538 CALL timeset(routinen, handle)
1539
1540 CALL get_qs_env(qs_env, dft_control=dft_control)
1541 tddfpt_control => dft_control%tddfpt2_control
1542
1543 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
1544 ! full Kernel
1545 CALL fhxc_force(qs_env, ex_env, gs_mos, kernel_env%full_kernel, debug_forces)
1546 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_stda) THEN
1547 ! sTDA Kernel
1548 CALL stda_force(qs_env, ex_env, gs_mos, kernel_env%stda_kernel, sub_env, work_matrices, debug_forces)
1549 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_none) THEN
1550 ! nothing to be done here
1551 ex_env%matrix_wx1 => null()
1552 ELSE
1553 cpabort('Unknown kernel type')
1554 END IF
1555
1556 CALL timestop(handle)
1557
1558 END SUBROUTINE tddfpt_kernel_force
1559
1560END MODULE qs_tddfpt2_forces
Types and set/get functions for auxiliary density matrix methods.
Definition admm_types.F:15
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
Definition admm_types.F:599
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public hehn2024
integer, save, public sertcan2024
integer, save, public hehn2022
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_complete_redistribute(matrix, redist)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_dot(matrix_a, matrix_b, trace)
Computes the dot product of two matrices, also known as the trace of their matrix product.
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.
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
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_copy_general(source, destination, para_env)
General copy of a fm matrix to another fm matrix. Uses non-blocking MPI rather than ScaLAPACK.
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 ...
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
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
Types for excited states potential energies.
subroutine, public exstate_potential_release(ex_env)
...
subroutine, public init_coulomb_local(hartree_local, natom)
...
subroutine, public vh_1c_gg_integrals(qs_env, energy_hartree_1c, ecoul_1c, local_rho_set, para_env, tddft, local_rho_set_2nd, core_2nd)
Calculates one center GAPW Hartree energies and matrix elements Hartree potentials are input Takes po...
subroutine, public hartree_local_release(hartree_local)
...
subroutine, public hartree_local_create(hartree_local)
...
Routines to calculate HFX energy and potential.
subroutine, public integrate_four_center(qs_env, x_data, ks_matrix, ehfx, rho_ao, hfx_section, para_env, geometry_did_change, irep, distribute_fock_matrix, ispin, nspins)
computes four center integrals for a full basis set and updates the Kohn-Sham-Matrix and energy....
RI-methods for HFX.
Definition hfx_ri.F:12
subroutine, public hfx_ri_update_ks(qs_env, ri_data, ks_matrix, ehfx, mos, rho_ao, geometry_did_change, nspins, hf_fraction)
...
Definition hfx_ri.F:1041
Types and set/get functions for HFX.
Definition hfx_types.F:16
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public tddfpt_kernel_none
integer, parameter, public oe_shift
integer, parameter, public do_admm_aux_exch_func_none
integer, parameter, public tddfpt_kernel_full
integer, parameter, public tddfpt_kernel_stda
integer, parameter, public no_sf_tddfpt
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
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Interface to the message passing library MPI.
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
Definition mulliken.F:13
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
functions related to the poisson solver on regular grids
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
collects routines that calculate density matrices
subroutine, public calculate_xwx_matrix(mos_active, xvec, s_matrix, ks_matrix, w_matrix, eval)
Calculate the excited state W matrix from the MO eigenvectors, KS matrix.
subroutine, public calculate_wx_matrix(mos_active, xvec, ks_matrix, w_matrix)
Calculate the excited state W matrix from the MO eigenvectors, KS matrix.
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.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
subroutine, public sum_qs_force(qs_force_out, qs_force_in)
Sum up two qs_force entities qs_force_out = qs_force_out + qs_force_in.
subroutine, public deallocate_qs_force(qs_force)
Deallocate a Quickstep force data structure.
subroutine, public zero_qs_force(qs_force)
Initialize a Quickstep force data structure.
subroutine, public allocate_qs_force(qs_force, natom_of_kind)
Allocate a Quickstep force data structure.
subroutine, public total_qs_force(force, qs_force, atomic_kind_set)
Get current total force.
Setup Routine for Fxc Potentials.
Definition qs_fxc.F:29
subroutine, public qs_fxc_create(qs_env, rho0_struct, rho1_struct, rho0_atom_set, xc_section, do_onecenter, fxc_rho, fxc_tau, rho1_atom_set, do_scale, is_triplet, spinflip, no_weights, uf_grid_results, pw_env_ext, kind_set_external, para_env_external, compute_virial, virial_xc)
...
Definition qs_fxc.F:118
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external, pw_env_sub)
...
Integrate single or product functions over a potential on a RS grid.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, hund_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, do_mtlr_present, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
routines that build the Kohn-Sham matrix contributions coming from local atomic densities
Definition qs_ks_atom.F:12
subroutine, public update_ks_atom(qs_env, ksmat, pmat, forces, tddft, rho_atom_external, kind_set_external, oce_external, sab_external, kscale, kintegral, kforce, fscale)
The correction to the KS matrix due to the GAPW local terms to the hartree and XC contributions is he...
Definition qs_ks_atom.F:110
Calculate the KS reference potentials.
subroutine, public ks_ref_potential_atom(qs_env, local_rho_set, local_rho_set_admm, v_hartree_rspace)
calculate the Kohn-Sham GAPW reference potentials
subroutine, public ks_ref_potential(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, ehartree, exc, h_stress, vadmm_tau_rspace)
calculate the Kohn-Sham reference potential
subroutine, public local_rho_set_create(local_rho_set)
...
subroutine, public local_rho_set_release(local_rho_set)
...
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.
Define the neighbor list data types and the corresponding functionality.
Calculation of overlap matrix, its derivatives and forces.
Definition qs_overlap.F:19
subroutine, public build_overlap_matrix(ks_env, matrix_s, matrixkp_s, matrix_name, nderivative, basis_type_a, basis_type_b, sab_nl, calculate_forces, matrix_p, matrixkp_p, ext_kpoints)
Calculation of the overlap matrix over Cartesian Gaussian functions.
Definition qs_overlap.F:121
subroutine, public rho0_s_grid_create(pw_env, rho0_mpole)
...
subroutine, public integrate_vhg0_rspace(qs_env, v_rspace, para_env, calculate_forces, local_rho_set, local_rho_set_2nd, atener, kforce, my_pools, my_rs_descs)
...
subroutine, public init_rho0(local_rho_set, qs_env, gapw_control, zcore)
...
subroutine, public get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, mp_gau_ikind, mp_rho, norm_g0l_h, qlm_gg, qlm_car, qlm_tot, zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, max_rpgf0_s, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs)
...
subroutine, public allocate_rho_atom_internals(rho_atom_set, atomic_kind_set, qs_kind_set, dft_control, para_env)
...
subroutine, public calculate_rho_atom_coeff(qs_env, rho_ao, rho_atom_set, qs_kind_set, oce, sab, para_env)
...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_set(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
subroutine, public qs_rho_create(rho)
Allocates a new instance of rho.
subroutine, public stda_force(qs_env, ex_env, gs_mos, stda_env, sub_env, work, debug_forces)
Simplified Tamm Dancoff approach (sTDA). Kernel contribution to forces.
subroutine, public fhxc_force(qs_env, ex_env, gs_mos, full_kernel, debug_forces)
Calculate direct tddft forces. Calculate the three last terms of the response vector in equation 49 a...
subroutine, public tddfpt_forces_main(qs_env, gs_mos, ex_env, kernel_env, sub_env, work_matrices)
Perform TDDFPT gradient calculation. This routine calculates the response vector R of Eq....
types for task lists
type(xc_rho_cflags_type) function, public xc_functionals_get_needs(functionals, lsd, calc_potential)
...
contains the structure
Calculation of Coulomb Hessian contributions in xTB.
Definition xtb_ehess.F:12
subroutine, public xtb_coulomb_hessian(qs_env, ks_matrix, charges1, mcharge1, mcharge, matrix_p1)
...
Definition xtb_ehess.F:79
Definition of the xTB parameter types.
Definition xtb_types.F:20
subroutine, public get_xtb_atom_param(xtb_parameter, symbol, aname, typ, defined, z, zeff, natorb, lmax, nao, lao, rcut, rcov, kx, eta, xgamma, alpha, zneff, nshell, nval, lval, kpoly, kappa, wall, hen, zeta, xi, kappa0, alpg, occupation, ngauss, electronegativity, chmax, en, kqat2, kcn, kq)
...
Definition xtb_types.F:206
stores some data used in wavefunction fitting
Definition admm_types.F:120
Provides all information about an atomic kind.
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...
Contains information on the excited states energy.
stores some data used in construction of Kohn-Sham matrix
Definition hfx_types.F:514
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Type to hold environments for the different kernels.
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.
Ground state molecular orbitals.
Set of temporary ("work") matrices.
contains a flag for each component of xc_rho_set, so that you can use it to tell which components you...