(git:77f1922)
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-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! **************************************************************************************************
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(pw_r3d_rs_type), POINTER :: weights
152 TYPE(qs_rho_type), POINTER :: rho
153 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho1_atom_set, rho_atom_set
154 TYPE(section_vals_type), POINTER :: input, scf_section
155
156 CALL timeset(routinen, handle)
157
158 NULLIFY (v_xc, rho1_g, pw_env, rho1_g_pw, tau1_r_pw)
159 logger => cp_get_default_logger()
160
161 cpassert(ASSOCIATED(p_env%kpp1))
162 cpassert(ASSOCIATED(p_env%kpp1_env))
163 cpassert(ASSOCIATED(rho1))
164
165 nspins = SIZE(p_env%kpp1)
166 lsd = (nspins == 2)
167
168 my_calc_forces = .false.
169 IF (PRESENT(calc_forces)) my_calc_forces = calc_forces
170
171 CALL get_qs_env(qs_env, &
172 pw_env=pw_env, &
173 input=input, &
174 para_env=para_env, &
175 rho=rho)
176
177 cpassert(ASSOCIATED(rho1))
178
179 IF (lrigpw) THEN
180 CALL get_qs_env(qs_env, &
181 lri_env=lri_env, &
182 lri_density=lri_density, &
183 atomic_kind_set=atomic_kind_set)
184 END IF
185
186 gapw = (section_get_ival(input, "DFT%QS%METHOD") == do_method_gapw)
187 gapw_xc = (section_get_ival(input, "DFT%QS%METHOD") == do_method_gapw_xc)
188 IF (gapw_xc) THEN
189 cpassert(ASSOCIATED(rho1_xc))
190 END IF
191
192 CALL kpp1_check_i_alloc(p_env%kpp1_env, qs_env, do_triplet)
193
194 CALL qs_rho_get(rho, rho_ao=rho_ao)
195 CALL qs_rho_get(rho1, rho_g=rho1_g)
196
197 ! gets the tmp grids
198 cpassert(ASSOCIATED(pw_env))
199 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
200 poisson_env=poisson_env)
201 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
202
203 IF (gapw .OR. gapw_xc) &
204 CALL prepare_gapw_den(qs_env, p_env%local_rho_set, do_rho0=(.NOT. gapw_xc))
205
206 ! *** calculate the hartree potential on the total density ***
207 CALL auxbas_pw_pool%create_pw(rho1_tot_gspace)
208
209 CALL pw_copy(rho1_g(1), rho1_tot_gspace)
210 DO ispin = 2, nspins
211 CALL pw_axpy(rho1_g(ispin), rho1_tot_gspace)
212 END DO
213 IF (gapw) THEN
214 CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rho0_s_gs, rho1_tot_gspace)
215 IF (ASSOCIATED(p_env%local_rho_set%rho0_mpole%rhoz_cneo_s_gs)) THEN
216 CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rhoz_cneo_s_gs, rho1_tot_gspace)
217 END IF
218 END IF
219
220 scf_section => section_vals_get_subs_vals(input, "DFT%SCF")
221 IF (cp_print_key_should_output(logger%iter_info, scf_section, "PRINT%TOTAL_DENSITIES") &
222 /= 0) THEN
223 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%TOTAL_DENSITIES", &
224 extension=".scfLog")
225 CALL print_densities(rho1, rho1_tot_gspace, output_unit)
226 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
227 "PRINT%TOTAL_DENSITIES")
228 END IF
229
230 IF (.NOT. (nspins == 1 .AND. do_triplet)) THEN
231 block
232 TYPE(pw_c1d_gs_type) :: v_hartree_gspace
233 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
234 CALL pw_poisson_solve(poisson_env, rho1_tot_gspace, &
235 energy_hartree, &
236 v_hartree_gspace)
237 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
238 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
239 END block
240 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
241 END IF
242
243 CALL auxbas_pw_pool%give_back_pw(rho1_tot_gspace)
244
245 ! *** calculate the xc potential ***
246 IF (gapw_xc) THEN
247 CALL qs_rho_get(rho1_xc, rho_r=rho1_r, tau_r=tau1_r)
248 ELSE
249 CALL qs_rho_get(rho1, rho_r=rho1_r, tau_r=tau1_r)
250 END IF
251
252 IF (nspins == 1 .AND. do_triplet) THEN
253
254 lsd = .true.
255 ALLOCATE (rho1_r_pw(2))
256 DO ispin = 1, 2
257 CALL rho1_r_pw(ispin)%create(rho1_r(1)%pw_grid)
258 CALL pw_transfer(rho1_r(1), rho1_r_pw(ispin))
259 END DO
260
261 IF (ASSOCIATED(tau1_r)) THEN
262 ALLOCATE (tau1_r_pw(2))
263 DO ispin = 1, 2
264 CALL tau1_r_pw(ispin)%create(tau1_r(1)%pw_grid)
265 CALL pw_transfer(tau1_r(1), tau1_r_pw(ispin))
266 END DO
267 END IF
268
269 ELSE
270
271 rho1_r_pw => rho1_r
272
273 tau1_r_pw => tau1_r
274
275 END IF
276
277 NULLIFY (weights)
278 CALL get_qs_env(qs_env, xcint_weights=weights)
279
280 CALL xc_calc_2nd_deriv(v_xc, v_xc_tau, p_env%kpp1_env%deriv_set, p_env%kpp1_env%rho_set, &
281 rho1_r_pw, rho1_g_pw, tau1_r_pw, auxbas_pw_pool, weights, &
282 xc_section, .false., do_excitations=.true., do_triplet=do_triplet, &
283 compute_virial=calc_virial, virial_xc=virial)
284
285 DO ispin = 1, nspins
286 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
287 END DO
288 v_rspace_new => v_xc
289 IF (SIZE(v_xc) /= nspins) THEN
290 CALL auxbas_pw_pool%give_back_pw(v_xc(2))
291 END IF
292 NULLIFY (v_xc)
293 IF (ASSOCIATED(v_xc_tau)) THEN
294 DO ispin = 1, nspins
295 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
296 END DO
297 IF (SIZE(v_xc_tau) /= nspins) THEN
298 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(2))
299 END IF
300 END IF
301
302 IF (gapw .OR. gapw_xc) THEN
303 CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
304 rho1_atom_set => p_env%local_rho_set%rho_atom_set
305 CALL calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, xc_section, para_env, &
306 do_triplet=do_triplet)
307 END IF
308
309 IF (nspins == 1 .AND. do_triplet) THEN
310 DO ispin = 1, SIZE(rho1_r_pw)
311 CALL rho1_r_pw(ispin)%release()
312 END DO
313 DEALLOCATE (rho1_r_pw)
314 IF (ASSOCIATED(tau1_r_pw)) THEN
315 DO ispin = 1, SIZE(tau1_r_pw)
316 CALL tau1_r_pw(ispin)%release()
317 END DO
318 DEALLOCATE (tau1_r_pw)
319 END IF
320 END IF
321
322 alpha = 1.0_dp
323 IF (nspins == 1) alpha = 2.0_dp
324
325 !-------------------------------!
326 ! Add both hartree and xc terms !
327 !-------------------------------!
328 DO ispin = 1, nspins
329 CALL dbcsr_set(p_env%kpp1_env%v_ao(ispin)%matrix, 0.0_dp)
330
331 ! XC and Hartree are integrated separatedly
332 ! XC uses the soft basis set only
333 IF (gapw_xc) THEN
334
335 IF (nspins == 1) THEN
336 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
337 pmat=rho_ao(ispin), &
338 hmat=p_env%kpp1_env%v_ao(ispin), &
339 qs_env=qs_env, &
340 calculate_forces=my_calc_forces, gapw=gapw_xc)
341
342 IF (ASSOCIATED(v_xc_tau)) THEN
343 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
344 pmat=rho_ao(ispin), &
345 hmat=p_env%kpp1_env%v_ao(ispin), &
346 qs_env=qs_env, &
347 compute_tau=.true., &
348 calculate_forces=my_calc_forces, gapw=gapw_xc)
349 END IF
350
351 ! add hartree only for SINGLETS
352 IF (.NOT. do_triplet) THEN
353 CALL pw_copy(v_hartree_rspace, v_rspace_new(1))
354
355 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
356 pmat=rho_ao(ispin), &
357 hmat=p_env%kpp1_env%v_ao(ispin), &
358 qs_env=qs_env, &
359 calculate_forces=my_calc_forces, gapw=gapw)
360 END IF
361 ELSE
362 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
363 pmat=rho_ao(ispin), &
364 hmat=p_env%kpp1_env%v_ao(ispin), &
365 qs_env=qs_env, &
366 calculate_forces=my_calc_forces, gapw=gapw_xc)
367
368 IF (ASSOCIATED(v_xc_tau)) THEN
369 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
370 pmat=rho_ao(ispin), &
371 hmat=p_env%kpp1_env%v_ao(ispin), &
372 qs_env=qs_env, &
373 compute_tau=.true., &
374 calculate_forces=my_calc_forces, gapw=gapw_xc)
375 END IF
376
377 CALL pw_copy(v_hartree_rspace, v_rspace_new(ispin))
378 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
379 pmat=rho_ao(ispin), &
380 hmat=p_env%kpp1_env%v_ao(ispin), &
381 qs_env=qs_env, &
382 calculate_forces=my_calc_forces, gapw=gapw)
383 END IF
384
385 ELSE
386
387 IF (nspins == 1) THEN
388
389 ! add hartree only for SINGLETS
390 IF (.NOT. do_triplet) THEN
391 CALL pw_axpy(v_hartree_rspace, v_rspace_new(1))
392 END IF
393 ELSE
394 CALL pw_axpy(v_hartree_rspace, v_rspace_new(ispin))
395 END IF
396
397 IF (lrigpw) THEN
398 IF (ASSOCIATED(v_xc_tau)) cpabort("Meta-GGA functionals not supported with LRI!")
399
400 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
401 CALL get_qs_env(qs_env, nkind=nkind)
402 DO ikind = 1, nkind
403 lri_v_int(ikind)%v_int = 0.0_dp
404 END DO
405 CALL integrate_v_rspace_one_center(v_rspace_new(ispin), qs_env, &
406 lri_v_int, .false., "LRI_AUX")
407 DO ikind = 1, nkind
408 CALL para_env%sum(lri_v_int(ikind)%v_int)
409 END DO
410 ALLOCATE (k1mat(1))
411 k1mat(1)%matrix => p_env%kpp1_env%v_ao(ispin)%matrix
412 IF (lri_env%exact_1c_terms) THEN
413 CALL integrate_v_rspace_diagonal(v_rspace_new(ispin), k1mat(1)%matrix, &
414 rho_ao(ispin)%matrix, qs_env, my_calc_forces, "ORB")
415 END IF
416 CALL calculate_lri_ks_matrix(lri_env, lri_v_int, k1mat, atomic_kind_set)
417 DEALLOCATE (k1mat)
418 ELSE
419 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
420 pmat=rho_ao(ispin), &
421 hmat=p_env%kpp1_env%v_ao(ispin), &
422 qs_env=qs_env, &
423 calculate_forces=my_calc_forces, gapw=gapw)
424
425 IF (ASSOCIATED(v_xc_tau)) THEN
426 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
427 pmat=rho_ao(ispin), &
428 hmat=p_env%kpp1_env%v_ao(ispin), &
429 qs_env=qs_env, &
430 compute_tau=.true., &
431 calculate_forces=my_calc_forces, gapw=gapw)
432 END IF
433 END IF
434 END IF
435
436 CALL dbcsr_add(p_env%kpp1(ispin)%matrix, p_env%kpp1_env%v_ao(ispin)%matrix, 1.0_dp, alpha)
437 END DO
438
439 IF (gapw) THEN
440 IF (.NOT. (nspins == 1 .AND. do_triplet)) THEN
441 CALL vh_1c_gg_integrals(qs_env, energy_hartree_1c, &
442 p_env%hartree_local%ecoul_1c, &
443 p_env%local_rho_set, &
444 para_env, tddft=.true., core_2nd=.true.)
445 CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace, para_env, &
446 calculate_forces=my_calc_forces, &
447 local_rho_set=p_env%local_rho_set)
448 END IF
449 ! *** Add single atom contributions to the KS matrix ***
450 ! remap pointer
451 ns = SIZE(p_env%kpp1)
452 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
453 ns = SIZE(rho_ao)
454 psmat(1:ns, 1:1) => rho_ao(1:ns)
455 CALL update_ks_atom(qs_env, ksmat, psmat, forces=my_calc_forces, tddft=.true., &
456 rho_atom_external=p_env%local_rho_set%rho_atom_set)
457 ELSEIF (gapw_xc) THEN
458 ns = SIZE(p_env%kpp1)
459 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
460 ns = SIZE(rho_ao)
461 psmat(1:ns, 1:1) => rho_ao(1:ns)
462 CALL update_ks_atom(qs_env, ksmat, psmat, forces=my_calc_forces, tddft=.true., &
463 rho_atom_external=p_env%local_rho_set%rho_atom_set)
464 END IF
465
466 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
467 DO ispin = 1, SIZE(v_rspace_new)
468 CALL auxbas_pw_pool%give_back_pw(v_rspace_new(ispin))
469 END DO
470 DEALLOCATE (v_rspace_new)
471 IF (ASSOCIATED(v_xc_tau)) THEN
472 DO ispin = 1, SIZE(v_xc_tau)
473 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
474 END DO
475 DEALLOCATE (v_xc_tau)
476 END IF
477
478 CALL timestop(handle)
479 END SUBROUTINE calc_kpp1
480
481! **************************************************************************************************
482!> \brief checks that the intenal storage is allocated, and allocs it if needed
483!> \param kpp1_env the environment to check
484!> \param qs_env the qs environment this kpp1_env lives in
485!> \param do_triplet ...
486!> \author Fawzi Mohamed
487!> \note
488!> private routine
489! **************************************************************************************************
490 SUBROUTINE kpp1_check_i_alloc(kpp1_env, qs_env, do_triplet)
491
492 TYPE(qs_kpp1_env_type) :: kpp1_env
493 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
494 LOGICAL, INTENT(IN) :: do_triplet
495
496 INTEGER :: ispin, nspins
497 TYPE(admm_type), POINTER :: admm_env
498 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
499 TYPE(dft_control_type), POINTER :: dft_control
500 TYPE(pw_env_type), POINTER :: pw_env
501 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
502 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: my_rho_r, my_tau_r, rho_r, tau_r
503 TYPE(pw_r3d_rs_type), POINTER :: weights
504 TYPE(qs_rho_type), POINTER :: rho
505 TYPE(section_vals_type), POINTER :: admm_xc_section, input, xc_section
506
507! ------------------------------------------------------------------
508
509 NULLIFY (pw_env, auxbas_pw_pool, matrix_s, rho, rho_r, admm_env, dft_control, my_rho_r, my_tau_r)
510
511 CALL get_qs_env(qs_env, pw_env=pw_env, &
512 matrix_s=matrix_s, rho=rho, input=input, &
513 admm_env=admm_env, dft_control=dft_control)
514
515 NULLIFY (weights)
516 CALL get_qs_env(qs_env, xcint_weights=weights)
517
518 CALL qs_rho_get(rho, rho_r=rho_r, tau_r=tau_r)
519 nspins = SIZE(rho_r)
520
521 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
522
523 IF (.NOT. ASSOCIATED(kpp1_env%v_ao)) THEN
524 CALL dbcsr_allocate_matrix_set(kpp1_env%v_ao, nspins)
525 DO ispin = 1, nspins
526 ALLOCATE (kpp1_env%v_ao(ispin)%matrix)
527 CALL dbcsr_copy(kpp1_env%v_ao(ispin)%matrix, matrix_s(1)%matrix, &
528 name="kpp1%v_ao-"//adjustl(cp_to_string(ispin)))
529 END DO
530 END IF
531
532 IF (.NOT. ASSOCIATED(kpp1_env%deriv_set)) THEN
533
534 IF (nspins == 1 .AND. do_triplet) THEN
535 ALLOCATE (my_rho_r(2))
536 DO ispin = 1, 2
537 CALL auxbas_pw_pool%create_pw(my_rho_r(ispin))
538 CALL pw_axpy(rho_r(1), my_rho_r(ispin), 0.5_dp, 0.0_dp)
539 END DO
540 IF (dft_control%use_kinetic_energy_density) THEN
541 ALLOCATE (my_tau_r(2))
542 DO ispin = 1, 2
543 CALL auxbas_pw_pool%create_pw(my_tau_r(ispin))
544 CALL pw_axpy(tau_r(1), my_tau_r(ispin), 0.5_dp, 0.0_dp)
545 END DO
546 END IF
547 ELSE
548 my_rho_r => rho_r
549 IF (dft_control%use_kinetic_energy_density) THEN
550 my_tau_r => tau_r
551 END IF
552 END IF
553
554 IF (dft_control%do_admm) THEN
555 xc_section => admm_env%xc_section_primary
556 ELSE
557 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
558 END IF
559
560 ALLOCATE (kpp1_env%deriv_set, kpp1_env%rho_set)
561 CALL xc_prep_2nd_deriv(kpp1_env%deriv_set, kpp1_env%rho_set, &
562 my_rho_r, auxbas_pw_pool, weights, &
563 xc_section=xc_section, tau_r=my_tau_r)
564
565 IF (nspins == 1 .AND. do_triplet) THEN
566 DO ispin = 1, SIZE(my_rho_r)
567 CALL my_rho_r(ispin)%release()
568 END DO
569 DEALLOCATE (my_rho_r)
570 IF (ASSOCIATED(my_tau_r)) THEN
571 DO ispin = 1, SIZE(my_tau_r)
572 CALL my_tau_r(ispin)%release()
573 END DO
574 DEALLOCATE (my_tau_r)
575 END IF
576 END IF
577 END IF
578
579 ! ADMM Correction
580 IF (dft_control%do_admm) THEN
581 IF (admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
582 IF (.NOT. ASSOCIATED(kpp1_env%deriv_set_admm)) THEN
583 cpassert(.NOT. do_triplet)
584 admm_xc_section => admm_env%xc_section_aux
585 CALL get_admm_env(qs_env%admm_env, rho_aux_fit=rho)
586 CALL qs_rho_get(rho, rho_r=rho_r)
587 ALLOCATE (kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm)
588 CALL xc_prep_2nd_deriv(kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm, &
589 rho_r, auxbas_pw_pool, weights, &
590 xc_section=admm_xc_section)
591 END IF
592 END IF
593 END IF
594
595 END SUBROUTINE kpp1_check_i_alloc
596
597! **************************************************************************************************
598!> \brief function to advise of changes either in the grids
599!> \param kpp1_env the kpp1_env
600!> \par History
601!> 11.2002 created [fawzi]
602!> \author Fawzi Mohamed
603! **************************************************************************************************
604 SUBROUTINE kpp1_did_change(kpp1_env)
605 TYPE(qs_kpp1_env_type) :: kpp1_env
606
607 IF (ASSOCIATED(kpp1_env%deriv_set)) THEN
608 CALL xc_dset_release(kpp1_env%deriv_set)
609 DEALLOCATE (kpp1_env%deriv_set)
610 NULLIFY (kpp1_env%deriv_set)
611 END IF
612 IF (ASSOCIATED(kpp1_env%rho_set)) THEN
613 CALL xc_rho_set_release(kpp1_env%rho_set)
614 DEALLOCATE (kpp1_env%rho_set)
615 END IF
616
617 END SUBROUTINE kpp1_did_change
618
619! **************************************************************************************************
620!> \brief ...
621!> \param rho1 ...
622!> \param rho1_tot_gspace ...
623!> \param out_unit ...
624! **************************************************************************************************
625 SUBROUTINE print_densities(rho1, rho1_tot_gspace, out_unit)
626
627 TYPE(qs_rho_type), POINTER :: rho1
628 TYPE(pw_c1d_gs_type), INTENT(IN) :: rho1_tot_gspace
629 INTEGER :: out_unit
630
631 REAL(kind=dp) :: total_rho_gspace
632 REAL(kind=dp), DIMENSION(:), POINTER :: tot_rho1_r
633
634 NULLIFY (tot_rho1_r)
635
636 total_rho_gspace = pw_integrate_function(rho1_tot_gspace, isign=-1)
637 IF (out_unit > 0) THEN
638 CALL qs_rho_get(rho1, tot_rho_r=tot_rho1_r)
639 WRITE (unit=out_unit, fmt="(T3,A,T60,F20.10)") &
640 "KPP1 total charge density (r-space):", &
641 accurate_sum(tot_rho1_r), &
642 "KPP1 total charge density (g-space):", &
643 total_rho_gspace
644 END IF
645
646 END SUBROUTINE print_densities
647
648END 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, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public 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, do_sf, 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_prep_2nd_deriv(deriv_set, rho_set, rho_r, pw_pool, weights, xc_section, tau_r)
Prepare objects for the calculation of the 2nd derivatives of the density functional....
Definition xc.F:5533
subroutine, public xc_calc_2nd_deriv(v_xc, v_xc_tau, deriv_set, rho_set, rho1_r, rho1_g, tau1_r, pw_pool, weights, xc_section, gapw, vxg, do_excitations, do_sf, do_triplet, compute_virial, virial_xc)
Caller routine to calculate the second order potential in the direction of rho1_r.
Definition xc.F:924
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.