Line data Source code
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 :
8 : ! **************************************************************************************************
9 : !> \brief methods of the rho structure (defined in qs_rho_types)
10 : !> \par History
11 : !> 08.2002 created [fawzi]
12 : !> 08.2014 kpoints [JGH]
13 : !> \author Fawzi Mohamed
14 : ! **************************************************************************************************
15 : MODULE qs_rho_methods
16 : USE admm_types, ONLY: get_admm_env
17 : USE atomic_kind_types, ONLY: atomic_kind_type
18 : USE cp_control_types, ONLY: dft_control_type
19 : USE cp_dbcsr_api, ONLY: &
20 : dbcsr_add, dbcsr_copy, dbcsr_create, dbcsr_p_type, dbcsr_scale, dbcsr_set, dbcsr_type, &
21 : dbcsr_type_antisymmetric, dbcsr_type_symmetric
22 : USE cp_dbcsr_cp2k_link, ONLY: cp_dbcsr_alloc_block_from_nbl
23 : USE cp_dbcsr_operations, ONLY: dbcsr_allocate_matrix_set,&
24 : dbcsr_deallocate_matrix_set
25 : USE cp_log_handling, ONLY: cp_to_string
26 : USE kinds, ONLY: default_string_length,&
27 : dp
28 : USE kpoint_types, ONLY: get_kpoint_info,&
29 : kpoint_type
30 : USE lri_environment_methods, ONLY: calculate_lri_densities
31 : USE lri_environment_types, ONLY: lri_density_type,&
32 : lri_environment_type
33 : USE message_passing, ONLY: mp_para_env_type
34 : USE pw_env_types, ONLY: pw_env_get,&
35 : pw_env_type
36 : USE pw_methods, ONLY: pw_axpy,&
37 : pw_copy,&
38 : pw_scale,&
39 : pw_zero
40 : USE pw_pool_types, ONLY: pw_pool_type
41 : USE pw_types, ONLY: pw_c1d_gs_type,&
42 : pw_r3d_rs_type
43 : USE qs_collocate_density, ONLY: calculate_drho_elec,&
44 : calculate_rho_elec
45 : USE qs_environment_types, ONLY: get_qs_env,&
46 : qs_environment_type,&
47 : set_qs_env
48 : USE qs_harris_types, ONLY: harris_type
49 : USE qs_harris_utils, ONLY: calculate_harris_density
50 : USE qs_kind_types, ONLY: qs_kind_type
51 : USE qs_ks_types, ONLY: get_ks_env,&
52 : qs_ks_env_type
53 : USE qs_local_rho_types, ONLY: local_rho_type
54 : USE qs_neighbor_list_types, ONLY: neighbor_list_set_p_type
55 : USE qs_oce_types, ONLY: oce_matrix_type
56 : USE qs_rho_atom_methods, ONLY: calculate_rho_atom_coeff
57 : USE qs_rho_atom_types, ONLY: rho_atom_type
58 : USE qs_rho_types, ONLY: qs_rho_clear,&
59 : qs_rho_get,&
60 : qs_rho_set,&
61 : qs_rho_type
62 : USE ri_environment_methods, ONLY: calculate_ri_densities
63 : USE task_list_types, ONLY: task_list_type
64 : #include "./base/base_uses.f90"
65 :
66 : IMPLICIT NONE
67 : PRIVATE
68 :
69 : LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
70 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_rho_methods'
71 :
72 : PUBLIC :: qs_rho_update_rho, qs_rho_update_tddfpt, &
73 : qs_rho_rebuild, qs_rho_copy, qs_rho_scale_and_add, &
74 : qs_rho_scale_and_add_b
75 : PUBLIC :: duplicate_rho_type, allocate_rho_ao_imag_from_real
76 :
77 : CONTAINS
78 :
79 : ! **************************************************************************************************
80 : !> \brief rebuilds rho (if necessary allocating and initializing it)
81 : !> \param rho the rho type to rebuild (defaults to qs_env%rho)
82 : !> \param qs_env the environment to which rho belongs
83 : !> \param rebuild_ao if it is necessary to rebuild rho_ao. Defaults to true.
84 : !> \param rebuild_grids if it in necessary to rebuild rho_r and rho_g.
85 : !> Defaults to false.
86 : !> \param admm (use aux_fit basis)
87 : !> \param pw_env_external external plane wave environment
88 : !> \par History
89 : !> 11.2002 created replacing qs_rho_create and qs_env_rebuild_rho[fawzi]
90 : !> \author Fawzi Mohamed
91 : !> \note
92 : !> needs updated pw pools, s, s_mstruct and h in qs_env.
93 : !> The use of p to keep the structure of h (needed for the forces)
94 : !> is ugly and should be removed.
95 : !> Change so that it does not allocate a subcomponent if it is not
96 : !> associated and not requested?
97 : ! **************************************************************************************************
98 69532 : SUBROUTINE qs_rho_rebuild(rho, qs_env, rebuild_ao, rebuild_grids, admm, pw_env_external)
99 : TYPE(qs_rho_type), INTENT(INOUT) :: rho
100 : TYPE(qs_environment_type), POINTER :: qs_env
101 : LOGICAL, INTENT(in), OPTIONAL :: rebuild_ao, rebuild_grids, admm
102 : TYPE(pw_env_type), OPTIONAL, POINTER :: pw_env_external
103 :
104 : CHARACTER(LEN=*), PARAMETER :: routineN = 'qs_rho_rebuild'
105 :
106 : CHARACTER(LEN=default_string_length) :: headline
107 : INTEGER :: handle, i, ic, j, nimg, nspins
108 : LOGICAL :: do_kpoints, my_admm, my_rebuild_ao, &
109 : my_rebuild_grids, rho_ao_is_complex
110 34766 : REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho_r
111 34766 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s_kp, rho_ao_im_kp, rho_ao_kp
112 : TYPE(dbcsr_type), POINTER :: refmatrix, tmatrix
113 : TYPE(dft_control_type), POINTER :: dft_control
114 : TYPE(kpoint_type), POINTER :: kpoints
115 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
116 34766 : POINTER :: sab_orb
117 34766 : TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g, tau_g
118 34766 : TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER :: drho_g
119 : TYPE(pw_env_type), POINTER :: pw_env
120 : TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
121 34766 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r, tau_r
122 34766 : TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER :: drho_r
123 : TYPE(pw_r3d_rs_type), POINTER :: rho_r_sccs
124 :
125 34766 : CALL timeset(routineN, handle)
126 :
127 34766 : NULLIFY (pw_env, auxbas_pw_pool, matrix_s_kp, dft_control)
128 34766 : NULLIFY (tot_rho_r, rho_ao_kp, rho_r, rho_g, drho_r, drho_g, tau_r, tau_g, rho_ao_im_kp)
129 34766 : NULLIFY (rho_r_sccs)
130 34766 : NULLIFY (sab_orb)
131 34766 : my_rebuild_ao = .TRUE.
132 34766 : my_rebuild_grids = .TRUE.
133 34766 : my_admm = .FALSE.
134 34766 : IF (PRESENT(rebuild_ao)) my_rebuild_ao = rebuild_ao
135 34766 : IF (PRESENT(rebuild_grids)) my_rebuild_grids = rebuild_grids
136 34766 : IF (PRESENT(admm)) my_admm = admm
137 :
138 : CALL get_qs_env(qs_env, &
139 : kpoints=kpoints, &
140 : do_kpoints=do_kpoints, &
141 : pw_env=pw_env, &
142 34766 : dft_control=dft_control)
143 34766 : IF (PRESENT(pw_env_external)) THEN
144 1108 : pw_env => pw_env_external
145 : END IF
146 :
147 34766 : nimg = dft_control%nimages
148 :
149 34766 : IF (my_admm) THEN
150 2162 : CALL get_admm_env(qs_env%admm_env, sab_aux_fit=sab_orb, matrix_s_aux_fit_kp=matrix_s_kp)
151 : ELSE
152 32604 : CALL get_qs_env(qs_env, matrix_s_kp=matrix_s_kp)
153 :
154 32604 : IF (do_kpoints) THEN
155 3568 : CALL get_kpoint_info(kpoints, sab_nl=sab_orb)
156 : ELSE
157 29036 : CALL get_qs_env(qs_env, sab_orb=sab_orb)
158 : END IF
159 : END IF
160 34766 : refmatrix => matrix_s_kp(1, 1)%matrix
161 :
162 34766 : CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
163 34766 : nspins = dft_control%nspins
164 :
165 : CALL qs_rho_get(rho, &
166 : tot_rho_r=tot_rho_r, &
167 : rho_ao_kp=rho_ao_kp, &
168 : rho_ao_im_kp=rho_ao_im_kp, &
169 : rho_r=rho_r, &
170 : rho_g=rho_g, &
171 : drho_r=drho_r, &
172 : drho_g=drho_g, &
173 : tau_r=tau_r, &
174 : tau_g=tau_g, &
175 : rho_r_sccs=rho_r_sccs, &
176 34766 : complex_rho_ao=rho_ao_is_complex)
177 :
178 34766 : IF (.NOT. ASSOCIATED(tot_rho_r)) THEN
179 41928 : ALLOCATE (tot_rho_r(nspins))
180 30497 : tot_rho_r = 0.0_dp
181 13976 : CALL qs_rho_set(rho, tot_rho_r=tot_rho_r)
182 : END IF
183 :
184 : ! rho_ao
185 34766 : IF (my_rebuild_ao .OR. (.NOT. ASSOCIATED(rho_ao_kp))) THEN
186 32728 : IF (ASSOCIATED(rho_ao_kp)) THEN
187 20756 : CALL dbcsr_deallocate_matrix_set(rho_ao_kp)
188 : END IF
189 : ! Create a new density matrix set
190 32728 : CALL dbcsr_allocate_matrix_set(rho_ao_kp, nspins, nimg)
191 32728 : CALL qs_rho_set(rho, rho_ao_kp=rho_ao_kp)
192 69932 : DO i = 1, nspins
193 335804 : DO ic = 1, nimg
194 265872 : IF (nspins > 1) THEN
195 40408 : IF (i == 1) THEN
196 20204 : headline = "DENSITY MATRIX FOR ALPHA SPIN"
197 : ELSE
198 20204 : headline = "DENSITY MATRIX FOR BETA SPIN"
199 : END IF
200 : ELSE
201 225464 : headline = "DENSITY MATRIX"
202 : END IF
203 265872 : ALLOCATE (rho_ao_kp(i, ic)%matrix)
204 265872 : tmatrix => rho_ao_kp(i, ic)%matrix
205 : CALL dbcsr_create(matrix=tmatrix, template=refmatrix, name=TRIM(headline), &
206 265872 : matrix_type=dbcsr_type_symmetric)
207 265872 : CALL cp_dbcsr_alloc_block_from_nbl(tmatrix, sab_orb)
208 303076 : CALL dbcsr_set(tmatrix, 0.0_dp)
209 : END DO
210 : END DO
211 32728 : IF (rho_ao_is_complex) THEN
212 340 : IF (ASSOCIATED(rho_ao_im_kp)) THEN
213 340 : CALL dbcsr_deallocate_matrix_set(rho_ao_im_kp)
214 : END IF
215 340 : CALL dbcsr_allocate_matrix_set(rho_ao_im_kp, nspins, nimg)
216 340 : CALL qs_rho_set(rho, rho_ao_im_kp=rho_ao_im_kp)
217 748 : DO i = 1, nspins
218 1156 : DO ic = 1, nimg
219 408 : IF (nspins > 1) THEN
220 136 : IF (i == 1) THEN
221 68 : headline = "IMAGINARY PART OF DENSITY MATRIX FOR ALPHA SPIN"
222 : ELSE
223 68 : headline = "IMAGINARY PART OF DENSITY MATRIX FOR BETA SPIN"
224 : END IF
225 : ELSE
226 272 : headline = "IMAGINARY PART OF DENSITY MATRIX"
227 : END IF
228 408 : ALLOCATE (rho_ao_im_kp(i, ic)%matrix)
229 408 : tmatrix => rho_ao_im_kp(i, ic)%matrix
230 : CALL dbcsr_create(matrix=tmatrix, template=refmatrix, name=TRIM(headline), &
231 408 : matrix_type=dbcsr_type_antisymmetric)
232 408 : CALL cp_dbcsr_alloc_block_from_nbl(tmatrix, sab_orb)
233 816 : CALL dbcsr_set(tmatrix, 0.0_dp)
234 : END DO
235 : END DO
236 : END IF
237 : END IF
238 :
239 : ! rho_r
240 34766 : IF (my_rebuild_grids .OR. .NOT. ASSOCIATED(rho_r)) THEN
241 34766 : IF (ASSOCIATED(rho_r)) THEN
242 43651 : DO i = 1, SIZE(rho_r)
243 43651 : CALL rho_r(i)%release()
244 : END DO
245 20790 : DEALLOCATE (rho_r)
246 : END IF
247 143680 : ALLOCATE (rho_r(nspins))
248 34766 : CALL qs_rho_set(rho, rho_r=rho_r)
249 74148 : DO i = 1, nspins
250 74148 : CALL auxbas_pw_pool%create_pw(rho_r(i))
251 : END DO
252 : END IF
253 :
254 : ! rho_g
255 34766 : IF (my_rebuild_grids .OR. .NOT. ASSOCIATED(rho_g)) THEN
256 34766 : IF (ASSOCIATED(rho_g)) THEN
257 43651 : DO i = 1, SIZE(rho_g)
258 43651 : CALL rho_g(i)%release()
259 : END DO
260 20790 : DEALLOCATE (rho_g)
261 : END IF
262 143680 : ALLOCATE (rho_g(nspins))
263 34766 : CALL qs_rho_set(rho, rho_g=rho_g)
264 74148 : DO i = 1, nspins
265 74148 : CALL auxbas_pw_pool%create_pw(rho_g(i))
266 : END DO
267 : END IF
268 :
269 : ! SCCS
270 34766 : IF (dft_control%do_sccs) THEN
271 14 : IF (my_rebuild_grids .OR. (.NOT. ASSOCIATED(rho_r_sccs))) THEN
272 14 : IF (ASSOCIATED(rho_r_sccs)) THEN
273 2 : CALL rho_r_sccs%release()
274 2 : DEALLOCATE (rho_r_sccs)
275 : END IF
276 14 : ALLOCATE (rho_r_sccs)
277 14 : CALL qs_rho_set(rho, rho_r_sccs=rho_r_sccs)
278 14 : CALL auxbas_pw_pool%create_pw(rho_r_sccs)
279 14 : CALL pw_zero(rho_r_sccs)
280 : END IF
281 : END IF
282 :
283 : ! allocate drho_r and drho_g if xc_deriv_collocate
284 34766 : IF (dft_control%drho_by_collocation) THEN
285 : ! drho_r
286 0 : IF (my_rebuild_grids .OR. .NOT. ASSOCIATED(drho_r)) THEN
287 0 : IF (ASSOCIATED(drho_r)) THEN
288 0 : DO j = 1, SIZE(drho_r, 2)
289 0 : DO i = 1, SIZE(drho_r, 1)
290 0 : CALL drho_r(i, j)%release()
291 : END DO
292 : END DO
293 0 : DEALLOCATE (drho_r)
294 : END IF
295 0 : ALLOCATE (drho_r(3, nspins))
296 0 : CALL qs_rho_set(rho, drho_r=drho_r)
297 0 : DO j = 1, nspins
298 0 : DO i = 1, 3
299 0 : CALL auxbas_pw_pool%create_pw(drho_r(i, j))
300 : END DO
301 : END DO
302 : END IF
303 : ! drho_g
304 0 : IF (my_rebuild_grids .OR. .NOT. ASSOCIATED(drho_g)) THEN
305 0 : IF (ASSOCIATED(drho_g)) THEN
306 0 : DO j = 1, SIZE(drho_g, 2)
307 0 : DO i = 1, SIZE(drho_r, 1)
308 0 : CALL drho_g(i, j)%release()
309 : END DO
310 : END DO
311 0 : DEALLOCATE (drho_g)
312 : END IF
313 0 : ALLOCATE (drho_g(3, nspins))
314 0 : CALL qs_rho_set(rho, drho_g=drho_g)
315 0 : DO j = 1, nspins
316 0 : DO i = 1, 3
317 0 : CALL auxbas_pw_pool%create_pw(drho_g(i, j))
318 : END DO
319 : END DO
320 : END IF
321 : END IF
322 :
323 : ! allocate tau_r and tau_g if use_kinetic_energy_density
324 34766 : IF (dft_control%use_kinetic_energy_density) THEN
325 : ! tau_r
326 706 : IF (my_rebuild_grids .OR. .NOT. ASSOCIATED(tau_r)) THEN
327 706 : IF (ASSOCIATED(tau_r)) THEN
328 418 : DO i = 1, SIZE(tau_r)
329 418 : CALL tau_r(i)%release()
330 : END DO
331 202 : DEALLOCATE (tau_r)
332 : END IF
333 2894 : ALLOCATE (tau_r(nspins))
334 706 : CALL qs_rho_set(rho, tau_r=tau_r)
335 1482 : DO i = 1, nspins
336 1482 : CALL auxbas_pw_pool%create_pw(tau_r(i))
337 : END DO
338 : END IF
339 :
340 : ! tau_g
341 706 : IF (my_rebuild_grids .OR. .NOT. ASSOCIATED(tau_g)) THEN
342 706 : IF (ASSOCIATED(tau_g)) THEN
343 418 : DO i = 1, SIZE(tau_g)
344 418 : CALL tau_g(i)%release()
345 : END DO
346 202 : DEALLOCATE (tau_g)
347 : END IF
348 2894 : ALLOCATE (tau_g(nspins))
349 706 : CALL qs_rho_set(rho, tau_g=tau_g)
350 1482 : DO i = 1, nspins
351 1482 : CALL auxbas_pw_pool%create_pw(tau_g(i))
352 : END DO
353 : END IF
354 : END IF ! use_kinetic_energy_density
355 :
356 34766 : CALL timestop(handle)
357 :
358 34766 : END SUBROUTINE qs_rho_rebuild
359 :
360 : ! **************************************************************************************************
361 : !> \brief updates rho_r and rho_g to the rho%rho_ao.
362 : !> if use_kinetic_energy_density also computes tau_r and tau_g
363 : !> this works for all ground state and ground state response methods
364 : !> \param rho_struct the rho structure that should be updated
365 : !> \param qs_env the qs_env rho_struct refers to
366 : !> the integrated charge in r space
367 : !> \param rho_xc_external ...
368 : !> \param local_rho_set ...
369 : !> \param task_list_external external task list
370 : !> \param task_list_external_soft external task list (soft_version)
371 : !> \param pw_env_external external plane wave environment
372 : !> \param para_env_external external MPI environment
373 : !> \par History
374 : !> 08.2002 created [fawzi]
375 : !> \author Fawzi Mohamed
376 : ! **************************************************************************************************
377 294679 : SUBROUTINE qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, &
378 : task_list_external, task_list_external_soft, &
379 : pw_env_external, para_env_external)
380 : TYPE(qs_rho_type), INTENT(INOUT) :: rho_struct
381 : TYPE(qs_environment_type), POINTER :: qs_env
382 : TYPE(qs_rho_type), OPTIONAL, POINTER :: rho_xc_external
383 : TYPE(local_rho_type), OPTIONAL, POINTER :: local_rho_set
384 : TYPE(task_list_type), OPTIONAL, POINTER :: task_list_external, &
385 : task_list_external_soft
386 : TYPE(pw_env_type), OPTIONAL, POINTER :: pw_env_external
387 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env_external
388 :
389 294679 : INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
390 294679 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
391 294679 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
392 294679 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
393 : TYPE(dft_control_type), POINTER :: dft_control
394 : TYPE(harris_type), POINTER :: harris_env
395 : TYPE(kpoint_type), POINTER :: kpoints
396 : TYPE(lri_density_type), POINTER :: lri_density
397 : TYPE(lri_environment_type), POINTER :: lri_env
398 : TYPE(mp_para_env_type), POINTER :: para_env
399 : TYPE(qs_ks_env_type), POINTER :: ks_env
400 :
401 : CALL get_qs_env(qs_env, dft_control=dft_control, &
402 : atomic_kind_set=atomic_kind_set, &
403 294679 : para_env=para_env)
404 294679 : IF (PRESENT(para_env_external)) para_env => para_env_external
405 :
406 294679 : IF (qs_env%harris_method) THEN
407 68 : CALL get_qs_env(qs_env, harris_env=harris_env)
408 68 : CALL calculate_harris_density(qs_env, harris_env%rhoin, rho_struct)
409 68 : CALL qs_rho_set(rho_struct, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
410 :
411 : ELSE IF (dft_control%qs_control%semi_empirical .OR. &
412 294611 : dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb) THEN
413 :
414 135348 : CALL qs_rho_set(rho_struct, rho_r_valid=.FALSE., rho_g_valid=.FALSE.)
415 :
416 159263 : ELSE IF (dft_control%qs_control%lrigpw) THEN
417 642 : CPASSERT(.NOT. dft_control%use_kinetic_energy_density)
418 642 : CPASSERT(.NOT. dft_control%drho_by_collocation)
419 642 : CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
420 642 : CALL get_qs_env(qs_env, ks_env=ks_env)
421 642 : CALL get_ks_env(ks_env=ks_env, kpoints=kpoints)
422 642 : CALL get_kpoint_info(kpoint=kpoints, cell_to_index=cell_to_index)
423 642 : CALL get_qs_env(qs_env, lri_env=lri_env, lri_density=lri_density)
424 : CALL calculate_lri_densities(lri_env, lri_density, qs_env, rho_ao_kp, cell_to_index, &
425 : lri_rho_struct=rho_struct, &
426 : atomic_kind_set=atomic_kind_set, &
427 : para_env=para_env, &
428 642 : response_density=.FALSE.)
429 642 : CALL set_qs_env(qs_env, lri_density=lri_density)
430 642 : CALL qs_rho_set(rho_struct, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
431 :
432 158621 : ELSE IF (dft_control%qs_control%rigpw) THEN
433 26 : CPASSERT(.NOT. dft_control%use_kinetic_energy_density)
434 26 : CPASSERT(.NOT. dft_control%drho_by_collocation)
435 26 : CALL get_qs_env(qs_env, lri_env=lri_env)
436 26 : CALL qs_rho_get(rho_struct, rho_ao=rho_ao)
437 : CALL calculate_ri_densities(lri_env, qs_env, rho_ao, &
438 : lri_rho_struct=rho_struct, &
439 : atomic_kind_set=atomic_kind_set, &
440 26 : para_env=para_env)
441 26 : CALL qs_rho_set(rho_struct, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
442 :
443 : ELSE
444 : CALL qs_rho_update_rho_low(rho_struct=rho_struct, qs_env=qs_env, &
445 : rho_xc_external=rho_xc_external, &
446 : local_rho_set=local_rho_set, &
447 : task_list_external=task_list_external, &
448 : task_list_external_soft=task_list_external_soft, &
449 : pw_env_external=pw_env_external, &
450 158595 : para_env_external=para_env_external)
451 :
452 : END IF
453 :
454 294679 : END SUBROUTINE qs_rho_update_rho
455 :
456 : ! **************************************************************************************************
457 : !> \brief updates rho_r and rho_g to the rho%rho_ao.
458 : !> if use_kinetic_energy_density also computes tau_r and tau_g
459 : !> \param rho_struct the rho structure that should be updated
460 : !> \param qs_env the qs_env rho_struct refers to
461 : !> the integrated charge in r space
462 : !> \param rho_xc_external rho structure for GAPW_XC
463 : !> \param local_rho_set ...
464 : !> \param pw_env_external external plane wave environment
465 : !> \param task_list_external external task list (use for default and GAPW)
466 : !> \param task_list_external_soft external task list (soft density for GAPW_XC)
467 : !> \param para_env_external ...
468 : !> \par History
469 : !> 08.2002 created [fawzi]
470 : !> \author Fawzi Mohamed
471 : ! **************************************************************************************************
472 158595 : SUBROUTINE qs_rho_update_rho_low(rho_struct, qs_env, rho_xc_external, &
473 : local_rho_set, pw_env_external, &
474 : task_list_external, task_list_external_soft, &
475 : para_env_external)
476 : TYPE(qs_rho_type), INTENT(INOUT) :: rho_struct
477 : TYPE(qs_environment_type), POINTER :: qs_env
478 : TYPE(qs_rho_type), OPTIONAL, POINTER :: rho_xc_external
479 : TYPE(local_rho_type), OPTIONAL, POINTER :: local_rho_set
480 : TYPE(pw_env_type), OPTIONAL, POINTER :: pw_env_external
481 : TYPE(task_list_type), OPTIONAL, POINTER :: task_list_external, &
482 : task_list_external_soft
483 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env_external
484 :
485 : CHARACTER(len=*), PARAMETER :: routineN = 'qs_rho_update_rho_low'
486 :
487 : INTEGER :: handle, img, ispin, nimg, nspins
488 : LOGICAL :: gapw, gapw_xc
489 : REAL(KIND=dp) :: dum
490 158595 : REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho_r, tot_rho_r_xc
491 158595 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
492 158595 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
493 158595 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp, rho_xc_ao
494 : TYPE(dft_control_type), POINTER :: dft_control
495 : TYPE(mp_para_env_type), POINTER :: para_env
496 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
497 158595 : POINTER :: sab
498 : TYPE(oce_matrix_type), POINTER :: oce
499 158595 : TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g, rho_xc_g, tau_g, tau_xc_g
500 158595 : TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER :: drho_g, drho_xc_g
501 : TYPE(pw_env_type), POINTER :: pw_env
502 158595 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r, rho_xc_r, tau_r, tau_xc_r
503 158595 : TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER :: drho_r, drho_xc_r
504 158595 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
505 : TYPE(qs_ks_env_type), POINTER :: ks_env
506 : TYPE(qs_rho_type), POINTER :: rho_xc
507 158595 : TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom_set
508 : TYPE(task_list_type), POINTER :: task_list
509 :
510 158595 : CALL timeset(routineN, handle)
511 :
512 158595 : NULLIFY (dft_control, rho_xc, ks_env, rho_ao, rho_r, rho_g, drho_r, drho_g, tau_r, tau_g)
513 158595 : NULLIFY (rho_xc_ao, rho_xc_g, rho_xc_r, drho_xc_g, tau_xc_r, tau_xc_g, tot_rho_r, tot_rho_r_xc)
514 158595 : NULLIFY (para_env, pw_env, atomic_kind_set)
515 :
516 : CALL get_qs_env(qs_env, &
517 : ks_env=ks_env, &
518 : dft_control=dft_control, &
519 158595 : atomic_kind_set=atomic_kind_set)
520 :
521 : CALL qs_rho_get(rho_struct, &
522 : rho_r=rho_r, &
523 : rho_g=rho_g, &
524 : tot_rho_r=tot_rho_r, &
525 : drho_r=drho_r, &
526 : drho_g=drho_g, &
527 : tau_r=tau_r, &
528 158595 : tau_g=tau_g)
529 :
530 : CALL get_qs_env(qs_env, task_list=task_list, &
531 158595 : para_env=para_env, pw_env=pw_env)
532 158595 : IF (PRESENT(pw_env_external)) pw_env => pw_env_external
533 158595 : IF (PRESENT(task_list_external)) task_list => task_list_external
534 158595 : IF (PRESENT(para_env_external)) para_env => para_env_external
535 :
536 158595 : nspins = dft_control%nspins
537 158595 : nimg = dft_control%nimages
538 158595 : gapw = dft_control%qs_control%gapw
539 158595 : gapw_xc = dft_control%qs_control%gapw_xc
540 :
541 158595 : CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
542 347351 : DO ispin = 1, nspins
543 188756 : rho_ao => rho_ao_kp(ispin, :)
544 : CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
545 : rho=rho_r(ispin), &
546 : rho_gspace=rho_g(ispin), &
547 : total_rho=tot_rho_r(ispin), &
548 : ks_env=ks_env, soft_valid=gapw, &
549 : task_list_external=task_list_external, &
550 347351 : pw_env_external=pw_env_external)
551 : END DO
552 158595 : CALL qs_rho_set(rho_struct, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
553 :
554 158595 : IF (gapw_xc) THEN
555 6234 : IF (PRESENT(rho_xc_external)) THEN
556 1162 : rho_xc => rho_xc_external
557 : ELSE
558 5072 : CALL get_qs_env(qs_env=qs_env, rho_xc=rho_xc)
559 : END IF
560 : CALL qs_rho_get(rho_xc, &
561 : rho_ao_kp=rho_xc_ao, &
562 : rho_r=rho_xc_r, &
563 : rho_g=rho_xc_g, &
564 6234 : tot_rho_r=tot_rho_r_xc)
565 : ! copy rho_ao into rho_xc_ao
566 12926 : DO ispin = 1, nspins
567 29420 : DO img = 1, nimg
568 23186 : CALL dbcsr_copy(rho_xc_ao(ispin, img)%matrix, rho_ao_kp(ispin, img)%matrix)
569 : END DO
570 : END DO
571 12926 : DO ispin = 1, nspins
572 6692 : rho_ao => rho_xc_ao(ispin, :)
573 : CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
574 : rho=rho_xc_r(ispin), &
575 : rho_gspace=rho_xc_g(ispin), &
576 : total_rho=tot_rho_r_xc(ispin), &
577 : ks_env=ks_env, soft_valid=gapw_xc, &
578 : task_list_external=task_list_external_soft, &
579 12926 : pw_env_external=pw_env_external)
580 : END DO
581 6234 : CALL qs_rho_set(rho_xc, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
582 : END IF
583 :
584 : ! GAPW o GAPW_XC require the calculation of hard and soft local densities
585 158595 : IF (gapw .OR. gapw_xc) THEN
586 : CALL get_qs_env(qs_env=qs_env, &
587 : rho_atom_set=rho_atom_set, &
588 : qs_kind_set=qs_kind_set, &
589 34620 : oce=oce, sab_orb=sab)
590 34620 : IF (PRESENT(local_rho_set)) rho_atom_set => local_rho_set%rho_atom_set
591 34620 : CPASSERT(ASSOCIATED(rho_atom_set))
592 34620 : CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
593 34620 : CALL calculate_rho_atom_coeff(qs_env, rho_ao_kp, rho_atom_set, qs_kind_set, oce, sab, para_env)
594 : END IF
595 :
596 158595 : IF (.NOT. gapw_xc) THEN
597 : ! if needed compute also the gradient of the density
598 152361 : IF (dft_control%drho_by_collocation) THEN
599 0 : CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
600 0 : CPASSERT(.NOT. PRESENT(task_list_external))
601 0 : DO ispin = 1, nspins
602 0 : rho_ao => rho_ao_kp(ispin, :)
603 : CALL calculate_drho_elec(matrix_p_kp=rho_ao, &
604 : drho=drho_r(:, ispin), &
605 : drho_gspace=drho_g(:, ispin), &
606 0 : qs_env=qs_env, soft_valid=gapw)
607 : END DO
608 0 : CALL qs_rho_set(rho_struct, drho_r_valid=.TRUE., drho_g_valid=.TRUE.)
609 : END IF
610 : ! if needed compute also the kinetic energy density
611 152361 : IF (dft_control%use_kinetic_energy_density) THEN
612 5322 : CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
613 11394 : DO ispin = 1, nspins
614 6072 : rho_ao => rho_ao_kp(ispin, :)
615 : CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
616 : rho=tau_r(ispin), &
617 : rho_gspace=tau_g(ispin), &
618 : total_rho=dum, & ! presumably not meaningful
619 : ks_env=ks_env, soft_valid=gapw, &
620 : compute_tau=.TRUE., &
621 : task_list_external=task_list_external, &
622 11394 : pw_env_external=pw_env_external)
623 : END DO
624 5322 : CALL qs_rho_set(rho_struct, tau_r_valid=.TRUE., tau_g_valid=.TRUE.)
625 : END IF
626 : ELSE
627 : CALL qs_rho_get(rho_xc, &
628 : drho_r=drho_xc_r, &
629 : drho_g=drho_xc_g, &
630 : tau_r=tau_xc_r, &
631 6234 : tau_g=tau_xc_g)
632 : ! if needed compute also the gradient of the density
633 6234 : IF (dft_control%drho_by_collocation) THEN
634 0 : CPASSERT(.NOT. PRESENT(task_list_external))
635 0 : DO ispin = 1, nspins
636 0 : rho_ao => rho_xc_ao(ispin, :)
637 : CALL calculate_drho_elec(matrix_p_kp=rho_ao, &
638 : drho=drho_xc_r(:, ispin), &
639 : drho_gspace=drho_xc_g(:, ispin), &
640 0 : qs_env=qs_env, soft_valid=gapw_xc)
641 : END DO
642 0 : CALL qs_rho_set(rho_xc, drho_r_valid=.TRUE., drho_g_valid=.TRUE.)
643 : END IF
644 : ! if needed compute also the kinetic energy density
645 6234 : IF (dft_control%use_kinetic_energy_density) THEN
646 724 : DO ispin = 1, nspins
647 362 : rho_ao => rho_xc_ao(ispin, :)
648 : CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
649 : rho=tau_xc_r(ispin), &
650 : rho_gspace=tau_xc_g(ispin), &
651 : ks_env=ks_env, soft_valid=gapw_xc, &
652 : compute_tau=.TRUE., &
653 : task_list_external=task_list_external_soft, &
654 724 : pw_env_external=pw_env_external)
655 : END DO
656 362 : CALL qs_rho_set(rho_xc, tau_r_valid=.TRUE., tau_g_valid=.TRUE.)
657 : END IF
658 : END IF
659 :
660 158595 : CALL timestop(handle)
661 :
662 158595 : END SUBROUTINE qs_rho_update_rho_low
663 :
664 : ! **************************************************************************************************
665 : !> \brief updates rho_r and rho_g to the rho%rho_ao.
666 : !> if use_kinetic_energy_density also computes tau_r and tau_g
667 : !> \param rho_struct the rho structure that should be updated
668 : !> \param qs_env the qs_env rho_struct refers to
669 : !> the integrated charge in r space
670 : !> \param pw_env_external external plane wave environment
671 : !> \param task_list_external external task list
672 : !> \param para_env_external ...
673 : !> \param tddfpt_lri_env ...
674 : !> \param tddfpt_lri_density ...
675 : !> \par History
676 : !> 08.2002 created [fawzi]
677 : !> \author Fawzi Mohamed
678 : ! **************************************************************************************************
679 172 : SUBROUTINE qs_rho_update_tddfpt(rho_struct, qs_env, pw_env_external, task_list_external, &
680 : para_env_external, tddfpt_lri_env, tddfpt_lri_density)
681 : TYPE(qs_rho_type), INTENT(INOUT) :: rho_struct
682 : TYPE(qs_environment_type), POINTER :: qs_env
683 : TYPE(pw_env_type), OPTIONAL, POINTER :: pw_env_external
684 : TYPE(task_list_type), OPTIONAL, POINTER :: task_list_external
685 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env_external
686 : TYPE(lri_environment_type), OPTIONAL, POINTER :: tddfpt_lri_env
687 : TYPE(lri_density_type), OPTIONAL, POINTER :: tddfpt_lri_density
688 :
689 : CHARACTER(len=*), PARAMETER :: routineN = 'qs_rho_update_tddfpt'
690 :
691 : INTEGER :: handle, ispin, nspins
692 172 : INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
693 : LOGICAL :: lri_response
694 172 : REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho_r
695 172 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
696 172 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
697 172 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
698 : TYPE(dft_control_type), POINTER :: dft_control
699 : TYPE(kpoint_type), POINTER :: kpoints
700 : TYPE(mp_para_env_type), POINTER :: para_env
701 172 : TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
702 : TYPE(pw_env_type), POINTER :: pw_env
703 172 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r
704 : TYPE(qs_ks_env_type), POINTER :: ks_env
705 : TYPE(task_list_type), POINTER :: task_list
706 :
707 172 : CALL timeset(routineN, handle)
708 :
709 : CALL get_qs_env(qs_env, &
710 : ks_env=ks_env, &
711 : dft_control=dft_control, &
712 : atomic_kind_set=atomic_kind_set, &
713 : task_list=task_list, &
714 : para_env=para_env, &
715 172 : pw_env=pw_env)
716 172 : IF (PRESENT(pw_env_external)) pw_env => pw_env_external
717 172 : IF (PRESENT(task_list_external)) task_list => task_list_external
718 172 : IF (PRESENT(para_env_external)) para_env => para_env_external
719 :
720 : CALL qs_rho_get(rho_struct, &
721 : rho_r=rho_r, &
722 : rho_g=rho_g, &
723 172 : tot_rho_r=tot_rho_r)
724 :
725 172 : nspins = dft_control%nspins
726 :
727 172 : lri_response = PRESENT(tddfpt_lri_env)
728 172 : IF (lri_response) THEN
729 172 : CPASSERT(PRESENT(tddfpt_lri_density))
730 : END IF
731 :
732 172 : CPASSERT(.NOT. dft_control%drho_by_collocation)
733 172 : CPASSERT(.NOT. dft_control%use_kinetic_energy_density)
734 172 : CPASSERT(.NOT. dft_control%qs_control%gapw)
735 172 : CPASSERT(.NOT. dft_control%qs_control%gapw_xc)
736 :
737 172 : IF (lri_response) THEN
738 172 : CALL get_ks_env(ks_env=ks_env, kpoints=kpoints)
739 172 : CALL get_kpoint_info(kpoint=kpoints, cell_to_index=cell_to_index)
740 172 : CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
741 : CALL calculate_lri_densities(tddfpt_lri_env, tddfpt_lri_density, qs_env, rho_ao_kp, cell_to_index, &
742 : lri_rho_struct=rho_struct, &
743 : atomic_kind_set=atomic_kind_set, &
744 : para_env=para_env, &
745 172 : response_density=lri_response)
746 172 : CALL qs_rho_set(rho_struct, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
747 : ELSE
748 0 : CALL qs_rho_get(rho_struct, rho_ao_kp=rho_ao_kp)
749 0 : DO ispin = 1, nspins
750 0 : rho_ao => rho_ao_kp(ispin, :)
751 : CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
752 : rho=rho_r(ispin), &
753 : rho_gspace=rho_g(ispin), &
754 : total_rho=tot_rho_r(ispin), &
755 : ks_env=ks_env, &
756 : task_list_external=task_list_external, &
757 0 : pw_env_external=pw_env_external)
758 : END DO
759 0 : CALL qs_rho_set(rho_struct, rho_r_valid=.TRUE., rho_g_valid=.TRUE.)
760 : END IF
761 :
762 172 : CALL timestop(handle)
763 :
764 172 : END SUBROUTINE qs_rho_update_tddfpt
765 :
766 : ! **************************************************************************************************
767 : !> \brief Allocate a density structure and fill it with data from an input structure
768 : !> SIZE(rho_input) == mspin == 1 direct copy
769 : !> SIZE(rho_input) == mspin == 2 direct copy of alpha and beta spin
770 : !> SIZE(rho_input) == 1 AND mspin == 2 copy rho/2 into alpha and beta spin
771 : !> \param rho_input ...
772 : !> \param rho_output ...
773 : !> \param auxbas_pw_pool ...
774 : !> \param mspin ...
775 : ! **************************************************************************************************
776 32784 : SUBROUTINE qs_rho_copy(rho_input, rho_output, auxbas_pw_pool, mspin)
777 :
778 : TYPE(qs_rho_type), INTENT(IN) :: rho_input
779 : TYPE(qs_rho_type), INTENT(INOUT) :: rho_output
780 : TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
781 : INTEGER, INTENT(IN) :: mspin
782 :
783 : CHARACTER(len=*), PARAMETER :: routineN = 'qs_rho_copy'
784 :
785 : INTEGER :: handle, i, j, nspins
786 : LOGICAL :: complex_rho_ao, drho_g_valid_in, drho_r_valid_in, rho_g_valid_in, rho_r_valid_in, &
787 : soft_valid_in, tau_g_valid_in, tau_r_valid_in
788 : REAL(KIND=dp) :: ospin
789 16392 : REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho_g_in, tot_rho_g_out, &
790 16392 : tot_rho_r_in, tot_rho_r_out
791 16392 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao_im_in, rho_ao_im_out, rho_ao_in, &
792 16392 : rho_ao_out
793 16392 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp_in
794 16392 : TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g_in, rho_g_out, tau_g_in, tau_g_out
795 16392 : TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER :: drho_g_in, drho_g_out
796 16392 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r_in, rho_r_out, tau_r_in, tau_r_out
797 16392 : TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER :: drho_r_in, drho_r_out
798 : TYPE(pw_r3d_rs_type), POINTER :: rho_r_sccs_in, rho_r_sccs_out
799 :
800 16392 : CALL timeset(routineN, handle)
801 :
802 16392 : CPASSERT(mspin == 1 .OR. mspin == 2)
803 16392 : ospin = 1._dp/REAL(mspin, KIND=dp)
804 :
805 16392 : CALL qs_rho_clear(rho_output)
806 :
807 16392 : NULLIFY (rho_ao_in, rho_ao_kp_in, rho_ao_im_in, rho_r_in, rho_g_in, drho_r_in, &
808 16392 : drho_g_in, tau_r_in, tau_g_in, tot_rho_r_in, tot_rho_g_in, rho_r_sccs_in)
809 :
810 : CALL qs_rho_get(rho_input, &
811 : rho_ao=rho_ao_in, &
812 : rho_ao_kp=rho_ao_kp_in, &
813 : rho_ao_im=rho_ao_im_in, &
814 : rho_r=rho_r_in, &
815 : rho_g=rho_g_in, &
816 : drho_r=drho_r_in, &
817 : drho_g=drho_g_in, &
818 : tau_r=tau_r_in, &
819 : tau_g=tau_g_in, &
820 : tot_rho_r=tot_rho_r_in, &
821 : tot_rho_g=tot_rho_g_in, &
822 : rho_g_valid=rho_g_valid_in, &
823 : rho_r_valid=rho_r_valid_in, &
824 : drho_g_valid=drho_g_valid_in, &
825 : drho_r_valid=drho_r_valid_in, &
826 : tau_r_valid=tau_r_valid_in, &
827 : tau_g_valid=tau_g_valid_in, &
828 : rho_r_sccs=rho_r_sccs_in, &
829 : soft_valid=soft_valid_in, &
830 16392 : complex_rho_ao=complex_rho_ao)
831 :
832 16392 : NULLIFY (rho_ao_out, rho_ao_im_out, rho_r_out, rho_g_out, drho_r_out, &
833 16392 : drho_g_out, tau_r_out, tau_g_out, tot_rho_r_out, tot_rho_g_out, rho_r_sccs_out)
834 : ! rho_ao
835 16392 : IF (ASSOCIATED(rho_ao_in)) THEN
836 16392 : nspins = SIZE(rho_ao_in)
837 16392 : CPASSERT(mspin >= nspins)
838 16392 : CALL dbcsr_allocate_matrix_set(rho_ao_out, mspin)
839 16392 : CALL qs_rho_set(rho_output, rho_ao=rho_ao_out)
840 16392 : IF (mspin > nspins) THEN
841 3528 : DO i = 1, mspin
842 2352 : ALLOCATE (rho_ao_out(i)%matrix)
843 2352 : CALL dbcsr_copy(rho_ao_out(i)%matrix, rho_ao_in(1)%matrix, name="RHO copy")
844 3528 : CALL dbcsr_scale(rho_ao_out(i)%matrix, ospin)
845 : END DO
846 : ELSE
847 32580 : DO i = 1, nspins
848 17364 : ALLOCATE (rho_ao_out(i)%matrix)
849 32580 : CALL dbcsr_copy(rho_ao_out(i)%matrix, rho_ao_in(i)%matrix, name="RHO copy")
850 : END DO
851 : END IF
852 : END IF
853 :
854 : ! rho_ao_kp
855 : ! only for non-kp, we could probably just copy this pointer, should work also for non-kp?
856 : !IF (ASSOCIATED(rho_ao_kp_in)) THEN
857 : ! CPABORT("Copy not available")
858 : !END IF
859 :
860 : ! rho_ao_im
861 16392 : IF (ASSOCIATED(rho_ao_im_in)) THEN
862 0 : nspins = SIZE(rho_ao_im_in)
863 0 : CPASSERT(mspin >= nspins)
864 0 : CALL dbcsr_allocate_matrix_set(rho_ao_im_out, mspin)
865 0 : CALL qs_rho_set(rho_output, rho_ao_im=rho_ao_im_out)
866 0 : IF (mspin > nspins) THEN
867 0 : DO i = 1, mspin
868 0 : ALLOCATE (rho_ao_im_out(i)%matrix)
869 0 : CALL dbcsr_copy(rho_ao_im_out(i)%matrix, rho_ao_im_in(1)%matrix, name="RHO copy")
870 0 : CALL dbcsr_scale(rho_ao_im_out(i)%matrix, ospin)
871 : END DO
872 : ELSE
873 0 : DO i = 1, nspins
874 0 : ALLOCATE (rho_ao_im_out(i)%matrix)
875 0 : CALL dbcsr_copy(rho_ao_im_out(i)%matrix, rho_ao_im_in(i)%matrix, name="RHO copy")
876 : END DO
877 : END IF
878 : END IF
879 :
880 : ! rho_r
881 16392 : IF (ASSOCIATED(rho_r_in)) THEN
882 16392 : nspins = SIZE(rho_r_in)
883 16392 : CPASSERT(mspin >= nspins)
884 68892 : ALLOCATE (rho_r_out(mspin))
885 16392 : CALL qs_rho_set(rho_output, rho_r=rho_r_out)
886 16392 : IF (mspin > nspins) THEN
887 3528 : DO i = 1, mspin
888 2352 : CALL auxbas_pw_pool%create_pw(rho_r_out(i))
889 2352 : CALL pw_copy(rho_r_in(1), rho_r_out(i))
890 3528 : CALL pw_scale(rho_r_out(i), ospin)
891 : END DO
892 : ELSE
893 32580 : DO i = 1, nspins
894 17364 : CALL auxbas_pw_pool%create_pw(rho_r_out(i))
895 32580 : CALL pw_copy(rho_r_in(i), rho_r_out(i))
896 : END DO
897 : END IF
898 : END IF
899 :
900 : ! rho_g
901 16392 : IF (ASSOCIATED(rho_g_in)) THEN
902 16392 : nspins = SIZE(rho_g_in)
903 16392 : CPASSERT(mspin >= nspins)
904 68892 : ALLOCATE (rho_g_out(mspin))
905 16392 : CALL qs_rho_set(rho_output, rho_g=rho_g_out)
906 16392 : IF (mspin > nspins) THEN
907 3528 : DO i = 1, mspin
908 2352 : CALL auxbas_pw_pool%create_pw(rho_g_out(i))
909 2352 : CALL pw_copy(rho_g_in(1), rho_g_out(i))
910 3528 : CALL pw_scale(rho_g_out(i), ospin)
911 : END DO
912 : ELSE
913 32580 : DO i = 1, nspins
914 17364 : CALL auxbas_pw_pool%create_pw(rho_g_out(i))
915 32580 : CALL pw_copy(rho_g_in(i), rho_g_out(i))
916 : END DO
917 : END IF
918 : END IF
919 :
920 : ! SCCS
921 16392 : IF (ASSOCIATED(rho_r_sccs_in)) THEN
922 0 : CALL qs_rho_set(rho_output, rho_r_sccs=rho_r_sccs_out)
923 0 : CALL auxbas_pw_pool%create_pw(rho_r_sccs_out)
924 0 : CALL pw_copy(rho_r_sccs_in, rho_r_sccs_out)
925 : END IF
926 :
927 : ! drho_r
928 16392 : IF (ASSOCIATED(drho_r_in)) THEN
929 0 : nspins = SIZE(drho_r_in)
930 0 : CPASSERT(mspin >= nspins)
931 0 : ALLOCATE (drho_r_out(3, mspin))
932 0 : CALL qs_rho_set(rho_output, drho_r=drho_r_out)
933 0 : IF (mspin > nspins) THEN
934 0 : DO j = 1, mspin
935 0 : DO i = 1, 3
936 0 : CALL auxbas_pw_pool%create_pw(drho_r_out(i, j))
937 0 : CALL pw_copy(drho_r_in(i, 1), drho_r_out(i, j))
938 0 : CALL pw_scale(drho_r_out(i, j), ospin)
939 : END DO
940 : END DO
941 : ELSE
942 0 : DO j = 1, nspins
943 0 : DO i = 1, 3
944 0 : CALL auxbas_pw_pool%create_pw(drho_r_out(i, j))
945 0 : CALL pw_copy(drho_r_in(i, j), drho_r_out(i, j))
946 : END DO
947 : END DO
948 : END IF
949 : END IF
950 :
951 : ! drho_g
952 16392 : IF (ASSOCIATED(drho_g_in)) THEN
953 0 : nspins = SIZE(drho_g_in)
954 0 : CPASSERT(mspin >= nspins)
955 0 : ALLOCATE (drho_g_out(3, mspin))
956 0 : CALL qs_rho_set(rho_output, drho_g=drho_g_out)
957 0 : IF (mspin > nspins) THEN
958 0 : DO j = 1, mspin
959 0 : DO i = 1, 3
960 0 : CALL auxbas_pw_pool%create_pw(drho_g_out(i, j))
961 0 : CALL pw_copy(drho_g_in(i, 1), drho_g_out(i, j))
962 0 : CALL pw_scale(drho_g_out(i, j), ospin)
963 : END DO
964 : END DO
965 : ELSE
966 0 : DO j = 1, nspins
967 0 : DO i = 1, 3
968 0 : CALL auxbas_pw_pool%create_pw(drho_g_out(i, j))
969 0 : CALL pw_copy(drho_g_in(i, j), drho_g_out(i, j))
970 : END DO
971 : END DO
972 : END IF
973 : END IF
974 :
975 : ! tau_r
976 16392 : IF (ASSOCIATED(tau_r_in)) THEN
977 0 : nspins = SIZE(tau_r_in)
978 0 : CPASSERT(mspin >= nspins)
979 0 : ALLOCATE (tau_r_out(mspin))
980 0 : CALL qs_rho_set(rho_output, tau_r=tau_r_out)
981 0 : IF (mspin > nspins) THEN
982 0 : DO i = 1, mspin
983 0 : CALL auxbas_pw_pool%create_pw(tau_r_out(i))
984 0 : CALL pw_copy(tau_r_in(1), tau_r_out(i))
985 0 : CALL pw_scale(tau_r_out(i), ospin)
986 : END DO
987 : ELSE
988 0 : DO i = 1, nspins
989 0 : CALL auxbas_pw_pool%create_pw(tau_r_out(i))
990 0 : CALL pw_copy(tau_r_in(i), tau_r_out(i))
991 : END DO
992 : END IF
993 : END IF
994 :
995 : ! tau_g
996 16392 : IF (ASSOCIATED(tau_g_in)) THEN
997 0 : nspins = SIZE(tau_g_in)
998 0 : CPASSERT(mspin >= nspins)
999 0 : ALLOCATE (tau_g_out(mspin))
1000 0 : CALL qs_rho_set(rho_output, tau_g=tau_g_out)
1001 0 : IF (mspin > nspins) THEN
1002 0 : DO i = 1, mspin
1003 0 : CALL auxbas_pw_pool%create_pw(tau_g_out(i))
1004 0 : CALL pw_copy(tau_g_in(1), tau_g_out(i))
1005 0 : CALL pw_scale(tau_g_out(i), ospin)
1006 : END DO
1007 : ELSE
1008 0 : DO i = 1, nspins
1009 0 : CALL auxbas_pw_pool%create_pw(tau_g_out(i))
1010 0 : CALL pw_copy(tau_g_in(i), tau_g_out(i))
1011 : END DO
1012 : END IF
1013 : END IF
1014 :
1015 : ! tot_rho_r
1016 16392 : IF (ASSOCIATED(tot_rho_r_in)) THEN
1017 16392 : nspins = SIZE(tot_rho_r_in)
1018 16392 : CPASSERT(mspin >= nspins)
1019 49176 : ALLOCATE (tot_rho_r_out(mspin))
1020 16392 : CALL qs_rho_set(rho_output, tot_rho_r=tot_rho_r_out)
1021 16392 : IF (mspin > nspins) THEN
1022 3528 : DO i = 1, mspin
1023 3528 : tot_rho_r_out(i) = tot_rho_r_in(1)*ospin
1024 : END DO
1025 : ELSE
1026 32580 : DO i = 1, nspins
1027 32580 : tot_rho_r_out(i) = tot_rho_r_in(i)
1028 : END DO
1029 : END IF
1030 : END IF
1031 :
1032 : ! tot_rho_g
1033 16392 : IF (ASSOCIATED(tot_rho_g_in)) THEN
1034 0 : nspins = SIZE(tot_rho_g_in)
1035 0 : CPASSERT(mspin >= nspins)
1036 0 : ALLOCATE (tot_rho_g_out(mspin))
1037 0 : CALL qs_rho_set(rho_output, tot_rho_g=tot_rho_g_out)
1038 0 : IF (mspin > nspins) THEN
1039 0 : DO i = 1, mspin
1040 0 : tot_rho_g_out(i) = tot_rho_g_in(1)*ospin
1041 : END DO
1042 : ELSE
1043 0 : DO i = 1, nspins
1044 0 : tot_rho_g_out(i) = tot_rho_g_in(i)
1045 : END DO
1046 : END IF
1047 : END IF
1048 :
1049 : CALL qs_rho_set(rho_output, &
1050 : rho_g_valid=rho_g_valid_in, &
1051 : rho_r_valid=rho_r_valid_in, &
1052 : drho_g_valid=drho_g_valid_in, &
1053 : drho_r_valid=drho_r_valid_in, &
1054 : tau_r_valid=tau_r_valid_in, &
1055 : tau_g_valid=tau_g_valid_in, &
1056 : soft_valid=soft_valid_in, &
1057 16392 : complex_rho_ao=complex_rho_ao)
1058 :
1059 16392 : CALL timestop(handle)
1060 :
1061 16392 : END SUBROUTINE qs_rho_copy
1062 :
1063 : ! **************************************************************************************************
1064 : !> \brief rhoa(2) = alpha*rhoa(2)+beta*rhob(1)
1065 : !> \param rhoa ...
1066 : !> \param rhob ...
1067 : !> \param alpha ...
1068 : !> \param beta ...
1069 : ! **************************************************************************************************
1070 48 : SUBROUTINE qs_rho_scale_and_add_b(rhoa, rhob, alpha, beta)
1071 :
1072 : TYPE(qs_rho_type), INTENT(IN) :: rhoa, rhob
1073 : REAL(KIND=dp), INTENT(IN) :: alpha, beta
1074 :
1075 : CHARACTER(len=*), PARAMETER :: routineN = 'qs_rho_scale_and_add_b'
1076 :
1077 : INTEGER :: handle
1078 48 : REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho_g_a, tot_rho_g_b, tot_rho_r_a, &
1079 48 : tot_rho_r_b
1080 48 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao_a, rho_ao_b, rho_ao_im_a, &
1081 48 : rho_ao_im_b
1082 48 : TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g_a, rho_g_b, tau_g_a, tau_g_b
1083 48 : TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER :: drho_g_a, drho_g_b
1084 48 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r_a, rho_r_b, tau_r_a, tau_r_b
1085 48 : TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER :: drho_r_a, drho_r_b
1086 : TYPE(pw_r3d_rs_type), POINTER :: rho_r_sccs_a, rho_r_sccs_b
1087 :
1088 48 : CALL timeset(routineN, handle)
1089 :
1090 48 : NULLIFY (rho_ao_a, rho_ao_im_a, rho_r_a, rho_g_a, drho_r_a, &
1091 48 : drho_g_a, tau_r_a, tau_g_a, tot_rho_r_a, tot_rho_g_a, rho_r_sccs_a)
1092 :
1093 : CALL qs_rho_get(rhoa, &
1094 : rho_ao=rho_ao_a, &
1095 : rho_ao_im=rho_ao_im_a, &
1096 : rho_r=rho_r_a, &
1097 : rho_g=rho_g_a, &
1098 : drho_r=drho_r_a, &
1099 : drho_g=drho_g_a, &
1100 : tau_r=tau_r_a, &
1101 : tau_g=tau_g_a, &
1102 : tot_rho_r=tot_rho_r_a, &
1103 : tot_rho_g=tot_rho_g_a, &
1104 48 : rho_r_sccs=rho_r_sccs_a)
1105 :
1106 48 : NULLIFY (rho_ao_b, rho_ao_im_b, rho_r_b, rho_g_b, drho_r_b, &
1107 48 : drho_g_b, tau_r_b, tau_g_b, tot_rho_r_b, tot_rho_g_b, rho_r_sccs_b)
1108 :
1109 : CALL qs_rho_get(rhob, &
1110 : rho_ao=rho_ao_b, &
1111 : rho_ao_im=rho_ao_im_b, &
1112 : rho_r=rho_r_b, &
1113 : rho_g=rho_g_b, &
1114 : drho_r=drho_r_b, &
1115 : drho_g=drho_g_b, &
1116 : tau_r=tau_r_b, &
1117 : tau_g=tau_g_b, &
1118 : tot_rho_r=tot_rho_r_b, &
1119 : tot_rho_g=tot_rho_g_b, &
1120 48 : rho_r_sccs=rho_r_sccs_b)
1121 : ! rho_ao
1122 48 : IF (ASSOCIATED(rho_ao_a) .AND. ASSOCIATED(rho_ao_b)) THEN
1123 48 : CALL dbcsr_add(rho_ao_a(2)%matrix, rho_ao_b(1)%matrix, alpha, beta)
1124 : END IF
1125 :
1126 : ! rho_ao_im
1127 48 : IF (ASSOCIATED(rho_ao_im_a) .AND. ASSOCIATED(rho_ao_im_b)) THEN
1128 0 : CALL dbcsr_add(rho_ao_im_a(2)%matrix, rho_ao_im_b(1)%matrix, alpha, beta)
1129 : END IF
1130 :
1131 : ! rho_r
1132 48 : IF (ASSOCIATED(rho_r_a) .AND. ASSOCIATED(rho_r_b)) THEN
1133 48 : CALL pw_axpy(rho_r_b(1), rho_r_a(2), beta, alpha)
1134 : END IF
1135 :
1136 : ! rho_g
1137 48 : IF (ASSOCIATED(rho_g_a) .AND. ASSOCIATED(rho_g_b)) THEN
1138 48 : CALL pw_axpy(rho_g_b(1), rho_g_a(2), beta, alpha)
1139 : END IF
1140 :
1141 : ! SCCS
1142 48 : IF (ASSOCIATED(rho_r_sccs_a) .AND. ASSOCIATED(rho_r_sccs_b)) THEN
1143 0 : CALL pw_axpy(rho_r_sccs_b, rho_r_sccs_a, beta, alpha)
1144 : END IF
1145 :
1146 : ! drho_r
1147 48 : IF (ASSOCIATED(drho_r_a) .AND. ASSOCIATED(drho_r_b)) THEN
1148 : CPASSERT(ASSOCIATED(drho_r_a) .AND. ASSOCIATED(drho_r_b)) ! not implemented
1149 : END IF
1150 :
1151 : ! drho_g
1152 48 : IF (ASSOCIATED(drho_g_a) .AND. ASSOCIATED(drho_g_b)) THEN
1153 : CPASSERT(ASSOCIATED(drho_g_a) .AND. ASSOCIATED(drho_g_b)) ! not implemented
1154 : END IF
1155 :
1156 : ! tau_r
1157 48 : IF (ASSOCIATED(tau_r_a) .AND. ASSOCIATED(tau_r_b)) THEN
1158 0 : CALL pw_axpy(tau_r_b(1), tau_r_a(2), beta, alpha)
1159 : END IF
1160 :
1161 : ! tau_g
1162 48 : IF (ASSOCIATED(tau_g_a) .AND. ASSOCIATED(tau_g_b)) THEN
1163 0 : CALL pw_axpy(tau_g_b(1), tau_g_a(2), beta, alpha)
1164 : END IF
1165 :
1166 : ! tot_rho_r
1167 48 : IF (ASSOCIATED(tot_rho_r_a) .AND. ASSOCIATED(tot_rho_r_b)) THEN
1168 0 : tot_rho_r_a(2) = alpha*tot_rho_r_a(2) + beta*tot_rho_r_b(1)
1169 : END IF
1170 :
1171 : ! tot_rho_g
1172 48 : IF (ASSOCIATED(tot_rho_g_a) .AND. ASSOCIATED(tot_rho_g_b)) THEN
1173 0 : tot_rho_g_a(2) = alpha*tot_rho_g_a(2) + beta*tot_rho_g_b(1)
1174 : END IF
1175 :
1176 48 : CALL timestop(handle)
1177 :
1178 48 : END SUBROUTINE qs_rho_scale_and_add_b
1179 :
1180 : ! **************************************************************************************************
1181 : !> \brief rhoa = alpha*rhoa+beta*rhob
1182 : !> \param rhoa ...
1183 : !> \param rhob ...
1184 : !> \param alpha ...
1185 : !> \param beta ...
1186 : ! **************************************************************************************************
1187 16272 : SUBROUTINE qs_rho_scale_and_add(rhoa, rhob, alpha, beta)
1188 :
1189 : TYPE(qs_rho_type), INTENT(IN) :: rhoa, rhob
1190 : REAL(KIND=dp), INTENT(IN) :: alpha, beta
1191 :
1192 : CHARACTER(len=*), PARAMETER :: routineN = 'qs_rho_scale_and_add'
1193 :
1194 : INTEGER :: handle, i, j, nspina, nspinb, nspins
1195 16272 : REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho_g_a, tot_rho_g_b, tot_rho_r_a, &
1196 16272 : tot_rho_r_b
1197 16272 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao_a, rho_ao_b, rho_ao_im_a, &
1198 16272 : rho_ao_im_b
1199 16272 : TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g_a, rho_g_b, tau_g_a, tau_g_b
1200 16272 : TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER :: drho_g_a, drho_g_b
1201 16272 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r_a, rho_r_b, tau_r_a, tau_r_b
1202 16272 : TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER :: drho_r_a, drho_r_b
1203 : TYPE(pw_r3d_rs_type), POINTER :: rho_r_sccs_a, rho_r_sccs_b
1204 :
1205 16272 : CALL timeset(routineN, handle)
1206 :
1207 16272 : NULLIFY (rho_ao_a, rho_ao_im_a, rho_r_a, rho_g_a, drho_r_a, &
1208 16272 : drho_g_a, tau_r_a, tau_g_a, tot_rho_r_a, tot_rho_g_a, rho_r_sccs_a)
1209 :
1210 : CALL qs_rho_get(rhoa, &
1211 : rho_ao=rho_ao_a, &
1212 : rho_ao_im=rho_ao_im_a, &
1213 : rho_r=rho_r_a, &
1214 : rho_g=rho_g_a, &
1215 : drho_r=drho_r_a, &
1216 : drho_g=drho_g_a, &
1217 : tau_r=tau_r_a, &
1218 : tau_g=tau_g_a, &
1219 : tot_rho_r=tot_rho_r_a, &
1220 : tot_rho_g=tot_rho_g_a, &
1221 16272 : rho_r_sccs=rho_r_sccs_a)
1222 :
1223 16272 : NULLIFY (rho_ao_b, rho_ao_im_b, rho_r_b, rho_g_b, drho_r_b, &
1224 16272 : drho_g_b, tau_r_b, tau_g_b, tot_rho_r_b, tot_rho_g_b, rho_r_sccs_b)
1225 :
1226 : CALL qs_rho_get(rhob, &
1227 : rho_ao=rho_ao_b, &
1228 : rho_ao_im=rho_ao_im_b, &
1229 : rho_r=rho_r_b, &
1230 : rho_g=rho_g_b, &
1231 : drho_r=drho_r_b, &
1232 : drho_g=drho_g_b, &
1233 : tau_r=tau_r_b, &
1234 : tau_g=tau_g_b, &
1235 : tot_rho_r=tot_rho_r_b, &
1236 : tot_rho_g=tot_rho_g_b, &
1237 16272 : rho_r_sccs=rho_r_sccs_b)
1238 : ! rho_ao
1239 16272 : IF (ASSOCIATED(rho_ao_a) .AND. ASSOCIATED(rho_ao_b)) THEN
1240 16272 : nspina = SIZE(rho_ao_a)
1241 16272 : nspinb = SIZE(rho_ao_b)
1242 16272 : nspins = MIN(nspina, nspinb)
1243 34596 : DO i = 1, nspins
1244 34596 : CALL dbcsr_add(rho_ao_a(i)%matrix, rho_ao_b(i)%matrix, alpha, beta)
1245 : END DO
1246 : END IF
1247 :
1248 : ! rho_ao_im
1249 16272 : IF (ASSOCIATED(rho_ao_im_a) .AND. ASSOCIATED(rho_ao_im_b)) THEN
1250 0 : nspina = SIZE(rho_ao_im_a)
1251 0 : nspinb = SIZE(rho_ao_im_b)
1252 0 : nspins = MIN(nspina, nspinb)
1253 0 : DO i = 1, nspins
1254 0 : CALL dbcsr_add(rho_ao_im_a(i)%matrix, rho_ao_im_b(i)%matrix, alpha, beta)
1255 : END DO
1256 : END IF
1257 :
1258 : ! rho_r
1259 16272 : IF (ASSOCIATED(rho_r_a) .AND. ASSOCIATED(rho_r_b)) THEN
1260 16272 : nspina = SIZE(rho_ao_a)
1261 16272 : nspinb = SIZE(rho_ao_b)
1262 16272 : nspins = MIN(nspina, nspinb)
1263 34596 : DO i = 1, nspins
1264 34596 : CALL pw_axpy(rho_r_b(i), rho_r_a(i), beta, alpha)
1265 : END DO
1266 : END IF
1267 :
1268 : ! rho_g
1269 16272 : IF (ASSOCIATED(rho_g_a) .AND. ASSOCIATED(rho_g_b)) THEN
1270 16272 : nspina = SIZE(rho_ao_a)
1271 16272 : nspinb = SIZE(rho_ao_b)
1272 16272 : nspins = MIN(nspina, nspinb)
1273 34596 : DO i = 1, nspins
1274 34596 : CALL pw_axpy(rho_g_b(i), rho_g_a(i), beta, alpha)
1275 : END DO
1276 : END IF
1277 :
1278 : ! SCCS
1279 16272 : IF (ASSOCIATED(rho_r_sccs_a) .AND. ASSOCIATED(rho_r_sccs_b)) THEN
1280 0 : CALL pw_axpy(rho_r_sccs_b, rho_r_sccs_a, beta, alpha)
1281 : END IF
1282 :
1283 : ! drho_r
1284 16272 : IF (ASSOCIATED(drho_r_a) .AND. ASSOCIATED(drho_r_b)) THEN
1285 0 : CPASSERT(ALL(SHAPE(drho_r_a) == SHAPE(drho_r_b))) ! not implemented
1286 0 : DO j = 1, SIZE(drho_r_a, 2)
1287 0 : DO i = 1, SIZE(drho_r_a, 1)
1288 0 : CALL pw_axpy(drho_r_b(i, j), drho_r_a(i, j), beta, alpha)
1289 : END DO
1290 : END DO
1291 : END IF
1292 :
1293 : ! drho_g
1294 16272 : IF (ASSOCIATED(drho_g_a) .AND. ASSOCIATED(drho_g_b)) THEN
1295 0 : CPASSERT(ALL(SHAPE(drho_g_a) == SHAPE(drho_g_b))) ! not implemented
1296 0 : DO j = 1, SIZE(drho_g_a, 2)
1297 0 : DO i = 1, SIZE(drho_g_a, 1)
1298 0 : CALL pw_axpy(drho_g_b(i, j), drho_g_a(i, j), beta, alpha)
1299 : END DO
1300 : END DO
1301 : END IF
1302 :
1303 : ! tau_r
1304 16272 : IF (ASSOCIATED(tau_r_a) .AND. ASSOCIATED(tau_r_b)) THEN
1305 0 : nspina = SIZE(rho_ao_a)
1306 0 : nspinb = SIZE(rho_ao_b)
1307 0 : nspins = MIN(nspina, nspinb)
1308 0 : DO i = 1, nspins
1309 0 : CALL pw_axpy(tau_r_b(i), tau_r_a(i), beta, alpha)
1310 : END DO
1311 : END IF
1312 :
1313 : ! tau_g
1314 16272 : IF (ASSOCIATED(tau_g_a) .AND. ASSOCIATED(tau_g_b)) THEN
1315 0 : nspina = SIZE(rho_ao_a)
1316 0 : nspinb = SIZE(rho_ao_b)
1317 0 : nspins = MIN(nspina, nspinb)
1318 0 : DO i = 1, nspins
1319 0 : CALL pw_axpy(tau_g_b(i), tau_g_a(i), beta, alpha)
1320 : END DO
1321 : END IF
1322 :
1323 : ! tot_rho_r
1324 16272 : IF (ASSOCIATED(tot_rho_r_a) .AND. ASSOCIATED(tot_rho_r_b)) THEN
1325 576 : nspina = SIZE(rho_ao_a)
1326 576 : nspinb = SIZE(rho_ao_b)
1327 576 : nspins = MIN(nspina, nspinb)
1328 1476 : DO i = 1, nspins
1329 1476 : tot_rho_r_a(i) = alpha*tot_rho_r_a(i) + beta*tot_rho_r_b(i)
1330 : END DO
1331 : END IF
1332 :
1333 : ! tot_rho_g
1334 16272 : IF (ASSOCIATED(tot_rho_g_a) .AND. ASSOCIATED(tot_rho_g_b)) THEN
1335 0 : nspina = SIZE(rho_ao_a)
1336 0 : nspinb = SIZE(rho_ao_b)
1337 0 : nspins = MIN(nspina, nspinb)
1338 0 : DO i = 1, nspins
1339 0 : tot_rho_g_a(i) = alpha*tot_rho_g_a(i) + beta*tot_rho_g_b(i)
1340 : END DO
1341 : END IF
1342 :
1343 16272 : CALL timestop(handle)
1344 :
1345 16272 : END SUBROUTINE qs_rho_scale_and_add
1346 :
1347 : ! **************************************************************************************************
1348 : !> \brief Duplicates a pointer physically
1349 : !> \param rho_input The rho structure to be duplicated
1350 : !> \param rho_output The duplicate rho structure
1351 : !> \param qs_env The QS environment from which the auxiliary PW basis-set
1352 : !> pool is taken
1353 : !> \par History
1354 : !> 07.2005 initial create [tdk]
1355 : !> \author Thomas D. Kuehne (tkuehne@phys.chem.ethz.ch)
1356 : !> \note
1357 : !> Associated pointers are deallocated, nullified pointers are NOT accepted!
1358 : ! **************************************************************************************************
1359 8 : SUBROUTINE duplicate_rho_type(rho_input, rho_output, qs_env)
1360 :
1361 : TYPE(qs_rho_type), INTENT(INOUT) :: rho_input, rho_output
1362 : TYPE(qs_environment_type), POINTER :: qs_env
1363 :
1364 : CHARACTER(len=*), PARAMETER :: routineN = 'duplicate_rho_type'
1365 :
1366 : INTEGER :: handle, i, j, nspins
1367 : LOGICAL :: complex_rho_ao_in, drho_g_valid_in, drho_r_valid_in, rho_g_valid_in, &
1368 : rho_r_valid_in, soft_valid_in, tau_g_valid_in, tau_r_valid_in
1369 4 : REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho_g_in, tot_rho_g_out, &
1370 4 : tot_rho_r_in, tot_rho_r_out
1371 4 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao_im_in, rho_ao_im_out, rho_ao_in, &
1372 4 : rho_ao_out
1373 : TYPE(dft_control_type), POINTER :: dft_control
1374 4 : TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g_in, rho_g_out, tau_g_in, tau_g_out
1375 4 : TYPE(pw_c1d_gs_type), DIMENSION(:, :), POINTER :: drho_g_in, drho_g_out
1376 : TYPE(pw_env_type), POINTER :: pw_env
1377 : TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1378 4 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r_in, rho_r_out, tau_r_in, tau_r_out
1379 4 : TYPE(pw_r3d_rs_type), DIMENSION(:, :), POINTER :: drho_r_in, drho_r_out
1380 : TYPE(pw_r3d_rs_type), POINTER :: rho_r_sccs_in, rho_r_sccs_out
1381 :
1382 4 : CALL timeset(routineN, handle)
1383 :
1384 4 : NULLIFY (dft_control, pw_env, auxbas_pw_pool)
1385 4 : NULLIFY (rho_ao_in, rho_ao_out, rho_ao_im_in, rho_ao_im_out)
1386 4 : NULLIFY (rho_r_in, rho_r_out, rho_g_in, rho_g_out, drho_r_in, drho_r_out)
1387 4 : NULLIFY (drho_g_in, drho_g_out, tau_r_in, tau_r_out, tau_g_in, tau_g_out)
1388 4 : NULLIFY (tot_rho_r_in, tot_rho_r_out, tot_rho_g_in, tot_rho_g_out)
1389 4 : NULLIFY (rho_r_sccs_in, rho_r_sccs_out)
1390 :
1391 4 : CPASSERT(ASSOCIATED(qs_env))
1392 :
1393 4 : CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, dft_control=dft_control)
1394 4 : CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool)
1395 4 : nspins = dft_control%nspins
1396 :
1397 4 : CALL qs_rho_clear(rho_output)
1398 :
1399 : CALL qs_rho_get(rho_input, &
1400 : rho_ao=rho_ao_in, &
1401 : rho_ao_im=rho_ao_im_in, &
1402 : rho_r=rho_r_in, &
1403 : rho_g=rho_g_in, &
1404 : drho_r=drho_r_in, &
1405 : drho_g=drho_g_in, &
1406 : tau_r=tau_r_in, &
1407 : tau_g=tau_g_in, &
1408 : tot_rho_r=tot_rho_r_in, &
1409 : tot_rho_g=tot_rho_g_in, &
1410 : rho_g_valid=rho_g_valid_in, &
1411 : rho_r_valid=rho_r_valid_in, &
1412 : drho_g_valid=drho_g_valid_in, &
1413 : drho_r_valid=drho_r_valid_in, &
1414 : tau_r_valid=tau_r_valid_in, &
1415 : tau_g_valid=tau_g_valid_in, &
1416 : rho_r_sccs=rho_r_sccs_in, &
1417 : soft_valid=soft_valid_in, &
1418 4 : complex_rho_ao=complex_rho_ao_in)
1419 :
1420 : ! rho_ao
1421 4 : IF (ASSOCIATED(rho_ao_in)) THEN
1422 4 : CALL dbcsr_allocate_matrix_set(rho_ao_out, nspins)
1423 4 : CALL qs_rho_set(rho_output, rho_ao=rho_ao_out)
1424 8 : DO i = 1, nspins
1425 4 : ALLOCATE (rho_ao_out(i)%matrix)
1426 : CALL dbcsr_copy(rho_ao_out(i)%matrix, rho_ao_in(i)%matrix, &
1427 4 : name="myDensityMatrix_for_Spin_"//TRIM(ADJUSTL(cp_to_string(i))))
1428 8 : CALL dbcsr_set(rho_ao_out(i)%matrix, 0.0_dp)
1429 : END DO
1430 : END IF
1431 :
1432 : ! rho_ao_im
1433 4 : IF (ASSOCIATED(rho_ao_im_in)) THEN
1434 0 : CALL dbcsr_allocate_matrix_set(rho_ao_im_out, nspins)
1435 0 : CALL qs_rho_set(rho_output, rho_ao=rho_ao_im_out)
1436 0 : DO i = 1, nspins
1437 0 : ALLOCATE (rho_ao_im_out(i)%matrix)
1438 : CALL dbcsr_copy(rho_ao_im_out(i)%matrix, rho_ao_im_in(i)%matrix, &
1439 0 : name="myImagDensityMatrix_for_Spin_"//TRIM(ADJUSTL(cp_to_string(i))))
1440 0 : CALL dbcsr_set(rho_ao_im_out(i)%matrix, 0.0_dp)
1441 : END DO
1442 : END IF
1443 :
1444 : ! rho_r
1445 4 : IF (ASSOCIATED(rho_r_in)) THEN
1446 16 : ALLOCATE (rho_r_out(nspins))
1447 4 : CALL qs_rho_set(rho_output, rho_r=rho_r_out)
1448 8 : DO i = 1, nspins
1449 4 : CALL auxbas_pw_pool%create_pw(rho_r_out(i))
1450 8 : CALL pw_copy(rho_r_in(i), rho_r_out(i))
1451 : END DO
1452 : END IF
1453 :
1454 : ! rho_g
1455 4 : IF (ASSOCIATED(rho_g_in)) THEN
1456 16 : ALLOCATE (rho_g_out(nspins))
1457 4 : CALL qs_rho_set(rho_output, rho_g=rho_g_out)
1458 8 : DO i = 1, nspins
1459 4 : CALL auxbas_pw_pool%create_pw(rho_g_out(i))
1460 8 : CALL pw_copy(rho_g_in(i), rho_g_out(i))
1461 : END DO
1462 : END IF
1463 :
1464 : ! SCCS
1465 4 : IF (ASSOCIATED(rho_r_sccs_in)) THEN
1466 0 : CALL qs_rho_set(rho_output, rho_r_sccs=rho_r_sccs_out)
1467 0 : CALL auxbas_pw_pool%create_pw(rho_r_sccs_out)
1468 0 : CALL pw_copy(rho_r_sccs_in, rho_r_sccs_out)
1469 : END IF
1470 :
1471 : ! drho_r and drho_g are only needed if calculated by collocation
1472 4 : IF (dft_control%drho_by_collocation) THEN
1473 : ! drho_r
1474 0 : IF (ASSOCIATED(drho_r_in)) THEN
1475 0 : ALLOCATE (drho_r_out(3, nspins))
1476 0 : CALL qs_rho_set(rho_output, drho_r=drho_r_out)
1477 0 : DO j = 1, nspins
1478 0 : DO i = 1, 3
1479 0 : CALL auxbas_pw_pool%create_pw(drho_r_out(i, j))
1480 0 : CALL pw_copy(drho_r_in(i, j), drho_r_out(i, j))
1481 : END DO
1482 : END DO
1483 : END IF
1484 :
1485 : ! drho_g
1486 0 : IF (ASSOCIATED(drho_g_in)) THEN
1487 0 : ALLOCATE (drho_g_out(3, nspins))
1488 0 : CALL qs_rho_set(rho_output, drho_g=drho_g_out)
1489 0 : DO j = 1, nspins
1490 0 : DO i = 1, 3
1491 0 : CALL auxbas_pw_pool%create_pw(drho_g_out(i, j))
1492 0 : CALL pw_copy(drho_g_in(i, j), drho_g_out(i, j))
1493 : END DO
1494 : END DO
1495 : END IF
1496 : END IF
1497 :
1498 : ! tau_r and tau_g are only needed in the case of Meta-GGA XC-functionals
1499 : ! are used. Therefore they are only allocated if
1500 : ! dft_control%use_kinetic_energy_density is true
1501 4 : IF (dft_control%use_kinetic_energy_density) THEN
1502 : ! tau_r
1503 0 : IF (ASSOCIATED(tau_r_in)) THEN
1504 0 : ALLOCATE (tau_r_out(nspins))
1505 0 : CALL qs_rho_set(rho_output, tau_r=tau_r_out)
1506 0 : DO i = 1, nspins
1507 0 : CALL auxbas_pw_pool%create_pw(tau_r_out(i))
1508 0 : CALL pw_copy(tau_r_in(i), tau_r_out(i))
1509 : END DO
1510 : END IF
1511 :
1512 : ! tau_g
1513 0 : IF (ASSOCIATED(tau_g_in)) THEN
1514 0 : ALLOCATE (tau_g_out(nspins))
1515 0 : CALL qs_rho_set(rho_output, tau_g=tau_g_out)
1516 0 : DO i = 1, nspins
1517 0 : CALL auxbas_pw_pool%create_pw(tau_g_out(i))
1518 0 : CALL pw_copy(tau_g_in(i), tau_g_out(i))
1519 : END DO
1520 : END IF
1521 : END IF
1522 :
1523 : CALL qs_rho_set(rho_output, &
1524 : rho_g_valid=rho_g_valid_in, &
1525 : rho_r_valid=rho_r_valid_in, &
1526 : drho_g_valid=drho_g_valid_in, &
1527 : drho_r_valid=drho_r_valid_in, &
1528 : tau_r_valid=tau_r_valid_in, &
1529 : tau_g_valid=tau_g_valid_in, &
1530 : soft_valid=soft_valid_in, &
1531 4 : complex_rho_ao=complex_rho_ao_in)
1532 :
1533 : ! tot_rho_r
1534 4 : IF (ASSOCIATED(tot_rho_r_in)) THEN
1535 12 : ALLOCATE (tot_rho_r_out(nspins))
1536 4 : CALL qs_rho_set(rho_output, tot_rho_r=tot_rho_r_out)
1537 8 : DO i = 1, nspins
1538 8 : tot_rho_r_out(i) = tot_rho_r_in(i)
1539 : END DO
1540 : END IF
1541 :
1542 : ! tot_rho_g
1543 4 : IF (ASSOCIATED(tot_rho_g_in)) THEN
1544 0 : ALLOCATE (tot_rho_g_out(nspins))
1545 0 : CALL qs_rho_set(rho_output, tot_rho_g=tot_rho_g_out)
1546 0 : DO i = 1, nspins
1547 0 : tot_rho_g_out(i) = tot_rho_g_in(i)
1548 : END DO
1549 :
1550 : END IF
1551 :
1552 4 : CALL timestop(handle)
1553 :
1554 4 : END SUBROUTINE duplicate_rho_type
1555 :
1556 : ! **************************************************************************************************
1557 : !> \brief (Re-)allocates rho_ao_im from real part rho_ao
1558 : !> \param rho ...
1559 : !> \param qs_env ...
1560 : ! **************************************************************************************************
1561 100 : SUBROUTINE allocate_rho_ao_imag_from_real(rho, qs_env)
1562 : TYPE(qs_rho_type), POINTER :: rho
1563 : TYPE(qs_environment_type), POINTER :: qs_env
1564 :
1565 : CHARACTER(LEN=default_string_length) :: headline
1566 : INTEGER :: i, ic, nimages, nspins
1567 100 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_im_kp, rho_ao_kp
1568 : TYPE(dbcsr_type), POINTER :: template
1569 : TYPE(dft_control_type), POINTER :: dft_control
1570 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
1571 100 : POINTER :: sab_orb
1572 :
1573 100 : NULLIFY (rho_ao_im_kp, rho_ao_kp, dft_control, template, sab_orb)
1574 :
1575 : CALL get_qs_env(qs_env, &
1576 : dft_control=dft_control, &
1577 100 : sab_orb=sab_orb)
1578 :
1579 100 : CALL qs_rho_get(rho, rho_ao_im_kp=rho_ao_im_kp, rho_ao_kp=rho_ao_kp)
1580 :
1581 100 : nspins = dft_control%nspins
1582 100 : nimages = dft_control%nimages
1583 :
1584 100 : CPASSERT(nspins == SIZE(rho_ao_kp, 1))
1585 100 : CPASSERT(nimages == SIZE(rho_ao_kp, 2))
1586 :
1587 100 : CALL dbcsr_allocate_matrix_set(rho_ao_im_kp, nspins, nimages)
1588 100 : CALL qs_rho_set(rho, rho_ao_im_kp=rho_ao_im_kp)
1589 216 : DO i = 1, nspins
1590 332 : DO ic = 1, nimages
1591 116 : IF (nspins > 1) THEN
1592 32 : IF (i == 1) THEN
1593 16 : headline = "IMAGINARY PART OF DENSITY MATRIX FOR ALPHA SPIN"
1594 : ELSE
1595 16 : headline = "IMAGINARY PART OF DENSITY MATRIX FOR BETA SPIN"
1596 : END IF
1597 : ELSE
1598 84 : headline = "IMAGINARY PART OF DENSITY MATRIX"
1599 : END IF
1600 116 : ALLOCATE (rho_ao_im_kp(i, ic)%matrix)
1601 116 : template => rho_ao_kp(i, ic)%matrix ! base on real part, but anti-symmetric
1602 : CALL dbcsr_create(matrix=rho_ao_im_kp(i, ic)%matrix, template=template, &
1603 116 : name=TRIM(headline), matrix_type=dbcsr_type_antisymmetric)
1604 116 : CALL cp_dbcsr_alloc_block_from_nbl(rho_ao_im_kp(i, ic)%matrix, sab_orb)
1605 232 : CALL dbcsr_set(rho_ao_im_kp(i, ic)%matrix, 0.0_dp)
1606 : END DO
1607 : END DO
1608 :
1609 100 : END SUBROUTINE allocate_rho_ao_imag_from_real
1610 :
1611 : END MODULE qs_rho_methods
|