(git:fd1133a)
Loading...
Searching...
No Matches
qs_tddfpt2_operators.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
10 USE cell_types, ONLY: cell_type,&
11 pbc
13 USE cp_dbcsr_api, ONLY: &
16 dbcsr_release, dbcsr_set, dbcsr_type, dbcsr_type_no_symmetry
23 USE cp_fm_types, ONLY: cp_fm_create,&
31 USE hfx_types, ONLY: hfx_type
32 USE input_constants, ONLY: no_sf_tddfpt,&
37 USE kinds, ONLY: dp
41 USE pw_env_types, ONLY: pw_env_get,&
43 USE pw_methods, ONLY: pw_axpy,&
45 pw_scale,&
50 USE pw_pool_types, ONLY: pw_pool_p_type,&
52 USE pw_types, ONLY: pw_c1d_gs_type,&
59 USE qs_rho_types, ONLY: qs_rho_get,&
71#include "./base/base_uses.f90"
72
73 IMPLICIT NONE
74
75 PRIVATE
76
77 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_tddfpt2_operators'
78
79 LOGICAL, PARAMETER, PRIVATE :: debug_this_module = .false.
80 ! number of first derivative components (3: d/dx, d/dy, d/dz)
81 INTEGER, PARAMETER, PRIVATE :: nderivs = 3
82 INTEGER, PARAMETER, PRIVATE :: maxspins = 2
83
86
87! **************************************************************************************************
88
89CONTAINS
90
91! **************************************************************************************************
92!> \brief Apply orbital energy difference term:
93!> Aop_evects(spin,state) += KS(spin) * evects(spin,state) -
94!> S * evects(spin,state) * diag(evals_occ(spin))
95!> \param Aop_evects action of TDDFPT operator on trial vectors (modified on exit)
96!> \param evects trial vectors C_{1,i}
97!> \param S_evects S * C_{1,i}
98!> \param gs_mos molecular orbitals optimised for the ground state (only occupied orbital
99!> energies [component %evals_occ] are needed)
100!> \param matrix_ks Kohn-Sham matrix
101!> \param tddfpt_control ...
102!> \par History
103!> * 05.2016 initialise all matrix elements in one go [Sergey Chulkov]
104!> * 03.2017 renamed from tddfpt_init_energy_diff(), altered prototype [Sergey Chulkov]
105!> \note Based on the subroutine p_op_l1() which was originally created by
106!> Thomas Chassaing on 08.2002.
107! **************************************************************************************************
108 SUBROUTINE tddfpt_apply_energy_diff(Aop_evects, evects, S_evects, gs_mos, matrix_ks, tddfpt_control)
109 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(INOUT) :: aop_evects
110 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(IN) :: evects, s_evects
111 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
112 INTENT(in) :: gs_mos
113 TYPE(dbcsr_p_type), DIMENSION(:), INTENT(in) :: matrix_ks
114 TYPE(tddfpt2_control_type), INTENT(in), POINTER :: tddfpt_control
115
116 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_apply_energy_diff'
117
118 INTEGER :: handle, i, ispin, ivect, j, nactive, &
119 nao, nspins, nvects, spin2
120 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals_active
121 TYPE(cp_fm_struct_type), POINTER :: matrix_struct
122 TYPE(cp_fm_type) :: hevec
123
124 CALL timeset(routinen, handle)
125
126 nspins = SIZE(evects, 1)
127 nvects = SIZE(evects, 2)
128
129 DO ispin = 1, SIZE(evects, 1)
130 CALL cp_fm_get_info(matrix=evects(ispin, 1), matrix_struct=matrix_struct, &
131 nrow_global=nao, ncol_global=nactive)
132 CALL cp_fm_create(hevec, matrix_struct)
133 ALLOCATE (evals_active(nactive))
134 DO i = 1, nactive
135 j = gs_mos(ispin)%index_active(i)
136 evals_active(i) = gs_mos(ispin)%evals_occ(j)
137 END DO
138
139 IF (tddfpt_control%spinflip == no_sf_tddfpt) THEN
140 spin2 = ispin
141 ELSE
142 spin2 = 2
143 END IF
144
145 DO ivect = 1, nvects
146 CALL cp_dbcsr_sm_fm_multiply(matrix_ks(spin2)%matrix, evects(ispin, ivect), &
147 aop_evects(ispin, ivect), ncol=nactive, &
148 alpha=1.0_dp, beta=1.0_dp)
149
150 IF (ASSOCIATED(gs_mos(ispin)%evals_occ_matrix)) THEN
151 ! orbital energy correction: evals_occ_matrix is not a diagonal matrix
152 CALL parallel_gemm('N', 'N', nao, nactive, nactive, 1.0_dp, &
153 s_evects(ispin, ivect), gs_mos(ispin)%evals_occ_matrix, &
154 0.0_dp, hevec)
155 ELSE
156 CALL cp_fm_to_fm(s_evects(ispin, ivect), hevec)
157 CALL cp_fm_column_scale(hevec, evals_active)
158 END IF
159
160 ! KS * C1 - S * C1 * occupied_orbital_energies
161 CALL cp_fm_scale_and_add(1.0_dp, aop_evects(ispin, ivect), -1.0_dp, hevec)
162 END DO
163 DEALLOCATE (evals_active)
164 CALL cp_fm_release(hevec)
165 END DO
166
167 CALL timestop(handle)
168
169 END SUBROUTINE tddfpt_apply_energy_diff
170
171! **************************************************************************************************
172!> \brief Update v_rspace by adding coulomb term.
173!> \param A_ia_rspace action of TDDFPT operator on the trial vector expressed in a plane wave
174!> representation (modified on exit)
175!> \param rho_ia_g response density in reciprocal space for the given trial vector
176!> \param local_rho_set ...
177!> \param hartree_local ...
178!> \param qs_env ...
179!> \param sub_env the full sub_environment needed for calculation
180!> \param gapw Flag indicating GAPW cacluation
181!> \param work_v_gspace work reciprocal-space grid to store Coulomb potential (modified on exit)
182!> \param work_v_rspace work real-space grid to store Coulomb potential (modified on exit)
183!> \param tddfpt_mgrid ...
184!> \par History
185!> * 05.2016 compute all coulomb terms in one go [Sergey Chulkov]
186!> * 03.2017 proceed excited states sequentially; minimise the number of conversions between
187!> DBCSR and FM matrices [Sergey Chulkov]
188!> * 06.2018 return the action expressed in the plane wave representation instead of the one
189!> in the atomic basis set representation
190!> \note Based on the subroutine kpp1_calc_k_p_p1() which was originally created by
191!> Mohamed Fawzi on 10.2002.
192! **************************************************************************************************
193 SUBROUTINE tddfpt_apply_coulomb(A_ia_rspace, rho_ia_g, local_rho_set, hartree_local, &
194 qs_env, sub_env, gapw, work_v_gspace, work_v_rspace, tddfpt_mgrid)
195 TYPE(pw_r3d_rs_type), DIMENSION(:), INTENT(INOUT) :: a_ia_rspace
196 TYPE(pw_c1d_gs_type), INTENT(INOUT) :: rho_ia_g
197 TYPE(local_rho_type), POINTER :: local_rho_set
198 TYPE(hartree_local_type), POINTER :: hartree_local
199 TYPE(qs_environment_type), POINTER :: qs_env
200 TYPE(tddfpt_subgroup_env_type), INTENT(in) :: sub_env
201 LOGICAL, INTENT(IN) :: gapw
202 TYPE(pw_c1d_gs_type), INTENT(INOUT) :: work_v_gspace
203 TYPE(pw_r3d_rs_type), INTENT(INOUT) :: work_v_rspace
204 LOGICAL, INTENT(IN) :: tddfpt_mgrid
205
206 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_apply_coulomb'
207
208 INTEGER :: handle, ispin, nspins
209 REAL(kind=dp) :: alpha, pair_energy
210 TYPE(pw_env_type), POINTER :: pw_env
211 TYPE(pw_poisson_type), POINTER :: poisson_env
212 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: my_pools
213 TYPE(realspace_grid_desc_p_type), DIMENSION(:), &
214 POINTER :: my_rs_descs
215 TYPE(realspace_grid_type), DIMENSION(:), POINTER :: my_rs_grids
216
217 CALL timeset(routinen, handle)
218
219 nspins = SIZE(a_ia_rspace)
220 pw_env => sub_env%pw_env
221 IF (tddfpt_mgrid) THEN
222 CALL pw_env_get(pw_env, poisson_env=poisson_env, rs_grids=my_rs_grids, &
223 rs_descs=my_rs_descs, pw_pools=my_pools)
224 ELSE
225 CALL pw_env_get(pw_env, poisson_env=poisson_env)
226 END IF
227
228 IF (nspins > 1) THEN
229 alpha = 1.0_dp
230 ELSE
231 ! spin-restricted case: alpha == 2 due to singlet state.
232 ! In case of triplet states alpha == 0, so we should not call this subroutine at all.
233 alpha = 2.0_dp
234 END IF
235
236 IF (gapw) THEN
237 cpassert(ASSOCIATED(local_rho_set))
238 CALL pw_axpy(local_rho_set%rho0_mpole%rho0_s_gs, rho_ia_g)
239 IF (ASSOCIATED(local_rho_set%rho0_mpole%rhoz_cneo_s_gs)) THEN
240 CALL pw_axpy(local_rho_set%rho0_mpole%rhoz_cneo_s_gs, rho_ia_g)
241 END IF
242 END IF
243
244 CALL pw_poisson_solve(poisson_env, rho_ia_g, pair_energy, work_v_gspace)
245 CALL pw_transfer(work_v_gspace, work_v_rspace)
246
247 ! (i a || j b) = ( i_alpha a_alpha + i_beta a_beta || j_alpha b_alpha + j_beta b_beta) =
248 ! tr (Cj_alpha^T * [J_i{alpha}a{alpha}_munu + J_i{beta}a{beta}_munu] * Cb_alpha) +
249 ! tr (Cj_beta^T * [J_i{alpha}a{alpha}_munu + J_i{beta}a{beta}_munu] * Cb_beta)
250 DO ispin = 1, nspins
251 CALL pw_axpy(work_v_rspace, a_ia_rspace(ispin), alpha)
252 END DO
253
254 IF (gapw) THEN
255 CALL vh_1c_gg_integrals(qs_env, pair_energy, &
256 hartree_local%ecoul_1c, &
257 local_rho_set, &
258 sub_env%para_env, tddft=.true., core_2nd=.true.)
259 CALL pw_scale(work_v_rspace, work_v_rspace%pw_grid%dvol)
260 IF (tddfpt_mgrid) THEN
261 CALL integrate_vhg0_rspace(qs_env, work_v_rspace, sub_env%para_env, &
262 calculate_forces=.false., &
263 local_rho_set=local_rho_set, my_pools=my_pools, &
264 my_rs_descs=my_rs_descs)
265 ELSE
266 CALL integrate_vhg0_rspace(qs_env, work_v_rspace, sub_env%para_env, &
267 calculate_forces=.false., &
268 local_rho_set=local_rho_set)
269 END IF
270 END IF
271
272 CALL timestop(handle)
273
274 END SUBROUTINE tddfpt_apply_coulomb
275
276! **************************************************************************************************
277!> \brief Driver routine for applying fxc (analyic vs. finite difference for testing
278!> \param A_ia_rspace action of TDDFPT operator on trial vectors expressed in a plane wave
279!> representation (modified on exit)
280!> \param kernel_env kernel environment
281!> \param rho_ia_struct response density for the given trial vector
282!> \param is_rks_triplets indicates that the triplet excited states calculation using
283!> spin-unpolarised molecular orbitals has been requested
284!> \param pw_env plain wave environment
285!> \param work_v_xc work real-space grid to store the gradient of the exchange-correlation
286!> potential with respect to the response density (modified on exit)
287!> \param work_v_xc_tau ...
288!> \param spinflip ...
289! **************************************************************************************************
290 SUBROUTINE tddfpt_apply_xc(A_ia_rspace, kernel_env, rho_ia_struct, is_rks_triplets, &
291 pw_env, work_v_xc, work_v_xc_tau, spinflip)
292
293 TYPE(pw_r3d_rs_type), DIMENSION(:), INTENT(INOUT) :: a_ia_rspace
294 TYPE(full_kernel_env_type), INTENT(IN) :: kernel_env
295 TYPE(qs_rho_type), POINTER :: rho_ia_struct
296 LOGICAL, INTENT(in) :: is_rks_triplets
297 TYPE(pw_env_type), POINTER :: pw_env
298 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: work_v_xc, work_v_xc_tau
299 INTEGER, INTENT(in), OPTIONAL :: spinflip
300
301 INTEGER :: ispin, my_spinflip, nspins
302
303 nspins = SIZE(a_ia_rspace)
304 my_spinflip = 0
305 IF (PRESENT(spinflip)) my_spinflip = spinflip
306
307 IF (kernel_env%deriv2_analytic) THEN
308 CALL tddfpt_apply_xc_analytic(kernel_env, rho_ia_struct, is_rks_triplets, my_spinflip, &
309 nspins, pw_env, work_v_xc, work_v_xc_tau)
310 ELSE
311 CALL tddfpt_apply_xc_fd(kernel_env, rho_ia_struct, is_rks_triplets, nspins, &
312 pw_env, work_v_xc, work_v_xc_tau)
313 END IF
314
315 DO ispin = 1, nspins
316 ! pw2 = pw2 + alpha * pw1
317 CALL pw_axpy(work_v_xc(ispin), a_ia_rspace(ispin), kernel_env%alpha)
318 END DO
319
320 END SUBROUTINE tddfpt_apply_xc
321
322! **************************************************************************************************
323!> \brief Routine for applying fxc potential
324!> \param A_ia_rspace action of TDDFPT operator on trial vectors expressed in a plane wave
325!> representation (modified on exit)
326!> \param fxc_rspace ...
327!> \param rho_ia_struct response density for the given trial vector
328!> \param is_rks_triplets ...
329! **************************************************************************************************
330 SUBROUTINE tddfpt_apply_xc_potential(A_ia_rspace, fxc_rspace, rho_ia_struct, is_rks_triplets)
331
332 TYPE(pw_r3d_rs_type), DIMENSION(:), INTENT(INOUT) :: a_ia_rspace
333 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: fxc_rspace
334 TYPE(qs_rho_type), POINTER :: rho_ia_struct
335 LOGICAL, INTENT(in) :: is_rks_triplets
336
337 INTEGER :: nspins
338 REAL(kind=dp) :: alpha
339 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho1_r
340
341 nspins = SIZE(a_ia_rspace)
342
343 alpha = 1.0_dp
344
345 CALL qs_rho_get(rho_ia_struct, rho_r=rho1_r)
346
347 IF (nspins == 2) THEN
348 CALL pw_multiply(a_ia_rspace(1), fxc_rspace(1), rho1_r(1), alpha)
349 CALL pw_multiply(a_ia_rspace(1), fxc_rspace(2), rho1_r(2), alpha)
350 CALL pw_multiply(a_ia_rspace(2), fxc_rspace(3), rho1_r(2), alpha)
351 CALL pw_multiply(a_ia_rspace(2), fxc_rspace(2), rho1_r(1), alpha)
352 ELSE IF (is_rks_triplets) THEN
353 CALL pw_multiply(a_ia_rspace(1), fxc_rspace(1), rho1_r(1), alpha)
354 CALL pw_multiply(a_ia_rspace(1), fxc_rspace(2), rho1_r(1), -alpha)
355 ELSE
356 CALL pw_multiply(a_ia_rspace(1), fxc_rspace(1), rho1_r(1), alpha)
357 CALL pw_multiply(a_ia_rspace(1), fxc_rspace(2), rho1_r(1), alpha)
358 END IF
359
360 END SUBROUTINE tddfpt_apply_xc_potential
361
362! **************************************************************************************************
363!> \brief Update A_ia_munu by adding exchange-correlation term.
364!> \param kernel_env kernel environment
365!> \param rho_ia_struct response density for the given trial vector
366!> \param is_rks_triplets indicates that the triplet excited states calculation using
367!> spin-unpolarised molecular orbitals has been requested
368!> \param spinflip ...
369!> \param nspins ...
370!> \param pw_env plain wave environment
371!> \param work_v_xc work real-space grid to store the gradient of the exchange-correlation
372!> potential with respect to the response density (modified on exit)
373!> \param work_v_xc_tau ...
374!> \par History
375!> * 05.2016 compute all kernel terms in one go [Sergey Chulkov]
376!> * 03.2017 proceed excited states sequentially; minimise the number of conversions between
377!> DBCSR and FM matrices [Sergey Chulkov]
378!> * 06.2018 return the action expressed in the plane wave representation instead of the one
379!> in the atomic basis set representation
380!> \note Based on the subroutine kpp1_calc_k_p_p1() which was originally created by
381!> Mohamed Fawzi on 10.2002.
382! **************************************************************************************************
383 SUBROUTINE tddfpt_apply_xc_analytic(kernel_env, rho_ia_struct, is_rks_triplets, spinflip, &
384 nspins, pw_env, work_v_xc, work_v_xc_tau)
385 TYPE(full_kernel_env_type), INTENT(in) :: kernel_env
386 TYPE(qs_rho_type), POINTER :: rho_ia_struct
387 LOGICAL, INTENT(in) :: is_rks_triplets
388 INTEGER, INTENT(in) :: spinflip, nspins
389 TYPE(pw_env_type), POINTER :: pw_env
390 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: work_v_xc, work_v_xc_tau
391
392 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_apply_xc_analytic'
393
394 INTEGER :: handle, ispin
395 LOGICAL :: do_spinflip
396 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_ia_g, rho_ia_g2
397 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
398 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_ia_r, rho_ia_r2, tau_ia_r, tau_ia_r2
399
400 CALL timeset(routinen, handle)
401
402 CALL qs_rho_get(rho_ia_struct, rho_g=rho_ia_g, rho_r=rho_ia_r, tau_r=tau_ia_r)
403 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
404
405 IF (debug_this_module) THEN
406 cpassert(SIZE(rho_ia_g) == nspins)
407 cpassert(SIZE(rho_ia_r) == nspins)
408 cpassert((.NOT. ASSOCIATED(tau_ia_r)) .OR. SIZE(tau_ia_r) == nspins)
409 cpassert((.NOT. is_rks_triplets) .OR. nspins == 1)
410 cpassert((spinflip /= no_sf_tddfpt) .EQV. (nspins == 2))
411 END IF
412
413 IF (spinflip == tddfpt_sf_noncol) THEN
414 do_spinflip = .true.
415 ELSE
416 do_spinflip = .false.
417 END IF
418
419 NULLIFY (tau_ia_r2)
420 IF (is_rks_triplets) THEN
421 ALLOCATE (rho_ia_r2(2))
422 ALLOCATE (rho_ia_g2(2))
423 rho_ia_r2(1) = rho_ia_r(1)
424 rho_ia_r2(2) = rho_ia_r(1)
425 rho_ia_g2(1) = rho_ia_g(1)
426 rho_ia_g2(2) = rho_ia_g(1)
427
428 IF (ASSOCIATED(tau_ia_r)) THEN
429 ALLOCATE (tau_ia_r2(2))
430 tau_ia_r2(1) = tau_ia_r(1)
431 tau_ia_r2(2) = tau_ia_r(1)
432 END IF
433 ELSE
434 rho_ia_r2 => rho_ia_r
435 rho_ia_g2 => rho_ia_g
436
437 tau_ia_r2 => tau_ia_r
438 END IF
439
440 DO ispin = 1, nspins
441 CALL pw_zero(work_v_xc(ispin))
442 IF (ASSOCIATED(work_v_xc_tau)) CALL pw_zero(work_v_xc_tau(ispin))
443 END DO
444
445 CALL xc_rho_set_update(rho_set=kernel_env%xc_rho1_set, rho_r=rho_ia_r2, rho_g=rho_ia_g2, tau=tau_ia_r2, &
446 needs=kernel_env%xc_rho1_cflags, xc_deriv_method_id=kernel_env%deriv_method_id, &
447 xc_rho_smooth_id=kernel_env%rho_smooth_id, pw_pool=auxbas_pw_pool)
448
449 CALL xc_calc_2nd_deriv_analytical(v_xc=work_v_xc, v_xc_tau=work_v_xc_tau, deriv_set=kernel_env%xc_deriv_set, &
450 rho_set=kernel_env%xc_rho_set, &
451 rho1_set=kernel_env%xc_rho1_set, pw_pool=auxbas_pw_pool, &
452 xc_section=kernel_env%xc_section, gapw=.false., tddfpt_fac=kernel_env%beta, &
453 spinflip=do_spinflip)
454
455 IF (is_rks_triplets) THEN
456 DEALLOCATE (rho_ia_r2)
457 DEALLOCATE (rho_ia_g2)
458 IF (ASSOCIATED(tau_ia_r2)) DEALLOCATE (tau_ia_r2)
459 END IF
460
461 CALL timestop(handle)
462
463 END SUBROUTINE tddfpt_apply_xc_analytic
464
465! **************************************************************************************************
466!> \brief Update A_ia_munu by adding exchange-correlation term using finite difference methods.
467!> \param kernel_env kernel environment
468!> \param rho_ia_struct response density for the given trial vector
469!> \param is_rks_triplets indicates that the triplet excited states calculation using
470!> spin-unpolarised molecular orbitals has been requested
471!> \param nspins ...
472!> \param pw_env plain wave environment
473!> \param work_v_xc work real-space grid to store the gradient of the exchange-correlation
474!> potential with respect to the response density (modified on exit)
475!> \param work_v_xc_tau ...
476! **************************************************************************************************
477 SUBROUTINE tddfpt_apply_xc_fd(kernel_env, rho_ia_struct, is_rks_triplets, nspins, &
478 pw_env, work_v_xc, work_v_xc_tau)
479 TYPE(full_kernel_env_type), INTENT(in) :: kernel_env
480 TYPE(qs_rho_type), POINTER :: rho_ia_struct
481 LOGICAL, INTENT(in) :: is_rks_triplets
482 INTEGER, INTENT(in) :: nspins
483 TYPE(pw_env_type), POINTER :: pw_env
484 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: work_v_xc, work_v_xc_tau
485
486 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_apply_xc_fd'
487
488 INTEGER :: handle, ispin
489 LOGICAL :: lsd, singlet, triplet
490 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho1_g
491 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
492 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho1_r, tau1_r
493 TYPE(xc_rho_set_type), POINTER :: rho_set
494
495 CALL timeset(routinen, handle)
496
497 CALL qs_rho_get(rho_ia_struct, rho_r=rho1_r, rho_g=rho1_g, tau_r=tau1_r)
498 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
499 DO ispin = 1, nspins
500 CALL pw_zero(work_v_xc(ispin))
501 END DO
502 rho_set => kernel_env%xc_rho_set
503
504 singlet = .false.
505 triplet = .false.
506 lsd = .false.
507 IF (nspins == 1 .AND. .NOT. is_rks_triplets) THEN
508 singlet = .true.
509 ELSE IF (nspins == 1 .AND. is_rks_triplets) THEN
510 triplet = .true.
511 ELSE IF (nspins == 2) THEN
512 lsd = .true.
513 ELSE
514 cpabort("illegal options")
515 END IF
516
517 IF (ASSOCIATED(tau1_r)) THEN
518 DO ispin = 1, nspins
519 CALL pw_zero(work_v_xc_tau(ispin))
520 END DO
521 END IF
522
523 CALL xc_calc_2nd_deriv_numerical(work_v_xc, work_v_xc_tau, rho_set, rho1_r, rho1_g, tau1_r, &
524 auxbas_pw_pool, kernel_env%xc_section, &
525 is_rks_triplets)
526
527 CALL timestop(handle)
528
529 END SUBROUTINE tddfpt_apply_xc_fd
530
531! **************************************************************************************************
532!> \brief Update action of TDDFPT operator on trial vectors by adding exact-exchange term.
533!> \param Aop_evects action of TDDFPT operator on trial vectors (modified on exit)
534!> \param evects trial vectors
535!> \param gs_mos molecular orbitals optimised for the ground state (only occupied
536!> molecular orbitals [component %mos_occ] are needed)
537!> \param do_admm perform auxiliary density matrix method calculations
538!> \param qs_env Quickstep environment
539!> \param work_rho_ia_ao_symm ...
540!> \param work_hmat_symm ...
541!> \param work_rho_ia_ao_asymm ...
542!> \param work_hmat_asymm ...
543!> \param wfm_rho_orb ...
544!> \par History
545!> * 05.2016 compute all exact-exchange terms in one go [Sergey Chulkov]
546!> * 03.2017 code related to ADMM correction is now moved to tddfpt_apply_admm_correction()
547!> in order to compute this correction within parallel groups [Sergey Chulkov]
548!> \note Based on the subroutine kpp1_calc_k_p_p1() which was originally created by
549!> Mohamed Fawzi on 10.2002.
550! **************************************************************************************************
551 SUBROUTINE tddfpt_apply_hfx(Aop_evects, evects, gs_mos, do_admm, qs_env, &
552 work_rho_ia_ao_symm, work_hmat_symm, work_rho_ia_ao_asymm, &
553 work_hmat_asymm, wfm_rho_orb)
554 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(INOUT) :: aop_evects
555 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(IN) :: evects
556 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
557 INTENT(in) :: gs_mos
558 LOGICAL, INTENT(in) :: do_admm
559 TYPE(qs_environment_type), POINTER :: qs_env
560 TYPE(dbcsr_p_type), DIMENSION(:), INTENT(INOUT) :: work_rho_ia_ao_symm
561 TYPE(dbcsr_p_type), DIMENSION(:), INTENT(INOUT), &
562 TARGET :: work_hmat_symm
563 TYPE(dbcsr_p_type), DIMENSION(:), INTENT(INOUT) :: work_rho_ia_ao_asymm
564 TYPE(dbcsr_p_type), DIMENSION(:), INTENT(INOUT), &
565 TARGET :: work_hmat_asymm
566 TYPE(cp_fm_type), INTENT(IN) :: wfm_rho_orb
567
568 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_apply_hfx'
569
570 INTEGER :: handle, ispin, ivect, nao, nao_aux, &
571 nspins, nvects
572 INTEGER, DIMENSION(maxspins) :: nactive
573 LOGICAL :: do_hfx
574 REAL(kind=dp) :: alpha
575 TYPE(admm_type), POINTER :: admm_env
576 TYPE(section_vals_type), POINTER :: hfx_section, input
577
578 CALL timeset(routinen, handle)
579
580 ! Check for hfx section
581 CALL get_qs_env(qs_env, input=input)
582 hfx_section => section_vals_get_subs_vals(input, "DFT%XC%HF")
583 CALL section_vals_get(hfx_section, explicit=do_hfx)
584
585 IF (do_hfx) THEN
586 nspins = SIZE(evects, 1)
587 nvects = SIZE(evects, 2)
588
589 IF (SIZE(gs_mos) > 1) THEN
590 alpha = 1.0_dp
591 ELSE
592 alpha = 2.0_dp
593 END IF
594
595 CALL cp_fm_get_info(evects(1, 1), nrow_global=nao)
596 DO ispin = 1, nspins
597 CALL cp_fm_get_info(evects(ispin, 1), ncol_global=nactive(ispin))
598 END DO
599
600 IF (do_admm) THEN
601 CALL get_qs_env(qs_env, admm_env=admm_env)
602 CALL cp_fm_get_info(admm_env%A, nrow_global=nao_aux)
603 END IF
604
605 !Note: the symmetrized transition density matrix is P = 0.5*(C*evect^T + evect*C^T)
606 ! in the end, we only want evect*C^T for consistency with the MO formulation of TDDFT
607 ! therefore, we go in 2 steps: with the symmetric 0.5*(C*evect^T + evect*C^T) and
608 ! the antisymemtric 0.5*(C*evect^T - evect*C^T)
609
610 ! some stuff from qs_ks_build_kohn_sham_matrix
611 ! TO DO: add SIC support
612 DO ivect = 1, nvects
613 DO ispin = 1, nspins
614
615 !The symmetric density matrix
616 CALL parallel_gemm('N', 'T', nao, nao, nactive(ispin), 0.5_dp, evects(ispin, ivect), &
617 gs_mos(ispin)%mos_active, 0.0_dp, wfm_rho_orb)
618 CALL parallel_gemm('N', 'T', nao, nao, nactive(ispin), 0.5_dp, gs_mos(ispin)%mos_active, &
619 evects(ispin, ivect), 1.0_dp, wfm_rho_orb)
620
621 CALL dbcsr_set(work_hmat_symm(ispin)%matrix, 0.0_dp)
622 IF (do_admm) THEN
623 CALL parallel_gemm('N', 'N', nao_aux, nao, nao, 1.0_dp, admm_env%A, &
624 wfm_rho_orb, 0.0_dp, admm_env%work_aux_orb)
625 CALL parallel_gemm('N', 'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%work_aux_orb, admm_env%A, &
626 0.0_dp, admm_env%work_aux_aux)
627 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, work_rho_ia_ao_symm(ispin)%matrix, keep_sparsity=.true.)
628 ELSE
629 CALL copy_fm_to_dbcsr(wfm_rho_orb, work_rho_ia_ao_symm(ispin)%matrix, keep_sparsity=.true.)
630 END IF
631 END DO
632
633 CALL tddft_hfx_matrix(work_hmat_symm, work_rho_ia_ao_symm, qs_env)
634
635 IF (do_admm) THEN
636 DO ispin = 1, nspins
637 CALL cp_dbcsr_sm_fm_multiply(work_hmat_symm(ispin)%matrix, admm_env%A, admm_env%work_aux_orb, &
638 ncol=nao, alpha=1.0_dp, beta=0.0_dp)
639
640 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, 1.0_dp, admm_env%A, &
641 admm_env%work_aux_orb, 0.0_dp, wfm_rho_orb)
642
643 CALL parallel_gemm('N', 'N', nao, nactive(ispin), nao, alpha, wfm_rho_orb, &
644 gs_mos(ispin)%mos_active, 1.0_dp, aop_evects(ispin, ivect))
645 END DO
646 ELSE
647 DO ispin = 1, nspins
648 CALL cp_dbcsr_sm_fm_multiply(work_hmat_symm(ispin)%matrix, gs_mos(ispin)%mos_active, &
649 aop_evects(ispin, ivect), ncol=nactive(ispin), &
650 alpha=alpha, beta=1.0_dp)
651 END DO
652 END IF
653
654 !The anti-symmetric density matrix
655 DO ispin = 1, nspins
656
657 !The symmetric density matrix
658 CALL parallel_gemm('N', 'T', nao, nao, nactive(ispin), 0.5_dp, evects(ispin, ivect), &
659 gs_mos(ispin)%mos_active, 0.0_dp, wfm_rho_orb)
660 CALL parallel_gemm('N', 'T', nao, nao, nactive(ispin), -0.5_dp, gs_mos(ispin)%mos_active, &
661 evects(ispin, ivect), 1.0_dp, wfm_rho_orb)
662
663 CALL dbcsr_set(work_hmat_asymm(ispin)%matrix, 0.0_dp)
664 IF (do_admm) THEN
665 CALL parallel_gemm('N', 'N', nao_aux, nao, nao, 1.0_dp, admm_env%A, &
666 wfm_rho_orb, 0.0_dp, admm_env%work_aux_orb)
667 CALL parallel_gemm('N', 'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%work_aux_orb, admm_env%A, &
668 0.0_dp, admm_env%work_aux_aux)
669 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, work_rho_ia_ao_asymm(ispin)%matrix, keep_sparsity=.true.)
670 ELSE
671 CALL copy_fm_to_dbcsr(wfm_rho_orb, work_rho_ia_ao_asymm(ispin)%matrix, keep_sparsity=.true.)
672 END IF
673 END DO
674
675 CALL tddft_hfx_matrix(work_hmat_asymm, work_rho_ia_ao_asymm, qs_env)
676
677 IF (do_admm) THEN
678 DO ispin = 1, nspins
679 CALL cp_dbcsr_sm_fm_multiply(work_hmat_asymm(ispin)%matrix, admm_env%A, admm_env%work_aux_orb, &
680 ncol=nao, alpha=1.0_dp, beta=0.0_dp)
681
682 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, 1.0_dp, admm_env%A, &
683 admm_env%work_aux_orb, 0.0_dp, wfm_rho_orb)
684
685 CALL parallel_gemm('N', 'N', nao, nactive(ispin), nao, alpha, wfm_rho_orb, &
686 gs_mos(ispin)%mos_active, 1.0_dp, aop_evects(ispin, ivect))
687 END DO
688 ELSE
689 DO ispin = 1, nspins
690 CALL cp_dbcsr_sm_fm_multiply(work_hmat_asymm(ispin)%matrix, gs_mos(ispin)%mos_active, &
691 aop_evects(ispin, ivect), ncol=nactive(ispin), &
692 alpha=alpha, beta=1.0_dp)
693 END DO
694 END IF
695 END DO
696 END IF
697
698 CALL timestop(handle)
699
700 END SUBROUTINE tddfpt_apply_hfx
701
702! **************************************************************************************************
703!> \brief Update action of TDDFPT operator on trial vectors by adding exact-exchange term.
704!> \param Aop_evects action of TDDFPT operator on trial vectors (modified on exit)
705!> \param evects trial vectors
706!> \param gs_mos molecular orbitals optimised for the ground state (only occupied
707!> molecular orbitals [component %mos_occ] are needed)
708!> \param qs_env Quickstep environment
709!> \param admm_env ...
710!> \param hfx_section ...
711!> \param x_data ...
712!> \param symmetry ...
713!> \param recalc_integrals ...
714!> \param work_rho_ia_ao ...
715!> \param work_hmat ...
716!> \param wfm_rho_orb ...
717! **************************************************************************************************
718 SUBROUTINE tddfpt_apply_hfxsr_kernel(Aop_evects, evects, gs_mos, qs_env, admm_env, &
719 hfx_section, x_data, symmetry, recalc_integrals, &
720 work_rho_ia_ao, work_hmat, wfm_rho_orb)
721 TYPE(cp_fm_type), DIMENSION(:, :), INTENT(in) :: aop_evects, evects
722 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
723 INTENT(in) :: gs_mos
724 TYPE(qs_environment_type), POINTER :: qs_env
725 TYPE(admm_type), POINTER :: admm_env
726 TYPE(section_vals_type), POINTER :: hfx_section
727 TYPE(hfx_type), DIMENSION(:, :), POINTER :: x_data
728 INTEGER, INTENT(IN) :: symmetry
729 LOGICAL, INTENT(IN) :: recalc_integrals
730 TYPE(dbcsr_p_type), DIMENSION(:), INTENT(INOUT) :: work_rho_ia_ao
731 TYPE(dbcsr_p_type), DIMENSION(:), INTENT(INOUT), &
732 TARGET :: work_hmat
733 TYPE(cp_fm_type), INTENT(IN) :: wfm_rho_orb
734
735 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_apply_hfxsr_kernel'
736
737 INTEGER :: handle, ispin, ivect, nao, nao_aux, &
738 nspins, nvects
739 INTEGER, DIMENSION(maxspins) :: nactive
740 LOGICAL :: reint
741 REAL(kind=dp) :: alpha
742
743 CALL timeset(routinen, handle)
744
745 nspins = SIZE(evects, 1)
746 nvects = SIZE(evects, 2)
747
748 alpha = 2.0_dp
749 IF (nspins > 1) alpha = 1.0_dp
750
751 CALL cp_fm_get_info(evects(1, 1), nrow_global=nao)
752 CALL cp_fm_get_info(admm_env%A, nrow_global=nao_aux)
753 DO ispin = 1, nspins
754 CALL cp_fm_get_info(evects(ispin, 1), ncol_global=nactive(ispin))
755 END DO
756
757 reint = recalc_integrals
758
759 DO ivect = 1, nvects
760 DO ispin = 1, nspins
761 CALL parallel_gemm('N', 'T', nao, nao, nactive(ispin), 0.5_dp, evects(ispin, ivect), &
762 gs_mos(ispin)%mos_active, 0.0_dp, wfm_rho_orb)
763 CALL parallel_gemm('N', 'T', nao, nao, nactive(ispin), 0.5_dp*symmetry, gs_mos(ispin)%mos_active, &
764 evects(ispin, ivect), 1.0_dp, wfm_rho_orb)
765 CALL dbcsr_set(work_hmat(ispin)%matrix, 0.0_dp)
766 CALL parallel_gemm('N', 'N', nao_aux, nao, nao, 1.0_dp, admm_env%A, &
767 wfm_rho_orb, 0.0_dp, admm_env%work_aux_orb)
768 CALL parallel_gemm('N', 'T', nao_aux, nao_aux, nao, 1.0_dp, admm_env%work_aux_orb, admm_env%A, &
769 0.0_dp, admm_env%work_aux_aux)
770 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, work_rho_ia_ao(ispin)%matrix, keep_sparsity=.true.)
771 END DO
772
773 CALL tddft_hfx_matrix(work_hmat, work_rho_ia_ao, qs_env, .false., reint, hfx_section, x_data)
774 reint = .false.
775
776 DO ispin = 1, nspins
777 CALL cp_dbcsr_sm_fm_multiply(work_hmat(ispin)%matrix, admm_env%A, admm_env%work_aux_orb, &
778 ncol=nao, alpha=1.0_dp, beta=0.0_dp)
779 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, 1.0_dp, admm_env%A, &
780 admm_env%work_aux_orb, 0.0_dp, wfm_rho_orb)
781 CALL parallel_gemm('N', 'N', nao, nactive(ispin), nao, alpha, wfm_rho_orb, &
782 gs_mos(ispin)%mos_active, 1.0_dp, aop_evects(ispin, ivect))
783 END DO
784 END DO
785
786 CALL timestop(handle)
787
788 END SUBROUTINE tddfpt_apply_hfxsr_kernel
789
790! **************************************************************************************************
791!> \brief ...Calculate the HFXLR kernel contribution by contracting the Lowdin MO coefficients --
792!> transition charges with the exchange-type integrals using the sTDA approximation
793!> \param qs_env ...
794!> \param sub_env ...
795!> \param rcut ...
796!> \param hfx_scale ...
797!> \param work ...
798!> \param X ...
799!> \param res ... vector AX with A being the sTDA matrix and X the Davidson trial vector of the
800!> eigenvalue problem A*X = omega*X
801! **************************************************************************************************
802 SUBROUTINE tddfpt_apply_hfxlr_kernel(qs_env, sub_env, rcut, hfx_scale, work, X, res)
803
804 TYPE(qs_environment_type), POINTER :: qs_env
805 TYPE(tddfpt_subgroup_env_type) :: sub_env
806 REAL(kind=dp), INTENT(IN) :: rcut, hfx_scale
807 TYPE(tddfpt_work_matrices) :: work
808 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: x
809 TYPE(cp_fm_type), DIMENSION(:), INTENT(INOUT) :: res
810
811 CHARACTER(len=*), PARAMETER :: routinen = 'tddfpt_apply_hfxlr_kernel'
812
813 INTEGER :: handle, iatom, ispin, jatom, natom, &
814 nsgf, nspins
815 INTEGER, DIMENSION(2) :: nactive
816 REAL(kind=dp) :: dr, eps_filter, fcut, gabr
817 REAL(kind=dp), DIMENSION(3) :: rij
818 REAL(kind=dp), DIMENSION(:, :), POINTER :: pblock
819 TYPE(cell_type), POINTER :: cell
820 TYPE(cp_fm_struct_type), POINTER :: fmstruct
821 TYPE(cp_fm_type) :: cvec
822 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: xtransformed
823 TYPE(cp_fm_type), POINTER :: ct
824 TYPE(dbcsr_iterator_type) :: iter
825 TYPE(dbcsr_type) :: pdens
826 TYPE(dbcsr_type), POINTER :: tempmat
827 TYPE(mp_para_env_type), POINTER :: para_env
828 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
829
830 CALL timeset(routinen, handle)
831
832 ! parameters
833 eps_filter = 1.e-08_dp
834
835 nspins = SIZE(x)
836 DO ispin = 1, nspins
837 CALL cp_fm_get_info(x(ispin), ncol_global=nactive(ispin))
838 END DO
839
840 para_env => sub_env%para_env
841
842 CALL get_qs_env(qs_env, natom=natom, cell=cell, particle_set=particle_set)
843
844 ! calculate Loewdin transformed Davidson trial vector tilde(X)=S^1/2*X
845 ! and tilde(tilde(X))=S^1/2_A*tilde(X)_A
846 ALLOCATE (xtransformed(nspins))
847 DO ispin = 1, nspins
848 NULLIFY (fmstruct)
849 ct => work%ctransformed(ispin)
850 CALL cp_fm_get_info(ct, matrix_struct=fmstruct)
851 CALL cp_fm_create(matrix=xtransformed(ispin), matrix_struct=fmstruct, name="XTRANSFORMED")
852 END DO
853 CALL get_lowdin_x(work%shalf, x, xtransformed)
854
855 DO ispin = 1, nspins
856 ct => work%ctransformed(ispin)
857 CALL cp_fm_get_info(ct, matrix_struct=fmstruct, nrow_global=nsgf)
858 CALL cp_fm_create(cvec, fmstruct)
859 !
860 tempmat => work%shalf
861 CALL dbcsr_create(pdens, template=tempmat, matrix_type=dbcsr_type_no_symmetry)
862 ! P(nu,mu) = SUM_j XT(nu,j)*CT(mu,j)
863 ct => work%ctransformed(ispin)
864 CALL dbcsr_set(pdens, 0.0_dp)
865 CALL cp_dbcsr_plus_fm_fm_t(pdens, xtransformed(ispin), ct, nactive(ispin), &
866 1.0_dp, keep_sparsity=.false.)
867 CALL dbcsr_filter(pdens, eps_filter)
868 ! Apply PP*gab -> PP; gab = gamma_coulomb
869 ! P(nu,mu) = P(nu,mu)*g(a of nu,b of mu)
870 CALL dbcsr_iterator_start(iter, pdens)
871 DO WHILE (dbcsr_iterator_blocks_left(iter))
872 CALL dbcsr_iterator_next_block(iter, iatom, jatom, pblock)
873 rij = particle_set(iatom)%r - particle_set(jatom)%r
874 rij = pbc(rij, cell)
875 dr = sqrt(sum(rij(:)**2))
876 gabr = 1._dp/rcut
877 IF (dr < 1.e-6) THEN
878 gabr = 2._dp*gabr/sqrt(3.1415926_dp)
879 ELSE
880 gabr = erf(gabr*dr)/dr
881 fcut = exp(dr - 4._dp*rcut)
882 fcut = fcut/(fcut + 1._dp)
883 END IF
884 pblock = hfx_scale*gabr*pblock
885 END DO
886 CALL dbcsr_iterator_stop(iter)
887 ! CV(mu,i) = P(nu,mu)*CT(mu,i)
888 CALL cp_dbcsr_sm_fm_multiply(pdens, ct, cvec, nactive(ispin), 1.0_dp, 0.0_dp)
889 ! rho(nu,i) = rho(nu,i) + ShalfP(nu,mu)*CV(mu,i)
890 CALL cp_dbcsr_sm_fm_multiply(work%shalf, cvec, res(ispin), nactive(ispin), &
891 -1.0_dp, 1.0_dp)
892 !
893 CALL dbcsr_release(pdens)
894 !
895 CALL cp_fm_release(cvec)
896 END DO
897
898 CALL cp_fm_release(xtransformed)
899
900 CALL timestop(handle)
901
902 END SUBROUTINE tddfpt_apply_hfxlr_kernel
903
904! **************************************************************************************************
905
906END MODULE qs_tddfpt2_operators
Types and set/get functions for auxiliary density matrix methods.
Definition admm_types.F:15
Handles all functions related to the CELL.
Definition cell_types.F:15
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
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.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
represent the structure of a full matrix
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp, set_zero)
creates a new full matrix with the given structure
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 vh_1c_gg_integrals(qs_env, energy_hartree_1c, ecoul_1c, local_rho_set, para_env, tddft, local_rho_set_2nd, core_2nd)
Calculates one center GAPW Hartree energies and matrix elements Hartree potentials are input Takes po...
Utilities for hfx and admm methods.
subroutine, public tddft_hfx_matrix(matrix_ks, rho_ao, qs_env, update_energy, recalc_integrals, external_hfx_sections, external_x_data, external_para_env)
Add the hfx contributions to the Hamiltonian.
Types and set/get functions for HFX.
Definition hfx_types.F:15
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public tddfpt_sf_noncol
integer, parameter, public no_sf_tddfpt
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
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
functions related to the poisson solver on regular grids
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 integrate_vhg0_rspace(qs_env, v_rspace, para_env, calculate_forces, local_rho_set, local_rho_set_2nd, atener, kforce, my_pools, my_rs_descs)
...
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_apply_hfx(aop_evects, evects, gs_mos, do_admm, qs_env, work_rho_ia_ao_symm, work_hmat_symm, work_rho_ia_ao_asymm, work_hmat_asymm, wfm_rho_orb)
Update action of TDDFPT operator on trial vectors by adding exact-exchange 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, 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_energy_diff(aop_evects, evects, s_evects, gs_mos, matrix_ks, tddfpt_control)
Apply orbital energy difference term: Aop_evects(spin,state) += KS(spin) * evects(spin,...
subroutine, public tddfpt_apply_hfxlr_kernel(qs_env, sub_env, rcut, hfx_scale, work, x, res)
...Calculate the HFXLR kernel contribution by contracting the Lowdin MO coefficients – transition cha...
subroutine, public tddfpt_apply_hfxsr_kernel(aop_evects, evects, gs_mos, qs_env, admm_env, hfx_section, x_data, symmetry, recalc_integrals, work_rho_ia_ao, work_hmat, wfm_rho_orb)
Update action of TDDFPT operator on trial vectors by adding exact-exchange 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).
subroutine, public get_lowdin_x(shalf, xvec, xt)
Calculate Lowdin transformed Davidson trial vector X shalf (dbcsr), xvec, xt (fm) are defined in the ...
contains the structure
subroutine, public xc_rho_set_update(rho_set, rho_r, rho_g, tau, needs, xc_deriv_method_id, xc_rho_smooth_id, pw_pool, spinflip)
updates the given rho set with the density given by rho_r (and rho_g). The rho set will contain the c...
Exchange and Correlation functional calculations.
Definition xc.F:17
subroutine, public xc_calc_2nd_deriv_analytical(v_xc, v_xc_tau, deriv_set, rho_set, rho1_set, pw_pool, xc_section, gapw, vxg, tddfpt_fac, compute_virial, virial_xc, spinflip)
Calculates the second derivative of E_xc at rho in the direction rho1 (if you see the second derivati...
Definition xc.F:2650
subroutine, public xc_calc_2nd_deriv_numerical(v_xc, v_tau, rho_set, rho1_r, rho1_g, tau1_r, pw_pool, xc_section, do_triplet, calc_virial, virial_xc, deriv_set)
calculates 2nd derivative numerically
Definition xc.F:1663
stores some data used in wavefunction fitting
Definition admm_types.F:120
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
keeps the information about the structure of a full matrix
represent a full matrix
stores some data used in construction of Kohn-Sham matrix
Definition hfx_types.F:510
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
to create arrays of pools
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.
keeps the density in various representations, keeping track of which ones are valid.
Ground state molecular orbitals.
Set of temporary ("work") matrices.
represent a density, with all the representation and data needed to perform a functional evaluation