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