(git:103fa69)
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), DIMENSION(:), POINTER :: fxc_tau, rho_ia_r, rho_ia_r_aux_fit
133 TYPE(pw_r3d_rs_type), POINTER :: weights
134 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho1_atom_set, rho_atom_set
135 TYPE(task_list_type), POINTER :: task_list
136
137 CALL timeset(routinen, handle)
138
139 nspins = SIZE(evects, 1)
140 nvects = SIZE(evects, 2)
141 IF (do_admm) THEN
142 cpassert(do_hfx)
143 cpassert(ASSOCIATED(sub_env%admm_A))
144 END IF
145 CALL get_qs_env(qs_env, dft_control=dft_control)
146
147 gapw = dft_control%qs_control%gapw
148 gapw_xc = dft_control%qs_control%gapw_xc
149 spinflip = dft_control%tddfpt2_control%spinflip
150
151 do_noncol = spinflip == tddfpt_sf_noncol
152 do_scale = is_rks_triplets
153 do_onecenter = gapw .OR. gapw_xc
154
155 CALL cp_fm_get_info(evects(1, 1), nrow_global=nao)
156 DO ispin = 1, nspins
157 CALL cp_fm_get_info(evects(ispin, 1), ncol_global=nactive(ispin))
158 END DO
159
160 CALL qs_rho_get(work_matrices%rho_orb_struct_sub, rho_ao=rho_ia_ao, &
161 rho_g=rho_ia_g, rho_r=rho_ia_r)
162 IF (do_hfx .AND. do_admm) THEN
163 CALL get_qs_env(qs_env, admm_env=admm_env)
164 CALL qs_rho_get(work_matrices%rho_aux_fit_struct_sub, &
165 rho_ao=rho_ia_ao_aux_fit, rho_g=rho_ia_g_aux_fit, &
166 rho_r=rho_ia_r_aux_fit)
167 END IF
168
169 NULLIFY (weights)
170 CALL get_qs_env(qs_env, xcint_weights=weights)
171 CALL pw_env_get(sub_env%pw_env, auxbas_pw_pool=auxbas_pw_pool)
172 NULLIFY (fxc_tau)
173
174 DO ivect = 1, nvects
175
176 ! Transform TDDFT vectors to AO space and store them into rho_ia_ao
177 IF (ALLOCATED(work_matrices%evects_sub)) THEN
178 IF (ASSOCIATED(work_matrices%evects_sub(1, ivect)%matrix_struct)) THEN
179 DO ispin = 1, nspins
180 CALL dbcsr_set(rho_ia_ao(ispin)%matrix, 0.0_dp)
181 CALL cp_dbcsr_plus_fm_fm_t(rho_ia_ao(ispin)%matrix, &
182 matrix_v=sub_env%mos_active(ispin), &
183 matrix_g=work_matrices%evects_sub(ispin, ivect), &
184 ncol=nactive(ispin), symmetry_mode=1)
185 END DO
186 ELSE
187 ! skip trial vectors which are assigned to different parallel groups
188 cycle
189 END IF
190 ELSE
191 DO ispin = 1, nspins
192 CALL dbcsr_set(rho_ia_ao(ispin)%matrix, 0.0_dp)
193 CALL cp_dbcsr_plus_fm_fm_t(rho_ia_ao(ispin)%matrix, &
194 matrix_v=sub_env%mos_active(ispin), &
195 matrix_g=evects(ispin, ivect), &
196 ncol=nactive(ispin), symmetry_mode=1)
197 END DO
198 END IF
199
200 IF (do_lrigpw) THEN
201 CALL qs_rho_update_tddfpt(work_matrices%rho_orb_struct_sub, qs_env, &
202 pw_env_external=sub_env%pw_env, &
203 task_list_external=sub_env%task_list_orb, &
204 para_env_external=sub_env%para_env, &
205 tddfpt_lri_env=kernel_env%lri_env, &
206 tddfpt_lri_density=kernel_env%lri_density)
207 ELSE IF (dft_control%qs_control%lrigpw .OR. &
208 dft_control%qs_control%rigpw) THEN
209 CALL qs_rho_update_tddfpt(work_matrices%rho_orb_struct_sub, qs_env, &
210 pw_env_external=sub_env%pw_env, &
211 task_list_external=sub_env%task_list_orb, &
212 para_env_external=sub_env%para_env)
213 ELSE
214 IF (gapw) THEN
215 CALL qs_rho_update_rho(work_matrices%rho_orb_struct_sub, qs_env, &
216 local_rho_set=work_matrices%local_rho_set, &
217 pw_env_external=sub_env%pw_env, &
218 task_list_external=sub_env%task_list_orb_soft, &
219 para_env_external=sub_env%para_env)
220 CALL prepare_gapw_den(qs_env, work_matrices%local_rho_set, &
221 do_rho0=(.NOT. is_rks_triplets), pw_env_sub=sub_env%pw_env)
222 ELSE IF (gapw_xc) THEN
223 CALL qs_rho_update_rho(work_matrices%rho_orb_struct_sub, qs_env, &
224 rho_xc_external=work_matrices%rho_xc_struct_sub, &
225 local_rho_set=work_matrices%local_rho_set, &
226 pw_env_external=sub_env%pw_env, &
227 task_list_external=sub_env%task_list_orb, &
228 task_list_external_soft=sub_env%task_list_orb_soft, &
229 para_env_external=sub_env%para_env)
230 CALL prepare_gapw_den(qs_env, work_matrices%local_rho_set, do_rho0=.false., &
231 pw_env_sub=sub_env%pw_env)
232 ELSE
233 CALL qs_rho_update_rho(work_matrices%rho_orb_struct_sub, qs_env, &
234 pw_env_external=sub_env%pw_env, &
235 task_list_external=sub_env%task_list_orb, &
236 para_env_external=sub_env%para_env)
237 END IF
238 END IF
239
240 DO ispin = 1, nspins
241 CALL dbcsr_set(work_matrices%A_ia_munu_sub(ispin)%matrix, 0.0_dp)
242 END DO
243
244 ! electron-hole exchange-correlation interaction
245 DO ispin = 1, nspins
246 CALL pw_zero(work_matrices%A_ia_rspace_sub(ispin))
247 END DO
248
249 ! Skip kernel if collinear xc-kernel for spin-flip is requested
250 IF (spinflip /= tddfpt_sf_col) THEN
251 IF ((.NOT. dft_control%tddfpt2_control%do_bse) .AND. (.NOT. dft_control%tddfpt2_control%do_bse_w_only)) THEN
252 IF ((.NOT. dft_control%tddfpt2_control%do_bse_gw_only)) THEN
253 ! C_x d^{2}E_{x}^{DFT}[\rho] / d\rho^2
254 ! + C_{HF} d^{2}E_{x, ADMM}^{DFT}[\rho] / d\rho^2 in case of ADMM calculation
255 IF (do_onecenter) THEN
256 rho_atom_set => sub_env%local_rho_set%rho_atom_set
257 rho1_atom_set => work_matrices%local_rho_set%rho_atom_set
258 END IF
259 !
260 IF (gapw_xc) THEN
261 IF (kernel_env%do_exck) THEN
262 cpabort("NYA")
263 ELSE
264 CALL qs_fxc_apply(qs_env, kernel_env%xc_deriv_set, kernel_env%xc_rho_set, &
265 work_matrices%rho_xc_struct_sub, rho_atom_set, &
266 kernel_env%xc_section, do_onecenter, work_matrices%wpw_rspace_sub, &
267 fxc_tau, rho1_atom_set, &
268 do_scale=do_scale, is_triplet=is_rks_triplets, spinflip=do_noncol, &
269 pw_env_ext=sub_env%pw_env, para_env_external=sub_env%para_env)
270 DO ispin = 1, nspins
271 CALL pw_axpy(work_matrices%wpw_rspace_sub(ispin), &
272 work_matrices%A_ia_rspace_sub(ispin), kernel_env%alpha)
273 END DO
274
275 END IF
276 DO ispin = 1, nspins
277 CALL pw_scale(work_matrices%A_ia_rspace_sub(ispin), &
278 work_matrices%A_ia_rspace_sub(ispin)%pw_grid%dvol)
279 CALL integrate_v_rspace(v_rspace=work_matrices%A_ia_rspace_sub(ispin), &
280 hmat=work_matrices%A_ia_munu_sub(ispin), &
281 qs_env=qs_env, calculate_forces=.false., gapw=gapw_xc, &
282 pw_env_external=sub_env%pw_env, &
283 task_list_external=sub_env%task_list_orb_soft)
284 CALL pw_zero(work_matrices%A_ia_rspace_sub(ispin))
285 END DO
286 ELSE
287 IF (kernel_env%do_exck) THEN
288 CALL tddfpt_apply_xc_potential(work_matrices%A_ia_rspace_sub, work_matrices%fxc_rspace_sub, &
289 work_matrices%rho_orb_struct_sub, is_rks_triplets)
290 ELSE
291 CALL qs_fxc_apply(qs_env, kernel_env%xc_deriv_set, kernel_env%xc_rho_set, &
292 work_matrices%rho_orb_struct_sub, rho_atom_set, &
293 kernel_env%xc_section, do_onecenter, work_matrices%wpw_rspace_sub, &
294 fxc_tau, rho1_atom_set, &
295 do_scale=do_scale, is_triplet=is_rks_triplets, spinflip=do_noncol, &
296 pw_env_ext=sub_env%pw_env, para_env_external=sub_env%para_env)
297 DO ispin = 1, nspins
298 CALL pw_axpy(work_matrices%wpw_rspace_sub(ispin), &
299 work_matrices%A_ia_rspace_sub(ispin), kernel_env%alpha)
300 END DO
301
302 END IF
303 END IF
304
305 END IF ! do_bse
306 END IF ! do_bse
307 END IF ! spin-flip
308
309 ! Complete the meta-GGA response before the ADMM call reuses the XC work grids.
310 ! compute_tau includes the factor 1/2 in the gradient-product integral.
311 IF (ASSOCIATED(fxc_tau)) THEN
312 task_list => sub_env%task_list_orb
313 IF (do_onecenter) task_list => sub_env%task_list_orb_soft
314 DO ispin = 1, nspins
315 CALL pw_scale(fxc_tau(ispin), kernel_env%alpha*fxc_tau(ispin)%pw_grid%dvol)
316 CALL integrate_v_rspace(v_rspace=fxc_tau(ispin), hmat=work_matrices%A_ia_munu_sub(ispin), &
317 qs_env=qs_env, calculate_forces=.false., compute_tau=.true., gapw=do_onecenter, &
318 pw_env_external=sub_env%pw_env, task_list_external=task_list)
319 CALL auxbas_pw_pool%give_back_pw(fxc_tau(ispin))
320 END DO
321 DEALLOCATE (fxc_tau)
322 END IF
323
324 ! ADMM correction
325 IF ((.NOT. dft_control%tddfpt2_control%do_bse) .AND. (.NOT. dft_control%tddfpt2_control%do_bse_w_only) &
326 .AND. (.NOT. dft_control%tddfpt2_control%do_bse_gw_only)) THEN
327 IF (do_admm .AND. admm_xc_correction) THEN
328 IF (dft_control%admm_control%aux_exch_func /= do_admm_aux_exch_func_none) THEN
329 CALL tddfpt_construct_aux_fit_density(rho_orb_struct=work_matrices%rho_orb_struct_sub, &
330 rho_aux_fit_struct=work_matrices%rho_aux_fit_struct_sub, &
331 local_rho_set=work_matrices%local_rho_set_admm, &
332 qs_env=qs_env, sub_env=sub_env, &
333 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub, &
334 wfm_rho_aux_fit=work_matrices%rho_ao_aux_fit_fm_sub, &
335 wfm_aux_orb=work_matrices%wfm_aux_orb_sub)
336 ! - C_{HF} d^{2}E_{x, ADMM}^{DFT}[\hat{\rho}] / d\hat{\rho}^2
337 IF (admm_symm) THEN
338 CALL dbcsr_get_info(rho_ia_ao_aux_fit(1)%matrix, row_blk_size=blk_sizes)
339 ALLOCATE (a_xc_munu_sub(nspins))
340 DO ispin = 1, nspins
341 ALLOCATE (a_xc_munu_sub(ispin)%matrix)
342 CALL dbcsr_create(matrix=a_xc_munu_sub(ispin)%matrix, name="ADMM_XC", &
343 dist=sub_env%dbcsr_dist, matrix_type=dbcsr_type_symmetric, &
344 row_blk_size=blk_sizes, col_blk_size=blk_sizes)
345 CALL cp_dbcsr_alloc_block_from_nbl(a_xc_munu_sub(ispin)%matrix, sub_env%sab_aux_fit)
346 CALL dbcsr_set(a_xc_munu_sub(ispin)%matrix, 0.0_dp)
347 END DO
348
349 IF (admm_env%do_gapw) THEN
350 basis_type = "AUX_FIT_SOFT"
351 task_list => sub_env%task_list_aux_fit_soft
352 ELSE
353 basis_type = "AUX_FIT"
354 task_list => sub_env%task_list_aux_fit
355 END IF
356
357 IF (admm_env%do_gapw) THEN
358 rho_atom_set => sub_env%local_rho_set_admm%rho_atom_set
359 rho1_atom_set => work_matrices%local_rho_set_admm%rho_atom_set
360 END IF
361 CALL qs_fxc_apply(qs_env, kernel_env_admm_aux%xc_deriv_set, kernel_env_admm_aux%xc_rho_set, &
362 work_matrices%rho_aux_fit_struct_sub, rho_atom_set, &
363 kernel_env_admm_aux%xc_section, admm_env%do_gapw, &
364 work_matrices%wpw_rspace_sub, fxc_tau, rho1_atom_set, &
365 do_scale=do_scale, is_triplet=is_rks_triplets, spinflip=do_noncol, &
366 pw_env_ext=sub_env%pw_env, kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
367 para_env_external=sub_env%para_env)
368 DO ispin = 1, nspins
369 CALL pw_scale(work_matrices%wpw_rspace_sub(ispin), &
370 kernel_env_admm_aux%alpha*work_matrices%wpw_rspace_sub(ispin)%pw_grid%dvol)
371 CALL integrate_v_rspace(v_rspace=work_matrices%wpw_rspace_sub(ispin), &
372 hmat=a_xc_munu_sub(ispin), &
373 qs_env=qs_env, calculate_forces=.false., &
374 pw_env_external=sub_env%pw_env, &
375 basis_type=basis_type, &
376 task_list_external=task_list)
377 END DO
378 IF (admm_env%do_gapw) THEN
379 CALL update_ks_atom(qs_env, a_xc_munu_sub, rho_ia_ao_aux_fit, forces=.false., tddft=.true., &
380 rho_atom_external=rho1_atom_set, &
381 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
382 oce_external=admm_env%admm_gapw_env%oce, &
383 sab_external=sub_env%sab_aux_fit)
384 END IF
385 ALLOCATE (dbwork)
386 CALL dbcsr_create(dbwork, template=work_matrices%A_ia_munu_sub(1)%matrix)
387 CALL cp_fm_create(work_aux_orb, &
388 matrix_struct=work_matrices%wfm_aux_orb_sub%matrix_struct)
389 CALL cp_fm_create(work_orb_orb, &
390 matrix_struct=work_matrices%rho_ao_orb_fm_sub%matrix_struct)
391 CALL cp_fm_get_info(work_aux_orb, nrow_global=nao_aux, ncol_global=nao)
392 DO ispin = 1, nspins
393 CALL cp_dbcsr_sm_fm_multiply(a_xc_munu_sub(ispin)%matrix, sub_env%admm_A, &
394 work_aux_orb, nao)
395 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, 1.0_dp, sub_env%admm_A, &
396 work_aux_orb, 0.0_dp, work_orb_orb)
397 CALL dbcsr_copy(dbwork, work_matrices%A_ia_munu_sub(1)%matrix)
398 CALL dbcsr_set(dbwork, 0.0_dp)
399 CALL copy_fm_to_dbcsr(work_orb_orb, dbwork, keep_sparsity=.true.)
400 CALL dbcsr_add(work_matrices%A_ia_munu_sub(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
401 END DO
402 CALL dbcsr_release(dbwork)
403 DEALLOCATE (dbwork)
404 CALL cp_fm_release(work_aux_orb)
405 CALL cp_fm_release(work_orb_orb)
406 DO ispin = 1, nspins
407 CALL dbcsr_deallocate_matrix(a_xc_munu_sub(ispin)%matrix)
408 END DO
409 DEALLOCATE (a_xc_munu_sub)
410 ELSE
411 IF (admm_env%do_gapw) THEN
412 cpwarn("GAPW/ADMM needs symmetric ADMM kernel")
413 cpabort("GAPW/ADMM@TDDFT")
414 END IF
415 CALL qs_fxc_apply(qs_env, kernel_env_admm_aux%xc_deriv_set, kernel_env_admm_aux%xc_rho_set, &
416 work_matrices%rho_aux_fit_struct_sub, rho_atom_set, &
417 kernel_env_admm_aux%xc_section, admm_env%do_gapw, &
418 work_matrices%wpw_rspace_sub, fxc_tau, rho1_atom_set, &
419 do_scale=do_scale, is_triplet=is_rks_triplets, spinflip=do_noncol, &
420 pw_env_ext=sub_env%pw_env)
421
422 DO ispin = 1, nspins
423 CALL pw_axpy(work_matrices%wpw_rspace_sub(ispin), &
424 work_matrices%A_ia_rspace_sub(ispin), kernel_env_admm_aux%alpha)
425 END DO
426
427 END IF
428 END IF
429 END IF
430 END IF
431
432 ! electron-hole Coulomb interaction
433 IF (.NOT. dft_control%tddfpt2_control%do_bse_w_only) THEN
434 IF (.NOT. dft_control%tddfpt2_control%do_bse_gw_only) THEN
435 IF ((.NOT. is_rks_triplets) .AND. (spinflip == no_sf_tddfpt)) THEN
436 ! a sum J_i{alpha}a{alpha}_munu + J_i{beta}a{beta}_munu can be computed by solving
437 ! the Poisson equation for combined density (rho_{ia,alpha} + rho_{ia,beta}) .
438 ! The following action will destroy reciprocal-space grid in spin-unrestricted case.
439 DO ispin = 2, nspins
440 CALL pw_axpy(rho_ia_g(ispin), rho_ia_g(1))
441 END DO
442 CALL tddfpt_apply_coulomb(a_ia_rspace=work_matrices%A_ia_rspace_sub, &
443 rho_ia_g=rho_ia_g(1), &
444 local_rho_set=work_matrices%local_rho_set, &
445 hartree_local=work_matrices%hartree_local, &
446 qs_env=qs_env, sub_env=sub_env, gapw=gapw, &
447 work_v_gspace=work_matrices%wpw_gspace_sub(1), &
448 work_v_rspace=work_matrices%wpw_rspace_sub(1), &
449 tddfpt_mgrid=tddfpt_mgrid)
450 END IF
451
452 ! convert from the plane-wave representation into the Gaussian basis set representation
453 DO ispin = 1, nspins
454 IF (.NOT. do_lrigpw) THEN
455 CALL pw_scale(work_matrices%A_ia_rspace_sub(ispin), &
456 work_matrices%A_ia_rspace_sub(ispin)%pw_grid%dvol)
457
458 IF (gapw) THEN
459 CALL integrate_v_rspace(v_rspace=work_matrices%A_ia_rspace_sub(ispin), &
460 hmat=work_matrices%A_ia_munu_sub(ispin), &
461 qs_env=qs_env, calculate_forces=.false., gapw=gapw, &
462 pw_env_external=sub_env%pw_env, &
463 task_list_external=sub_env%task_list_orb_soft)
464 ELSE IF (gapw_xc) THEN
465 IF (.NOT. is_rks_triplets) THEN
466 CALL integrate_v_rspace(v_rspace=work_matrices%A_ia_rspace_sub(ispin), &
467 hmat=work_matrices%A_ia_munu_sub(ispin), &
468 qs_env=qs_env, calculate_forces=.false., gapw=.false., &
469 pw_env_external=sub_env%pw_env, task_list_external=sub_env%task_list_orb)
470 END IF
471 ELSE
472 CALL integrate_v_rspace(v_rspace=work_matrices%A_ia_rspace_sub(ispin), &
473 hmat=work_matrices%A_ia_munu_sub(ispin), &
474 qs_env=qs_env, calculate_forces=.false., gapw=.false., &
475 pw_env_external=sub_env%pw_env, task_list_external=sub_env%task_list_orb)
476 END IF
477 ELSE ! for full kernel using lri
478 CALL pw_scale(work_matrices%A_ia_rspace_sub(ispin), &
479 work_matrices%A_ia_rspace_sub(ispin)%pw_grid%dvol)
480 lri_v_int => kernel_env%lri_density%lri_coefs(ispin)%lri_kinds
481 CALL get_qs_env(qs_env, nkind=nkind, para_env=para_env)
482 DO ikind = 1, nkind
483 lri_v_int(ikind)%v_int = 0.0_dp
484 END DO
485 CALL integrate_v_rspace_one_center(work_matrices%A_ia_rspace_sub(ispin), &
486 qs_env, lri_v_int, .false., "P_LRI_AUX")
487 DO ikind = 1, nkind
488 CALL para_env%sum(lri_v_int(ikind)%v_int)
489 END DO
490 END IF ! for full kernel using lri
491 END DO
492
493 ! local atom contributions
494 IF (.NOT. do_lrigpw) THEN
495 IF (gapw .OR. gapw_xc) THEN
496 ! rho_ia_ao will not be touched
497 CALL update_ks_atom(qs_env, work_matrices%A_ia_munu_sub, rho_ia_ao, forces=.false., &
498 rho_atom_external=work_matrices%local_rho_set%rho_atom_set, &
499 tddft=.true.)
500 END IF
501 END IF
502
503 ! calculate Coulomb contribution to response vector for lrigpw !
504 ! this is restricting lri to Coulomb only at the moment !
505 IF (do_lrigpw .AND. (.NOT. is_rks_triplets)) THEN !
506 CALL tddfpt2_lri_amat(qs_env, sub_env, kernel_env%lri_env, lri_v_int, work_matrices%A_ia_munu_sub)
507 END IF
508
509 DO ispin = 1, nspins
510 IF (ALLOCATED(work_matrices%evects_sub)) THEN
511 CALL cp_dbcsr_sm_fm_multiply(work_matrices%A_ia_munu_sub(ispin)%matrix, &
512 sub_env%mos_active(ispin), &
513 work_matrices%Aop_evects_sub(ispin, ivect), &
514 ncol=nactive(ispin), alpha=1.0_dp, beta=0.0_dp)
515 ELSE
516 CALL cp_dbcsr_sm_fm_multiply(work_matrices%A_ia_munu_sub(ispin)%matrix, &
517 sub_env%mos_active(ispin), &
518 aop_evects(ispin, ivect), &
519 ncol=nactive(ispin), alpha=1.0_dp, beta=0.0_dp)
520 END IF
521 END DO
522 END IF
523 END IF
524 END DO
525
526 CALL timestop(handle)
527
528 END SUBROUTINE fhxc_kernel
529
530! **************************************************************************************************
531!> \brief Compute action matrix-vector products with the sTDA Kernel
532!> \param Aop_evects action of TDDFPT operator on trial vectors (modified on exit)
533!> \param evects TDDFPT trial vectors
534!> \param is_rks_triplets indicates that a triplet excited states calculation using
535!> spin-unpolarised molecular orbitals has been requested
536!> \param qs_env Quickstep environment
537!> \param stda_control control parameters for sTDA kernel
538!> \param stda_env ...
539!> \param sub_env parallel (sub)group environment
540!> \param work_matrices collection of work matrices (modified on exit)
541!> \par History
542!> * 04.2019 initial version [JHU]
543! **************************************************************************************************
544 SUBROUTINE stda_kernel(Aop_evects, evects, is_rks_triplets, &
545 qs_env, stda_control, stda_env, &
546 sub_env, work_matrices)
547
548 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(INOUT) :: aop_evects
549 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(IN) :: evects
550 LOGICAL, INTENT(in) :: is_rks_triplets
551 TYPE(qs_environment_type), POINTER :: qs_env
552 TYPE(stda_control_type) :: stda_control
553 TYPE(stda_env_type) :: stda_env
554 TYPE(tddfpt_subgroup_env_type) :: sub_env
555 TYPE(tddfpt_work_matrices), INTENT(inout) :: work_matrices
556
557 CHARACTER(LEN=*), PARAMETER :: routinen = 'stda_kernel'
558
559 INTEGER :: handle, ivect, nvects
560
561 CALL timeset(routinen, handle)
562
563 nvects = SIZE(evects, 2)
564
565 DO ivect = 1, nvects
566 IF (ALLOCATED(work_matrices%evects_sub)) THEN
567 IF (ASSOCIATED(work_matrices%evects_sub(1, ivect)%matrix_struct)) THEN
568 CALL stda_calculate_kernel(qs_env, stda_control, stda_env, sub_env, work_matrices, &
569 is_rks_triplets, work_matrices%evects_sub(:, ivect), &
570 work_matrices%Aop_evects_sub(:, ivect))
571 ELSE
572 ! skip trial vectors which are assigned to different parallel groups
573 cycle
574 END IF
575 ELSE
576 CALL stda_calculate_kernel(qs_env, stda_control, stda_env, sub_env, work_matrices, &
577 is_rks_triplets, evects(:, ivect), aop_evects(:, ivect))
578 END IF
579 END DO
580
581 CALL timestop(handle)
582
583 END SUBROUTINE stda_kernel
584
585! **************************************************************************************************
586
587END 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:15
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:714
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.