(git:477b1f1)
Loading...
Searching...
No Matches
qs_tddfpt2_types.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
9 USE admm_types, ONLY: admm_type,&
14 USE cp_dbcsr_api, ONLY: &
17 dbcsr_type, dbcsr_type_antisymmetric
28 USE cp_fm_types, ONLY: cp_fm_create,&
39 USE kinds, ONLY: dp
42 USE pw_env_types, ONLY: pw_env_get
44 USE pw_types, ONLY: pw_c1d_gs_type,&
54 USE qs_rho0_methods, ONLY: init_rho0
57 USE qs_rho_types, ONLY: qs_rho_create,&
63#include "./base/base_uses.f90"
64
65 IMPLICIT NONE
66
67 PRIVATE
68
69 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_tddfpt2_types'
70
71 LOGICAL, PARAMETER, PRIVATE :: debug_this_module = .false.
72 ! number of first derivative components (3: d/dx, d/dy, d/dz)
73 INTEGER, PARAMETER, PRIVATE :: nderivs = 3
74 INTEGER, PARAMETER, PRIVATE :: maxspins = 2
75
79
80! **************************************************************************************************
81!> \brief Ground state molecular orbitals.
82!> \par History
83!> * 06.2016 created [Sergey Chulkov]
84! **************************************************************************************************
86 !> occupied MOs stored in a matrix form [nao x nmo_occ]
87 TYPE(cp_fm_type), POINTER :: mos_occ => null()
88 !> virtual MOs stored in a matrix form [nao x nmo_virt]
89 TYPE(cp_fm_type), POINTER :: mos_virt => null()
90 !> negated occupied orbital energy matrix [nmo_occ x nmo_occ]: - mos_occ^T * KS * mos_occ .
91 !> Allocated when orbital energy correction is in use, otherwise it is just a diagonal
92 !> matrix with 'evals_occ' on its diagonal
93 TYPE(cp_fm_type), POINTER :: evals_occ_matrix => null()
94 !> (non-corrected) occupied orbital energies
95 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals_occ
96 !> (non-corrected) virtual orbital energies
97 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals_virt
98 !> phase of occupied MOs; +1.0 -- positive, -1.0 -- negative;
99 !> it is mainly needed to make the restart file transferable
100 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: phases_occ
101 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: phases_virt
102 !> number of occupied orbitals
103 INTEGER :: nmo_occ = -1
104 !> number of active occupied orbitals
105 INTEGER :: nmo_active = -1
106 !> indexing of active orbitals
107 INTEGER, ALLOCATABLE, DIMENSION(:) :: index_active
108 !> active occupied MOs stored in a matrix form [nao x nmo_active]
109 TYPE(cp_fm_type), POINTER :: mos_active => null()
111
112! **************************************************************************************************
113!> \brief Set of temporary ("work") matrices.
114!> \par History
115!> * 01.2017 created [Sergey Chulkov]
116! **************************************************************************************************
118 !
119 ! *** globally distributed dense matrices ***
120 !
121 !> pool of dense [nao x nmo_active(spin)] matrices;
122 !> used mainly to dynamically expand the list of trial vectors
123 TYPE(cp_fm_pool_p_type), ALLOCATABLE, DIMENSION(:) :: fm_pool_ao_mo_active
124 !> S * mos_occ(spin)
125 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: s_c0
126 !> S * \rho_0(spin)
127 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: s_c0_c0t
128 !
129 ! *** dense matrices distributed across parallel (sub)groups ***
130 !
131 !> evects_sub(1:nspins, 1:nstates): a copy of the last 'nstates' trial vectors distributed
132 !> across parallel (sub)groups. Here 'nstates' is the number of requested excited states which
133 !> is typically much smaller than the total number of Krylov's vectors. Allocated only if
134 !> the number of parallel groups > 1, otherwise we use the original globally distributed vectors.
135 !> evects_sub(spin, state) == null() means that the trial vector is assigned to a different (sub)group
136 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: evects_sub
137 !> action of TDDFPT operator on trial vectors distributed across parallel (sub)groups
138 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: aop_evects_sub
139 !> electron density expressed in terms of atomic orbitals using primary basis set
140 TYPE(cp_fm_type), POINTER :: rho_ao_orb_fm_sub => null()
141 !
142 ! NOTE: we do not need the next 2 matrices in case of a sparse matrix 'tddfpt_subgroup_env_type%admm_A'
143 !
144 !> electron density expressed in terms of atomic orbitals using auxiliary basis set;
145 !> can be seen as a group-specific version of the matrix 'admm_type%work_aux_aux'
146 TYPE(cp_fm_type), POINTER :: rho_ao_aux_fit_fm_sub => null()
147 !> group-specific version of the matrix 'admm_type%work_aux_orb' with shape [nao_aux x nao]
148 TYPE(cp_fm_type), POINTER :: wfm_aux_orb_sub => null()
149 !
150 ! *** sparse matrices distributed across parallel (sub)groups ***
151 !
152 !> sparse matrix with shape [nao x nao] distributed across subgroups;
153 !> Aop_evects_sub(spin,:) = A_ia_munu_sub(spin) * mos_active(spin)
154 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: a_ia_munu_sub => null()
155 !
156 ! *** structures to store electron densities distributed across parallel (sub)groups ***
157 !
158 !> electron density in terms of primary basis set
159 TYPE(qs_rho_type), POINTER :: rho_orb_struct_sub => null()
160 !> electron density for XC in GAPW_XC
161 TYPE(qs_rho_type), POINTER :: rho_xc_struct_sub => null()
162 !> electron density in terms of auxiliary basis set
163 TYPE(qs_rho_type), POINTER :: rho_aux_fit_struct_sub => null()
164 !> group-specific copy of a Coulomb/xc-potential on a real-space grid
165 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: a_ia_rspace_sub => null()
166 !> group-specific copy of a reciprocal-space grid
167 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: wpw_gspace_sub => null()
168 !> group-specific copy of a real-space grid
169 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: wpw_rspace_sub => null()
170 !> group-specific copy of a real-space grid for the kinetic energy density
171 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: wpw_tau_rspace_sub => null()
172 !
173 ! *** real space pw grid to hold fxc kernel <> A_ia_rspace_sub ***
174 !
175 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: fxc_rspace_sub => null()
176 !
177 ! *** globally distributed matrices required to compute exact exchange terms ***
178 !
179 !> globally distributed version of the matrix 'rho_ao_orb_fm_sub' to store the electron density
180 TYPE(cp_fm_type), POINTER :: hfx_fm_ao_ao => null()
181 !> sparse matrix to store the electron density in terms of auxiliary (ADMM calculation)
182 !> or primary (regular calculation) basis set
183 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: hfx_rho_ao_symm => null(), hfx_rho_ao_asymm => null()
184 !> exact exchange expressed in terms of auxiliary or primary basis set
185 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: hfx_hmat_symm => null(), hfx_hmat_asymm => null()
186 !> SR exact exchage matrices
187 TYPE(cp_fm_type), POINTER :: hfxsr_fm_ao_ao => null()
188 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: hfxsr_rho_ao_symm => null(), hfxsr_rho_ao_asymm => null()
189 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: hfxsr_hmat_symm => null(), hfxsr_hmat_asymm => null()
190 !
191 ! *** matrices required for sTDA kernel, all matrices are within subgroups
192 !
193 ! Short-range gamma exchange matrix
194 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: gamma_exchange => null()
195 !Lowdin MO coefficients: NAO*NOCC
196 TYPE(cp_fm_type), DIMENSION(:), POINTER :: ctransformed => null()
197 !S^1/2
198 TYPE(dbcsr_type), POINTER :: shalf => null()
199 !Eigenvalues/eigenvectors of the overlap matrix, used in sTDA forces (Lowdin derivatives)
200 REAL(kind=dp), DIMENSION(:), POINTER :: s_eigenvalues => null()
201 TYPE(cp_fm_type), POINTER :: s_eigenvectors => null()
202 TYPE(cp_fm_type), POINTER :: slambda => null()
203 !Ewald environments
204 TYPE(ewald_environment_type), POINTER :: ewald_env => null()
205 TYPE(ewald_pw_type), POINTER :: ewald_pw => null()
206 !> GAPW local atomic grids
207 TYPE(hartree_local_type), POINTER :: hartree_local => null()
208 TYPE(local_rho_type), POINTER :: local_rho_set => null()
209 TYPE(local_rho_type), POINTER :: local_rho_set_admm => null()
210 END TYPE tddfpt_work_matrices
211
212CONTAINS
213
214! **************************************************************************************************
215!> \brief Allocate work matrices for full kernel
216!> \param work_matrices work matrices (allocated on exit)
217!> \param gs_mos occupied and virtual molecular orbitals optimised for the ground state
218!> \param nstates number of excited states to converge
219!> \param do_hfx flag that requested to allocate work matrices required for computation
220!> of exact-exchange terms
221!> \param do_admm ...
222!> \param do_hfxlr ...
223!> \param do_exck ...
224!> \param do_sf ...
225!> \param qs_env Quickstep environment
226!> \param sub_env parallel group environment
227!> \par History
228!> * 02.2017 created [Sergey Chulkov]
229! **************************************************************************************************
230 SUBROUTINE tddfpt_create_work_matrices(work_matrices, gs_mos, nstates, do_hfx, do_admm, &
231 do_hfxlr, do_exck, do_sf, qs_env, sub_env)
232 TYPE(tddfpt_work_matrices), INTENT(out) :: work_matrices
233 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
234 INTENT(in) :: gs_mos
235 INTEGER, INTENT(in) :: nstates
236 LOGICAL, INTENT(in) :: do_hfx, do_admm, do_hfxlr, do_exck, do_sf
237 TYPE(qs_environment_type), POINTER :: qs_env
238 TYPE(tddfpt_subgroup_env_type), INTENT(in) :: sub_env
239
240 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_create_work_matrices'
241
242 INTEGER :: evecs_dim, handle, igroup, ispin, &
243 istate, nao, nao_aux, natom, ngroups, &
244 nspins
245 INTEGER, DIMENSION(maxspins) :: nactive, nmo_occ, nmo_virt
246 TYPE(admm_type), POINTER :: admm_env
247 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
248 TYPE(cp_blacs_env_type), POINTER :: blacs_env
249 TYPE(cp_fm_struct_p_type), DIMENSION(maxspins) :: fm_struct_evects
250 TYPE(cp_fm_struct_type), POINTER :: fm_struct
251 TYPE(dbcsr_distribution_type), POINTER :: dbcsr_dist
252 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, matrix_s_aux_fit, rho_ia_ao, &
253 rho_xc_ao
254 TYPE(dbcsr_type), POINTER :: dbcsr_template_hfx
255 TYPE(dft_control_type), POINTER :: dft_control
256 TYPE(mp_para_env_type), POINTER :: para_env
257 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
258 POINTER :: sab_hfx
259 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
260 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
261
262 CALL timeset(routinen, handle)
263
264 ! sTDA
265 NULLIFY (work_matrices%shalf)
266 NULLIFY (work_matrices%ewald_env)
267 NULLIFY (work_matrices%ewald_pw)
268 NULLIFY (work_matrices%gamma_exchange)
269 NULLIFY (work_matrices%ctransformed)
270 NULLIFY (work_matrices%S_eigenvalues)
271 NULLIFY (work_matrices%S_eigenvectors)
272 NULLIFY (work_matrices%slambda)
273
274 ! GAPW
275 NULLIFY (work_matrices%hartree_local)
276 NULLIFY (work_matrices%local_rho_set)
277 NULLIFY (work_matrices%local_rho_set_admm)
278
279 ! EXCK
280 NULLIFY (work_matrices%rho_xc_struct_sub)
281
282 nspins = SIZE(gs_mos)
283 IF (do_sf) THEN
284 evecs_dim = 1
285 ELSE
286 evecs_dim = nspins
287 END IF
288 CALL get_qs_env(qs_env, blacs_env=blacs_env, matrix_s=matrix_s)
289 CALL dbcsr_get_info(matrix_s(1)%matrix, nfullrows_total=nao)
290
291 DO ispin = 1, nspins
292 nactive(ispin) = gs_mos(ispin)%nmo_active
293 nmo_occ(ispin) = gs_mos(ispin)%nmo_occ
294 nmo_virt(ispin) = SIZE(gs_mos(ispin)%evals_virt)
295 END DO
296
297 IF (do_admm) THEN
298 cpassert(do_hfx)
299 cpassert(ASSOCIATED(sub_env%admm_A))
300 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
301 CALL dbcsr_get_info(matrix_s_aux_fit(1)%matrix, nfullrows_total=nao_aux)
302 END IF
303
304 NULLIFY (fm_struct)
305 ALLOCATE (work_matrices%fm_pool_ao_mo_active(nspins))
306 DO ispin = 1, nspins
307 NULLIFY (work_matrices%fm_pool_ao_mo_active(ispin)%pool)
308 CALL cp_fm_struct_create(fm_struct, template_fmstruct=gs_mos(ispin)%mos_active%matrix_struct, context=blacs_env)
309 CALL fm_pool_create(work_matrices%fm_pool_ao_mo_active(ispin)%pool, fm_struct)
310 CALL cp_fm_struct_release(fm_struct)
311 END DO
312
313 ALLOCATE (work_matrices%S_C0_C0T(nspins))
314 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=blacs_env)
315 DO ispin = 1, nspins
316 CALL cp_fm_create(work_matrices%S_C0_C0T(ispin), fm_struct)
317 END DO
318 CALL cp_fm_struct_release(fm_struct)
319
320 ALLOCATE (work_matrices%S_C0(nspins))
321 DO ispin = 1, nspins
322 CALL cp_fm_struct_create(fm_struct, template_fmstruct=gs_mos(ispin)%mos_occ%matrix_struct, context=blacs_env)
323 CALL cp_fm_create(work_matrices%S_C0(ispin), fm_struct)
324 CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, gs_mos(ispin)%mos_occ, work_matrices%S_C0(ispin), &
325 ncol=nmo_occ(ispin), alpha=1.0_dp, beta=0.0_dp)
326 CALL parallel_gemm('N', 'T', nao, nao, nmo_occ(ispin), 1.0_dp, work_matrices%S_C0(ispin), &
327 gs_mos(ispin)%mos_occ, 0.0_dp, work_matrices%S_C0_C0T(ispin))
328 CALL cp_fm_struct_release(fm_struct)
329 END DO
330
331 IF (sub_env%is_split) THEN
332 DO ispin = 1, evecs_dim
333 CALL cp_fm_struct_create(fm_struct_evects(ispin)%struct, template_fmstruct=gs_mos(ispin)%mos_active%matrix_struct, &
334 context=sub_env%blacs_env)
335 END DO
336
337 ALLOCATE (work_matrices%evects_sub(evecs_dim, nstates), work_matrices%Aop_evects_sub(evecs_dim, nstates))
338
339 CALL blacs_env%get(para_env=para_env)
340 igroup = sub_env%group_distribution(para_env%mepos)
341 ngroups = sub_env%ngroups
342
343 DO istate = ngroups - igroup, nstates, ngroups
344 DO ispin = 1, evecs_dim
345 CALL cp_fm_create(work_matrices%evects_sub(ispin, istate), fm_struct_evects(ispin)%struct)
346 CALL cp_fm_create(work_matrices%Aop_evects_sub(ispin, istate), fm_struct_evects(ispin)%struct)
347 END DO
348 END DO
349
350 DO ispin = evecs_dim, 1, -1
351 CALL cp_fm_struct_release(fm_struct_evects(ispin)%struct)
352 END DO
353 END IF
354
355 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=sub_env%blacs_env)
356 ALLOCATE (work_matrices%rho_ao_orb_fm_sub)
357 CALL cp_fm_create(work_matrices%rho_ao_orb_fm_sub, fm_struct)
358 CALL cp_fm_struct_release(fm_struct)
359
360 NULLIFY (work_matrices%rho_ao_aux_fit_fm_sub, work_matrices%wfm_aux_orb_sub)
361 IF (do_admm) THEN
362 CALL cp_fm_struct_create(fm_struct, nrow_global=nao_aux, ncol_global=nao_aux, context=sub_env%blacs_env)
363 ALLOCATE (work_matrices%rho_ao_aux_fit_fm_sub)
364 CALL cp_fm_create(work_matrices%rho_ao_aux_fit_fm_sub, fm_struct)
365 CALL cp_fm_struct_release(fm_struct)
366
367 CALL cp_fm_struct_create(fm_struct, nrow_global=nao_aux, ncol_global=nao, context=sub_env%blacs_env)
368 ALLOCATE (work_matrices%wfm_aux_orb_sub)
369 CALL cp_fm_create(work_matrices%wfm_aux_orb_sub, fm_struct)
370 CALL cp_fm_struct_release(fm_struct)
371 END IF
372
373 ! group-specific dbcsr matrices
374 NULLIFY (work_matrices%A_ia_munu_sub)
375 CALL dbcsr_allocate_matrix_set(work_matrices%A_ia_munu_sub, evecs_dim)
376 DO ispin = 1, evecs_dim
377 CALL dbcsr_init_p(work_matrices%A_ia_munu_sub(ispin)%matrix)
378 CALL tddfpt_dbcsr_create_by_dist(work_matrices%A_ia_munu_sub(ispin)%matrix, template=matrix_s(1)%matrix, &
379 dbcsr_dist=sub_env%dbcsr_dist, sab=sub_env%sab_orb)
380 END DO
381
382 ! group-specific response density
383 NULLIFY (rho_ia_ao)
384 CALL dbcsr_allocate_matrix_set(rho_ia_ao, nspins)
385 DO ispin = 1, nspins
386 CALL dbcsr_init_p(rho_ia_ao(ispin)%matrix)
387 CALL tddfpt_dbcsr_create_by_dist(rho_ia_ao(ispin)%matrix, template=matrix_s(1)%matrix, &
388 dbcsr_dist=sub_env%dbcsr_dist, sab=sub_env%sab_orb)
389 END DO
390
391 NULLIFY (work_matrices%rho_orb_struct_sub)
392 ALLOCATE (work_matrices%rho_orb_struct_sub)
393 CALL qs_rho_create(work_matrices%rho_orb_struct_sub)
394 CALL qs_rho_set(work_matrices%rho_orb_struct_sub, rho_ao=rho_ia_ao)
395 CALL qs_rho_rebuild(work_matrices%rho_orb_struct_sub, qs_env, rebuild_ao=.false., &
396 rebuild_grids=.true., pw_env_external=sub_env%pw_env)
397 CALL get_qs_env(qs_env, dft_control=dft_control)
398 IF (dft_control%qs_control%gapw_xc) THEN
399 NULLIFY (rho_xc_ao)
400 CALL dbcsr_allocate_matrix_set(rho_xc_ao, nspins)
401 DO ispin = 1, nspins
402 CALL dbcsr_init_p(rho_xc_ao(ispin)%matrix)
403 CALL tddfpt_dbcsr_create_by_dist(rho_xc_ao(ispin)%matrix, template=matrix_s(1)%matrix, &
404 dbcsr_dist=sub_env%dbcsr_dist, sab=sub_env%sab_orb)
405 END DO
406 NULLIFY (work_matrices%rho_xc_struct_sub)
407 ALLOCATE (work_matrices%rho_xc_struct_sub)
408 CALL qs_rho_create(work_matrices%rho_xc_struct_sub)
409 CALL qs_rho_set(work_matrices%rho_xc_struct_sub, rho_ao=rho_xc_ao)
410 CALL qs_rho_rebuild(work_matrices%rho_xc_struct_sub, qs_env, rebuild_ao=.false., &
411 rebuild_grids=.true., pw_env_external=sub_env%pw_env)
412 END IF
413
414 NULLIFY (work_matrices%rho_aux_fit_struct_sub)
415 IF (do_admm) THEN
416 NULLIFY (rho_ia_ao)
417 CALL dbcsr_allocate_matrix_set(rho_ia_ao, nspins)
418 DO ispin = 1, nspins
419 CALL dbcsr_init_p(rho_ia_ao(ispin)%matrix)
420 CALL tddfpt_dbcsr_create_by_dist(rho_ia_ao(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix, &
421 dbcsr_dist=sub_env%dbcsr_dist, sab=sub_env%sab_aux_fit)
422 END DO
423
424 ALLOCATE (work_matrices%rho_aux_fit_struct_sub)
425 CALL qs_rho_create(work_matrices%rho_aux_fit_struct_sub)
426 CALL qs_rho_set(work_matrices%rho_aux_fit_struct_sub, rho_ao=rho_ia_ao)
427 CALL qs_rho_rebuild(work_matrices%rho_aux_fit_struct_sub, qs_env, rebuild_ao=.false., &
428 rebuild_grids=.true., pw_env_external=sub_env%pw_env)
429 END IF
430
431 ! work plain-wave grids
432 CALL pw_env_get(sub_env%pw_env, auxbas_pw_pool=auxbas_pw_pool)
433 ALLOCATE (work_matrices%A_ia_rspace_sub(nspins))
434 ALLOCATE (work_matrices%wpw_gspace_sub(nspins), work_matrices%wpw_rspace_sub(nspins), &
435 work_matrices%wpw_tau_rspace_sub(nspins))
436 DO ispin = 1, nspins
437 CALL auxbas_pw_pool%create_pw(work_matrices%A_ia_rspace_sub(ispin))
438 CALL auxbas_pw_pool%create_pw(work_matrices%wpw_gspace_sub(ispin))
439 CALL auxbas_pw_pool%create_pw(work_matrices%wpw_rspace_sub(ispin))
440 CALL auxbas_pw_pool%create_pw(work_matrices%wpw_tau_rspace_sub(ispin))
441 END DO
442
443 ! fxc kernel potential real space grid
444 IF (do_exck) THEN
445 ! we need spins: aa, ab, bb
446 ALLOCATE (work_matrices%fxc_rspace_sub(3))
447 DO ispin = 1, 3
448 CALL auxbas_pw_pool%create_pw(work_matrices%fxc_rspace_sub(ispin))
449 END DO
450 ELSE
451 NULLIFY (work_matrices%fxc_rspace_sub)
452 END IF
453
454 ! GAPW initializations
455 IF (dft_control%qs_control%gapw) THEN
456 CALL get_qs_env(qs_env, &
457 atomic_kind_set=atomic_kind_set, &
458 natom=natom, &
459 qs_kind_set=qs_kind_set)
460 CALL local_rho_set_create(work_matrices%local_rho_set)
461 CALL allocate_rho_atom_internals(work_matrices%local_rho_set%rho_atom_set, atomic_kind_set, &
462 qs_kind_set, dft_control, sub_env%para_env)
463 CALL init_rho0(work_matrices%local_rho_set, qs_env, dft_control%qs_control%gapw_control, &
464 zcore=0.0_dp)
465 CALL rho0_s_grid_create(sub_env%pw_env, work_matrices%local_rho_set%rho0_mpole)
466 CALL hartree_local_create(work_matrices%hartree_local)
467 CALL init_coulomb_local(work_matrices%hartree_local, natom)
468 ELSEIF (dft_control%qs_control%gapw_xc) THEN
469 CALL get_qs_env(qs_env, &
470 atomic_kind_set=atomic_kind_set, &
471 qs_kind_set=qs_kind_set)
472 CALL local_rho_set_create(work_matrices%local_rho_set)
473 CALL allocate_rho_atom_internals(work_matrices%local_rho_set%rho_atom_set, atomic_kind_set, &
474 qs_kind_set, dft_control, sub_env%para_env)
475 END IF
476
477 ! HFX-related globally distributed matrices
478 NULLIFY (work_matrices%hfx_fm_ao_ao, work_matrices%hfx_rho_ao_symm, work_matrices%hfx_hmat_symm, &
479 work_matrices%hfx_rho_ao_asymm, work_matrices%hfx_hmat_asymm)
480 IF (do_hfx) THEN
481 IF (do_admm) THEN
482 CALL get_qs_env(qs_env, dbcsr_dist=dbcsr_dist)
483 CALL get_admm_env(qs_env%admm_env, sab_aux_fit=sab_hfx)
484 dbcsr_template_hfx => matrix_s_aux_fit(1)%matrix
485 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc) THEN
486 CALL get_qs_env(qs_env, admm_env=admm_env, atomic_kind_set=atomic_kind_set)
487 CALL local_rho_set_create(work_matrices%local_rho_set_admm)
488 CALL allocate_rho_atom_internals(work_matrices%local_rho_set_admm%rho_atom_set, &
489 atomic_kind_set, admm_env%admm_gapw_env%admm_kind_set, &
490 dft_control, sub_env%para_env)
491 END IF
492 ELSE
493 CALL get_qs_env(qs_env, dbcsr_dist=dbcsr_dist, sab_orb=sab_hfx)
494 dbcsr_template_hfx => matrix_s(1)%matrix
495 END IF
496
497 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=blacs_env)
498 ALLOCATE (work_matrices%hfx_fm_ao_ao)
499 CALL cp_fm_create(work_matrices%hfx_fm_ao_ao, fm_struct)
500 CALL cp_fm_struct_release(fm_struct)
501
502 CALL dbcsr_allocate_matrix_set(work_matrices%hfx_rho_ao_symm, nspins)
503 CALL dbcsr_allocate_matrix_set(work_matrices%hfx_rho_ao_asymm, nspins)
504 DO ispin = 1, nspins
505 CALL dbcsr_init_p(work_matrices%hfx_rho_ao_symm(ispin)%matrix)
506 CALL tddfpt_dbcsr_create_by_dist(work_matrices%hfx_rho_ao_symm(ispin)%matrix, &
507 template=dbcsr_template_hfx, dbcsr_dist=dbcsr_dist, sab=sab_hfx)
508
509 CALL dbcsr_init_p(work_matrices%hfx_rho_ao_asymm(ispin)%matrix)
510 CALL dbcsr_create(work_matrices%hfx_rho_ao_asymm(ispin)%matrix, matrix_type=dbcsr_type_antisymmetric, &
511 template=work_matrices%hfx_rho_ao_symm(ispin)%matrix)
512 CALL dbcsr_complete_redistribute(work_matrices%hfx_rho_ao_symm(ispin)%matrix, &
513 work_matrices%hfx_rho_ao_asymm(ispin)%matrix)
514 END DO
515
516 CALL dbcsr_allocate_matrix_set(work_matrices%hfx_hmat_symm, nspins)
517 CALL dbcsr_allocate_matrix_set(work_matrices%hfx_hmat_asymm, nspins)
518 DO ispin = 1, nspins
519 CALL dbcsr_init_p(work_matrices%hfx_hmat_symm(ispin)%matrix)
520 CALL tddfpt_dbcsr_create_by_dist(work_matrices%hfx_hmat_symm(ispin)%matrix, &
521 template=dbcsr_template_hfx, dbcsr_dist=dbcsr_dist, sab=sab_hfx)
522
523 CALL dbcsr_init_p(work_matrices%hfx_hmat_asymm(ispin)%matrix)
524 CALL dbcsr_create(work_matrices%hfx_hmat_asymm(ispin)%matrix, matrix_type=dbcsr_type_antisymmetric, &
525 template=work_matrices%hfx_hmat_symm(ispin)%matrix)
526 CALL dbcsr_complete_redistribute(work_matrices%hfx_hmat_symm(ispin)%matrix, &
527 work_matrices%hfx_hmat_asymm(ispin)%matrix)
528 END DO
529 END IF
530
531 ! matrices needed to do HFX short range calllculations
532 NULLIFY (work_matrices%hfxsr_fm_ao_ao, work_matrices%hfxsr_rho_ao_symm, work_matrices%hfxsr_hmat_symm, &
533 work_matrices%hfxsr_rho_ao_asymm, work_matrices%hfxsr_hmat_asymm)
534 ! matrices needed to do HFX long range calllculations
535 IF (do_hfxlr) THEN
536 DO ispin = 1, nspins
537 CALL cp_fm_struct_create(fm_struct_evects(ispin)%struct, template_fmstruct=gs_mos(ispin)%mos_active%matrix_struct, &
538 context=sub_env%blacs_env)
539 END DO
540 CALL dbcsr_init_p(work_matrices%shalf)
541 CALL dbcsr_create(work_matrices%shalf, template=matrix_s(1)%matrix)
542 ALLOCATE (work_matrices%ctransformed(nspins))
543 DO ispin = 1, nspins
544 CALL cp_fm_create(work_matrices%ctransformed(ispin), fm_struct_evects(ispin)%struct)
545 END DO
546 ! forces
547 ALLOCATE (work_matrices%S_eigenvalues(nao))
548 NULLIFY (fm_struct)
549 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=blacs_env)
550 ALLOCATE (work_matrices%S_eigenvectors, work_matrices%slambda)
551 CALL cp_fm_create(work_matrices%S_eigenvectors, fm_struct)
552 CALL cp_fm_create(work_matrices%slambda, fm_struct)
553 !
554 CALL cp_fm_struct_release(fm_struct)
555 DO ispin = 1, nspins
556 CALL cp_fm_struct_release(fm_struct_evects(ispin)%struct)
557 END DO
558 END IF
559
560 CALL timestop(handle)
561
562 END SUBROUTINE tddfpt_create_work_matrices
563
564! **************************************************************************************************
565!> \brief Allocate work matrices for hfxsr
566!> \param work_matrices work matrices (allocated on exit)
567!> \param qs_env ...
568!> \param admm_env ...
569! **************************************************************************************************
570 SUBROUTINE hfxsr_create_work_matrices(work_matrices, qs_env, admm_env)
571 TYPE(tddfpt_work_matrices), INTENT(inout) :: work_matrices
572 TYPE(qs_environment_type), POINTER :: qs_env
573 TYPE(admm_type), POINTER :: admm_env
574
575 CHARACTER(LEN=*), PARAMETER :: routinen = 'hfxsr_create_work_matrices'
576
577 INTEGER :: handle, ispin, nao, nao_aux, nspins
578 TYPE(cp_blacs_env_type), POINTER :: blacs_env
579 TYPE(cp_fm_struct_type), POINTER :: fm_struct
580 TYPE(dbcsr_distribution_type), POINTER :: dbcsr_dist
581 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, matrix_s_aux_fit
582 TYPE(dbcsr_type), POINTER :: dbcsr_template_hfx
583 TYPE(dft_control_type), POINTER :: dft_control
584 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
585 POINTER :: sab_hfx
586
587 CALL timeset(routinen, handle)
588
589 ! matrices needed to do HFX short range calllculations
590 NULLIFY (work_matrices%hfxsr_fm_ao_ao, work_matrices%hfxsr_rho_ao_symm, work_matrices%hfxsr_hmat_symm, &
591 work_matrices%hfxsr_rho_ao_asymm, work_matrices%hfxsr_hmat_asymm)
592
593 CALL get_qs_env(qs_env, dft_control=dft_control, matrix_s=matrix_s, &
594 blacs_env=blacs_env, dbcsr_dist=dbcsr_dist)
595 nspins = dft_control%nspins
596 CALL dbcsr_get_info(matrix_s(1)%matrix, nfullrows_total=nao)
597 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
598 dbcsr_template_hfx => matrix_s_aux_fit(1)%matrix
599 CALL dbcsr_get_info(dbcsr_template_hfx, nfullrows_total=nao_aux)
600
601 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=blacs_env)
602 ALLOCATE (work_matrices%hfxsr_fm_ao_ao)
603 CALL cp_fm_create(work_matrices%hfxsr_fm_ao_ao, fm_struct)
604 CALL cp_fm_struct_release(fm_struct)
605
606 CALL get_admm_env(admm_env, sab_aux_fit=sab_hfx)
607 CALL dbcsr_allocate_matrix_set(work_matrices%hfxsr_rho_ao_symm, nspins)
608 CALL dbcsr_allocate_matrix_set(work_matrices%hfxsr_rho_ao_asymm, nspins)
609 DO ispin = 1, nspins
610 CALL dbcsr_init_p(work_matrices%hfxsr_rho_ao_symm(ispin)%matrix)
611 CALL tddfpt_dbcsr_create_by_dist(work_matrices%hfxsr_rho_ao_symm(ispin)%matrix, &
612 template=dbcsr_template_hfx, dbcsr_dist=dbcsr_dist, sab=sab_hfx)
613
614 CALL dbcsr_init_p(work_matrices%hfxsr_rho_ao_asymm(ispin)%matrix)
615 CALL dbcsr_create(work_matrices%hfxsr_rho_ao_asymm(ispin)%matrix, matrix_type=dbcsr_type_antisymmetric, &
616 template=work_matrices%hfxsr_rho_ao_symm(ispin)%matrix)
617 CALL dbcsr_complete_redistribute(work_matrices%hfxsr_rho_ao_symm(ispin)%matrix, &
618 work_matrices%hfxsr_rho_ao_asymm(ispin)%matrix)
619 END DO
620
621 CALL dbcsr_allocate_matrix_set(work_matrices%hfxsr_hmat_symm, nspins)
622 CALL dbcsr_allocate_matrix_set(work_matrices%hfxsr_hmat_asymm, nspins)
623 DO ispin = 1, nspins
624 CALL dbcsr_init_p(work_matrices%hfxsr_hmat_symm(ispin)%matrix)
625 CALL tddfpt_dbcsr_create_by_dist(work_matrices%hfxsr_hmat_symm(ispin)%matrix, &
626 template=dbcsr_template_hfx, dbcsr_dist=dbcsr_dist, sab=sab_hfx)
627
628 CALL dbcsr_init_p(work_matrices%hfxsr_hmat_asymm(ispin)%matrix)
629 CALL dbcsr_create(work_matrices%hfxsr_hmat_asymm(ispin)%matrix, matrix_type=dbcsr_type_antisymmetric, &
630 template=work_matrices%hfxsr_hmat_symm(ispin)%matrix)
631 CALL dbcsr_complete_redistribute(work_matrices%hfxsr_hmat_symm(ispin)%matrix, &
632 work_matrices%hfxsr_hmat_asymm(ispin)%matrix)
633 END DO
634
635 CALL timestop(handle)
636
637 END SUBROUTINE hfxsr_create_work_matrices
638
639! **************************************************************************************************
640!> \brief Allocate work matrices for sTDA kernel
641!> \param work_matrices work matrices (allocated on exit)
642!> \param gs_mos occupied and virtual molecular orbitals optimised for the ground state
643!> \param nstates number of excited states to converge
644!> \param qs_env Quickstep environment
645!> \param sub_env parallel group environment
646!> \par History
647!> * 04.2019 created from full kernel version [JHU]
648! **************************************************************************************************
649 SUBROUTINE stda_create_work_matrices(work_matrices, gs_mos, nstates, qs_env, sub_env)
650 TYPE(tddfpt_work_matrices), INTENT(out) :: work_matrices
651 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
652 INTENT(in) :: gs_mos
653 INTEGER, INTENT(in) :: nstates
654 TYPE(qs_environment_type), POINTER :: qs_env
655 TYPE(tddfpt_subgroup_env_type), INTENT(in) :: sub_env
656
657 CHARACTER(LEN=*), PARAMETER :: routinen = 'stda_create_work_matrices'
658
659 INTEGER :: handle, igroup, ispin, istate, nao, &
660 ngroups, nspins
661 INTEGER, DIMENSION(maxspins) :: nactive, nmo_occ, nmo_virt
662 TYPE(cp_blacs_env_type), POINTER :: blacs_env
663 TYPE(cp_fm_struct_p_type), DIMENSION(maxspins) :: fm_struct_evects
664 TYPE(cp_fm_struct_type), POINTER :: fm_struct
665 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
666 TYPE(mp_para_env_type), POINTER :: para_env
667
668 CALL timeset(routinen, handle)
669
670 NULLIFY (work_matrices%gamma_exchange, work_matrices%ctransformed)
671
672 nspins = SIZE(gs_mos)
673 CALL get_qs_env(qs_env, blacs_env=blacs_env, matrix_s=matrix_s)
674 CALL dbcsr_get_info(matrix_s(1)%matrix, nfullrows_total=nao)
675
676 DO ispin = 1, nspins
677 nactive(ispin) = gs_mos(ispin)%nmo_active
678 nmo_occ(ispin) = gs_mos(ispin)%nmo_occ
679 nmo_virt(ispin) = SIZE(gs_mos(ispin)%evals_virt)
680 END DO
681
682 NULLIFY (fm_struct)
683 ALLOCATE (work_matrices%fm_pool_ao_mo_active(nspins))
684 DO ispin = 1, nspins
685 NULLIFY (work_matrices%fm_pool_ao_mo_active(ispin)%pool)
686 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nactive(ispin), context=blacs_env)
687 CALL fm_pool_create(work_matrices%fm_pool_ao_mo_active(ispin)%pool, fm_struct)
688 CALL cp_fm_struct_release(fm_struct)
689 END DO
690
691 ALLOCATE (work_matrices%S_C0_C0T(nspins))
692 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=blacs_env)
693 DO ispin = 1, nspins
694 CALL cp_fm_create(work_matrices%S_C0_C0T(ispin), fm_struct)
695 END DO
696 CALL cp_fm_struct_release(fm_struct)
697
698 ALLOCATE (work_matrices%S_C0(nspins))
699 DO ispin = 1, nspins
700 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nmo_occ(ispin), context=blacs_env)
701 CALL cp_fm_create(work_matrices%S_C0(ispin), fm_struct)
702 CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, gs_mos(ispin)%mos_occ, work_matrices%S_C0(ispin), &
703 ncol=nmo_occ(ispin), alpha=1.0_dp, beta=0.0_dp)
704 CALL parallel_gemm('N', 'T', nao, nao, nmo_occ(ispin), 1.0_dp, work_matrices%S_C0(ispin), &
705 gs_mos(ispin)%mos_occ, 0.0_dp, work_matrices%S_C0_C0T(ispin))
706 CALL cp_fm_struct_release(fm_struct)
707 END DO
708
709 DO ispin = 1, nspins
710 CALL cp_fm_struct_create(fm_struct_evects(ispin)%struct, nrow_global=nao, &
711 ncol_global=nactive(ispin), context=sub_env%blacs_env)
712 END DO
713
714 IF (sub_env%is_split) THEN
715 ALLOCATE (work_matrices%evects_sub(nspins, nstates), work_matrices%Aop_evects_sub(nspins, nstates))
716
717 CALL blacs_env%get(para_env=para_env)
718 igroup = sub_env%group_distribution(para_env%mepos)
719 ngroups = sub_env%ngroups
720
721 DO istate = ngroups - igroup, nstates, ngroups
722 DO ispin = 1, nspins
723 CALL cp_fm_create(work_matrices%evects_sub(ispin, istate), fm_struct_evects(ispin)%struct)
724 CALL cp_fm_create(work_matrices%Aop_evects_sub(ispin, istate), fm_struct_evects(ispin)%struct)
725 END DO
726 END DO
727 END IF
728
729 ! sTDA specific work arrays
730 ALLOCATE (work_matrices%ctransformed(nspins))
731 DO ispin = 1, nspins
732 CALL cp_fm_create(work_matrices%ctransformed(ispin), fm_struct_evects(ispin)%struct)
733 END DO
734 NULLIFY (work_matrices%shalf)
735 CALL dbcsr_init_p(work_matrices%shalf)
736 CALL dbcsr_create(work_matrices%shalf, template=matrix_s(1)%matrix)
737 ! forces
738 ALLOCATE (work_matrices%S_eigenvalues(nao))
739 NULLIFY (fm_struct)
740 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nao, context=blacs_env)
741 ALLOCATE (work_matrices%S_eigenvectors, work_matrices%slambda)
742 CALL cp_fm_create(work_matrices%S_eigenvectors, fm_struct)
743 CALL cp_fm_create(work_matrices%slambda, fm_struct)
744 CALL cp_fm_struct_release(fm_struct)
745
746 DO ispin = nspins, 1, -1
747 CALL cp_fm_struct_release(fm_struct_evects(ispin)%struct)
748 END DO
749
750 NULLIFY (work_matrices%rho_ao_orb_fm_sub)
751 NULLIFY (work_matrices%rho_ao_aux_fit_fm_sub, work_matrices%wfm_aux_orb_sub)
752 NULLIFY (work_matrices%rho_aux_fit_struct_sub)
753 NULLIFY (work_matrices%rho_orb_struct_sub)
754 NULLIFY (work_matrices%hfx_fm_ao_ao, work_matrices%hfx_rho_ao_symm, work_matrices%hfx_hmat_symm, &
755 work_matrices%hfx_rho_ao_asymm, work_matrices%hfx_hmat_asymm)
756 NULLIFY (work_matrices%hfxsr_fm_ao_ao, work_matrices%hfxsr_rho_ao_symm, work_matrices%hfxsr_hmat_symm, &
757 work_matrices%hfxsr_rho_ao_asymm, work_matrices%hfxsr_hmat_asymm)
758 NULLIFY (work_matrices%A_ia_rspace_sub, work_matrices%wpw_gspace_sub, &
759 work_matrices%wpw_rspace_sub)
760 NULLIFY (work_matrices%fxc_rspace_sub)
761 NULLIFY (work_matrices%A_ia_munu_sub)
762
763 NULLIFY (work_matrices%ewald_env)
764 NULLIFY (work_matrices%ewald_pw)
765
766 NULLIFY (work_matrices%hartree_local)
767 NULLIFY (work_matrices%local_rho_set)
768 NULLIFY (work_matrices%local_rho_set_admm)
769 NULLIFY (work_matrices%rho_xc_struct_sub)
770
771 CALL timestop(handle)
772
773 END SUBROUTINE stda_create_work_matrices
774
775! **************************************************************************************************
776!> \brief Release work matrices.
777!> \param work_matrices work matrices (destroyed on exit)
778!> \param sub_env parallel group environment
779!> \par History
780!> * 02.2017 created [Sergey Chulkov]
781! **************************************************************************************************
782 SUBROUTINE tddfpt_release_work_matrices(work_matrices, sub_env)
783 TYPE(tddfpt_work_matrices), INTENT(inout) :: work_matrices
784 TYPE(tddfpt_subgroup_env_type), INTENT(in) :: sub_env
785
786 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_release_work_matrices'
787
788 INTEGER :: handle, ispin
789 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
790
791 CALL timeset(routinen, handle)
792
793 ! HFX-related matrices
794 IF (ASSOCIATED(work_matrices%hfx_hmat_symm)) THEN
795 DO ispin = SIZE(work_matrices%hfx_hmat_symm), 1, -1
796 CALL dbcsr_deallocate_matrix(work_matrices%hfx_hmat_symm(ispin)%matrix)
797 END DO
798 DEALLOCATE (work_matrices%hfx_hmat_symm)
799 END IF
800
801 IF (ASSOCIATED(work_matrices%hfx_hmat_asymm)) THEN
802 DO ispin = SIZE(work_matrices%hfx_hmat_asymm), 1, -1
803 CALL dbcsr_deallocate_matrix(work_matrices%hfx_hmat_asymm(ispin)%matrix)
804 END DO
805 DEALLOCATE (work_matrices%hfx_hmat_asymm)
806 END IF
807
808 IF (ASSOCIATED(work_matrices%hfx_rho_ao_symm)) THEN
809 DO ispin = SIZE(work_matrices%hfx_rho_ao_symm), 1, -1
810 CALL dbcsr_deallocate_matrix(work_matrices%hfx_rho_ao_symm(ispin)%matrix)
811 END DO
812 DEALLOCATE (work_matrices%hfx_rho_ao_symm)
813 END IF
814
815 IF (ASSOCIATED(work_matrices%hfx_rho_ao_asymm)) THEN
816 DO ispin = SIZE(work_matrices%hfx_rho_ao_asymm), 1, -1
817 CALL dbcsr_deallocate_matrix(work_matrices%hfx_rho_ao_asymm(ispin)%matrix)
818 END DO
819 DEALLOCATE (work_matrices%hfx_rho_ao_asymm)
820 END IF
821
822 IF (ASSOCIATED(work_matrices%hfx_fm_ao_ao)) THEN
823 CALL cp_fm_release(work_matrices%hfx_fm_ao_ao)
824 DEALLOCATE (work_matrices%hfx_fm_ao_ao)
825 END IF
826
827 ! HFXSR-related matrices
828 IF (ASSOCIATED(work_matrices%hfxsr_hmat_symm)) THEN
829 DO ispin = SIZE(work_matrices%hfxsr_hmat_symm), 1, -1
830 CALL dbcsr_deallocate_matrix(work_matrices%hfxsr_hmat_symm(ispin)%matrix)
831 END DO
832 DEALLOCATE (work_matrices%hfxsr_hmat_symm)
833 END IF
834
835 IF (ASSOCIATED(work_matrices%hfxsr_hmat_asymm)) THEN
836 DO ispin = SIZE(work_matrices%hfxsr_hmat_asymm), 1, -1
837 CALL dbcsr_deallocate_matrix(work_matrices%hfxsr_hmat_asymm(ispin)%matrix)
838 END DO
839 DEALLOCATE (work_matrices%hfxsr_hmat_asymm)
840 END IF
841
842 IF (ASSOCIATED(work_matrices%hfxsr_rho_ao_symm)) THEN
843 DO ispin = SIZE(work_matrices%hfxsr_rho_ao_symm), 1, -1
844 CALL dbcsr_deallocate_matrix(work_matrices%hfxsr_rho_ao_symm(ispin)%matrix)
845 END DO
846 DEALLOCATE (work_matrices%hfxsr_rho_ao_symm)
847 END IF
848
849 IF (ASSOCIATED(work_matrices%hfxsr_rho_ao_asymm)) THEN
850 DO ispin = SIZE(work_matrices%hfxsr_rho_ao_asymm), 1, -1
851 CALL dbcsr_deallocate_matrix(work_matrices%hfxsr_rho_ao_asymm(ispin)%matrix)
852 END DO
853 DEALLOCATE (work_matrices%hfxsr_rho_ao_asymm)
854 END IF
855
856 IF (ASSOCIATED(work_matrices%hfxsr_fm_ao_ao)) THEN
857 CALL cp_fm_release(work_matrices%hfxsr_fm_ao_ao)
858 DEALLOCATE (work_matrices%hfxsr_fm_ao_ao)
859 END IF
860
861 ! real-space and reciprocal-space grids
862 IF (ASSOCIATED(sub_env%pw_env)) THEN
863 CALL pw_env_get(sub_env%pw_env, auxbas_pw_pool=auxbas_pw_pool)
864 DO ispin = SIZE(work_matrices%wpw_rspace_sub), 1, -1
865 CALL auxbas_pw_pool%give_back_pw(work_matrices%wpw_rspace_sub(ispin))
866 CALL auxbas_pw_pool%give_back_pw(work_matrices%wpw_tau_rspace_sub(ispin))
867 CALL auxbas_pw_pool%give_back_pw(work_matrices%wpw_gspace_sub(ispin))
868 CALL auxbas_pw_pool%give_back_pw(work_matrices%A_ia_rspace_sub(ispin))
869 END DO
870 DEALLOCATE (work_matrices%A_ia_rspace_sub, work_matrices%wpw_gspace_sub, &
871 work_matrices%wpw_rspace_sub, work_matrices%wpw_tau_rspace_sub)
872 IF (ASSOCIATED(work_matrices%fxc_rspace_sub)) THEN
873 DO ispin = SIZE(work_matrices%fxc_rspace_sub), 1, -1
874 CALL auxbas_pw_pool%give_back_pw(work_matrices%fxc_rspace_sub(ispin))
875 END DO
876 DEALLOCATE (work_matrices%fxc_rspace_sub)
877 END IF
878 END IF
879
880 IF (ASSOCIATED(work_matrices%rho_aux_fit_struct_sub)) THEN
881 CALL qs_rho_release(work_matrices%rho_aux_fit_struct_sub)
882 DEALLOCATE (work_matrices%rho_aux_fit_struct_sub)
883 END IF
884 IF (ASSOCIATED(work_matrices%rho_orb_struct_sub)) THEN
885 CALL qs_rho_release(work_matrices%rho_orb_struct_sub)
886 DEALLOCATE (work_matrices%rho_orb_struct_sub)
887 END IF
888
889 IF (ASSOCIATED(work_matrices%A_ia_munu_sub)) THEN
890 DO ispin = SIZE(work_matrices%A_ia_munu_sub), 1, -1
891 CALL dbcsr_deallocate_matrix(work_matrices%A_ia_munu_sub(ispin)%matrix)
892 END DO
893 DEALLOCATE (work_matrices%A_ia_munu_sub)
894 END IF
895
896 IF (ASSOCIATED(work_matrices%wfm_aux_orb_sub)) THEN
897 CALL cp_fm_release(work_matrices%wfm_aux_orb_sub)
898 DEALLOCATE (work_matrices%wfm_aux_orb_sub)
899 NULLIFY (work_matrices%wfm_aux_orb_sub)
900 END IF
901 IF (ASSOCIATED(work_matrices%rho_ao_aux_fit_fm_sub)) THEN
902 CALL cp_fm_release(work_matrices%rho_ao_aux_fit_fm_sub)
903 DEALLOCATE (work_matrices%rho_ao_aux_fit_fm_sub)
904 NULLIFY (work_matrices%rho_ao_aux_fit_fm_sub)
905 END IF
906 IF (ASSOCIATED(work_matrices%rho_ao_orb_fm_sub)) THEN
907 CALL cp_fm_release(work_matrices%rho_ao_orb_fm_sub)
908 DEALLOCATE (work_matrices%rho_ao_orb_fm_sub)
909 NULLIFY (work_matrices%rho_ao_orb_fm_sub)
910 END IF
911
912 CALL cp_fm_release(work_matrices%Aop_evects_sub)
913 CALL cp_fm_release(work_matrices%evects_sub)
914
915 CALL cp_fm_release(work_matrices%S_C0)
916 CALL cp_fm_release(work_matrices%S_C0_C0T)
917
918 DO ispin = SIZE(work_matrices%fm_pool_ao_mo_active), 1, -1
919 CALL fm_pool_release(work_matrices%fm_pool_ao_mo_active(ispin)%pool)
920 END DO
921 DEALLOCATE (work_matrices%fm_pool_ao_mo_active)
922
923 ! sTDA
924 IF (ASSOCIATED(work_matrices%gamma_exchange)) THEN
925 CALL dbcsr_deallocate_matrix_set(work_matrices%gamma_exchange)
926 NULLIFY (work_matrices%gamma_exchange)
927 END IF
928 IF (ASSOCIATED(work_matrices%ctransformed)) THEN
929 CALL cp_fm_release(work_matrices%ctransformed)
930 NULLIFY (work_matrices%ctransformed)
931 END IF
932 CALL dbcsr_release_p(work_matrices%shalf)
933 !
934 IF (ASSOCIATED(work_matrices%S_eigenvectors)) THEN
935 CALL cp_fm_release(work_matrices%S_eigenvectors)
936 DEALLOCATE (work_matrices%S_eigenvectors)
937 END IF
938 IF (ASSOCIATED(work_matrices%slambda)) THEN
939 CALL cp_fm_release(work_matrices%slambda)
940 DEALLOCATE (work_matrices%slambda)
941 END IF
942 IF (ASSOCIATED(work_matrices%S_eigenvalues)) &
943 DEALLOCATE (work_matrices%S_eigenvalues)
944 ! Ewald
945 IF (ASSOCIATED(work_matrices%ewald_env)) THEN
946 CALL ewald_env_release(work_matrices%ewald_env)
947 DEALLOCATE (work_matrices%ewald_env)
948 END IF
949 IF (ASSOCIATED(work_matrices%ewald_pw)) THEN
950 CALL ewald_pw_release(work_matrices%ewald_pw)
951 DEALLOCATE (work_matrices%ewald_pw)
952 END IF
953 ! GAPW
954 IF (ASSOCIATED(work_matrices%local_rho_set)) THEN
955 CALL local_rho_set_release(work_matrices%local_rho_set)
956 END IF
957 IF (ASSOCIATED(work_matrices%local_rho_set_admm)) THEN
958 CALL local_rho_set_release(work_matrices%local_rho_set_admm)
959 END IF
960 IF (ASSOCIATED(work_matrices%hartree_local)) THEN
961 CALL hartree_local_release(work_matrices%hartree_local)
962 END IF
963 ! GAPW_XC
964 IF (ASSOCIATED(work_matrices%rho_xc_struct_sub)) THEN
965 CALL qs_rho_release(work_matrices%rho_xc_struct_sub)
966 DEALLOCATE (work_matrices%rho_xc_struct_sub)
967 END IF
968
969 CALL timestop(handle)
970
971 END SUBROUTINE tddfpt_release_work_matrices
972
973END MODULE qs_tddfpt2_types
Types and set/get functions for auxiliary density matrix methods.
Definition admm_types.F:15
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
Definition admm_types.F:593
Define the atomic kind types and their sub types.
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_release_p(matrix)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
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_init_p(matrix)
...
subroutine, public dbcsr_complete_redistribute(matrix, redist)
...
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
pool for for elements that are retained and released
subroutine, public fm_pool_create(pool, el_struct)
creates a pool of elements
subroutine, public fm_pool_release(pool)
releases the given pool (see cp2k/doc/ReferenceCounting.html)
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
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, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public ewald_env_release(ewald_env)
releases the given ewald_env (see doc/ReferenceCounting.html)
subroutine, public ewald_pw_release(ewald_pw)
releases the memory used by the ewald_pw
subroutine, public init_coulomb_local(hartree_local, natom)
...
subroutine, public hartree_local_release(hartree_local)
...
subroutine, public hartree_local_create(hartree_local)
...
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
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, 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.
Define the quickstep kind type and their sub types.
subroutine, public local_rho_set_create(local_rho_set)
...
subroutine, public local_rho_set_release(local_rho_set)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public rho0_s_grid_create(pw_env, rho0_mpole)
...
subroutine, public init_rho0(local_rho_set, qs_env, gapw_control, zcore)
...
subroutine, public allocate_rho_atom_internals(rho_atom_set, atomic_kind_set, qs_kind_set, dft_control, para_env)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_rebuild(rho, qs_env, rebuild_ao, rebuild_grids, admm, pw_env_external)
rebuilds rho (if necessary allocating and initializing it)
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_set(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)
...
subroutine, public qs_rho_create(rho)
Allocates a new instance of rho.
subroutine, public qs_rho_release(rho_struct)
releases a rho_struct by decreasing the reference count by one and deallocating if it reaches 0 (to b...
subroutine, public tddfpt_dbcsr_create_by_dist(matrix, template, dbcsr_dist, sab)
Create a DBCSR matrix based on a template matrix, distribution object, and the list of neighbours.
subroutine, public hfxsr_create_work_matrices(work_matrices, qs_env, admm_env)
Allocate work matrices for hfxsr.
subroutine, public tddfpt_create_work_matrices(work_matrices, gs_mos, nstates, do_hfx, do_admm, do_hfxlr, do_exck, do_sf, qs_env, sub_env)
Allocate work matrices for full kernel.
subroutine, public tddfpt_release_work_matrices(work_matrices, sub_env)
Release work matrices.
subroutine, public stda_create_work_matrices(work_matrices, gs_mos, nstates, qs_env, sub_env)
Allocate work matrices for sTDA kernel.
stores some data used in wavefunction fitting
Definition admm_types.F:120
Provides all information about an atomic kind.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
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 ...
Provides all information about a quickstep kind.
keeps the density in various representations, keeping track of which ones are valid.
Ground state molecular orbitals.
Set of temporary ("work") matrices.