(git:5f3bc36)
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-2025 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,&
42 USE qs_integrate_potential, ONLY: integrate_v_rspace,&
43 integrate_v_rspace_one_center
45 USE qs_ks_atom, ONLY: update_ks_atom
49 USE qs_rho_types, ONLY: qs_rho_get
61#include "./base/base_uses.f90"
62
63 IMPLICIT NONE
64
65 PRIVATE
66
67 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_tddfpt2_fhxc'
68
69 INTEGER, PARAMETER, PRIVATE :: maxspins = 2
70
71 PUBLIC :: fhxc_kernel, stda_kernel
72
73! **************************************************************************************************
74
75CONTAINS
76
77! **************************************************************************************************
78!> \brief Compute action matrix-vector products with the FHxc Kernel
79!> \param Aop_evects action of TDDFPT operator on trial vectors (modified on exit)
80!> \param evects TDDFPT trial vectors
81!> \param is_rks_triplets indicates that a triplet excited states calculation using
82!> spin-unpolarised molecular orbitals has been requested
83!> \param do_hfx flag that activates computation of exact-exchange terms
84!> \param do_admm ...
85!> \param qs_env Quickstep environment
86!> \param kernel_env kernel environment
87!> \param kernel_env_admm_aux kernel environment for ADMM correction
88!> \param sub_env parallel (sub)group environment
89!> \param work_matrices collection of work matrices (modified on exit)
90!> \param admm_symm use symmetric definition of ADMM kernel correction
91!> \param admm_xc_correction use ADMM XC kernel correction
92!> \param do_lrigpw ...
93!> \param tddfpt_mgrid ...
94!> \par History
95!> * 06.2016 created [Sergey Chulkov]
96!> * 03.2017 refactored [Sergey Chulkov]
97!> * 04.2019 refactored [JHU]
98! **************************************************************************************************
99 SUBROUTINE fhxc_kernel(Aop_evects, evects, is_rks_triplets, &
100 do_hfx, do_admm, qs_env, kernel_env, kernel_env_admm_aux, &
101 sub_env, work_matrices, admm_symm, admm_xc_correction, do_lrigpw, &
102 tddfpt_mgrid)
103 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(INOUT) :: aop_evects
104 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(IN) :: evects
105 LOGICAL, INTENT(in) :: is_rks_triplets, do_hfx, do_admm
106 TYPE(qs_environment_type), POINTER :: qs_env
107 TYPE(full_kernel_env_type), POINTER :: kernel_env, kernel_env_admm_aux
108 TYPE(tddfpt_subgroup_env_type), INTENT(in) :: sub_env
109 TYPE(tddfpt_work_matrices), INTENT(inout) :: work_matrices
110 LOGICAL, INTENT(in) :: admm_symm, admm_xc_correction, &
111 do_lrigpw, tddfpt_mgrid
112
113 CHARACTER(LEN=*), PARAMETER :: routinen = 'fhxc_kernel'
114
115 CHARACTER(LEN=default_string_length) :: basis_type
116 INTEGER :: handle, ikind, ispin, ivect, nao, &
117 nao_aux, nkind, nspins, nvects, &
118 spinflip
119 INTEGER, DIMENSION(:), POINTER :: blk_sizes
120 INTEGER, DIMENSION(maxspins) :: nactive
121 LOGICAL :: do_noncol, gapw, 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(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 .EQ. tddfpt_sf_noncol
152
153 CALL cp_fm_get_info(evects(1, 1), nrow_global=nao)
154 DO ispin = 1, nspins
155 CALL cp_fm_get_info(evects(ispin, 1), ncol_global=nactive(ispin))
156 END DO
157
158 CALL qs_rho_get(work_matrices%rho_orb_struct_sub, rho_ao=rho_ia_ao, &
159 rho_g=rho_ia_g, rho_r=rho_ia_r)
160 IF (do_hfx .AND. do_admm) THEN
161 CALL get_qs_env(qs_env, admm_env=admm_env)
162 CALL qs_rho_get(work_matrices%rho_aux_fit_struct_sub, &
163 rho_ao=rho_ia_ao_aux_fit, rho_g=rho_ia_g_aux_fit, &
164 rho_r=rho_ia_r_aux_fit)
165 END IF
166
167 DO ivect = 1, nvects
168
169 ! Transform TDDFT vectors to AO space and store them into rho_ia_ao
170 IF (ALLOCATED(work_matrices%evects_sub)) THEN
171 IF (ASSOCIATED(work_matrices%evects_sub(1, ivect)%matrix_struct)) THEN
172 DO ispin = 1, nspins
173 CALL dbcsr_set(rho_ia_ao(ispin)%matrix, 0.0_dp)
174 CALL cp_dbcsr_plus_fm_fm_t(rho_ia_ao(ispin)%matrix, &
175 matrix_v=sub_env%mos_occ(ispin), &
176 matrix_g=work_matrices%evects_sub(ispin, ivect), &
177 ncol=nactive(ispin), symmetry_mode=1)
178 END DO
179 ELSE
180 ! skip trial vectors which are assigned to different parallel groups
181 cycle
182 END IF
183 ELSE
184 DO ispin = 1, nspins
185 CALL dbcsr_set(rho_ia_ao(ispin)%matrix, 0.0_dp)
186 CALL cp_dbcsr_plus_fm_fm_t(rho_ia_ao(ispin)%matrix, &
187 matrix_v=sub_env%mos_occ(ispin), &
188 matrix_g=evects(ispin, ivect), &
189 ncol=nactive(ispin), symmetry_mode=1)
190 END DO
191 END IF
192
193 IF (do_lrigpw) THEN
194 CALL qs_rho_update_tddfpt(work_matrices%rho_orb_struct_sub, qs_env, &
195 pw_env_external=sub_env%pw_env, &
196 task_list_external=sub_env%task_list_orb, &
197 para_env_external=sub_env%para_env, &
198 tddfpt_lri_env=kernel_env%lri_env, &
199 tddfpt_lri_density=kernel_env%lri_density)
200 ELSEIF (dft_control%qs_control%lrigpw .OR. &
201 dft_control%qs_control%rigpw) THEN
202 CALL qs_rho_update_tddfpt(work_matrices%rho_orb_struct_sub, qs_env, &
203 pw_env_external=sub_env%pw_env, &
204 task_list_external=sub_env%task_list_orb, &
205 para_env_external=sub_env%para_env)
206 ELSE
207 IF (gapw) THEN
208 CALL qs_rho_update_rho(work_matrices%rho_orb_struct_sub, qs_env, &
209 local_rho_set=work_matrices%local_rho_set, &
210 pw_env_external=sub_env%pw_env, &
211 task_list_external=sub_env%task_list_orb_soft, &
212 para_env_external=sub_env%para_env)
213 CALL prepare_gapw_den(qs_env, work_matrices%local_rho_set, &
214 do_rho0=(.NOT. is_rks_triplets), pw_env_sub=sub_env%pw_env)
215 ELSEIF (gapw_xc) THEN
216 CALL qs_rho_update_rho(work_matrices%rho_orb_struct_sub, qs_env, &
217 rho_xc_external=work_matrices%rho_xc_struct_sub, &
218 local_rho_set=work_matrices%local_rho_set, &
219 pw_env_external=sub_env%pw_env, &
220 task_list_external=sub_env%task_list_orb, &
221 task_list_external_soft=sub_env%task_list_orb_soft, &
222 para_env_external=sub_env%para_env)
223 CALL prepare_gapw_den(qs_env, work_matrices%local_rho_set, do_rho0=.false., &
224 pw_env_sub=sub_env%pw_env)
225 ELSE
226 CALL qs_rho_update_rho(work_matrices%rho_orb_struct_sub, qs_env, &
227 pw_env_external=sub_env%pw_env, &
228 task_list_external=sub_env%task_list_orb, &
229 para_env_external=sub_env%para_env)
230 END IF
231 END IF
232
233 DO ispin = 1, nspins
234 CALL dbcsr_set(work_matrices%A_ia_munu_sub(ispin)%matrix, 0.0_dp)
235 END DO
236
237 ! electron-hole exchange-correlation interaction
238 DO ispin = 1, nspins
239 CALL pw_zero(work_matrices%A_ia_rspace_sub(ispin))
240 END DO
241
242 ! Skip kernel if collinear xc-kernel for spin-flip is requested
243 IF (spinflip /= tddfpt_sf_col) THEN
244
245 IF (.NOT. dft_control%tddfpt2_control%do_bse) THEN
246 ! C_x d^{2}E_{x}^{DFT}[\rho] / d\rho^2
247 ! + C_{HF} d^{2}E_{x, ADMM}^{DFT}[\rho] / d\rho^2 in case of ADMM calculation
248 IF (gapw_xc) THEN
249 IF (kernel_env%do_exck) THEN
250 cpabort("NYA")
251 ELSE
252 CALL tddfpt_apply_xc(a_ia_rspace=work_matrices%A_ia_rspace_sub, kernel_env=kernel_env, &
253 rho_ia_struct=work_matrices%rho_xc_struct_sub, &
254 is_rks_triplets=is_rks_triplets, pw_env=sub_env%pw_env, &
255 work_v_xc=work_matrices%wpw_rspace_sub, &
256 work_v_xc_tau=work_matrices%wpw_tau_rspace_sub, &
257 spinflip=spinflip)
258 END IF
259 DO ispin = 1, nspins
260 CALL pw_scale(work_matrices%A_ia_rspace_sub(ispin), &
261 work_matrices%A_ia_rspace_sub(ispin)%pw_grid%dvol)
262 CALL integrate_v_rspace(v_rspace=work_matrices%A_ia_rspace_sub(ispin), &
263 hmat=work_matrices%A_ia_munu_sub(ispin), &
264 qs_env=qs_env, calculate_forces=.false., gapw=gapw_xc, &
265 pw_env_external=sub_env%pw_env, &
266 task_list_external=sub_env%task_list_orb_soft)
267 CALL pw_zero(work_matrices%A_ia_rspace_sub(ispin))
268 END DO
269 ELSE
270 IF (kernel_env%do_exck) THEN
271 CALL tddfpt_apply_xc_potential(work_matrices%A_ia_rspace_sub, work_matrices%fxc_rspace_sub, &
272 work_matrices%rho_orb_struct_sub, is_rks_triplets)
273 ELSE
274 CALL tddfpt_apply_xc(a_ia_rspace=work_matrices%A_ia_rspace_sub, kernel_env=kernel_env, &
275 rho_ia_struct=work_matrices%rho_orb_struct_sub, &
276 is_rks_triplets=is_rks_triplets, pw_env=sub_env%pw_env, &
277 work_v_xc=work_matrices%wpw_rspace_sub, &
278 work_v_xc_tau=work_matrices%wpw_tau_rspace_sub, &
279 spinflip=spinflip)
280 END IF
281 END IF
282 IF (gapw .OR. gapw_xc) THEN
283 rho_atom_set => sub_env%local_rho_set%rho_atom_set
284 rho1_atom_set => work_matrices%local_rho_set%rho_atom_set
285 CALL calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, kernel_env%xc_section, &
286 sub_env%para_env, do_tddfpt2=.true., do_triplet=is_rks_triplets, &
287 do_sf=do_noncol)
288 END IF
289
290 END IF ! do_bse
291 END IF ! spin-flip
292
293 ! ADMM correction
294 IF (do_admm .AND. admm_xc_correction) THEN
295 IF (dft_control%admm_control%aux_exch_func /= do_admm_aux_exch_func_none) THEN
296 CALL tddfpt_construct_aux_fit_density(rho_orb_struct=work_matrices%rho_orb_struct_sub, &
297 rho_aux_fit_struct=work_matrices%rho_aux_fit_struct_sub, &
298 local_rho_set=work_matrices%local_rho_set_admm, &
299 qs_env=qs_env, sub_env=sub_env, &
300 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub, &
301 wfm_rho_aux_fit=work_matrices%rho_ao_aux_fit_fm_sub, &
302 wfm_aux_orb=work_matrices%wfm_aux_orb_sub)
303 ! - C_{HF} d^{2}E_{x, ADMM}^{DFT}[\hat{\rho}] / d\hat{\rho}^2
304 IF (admm_symm) THEN
305 CALL dbcsr_get_info(rho_ia_ao_aux_fit(1)%matrix, row_blk_size=blk_sizes)
306 ALLOCATE (a_xc_munu_sub(nspins))
307 DO ispin = 1, nspins
308 ALLOCATE (a_xc_munu_sub(ispin)%matrix)
309 CALL dbcsr_create(matrix=a_xc_munu_sub(ispin)%matrix, name="ADMM_XC", &
310 dist=sub_env%dbcsr_dist, matrix_type=dbcsr_type_symmetric, &
311 row_blk_size=blk_sizes, col_blk_size=blk_sizes)
312 CALL cp_dbcsr_alloc_block_from_nbl(a_xc_munu_sub(ispin)%matrix, sub_env%sab_aux_fit)
313 CALL dbcsr_set(a_xc_munu_sub(ispin)%matrix, 0.0_dp)
314 END DO
315
316 CALL pw_env_get(sub_env%pw_env, auxbas_pw_pool=auxbas_pw_pool)
317 ALLOCATE (v_rspace_sub(nspins))
318 DO ispin = 1, nspins
319 CALL auxbas_pw_pool%create_pw(v_rspace_sub(ispin))
320 CALL pw_zero(v_rspace_sub(ispin))
321 END DO
322
323 IF (admm_env%do_gapw) THEN
324 basis_type = "AUX_FIT_SOFT"
325 task_list => sub_env%task_list_aux_fit_soft
326 ELSE
327 basis_type = "AUX_FIT"
328 task_list => sub_env%task_list_aux_fit
329 END IF
330
331 CALL tddfpt_apply_xc(a_ia_rspace=v_rspace_sub, &
332 kernel_env=kernel_env_admm_aux, &
333 rho_ia_struct=work_matrices%rho_aux_fit_struct_sub, &
334 is_rks_triplets=is_rks_triplets, pw_env=sub_env%pw_env, &
335 work_v_xc=work_matrices%wpw_rspace_sub, &
336 work_v_xc_tau=work_matrices%wpw_tau_rspace_sub, &
337 spinflip=spinflip)
338 DO ispin = 1, nspins
339 CALL pw_scale(v_rspace_sub(ispin), v_rspace_sub(ispin)%pw_grid%dvol)
340 CALL integrate_v_rspace(v_rspace=v_rspace_sub(ispin), &
341 hmat=a_xc_munu_sub(ispin), &
342 qs_env=qs_env, calculate_forces=.false., &
343 pw_env_external=sub_env%pw_env, &
344 basis_type=basis_type, &
345 task_list_external=task_list)
346 END DO
347 IF (admm_env%do_gapw) THEN
348 rho_atom_set => sub_env%local_rho_set_admm%rho_atom_set
349 rho1_atom_set => work_matrices%local_rho_set_admm%rho_atom_set
350 CALL calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, &
351 kernel_env_admm_aux%xc_section, &
352 sub_env%para_env, do_tddfpt2=.true., &
353 do_triplet=is_rks_triplets, do_sf=do_noncol, &
354 kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
355 CALL update_ks_atom(qs_env, a_xc_munu_sub, rho_ia_ao_aux_fit, forces=.false., tddft=.true., &
356 rho_atom_external=rho1_atom_set, &
357 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
358 oce_external=admm_env%admm_gapw_env%oce, &
359 sab_external=sub_env%sab_aux_fit)
360 END IF
361 ALLOCATE (dbwork)
362 CALL dbcsr_create(dbwork, template=work_matrices%A_ia_munu_sub(1)%matrix)
363 CALL cp_fm_create(work_aux_orb, &
364 matrix_struct=work_matrices%wfm_aux_orb_sub%matrix_struct)
365 CALL cp_fm_create(work_orb_orb, &
366 matrix_struct=work_matrices%rho_ao_orb_fm_sub%matrix_struct)
367 CALL cp_fm_get_info(work_aux_orb, nrow_global=nao_aux, ncol_global=nao)
368 DO ispin = 1, nspins
369 CALL cp_dbcsr_sm_fm_multiply(a_xc_munu_sub(ispin)%matrix, sub_env%admm_A, &
370 work_aux_orb, nao)
371 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, 1.0_dp, sub_env%admm_A, &
372 work_aux_orb, 0.0_dp, work_orb_orb)
373 CALL dbcsr_copy(dbwork, work_matrices%A_ia_munu_sub(1)%matrix)
374 CALL dbcsr_set(dbwork, 0.0_dp)
375 CALL copy_fm_to_dbcsr(work_orb_orb, dbwork, keep_sparsity=.true.)
376 CALL dbcsr_add(work_matrices%A_ia_munu_sub(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
377 END DO
378 CALL dbcsr_release(dbwork)
379 DEALLOCATE (dbwork)
380 DO ispin = 1, nspins
381 CALL auxbas_pw_pool%give_back_pw(v_rspace_sub(ispin))
382 END DO
383 DEALLOCATE (v_rspace_sub)
384 CALL cp_fm_release(work_aux_orb)
385 CALL cp_fm_release(work_orb_orb)
386 DO ispin = 1, nspins
387 CALL dbcsr_deallocate_matrix(a_xc_munu_sub(ispin)%matrix)
388 END DO
389 DEALLOCATE (a_xc_munu_sub)
390 ELSE
391 CALL tddfpt_apply_xc(a_ia_rspace=work_matrices%A_ia_rspace_sub, &
392 kernel_env=kernel_env_admm_aux, &
393 rho_ia_struct=work_matrices%rho_aux_fit_struct_sub, &
394 is_rks_triplets=is_rks_triplets, pw_env=sub_env%pw_env, &
395 work_v_xc=work_matrices%wpw_rspace_sub, &
396 work_v_xc_tau=work_matrices%wpw_tau_rspace_sub, &
397 spinflip=spinflip)
398 IF (admm_env%do_gapw) THEN
399 cpwarn("GAPW/ADMM needs symmetric ADMM kernel")
400 cpabort("GAPW/ADMM@TDDFT")
401 END IF
402 END IF
403 END IF
404 END IF
405
406 ! electron-hole Coulomb interaction
407 IF ((.NOT. is_rks_triplets) .AND. (spinflip .EQ. no_sf_tddfpt)) THEN
408 ! a sum J_i{alpha}a{alpha}_munu + J_i{beta}a{beta}_munu can be computed by solving
409 ! the Poisson equation for combined density (rho_{ia,alpha} + rho_{ia,beta}) .
410 ! The following action will destroy reciprocal-space grid in spin-unrestricted case.
411 DO ispin = 2, nspins
412 CALL pw_axpy(rho_ia_g(ispin), rho_ia_g(1))
413 END DO
414 CALL tddfpt_apply_coulomb(a_ia_rspace=work_matrices%A_ia_rspace_sub, &
415 rho_ia_g=rho_ia_g(1), &
416 local_rho_set=work_matrices%local_rho_set, &
417 hartree_local=work_matrices%hartree_local, &
418 qs_env=qs_env, sub_env=sub_env, gapw=gapw, &
419 work_v_gspace=work_matrices%wpw_gspace_sub(1), &
420 work_v_rspace=work_matrices%wpw_rspace_sub(1), &
421 tddfpt_mgrid=tddfpt_mgrid)
422 END IF
423
424 ! convert from the plane-wave representation into the Gaussian basis set representation
425 DO ispin = 1, nspins
426 IF (.NOT. do_lrigpw) THEN
427 CALL pw_scale(work_matrices%A_ia_rspace_sub(ispin), &
428 work_matrices%A_ia_rspace_sub(ispin)%pw_grid%dvol)
429
430 IF (gapw) THEN
431 CALL integrate_v_rspace(v_rspace=work_matrices%A_ia_rspace_sub(ispin), &
432 hmat=work_matrices%A_ia_munu_sub(ispin), &
433 qs_env=qs_env, calculate_forces=.false., gapw=gapw, &
434 pw_env_external=sub_env%pw_env, &
435 task_list_external=sub_env%task_list_orb_soft)
436 ELSEIF (gapw_xc) THEN
437 IF (.NOT. is_rks_triplets) THEN
438 CALL integrate_v_rspace(v_rspace=work_matrices%A_ia_rspace_sub(ispin), &
439 hmat=work_matrices%A_ia_munu_sub(ispin), &
440 qs_env=qs_env, calculate_forces=.false., gapw=.false., &
441 pw_env_external=sub_env%pw_env, task_list_external=sub_env%task_list_orb)
442 END IF
443 ELSE
444 CALL integrate_v_rspace(v_rspace=work_matrices%A_ia_rspace_sub(ispin), &
445 hmat=work_matrices%A_ia_munu_sub(ispin), &
446 qs_env=qs_env, calculate_forces=.false., gapw=.false., &
447 pw_env_external=sub_env%pw_env, task_list_external=sub_env%task_list_orb)
448 END IF
449 ELSE ! for full kernel using lri
450 CALL pw_scale(work_matrices%A_ia_rspace_sub(ispin), &
451 work_matrices%A_ia_rspace_sub(ispin)%pw_grid%dvol)
452 lri_v_int => kernel_env%lri_density%lri_coefs(ispin)%lri_kinds
453 CALL get_qs_env(qs_env, nkind=nkind, para_env=para_env)
454 DO ikind = 1, nkind
455 lri_v_int(ikind)%v_int = 0.0_dp
456 END DO
457 CALL integrate_v_rspace_one_center(work_matrices%A_ia_rspace_sub(ispin), &
458 qs_env, lri_v_int, .false., "P_LRI_AUX")
459 DO ikind = 1, nkind
460 CALL para_env%sum(lri_v_int(ikind)%v_int)
461 END DO
462 END IF ! for full kernel using lri
463 END DO
464
465 ! local atom contributions
466 IF (.NOT. do_lrigpw) THEN
467 IF (gapw .OR. gapw_xc) THEN
468 ! rho_ia_ao will not be touched
469 CALL update_ks_atom(qs_env, work_matrices%A_ia_munu_sub, rho_ia_ao, forces=.false., &
470 rho_atom_external=work_matrices%local_rho_set%rho_atom_set, &
471 tddft=.true.)
472 END IF
473 END IF
474
475 ! calculate Coulomb contribution to response vector for lrigpw !
476 ! this is restricting lri to Coulomb only at the moment !
477 IF (do_lrigpw .AND. (.NOT. is_rks_triplets)) THEN !
478 CALL tddfpt2_lri_amat(qs_env, sub_env, kernel_env%lri_env, lri_v_int, work_matrices%A_ia_munu_sub)
479 END IF
480
481 IF (ALLOCATED(work_matrices%evects_sub)) THEN
482 DO ispin = 1, nspins
483 CALL cp_dbcsr_sm_fm_multiply(work_matrices%A_ia_munu_sub(ispin)%matrix, &
484 sub_env%mos_occ(ispin), &
485 work_matrices%Aop_evects_sub(ispin, ivect), &
486 ncol=nactive(ispin), alpha=1.0_dp, beta=0.0_dp)
487 END DO
488 ELSE
489 DO ispin = 1, nspins
490 CALL cp_dbcsr_sm_fm_multiply(work_matrices%A_ia_munu_sub(ispin)%matrix, &
491 sub_env%mos_occ(ispin), &
492 aop_evects(ispin, ivect), &
493 ncol=nactive(ispin), alpha=1.0_dp, beta=0.0_dp)
494 END DO
495 END IF
496 END DO
497
498 CALL timestop(handle)
499
500 END SUBROUTINE fhxc_kernel
501
502! **************************************************************************************************
503!> \brief Compute action matrix-vector products with the sTDA Kernel
504!> \param Aop_evects action of TDDFPT operator on trial vectors (modified on exit)
505!> \param evects TDDFPT trial vectors
506!> \param is_rks_triplets indicates that a triplet excited states calculation using
507!> spin-unpolarised molecular orbitals has been requested
508!> \param qs_env Quickstep environment
509!> \param stda_control control parameters for sTDA kernel
510!> \param stda_env ...
511!> \param sub_env parallel (sub)group environment
512!> \param work_matrices collection of work matrices (modified on exit)
513!> \par History
514!> * 04.2019 initial version [JHU]
515! **************************************************************************************************
516 SUBROUTINE stda_kernel(Aop_evects, evects, is_rks_triplets, &
517 qs_env, stda_control, stda_env, &
518 sub_env, work_matrices)
519
520 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(INOUT) :: aop_evects
521 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(IN) :: evects
522 LOGICAL, INTENT(in) :: is_rks_triplets
523 TYPE(qs_environment_type), POINTER :: qs_env
524 TYPE(stda_control_type) :: stda_control
525 TYPE(stda_env_type) :: stda_env
526 TYPE(tddfpt_subgroup_env_type) :: sub_env
527 TYPE(tddfpt_work_matrices), INTENT(inout) :: work_matrices
528
529 CHARACTER(LEN=*), PARAMETER :: routinen = 'stda_kernel'
530
531 INTEGER :: handle, ivect, nvects
532
533 CALL timeset(routinen, handle)
534
535 nvects = SIZE(evects, 2)
536
537 DO ivect = 1, nvects
538 IF (ALLOCATED(work_matrices%evects_sub)) THEN
539 IF (ASSOCIATED(work_matrices%evects_sub(1, ivect)%matrix_struct)) THEN
540 CALL stda_calculate_kernel(qs_env, stda_control, stda_env, sub_env, work_matrices, &
541 is_rks_triplets, work_matrices%evects_sub(:, ivect), &
542 work_matrices%Aop_evects_sub(:, ivect))
543 ELSE
544 ! skip trial vectors which are assigned to different parallel groups
545 cycle
546 END IF
547 ELSE
548 CALL stda_calculate_kernel(qs_env, stda_control, stda_env, sub_env, work_matrices, &
549 is_rks_triplets, evects(:, ivect), aop_evects(:, ivect))
550 END IF
551 END DO
552
553 CALL timestop(handle)
554
555 END SUBROUTINE stda_kernel
556
557! **************************************************************************************************
558
559END 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, use_sp)
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, 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, 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 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_xc(a_ia_rspace, kernel_env, rho_ia_struct, is_rks_triplets, pw_env, work_v_xc, work_v_xc_tau, spinflip)
Driver routine for applying fxc (analyic vs. finite difference for testing.
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...
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
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.