(git:495eafe)
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,&
64 USE kinds, ONLY: default_string_length,&
65 dp
67 USE mulliken, ONLY: ao_charges
70 USE pw_env_types, ONLY: pw_env_get,&
72 USE pw_methods, ONLY: pw_axpy,&
73 pw_scale,&
79 USE pw_types, ONLY: pw_c1d_gs_type,&
93 USE qs_fxc, ONLY: qs_fxc_analytic,&
96 USE qs_integrate_potential, ONLY: integrate_v_rspace
98 USE qs_kind_types, ONLY: get_qs_kind,&
101 USE qs_ks_atom, ONLY: update_ks_atom
104 USE qs_ks_types, ONLY: qs_ks_env_type
108 USE qs_mo_types, ONLY: get_mo_set,&
115 USE qs_rho0_methods, ONLY: init_rho0
120 USE qs_rho_types, ONLY: qs_rho_create,&
121 qs_rho_get,&
122 qs_rho_set,&
134 USE xtb_types, ONLY: get_xtb_atom_param,&
136#include "./base/base_uses.f90"
137
138 IMPLICIT NONE
139
140 PRIVATE
141
142 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_tddfpt2_forces'
143
144 PUBLIC :: tddfpt_forces_main
145
146! **************************************************************************************************
147
148CONTAINS
149
150! **************************************************************************************************
151!> \brief Perform TDDFPT gradient calculation. This routine calculates the response vector R of Eq. 49
152!> in J. Chem. Theory Comput. 2022, 18, 4186−4202 (https://doi.org/10.1021/acs.jctc.2c00144)
153!> in ex_env%cpmos and a few contributions to the gradient.
154!> \param qs_env Quickstep environment
155!> \param gs_mos ...
156!> \param ex_env Holds: Response vector ex_env%cpmos = R
157!> Difference density ex_env%matrix_pe = T
158!> Matrix ex_env%matrix_hz = H_munu[T]
159!> \param kernel_env ...
160!> \param sub_env ...
161!> \param work_matrices ...
162!> \par History
163!> * 10.2022 created JHU
164! **************************************************************************************************
165 SUBROUTINE tddfpt_forces_main(qs_env, gs_mos, ex_env, kernel_env, sub_env, work_matrices)
166 TYPE(qs_environment_type), POINTER :: qs_env
167 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
168 POINTER :: gs_mos
169 TYPE(excited_energy_type), POINTER :: ex_env
170 TYPE(kernel_env_type) :: kernel_env
171 TYPE(tddfpt_subgroup_env_type) :: sub_env
172 TYPE(tddfpt_work_matrices) :: work_matrices
173
174 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_forces_main'
175
176 INTEGER :: handle, ispin, nspins, spin
177 LOGICAL :: do_sf
178 TYPE(admm_type), POINTER :: admm_env
179 TYPE(cp_fm_struct_type), POINTER :: matrix_struct
180 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_pe_asymm, matrix_pe_symm, &
181 matrix_s, matrix_s_aux_fit
182 TYPE(dft_control_type), POINTER :: dft_control
183 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
184
185 CALL timeset(routinen, handle)
186
187 CALL get_qs_env(qs_env, dft_control=dft_control)
188
189 CALL cite_reference(hehn2022)
190 CALL cite_reference(hehn2024)
191 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc) CALL cite_reference(sertcan2024)
192
193 nspins = dft_control%nspins
194 tddfpt_control => dft_control%tddfpt2_control
195 IF (tddfpt_control%spinflip == no_sf_tddfpt) THEN
196 do_sf = .false.
197 ELSE
198 do_sf = .true.
199 END IF
200
201 ! disable RES-TDDFPT for now
202 DO ispin = 1, nspins
203 IF (gs_mos(ispin)%nmo_occ /= gs_mos(ispin)%nmo_active) THEN
204 CALL cp_abort(__location__, "RES-TDDFPT Forces NYA")
205 END IF
206 END DO
207
208 ! rhs of linres equation
209 IF (ASSOCIATED(ex_env%cpmos)) THEN
210 DO ispin = 1, SIZE(ex_env%cpmos)
211 CALL cp_fm_release(ex_env%cpmos(ispin))
212 END DO
213 DEALLOCATE (ex_env%cpmos)
214 END IF
215 ALLOCATE (ex_env%cpmos(nspins))
216 ! Create and initialize rectangular matrices of nao*occ dimension for alpha and beta R vectors
217 ! for the Z-vector equation system: AZ=-R
218 DO ispin = 1, nspins
219 CALL cp_fm_get_info(gs_mos(ispin)%mos_occ, matrix_struct=matrix_struct)
220 CALL cp_fm_create(ex_env%cpmos(ispin), matrix_struct)
221 CALL cp_fm_set_all(ex_env%cpmos(ispin), 0.0_dp)
222 END DO
223 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
224 NULLIFY (matrix_pe_asymm, matrix_pe_symm)
225
226 ! Build difference density matrix_pe = X*X^T - (C*X^T*S*X*C^T + (C*X^T*S*X*C^T)^T)/2
227 !
228 CALL dbcsr_allocate_matrix_set(ex_env%matrix_pe, nspins)
229 CALL dbcsr_allocate_matrix_set(matrix_pe_symm, nspins)
230 CALL dbcsr_allocate_matrix_set(matrix_pe_asymm, nspins)
231 DO ispin = 1, nspins
232
233 ! Initialize matrix_pe as a sparse matrix with zeros
234 ALLOCATE (ex_env%matrix_pe(ispin)%matrix)
235 CALL dbcsr_create(ex_env%matrix_pe(ispin)%matrix, template=matrix_s(1)%matrix)
236 CALL dbcsr_copy(ex_env%matrix_pe(ispin)%matrix, matrix_s(1)%matrix)
237 CALL dbcsr_set(ex_env%matrix_pe(ispin)%matrix, 0.0_dp)
238
239 ALLOCATE (matrix_pe_symm(ispin)%matrix)
240 CALL dbcsr_create(matrix_pe_symm(ispin)%matrix, template=matrix_s(1)%matrix)
241 CALL dbcsr_copy(matrix_pe_symm(ispin)%matrix, ex_env%matrix_pe(ispin)%matrix)
242
243 ALLOCATE (matrix_pe_asymm(ispin)%matrix)
244 CALL dbcsr_create(matrix_pe_asymm(ispin)%matrix, template=matrix_s(1)%matrix, &
245 matrix_type=dbcsr_type_antisymmetric)
246 CALL dbcsr_complete_redistribute(ex_env%matrix_pe(ispin)%matrix, matrix_pe_asymm(ispin)%matrix)
247
248 IF (do_sf) THEN
249 spin = 1
250 ELSE
251 spin = ispin
252 END IF
253 ! Add difference density to matrix_pe
254 CALL tddfpt_resvec1(ex_env%evect(spin), gs_mos(spin)%mos_active, &
255 matrix_s(1)%matrix, ex_env%matrix_pe(ispin)%matrix, ispin, do_sf)
256 END DO
257 !
258 ! Project the difference density into auxiliary basis for ADMM
259 IF (dft_control%do_admm) THEN
260 CALL get_qs_env(qs_env, admm_env=admm_env)
261 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
262 CALL dbcsr_allocate_matrix_set(ex_env%matrix_pe_admm, nspins)
263 DO ispin = 1, nspins
264 ALLOCATE (ex_env%matrix_pe_admm(ispin)%matrix)
265 CALL dbcsr_create(ex_env%matrix_pe_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
266 CALL dbcsr_copy(ex_env%matrix_pe_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
267 CALL dbcsr_set(ex_env%matrix_pe_admm(ispin)%matrix, 0.0_dp)
268 CALL tddfpt_resvec1_admm(ex_env%matrix_pe(ispin)%matrix, &
269 admm_env, ex_env%matrix_pe_admm(ispin)%matrix)
270 END DO
271 END IF
272 !
273 CALL dbcsr_allocate_matrix_set(ex_env%matrix_hz, nspins)
274 DO ispin = 1, nspins
275 ALLOCATE (ex_env%matrix_hz(ispin)%matrix)
276 CALL dbcsr_create(ex_env%matrix_hz(ispin)%matrix, template=matrix_s(1)%matrix)
277 CALL dbcsr_copy(ex_env%matrix_hz(ispin)%matrix, matrix_s(1)%matrix)
278 CALL dbcsr_set(ex_env%matrix_hz(ispin)%matrix, 0.0_dp)
279 END DO
280 ! Calculate first term of R vector: H_{\mu i\sigma}[T]
281 IF (dft_control%qs_control%xtb) THEN
282 CALL tddfpt_resvec2_xtb(qs_env, ex_env%matrix_pe, gs_mos, ex_env%matrix_hz, ex_env%cpmos)
283 ELSE
284 CALL tddfpt_resvec2(qs_env, ex_env%matrix_pe, ex_env%matrix_pe_admm, &
285 gs_mos, ex_env%matrix_hz, ex_env%cpmos)
286 END IF
287 !
288 CALL dbcsr_allocate_matrix_set(ex_env%matrix_px1, SIZE(ex_env%evect, 1))
289 CALL dbcsr_allocate_matrix_set(ex_env%matrix_px1_asymm, SIZE(ex_env%evect, 1))
290 DO ispin = 1, SIZE(ex_env%evect, 1)
291 ALLOCATE (ex_env%matrix_px1(ispin)%matrix)
292 CALL dbcsr_create(ex_env%matrix_px1(ispin)%matrix, template=matrix_s(1)%matrix)
293 CALL dbcsr_copy(ex_env%matrix_px1(ispin)%matrix, matrix_s(1)%matrix)
294 CALL dbcsr_set(ex_env%matrix_px1(ispin)%matrix, 0.0_dp)
295
296 ALLOCATE (ex_env%matrix_px1_asymm(ispin)%matrix)
297 CALL dbcsr_create(ex_env%matrix_px1_asymm(ispin)%matrix, template=matrix_s(1)%matrix, &
298 matrix_type=dbcsr_type_antisymmetric)
299 CALL dbcsr_complete_redistribute(ex_env%matrix_px1(ispin)%matrix, ex_env%matrix_px1_asymm(ispin)%matrix)
300 END DO
301 ! Kernel ADMM
302 IF (tddfpt_control%do_admm) THEN
303 CALL get_qs_env(qs_env, admm_env=admm_env)
304 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
305 CALL dbcsr_allocate_matrix_set(ex_env%matrix_px1_admm, SIZE(ex_env%evect, 1))
306 CALL dbcsr_allocate_matrix_set(ex_env%matrix_px1_admm_asymm, SIZE(ex_env%evect, 1))
307 DO ispin = 1, SIZE(ex_env%evect, 1)
308 ALLOCATE (ex_env%matrix_px1_admm(ispin)%matrix)
309 CALL dbcsr_create(ex_env%matrix_px1_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
310 CALL dbcsr_copy(ex_env%matrix_px1_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
311 CALL dbcsr_set(ex_env%matrix_px1_admm(ispin)%matrix, 0.0_dp)
312
313 ALLOCATE (ex_env%matrix_px1_admm_asymm(ispin)%matrix)
314 CALL dbcsr_create(ex_env%matrix_px1_admm_asymm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix, &
315 matrix_type=dbcsr_type_antisymmetric)
316 CALL dbcsr_complete_redistribute(ex_env%matrix_px1_admm(ispin)%matrix, &
317 ex_env%matrix_px1_admm_asymm(ispin)%matrix)
318 END DO
319 END IF
320 ! TDA forces. Calculates and adds all missing terms for the response vector, Eq. 49.
321 CALL tddfpt_forces(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices)
322 ! Rotate res vector cpmos into original frame of occupied orbitals.
323 CALL tddfpt_resvec3(qs_env, ex_env%cpmos, work_matrices)
324
325 CALL dbcsr_deallocate_matrix_set(matrix_pe_symm)
326 CALL dbcsr_deallocate_matrix_set(matrix_pe_asymm)
327
328 CALL timestop(handle)
329
330 END SUBROUTINE tddfpt_forces_main
331
332! **************************************************************************************************
333!> \brief Calculate direct tddft forces
334!> \param qs_env ...
335!> \param ex_env ...
336!> \param gs_mos ...
337!> \param kernel_env ...
338!> \param sub_env ...
339!> \param work_matrices ...
340!> \par History
341!> * 01.2020 screated [JGH]
342! **************************************************************************************************
343 SUBROUTINE tddfpt_forces(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices)
344
345 TYPE(qs_environment_type), POINTER :: qs_env
346 TYPE(excited_energy_type), POINTER :: ex_env
347 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
348 POINTER :: gs_mos
349 TYPE(kernel_env_type), INTENT(IN) :: kernel_env
350 TYPE(tddfpt_subgroup_env_type) :: sub_env
351 TYPE(tddfpt_work_matrices) :: work_matrices
352
353 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_forces'
354
355 INTEGER :: handle
356 INTEGER, ALLOCATABLE, DIMENSION(:) :: natom_of_kind
357 LOGICAL :: debug_forces
358 REAL(kind=dp) :: ehartree, exc
359 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
360 TYPE(dft_control_type), POINTER :: dft_control
361 TYPE(qs_force_type), DIMENSION(:), POINTER :: ks_force, td_force
362
363 CALL timeset(routinen, handle)
364
365 ! for extended debug output
366 debug_forces = ex_env%debug_forces
367 ! prepare force array
368 CALL get_qs_env(qs_env, dft_control=dft_control, force=ks_force, &
369 atomic_kind_set=atomic_kind_set)
370 CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, natom_of_kind=natom_of_kind)
371 NULLIFY (td_force)
372 CALL allocate_qs_force(td_force, natom_of_kind)
373 DEALLOCATE (natom_of_kind)
374 CALL zero_qs_force(td_force)
375 CALL set_qs_env(qs_env, force=td_force)
376 !
377 IF (dft_control%qs_control%xtb) THEN
378 CALL tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, &
379 work_matrices, debug_forces)
380 ELSE
381 !
382 CALL exstate_potential_release(ex_env)
383 ! Build the values of hartree, fock and exchange-correlation potential on the grid
384 CALL ks_ref_potential(qs_env, ex_env%vh_rspace, ex_env%vxc_rspace, &
385 ex_env%vtau_rspace, ex_env%vadmm_rspace, ehartree, exc, &
386 vadmm_tau_rspace=ex_env%vadmm_tau_rspace)
387 CALL ks_ref_potential_atom(qs_env, ex_env%local_rho_set, ex_env%local_rho_set_admm, &
388 ex_env%vh_rspace)
389 CALL tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, &
390 work_matrices, debug_forces)
391 END IF
392 !
393 ! add TD and KS forces
394 CALL get_qs_env(qs_env, force=td_force)
395 CALL sum_qs_force(ks_force, td_force)
396 CALL set_qs_env(qs_env, force=ks_force)
397 CALL deallocate_qs_force(td_force)
398 !
399 CALL timestop(handle)
400
401 END SUBROUTINE tddfpt_forces
402
403! **************************************************************************************************
404!> \brief Calculate direct tddft forces.
405!> J. Chem. Theory Comput. 2022, 18, 7, 4186–4202 (https://doi.org/10.1021/acs.jctc.2c00144)
406!> \param qs_env ...
407!> \param ex_env Holds on exit
408!> cpmos = R, Response vector, Eq. 49.
409!> matrix_pe = T, Difference density, Eq. 44.
410!> matrix_wx1 = CK[D^X]X^T, Third term of Eq. 51.
411!> matrix_wz = CX^T(\omegaS - K)XC^T, Last term of Eq. 51.
412!> \param gs_mos ...
413!> \param kernel_env ...
414!> \param sub_env ...
415!> \param work_matrices ...
416!> \param debug_forces ...
417!> \par History
418!> * 01.2020 screated [JGH]
419! **************************************************************************************************
420 SUBROUTINE tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, &
421 debug_forces)
422
423 TYPE(qs_environment_type), POINTER :: qs_env
424 TYPE(excited_energy_type), POINTER :: ex_env
425 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
426 POINTER :: gs_mos
427 TYPE(kernel_env_type), INTENT(IN) :: kernel_env
428 TYPE(tddfpt_subgroup_env_type) :: sub_env
429 TYPE(tddfpt_work_matrices) :: work_matrices
430 LOGICAL :: debug_forces
431
432 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_force_direct'
433
434 INTEGER :: handle, iounit, ispin, nact, natom, &
435 nspins, spin
436 LOGICAL :: do_sf
437 REAL(kind=dp) :: evalue
438 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: ftot1, ftot2
439 REAL(kind=dp), DIMENSION(3) :: fodeb
440 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
441 TYPE(cp_fm_type), DIMENSION(:), POINTER :: evect
442 TYPE(cp_logger_type), POINTER :: logger
443 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s, matrix_wx1, &
444 matrix_wz, scrm
445 TYPE(dft_control_type), POINTER :: dft_control
446 TYPE(mp_para_env_type), POINTER :: para_env
447 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
448 POINTER :: sab_orb
449 TYPE(qs_force_type), DIMENSION(:), POINTER :: force
450 TYPE(qs_ks_env_type), POINTER :: ks_env
451 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
452
453 CALL timeset(routinen, handle)
454
455 logger => cp_get_default_logger()
456 IF (logger%para_env%is_source()) THEN
457 iounit = cp_logger_get_default_unit_nr(logger, local=.true.)
458 ELSE
459 iounit = -1
460 END IF
461
462 evect => ex_env%evect
463
464 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env, para_env=para_env, &
465 sab_orb=sab_orb, dft_control=dft_control, force=force)
466 NULLIFY (tddfpt_control)
467 tddfpt_control => dft_control%tddfpt2_control
468 IF (tddfpt_control%spinflip == no_sf_tddfpt) THEN
469 do_sf = .false.
470 ELSE
471 do_sf = .true.
472 END IF
473 nspins = dft_control%nspins
474
475 IF (debug_forces) THEN
476 CALL get_qs_env(qs_env, natom=natom, atomic_kind_set=atomic_kind_set)
477 ALLOCATE (ftot1(3, natom))
478 CALL total_qs_force(ftot1, force, atomic_kind_set)
479 END IF
480
481 ! Build last terms of the response vector, Eq. 49, and third term of Lambda_munu, Eq. 51.
482 ! the response vector is in ex_env%cpmos and Lambda is in ex_env%matrix_wx1
483 CALL tddfpt_kernel_force(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, debug_forces)
484
485 ! Overlap matrix, build the Lambda matrix, Eq. 51.
486 NULLIFY (matrix_wx1, matrix_wz)
487 CALL dbcsr_allocate_matrix_set(matrix_wz, nspins)
488 matrix_wx1 => ex_env%matrix_wx1
489 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks)
490 DO ispin = 1, nspins
491 IF (do_sf) THEN
492 spin = 1
493 ELSE
494 spin = ispin
495 END IF
496 ! Create and initialize the Lambda matrix as a sparse matrix
497 ALLOCATE (matrix_wz(ispin)%matrix)
498 CALL dbcsr_create(matrix=matrix_wz(ispin)%matrix, template=matrix_s(1)%matrix)
499 CALL cp_dbcsr_alloc_block_from_nbl(matrix_wz(ispin)%matrix, sab_orb)
500 CALL dbcsr_set(matrix_wz(ispin)%matrix, 0.0_dp)
501 ! For spin-flip excitations only the beta component of the Lambda matrix
502 ! contains the excitation energy term
503 IF (.NOT. (do_sf .AND. (ispin == 1))) THEN
504 CALL cp_fm_get_info(evect(spin), ncol_global=nact)
505 CALL cp_dbcsr_plus_fm_fm_t(matrix_wz(ispin)%matrix, matrix_v=evect(spin), ncol=nact)
506 evalue = ex_env%evalue
507 IF (tddfpt_control%oe_corr == oe_shift) THEN
508 evalue = ex_env%evalue - tddfpt_control%ev_shift
509 END IF
510 CALL dbcsr_scale(matrix_wz(ispin)%matrix, evalue)
511 END IF
512 ! For spin-flip excitations only the alpha component of the Lambda matrix
513 ! contains the occupied MO energy term
514 IF (.NOT. (do_sf .AND. (ispin == 2))) THEN
515 CALL calculate_wx_matrix(gs_mos(ispin)%mos_active, evect(spin), matrix_ks(ispin)%matrix, &
516 matrix_wz(ispin)%matrix)
517 END IF
518 END DO
519 IF (nspins == 2) THEN
520 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
521 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
522 END IF
523 NULLIFY (scrm)
524 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
525 ! Calculate the force contribution of matrix_xz into the force in ks_env.
526 ! force%overlap = Tr(dS*matrix_wz), last term of Eq. 51.
527 CALL build_overlap_matrix(ks_env, matrix_s=scrm, &
528 matrix_name="OVERLAP MATRIX", &
529 basis_type_a="ORB", basis_type_b="ORB", &
530 sab_nl=sab_orb, calculate_forces=.true., &
531 matrix_p=matrix_wz(1)%matrix)
533 CALL dbcsr_deallocate_matrix_set(matrix_wz)
534 IF (debug_forces) THEN
535 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
536 CALL para_env%sum(fodeb)
537 IF (iounit > 0) WRITE (iounit, "(T3,A,T33,3F16.8)") "DEBUG:: Wx*dS ", fodeb
538 END IF
539
540 ! Overlap matrix. Build a part of the first term of Lamda, Eq. 51, corresponding to
541 ! the second term of Eq. 41. matrix_wz = C*X^T*(omega*S - K)*X*C^T
542 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks)
543 NULLIFY (matrix_wz)
544 CALL dbcsr_allocate_matrix_set(matrix_wz, nspins)
545 DO ispin = 1, nspins
546 ALLOCATE (matrix_wz(ispin)%matrix)
547 CALL dbcsr_create(matrix=matrix_wz(ispin)%matrix, template=matrix_s(1)%matrix)
548 CALL cp_dbcsr_alloc_block_from_nbl(matrix_wz(ispin)%matrix, sab_orb)
549 CALL dbcsr_set(matrix_wz(ispin)%matrix, 0.0_dp)
550 ! For spin-flip excitations only the alpha component of Lambda has contributions
551 ! of this term, so skip beta
552 IF (.NOT. (do_sf .AND. (ispin == 2))) THEN
553 evalue = ex_env%evalue
554 IF (tddfpt_control%oe_corr == oe_shift) THEN
555 evalue = ex_env%evalue - tddfpt_control%ev_shift
556 END IF
557 IF (do_sf) THEN
558 spin = 2
559 ELSE
560 spin = ispin
561 END IF
562 CALL calculate_xwx_matrix(gs_mos(ispin)%mos_active, evect(ispin), matrix_s(1)%matrix, &
563 matrix_ks(spin)%matrix, matrix_wz(ispin)%matrix, evalue)
564 END IF
565 END DO
566 IF (nspins == 2) THEN
567 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
568 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
569 END IF
570 NULLIFY (scrm)
571 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
572 CALL build_overlap_matrix(ks_env, matrix_s=scrm, &
573 matrix_name="OVERLAP MATRIX", &
574 basis_type_a="ORB", basis_type_b="ORB", &
575 sab_nl=sab_orb, calculate_forces=.true., &
576 matrix_p=matrix_wz(1)%matrix)
578 CALL dbcsr_deallocate_matrix_set(matrix_wz)
579 IF (debug_forces) THEN
580 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
581 CALL para_env%sum(fodeb)
582 IF (iounit > 0) WRITE (iounit, "(T3,A,T33,3F16.8)") "DEBUG:: xWx*dS ", fodeb
583 END IF
584
585 ! Compute force contribution of the first term of Eq. 41 in the first term of Eq. 51
586 ! that was calculated in tddfpt_kernel_force,
587 ! force%overlap = 0.5C*H[T]*C^T
588 IF (ASSOCIATED(matrix_wx1)) THEN
589 IF (nspins == 2 .AND. .NOT. do_sf) THEN
590 CALL dbcsr_add(matrix_wx1(1)%matrix, matrix_wx1(2)%matrix, &
591 alpha_scalar=0.5_dp, beta_scalar=0.5_dp)
592 ELSE IF (nspins == 2 .AND. do_sf) THEN
593 CALL dbcsr_add(matrix_wx1(1)%matrix, matrix_wx1(2)%matrix, &
594 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
595 END IF
596 NULLIFY (scrm)
597 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
598 CALL build_overlap_matrix(ks_env, matrix_s=scrm, &
599 matrix_name="OVERLAP MATRIX", &
600 basis_type_a="ORB", basis_type_b="ORB", &
601 sab_nl=sab_orb, calculate_forces=.true., &
602 matrix_p=matrix_wx1(1)%matrix)
604 IF (debug_forces) THEN
605 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
606 CALL para_env%sum(fodeb)
607 IF (iounit > 0) WRITE (iounit, "(T3,A,T33,3F16.8)") "DEBUG:: D^XKP*dS ", fodeb
608 END IF
609 END IF
610
611 IF (debug_forces) THEN
612 ALLOCATE (ftot2(3, natom))
613 CALL total_qs_force(ftot2, force, atomic_kind_set)
614 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
615 CALL para_env%sum(fodeb)
616 IF (iounit > 0) WRITE (iounit, "(T3,A,T30,3F16.8)") "DEBUG:: Excitation Force", fodeb
617 DEALLOCATE (ftot1, ftot2)
618 END IF
619
620 CALL timestop(handle)
621
622 END SUBROUTINE tddfpt_force_direct
623
624! **************************************************************************************************
625!> \brief Build the spin difference density,
626!> matrix_pe = matrix_pe + X*X^T - (C*X^T*S*X*C^T + (C*X^T*S*X*C^T)^T)/2
627!> \param evect ...
628!> \param mos_active ...
629!> \param matrix_s ...
630!> \param matrix_pe ...
631!> \param spin ...
632!> \param do_sf ...
633! **************************************************************************************************
634 SUBROUTINE tddfpt_resvec1(evect, mos_active, matrix_s, matrix_pe, spin, do_sf)
635
636 TYPE(cp_fm_type), INTENT(IN) :: evect, mos_active
637 TYPE(dbcsr_type), POINTER :: matrix_s, matrix_pe
638 INTEGER, INTENT(IN) :: spin
639 LOGICAL, INTENT(IN) :: do_sf
640
641 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_resvec1'
642
643 INTEGER :: handle, iounit, nact, nao, norb
644 REAL(kind=dp) :: tmp
645 TYPE(cp_fm_struct_type), POINTER :: fmstruct, fmstruct2
646 TYPE(cp_fm_type) :: cxmat, xxmat
647 TYPE(cp_logger_type), POINTER :: logger
648
649 CALL timeset(routinen, handle)
650 CALL cp_fm_get_info(mos_active, nrow_global=nao, ncol_global=norb)
651 CALL cp_fm_get_info(evect, nrow_global=nao, ncol_global=nact)
652 cpassert(norb == nact)
653
654 ! matrix_pe = X*X^T
655 IF (.NOT. do_sf .OR. (do_sf .AND. (spin == 2))) THEN
656 CALL cp_dbcsr_plus_fm_fm_t(matrix_pe, matrix_v=evect, ncol=norb)
657 END IF
658
659 ! matrix_pe = matrix_pe - (C*X^T*S*X*C^T + (C*X^T*S*X*C^T)^T)/2
660 IF (.NOT. do_sf .OR. (do_sf .AND. (spin == 1))) THEN
661 CALL cp_fm_get_info(evect, matrix_struct=fmstruct)
662 NULLIFY (fmstruct2)
663 CALL cp_fm_struct_create(fmstruct=fmstruct2, template_fmstruct=fmstruct, &
664 nrow_global=norb, ncol_global=norb)
665 CALL cp_fm_create(xxmat, matrix_struct=fmstruct2)
666 CALL cp_fm_struct_release(fmstruct2)
667 CALL cp_fm_create(cxmat, matrix_struct=fmstruct)
668 ! S*X
669 CALL cp_dbcsr_sm_fm_multiply(matrix_s, evect, cxmat, norb, alpha=1.0_dp, beta=0.0_dp)
670 ! (S*X)^T*X
671 CALL parallel_gemm('T', 'N', norb, norb, nao, 1.0_dp, cxmat, evect, 0.0_dp, xxmat)
672 ! C*X^T*S*X
673 CALL parallel_gemm('N', 'N', nao, norb, norb, 1.0_dp, mos_active, xxmat, 0.0_dp, cxmat)
674 CALL cp_fm_release(xxmat)
675 ! matrix_pe = matrix_pe - (C*(C^T*X^T*S*X)^T + C^T*(C^T*X^T*S*X))/2
676 CALL cp_dbcsr_plus_fm_fm_t(matrix_pe, matrix_v=mos_active, matrix_g=cxmat, &
677 ncol=norb, alpha=-1.0_dp, symmetry_mode=1)
678 CALL cp_fm_release(cxmat)
679 END IF
680 !
681 ! Test for Tr(Pe*S)=0
682 CALL dbcsr_dot(matrix_pe, matrix_s, tmp)
683 IF (.NOT. do_sf) THEN
684 IF (abs(tmp) > 1.e-08_dp) THEN
685 logger => cp_get_default_logger()
686 IF (logger%para_env%is_source()) THEN
687 iounit = cp_logger_get_default_unit_nr(logger, local=.true.)
688 ELSE
689 iounit = -1
690 END IF
691 cpwarn("Electron count of excitation density matrix is non-zero.")
692 IF (iounit > 0) THEN
693 WRITE (iounit, "(T2,A,T61,G20.10)") "Measured electron count is ", tmp
694 WRITE (iounit, "(T2,A,/)") repeat("*", 79)
695 END IF
696 END IF
697 ELSE IF (spin == 1) THEN
698 IF (abs(tmp + 1) > 1.e-08_dp) THEN
699 logger => cp_get_default_logger()
700 IF (logger%para_env%is_source()) THEN
701 iounit = cp_logger_get_default_unit_nr(logger, local=.true.)
702 ELSE
703 iounit = -1
704 END IF
705 cpwarn("Count of occupied occupation number change is not -1.")
706 IF (iounit > 0) THEN
707 WRITE (iounit, "(T2,A,T61,G20.10)") "Measured electron count is ", tmp
708 WRITE (iounit, "(T2,A,/)") repeat("*", 79)
709 END IF
710 END IF
711 ELSE IF (spin == 2) THEN
712 IF (abs(tmp - 1) > 1.e-08_dp) THEN
713 logger => cp_get_default_logger()
714 IF (logger%para_env%is_source()) THEN
715 iounit = cp_logger_get_default_unit_nr(logger, local=.true.)
716 ELSE
717 iounit = -1
718 END IF
719 cpwarn("Count of unoccupied occupation number change is not 1.")
720 IF (iounit > 0) THEN
721 WRITE (iounit, "(T2,A,T61,G20.10)") "Measured electron count is ", tmp
722 WRITE (iounit, "(T2,A,/)") repeat("*", 79)
723 END IF
724 END IF
725 END IF
726 !
727
728 CALL timestop(handle)
729
730 END SUBROUTINE tddfpt_resvec1
731
732! **************************************************************************************************
733!> \brief PA = A * P * A(T)
734!> \param matrix_pe ...
735!> \param admm_env ...
736!> \param matrix_pe_admm ...
737! **************************************************************************************************
738 SUBROUTINE tddfpt_resvec1_admm(matrix_pe, admm_env, matrix_pe_admm)
739
740 TYPE(dbcsr_type), POINTER :: matrix_pe
741 TYPE(admm_type), POINTER :: admm_env
742 TYPE(dbcsr_type), POINTER :: matrix_pe_admm
743
744 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_resvec1_admm'
745
746 INTEGER :: handle, nao, nao_aux
747
748 CALL timeset(routinen, handle)
749 !
750 nao_aux = admm_env%nao_aux_fit
751 nao = admm_env%nao_orb
752 !
753 CALL copy_dbcsr_to_fm(matrix_pe, admm_env%work_orb_orb)
754 CALL parallel_gemm('N', 'N', nao_aux, nao, nao, &
755 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
756 admm_env%work_aux_orb)
757 CALL parallel_gemm('N', 'T', nao_aux, nao_aux, nao, &
758 1.0_dp, admm_env%work_aux_orb, admm_env%A, 0.0_dp, &
759 admm_env%work_aux_aux)
760 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_pe_admm, keep_sparsity=.true.)
761 !
762 CALL timestop(handle)
763
764 END SUBROUTINE tddfpt_resvec1_admm
765
766! **************************************************************************************************
767!> \brief Calculates the action of the H operator as in the first term of equation 49 in
768!> https://doi.org/10.1021/acs.jctc.2c00144 (J. Chem. Theory Comput. 2022, 18, 4186−4202)
769!> cpmos = H_{\mu i\sigma}[matrix_pe]
770!> \param qs_env ...
771!> \param matrix_pe Input square matrix with the size of the number of atomic orbitals squared nao^2
772!> \param matrix_pe_admm ...
773!> \param gs_mos ...
774!> \param matrix_hz Holds H_{\mu\nu\sigma}[matrix_pe] on exit
775!> \param cpmos ...
776! **************************************************************************************************
777 SUBROUTINE tddfpt_resvec2(qs_env, matrix_pe, matrix_pe_admm, gs_mos, matrix_hz, cpmos)
778
779 TYPE(qs_environment_type), POINTER :: qs_env
780 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_pe, matrix_pe_admm
781 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
782 POINTER :: gs_mos
783 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_hz
784 TYPE(cp_fm_type), DIMENSION(:), INTENT(INOUT) :: cpmos
785
786 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_resvec2'
787
788 CHARACTER(LEN=default_string_length) :: basis_type
789 INTEGER :: handle, iounit, ispin, mspin, n_rep_hf, &
790 nao, nao_aux, natom, norb, nspins
791 LOGICAL :: deriv2_analytic, distribute_fock_matrix, do_hfx, gapw, gapw_xc, &
792 hfx_treat_lsd_in_core, needs_tau_response, s_mstruct_changed
793 REAL(kind=dp) :: eh1, focc, rhotot, thartree
794 REAL(kind=dp), DIMENSION(2) :: total_rho
795 REAL(kind=dp), DIMENSION(:), POINTER :: qlm_tot
796 TYPE(admm_type), POINTER :: admm_env
797 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
798 TYPE(cp_fm_type), POINTER :: mos
799 TYPE(cp_logger_type), POINTER :: logger
800 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: msaux
801 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mhz, mpe
802 TYPE(dbcsr_type), POINTER :: dbwork
803 TYPE(dft_control_type), POINTER :: dft_control
804 TYPE(hartree_local_type), POINTER :: hartree_local
805 TYPE(hfx_type), DIMENSION(:, :), POINTER :: x_data
806 TYPE(local_rho_type), POINTER :: local_rho_set, local_rho_set_admm
807 TYPE(mp_para_env_type), POINTER :: para_env
808 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
809 POINTER :: sab, sab_aux_fit
810 TYPE(oce_matrix_type), POINTER :: oce
811 TYPE(pw_c1d_gs_type) :: rho_tot_gspace, v_hartree_gspace
812 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g, rho_g_aux, rhoz_g_aux, &
813 rhoz_tau_g_aux, trho_g, trho_tau_g, &
814 trho_xc_g, trho_xc_tau_g
815 TYPE(pw_env_type), POINTER :: pw_env
816 TYPE(pw_poisson_type), POINTER :: poisson_env
817 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
818 TYPE(pw_r3d_rs_type) :: v_hartree_rspace
819 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r, rho_r_aux, rhoz_r_aux, &
820 rhoz_tau_r_aux, trho_r, trho_tau_r, &
821 trho_xc_r, trho_xc_tau_r, v_xc, &
822 v_xc_tau
823 TYPE(pw_r3d_rs_type), POINTER :: weights
824 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
825 TYPE(qs_ks_env_type), POINTER :: ks_env
826 TYPE(qs_rho_type), POINTER :: rho, rho_aux_fit, rho_xc, rhoz_aux, trho
827 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho1_atom_set, rho_atom_set
828 TYPE(section_vals_type), POINTER :: hfx_section, input, xc_fun_section, &
829 xc_section
830 TYPE(task_list_type), POINTER :: task_list
831 TYPE(xc_rho_cflags_type) :: needs
832
833 CALL timeset(routinen, handle)
834
835 NULLIFY (pw_env)
836 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, ks_env=ks_env, &
837 dft_control=dft_control, para_env=para_env)
838 cpassert(ASSOCIATED(pw_env))
839 nspins = dft_control%nspins
840 gapw = dft_control%qs_control%gapw
841 gapw_xc = dft_control%qs_control%gapw_xc
842
843 cpassert(.NOT. dft_control%tddfpt2_control%do_exck)
844 cpassert(.NOT. dft_control%tddfpt2_control%do_hfxsr)
845 cpassert(.NOT. dft_control%tddfpt2_control%do_hfxlr)
846
847 NULLIFY (auxbas_pw_pool, poisson_env)
848 ! gets the tmp grids
849 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
850 poisson_env=poisson_env)
851
852 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
853 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
854 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
855
856 CALL get_qs_env(qs_env, input=input)
857 IF (dft_control%do_admm) THEN
858 CALL get_qs_env(qs_env, admm_env=admm_env)
859 xc_section => admm_env%xc_section_primary
860 ELSE
861 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
862 END IF
863 xc_fun_section => section_vals_get_subs_vals(xc_section, "XC_FUNCTIONAL")
864 needs = xc_functionals_get_needs(xc_fun_section, (nspins == 2), .true.)
865 needs_tau_response = needs%tau .OR. needs%tau_spin
866
867 NULLIFY (trho_tau_r, trho_tau_g, trho_xc_tau_r, trho_xc_tau_g)
868 ALLOCATE (trho_r(nspins), trho_g(nspins))
869 DO ispin = 1, nspins
870 CALL auxbas_pw_pool%create_pw(trho_r(ispin))
871 CALL auxbas_pw_pool%create_pw(trho_g(ispin))
872 END DO
873 IF (needs_tau_response) THEN
874 ALLOCATE (trho_tau_r(nspins), trho_tau_g(nspins))
875 DO ispin = 1, nspins
876 CALL auxbas_pw_pool%create_pw(trho_tau_r(ispin))
877 CALL auxbas_pw_pool%create_pw(trho_tau_g(ispin))
878 END DO
879 END IF
880 IF (gapw_xc) THEN
881 ALLOCATE (trho_xc_r(nspins), trho_xc_g(nspins))
882 DO ispin = 1, nspins
883 CALL auxbas_pw_pool%create_pw(trho_xc_r(ispin))
884 CALL auxbas_pw_pool%create_pw(trho_xc_g(ispin))
885 END DO
886 IF (needs_tau_response) THEN
887 ALLOCATE (trho_xc_tau_r(nspins), trho_xc_tau_g(nspins))
888 DO ispin = 1, nspins
889 CALL auxbas_pw_pool%create_pw(trho_xc_tau_r(ispin))
890 CALL auxbas_pw_pool%create_pw(trho_xc_tau_g(ispin))
891 END DO
892 END IF
893 END IF
894
895 ! GAPW/GAPW_XC initializations
896 NULLIFY (hartree_local, local_rho_set)
897 IF (gapw) THEN
898 CALL get_qs_env(qs_env, &
899 atomic_kind_set=atomic_kind_set, &
900 natom=natom, &
901 qs_kind_set=qs_kind_set)
902 CALL local_rho_set_create(local_rho_set)
903 CALL allocate_rho_atom_internals(local_rho_set%rho_atom_set, atomic_kind_set, &
904 qs_kind_set, dft_control, para_env)
905 CALL init_rho0(local_rho_set, qs_env, dft_control%qs_control%gapw_control, &
906 zcore=0.0_dp)
907 CALL rho0_s_grid_create(pw_env, local_rho_set%rho0_mpole)
908 CALL hartree_local_create(hartree_local)
909 CALL init_coulomb_local(hartree_local, natom)
910 ELSEIF (gapw_xc) THEN
911 CALL get_qs_env(qs_env, &
912 atomic_kind_set=atomic_kind_set, &
913 qs_kind_set=qs_kind_set)
914 CALL local_rho_set_create(local_rho_set)
915 CALL allocate_rho_atom_internals(local_rho_set%rho_atom_set, atomic_kind_set, &
916 qs_kind_set, dft_control, para_env)
917 END IF
918
919 total_rho = 0.0_dp
920 CALL pw_zero(rho_tot_gspace)
921 DO ispin = 1, nspins
922 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=matrix_pe(ispin)%matrix, &
923 rho=trho_r(ispin), &
924 rho_gspace=trho_g(ispin), &
925 soft_valid=gapw, &
926 total_rho=total_rho(ispin))
927 IF (needs_tau_response) THEN
928 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=matrix_pe(ispin)%matrix, &
929 rho=trho_tau_r(ispin), &
930 rho_gspace=trho_tau_g(ispin), &
931 soft_valid=gapw, &
932 compute_tau=.true.)
933 END IF
934 CALL pw_axpy(trho_g(ispin), rho_tot_gspace)
935 IF (gapw_xc) THEN
936 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=matrix_pe(ispin)%matrix, &
937 rho=trho_xc_r(ispin), &
938 rho_gspace=trho_xc_g(ispin), &
939 soft_valid=gapw_xc, &
940 total_rho=rhotot)
941 IF (needs_tau_response) THEN
942 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=matrix_pe(ispin)%matrix, &
943 rho=trho_xc_tau_r(ispin), &
944 rho_gspace=trho_xc_tau_g(ispin), &
945 soft_valid=gapw_xc, &
946 compute_tau=.true.)
947 END IF
948 END IF
949 END DO
950
951 ! GAPW o GAPW_XC require the calculation of hard and soft local densities
952 IF (gapw .OR. gapw_xc) THEN
953 CALL get_qs_env(qs_env=qs_env, oce=oce, sab_orb=sab)
954 CALL calculate_rho_atom_coeff(qs_env, matrix_pe, local_rho_set%rho_atom_set, &
955 qs_kind_set, oce, sab, para_env)
956 CALL prepare_gapw_den(qs_env, local_rho_set, do_rho0=gapw)
957 END IF
958 rhotot = sum(total_rho)
959 IF (gapw) THEN
960 CALL get_rho0_mpole(local_rho_set%rho0_mpole, qlm_tot=qlm_tot)
961 rhotot = rhotot + local_rho_set%rho0_mpole%total_rho0_h
962 CALL pw_axpy(local_rho_set%rho0_mpole%rho0_s_gs, rho_tot_gspace)
963 IF (ASSOCIATED(local_rho_set%rho0_mpole%rhoz_cneo_s_gs)) THEN
964 CALL pw_axpy(local_rho_set%rho0_mpole%rhoz_cneo_s_gs, rho_tot_gspace)
965 END IF
966 END IF
967
968 IF (abs(rhotot) > 1.e-05_dp) THEN
969 logger => cp_get_default_logger()
970 IF (logger%para_env%is_source()) THEN
971 iounit = cp_logger_get_default_unit_nr(logger, local=.true.)
972 ELSE
973 iounit = -1
974 END IF
975 cpwarn("Real space electron count of excitation density is non-zero.")
976 IF (iounit > 0) THEN
977 WRITE (iounit, "(T2,A,T61,G20.10)") "Measured electron count is ", rhotot
978 WRITE (iounit, "(T2,A,/)") repeat("*", 79)
979 END IF
980 END IF
981
982 ! calculate associated hartree potential
983 CALL pw_poisson_solve(poisson_env, rho_tot_gspace, thartree, &
984 v_hartree_gspace)
985 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
986 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
987 IF (gapw) THEN
988 CALL vh_1c_gg_integrals(qs_env, thartree, hartree_local%ecoul_1c, &
989 local_rho_set, para_env, tddft=.true.)
990 CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace, para_env, &
991 calculate_forces=.false., &
992 local_rho_set=local_rho_set)
993 END IF
994
995 ! Fxc*drho term
996 CALL get_qs_env(qs_env, rho=rho)
997 CALL qs_rho_get(rho, rho_r=rho_r, rho_g=rho_g)
998 !
999 deriv2_analytic = section_get_lval(xc_section, "2ND_DERIV_ANALYTICAL")
1000 IF (deriv2_analytic) THEN
1001 NULLIFY (v_xc, v_xc_tau)
1002 CALL get_qs_env(qs_env=qs_env, xcint_weights=weights)
1003 IF (gapw_xc) THEN
1004 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_xc)
1005 CALL qs_fxc_analytic(rho_xc, trho_xc_r, trho_xc_tau_r, xc_section, weights, auxbas_pw_pool, &
1006 .false., v_xc, v_xc_tau)
1007 ELSE
1008 CALL qs_fxc_analytic(rho, trho_r, trho_tau_r, xc_section, weights, auxbas_pw_pool, &
1009 .false., v_xc, v_xc_tau)
1010 END IF
1011 IF (gapw .OR. gapw_xc) THEN
1012 CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
1013 rho1_atom_set => local_rho_set%rho_atom_set
1014 CALL calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, xc_section, para_env, &
1015 do_triplet=.false.)
1016 END IF
1017 ELSE
1018 cpabort("NYA 00006")
1019 NULLIFY (v_xc, trho)
1020 ALLOCATE (trho)
1021 CALL qs_rho_create(trho)
1022 CALL qs_rho_set(trho, rho_r=trho_r, rho_g=trho_g)
1023 CALL qs_fxc_fdiff(ks_env, rho, trho, xc_section, 6, .false., v_xc, v_xc_tau)
1024 DEALLOCATE (trho)
1025 END IF
1026
1027 DO ispin = 1, nspins
1028 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
1029 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1030 END DO
1031 IF (gapw_xc) THEN
1032 DO ispin = 1, nspins
1033 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_hartree_rspace, &
1034 hmat=matrix_hz(ispin), &
1035 calculate_forces=.false.)
1036 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
1037 hmat=matrix_hz(ispin), &
1038 gapw=gapw_xc, calculate_forces=.false.)
1039 END DO
1040 ELSE
1041 ! vtot = v_xc(ispin) + v_hartree
1042 DO ispin = 1, nspins
1043 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
1044 hmat=matrix_hz(ispin), &
1045 gapw=gapw, calculate_forces=.false.)
1046 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_hartree_rspace, &
1047 hmat=matrix_hz(ispin), &
1048 gapw=gapw, calculate_forces=.false.)
1049 END DO
1050 END IF
1051 IF (gapw .OR. gapw_xc) THEN
1052 mhz(1:nspins, 1:1) => matrix_hz(1:nspins)
1053 mpe(1:nspins, 1:1) => matrix_pe(1:nspins)
1054 CALL update_ks_atom(qs_env, mhz, mpe, forces=.false., &
1055 rho_atom_external=local_rho_set%rho_atom_set)
1056 END IF
1057
1058 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
1059 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
1060 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1061 DO ispin = 1, nspins
1062 CALL auxbas_pw_pool%give_back_pw(trho_r(ispin))
1063 CALL auxbas_pw_pool%give_back_pw(trho_g(ispin))
1064 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1065 END DO
1066 DEALLOCATE (trho_r, trho_g, v_xc)
1067 IF (ASSOCIATED(trho_tau_r)) THEN
1068 DO ispin = 1, nspins
1069 CALL auxbas_pw_pool%give_back_pw(trho_tau_r(ispin))
1070 CALL auxbas_pw_pool%give_back_pw(trho_tau_g(ispin))
1071 END DO
1072 DEALLOCATE (trho_tau_r, trho_tau_g)
1073 END IF
1074 IF (gapw_xc) THEN
1075 DO ispin = 1, nspins
1076 CALL auxbas_pw_pool%give_back_pw(trho_xc_r(ispin))
1077 CALL auxbas_pw_pool%give_back_pw(trho_xc_g(ispin))
1078 END DO
1079 DEALLOCATE (trho_xc_r, trho_xc_g)
1080 IF (ASSOCIATED(trho_xc_tau_r)) THEN
1081 DO ispin = 1, nspins
1082 CALL auxbas_pw_pool%give_back_pw(trho_xc_tau_r(ispin))
1083 CALL auxbas_pw_pool%give_back_pw(trho_xc_tau_g(ispin))
1084 END DO
1085 DEALLOCATE (trho_xc_tau_r, trho_xc_tau_g)
1086 END IF
1087 END IF
1088 IF (ASSOCIATED(v_xc_tau)) THEN
1089 DO ispin = 1, nspins
1090 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
1091 END DO
1092 DEALLOCATE (v_xc_tau)
1093 END IF
1094 IF (dft_control%do_admm) THEN
1095 IF (qs_env%admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
1096 ! add ADMM xc_section_aux terms: f_x[rhoz_ADMM]
1097 CALL get_qs_env(qs_env, admm_env=admm_env)
1098 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_s_aux_fit=msaux, &
1099 task_list_aux_fit=task_list)
1100 basis_type = "AUX_FIT"
1101 !
1102 NULLIFY (mpe, mhz)
1103 ALLOCATE (mpe(nspins, 1))
1104 CALL dbcsr_allocate_matrix_set(mhz, nspins, 1)
1105 DO ispin = 1, nspins
1106 ALLOCATE (mhz(ispin, 1)%matrix)
1107 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=msaux(1)%matrix)
1108 CALL dbcsr_copy(mhz(ispin, 1)%matrix, msaux(1)%matrix)
1109 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
1110 mpe(ispin, 1)%matrix => matrix_pe_admm(ispin)%matrix
1111 END DO
1112 !
1113 ! GAPW/GAPW_XC initializations
1114 NULLIFY (local_rho_set_admm)
1115 IF (admm_env%do_gapw) THEN
1116 basis_type = "AUX_FIT_SOFT"
1117 task_list => admm_env%admm_gapw_env%task_list
1118 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
1119 CALL get_admm_env(admm_env, sab_aux_fit=sab_aux_fit)
1120 CALL local_rho_set_create(local_rho_set_admm)
1121 CALL allocate_rho_atom_internals(local_rho_set_admm%rho_atom_set, atomic_kind_set, &
1122 admm_env%admm_gapw_env%admm_kind_set, dft_control, para_env)
1123 CALL calculate_rho_atom_coeff(qs_env, matrix_pe_admm, &
1124 rho_atom_set=local_rho_set_admm%rho_atom_set, &
1125 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
1126 oce=admm_env%admm_gapw_env%oce, sab=sab_aux_fit, para_env=para_env)
1127 CALL prepare_gapw_den(qs_env, local_rho_set=local_rho_set_admm, &
1128 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
1129 END IF
1130 !
1131 xc_section => admm_env%xc_section_aux
1132 xc_fun_section => section_vals_get_subs_vals(xc_section, "XC_FUNCTIONAL")
1133 needs = xc_functionals_get_needs(xc_fun_section, (nspins == 2), .true.)
1134 needs_tau_response = needs%tau .OR. needs%tau_spin
1135 !
1136 NULLIFY (rho_g_aux, rho_r_aux, rhoz_g_aux, rhoz_r_aux, rhoz_tau_g_aux, rhoz_tau_r_aux)
1137 CALL qs_rho_get(rho_aux_fit, rho_r=rho_r_aux, rho_g=rho_g_aux)
1138 ! rhoz_aux
1139 ALLOCATE (rhoz_r_aux(nspins), rhoz_g_aux(nspins))
1140 DO ispin = 1, nspins
1141 CALL auxbas_pw_pool%create_pw(rhoz_r_aux(ispin))
1142 CALL auxbas_pw_pool%create_pw(rhoz_g_aux(ispin))
1143 END DO
1144 IF (needs_tau_response) THEN
1145 ALLOCATE (rhoz_tau_r_aux(nspins), rhoz_tau_g_aux(nspins))
1146 DO ispin = 1, nspins
1147 CALL auxbas_pw_pool%create_pw(rhoz_tau_r_aux(ispin))
1148 CALL auxbas_pw_pool%create_pw(rhoz_tau_g_aux(ispin))
1149 END DO
1150 END IF
1151 DO ispin = 1, nspins
1152 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=mpe(ispin, 1)%matrix, &
1153 rho=rhoz_r_aux(ispin), rho_gspace=rhoz_g_aux(ispin), &
1154 basis_type=basis_type, &
1155 task_list_external=task_list)
1156 IF (needs_tau_response) THEN
1157 CALL calculate_rho_elec(ks_env=ks_env, matrix_p=mpe(ispin, 1)%matrix, &
1158 rho=rhoz_tau_r_aux(ispin), rho_gspace=rhoz_tau_g_aux(ispin), &
1159 basis_type=basis_type, task_list_external=task_list, &
1160 compute_tau=.true.)
1161 END IF
1162 END DO
1163 !
1164 NULLIFY (v_xc, v_xc_tau)
1165 deriv2_analytic = section_get_lval(xc_section, "2ND_DERIV_ANALYTICAL")
1166 IF (deriv2_analytic) THEN
1167 CALL get_qs_env(qs_env=qs_env, xcint_weights=weights)
1168 CALL qs_fxc_analytic(rho_aux_fit, rhoz_r_aux, rhoz_tau_r_aux, xc_section, weights, auxbas_pw_pool, &
1169 .false., v_xc, v_xc_tau)
1170 ELSE
1171 cpabort("NYA 00007")
1172 NULLIFY (rhoz_aux)
1173 ALLOCATE (rhoz_aux)
1174 CALL qs_rho_create(rhoz_aux)
1175 CALL qs_rho_set(rhoz_aux, rho_r=rhoz_r_aux, rho_g=rhoz_g_aux)
1176 CALL qs_fxc_fdiff(ks_env, rho_aux_fit, rhoz_aux, xc_section, 6, .false., v_xc, v_xc_tau)
1177 DEALLOCATE (rhoz_aux)
1178 END IF
1179 !
1180 DO ispin = 1, nspins
1181 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1182 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
1183 hmat=mhz(ispin, 1), basis_type=basis_type, &
1184 calculate_forces=.false., &
1185 task_list_external=task_list)
1186 END DO
1187 DO ispin = 1, nspins
1188 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1189 CALL auxbas_pw_pool%give_back_pw(rhoz_r_aux(ispin))
1190 CALL auxbas_pw_pool%give_back_pw(rhoz_g_aux(ispin))
1191 END DO
1192 DEALLOCATE (v_xc, rhoz_r_aux, rhoz_g_aux)
1193 IF (ASSOCIATED(v_xc_tau)) THEN
1194 DO ispin = 1, nspins
1195 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
1196 END DO
1197 DEALLOCATE (v_xc_tau)
1198 END IF
1199 IF (ASSOCIATED(rhoz_tau_r_aux)) THEN
1200 DO ispin = 1, nspins
1201 CALL auxbas_pw_pool%give_back_pw(rhoz_tau_r_aux(ispin))
1202 CALL auxbas_pw_pool%give_back_pw(rhoz_tau_g_aux(ispin))
1203 END DO
1204 DEALLOCATE (rhoz_tau_r_aux, rhoz_tau_g_aux)
1205 END IF
1206 !
1207 IF (admm_env%do_gapw) THEN
1208 rho_atom_set => admm_env%admm_gapw_env%local_rho_set%rho_atom_set
1209 rho1_atom_set => local_rho_set_admm%rho_atom_set
1210 CALL calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, xc_section, &
1211 para_env, kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
1212 CALL update_ks_atom(qs_env, mhz(:, 1), matrix_pe_admm, forces=.false., tddft=.false., &
1213 rho_atom_external=rho1_atom_set, &
1214 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
1215 oce_external=admm_env%admm_gapw_env%oce, &
1216 sab_external=sab_aux_fit)
1217 END IF
1218 !
1219 nao = admm_env%nao_orb
1220 nao_aux = admm_env%nao_aux_fit
1221 ALLOCATE (dbwork)
1222 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
1223 DO ispin = 1, nspins
1224 CALL cp_dbcsr_sm_fm_multiply(mhz(ispin, 1)%matrix, admm_env%A, &
1225 admm_env%work_aux_orb, nao)
1226 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, &
1227 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1228 admm_env%work_orb_orb)
1229 CALL dbcsr_copy(dbwork, matrix_hz(1)%matrix)
1230 CALL dbcsr_set(dbwork, 0.0_dp)
1231 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbwork, keep_sparsity=.true.)
1232 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
1233 END DO
1234 CALL dbcsr_release(dbwork)
1235 DEALLOCATE (dbwork)
1237 DEALLOCATE (mpe)
1238 IF (admm_env%do_gapw) THEN
1239 IF (ASSOCIATED(local_rho_set_admm)) CALL local_rho_set_release(local_rho_set_admm)
1240 END IF
1241 END IF
1242 END IF
1243 IF (gapw .OR. gapw_xc) THEN
1244 IF (ASSOCIATED(local_rho_set)) CALL local_rho_set_release(local_rho_set)
1245 IF (ASSOCIATED(hartree_local)) CALL hartree_local_release(hartree_local)
1246 END IF
1247
1248 ! HFX
1249 hfx_section => section_vals_get_subs_vals(xc_section, "HF")
1250 CALL section_vals_get(hfx_section, explicit=do_hfx)
1251 IF (do_hfx) THEN
1252 CALL section_vals_get(hfx_section, n_repetition=n_rep_hf)
1253 cpassert(n_rep_hf == 1)
1254 CALL section_vals_val_get(hfx_section, "TREAT_LSD_IN_CORE", l_val=hfx_treat_lsd_in_core, &
1255 i_rep_section=1)
1256 mspin = 1
1257 IF (hfx_treat_lsd_in_core) mspin = nspins
1258 !
1259 CALL get_qs_env(qs_env=qs_env, rho=rho, x_data=x_data, para_env=para_env, &
1260 s_mstruct_changed=s_mstruct_changed)
1261 distribute_fock_matrix = .true.
1262 IF (dft_control%do_admm) THEN
1263 CALL get_qs_env(qs_env, admm_env=admm_env)
1264 CALL get_admm_env(admm_env, matrix_s_aux_fit=msaux)
1265 NULLIFY (mpe, mhz)
1266 ALLOCATE (mpe(nspins, 1))
1267 CALL dbcsr_allocate_matrix_set(mhz, nspins, 1)
1268 DO ispin = 1, nspins
1269 ALLOCATE (mhz(ispin, 1)%matrix)
1270 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=msaux(1)%matrix)
1271 CALL dbcsr_copy(mhz(ispin, 1)%matrix, msaux(1)%matrix)
1272 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
1273 mpe(ispin, 1)%matrix => matrix_pe_admm(ispin)%matrix
1274 END DO
1275 IF (x_data(1, 1)%do_hfx_ri) THEN
1276 eh1 = 0.0_dp
1277 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpe, &
1278 geometry_did_change=s_mstruct_changed, nspins=nspins, &
1279 hf_fraction=x_data(1, 1)%general_parameter%fraction)
1280 ELSE
1281 DO ispin = 1, mspin
1282 eh1 = 0.0
1283 CALL integrate_four_center(qs_env, x_data, mhz, eh1, mpe, hfx_section, &
1284 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
1285 ispin=ispin)
1286 END DO
1287 END IF
1288 !
1289 cpassert(ASSOCIATED(admm_env%work_aux_orb))
1290 cpassert(ASSOCIATED(admm_env%work_orb_orb))
1291 nao = admm_env%nao_orb
1292 nao_aux = admm_env%nao_aux_fit
1293 ALLOCATE (dbwork)
1294 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
1295 DO ispin = 1, nspins
1296 CALL cp_dbcsr_sm_fm_multiply(mhz(ispin, 1)%matrix, admm_env%A, &
1297 admm_env%work_aux_orb, nao)
1298 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, &
1299 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1300 admm_env%work_orb_orb)
1301 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
1302 CALL dbcsr_set(dbwork, 0.0_dp)
1303 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, dbwork, keep_sparsity=.true.)
1304 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
1305 END DO
1306 CALL dbcsr_release(dbwork)
1307 DEALLOCATE (dbwork)
1309 DEALLOCATE (mpe)
1310 ELSE
1311 NULLIFY (mpe, mhz)
1312 ALLOCATE (mpe(nspins, 1), mhz(nspins, 1))
1313 DO ispin = 1, nspins
1314 mhz(ispin, 1)%matrix => matrix_hz(ispin)%matrix
1315 mpe(ispin, 1)%matrix => matrix_pe(ispin)%matrix
1316 END DO
1317 IF (x_data(1, 1)%do_hfx_ri) THEN
1318 eh1 = 0.0_dp
1319 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpe, &
1320 geometry_did_change=s_mstruct_changed, nspins=nspins, &
1321 hf_fraction=x_data(1, 1)%general_parameter%fraction)
1322 ELSE
1323 DO ispin = 1, mspin
1324 eh1 = 0.0
1325 CALL integrate_four_center(qs_env, x_data, mhz, eh1, mpe, hfx_section, &
1326 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
1327 ispin=ispin)
1328 END DO
1329 END IF
1330 DEALLOCATE (mpe, mhz)
1331 END IF
1332 END IF
1333
1334 focc = 4.0_dp
1335 IF (nspins == 2) focc = 2.0_dp
1336 DO ispin = 1, nspins
1337 mos => gs_mos(ispin)%mos_occ
1338 CALL cp_fm_get_info(mos, ncol_global=norb)
1339 CALL cp_dbcsr_sm_fm_multiply(matrix_hz(ispin)%matrix, mos, cpmos(ispin), &
1340 norb, alpha=focc, beta=0.0_dp)
1341 END DO
1342
1343 CALL timestop(handle)
1344
1345 END SUBROUTINE tddfpt_resvec2
1346
1347! **************************************************************************************************
1348!> \brief ...
1349!> \param qs_env ...
1350!> \param matrix_pe ...
1351!> \param gs_mos ...
1352!> \param matrix_hz ...
1353!> \param cpmos ...
1354! **************************************************************************************************
1355 SUBROUTINE tddfpt_resvec2_xtb(qs_env, matrix_pe, gs_mos, matrix_hz, cpmos)
1356
1357 TYPE(qs_environment_type), POINTER :: qs_env
1358 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_pe
1359 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
1360 POINTER :: gs_mos
1361 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_hz
1362 TYPE(cp_fm_type), DIMENSION(:), INTENT(INOUT) :: cpmos
1363
1364 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_resvec2_xtb'
1365
1366 INTEGER :: atom_a, handle, iatom, ikind, is, ispin, &
1367 na, natom, natorb, nkind, norb, ns, &
1368 nsgf, nspins
1369 INTEGER, DIMENSION(25) :: lao
1370 INTEGER, DIMENSION(5) :: occ
1371 REAL(dp), ALLOCATABLE, DIMENSION(:) :: mcharge, mcharge1
1372 REAL(dp), ALLOCATABLE, DIMENSION(:, :) :: aocg, aocg1, charges, charges1
1373 REAL(kind=dp) :: focc
1374 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1375 TYPE(cp_fm_type), POINTER :: mos
1376 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_matrix
1377 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_p, matrix_s
1378 TYPE(dbcsr_type), POINTER :: s_matrix
1379 TYPE(dft_control_type), POINTER :: dft_control
1380 TYPE(mp_para_env_type), POINTER :: para_env
1381 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1382 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1383 TYPE(qs_rho_type), POINTER :: rho
1384 TYPE(xtb_atom_type), POINTER :: xtb_kind
1385
1386 CALL timeset(routinen, handle)
1387
1388 cpassert(ASSOCIATED(matrix_pe))
1389
1390 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
1391 nspins = dft_control%nspins
1392
1393 DO ispin = 1, nspins
1394 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
1395 END DO
1396
1397 IF (dft_control%qs_control%xtb_control%coulomb_interaction) THEN
1398 ! Mulliken charges
1399 CALL get_qs_env(qs_env, rho=rho, particle_set=particle_set, &
1400 matrix_s_kp=matrix_s, para_env=para_env)
1401 natom = SIZE(particle_set)
1402 CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
1403 ALLOCATE (mcharge(natom), charges(natom, 5))
1404 ALLOCATE (mcharge1(natom), charges1(natom, 5))
1405 charges = 0.0_dp
1406 charges1 = 0.0_dp
1407 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
1408 nkind = SIZE(atomic_kind_set)
1409 CALL get_qs_kind_set(qs_kind_set, maxsgf=nsgf)
1410 ALLOCATE (aocg(nsgf, natom))
1411 aocg = 0.0_dp
1412 ALLOCATE (aocg1(nsgf, natom))
1413 aocg1 = 0.0_dp
1414 p_matrix => matrix_p(:, 1)
1415 s_matrix => matrix_s(1, 1)%matrix
1416 CALL ao_charges(p_matrix, s_matrix, aocg, para_env)
1417 CALL ao_charges(matrix_pe, s_matrix, aocg1, para_env)
1418 DO ikind = 1, nkind
1419 CALL get_atomic_kind(atomic_kind_set(ikind), natom=na)
1420 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
1421 CALL get_xtb_atom_param(xtb_kind, natorb=natorb, lao=lao, occupation=occ)
1422 DO iatom = 1, na
1423 atom_a = atomic_kind_set(ikind)%atom_list(iatom)
1424 charges(atom_a, :) = real(occ(:), kind=dp)
1425 DO is = 1, natorb
1426 ns = lao(is) + 1
1427 charges(atom_a, ns) = charges(atom_a, ns) - aocg(is, atom_a)
1428 charges1(atom_a, ns) = charges1(atom_a, ns) - aocg1(is, atom_a)
1429 END DO
1430 END DO
1431 END DO
1432 DEALLOCATE (aocg, aocg1)
1433 DO iatom = 1, natom
1434 mcharge(iatom) = sum(charges(iatom, :))
1435 mcharge1(iatom) = sum(charges1(iatom, :))
1436 END DO
1437 ! Coulomb Kernel
1438 CALL xtb_coulomb_hessian(qs_env, matrix_hz, charges1, mcharge1, mcharge)
1439 !
1440 DEALLOCATE (charges, mcharge, charges1, mcharge1)
1441 END IF
1442
1443 focc = 2.0_dp
1444 IF (nspins == 2) focc = 1.0_dp
1445 DO ispin = 1, nspins
1446 mos => gs_mos(ispin)%mos_occ
1447 CALL cp_fm_get_info(mos, ncol_global=norb)
1448 CALL cp_dbcsr_sm_fm_multiply(matrix_hz(ispin)%matrix, mos, cpmos(ispin), &
1449 norb, alpha=focc, beta=0.0_dp)
1450 END DO
1451
1452 CALL timestop(handle)
1453
1454 END SUBROUTINE tddfpt_resvec2_xtb
1455
1456! **************************************************************************************************
1457!> \brief ...
1458!> \param qs_env ...
1459!> \param cpmos ...
1460!> \param work ...
1461! **************************************************************************************************
1462 SUBROUTINE tddfpt_resvec3(qs_env, cpmos, work)
1463
1464 TYPE(qs_environment_type), POINTER :: qs_env
1465 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: cpmos
1466 TYPE(tddfpt_work_matrices) :: work
1467
1468 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_resvec3'
1469
1470 INTEGER :: handle, ispin, nao, norb, nspins
1471 TYPE(cp_fm_struct_type), POINTER :: fmstruct
1472 TYPE(cp_fm_type) :: cvec, umat
1473 TYPE(cp_fm_type), POINTER :: omos
1474 TYPE(dft_control_type), POINTER :: dft_control
1475 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1476
1477 CALL timeset(routinen, handle)
1478
1479 CALL get_qs_env(qs_env, mos=mos, dft_control=dft_control)
1480 nspins = dft_control%nspins
1481
1482 DO ispin = 1, nspins
1483 CALL get_mo_set(mos(ispin), mo_coeff=omos)
1484 associate(rvecs => cpmos(ispin))
1485 CALL cp_fm_get_info(rvecs, nrow_global=nao, ncol_global=norb)
1486 CALL cp_fm_create(cvec, rvecs%matrix_struct, "cvec")
1487 CALL cp_fm_struct_create(fmstruct, context=rvecs%matrix_struct%context, nrow_global=norb, &
1488 ncol_global=norb, para_env=rvecs%matrix_struct%para_env)
1489 CALL cp_fm_create(umat, fmstruct, "umat")
1490 CALL cp_fm_struct_release(fmstruct)
1491 !
1492 CALL parallel_gemm("T", "N", norb, norb, nao, 1.0_dp, omos, work%S_C0(ispin), 0.0_dp, umat)
1493 CALL cp_fm_copy_general(rvecs, cvec, rvecs%matrix_struct%para_env)
1494 CALL parallel_gemm("N", "T", nao, norb, norb, 1.0_dp, cvec, umat, 0.0_dp, rvecs)
1495 END associate
1496 CALL cp_fm_release(cvec)
1497 CALL cp_fm_release(umat)
1498 END DO
1499
1500 CALL timestop(handle)
1501
1502 END SUBROUTINE tddfpt_resvec3
1503
1504! **************************************************************************************************
1505!> \brief Calculate direct tddft forces
1506!> \param qs_env ...
1507!> \param ex_env ...
1508!> \param gs_mos ...
1509!> \param kernel_env ...
1510!> \param sub_env ...
1511!> \param work_matrices ...
1512!> \param debug_forces ...
1513!> \par History
1514!> * 01.2020 screated [JGH]
1515! **************************************************************************************************
1516 SUBROUTINE tddfpt_kernel_force(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, debug_forces)
1517
1518 TYPE(qs_environment_type), POINTER :: qs_env
1519 TYPE(excited_energy_type), POINTER :: ex_env
1520 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
1521 POINTER :: gs_mos
1522 TYPE(kernel_env_type), INTENT(IN) :: kernel_env
1523 TYPE(tddfpt_subgroup_env_type) :: sub_env
1524 TYPE(tddfpt_work_matrices) :: work_matrices
1525 LOGICAL, INTENT(IN) :: debug_forces
1526
1527 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_kernel_force'
1528
1529 INTEGER :: handle
1530 TYPE(dft_control_type), POINTER :: dft_control
1531 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
1532
1533 CALL timeset(routinen, handle)
1534
1535 CALL get_qs_env(qs_env, dft_control=dft_control)
1536 tddfpt_control => dft_control%tddfpt2_control
1537
1538 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
1539 ! full Kernel
1540 CALL fhxc_force(qs_env, ex_env, gs_mos, kernel_env%full_kernel, debug_forces)
1541 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_stda) THEN
1542 ! sTDA Kernel
1543 CALL stda_force(qs_env, ex_env, gs_mos, kernel_env%stda_kernel, sub_env, work_matrices, debug_forces)
1544 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_none) THEN
1545 ! nothing to be done here
1546 ex_env%matrix_wx1 => null()
1547 ELSE
1548 cpabort('Unknown kernel type')
1549 END IF
1550
1551 CALL timestop(handle)
1552
1553 END SUBROUTINE tddfpt_kernel_force
1554
1555END 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:593
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_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
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
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:15
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
logical function, public section_get_lval(section_vals, keyword_name)
...
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
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, 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.
https://en.wikipedia.org/wiki/Finite_difference_coefficient
Definition qs_fxc.F:27
subroutine, public qs_fxc_analytic(rho0, rho1_r, tau1_r, xc_section, weights, auxbas_pw_pool, is_triplet, v_xc, v_xc_tau, spinflip)
...
Definition qs_fxc.F:96
subroutine, public qs_fxc_fdiff(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, is_triplet, fxc_rho, fxc_tau)
...
Definition qs_fxc.F:165
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, 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, 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, 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....
routines that build the integrals of the Vxc potential calculated for the atomic density in the basis...
Definition qs_vxc_atom.F:12
subroutine, public calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, xc_section, para_env, do_tddfpt2, do_triplet, do_sf, kind_set_external)
...
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)
...
Definition xtb_ehess.F:77
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, hen, zeta, xi, kappa0, alpg, occupation, electronegativity, chmax, en, kqat2, kcn, kq)
...
Definition xtb_types.F:199
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:511
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...