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