(git:5e7fe52)
Loading...
Searching...
No Matches
qs_tddfpt2_fhxc.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
12 USE cp_dbcsr_api, ONLY: &
14 dbcsr_p_type, dbcsr_release, dbcsr_set, dbcsr_type, dbcsr_type_symmetric
19 USE cp_fm_types, ONLY: cp_fm_create,&
27 USE kinds, ONLY: default_string_length,&
28 dp
32 USE pw_env_types, ONLY: pw_env_get
33 USE pw_methods, ONLY: pw_axpy,&
34 pw_scale,&
37 USE pw_types, ONLY: pw_c1d_gs_type,&
41 USE qs_fxc, ONLY: qs_fxc_apply
43 USE qs_integrate_potential, ONLY: integrate_v_rspace,&
44 integrate_v_rspace_one_center
46 USE qs_ks_atom, ONLY: update_ks_atom
50 USE qs_rho_types, ONLY: qs_rho_get
60#include "./base/base_uses.f90"
61
62 IMPLICIT NONE
63
64 PRIVATE
65
66 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_tddfpt2_fhxc'
67
68 INTEGER, PARAMETER, PRIVATE :: maxspins = 2
69
70 PUBLIC :: fhxc_kernel, stda_kernel
71
72! **************************************************************************************************
73
74CONTAINS
75
76! **************************************************************************************************
77!> \brief Compute action matrix-vector products with the FHxc Kernel
78!> \param Aop_evects action of TDDFPT operator on trial vectors (modified on exit)
79!> \param evects TDDFPT trial vectors
80!> \param is_rks_triplets indicates that a triplet excited states calculation using
81!> spin-unpolarised molecular orbitals has been requested
82!> \param do_hfx flag that activates computation of exact-exchange terms
83!> \param do_admm ...
84!> \param qs_env Quickstep environment
85!> \param kernel_env kernel environment
86!> \param kernel_env_admm_aux kernel environment for ADMM correction
87!> \param sub_env parallel (sub)group environment
88!> \param work_matrices collection of work matrices (modified on exit)
89!> \param admm_symm use symmetric definition of ADMM kernel correction
90!> \param admm_xc_correction use ADMM XC kernel correction
91!> \param do_lrigpw ...
92!> \param tddfpt_mgrid ...
93!> \par History
94!> * 06.2016 created [Sergey Chulkov]
95!> * 03.2017 refactored [Sergey Chulkov]
96!> * 04.2019 refactored [JHU]
97! **************************************************************************************************
98 SUBROUTINE fhxc_kernel(Aop_evects, evects, is_rks_triplets, &
99 do_hfx, do_admm, qs_env, kernel_env, kernel_env_admm_aux, &
100 sub_env, work_matrices, admm_symm, admm_xc_correction, do_lrigpw, &
101 tddfpt_mgrid)
102 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(INOUT) :: aop_evects
103 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(IN) :: evects
104 LOGICAL, INTENT(in) :: is_rks_triplets, do_hfx, do_admm
105 TYPE(qs_environment_type), POINTER :: qs_env
106 TYPE(full_kernel_env_type), POINTER :: kernel_env, kernel_env_admm_aux
107 TYPE(tddfpt_subgroup_env_type), INTENT(in) :: sub_env
108 TYPE(tddfpt_work_matrices), INTENT(inout) :: work_matrices
109 LOGICAL, INTENT(in) :: admm_symm, admm_xc_correction, &
110 do_lrigpw, tddfpt_mgrid
111
112 CHARACTER(LEN=*), PARAMETER :: routinen = 'fhxc_kernel'
113
114 CHARACTER(LEN=default_string_length) :: basis_type
115 INTEGER :: handle, ikind, ispin, ivect, nao, &
116 nao_aux, nkind, nspins, nvects, &
117 spinflip
118 INTEGER, DIMENSION(:), POINTER :: blk_sizes
119 INTEGER, DIMENSION(maxspins) :: nactive
120 LOGICAL :: do_noncol, do_onecenter, do_scale, gapw, &
121 gapw_xc
122 TYPE(admm_type), POINTER :: admm_env
123 TYPE(cp_fm_type) :: work_aux_orb, work_orb_orb
124 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: a_xc_munu_sub, rho_ia_ao, &
125 rho_ia_ao_aux_fit
126 TYPE(dbcsr_type), POINTER :: dbwork
127 TYPE(dft_control_type), POINTER :: dft_control
128 TYPE(lri_kind_type), DIMENSION(:), POINTER :: lri_v_int
129 TYPE(mp_para_env_type), POINTER :: para_env
130 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_ia_g, rho_ia_g_aux_fit
131 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
132 TYPE(pw_r3d_rs_type), ALLOCATABLE, DIMENSION(:) :: v_rspace_sub
133 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_ia_r, rho_ia_r_aux_fit
134 TYPE(pw_r3d_rs_type), POINTER :: weights
135 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho1_atom_set, rho_atom_set
136 TYPE(task_list_type), POINTER :: task_list
137
138 CALL timeset(routinen, handle)
139
140 nspins = SIZE(evects, 1)
141 nvects = SIZE(evects, 2)
142 IF (do_admm) THEN
143 cpassert(do_hfx)
144 cpassert(ASSOCIATED(sub_env%admm_A))
145 END IF
146 CALL get_qs_env(qs_env, dft_control=dft_control)
147
148 gapw = dft_control%qs_control%gapw
149 gapw_xc = dft_control%qs_control%gapw_xc
150 spinflip = dft_control%tddfpt2_control%spinflip
151
152 do_noncol = spinflip == tddfpt_sf_noncol
153 do_scale = is_rks_triplets
154 do_onecenter = gapw .OR. gapw_xc
155
156 CALL cp_fm_get_info(evects(1, 1), nrow_global=nao)
157 DO ispin = 1, nspins
158 CALL cp_fm_get_info(evects(ispin, 1), ncol_global=nactive(ispin))
159 END DO
160
161 CALL qs_rho_get(work_matrices%rho_orb_struct_sub, rho_ao=rho_ia_ao, &
162 rho_g=rho_ia_g, rho_r=rho_ia_r)
163 IF (do_hfx .AND. do_admm) THEN
164 CALL get_qs_env(qs_env, admm_env=admm_env)
165 CALL qs_rho_get(work_matrices%rho_aux_fit_struct_sub, &
166 rho_ao=rho_ia_ao_aux_fit, rho_g=rho_ia_g_aux_fit, &
167 rho_r=rho_ia_r_aux_fit)
168 END IF
169
170 NULLIFY (weights)
171 CALL get_qs_env(qs_env, xcint_weights=weights)
172
173 DO ivect = 1, nvects
174
175 ! Transform TDDFT vectors to AO space and store them into rho_ia_ao
176 IF (ALLOCATED(work_matrices%evects_sub)) THEN
177 IF (ASSOCIATED(work_matrices%evects_sub(1, ivect)%matrix_struct)) THEN
178 DO ispin = 1, nspins
179 CALL dbcsr_set(rho_ia_ao(ispin)%matrix, 0.0_dp)
180 CALL cp_dbcsr_plus_fm_fm_t(rho_ia_ao(ispin)%matrix, &
181 matrix_v=sub_env%mos_active(ispin), &
182 matrix_g=work_matrices%evects_sub(ispin, ivect), &
183 ncol=nactive(ispin), symmetry_mode=1)
184 END DO
185 ELSE
186 ! skip trial vectors which are assigned to different parallel groups
187 cycle
188 END IF
189 ELSE
190 DO ispin = 1, nspins
191 CALL dbcsr_set(rho_ia_ao(ispin)%matrix, 0.0_dp)
192 CALL cp_dbcsr_plus_fm_fm_t(rho_ia_ao(ispin)%matrix, &
193 matrix_v=sub_env%mos_active(ispin), &
194 matrix_g=evects(ispin, ivect), &
195 ncol=nactive(ispin), symmetry_mode=1)
196 END DO
197 END IF
198
199 IF (do_lrigpw) THEN
200 CALL qs_rho_update_tddfpt(work_matrices%rho_orb_struct_sub, qs_env, &
201 pw_env_external=sub_env%pw_env, &
202 task_list_external=sub_env%task_list_orb, &
203 para_env_external=sub_env%para_env, &
204 tddfpt_lri_env=kernel_env%lri_env, &
205 tddfpt_lri_density=kernel_env%lri_density)
206 ELSE IF (dft_control%qs_control%lrigpw .OR. &
207 dft_control%qs_control%rigpw) THEN
208 CALL qs_rho_update_tddfpt(work_matrices%rho_orb_struct_sub, qs_env, &
209 pw_env_external=sub_env%pw_env, &
210 task_list_external=sub_env%task_list_orb, &
211 para_env_external=sub_env%para_env)
212 ELSE
213 IF (gapw) THEN
214 CALL qs_rho_update_rho(work_matrices%rho_orb_struct_sub, qs_env, &
215 local_rho_set=work_matrices%local_rho_set, &
216 pw_env_external=sub_env%pw_env, &
217 task_list_external=sub_env%task_list_orb_soft, &
218 para_env_external=sub_env%para_env)
219 CALL prepare_gapw_den(qs_env, work_matrices%local_rho_set, &
220 do_rho0=(.NOT. is_rks_triplets), pw_env_sub=sub_env%pw_env)
221 ELSE IF (gapw_xc) THEN
222 CALL qs_rho_update_rho(work_matrices%rho_orb_struct_sub, qs_env, &
223 rho_xc_external=work_matrices%rho_xc_struct_sub, &
224 local_rho_set=work_matrices%local_rho_set, &
225 pw_env_external=sub_env%pw_env, &
226 task_list_external=sub_env%task_list_orb, &
227 task_list_external_soft=sub_env%task_list_orb_soft, &
228 para_env_external=sub_env%para_env)
229 CALL prepare_gapw_den(qs_env, work_matrices%local_rho_set, do_rho0=.false., &
230 pw_env_sub=sub_env%pw_env)
231 ELSE
232 CALL qs_rho_update_rho(work_matrices%rho_orb_struct_sub, qs_env, &
233 pw_env_external=sub_env%pw_env, &
234 task_list_external=sub_env%task_list_orb, &
235 para_env_external=sub_env%para_env)
236 END IF
237 END IF
238
239 DO ispin = 1, nspins
240 CALL dbcsr_set(work_matrices%A_ia_munu_sub(ispin)%matrix, 0.0_dp)
241 END DO
242
243 ! electron-hole exchange-correlation interaction
244 DO ispin = 1, nspins
245 CALL pw_zero(work_matrices%A_ia_rspace_sub(ispin))
246 END DO
247
248 ! Skip kernel if collinear xc-kernel for spin-flip is requested
249 IF (spinflip /= tddfpt_sf_col) THEN
250 IF ((.NOT. dft_control%tddfpt2_control%do_bse) .AND. (.NOT. dft_control%tddfpt2_control%do_bse_w_only)) THEN
251 IF ((.NOT. dft_control%tddfpt2_control%do_bse_gw_only)) THEN
252 ! C_x d^{2}E_{x}^{DFT}[\rho] / d\rho^2
253 ! + C_{HF} d^{2}E_{x, ADMM}^{DFT}[\rho] / d\rho^2 in case of ADMM calculation
254 DO ispin = 1, nspins
255 CALL pw_zero(work_matrices%wpw_rspace_sub(ispin))
256 IF (ASSOCIATED(work_matrices%wpw_tau_rspace_sub)) CALL pw_zero(work_matrices%wpw_tau_rspace_sub(ispin))
257 END DO
258 IF (do_onecenter) THEN
259 rho_atom_set => sub_env%local_rho_set%rho_atom_set
260 rho1_atom_set => work_matrices%local_rho_set%rho_atom_set
261 END IF
262 !
263 IF (gapw_xc) THEN
264 IF (kernel_env%do_exck) THEN
265 cpabort("NYA")
266 ELSE
267 CALL qs_fxc_apply(qs_env, kernel_env%xc_deriv_set, kernel_env%xc_rho_set, &
268 work_matrices%rho_xc_struct_sub, rho_atom_set, &
269 kernel_env%xc_section, do_onecenter, work_matrices%wpw_rspace_sub, &
270 work_matrices%wpw_tau_rspace_sub, rho1_atom_set, &
271 do_scale=do_scale, is_triplet=is_rks_triplets, spinflip=do_noncol, &
272 pw_env_ext=sub_env%pw_env, para_env_external=sub_env%para_env)
273 DO ispin = 1, nspins
274 CALL pw_axpy(work_matrices%wpw_rspace_sub(ispin), &
275 work_matrices%A_ia_rspace_sub(ispin), kernel_env%alpha)
276 END DO
277
278 END IF
279 DO ispin = 1, nspins
280 CALL pw_scale(work_matrices%A_ia_rspace_sub(ispin), &
281 work_matrices%A_ia_rspace_sub(ispin)%pw_grid%dvol)
282 CALL integrate_v_rspace(v_rspace=work_matrices%A_ia_rspace_sub(ispin), &
283 hmat=work_matrices%A_ia_munu_sub(ispin), &
284 qs_env=qs_env, calculate_forces=.false., gapw=gapw_xc, &
285 pw_env_external=sub_env%pw_env, &
286 task_list_external=sub_env%task_list_orb_soft)
287 CALL pw_zero(work_matrices%A_ia_rspace_sub(ispin))
288 END DO
289 ELSE
290 IF (kernel_env%do_exck) THEN
291 CALL tddfpt_apply_xc_potential(work_matrices%A_ia_rspace_sub, work_matrices%fxc_rspace_sub, &
292 work_matrices%rho_orb_struct_sub, is_rks_triplets)
293 ELSE
294 CALL qs_fxc_apply(qs_env, kernel_env%xc_deriv_set, kernel_env%xc_rho_set, &
295 work_matrices%rho_orb_struct_sub, rho_atom_set, &
296 kernel_env%xc_section, do_onecenter, work_matrices%wpw_rspace_sub, &
297 work_matrices%wpw_tau_rspace_sub, rho1_atom_set, &
298 do_scale=do_scale, is_triplet=is_rks_triplets, spinflip=do_noncol, &
299 pw_env_ext=sub_env%pw_env, para_env_external=sub_env%para_env)
300 DO ispin = 1, nspins
301 CALL pw_axpy(work_matrices%wpw_rspace_sub(ispin), &
302 work_matrices%A_ia_rspace_sub(ispin), kernel_env%alpha)
303 END DO
304
305 END IF
306 END IF
307
308 END IF ! do_bse
309 END IF ! do_bse
310 END IF ! spin-flip
311
312 ! ADMM correction
313 IF ((.NOT. dft_control%tddfpt2_control%do_bse) .AND. (.NOT. dft_control%tddfpt2_control%do_bse_w_only) &
314 .AND. (.NOT. dft_control%tddfpt2_control%do_bse_gw_only)) THEN
315 IF (do_admm .AND. admm_xc_correction) THEN
316 IF (dft_control%admm_control%aux_exch_func /= do_admm_aux_exch_func_none) THEN
317 CALL tddfpt_construct_aux_fit_density(rho_orb_struct=work_matrices%rho_orb_struct_sub, &
318 rho_aux_fit_struct=work_matrices%rho_aux_fit_struct_sub, &
319 local_rho_set=work_matrices%local_rho_set_admm, &
320 qs_env=qs_env, sub_env=sub_env, &
321 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub, &
322 wfm_rho_aux_fit=work_matrices%rho_ao_aux_fit_fm_sub, &
323 wfm_aux_orb=work_matrices%wfm_aux_orb_sub)
324 ! - C_{HF} d^{2}E_{x, ADMM}^{DFT}[\hat{\rho}] / d\hat{\rho}^2
325 IF (admm_symm) THEN
326 CALL dbcsr_get_info(rho_ia_ao_aux_fit(1)%matrix, row_blk_size=blk_sizes)
327 ALLOCATE (a_xc_munu_sub(nspins))
328 DO ispin = 1, nspins
329 ALLOCATE (a_xc_munu_sub(ispin)%matrix)
330 CALL dbcsr_create(matrix=a_xc_munu_sub(ispin)%matrix, name="ADMM_XC", &
331 dist=sub_env%dbcsr_dist, matrix_type=dbcsr_type_symmetric, &
332 row_blk_size=blk_sizes, col_blk_size=blk_sizes)
333 CALL cp_dbcsr_alloc_block_from_nbl(a_xc_munu_sub(ispin)%matrix, sub_env%sab_aux_fit)
334 CALL dbcsr_set(a_xc_munu_sub(ispin)%matrix, 0.0_dp)
335 END DO
336
337 CALL pw_env_get(sub_env%pw_env, auxbas_pw_pool=auxbas_pw_pool)
338 ALLOCATE (v_rspace_sub(nspins))
339 DO ispin = 1, nspins
340 CALL auxbas_pw_pool%create_pw(v_rspace_sub(ispin))
341 CALL pw_zero(v_rspace_sub(ispin))
342 END DO
343
344 IF (admm_env%do_gapw) THEN
345 basis_type = "AUX_FIT_SOFT"
346 task_list => sub_env%task_list_aux_fit_soft
347 ELSE
348 basis_type = "AUX_FIT"
349 task_list => sub_env%task_list_aux_fit
350 END IF
351
352 IF (admm_env%do_gapw) THEN
353 rho_atom_set => sub_env%local_rho_set_admm%rho_atom_set
354 rho1_atom_set => work_matrices%local_rho_set_admm%rho_atom_set
355 END IF
356 DO ispin = 1, nspins
357 CALL pw_zero(work_matrices%wpw_rspace_sub(ispin))
358 IF (ASSOCIATED(work_matrices%wpw_tau_rspace_sub)) THEN
359 CALL pw_zero(work_matrices%wpw_tau_rspace_sub(ispin))
360 END IF
361 END DO
362
363 CALL qs_fxc_apply(qs_env, kernel_env_admm_aux%xc_deriv_set, kernel_env_admm_aux%xc_rho_set, &
364 work_matrices%rho_aux_fit_struct_sub, rho_atom_set, &
365 kernel_env_admm_aux%xc_section, admm_env%do_gapw, &
366 work_matrices%wpw_rspace_sub, work_matrices%wpw_tau_rspace_sub, rho1_atom_set, &
367 do_scale=do_scale, is_triplet=is_rks_triplets, spinflip=do_noncol, &
368 pw_env_ext=sub_env%pw_env, kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
369 para_env_external=sub_env%para_env)
370 DO ispin = 1, nspins
371 CALL pw_axpy(work_matrices%wpw_rspace_sub(ispin), v_rspace_sub(ispin), &
372 kernel_env_admm_aux%alpha)
373 END DO
374
375 DO ispin = 1, nspins
376 CALL pw_scale(v_rspace_sub(ispin), v_rspace_sub(ispin)%pw_grid%dvol)
377 CALL integrate_v_rspace(v_rspace=v_rspace_sub(ispin), &
378 hmat=a_xc_munu_sub(ispin), &
379 qs_env=qs_env, calculate_forces=.false., &
380 pw_env_external=sub_env%pw_env, &
381 basis_type=basis_type, &
382 task_list_external=task_list)
383 END DO
384 IF (admm_env%do_gapw) THEN
385 CALL update_ks_atom(qs_env, a_xc_munu_sub, rho_ia_ao_aux_fit, forces=.false., tddft=.true., &
386 rho_atom_external=rho1_atom_set, &
387 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
388 oce_external=admm_env%admm_gapw_env%oce, &
389 sab_external=sub_env%sab_aux_fit)
390 END IF
391 ALLOCATE (dbwork)
392 CALL dbcsr_create(dbwork, template=work_matrices%A_ia_munu_sub(1)%matrix)
393 CALL cp_fm_create(work_aux_orb, &
394 matrix_struct=work_matrices%wfm_aux_orb_sub%matrix_struct)
395 CALL cp_fm_create(work_orb_orb, &
396 matrix_struct=work_matrices%rho_ao_orb_fm_sub%matrix_struct)
397 CALL cp_fm_get_info(work_aux_orb, nrow_global=nao_aux, ncol_global=nao)
398 DO ispin = 1, nspins
399 CALL cp_dbcsr_sm_fm_multiply(a_xc_munu_sub(ispin)%matrix, sub_env%admm_A, &
400 work_aux_orb, nao)
401 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, 1.0_dp, sub_env%admm_A, &
402 work_aux_orb, 0.0_dp, work_orb_orb)
403 CALL dbcsr_copy(dbwork, work_matrices%A_ia_munu_sub(1)%matrix)
404 CALL dbcsr_set(dbwork, 0.0_dp)
405 CALL copy_fm_to_dbcsr(work_orb_orb, dbwork, keep_sparsity=.true.)
406 CALL dbcsr_add(work_matrices%A_ia_munu_sub(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
407 END DO
408 CALL dbcsr_release(dbwork)
409 DEALLOCATE (dbwork)
410 DO ispin = 1, nspins
411 CALL auxbas_pw_pool%give_back_pw(v_rspace_sub(ispin))
412 END DO
413 DEALLOCATE (v_rspace_sub)
414 CALL cp_fm_release(work_aux_orb)
415 CALL cp_fm_release(work_orb_orb)
416 DO ispin = 1, nspins
417 CALL dbcsr_deallocate_matrix(a_xc_munu_sub(ispin)%matrix)
418 END DO
419 DEALLOCATE (a_xc_munu_sub)
420 ELSE
421 IF (admm_env%do_gapw) THEN
422 cpwarn("GAPW/ADMM needs symmetric ADMM kernel")
423 cpabort("GAPW/ADMM@TDDFT")
424 END IF
425 DO ispin = 1, nspins
426 CALL pw_zero(work_matrices%wpw_rspace_sub(ispin))
427 IF (ASSOCIATED(work_matrices%wpw_tau_rspace_sub)) THEN
428 CALL pw_zero(work_matrices%wpw_tau_rspace_sub(ispin))
429 END IF
430 END DO
431
432 CALL qs_fxc_apply(qs_env, kernel_env_admm_aux%xc_deriv_set, kernel_env_admm_aux%xc_rho_set, &
433 work_matrices%rho_aux_fit_struct_sub, rho_atom_set, &
434 kernel_env_admm_aux%xc_section, admm_env%do_gapw, &
435 work_matrices%wpw_rspace_sub, work_matrices%wpw_tau_rspace_sub, rho1_atom_set, &
436 do_scale=do_scale, is_triplet=is_rks_triplets, spinflip=do_noncol, &
437 pw_env_ext=sub_env%pw_env)
438
439 DO ispin = 1, nspins
440 CALL pw_axpy(work_matrices%wpw_rspace_sub(ispin), &
441 work_matrices%A_ia_rspace_sub(ispin), kernel_env_admm_aux%alpha)
442 END DO
443
444 END IF
445 END IF
446 END IF
447 END IF
448
449 ! electron-hole Coulomb interaction
450 IF (.NOT. dft_control%tddfpt2_control%do_bse_w_only) THEN
451 IF (.NOT. dft_control%tddfpt2_control%do_bse_gw_only) THEN
452 IF ((.NOT. is_rks_triplets) .AND. (spinflip == no_sf_tddfpt)) THEN
453 ! a sum J_i{alpha}a{alpha}_munu + J_i{beta}a{beta}_munu can be computed by solving
454 ! the Poisson equation for combined density (rho_{ia,alpha} + rho_{ia,beta}) .
455 ! The following action will destroy reciprocal-space grid in spin-unrestricted case.
456 DO ispin = 2, nspins
457 CALL pw_axpy(rho_ia_g(ispin), rho_ia_g(1))
458 END DO
459 CALL tddfpt_apply_coulomb(a_ia_rspace=work_matrices%A_ia_rspace_sub, &
460 rho_ia_g=rho_ia_g(1), &
461 local_rho_set=work_matrices%local_rho_set, &
462 hartree_local=work_matrices%hartree_local, &
463 qs_env=qs_env, sub_env=sub_env, gapw=gapw, &
464 work_v_gspace=work_matrices%wpw_gspace_sub(1), &
465 work_v_rspace=work_matrices%wpw_rspace_sub(1), &
466 tddfpt_mgrid=tddfpt_mgrid)
467 END IF
468
469 ! convert from the plane-wave representation into the Gaussian basis set representation
470 DO ispin = 1, nspins
471 IF (.NOT. do_lrigpw) THEN
472 CALL pw_scale(work_matrices%A_ia_rspace_sub(ispin), &
473 work_matrices%A_ia_rspace_sub(ispin)%pw_grid%dvol)
474
475 IF (gapw) THEN
476 CALL integrate_v_rspace(v_rspace=work_matrices%A_ia_rspace_sub(ispin), &
477 hmat=work_matrices%A_ia_munu_sub(ispin), &
478 qs_env=qs_env, calculate_forces=.false., gapw=gapw, &
479 pw_env_external=sub_env%pw_env, &
480 task_list_external=sub_env%task_list_orb_soft)
481 ELSE IF (gapw_xc) THEN
482 IF (.NOT. is_rks_triplets) THEN
483 CALL integrate_v_rspace(v_rspace=work_matrices%A_ia_rspace_sub(ispin), &
484 hmat=work_matrices%A_ia_munu_sub(ispin), &
485 qs_env=qs_env, calculate_forces=.false., gapw=.false., &
486 pw_env_external=sub_env%pw_env, task_list_external=sub_env%task_list_orb)
487 END IF
488 ELSE
489 CALL integrate_v_rspace(v_rspace=work_matrices%A_ia_rspace_sub(ispin), &
490 hmat=work_matrices%A_ia_munu_sub(ispin), &
491 qs_env=qs_env, calculate_forces=.false., gapw=.false., &
492 pw_env_external=sub_env%pw_env, task_list_external=sub_env%task_list_orb)
493 END IF
494 ELSE ! for full kernel using lri
495 CALL pw_scale(work_matrices%A_ia_rspace_sub(ispin), &
496 work_matrices%A_ia_rspace_sub(ispin)%pw_grid%dvol)
497 lri_v_int => kernel_env%lri_density%lri_coefs(ispin)%lri_kinds
498 CALL get_qs_env(qs_env, nkind=nkind, para_env=para_env)
499 DO ikind = 1, nkind
500 lri_v_int(ikind)%v_int = 0.0_dp
501 END DO
502 CALL integrate_v_rspace_one_center(work_matrices%A_ia_rspace_sub(ispin), &
503 qs_env, lri_v_int, .false., "P_LRI_AUX")
504 DO ikind = 1, nkind
505 CALL para_env%sum(lri_v_int(ikind)%v_int)
506 END DO
507 END IF ! for full kernel using lri
508 END DO
509
510 ! local atom contributions
511 IF (.NOT. do_lrigpw) THEN
512 IF (gapw .OR. gapw_xc) THEN
513 ! rho_ia_ao will not be touched
514 CALL update_ks_atom(qs_env, work_matrices%A_ia_munu_sub, rho_ia_ao, forces=.false., &
515 rho_atom_external=work_matrices%local_rho_set%rho_atom_set, &
516 tddft=.true.)
517 END IF
518 END IF
519
520 ! calculate Coulomb contribution to response vector for lrigpw !
521 ! this is restricting lri to Coulomb only at the moment !
522 IF (do_lrigpw .AND. (.NOT. is_rks_triplets)) THEN !
523 CALL tddfpt2_lri_amat(qs_env, sub_env, kernel_env%lri_env, lri_v_int, work_matrices%A_ia_munu_sub)
524 END IF
525
526 DO ispin = 1, nspins
527 IF (ALLOCATED(work_matrices%evects_sub)) THEN
528 CALL cp_dbcsr_sm_fm_multiply(work_matrices%A_ia_munu_sub(ispin)%matrix, &
529 sub_env%mos_active(ispin), &
530 work_matrices%Aop_evects_sub(ispin, ivect), &
531 ncol=nactive(ispin), alpha=1.0_dp, beta=0.0_dp)
532 ELSE
533 CALL cp_dbcsr_sm_fm_multiply(work_matrices%A_ia_munu_sub(ispin)%matrix, &
534 sub_env%mos_active(ispin), &
535 aop_evects(ispin, ivect), &
536 ncol=nactive(ispin), alpha=1.0_dp, beta=0.0_dp)
537 END IF
538 END DO
539 END IF
540 END IF
541 END DO
542
543 CALL timestop(handle)
544
545 END SUBROUTINE fhxc_kernel
546
547! **************************************************************************************************
548!> \brief Compute action matrix-vector products with the sTDA Kernel
549!> \param Aop_evects action of TDDFPT operator on trial vectors (modified on exit)
550!> \param evects TDDFPT trial vectors
551!> \param is_rks_triplets indicates that a triplet excited states calculation using
552!> spin-unpolarised molecular orbitals has been requested
553!> \param qs_env Quickstep environment
554!> \param stda_control control parameters for sTDA kernel
555!> \param stda_env ...
556!> \param sub_env parallel (sub)group environment
557!> \param work_matrices collection of work matrices (modified on exit)
558!> \par History
559!> * 04.2019 initial version [JHU]
560! **************************************************************************************************
561 SUBROUTINE stda_kernel(Aop_evects, evects, is_rks_triplets, &
562 qs_env, stda_control, stda_env, &
563 sub_env, work_matrices)
564
565 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(INOUT) :: aop_evects
566 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(IN) :: evects
567 LOGICAL, INTENT(in) :: is_rks_triplets
568 TYPE(qs_environment_type), POINTER :: qs_env
569 TYPE(stda_control_type) :: stda_control
570 TYPE(stda_env_type) :: stda_env
571 TYPE(tddfpt_subgroup_env_type) :: sub_env
572 TYPE(tddfpt_work_matrices), INTENT(inout) :: work_matrices
573
574 CHARACTER(LEN=*), PARAMETER :: routinen = 'stda_kernel'
575
576 INTEGER :: handle, ivect, nvects
577
578 CALL timeset(routinen, handle)
579
580 nvects = SIZE(evects, 2)
581
582 DO ivect = 1, nvects
583 IF (ALLOCATED(work_matrices%evects_sub)) THEN
584 IF (ASSOCIATED(work_matrices%evects_sub(1, ivect)%matrix_struct)) THEN
585 CALL stda_calculate_kernel(qs_env, stda_control, stda_env, sub_env, work_matrices, &
586 is_rks_triplets, work_matrices%evects_sub(:, ivect), &
587 work_matrices%Aop_evects_sub(:, ivect))
588 ELSE
589 ! skip trial vectors which are assigned to different parallel groups
590 cycle
591 END IF
592 ELSE
593 CALL stda_calculate_kernel(qs_env, stda_control, stda_env, sub_env, work_matrices, &
594 is_rks_triplets, evects(:, ivect), aop_evects(:, ivect))
595 END IF
596 END DO
597
598 CALL timestop(handle)
599
600 END SUBROUTINE stda_kernel
601
602! **************************************************************************************************
603
604END MODULE qs_tddfpt2_fhxc
Types and set/get functions for auxiliary density matrix methods.
Definition admm_types.F:15
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public 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 a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public tddfpt_sf_col
integer, parameter, public do_admm_aux_exch_func_none
integer, parameter, public tddfpt_sf_noncol
integer, parameter, public no_sf_tddfpt
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
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
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.
Setup Routine for Fxc Potentials.
Definition qs_fxc.F:29
subroutine, public qs_fxc_apply(qs_env, xc_deriv_set, xc_rho_set, rho1_struct, rho0_atom_set, xc_section, do_onecenter, fxc_rho, fxc_tau, rho1_atom_set, do_scale, is_triplet, spinflip, pw_env_ext, kind_set_external, para_env_external, compute_virial, virial_xc)
...
Definition qs_fxc.F:693
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.
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
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_tddfpt(rho_struct, qs_env, pw_env_external, task_list_external, para_env_external, tddfpt_lri_env, tddfpt_lri_density)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_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 tddfpt_construct_aux_fit_density(rho_orb_struct, rho_aux_fit_struct, local_rho_set, qs_env, sub_env, wfm_rho_orb, wfm_rho_aux_fit, wfm_aux_orb)
Project a charge density expressed in primary basis set into the auxiliary basis set.
subroutine, public fhxc_kernel(aop_evects, evects, is_rks_triplets, do_hfx, do_admm, qs_env, kernel_env, kernel_env_admm_aux, sub_env, work_matrices, admm_symm, admm_xc_correction, do_lrigpw, tddfpt_mgrid)
Compute action matrix-vector products with the FHxc Kernel.
subroutine, public stda_kernel(aop_evects, evects, is_rks_triplets, qs_env, stda_control, stda_env, sub_env, work_matrices)
Compute action matrix-vector products with the sTDA Kernel.
subroutine, public tddfpt2_lri_amat(qs_env, sub_env, lri_env, lri_v_int, a_ia_munu_sub)
Calculate contribution to response vector for LRI.
subroutine, public tddfpt_apply_coulomb(a_ia_rspace, rho_ia_g, local_rho_set, hartree_local, qs_env, sub_env, gapw, work_v_gspace, work_v_rspace, tddfpt_mgrid)
Update v_rspace by adding coulomb term.
subroutine, public tddfpt_apply_xc_potential(a_ia_rspace, fxc_rspace, rho_ia_struct, is_rks_triplets)
Routine for applying fxc potential.
Simplified Tamm Dancoff approach (sTDA).
Simplified Tamm Dancoff approach (sTDA).
subroutine, public stda_calculate_kernel(qs_env, stda_control, stda_env, sub_env, work, is_rks_triplets, x, res)
...Calculate the sTDA kernel contribution by contracting the Lowdin MO coefficients – transition char...
types for task lists
stores some data used in wavefunction fitting
Definition admm_types.F:120
represent a full matrix
stores all the informations relevant to an mpi environment
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Collection of variables required to evaluate adiabatic TDDFPT kernel.
Set of temporary ("work") matrices.