(git:ed6f26b)
Loading...
Searching...
No Matches
qs_kpp1_env_methods.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
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! **************************************************************************************************
16 USE admm_types, ONLY: admm_type,&
20 USE cp_dbcsr_api, ONLY: dbcsr_add,&
38 USE kahan_sum, ONLY: accurate_sum
39 USE kinds, ONLY: dp
45 USE pw_env_types, ONLY: pw_env_get,&
47 USE pw_methods, ONLY: pw_axpy,&
48 pw_copy,&
50 pw_scale,&
55 USE pw_types, ONLY: pw_c1d_gs_type,&
60 USE qs_integrate_potential, ONLY: integrate_v_rspace,&
61 integrate_v_rspace_diagonal,&
62 integrate_v_rspace_one_center
64 USE qs_ks_atom, ONLY: update_ks_atom
68 USE qs_rho_types, ONLY: qs_rho_get,&
71 USE xc, ONLY: xc_calc_2nd_deriv,&
75#include "./base/base_uses.f90"
76
77 IMPLICIT NONE
78
79 PRIVATE
80
81 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .true.
82 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_kpp1_env_methods'
83
84 PUBLIC :: kpp1_create, &
87
88CONTAINS
89
90! **************************************************************************************************
91!> \brief allocates and initializes a kpp1_env
92!> \param kpp1_env the environment to initialize
93!> \par History
94!> 07.2002 created [fawzi]
95!> \author Fawzi Mohamed
96! **************************************************************************************************
97 SUBROUTINE kpp1_create(kpp1_env)
98 TYPE(qs_kpp1_env_type) :: kpp1_env
99
100 NULLIFY (kpp1_env%v_ao, kpp1_env%rho_set, kpp1_env%deriv_set, &
101 kpp1_env%rho_set_admm, kpp1_env%deriv_set_admm)
102 END SUBROUTINE kpp1_create
103
104! **************************************************************************************************
105!> \brief ...
106!> \param rho1_xc ...
107!> \param rho1 ...
108!> \param xc_section ...
109!> \param lrigpw ...
110!> \param do_triplet ...
111!> \param qs_env ...
112!> \param p_env ...
113!> \param calc_forces ...
114!> \param calc_virial ...
115!> \param virial ...
116! **************************************************************************************************
117 SUBROUTINE calc_kpp1(rho1_xc, rho1, xc_section, lrigpw, do_triplet, qs_env, p_env, &
118 calc_forces, calc_virial, virial)
119
120 TYPE(qs_rho_type), POINTER :: rho1_xc, rho1
121 TYPE(section_vals_type), POINTER :: xc_section
122 LOGICAL, INTENT(IN) :: lrigpw, do_triplet
123 TYPE(qs_environment_type), POINTER :: qs_env
124 TYPE(qs_p_env_type) :: p_env
125 LOGICAL, INTENT(IN), OPTIONAL :: calc_forces, calc_virial
126 REAL(kind=dp), DIMENSION(3, 3), INTENT(INOUT), &
127 OPTIONAL :: virial
128
129 CHARACTER(len=*), PARAMETER :: routinen = 'calc_kpp1'
130
131 INTEGER :: handle, ikind, ispin, nkind, ns, nspins, &
132 output_unit
133 LOGICAL :: gapw, gapw_xc, lsd, my_calc_forces
134 REAL(kind=dp) :: alpha, energy_hartree, energy_hartree_1c
135 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
136 TYPE(cp_logger_type), POINTER :: logger
137 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: k1mat, rho_ao
138 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: ksmat, psmat
139 TYPE(lri_density_type), POINTER :: lri_density
140 TYPE(lri_environment_type), POINTER :: lri_env
141 TYPE(lri_kind_type), DIMENSION(:), POINTER :: lri_v_int
142 TYPE(mp_para_env_type), POINTER :: para_env
143 TYPE(pw_c1d_gs_type) :: rho1_tot_gspace
144 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho1_g, rho1_g_pw
145 TYPE(pw_env_type), POINTER :: pw_env
146 TYPE(pw_poisson_type), POINTER :: poisson_env
147 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
148 TYPE(pw_r3d_rs_type) :: v_hartree_rspace
149 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho1_r, rho1_r_pw, tau1_r, tau1_r_pw, &
150 v_rspace_new, v_xc, v_xc_tau
151 TYPE(qs_rho_type), POINTER :: rho
152 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho1_atom_set, rho_atom_set
153 TYPE(section_vals_type), POINTER :: input, scf_section
154
155 CALL timeset(routinen, handle)
156
157 NULLIFY (v_xc, rho1_g, pw_env, rho1_g_pw, tau1_r_pw)
158 logger => cp_get_default_logger()
159
160 cpassert(ASSOCIATED(p_env%kpp1))
161 cpassert(ASSOCIATED(p_env%kpp1_env))
162 cpassert(ASSOCIATED(rho1))
163
164 nspins = SIZE(p_env%kpp1)
165 lsd = (nspins == 2)
166
167 my_calc_forces = .false.
168 IF (PRESENT(calc_forces)) my_calc_forces = calc_forces
169
170 CALL get_qs_env(qs_env, &
171 pw_env=pw_env, &
172 input=input, &
173 para_env=para_env, &
174 rho=rho)
175
176 cpassert(ASSOCIATED(rho1))
177
178 IF (lrigpw) THEN
179 CALL get_qs_env(qs_env, &
180 lri_env=lri_env, &
181 lri_density=lri_density, &
182 atomic_kind_set=atomic_kind_set)
183 END IF
184
185 gapw = (section_get_ival(input, "DFT%QS%METHOD") == do_method_gapw)
186 gapw_xc = (section_get_ival(input, "DFT%QS%METHOD") == do_method_gapw_xc)
187 IF (gapw_xc) THEN
188 cpassert(ASSOCIATED(rho1_xc))
189 END IF
190
191 CALL kpp1_check_i_alloc(p_env%kpp1_env, qs_env, do_triplet)
192
193 CALL qs_rho_get(rho, rho_ao=rho_ao)
194 CALL qs_rho_get(rho1, rho_g=rho1_g)
195
196 ! gets the tmp grids
197 cpassert(ASSOCIATED(pw_env))
198 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
199 poisson_env=poisson_env)
200 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
201
202 IF (gapw .OR. gapw_xc) &
203 CALL prepare_gapw_den(qs_env, p_env%local_rho_set, do_rho0=(.NOT. gapw_xc))
204
205 ! *** calculate the hartree potential on the total density ***
206 CALL auxbas_pw_pool%create_pw(rho1_tot_gspace)
207
208 CALL pw_copy(rho1_g(1), rho1_tot_gspace)
209 DO ispin = 2, nspins
210 CALL pw_axpy(rho1_g(ispin), rho1_tot_gspace)
211 END DO
212 IF (gapw) &
213 CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rho0_s_gs, rho1_tot_gspace)
214
215 scf_section => section_vals_get_subs_vals(input, "DFT%SCF")
216 IF (cp_print_key_should_output(logger%iter_info, scf_section, "PRINT%TOTAL_DENSITIES") &
217 /= 0) THEN
218 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%TOTAL_DENSITIES", &
219 extension=".scfLog")
220 CALL print_densities(rho1, rho1_tot_gspace, output_unit)
221 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
222 "PRINT%TOTAL_DENSITIES")
223 END IF
224
225 IF (.NOT. (nspins == 1 .AND. do_triplet)) THEN
226 block
227 TYPE(pw_c1d_gs_type) :: v_hartree_gspace
228 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
229 CALL pw_poisson_solve(poisson_env, rho1_tot_gspace, &
230 energy_hartree, &
231 v_hartree_gspace)
232 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
233 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
234 END block
235 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
236 END IF
237
238 CALL auxbas_pw_pool%give_back_pw(rho1_tot_gspace)
239
240 ! *** calculate the xc potential ***
241 IF (gapw_xc) THEN
242 CALL qs_rho_get(rho1_xc, rho_r=rho1_r, tau_r=tau1_r)
243 ELSE
244 CALL qs_rho_get(rho1, rho_r=rho1_r, tau_r=tau1_r)
245 END IF
246
247 IF (nspins == 1 .AND. do_triplet) THEN
248
249 lsd = .true.
250 ALLOCATE (rho1_r_pw(2))
251 DO ispin = 1, 2
252 CALL rho1_r_pw(ispin)%create(rho1_r(1)%pw_grid)
253 CALL pw_transfer(rho1_r(1), rho1_r_pw(ispin))
254 END DO
255
256 IF (ASSOCIATED(tau1_r)) THEN
257 ALLOCATE (tau1_r_pw(2))
258 DO ispin = 1, 2
259 CALL tau1_r_pw(ispin)%create(tau1_r(1)%pw_grid)
260 CALL pw_transfer(tau1_r(1), tau1_r_pw(ispin))
261 END DO
262 END IF
263
264 ELSE
265
266 rho1_r_pw => rho1_r
267
268 tau1_r_pw => tau1_r
269
270 END IF
271
272 CALL xc_calc_2nd_deriv(v_xc, v_xc_tau, p_env%kpp1_env%deriv_set, p_env%kpp1_env%rho_set, &
273 rho1_r_pw, rho1_g_pw, tau1_r_pw, auxbas_pw_pool, xc_section, .false., &
274 do_excitations=.true., do_triplet=do_triplet, &
275 compute_virial=calc_virial, virial_xc=virial)
276
277 DO ispin = 1, nspins
278 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
279 END DO
280 v_rspace_new => v_xc
281 IF (SIZE(v_xc) /= nspins) THEN
282 CALL auxbas_pw_pool%give_back_pw(v_xc(2))
283 END IF
284 NULLIFY (v_xc)
285 IF (ASSOCIATED(v_xc_tau)) THEN
286 DO ispin = 1, nspins
287 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
288 END DO
289 IF (SIZE(v_xc_tau) /= nspins) THEN
290 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(2))
291 END IF
292 END IF
293
294 IF (gapw .OR. gapw_xc) THEN
295 CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
296 rho1_atom_set => p_env%local_rho_set%rho_atom_set
297 CALL calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, xc_section, para_env, &
298 do_triplet=do_triplet)
299 END IF
300
301 IF (nspins == 1 .AND. do_triplet) THEN
302 DO ispin = 1, SIZE(rho1_r_pw)
303 CALL rho1_r_pw(ispin)%release()
304 END DO
305 DEALLOCATE (rho1_r_pw)
306 IF (ASSOCIATED(tau1_r_pw)) THEN
307 DO ispin = 1, SIZE(tau1_r_pw)
308 CALL tau1_r_pw(ispin)%release()
309 END DO
310 DEALLOCATE (tau1_r_pw)
311 END IF
312 END IF
313
314 alpha = 1.0_dp
315 IF (nspins == 1) alpha = 2.0_dp
316
317 !-------------------------------!
318 ! Add both hartree and xc terms !
319 !-------------------------------!
320 DO ispin = 1, nspins
321 CALL dbcsr_set(p_env%kpp1_env%v_ao(ispin)%matrix, 0.0_dp)
322
323 ! XC and Hartree are integrated separatedly
324 ! XC uses the soft basis set only
325 IF (gapw_xc) THEN
326
327 IF (nspins == 1) THEN
328 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
329 pmat=rho_ao(ispin), &
330 hmat=p_env%kpp1_env%v_ao(ispin), &
331 qs_env=qs_env, &
332 calculate_forces=my_calc_forces, gapw=gapw_xc)
333
334 IF (ASSOCIATED(v_xc_tau)) THEN
335 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
336 pmat=rho_ao(ispin), &
337 hmat=p_env%kpp1_env%v_ao(ispin), &
338 qs_env=qs_env, &
339 compute_tau=.true., &
340 calculate_forces=my_calc_forces, gapw=gapw_xc)
341 END IF
342
343 ! add hartree only for SINGLETS
344 IF (.NOT. do_triplet) THEN
345 CALL pw_copy(v_hartree_rspace, v_rspace_new(1))
346
347 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
348 pmat=rho_ao(ispin), &
349 hmat=p_env%kpp1_env%v_ao(ispin), &
350 qs_env=qs_env, &
351 calculate_forces=my_calc_forces, gapw=gapw)
352 END IF
353 ELSE
354 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
355 pmat=rho_ao(ispin), &
356 hmat=p_env%kpp1_env%v_ao(ispin), &
357 qs_env=qs_env, &
358 calculate_forces=my_calc_forces, gapw=gapw_xc)
359
360 IF (ASSOCIATED(v_xc_tau)) THEN
361 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
362 pmat=rho_ao(ispin), &
363 hmat=p_env%kpp1_env%v_ao(ispin), &
364 qs_env=qs_env, &
365 compute_tau=.true., &
366 calculate_forces=my_calc_forces, gapw=gapw_xc)
367 END IF
368
369 CALL pw_copy(v_hartree_rspace, v_rspace_new(ispin))
370 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
371 pmat=rho_ao(ispin), &
372 hmat=p_env%kpp1_env%v_ao(ispin), &
373 qs_env=qs_env, &
374 calculate_forces=my_calc_forces, gapw=gapw)
375 END IF
376
377 ELSE
378
379 IF (nspins == 1) THEN
380
381 ! add hartree only for SINGLETS
382 IF (.NOT. do_triplet) THEN
383 CALL pw_axpy(v_hartree_rspace, v_rspace_new(1))
384 END IF
385 ELSE
386 CALL pw_axpy(v_hartree_rspace, v_rspace_new(ispin))
387 END IF
388
389 IF (lrigpw) THEN
390 IF (ASSOCIATED(v_xc_tau)) cpabort("Meta-GGA functionals not supported with LRI!")
391
392 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
393 CALL get_qs_env(qs_env, nkind=nkind)
394 DO ikind = 1, nkind
395 lri_v_int(ikind)%v_int = 0.0_dp
396 END DO
397 CALL integrate_v_rspace_one_center(v_rspace_new(ispin), qs_env, &
398 lri_v_int, .false., "LRI_AUX")
399 DO ikind = 1, nkind
400 CALL para_env%sum(lri_v_int(ikind)%v_int)
401 END DO
402 ALLOCATE (k1mat(1))
403 k1mat(1)%matrix => p_env%kpp1_env%v_ao(ispin)%matrix
404 IF (lri_env%exact_1c_terms) THEN
405 CALL integrate_v_rspace_diagonal(v_rspace_new(ispin), k1mat(1)%matrix, &
406 rho_ao(ispin)%matrix, qs_env, my_calc_forces, "ORB")
407 END IF
408 CALL calculate_lri_ks_matrix(lri_env, lri_v_int, k1mat, atomic_kind_set)
409 DEALLOCATE (k1mat)
410 ELSE
411 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
412 pmat=rho_ao(ispin), &
413 hmat=p_env%kpp1_env%v_ao(ispin), &
414 qs_env=qs_env, &
415 calculate_forces=my_calc_forces, gapw=gapw)
416
417 IF (ASSOCIATED(v_xc_tau)) THEN
418 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
419 pmat=rho_ao(ispin), &
420 hmat=p_env%kpp1_env%v_ao(ispin), &
421 qs_env=qs_env, &
422 compute_tau=.true., &
423 calculate_forces=my_calc_forces, gapw=gapw)
424 END IF
425 END IF
426 END IF
427
428 CALL dbcsr_add(p_env%kpp1(ispin)%matrix, p_env%kpp1_env%v_ao(ispin)%matrix, 1.0_dp, alpha)
429 END DO
430
431 IF (gapw) THEN
432 IF (.NOT. (nspins == 1 .AND. do_triplet)) THEN
433 CALL vh_1c_gg_integrals(qs_env, energy_hartree_1c, &
434 p_env%hartree_local%ecoul_1c, &
435 p_env%local_rho_set, &
436 para_env, tddft=.true., core_2nd=.true.)
437 CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace, para_env, &
438 calculate_forces=my_calc_forces, &
439 local_rho_set=p_env%local_rho_set)
440 END IF
441 ! *** Add single atom contributions to the KS matrix ***
442 ! remap pointer
443 ns = SIZE(p_env%kpp1)
444 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
445 ns = SIZE(rho_ao)
446 psmat(1:ns, 1:1) => rho_ao(1:ns)
447 CALL update_ks_atom(qs_env, ksmat, psmat, forces=my_calc_forces, tddft=.true., &
448 rho_atom_external=p_env%local_rho_set%rho_atom_set)
449 ELSEIF (gapw_xc) THEN
450 ns = SIZE(p_env%kpp1)
451 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
452 ns = SIZE(rho_ao)
453 psmat(1:ns, 1:1) => rho_ao(1:ns)
454 CALL update_ks_atom(qs_env, ksmat, psmat, forces=my_calc_forces, tddft=.true., &
455 rho_atom_external=p_env%local_rho_set%rho_atom_set)
456 END IF
457
458 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
459 DO ispin = 1, SIZE(v_rspace_new)
460 CALL auxbas_pw_pool%give_back_pw(v_rspace_new(ispin))
461 END DO
462 DEALLOCATE (v_rspace_new)
463 IF (ASSOCIATED(v_xc_tau)) THEN
464 DO ispin = 1, SIZE(v_xc_tau)
465 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
466 END DO
467 DEALLOCATE (v_xc_tau)
468 END IF
469
470 CALL timestop(handle)
471 END SUBROUTINE calc_kpp1
472
473! **************************************************************************************************
474!> \brief checks that the intenal storage is allocated, and allocs it if needed
475!> \param kpp1_env the environment to check
476!> \param qs_env the qs environment this kpp1_env lives in
477!> \param do_triplet ...
478!> \author Fawzi Mohamed
479!> \note
480!> private routine
481! **************************************************************************************************
482 SUBROUTINE kpp1_check_i_alloc(kpp1_env, qs_env, do_triplet)
483
484 TYPE(qs_kpp1_env_type) :: kpp1_env
485 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
486 LOGICAL, INTENT(IN) :: do_triplet
487
488 INTEGER :: ispin, nspins
489 TYPE(admm_type), POINTER :: admm_env
490 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
491 TYPE(dft_control_type), POINTER :: dft_control
492 TYPE(pw_env_type), POINTER :: pw_env
493 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
494 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: my_rho_r, my_tau_r, rho_r, tau_r
495 TYPE(qs_rho_type), POINTER :: rho
496 TYPE(section_vals_type), POINTER :: admm_xc_section, input, xc_section
497
498! ------------------------------------------------------------------
499
500 NULLIFY (pw_env, auxbas_pw_pool, matrix_s, rho, rho_r, admm_env, dft_control, my_rho_r, my_tau_r)
501
502 CALL get_qs_env(qs_env, pw_env=pw_env, &
503 matrix_s=matrix_s, rho=rho, input=input, &
504 admm_env=admm_env, dft_control=dft_control)
505
506 CALL qs_rho_get(rho, rho_r=rho_r, tau_r=tau_r)
507 nspins = SIZE(rho_r)
508
509 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
510
511 IF (.NOT. ASSOCIATED(kpp1_env%v_ao)) THEN
512 CALL dbcsr_allocate_matrix_set(kpp1_env%v_ao, nspins)
513 DO ispin = 1, nspins
514 ALLOCATE (kpp1_env%v_ao(ispin)%matrix)
515 CALL dbcsr_copy(kpp1_env%v_ao(ispin)%matrix, matrix_s(1)%matrix, &
516 name="kpp1%v_ao-"//adjustl(cp_to_string(ispin)))
517 END DO
518 END IF
519
520 IF (.NOT. ASSOCIATED(kpp1_env%deriv_set)) THEN
521
522 IF (nspins == 1 .AND. do_triplet) THEN
523 ALLOCATE (my_rho_r(2))
524 DO ispin = 1, 2
525 CALL auxbas_pw_pool%create_pw(my_rho_r(ispin))
526 CALL pw_axpy(rho_r(1), my_rho_r(ispin), 0.5_dp, 0.0_dp)
527 END DO
528 IF (dft_control%use_kinetic_energy_density) THEN
529 ALLOCATE (my_tau_r(2))
530 DO ispin = 1, 2
531 CALL auxbas_pw_pool%create_pw(my_tau_r(ispin))
532 CALL pw_axpy(tau_r(1), my_tau_r(ispin), 0.5_dp, 0.0_dp)
533 END DO
534 END IF
535 ELSE
536 my_rho_r => rho_r
537 IF (dft_control%use_kinetic_energy_density) THEN
538 my_tau_r => tau_r
539 END IF
540 END IF
541
542 IF (dft_control%do_admm) THEN
543 xc_section => admm_env%xc_section_primary
544 ELSE
545 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
546 END IF
547
548 ALLOCATE (kpp1_env%deriv_set, kpp1_env%rho_set)
549 CALL xc_prep_2nd_deriv(kpp1_env%deriv_set, kpp1_env%rho_set, &
550 my_rho_r, auxbas_pw_pool, &
551 xc_section=xc_section, tau_r=my_tau_r)
552
553 IF (nspins == 1 .AND. do_triplet) THEN
554 DO ispin = 1, SIZE(my_rho_r)
555 CALL my_rho_r(ispin)%release()
556 END DO
557 DEALLOCATE (my_rho_r)
558 IF (ASSOCIATED(my_tau_r)) THEN
559 DO ispin = 1, SIZE(my_tau_r)
560 CALL my_tau_r(ispin)%release()
561 END DO
562 DEALLOCATE (my_tau_r)
563 END IF
564 END IF
565 END IF
566
567 ! ADMM Correction
568 IF (dft_control%do_admm) THEN
569 IF (admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
570 IF (.NOT. ASSOCIATED(kpp1_env%deriv_set_admm)) THEN
571 cpassert(.NOT. do_triplet)
572 admm_xc_section => admm_env%xc_section_aux
573 CALL get_admm_env(qs_env%admm_env, rho_aux_fit=rho)
574 CALL qs_rho_get(rho, rho_r=rho_r)
575 ALLOCATE (kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm)
576 CALL xc_prep_2nd_deriv(kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm, &
577 rho_r, auxbas_pw_pool, &
578 xc_section=admm_xc_section)
579 END IF
580 END IF
581 END IF
582
583 END SUBROUTINE kpp1_check_i_alloc
584
585! **************************************************************************************************
586!> \brief function to advise of changes either in the grids
587!> \param kpp1_env the kpp1_env
588!> \par History
589!> 11.2002 created [fawzi]
590!> \author Fawzi Mohamed
591! **************************************************************************************************
592 SUBROUTINE kpp1_did_change(kpp1_env)
593 TYPE(qs_kpp1_env_type) :: kpp1_env
594
595 IF (ASSOCIATED(kpp1_env%deriv_set)) THEN
596 CALL xc_dset_release(kpp1_env%deriv_set)
597 DEALLOCATE (kpp1_env%deriv_set)
598 NULLIFY (kpp1_env%deriv_set)
599 END IF
600 IF (ASSOCIATED(kpp1_env%rho_set)) THEN
601 CALL xc_rho_set_release(kpp1_env%rho_set)
602 DEALLOCATE (kpp1_env%rho_set)
603 END IF
604
605 END SUBROUTINE kpp1_did_change
606
607! **************************************************************************************************
608!> \brief ...
609!> \param rho1 ...
610!> \param rho1_tot_gspace ...
611!> \param out_unit ...
612! **************************************************************************************************
613 SUBROUTINE print_densities(rho1, rho1_tot_gspace, out_unit)
614
615 TYPE(qs_rho_type), POINTER :: rho1
616 TYPE(pw_c1d_gs_type), INTENT(IN) :: rho1_tot_gspace
617 INTEGER :: out_unit
618
619 REAL(kind=dp) :: total_rho_gspace
620 REAL(kind=dp), DIMENSION(:), POINTER :: tot_rho1_r
621
622 NULLIFY (tot_rho1_r)
623
624 total_rho_gspace = pw_integrate_function(rho1_tot_gspace, isign=-1)
625 IF (out_unit > 0) THEN
626 CALL qs_rho_get(rho1, tot_rho_r=tot_rho1_r)
627 WRITE (unit=out_unit, fmt="(T3,A,T60,F20.10)") &
628 "KPP1 total charge density (r-space):", &
629 accurate_sum(tot_rho1_r), &
630 "KPP1 total charge density (g-space):", &
631 total_rho_gspace
632 END IF
633
634 END SUBROUTINE print_densities
635
636END MODULE qs_kpp1_env_methods
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.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
DBCSR operations in CP2K.
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
subroutine, public vh_1c_gg_integrals(qs_env, energy_hartree_1c, ecoul_1c, local_rho_set, para_env, tddft, local_rho_set_2nd, core_2nd)
Calculates one center GAPW Hartree energies and matrix elements Hartree potentials are input Takes po...
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_admm_aux_exch_func_none
integer, parameter, public do_method_gapw
integer, parameter, public do_method_gapw_xc
objects that represent the structure of input sections and the data contained in an input section
integer function, public section_get_ival(section_vals, keyword_name)
...
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
sums arrays of real/complex numbers with much reduced round-off as compared to a naive implementation...
Definition kahan_sum.F:29
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
routines that build the Kohn-Sham matrix for the LRIGPW and xc parts
subroutine, public calculate_lri_ks_matrix(lri_env, lri_v_int, h_matrix, atomic_kind_set, cell_to_index)
update of LRIGPW KS matrix
Interface to the message passing library MPI.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
functions related to the poisson solver on regular grids
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, 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)
Get the QUICKSTEP environment.
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external, pw_env_sub)
...
Integrate single or product functions over a potential on a RS grid.
module that builds the second order perturbation kernel kpp1 = delta_rho|_P delta_rho|_P E drho(P1) d...
subroutine, public calc_kpp1(rho1_xc, rho1, xc_section, lrigpw, do_triplet, qs_env, p_env, calc_forces, calc_virial, virial)
...
subroutine, public kpp1_create(kpp1_env)
allocates and initializes a kpp1_env
subroutine, public kpp1_did_change(kpp1_env)
function to advise of changes either in the grids
basis types for the calculation of the perturbation of density theory.
routines that build the Kohn-Sham matrix contributions coming from local atomic densities
Definition qs_ks_atom.F:12
subroutine, public update_ks_atom(qs_env, ksmat, pmat, forces, tddft, rho_atom_external, kind_set_external, oce_external, sab_external, kscale, kintegral, kforce, fscale)
The correction to the KS matrix due to the GAPW local terms to the hartree and XC contributions is he...
Definition qs_ks_atom.F:110
basis types for the calculation of the perturbation of density theory.
subroutine, public integrate_vhg0_rspace(qs_env, v_rspace, para_env, calculate_forces, local_rho_set, local_rho_set_2nd, atener, kforce, my_pools, my_rs_descs)
...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
routines that build the integrals of the Vxc potential calculated for the atomic density in the basis...
Definition qs_vxc_atom.F:12
subroutine, public calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, xc_section, para_env, do_tddfpt2, do_triplet, kind_set_external)
...
represent a group ofunctional derivatives
subroutine, public xc_dset_release(derivative_set)
releases a derivative set
contains the structure
subroutine, public xc_rho_set_release(rho_set, pw_pool)
releases the given rho_set
Exchange and Correlation functional calculations.
Definition xc.F:17
subroutine, public xc_calc_2nd_deriv(v_xc, v_xc_tau, deriv_set, rho_set, rho1_r, rho1_g, tau1_r, pw_pool, xc_section, gapw, vxg, do_excitations, do_triplet, compute_virial, virial_xc)
Caller routine to calculate the second order potential in the direction of rho1_r.
Definition xc.F:1528
subroutine, public xc_prep_2nd_deriv(deriv_set, rho_set, rho_r, pw_pool, xc_section, tau_r)
Prepare objects for the calculation of the 2nd derivatives of the density functional....
Definition xc.F:5373
stores some data used in wavefunction fitting
Definition admm_types.F:120
Provides all information about an atomic kind.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
environment that keeps the informations and temporary val to build the kpp1 kernel matrix
Represent a qs system that is perturbed. Can calculate the linear operator and the rhs of the system ...
keeps the density in various representations, keeping track of which ones are valid.