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 module that builds the second order perturbation kernel
10 : !> kpp1 = delta_rho|_P delta_rho|_P E drho(P1) drho
11 : !> \par History
12 : !> 07.2002 created [fawzi]
13 : !> \author Fawzi Mohamed
14 : ! **************************************************************************************************
15 : MODULE qs_kpp1_env_methods
16 : USE admm_types, ONLY: admm_type,&
17 : get_admm_env
18 : USE atomic_kind_types, ONLY: atomic_kind_type
19 : USE cp_control_types, ONLY: dft_control_type
20 : USE cp_dbcsr_api, ONLY: dbcsr_add,&
21 : dbcsr_copy,&
22 : dbcsr_p_type,&
23 : dbcsr_set
24 : USE cp_dbcsr_operations, ONLY: dbcsr_allocate_matrix_set
25 : USE cp_log_handling, ONLY: cp_to_string
26 : USE hartree_local_methods, ONLY: Vh_1c_gg_integrals
27 : USE input_constants, ONLY: do_admm_aux_exch_func_none
28 : USE input_section_types, ONLY: section_vals_type
29 : USE kahan_sum, ONLY: accurate_sum
30 : USE kinds, ONLY: dp
31 : USE lri_environment_types, ONLY: lri_density_type,&
32 : lri_environment_type,&
33 : lri_kind_type
34 : USE lri_ks_methods, ONLY: calculate_lri_ks_matrix
35 : USE message_passing, ONLY: mp_para_env_type
36 : USE pw_env_types, ONLY: pw_env_get,&
37 : pw_env_type
38 : USE pw_methods, ONLY: pw_axpy,&
39 : pw_copy,&
40 : pw_integrate_function,&
41 : pw_scale,&
42 : pw_transfer,&
43 : pw_zero
44 : USE pw_poisson_methods, ONLY: pw_poisson_solve
45 : USE pw_poisson_types, ONLY: pw_poisson_type
46 : USE pw_pool_types, ONLY: pw_pool_type
47 : USE pw_types, ONLY: pw_c1d_gs_type,&
48 : pw_r3d_rs_type
49 : USE qs_environment_types, ONLY: get_qs_env,&
50 : qs_environment_type
51 : USE qs_fxc, ONLY: qs_fxc_apply,&
52 : qs_fxc_prep
53 : USE qs_gapw_densities, ONLY: prepare_gapw_den
54 : USE qs_integrate_potential, ONLY: integrate_v_rspace,&
55 : integrate_v_rspace_diagonal,&
56 : integrate_v_rspace_one_center
57 : USE qs_kpp1_env_types, ONLY: qs_kpp1_env_type
58 : USE qs_ks_atom, ONLY: update_ks_atom
59 : USE qs_p_env_types, ONLY: qs_p_env_type
60 : USE qs_rho0_ggrid, ONLY: integrate_vhg0_rspace
61 : USE qs_rho_atom_types, ONLY: rho_atom_type
62 : USE qs_rho_types, ONLY: qs_rho_get,&
63 : qs_rho_type
64 : #include "./base/base_uses.f90"
65 :
66 : IMPLICIT NONE
67 :
68 : PRIVATE
69 :
70 : LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
71 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_kpp1_env_methods'
72 :
73 : PUBLIC :: kpp1_create, kpp1_check_i_alloc, calc_kpp1
74 :
75 : CONTAINS
76 :
77 : ! **************************************************************************************************
78 : !> \brief allocates and initializes a kpp1_env
79 : !> \param kpp1_env the environment to initialize
80 : !> \par History
81 : !> 07.2002 created [fawzi]
82 : !> \author Fawzi Mohamed
83 : ! **************************************************************************************************
84 1848 : SUBROUTINE kpp1_create(kpp1_env)
85 : TYPE(qs_kpp1_env_type) :: kpp1_env
86 :
87 1848 : NULLIFY (kpp1_env%v_ao)
88 :
89 1848 : END SUBROUTINE kpp1_create
90 :
91 : ! **************************************************************************************************
92 : !> \brief ...
93 : !> \param rho1_xc ...
94 : !> \param rho1 ...
95 : !> \param xc_section ...
96 : !> \param lrigpw ...
97 : !> \param qs_env ...
98 : !> \param p_env ...
99 : !> \param calc_forces ...
100 : !> \param calc_virial ...
101 : !> \param virial ...
102 : ! **************************************************************************************************
103 1784 : SUBROUTINE calc_kpp1(rho1_xc, rho1, xc_section, lrigpw, qs_env, p_env, &
104 : calc_forces, calc_virial, virial)
105 :
106 : TYPE(qs_rho_type), POINTER :: rho1_xc, rho1
107 : TYPE(section_vals_type), POINTER :: xc_section
108 : LOGICAL, INTENT(IN) :: lrigpw
109 : TYPE(qs_environment_type), POINTER :: qs_env
110 : TYPE(qs_p_env_type) :: p_env
111 : LOGICAL, INTENT(IN), OPTIONAL :: calc_forces, calc_virial
112 : REAL(KIND=dp), DIMENSION(3, 3), INTENT(INOUT), &
113 : OPTIONAL :: virial
114 :
115 : CHARACTER(len=*), PARAMETER :: routineN = 'calc_kpp1'
116 :
117 : INTEGER :: handle, ikind, ispin, nkind, ns, nspins
118 : LOGICAL :: do_onecenter, gapw, gapw_xc, &
119 : my_calc_forces
120 : REAL(KIND=dp) :: alpha, energy_hartree, energy_hartree_1c
121 1784 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
122 1784 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: k1mat, rho_ao
123 1784 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: ksmat, psmat
124 : TYPE(dft_control_type), POINTER :: dft_control
125 : TYPE(lri_density_type), POINTER :: lri_density
126 : TYPE(lri_environment_type), POINTER :: lri_env
127 1784 : TYPE(lri_kind_type), DIMENSION(:), POINTER :: lri_v_int
128 : TYPE(mp_para_env_type), POINTER :: para_env
129 : TYPE(pw_c1d_gs_type) :: rho1_tot_gspace
130 1784 : TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho1_g
131 : TYPE(pw_env_type), POINTER :: pw_env
132 : TYPE(pw_poisson_type), POINTER :: poisson_env
133 : TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
134 : TYPE(pw_r3d_rs_type) :: v_hartree_rspace
135 1784 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: v_rspace_new, v_xc, v_xc_tau
136 : TYPE(qs_kpp1_env_type), POINTER :: kpp1_env
137 : TYPE(qs_rho_type), POINTER :: rho, rho0_fxc, rho1_fxc
138 1784 : TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho1_atom_set, rho_atom_set
139 :
140 1784 : CALL timeset(routineN, handle)
141 :
142 1784 : CPASSERT(ASSOCIATED(p_env%kpp1))
143 1784 : CPASSERT(ASSOCIATED(p_env%kpp1_env))
144 1784 : CPASSERT(ASSOCIATED(rho1))
145 :
146 1784 : my_calc_forces = .FALSE.
147 1784 : IF (PRESENT(calc_forces)) my_calc_forces = calc_forces
148 :
149 : CALL get_qs_env(qs_env, &
150 : pw_env=pw_env, &
151 : dft_control=dft_control, &
152 : para_env=para_env, &
153 1784 : rho=rho)
154 :
155 1784 : IF (lrigpw) THEN
156 : CALL get_qs_env(qs_env, &
157 : lri_env=lri_env, &
158 : lri_density=lri_density, &
159 0 : atomic_kind_set=atomic_kind_set)
160 : END IF
161 :
162 1784 : gapw = dft_control%qs_control%gapw
163 1784 : gapw_xc = dft_control%qs_control%gapw_xc
164 1784 : IF (gapw_xc) THEN
165 0 : CPASSERT(ASSOCIATED(rho1_xc))
166 : END IF
167 1784 : do_onecenter = gapw .OR. gapw_xc
168 1784 : nspins = dft_control%nspins
169 :
170 1784 : kpp1_env => p_env%kpp1_env
171 1784 : CALL kpp1_check_i_alloc(kpp1_env, qs_env, xc_section)
172 :
173 1784 : CALL qs_rho_get(rho, rho_ao=rho_ao)
174 1784 : CALL qs_rho_get(rho1, rho_g=rho1_g)
175 :
176 : ! gets the tmp grids
177 1784 : CPASSERT(ASSOCIATED(pw_env))
178 : CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
179 1784 : poisson_env=poisson_env)
180 1784 : CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
181 :
182 1784 : IF (gapw .OR. gapw_xc) THEN
183 0 : CALL prepare_gapw_den(qs_env, p_env%local_rho_set, do_rho0=(.NOT. gapw_xc))
184 : END IF
185 :
186 : ! *** calculate the hartree potential on the total density ***
187 1784 : CALL auxbas_pw_pool%create_pw(rho1_tot_gspace)
188 1784 : CALL pw_zero(rho1_tot_gspace)
189 4118 : DO ispin = 1, nspins
190 4118 : CALL pw_axpy(rho1_g(ispin), rho1_tot_gspace)
191 : END DO
192 1784 : IF (gapw) THEN
193 0 : CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rho0_s_gs, rho1_tot_gspace)
194 0 : IF (ASSOCIATED(p_env%local_rho_set%rho0_mpole%rhoz_cneo_s_gs)) THEN
195 0 : CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rhoz_cneo_s_gs, rho1_tot_gspace)
196 : END IF
197 : END IF
198 : !
199 : BLOCK
200 : TYPE(pw_c1d_gs_type) :: v_hartree_gspace
201 1784 : CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
202 : CALL pw_poisson_solve(poisson_env, rho1_tot_gspace, &
203 : energy_hartree, &
204 1784 : v_hartree_gspace)
205 1784 : CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
206 1784 : CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
207 : END BLOCK
208 : !
209 1784 : CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
210 :
211 1784 : CALL auxbas_pw_pool%give_back_pw(rho1_tot_gspace)
212 :
213 : ! *** calculate the xc potential ***
214 1784 : NULLIFY (v_xc, v_xc_tau)
215 1784 : IF (gapw_xc) THEN
216 0 : CALL get_qs_env(qs_env, rho_xc=rho0_fxc)
217 0 : rho1_fxc => rho1_xc
218 : ELSE
219 1784 : CALL get_qs_env(qs_env, rho=rho0_fxc)
220 1784 : rho1_fxc => rho1
221 : END IF
222 :
223 1784 : NULLIFY (rho_atom_set, rho1_atom_set)
224 1784 : IF (do_onecenter) THEN
225 0 : CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
226 0 : rho1_atom_set => p_env%local_rho_set%rho_atom_set
227 : END IF
228 : CALL qs_fxc_apply(qs_env, kpp1_env%deriv_set, kpp1_env%rho_set, &
229 : rho1_fxc, rho_atom_set, xc_section, &
230 : do_onecenter, v_xc, v_xc_tau, rho1_atom_set, &
231 1784 : compute_virial=calc_virial, virial_xc=virial)
232 :
233 4118 : DO ispin = 1, nspins
234 4118 : CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
235 : END DO
236 1784 : v_rspace_new => v_xc
237 1784 : IF (SIZE(v_xc) /= nspins) THEN
238 0 : CALL auxbas_pw_pool%give_back_pw(v_xc(2))
239 : END IF
240 1784 : NULLIFY (v_xc)
241 1784 : IF (ASSOCIATED(v_xc_tau)) THEN
242 616 : DO ispin = 1, nspins
243 616 : CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
244 : END DO
245 244 : IF (SIZE(v_xc_tau) /= nspins) THEN
246 0 : CALL auxbas_pw_pool%give_back_pw(v_xc_tau(2))
247 : END IF
248 : END IF
249 :
250 1784 : alpha = 1.0_dp
251 1784 : IF (nspins == 1) alpha = 2.0_dp
252 :
253 : !-------------------------------!
254 : ! Add both hartree and xc terms !
255 : !-------------------------------!
256 4118 : DO ispin = 1, nspins
257 2334 : CALL dbcsr_set(kpp1_env%v_ao(ispin)%matrix, 0.0_dp)
258 :
259 2334 : IF (gapw_xc) THEN
260 : ! XC and Hartree are integrated separatedly
261 : ! XC uses the soft basis set only
262 : CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
263 : pmat=rho_ao(ispin), &
264 : hmat=kpp1_env%v_ao(ispin), &
265 : qs_env=qs_env, &
266 0 : calculate_forces=my_calc_forces, gapw=gapw_xc)
267 0 : IF (ASSOCIATED(v_xc_tau)) THEN
268 : CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
269 : pmat=rho_ao(ispin), &
270 : hmat=kpp1_env%v_ao(ispin), &
271 : qs_env=qs_env, &
272 : compute_tau=.TRUE., &
273 0 : calculate_forces=my_calc_forces, gapw=gapw_xc)
274 : END IF
275 : ! add Hartree for SINGLETS
276 0 : CALL pw_copy(v_hartree_rspace, v_rspace_new(1))
277 : CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
278 : pmat=rho_ao(ispin), &
279 : hmat=kpp1_env%v_ao(ispin), &
280 : qs_env=qs_env, &
281 0 : calculate_forces=my_calc_forces, gapw=gapw)
282 : ELSE
283 2334 : CALL pw_axpy(v_hartree_rspace, v_rspace_new(ispin))
284 2334 : IF (lrigpw) THEN
285 0 : IF (ASSOCIATED(v_xc_tau)) CPABORT("Meta-GGA functionals not supported with LRI!")
286 :
287 0 : lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
288 0 : CALL get_qs_env(qs_env, nkind=nkind)
289 0 : DO ikind = 1, nkind
290 0 : lri_v_int(ikind)%v_int = 0.0_dp
291 : END DO
292 : CALL integrate_v_rspace_one_center(v_rspace_new(ispin), qs_env, &
293 0 : lri_v_int, .FALSE., "LRI_AUX")
294 0 : DO ikind = 1, nkind
295 0 : CALL para_env%sum(lri_v_int(ikind)%v_int)
296 : END DO
297 0 : ALLOCATE (k1mat(1))
298 0 : k1mat(1)%matrix => kpp1_env%v_ao(ispin)%matrix
299 0 : IF (lri_env%exact_1c_terms) THEN
300 : CALL integrate_v_rspace_diagonal(v_rspace_new(ispin), k1mat(1)%matrix, &
301 0 : rho_ao(ispin)%matrix, qs_env, my_calc_forces, "ORB")
302 : END IF
303 0 : CALL calculate_lri_ks_matrix(lri_env, lri_v_int, k1mat, atomic_kind_set)
304 0 : DEALLOCATE (k1mat)
305 : ELSE
306 : CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
307 : pmat=rho_ao(ispin), &
308 : hmat=kpp1_env%v_ao(ispin), &
309 : qs_env=qs_env, &
310 2334 : calculate_forces=my_calc_forces, gapw=gapw)
311 2334 : IF (ASSOCIATED(v_xc_tau)) THEN
312 : CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
313 : pmat=rho_ao(ispin), &
314 : hmat=kpp1_env%v_ao(ispin), &
315 : qs_env=qs_env, &
316 : compute_tau=.TRUE., &
317 372 : calculate_forces=my_calc_forces, gapw=gapw)
318 : END IF
319 : END IF
320 : END IF
321 :
322 4118 : CALL dbcsr_add(p_env%kpp1(ispin)%matrix, kpp1_env%v_ao(ispin)%matrix, 1.0_dp, alpha)
323 : END DO
324 :
325 1784 : IF (gapw) THEN
326 : CALL Vh_1c_gg_integrals(qs_env, energy_hartree_1c, &
327 : p_env%hartree_local%ecoul_1c, &
328 : p_env%local_rho_set, &
329 0 : para_env, tddft=.TRUE., core_2nd=.TRUE.)
330 : CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace, para_env, &
331 : calculate_forces=my_calc_forces, &
332 0 : local_rho_set=p_env%local_rho_set)
333 : ! *** Add single atom contributions to the KS matrix ***
334 : ! remap pointer
335 0 : ns = SIZE(p_env%kpp1)
336 0 : ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
337 0 : ns = SIZE(rho_ao)
338 0 : psmat(1:ns, 1:1) => rho_ao(1:ns)
339 : CALL update_ks_atom(qs_env, ksmat, psmat, forces=my_calc_forces, tddft=.TRUE., &
340 0 : rho_atom_external=p_env%local_rho_set%rho_atom_set)
341 1784 : ELSE IF (gapw_xc) THEN
342 0 : ns = SIZE(p_env%kpp1)
343 0 : ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
344 0 : ns = SIZE(rho_ao)
345 0 : psmat(1:ns, 1:1) => rho_ao(1:ns)
346 : CALL update_ks_atom(qs_env, ksmat, psmat, forces=my_calc_forces, tddft=.TRUE., &
347 0 : rho_atom_external=p_env%local_rho_set%rho_atom_set)
348 : END IF
349 :
350 1784 : CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
351 4118 : DO ispin = 1, SIZE(v_rspace_new)
352 4118 : CALL auxbas_pw_pool%give_back_pw(v_rspace_new(ispin))
353 : END DO
354 1784 : DEALLOCATE (v_rspace_new)
355 1784 : IF (ASSOCIATED(v_xc_tau)) THEN
356 616 : DO ispin = 1, SIZE(v_xc_tau)
357 616 : CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
358 : END DO
359 244 : DEALLOCATE (v_xc_tau)
360 : END IF
361 :
362 1784 : CALL timestop(handle)
363 :
364 3568 : END SUBROUTINE calc_kpp1
365 :
366 : ! **************************************************************************************************
367 : !> \brief checks that the intenal storage is allocated, and allocs it if needed
368 : !> \param kpp1_env the environment to check
369 : !> \param qs_env the qs environment this kpp1_env lives in
370 : !> \param xc_section ...
371 : !> \author Fawzi Mohamed
372 : !> \note
373 : !> private routine
374 : ! **************************************************************************************************
375 11160 : SUBROUTINE kpp1_check_i_alloc(kpp1_env, qs_env, xc_section)
376 :
377 : TYPE(qs_kpp1_env_type) :: kpp1_env
378 : TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
379 : TYPE(section_vals_type), POINTER :: xc_section
380 :
381 : INTEGER :: ispin, nspins
382 : TYPE(admm_type), POINTER :: admm_env
383 11160 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
384 : TYPE(dft_control_type), POINTER :: dft_control
385 : TYPE(pw_env_type), POINTER :: pw_env
386 : TYPE(qs_rho_type), POINTER :: rho
387 : TYPE(section_vals_type), POINTER :: admm_xc_section
388 :
389 : ! ------------------------------------------------------------------
390 :
391 : CALL get_qs_env(qs_env, pw_env=pw_env, matrix_s=matrix_s, &
392 11160 : admm_env=admm_env, dft_control=dft_control)
393 :
394 11160 : nspins = dft_control%nspins
395 :
396 11160 : IF (.NOT. ASSOCIATED(kpp1_env%v_ao)) THEN
397 1460 : CALL dbcsr_allocate_matrix_set(kpp1_env%v_ao, nspins)
398 3138 : DO ispin = 1, nspins
399 1678 : ALLOCATE (kpp1_env%v_ao(ispin)%matrix)
400 : CALL dbcsr_copy(kpp1_env%v_ao(ispin)%matrix, matrix_s(1)%matrix, &
401 3138 : name="kpp1%v_ao-"//ADJUSTL(cp_to_string(ispin)))
402 : END DO
403 : END IF
404 :
405 11160 : IF (.NOT. ASSOCIATED(kpp1_env%deriv_set)) THEN
406 1460 : IF (dft_control%qs_control%gapw_xc) THEN
407 52 : CALL get_qs_env(qs_env, rho_xc=rho)
408 : ELSE
409 1408 : CALL get_qs_env(qs_env, rho=rho)
410 : END IF
411 33580 : ALLOCATE (kpp1_env%deriv_set, kpp1_env%rho_set)
412 : CALL qs_fxc_prep(qs_env, rho, &
413 : kpp1_env%rho_set, kpp1_env%deriv_set, &
414 1460 : xc_section, pw_env, is_triplet=.FALSE.)
415 : END IF
416 :
417 : ! ADMM Correction
418 11160 : IF (dft_control%do_admm) THEN
419 2332 : IF (admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
420 1366 : IF (.NOT. ASSOCIATED(kpp1_env%deriv_set_admm)) THEN
421 4416 : ALLOCATE (kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm)
422 192 : admm_xc_section => admm_env%xc_section_aux
423 192 : CALL get_admm_env(admm_env, rho_aux_fit=rho)
424 : CALL qs_fxc_prep(qs_env, rho, kpp1_env%rho_set_admm, kpp1_env%deriv_set_admm, &
425 192 : admm_xc_section, pw_env, is_triplet=.FALSE.)
426 : END IF
427 : END IF
428 : END IF
429 :
430 11160 : END SUBROUTINE kpp1_check_i_alloc
431 : ! **************************************************************************************************
432 : !> \brief ...
433 : !> \param rho1 ...
434 : !> \param rho1_tot_gspace ...
435 : !> \param out_unit ...
436 : ! **************************************************************************************************
437 0 : SUBROUTINE print_densities(rho1, rho1_tot_gspace, out_unit)
438 :
439 : TYPE(qs_rho_type), POINTER :: rho1
440 : TYPE(pw_c1d_gs_type), INTENT(IN) :: rho1_tot_gspace
441 : INTEGER :: out_unit
442 :
443 : REAL(KIND=dp) :: total_rho_gspace
444 0 : REAL(KIND=dp), DIMENSION(:), POINTER :: tot_rho1_r
445 :
446 0 : NULLIFY (tot_rho1_r)
447 :
448 0 : total_rho_gspace = pw_integrate_function(rho1_tot_gspace, isign=-1)
449 0 : IF (out_unit > 0) THEN
450 0 : CALL qs_rho_get(rho1, tot_rho_r=tot_rho1_r)
451 : WRITE (UNIT=out_unit, FMT="(T3,A,T60,F20.10)") &
452 0 : "KPP1 total charge density (r-space):", &
453 0 : accurate_sum(tot_rho1_r), &
454 0 : "KPP1 total charge density (g-space):", &
455 0 : total_rho_gspace
456 : END IF
457 :
458 0 : END SUBROUTINE print_densities
459 :
460 : END MODULE qs_kpp1_env_methods
|