(git:374b731)
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-2024 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,&
28 USE dbcsr_api, ONLY: dbcsr_add,&
29 dbcsr_copy,&
30 dbcsr_p_type,&
31 dbcsr_scale,&
32 dbcsr_set
44 USE kahan_sum, ONLY: accurate_sum
45 USE kinds, ONLY: dp
51 USE pw_env_types, ONLY: pw_env_get,&
53 USE pw_methods, ONLY: pw_axpy,&
54 pw_copy,&
56 pw_scale,&
61 USE pw_types, ONLY: pw_c1d_gs_type,&
69 USE qs_integrate_potential, ONLY: integrate_v_rspace,&
70 integrate_v_rspace_diagonal,&
71 integrate_v_rspace_one_center
73 USE qs_ks_atom, ONLY: update_ks_atom
78 USE qs_rho_types, ONLY: qs_rho_get,&
81 USE xc, ONLY: xc_calc_2nd_deriv,&
85#include "./base/base_uses.f90"
86
87 IMPLICIT NONE
88
89 PRIVATE
90
91 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .true.
92 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_kpp1_env_methods'
93
94 PUBLIC :: kpp1_create, &
100
101CONTAINS
102
103! **************************************************************************************************
104!> \brief allocates and initializes a kpp1_env
105!> \param kpp1_env the environment to initialize
106!> \par History
107!> 07.2002 created [fawzi]
108!> \author Fawzi Mohamed
109! **************************************************************************************************
110 SUBROUTINE kpp1_create(kpp1_env)
111 TYPE(qs_kpp1_env_type) :: kpp1_env
112
113 NULLIFY (kpp1_env%v_ao, kpp1_env%rho_set, kpp1_env%deriv_set, &
114 kpp1_env%rho_set_admm, kpp1_env%deriv_set_admm)
115 END SUBROUTINE kpp1_create
116
117! **************************************************************************************************
118!> \brief calculates the k_p_p1 kernel of the perturbation theory
119!> \param p_env perturbation environment containing kpp1 kernel and kpp1_env
120!> \param qs_env kpp1's qs_env
121!> \param rho1 the density that represent the first direction along which
122!> you should evaluate the derivatives
123!> \param rho1_xc ...
124! **************************************************************************************************
125 SUBROUTINE kpp1_calc_k_p_p1(p_env, qs_env, rho1, rho1_xc)
126
127 TYPE(qs_p_env_type) :: p_env
128 TYPE(qs_environment_type), POINTER :: qs_env
129 TYPE(qs_rho_type), POINTER :: rho1
130 TYPE(qs_rho_type), OPTIONAL, POINTER :: rho1_xc
131
132 CHARACTER(len=*), PARAMETER :: routinen = 'kpp1_calc_k_p_p1'
133
134 INTEGER :: excitations, handle, res_etype
135 LOGICAL :: do_excitations, do_triplet, explicit, &
136 lsd_singlets
137 TYPE(section_vals_type), POINTER :: input, xc_section
138
139 CALL timeset(routinen, handle)
140
141 NULLIFY (input)
142
143 cpassert(ASSOCIATED(rho1))
144
145 CALL get_qs_env(qs_env=qs_env, &
146 input=input)
147
148 CALL section_vals_val_get(input, "DFT%EXCITATIONS", &
149 i_val=excitations)
150 CALL section_vals_val_get(input, "DFT%TDDFPT%LSD_SINGLETS", &
151 l_val=lsd_singlets)
152 CALL section_vals_val_get(input, "DFT%TDDFPT%RES_ETYPE", &
153 i_val=res_etype)
154
155 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
156 IF (excitations == tddfpt_excitations) THEN
157 xc_section => section_vals_get_subs_vals(input, "DFT%TDDFPT%XC")
158 CALL section_vals_get(xc_section, explicit=explicit)
159 IF (.NOT. explicit) THEN
160 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
161 END IF
162 END IF
163
164 do_excitations = (excitations == tddfpt_excitations)
165 do_triplet = (res_etype == tddfpt_triplet)
166
167 CALL calc_kpp1(rho1_xc, rho1, xc_section, .true., &
168 lsd_singlets, .false., do_excitations, &
169 do_triplet, qs_env, p_env)
170
171 CALL timestop(handle)
172 END SUBROUTINE kpp1_calc_k_p_p1
173
174! **************************************************************************************************
175!> \brief ...
176!> \param rho1_xc ...
177!> \param rho1 ...
178!> \param xc_section ...
179!> \param do_tddft ...
180!> \param lsd_singlets ...
181!> \param lrigpw ...
182!> \param do_excitations ...
183!> \param do_triplet ...
184!> \param qs_env ...
185!> \param p_env ...
186!> \param calc_forces ...
187!> \param calc_virial ...
188!> \param virial ...
189! **************************************************************************************************
190 SUBROUTINE calc_kpp1(rho1_xc, rho1, xc_section, do_tddft, lsd_singlets, lrigpw, &
191 do_excitations, do_triplet, qs_env, p_env, calc_forces, &
192 calc_virial, virial)
193
194 TYPE(qs_rho_type), POINTER :: rho1_xc, rho1
195 TYPE(section_vals_type), POINTER :: xc_section
196 LOGICAL, INTENT(IN) :: do_tddft, lsd_singlets, lrigpw, &
197 do_excitations, do_triplet
198 TYPE(qs_environment_type), POINTER :: qs_env
199 TYPE(qs_p_env_type) :: p_env
200 LOGICAL, INTENT(IN), OPTIONAL :: calc_forces, calc_virial
201 REAL(kind=dp), DIMENSION(3, 3), INTENT(INOUT), &
202 OPTIONAL :: virial
203
204 CHARACTER(len=*), PARAMETER :: routinen = 'calc_kpp1'
205
206 INTEGER :: handle, ikind, ispin, nkind, ns, nspins, &
207 output_unit
208 LOGICAL :: gapw, gapw_xc, lsd, my_calc_forces
209 REAL(kind=dp) :: alpha, energy_hartree, energy_hartree_1c
210 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
211 TYPE(cp_logger_type), POINTER :: logger
212 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: k1mat, rho_ao
213 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: ksmat, psmat
214 TYPE(lri_density_type), POINTER :: lri_density
215 TYPE(lri_environment_type), POINTER :: lri_env
216 TYPE(lri_kind_type), DIMENSION(:), POINTER :: lri_v_int
217 TYPE(mp_para_env_type), POINTER :: para_env
218 TYPE(pw_c1d_gs_type) :: rho1_tot_gspace
219 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho1_g, rho1_g_pw
220 TYPE(pw_env_type), POINTER :: pw_env
221 TYPE(pw_poisson_type), POINTER :: poisson_env
222 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
223 TYPE(pw_r3d_rs_type) :: v_hartree_rspace
224 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho1_r, rho1_r_pw, tau1_r, tau1_r_pw, &
225 v_rspace_new, v_xc, v_xc_tau
226 TYPE(qs_rho_type), POINTER :: rho
227 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho1_atom_set, rho_atom_set
228 TYPE(section_vals_type), POINTER :: input, scf_section
229
230 CALL timeset(routinen, handle)
231
232 NULLIFY (v_xc, rho1_g, pw_env, rho1_g_pw, tau1_r_pw)
233 logger => cp_get_default_logger()
234
235 cpassert(ASSOCIATED(p_env%kpp1))
236 cpassert(ASSOCIATED(p_env%kpp1_env))
237 cpassert(ASSOCIATED(rho1))
238
239 nspins = SIZE(p_env%kpp1)
240 lsd = (nspins == 2)
241
242 my_calc_forces = .false.
243 IF (PRESENT(calc_forces)) my_calc_forces = calc_forces
244
245 CALL get_qs_env(qs_env, &
246 pw_env=pw_env, &
247 input=input, &
248 para_env=para_env, &
249 rho=rho)
250
251 cpassert(ASSOCIATED(rho1))
252
253 IF (lrigpw) THEN
254 CALL get_qs_env(qs_env, &
255 lri_env=lri_env, &
256 lri_density=lri_density, &
257 atomic_kind_set=atomic_kind_set)
258 END IF
259
260 gapw = (section_get_ival(input, "DFT%QS%METHOD") == do_method_gapw)
261 gapw_xc = (section_get_ival(input, "DFT%QS%METHOD") == do_method_gapw_xc)
262 IF (gapw_xc) THEN
263 cpassert(ASSOCIATED(rho1_xc))
264 END IF
265
266 CALL kpp1_check_i_alloc(p_env%kpp1_env, qs_env, do_excitations, lsd_singlets, do_triplet)
267
268 CALL qs_rho_get(rho, rho_ao=rho_ao)
269 CALL qs_rho_get(rho1, rho_g=rho1_g)
270
271 ! gets the tmp grids
272 cpassert(ASSOCIATED(pw_env))
273 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
274 poisson_env=poisson_env)
275 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
276
277 IF (gapw .OR. gapw_xc) &
278 CALL prepare_gapw_den(qs_env, p_env%local_rho_set, do_rho0=(.NOT. gapw_xc))
279
280 ! *** calculate the hartree potential on the total density ***
281 CALL auxbas_pw_pool%create_pw(rho1_tot_gspace)
282
283 CALL pw_copy(rho1_g(1), rho1_tot_gspace)
284 DO ispin = 2, nspins
285 CALL pw_axpy(rho1_g(ispin), rho1_tot_gspace)
286 END DO
287 IF (gapw) &
288 CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rho0_s_gs, rho1_tot_gspace)
289
290 scf_section => section_vals_get_subs_vals(input, "DFT%SCF")
291 IF (cp_print_key_should_output(logger%iter_info, scf_section, "PRINT%TOTAL_DENSITIES") &
292 /= 0) THEN
293 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%TOTAL_DENSITIES", &
294 extension=".scfLog")
295 CALL print_densities(rho1, rho1_tot_gspace, output_unit)
296 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
297 "PRINT%TOTAL_DENSITIES")
298 END IF
299
300 IF (.NOT. (nspins == 1 .AND. do_excitations .AND. do_triplet)) THEN
301 block
302 TYPE(pw_c1d_gs_type) :: v_hartree_gspace
303 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
304 CALL pw_poisson_solve(poisson_env, rho1_tot_gspace, &
305 energy_hartree, &
306 v_hartree_gspace)
307 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
308 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
309 END block
310 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
311 END IF
312
313 CALL auxbas_pw_pool%give_back_pw(rho1_tot_gspace)
314
315 ! *** calculate the xc potential ***
316 IF (gapw_xc) THEN
317 CALL qs_rho_get(rho1_xc, rho_r=rho1_r, tau_r=tau1_r)
318 ELSE
319 CALL qs_rho_get(rho1, rho_r=rho1_r, tau_r=tau1_r)
320 END IF
321
322 IF (nspins == 1 .AND. do_excitations .AND. &
323 (lsd_singlets .OR. do_triplet)) THEN
324
325 lsd = .true.
326 ALLOCATE (rho1_r_pw(2))
327 DO ispin = 1, 2
328 CALL rho1_r_pw(ispin)%create(rho1_r(1)%pw_grid)
329 CALL pw_transfer(rho1_r(1), rho1_r_pw(ispin))
330 END DO
331
332 IF (ASSOCIATED(tau1_r)) THEN
333 ALLOCATE (tau1_r_pw(2))
334 DO ispin = 1, 2
335 CALL tau1_r_pw(ispin)%create(tau1_r(1)%pw_grid)
336 CALL pw_transfer(tau1_r(1), tau1_r_pw(ispin))
337 END DO
338 END IF
339
340 ELSE
341
342 rho1_r_pw => rho1_r
343
344 tau1_r_pw => tau1_r
345
346 END IF
347
348 CALL xc_calc_2nd_deriv(v_xc, v_xc_tau, p_env%kpp1_env%deriv_set, p_env%kpp1_env%rho_set, &
349 rho1_r_pw, rho1_g_pw, tau1_r_pw, auxbas_pw_pool, xc_section, .false., &
350 lsd_singlets=lsd_singlets, do_excitations=do_excitations, &
351 do_triplet=do_triplet, do_tddft=do_tddft, &
352 compute_virial=calc_virial, virial_xc=virial)
353
354 DO ispin = 1, nspins
355 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
356 END DO
357 v_rspace_new => v_xc
358 IF (SIZE(v_xc) /= nspins) THEN
359 CALL auxbas_pw_pool%give_back_pw(v_xc(2))
360 END IF
361 NULLIFY (v_xc)
362 IF (ASSOCIATED(v_xc_tau)) THEN
363 DO ispin = 1, nspins
364 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
365 END DO
366 IF (SIZE(v_xc_tau) /= nspins) THEN
367 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(2))
368 END IF
369 END IF
370
371 IF (gapw .OR. gapw_xc) THEN
372 CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
373 rho1_atom_set => p_env%local_rho_set%rho_atom_set
374 CALL calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, xc_section, para_env, &
375 do_tddft=do_tddft, do_triplet=do_triplet)
376 END IF
377
378 IF (nspins == 1 .AND. do_excitations .AND. &
379 (lsd_singlets .OR. do_triplet)) THEN
380 DO ispin = 1, SIZE(rho1_r_pw)
381 CALL rho1_r_pw(ispin)%release()
382 END DO
383 DEALLOCATE (rho1_r_pw)
384 IF (ASSOCIATED(tau1_r_pw)) THEN
385 DO ispin = 1, SIZE(tau1_r_pw)
386 CALL tau1_r_pw(ispin)%release()
387 END DO
388 DEALLOCATE (tau1_r_pw)
389 END IF
390 END IF
391
392 alpha = 1.0_dp
393 IF (do_excitations .AND. nspins == 1) alpha = 2.0_dp
394
395 !-------------------------------!
396 ! Add both hartree and xc terms !
397 !-------------------------------!
398 DO ispin = 1, nspins
399 CALL dbcsr_set(p_env%kpp1_env%v_ao(ispin)%matrix, 0.0_dp)
400
401 ! XC and Hartree are integrated separatedly
402 ! XC uses the soft basis set only
403 IF (gapw_xc) THEN
404
405 IF (do_excitations .AND. nspins == 1) THEN
406 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
407 pmat=rho_ao(ispin), &
408 hmat=p_env%kpp1_env%v_ao(ispin), &
409 qs_env=qs_env, &
410 calculate_forces=my_calc_forces, gapw=gapw_xc)
411
412 IF (ASSOCIATED(v_xc_tau)) THEN
413 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
414 pmat=rho_ao(ispin), &
415 hmat=p_env%kpp1_env%v_ao(ispin), &
416 qs_env=qs_env, &
417 compute_tau=.true., &
418 calculate_forces=my_calc_forces, gapw=gapw_xc)
419 END IF
420
421 ! add hartree only for SINGLETS
422 IF (.NOT. do_triplet) THEN
423 CALL pw_copy(v_hartree_rspace, v_rspace_new(1))
424
425 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
426 pmat=rho_ao(ispin), &
427 hmat=p_env%kpp1_env%v_ao(ispin), &
428 qs_env=qs_env, &
429 calculate_forces=my_calc_forces, gapw=gapw)
430 END IF
431 ELSE
432 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
433 pmat=rho_ao(ispin), &
434 hmat=p_env%kpp1_env%v_ao(ispin), &
435 qs_env=qs_env, &
436 calculate_forces=my_calc_forces, gapw=gapw_xc)
437
438 IF (ASSOCIATED(v_xc_tau)) THEN
439 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
440 pmat=rho_ao(ispin), &
441 hmat=p_env%kpp1_env%v_ao(ispin), &
442 qs_env=qs_env, &
443 compute_tau=.true., &
444 calculate_forces=my_calc_forces, gapw=gapw_xc)
445 END IF
446
447 CALL pw_copy(v_hartree_rspace, v_rspace_new(ispin))
448 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
449 pmat=rho_ao(ispin), &
450 hmat=p_env%kpp1_env%v_ao(ispin), &
451 qs_env=qs_env, &
452 calculate_forces=my_calc_forces, gapw=gapw)
453 END IF
454
455 ELSE
456
457 IF (do_excitations .AND. nspins == 1) THEN
458
459 ! add hartree only for SINGLETS
460 IF (.NOT. do_triplet) THEN
461 CALL pw_axpy(v_hartree_rspace, v_rspace_new(1))
462 END IF
463 ELSE
464 CALL pw_axpy(v_hartree_rspace, v_rspace_new(ispin))
465 END IF
466
467 IF (lrigpw) THEN
468 IF (ASSOCIATED(v_xc_tau)) cpabort("Meta-GGA functionals not supported with LRI!")
469
470 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
471 CALL get_qs_env(qs_env, nkind=nkind)
472 DO ikind = 1, nkind
473 lri_v_int(ikind)%v_int = 0.0_dp
474 END DO
475 CALL integrate_v_rspace_one_center(v_rspace_new(ispin), qs_env, &
476 lri_v_int, .false., "LRI_AUX")
477 DO ikind = 1, nkind
478 CALL para_env%sum(lri_v_int(ikind)%v_int)
479 END DO
480 ALLOCATE (k1mat(1))
481 k1mat(1)%matrix => p_env%kpp1_env%v_ao(ispin)%matrix
482 IF (lri_env%exact_1c_terms) THEN
483 CALL integrate_v_rspace_diagonal(v_rspace_new(ispin), k1mat(1)%matrix, &
484 rho_ao(ispin)%matrix, qs_env, my_calc_forces, "ORB")
485 END IF
486 CALL calculate_lri_ks_matrix(lri_env, lri_v_int, k1mat, atomic_kind_set)
487 DEALLOCATE (k1mat)
488 ELSE
489 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
490 pmat=rho_ao(ispin), &
491 hmat=p_env%kpp1_env%v_ao(ispin), &
492 qs_env=qs_env, &
493 calculate_forces=my_calc_forces, gapw=gapw)
494
495 IF (ASSOCIATED(v_xc_tau)) THEN
496 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
497 pmat=rho_ao(ispin), &
498 hmat=p_env%kpp1_env%v_ao(ispin), &
499 qs_env=qs_env, &
500 compute_tau=.true., &
501 calculate_forces=my_calc_forces, gapw=gapw)
502 END IF
503 END IF
504 END IF
505
506 CALL dbcsr_add(p_env%kpp1(ispin)%matrix, p_env%kpp1_env%v_ao(ispin)%matrix, 1.0_dp, alpha)
507 END DO
508
509 IF (gapw) THEN
510 IF (.NOT. (do_excitations .AND. nspins == 1 .AND. do_triplet)) THEN
511 CALL vh_1c_gg_integrals(qs_env, energy_hartree_1c, &
512 p_env%hartree_local%ecoul_1c, &
513 p_env%local_rho_set, &
514 para_env, tddft=.true., core_2nd=.true.)
515 CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace, para_env, &
516 calculate_forces=my_calc_forces, &
517 local_rho_set=p_env%local_rho_set)
518 END IF
519 ! *** Add single atom contributions to the KS matrix ***
520 ! remap pointer
521 ns = SIZE(p_env%kpp1)
522 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
523 ns = SIZE(rho_ao)
524 psmat(1:ns, 1:1) => rho_ao(1:ns)
525 CALL update_ks_atom(qs_env, ksmat, psmat, forces=my_calc_forces, tddft=.true., &
526 rho_atom_external=p_env%local_rho_set%rho_atom_set)
527 ELSEIF (gapw_xc) THEN
528 ns = SIZE(p_env%kpp1)
529 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
530 ns = SIZE(rho_ao)
531 psmat(1:ns, 1:1) => rho_ao(1:ns)
532 CALL update_ks_atom(qs_env, ksmat, psmat, forces=my_calc_forces, tddft=.true., &
533 rho_atom_external=p_env%local_rho_set%rho_atom_set)
534 END IF
535
536 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
537 DO ispin = 1, SIZE(v_rspace_new)
538 CALL auxbas_pw_pool%give_back_pw(v_rspace_new(ispin))
539 END DO
540 DEALLOCATE (v_rspace_new)
541 IF (ASSOCIATED(v_xc_tau)) THEN
542 DO ispin = 1, SIZE(v_xc_tau)
543 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
544 END DO
545 DEALLOCATE (v_xc_tau)
546 END IF
547
548 CALL timestop(handle)
549 END SUBROUTINE calc_kpp1
550
551! **************************************************************************************************
552!> \brief calcualtes the k_p_p1 kernel of the perturbation theory with finite
553!> differences
554!> \param qs_env kpp1's qs_env
555!> \param k_p_p1 the sparse matrix that will contain the kernel k_p_p1
556!> \param rho the density where to evaluate the derivatives (i.e. p along
557!> with with its grid representations, that must be valid)
558!> \param rho1 the density that represent the first direction along which
559!> you should evaluate the derivatives
560!> \param diff the amount of the finite difference step
561!> \par History
562!> 01.2003 created [fawzi]
563!> \author Fawzi Mohamed
564!> \note
565!> useful for testing purposes.
566!> rescale my_diff depending on the norm of rho1?
567! **************************************************************************************************
568 SUBROUTINE kpp1_calc_k_p_p1_fdiff(qs_env, k_p_p1, rho, rho1, &
569 diff)
570 TYPE(qs_environment_type), POINTER :: qs_env
571 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: k_p_p1
572 TYPE(qs_rho_type), POINTER :: rho, rho1
573 REAL(kind=dp), INTENT(in), OPTIONAL :: diff
574
575 INTEGER :: ispin, nspins
576 REAL(kind=dp) :: my_diff
577 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_2, matrix_s, rho1_ao, rho_ao
578 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho1_g, rho_g
579 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho1_r, rho_r
580 TYPE(qs_energy_type), POINTER :: qs_energy
581
582 NULLIFY (ks_2, matrix_s, qs_energy, rho_ao, rho1_ao, rho_r, rho1_r, rho_g, rho1_g)
583 nspins = SIZE(k_p_p1)
584 my_diff = 1.0e-6_dp
585 IF (PRESENT(diff)) my_diff = diff
586 CALL allocate_qs_energy(qs_energy)
587
588 CALL qs_rho_get(rho, rho_ao=rho_ao, rho_r=rho_r, rho_g=rho_g)
589 CALL qs_rho_get(rho1, rho_ao=rho1_ao, rho_r=rho1_r, rho_g=rho1_g)
590 CALL get_qs_env(qs_env, matrix_s=matrix_s)
591
592! rho = rho0+h/2*rho1
593 my_diff = my_diff/2.0_dp
594 DO ispin = 1, SIZE(k_p_p1)
595 CALL dbcsr_add(rho_ao(ispin)%matrix, rho1_ao(ispin)%matrix, &
596 alpha_scalar=1.0_dp, beta_scalar=my_diff)
597 CALL pw_axpy(rho1_r(ispin), rho_r(ispin), my_diff)
598 CALL pw_axpy(rho1_g(ispin), rho_g(ispin), my_diff)
599 END DO
600
601 CALL qs_ks_build_kohn_sham_matrix(qs_env, &
602 ext_ks_matrix=k_p_p1, &
603 calculate_forces=.false., &
604 just_energy=.false.)
605
606 CALL dbcsr_allocate_matrix_set(ks_2, nspins)
607 DO ispin = 1, nspins
608 ALLOCATE (ks_2(ispin)%matrix)
609 CALL dbcsr_copy(ks_2(ispin)%matrix, matrix_s(1)%matrix, &
610 name="tmp_ks2-"//adjustl(cp_to_string(ispin)))
611 END DO
612
613! rho = rho0-h/2*rho1
614 my_diff = -2.0_dp*my_diff
615 DO ispin = 1, nspins
616 CALL dbcsr_add(rho_ao(ispin)%matrix, rho1_ao(ispin)%matrix, &
617 alpha_scalar=1.0_dp, beta_scalar=my_diff)
618 CALL pw_axpy(rho1_r(ispin), rho_r(ispin), my_diff)
619 CALL pw_axpy(rho1_g(ispin), rho_g(ispin), my_diff)
620 END DO
621
622 CALL qs_ks_build_kohn_sham_matrix(qs_env, &
623 ext_ks_matrix=ks_2, &
624 calculate_forces=.false., &
625 just_energy=.false.)
626
627! rho = rho0
628 my_diff = -0.5_dp*my_diff
629 DO ispin = 1, nspins
630 CALL dbcsr_add(rho_ao(ispin)%matrix, rho1_ao(ispin)%matrix, &
631 alpha_scalar=1.0_dp, beta_scalar=my_diff)
632 CALL pw_axpy(rho1_r(ispin), rho_r(ispin), my_diff)
633 CALL pw_axpy(rho1_g(ispin), rho_g(ispin), my_diff)
634 END DO
635
636! k_p_p1=(H(rho0+h/2 rho1)-H(rho0-h/2 rho1))/h
637 DO ispin = 1, nspins
638 CALL dbcsr_add(k_p_p1(ispin)%matrix, ks_2(ispin)%matrix, &
639 alpha_scalar=1.0_dp, beta_scalar=-1.0_dp)
640 CALL dbcsr_scale(k_p_p1(ispin)%matrix, alpha_scalar=0.5_dp/my_diff)
641 END DO
642
643 CALL dbcsr_deallocate_matrix_set(ks_2)
644 CALL deallocate_qs_energy(qs_energy)
645 END SUBROUTINE kpp1_calc_k_p_p1_fdiff
646
647! **************************************************************************************************
648!> \brief checks that the intenal storage is allocated, and allocs it if needed
649!> \param kpp1_env the environment to check
650!> \param qs_env the qs environment this kpp1_env lives in
651!> \param do_excitations ...
652!> \param lsd_singlets ...
653!> \param do_triplet ...
654!> \author Fawzi Mohamed
655!> \note
656!> private routine
657! **************************************************************************************************
658 SUBROUTINE kpp1_check_i_alloc(kpp1_env, qs_env, do_excitations, lsd_singlets, do_triplet)
659
660 TYPE(qs_kpp1_env_type) :: kpp1_env
661 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
662 LOGICAL, INTENT(IN) :: do_excitations, lsd_singlets, do_triplet
663
664 INTEGER :: ispin, nspins
665 TYPE(admm_type), POINTER :: admm_env
666 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
667 TYPE(dft_control_type), POINTER :: dft_control
668 TYPE(pw_env_type), POINTER :: pw_env
669 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
670 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: my_rho_r, my_tau_r, rho_r, tau_r
671 TYPE(qs_rho_type), POINTER :: rho
672 TYPE(section_vals_type), POINTER :: admm_xc_section, input, xc_section
673
674! ------------------------------------------------------------------
675
676 NULLIFY (pw_env, auxbas_pw_pool, matrix_s, rho, rho_r, admm_env, dft_control, my_rho_r, my_tau_r)
677
678 CALL get_qs_env(qs_env, pw_env=pw_env, &
679 matrix_s=matrix_s, rho=rho, input=input, &
680 admm_env=admm_env, dft_control=dft_control)
681
682 CALL qs_rho_get(rho, rho_r=rho_r, tau_r=tau_r)
683 nspins = SIZE(rho_r)
684
685 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
686
687 IF (.NOT. ASSOCIATED(kpp1_env%v_ao)) THEN
688 CALL dbcsr_allocate_matrix_set(kpp1_env%v_ao, nspins)
689 DO ispin = 1, nspins
690 ALLOCATE (kpp1_env%v_ao(ispin)%matrix)
691 CALL dbcsr_copy(kpp1_env%v_ao(ispin)%matrix, matrix_s(1)%matrix, &
692 name="kpp1%v_ao-"//adjustl(cp_to_string(ispin)))
693 END DO
694 END IF
695
696 IF (.NOT. ASSOCIATED(kpp1_env%deriv_set)) THEN
697
698 IF (nspins == 1 .AND. (do_excitations .AND. &
699 (lsd_singlets .OR. do_triplet))) THEN
700 ALLOCATE (my_rho_r(2))
701 DO ispin = 1, 2
702 CALL auxbas_pw_pool%create_pw(my_rho_r(ispin))
703 CALL pw_axpy(rho_r(1), my_rho_r(ispin), 0.5_dp, 0.0_dp)
704 END DO
705 IF (dft_control%use_kinetic_energy_density) THEN
706 ALLOCATE (my_tau_r(2))
707 DO ispin = 1, 2
708 CALL auxbas_pw_pool%create_pw(my_tau_r(ispin))
709 CALL pw_axpy(tau_r(1), my_tau_r(ispin), 0.5_dp, 0.0_dp)
710 END DO
711 END IF
712 ELSE
713 my_rho_r => rho_r
714 IF (dft_control%use_kinetic_energy_density) THEN
715 my_tau_r => tau_r
716 END IF
717 END IF
718
719 IF (dft_control%do_admm) THEN
720 xc_section => admm_env%xc_section_primary
721 ELSE
722 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
723 END IF
724
725 ALLOCATE (kpp1_env%deriv_set, kpp1_env%rho_set)
726 CALL xc_prep_2nd_deriv(kpp1_env%deriv_set, kpp1_env%rho_set, &
727 my_rho_r, auxbas_pw_pool, &
728 xc_section=xc_section, tau_r=my_tau_r)
729
730 IF (nspins == 1 .AND. (do_excitations .AND. &
731 (lsd_singlets .OR. do_triplet))) THEN
732 DO ispin = 1, SIZE(my_rho_r)
733 CALL my_rho_r(ispin)%release()
734 END DO
735 DEALLOCATE (my_rho_r)
736 IF (ASSOCIATED(my_tau_r)) THEN
737 DO ispin = 1, SIZE(my_tau_r)
738 CALL my_tau_r(ispin)%release()
739 END DO
740 DEALLOCATE (my_tau_r)
741 END IF
742 END IF
743 END IF
744
745 ! ADMM Correction
746 IF (dft_control%do_admm) THEN
747 IF (admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
748 IF (.NOT. ASSOCIATED(kpp1_env%deriv_set_admm)) THEN
749 cpassert(.NOT. do_triplet)
750 admm_xc_section => admm_env%xc_section_aux
751 CALL get_admm_env(qs_env%admm_env, rho_aux_fit=rho)
752 CALL qs_rho_get(rho, rho_r=rho_r)
753 ALLOCATE (kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm)
754 CALL xc_prep_2nd_deriv(kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm, &
755 rho_r, auxbas_pw_pool, &
756 xc_section=admm_xc_section)
757 END IF
758 END IF
759 END IF
760
761 END SUBROUTINE kpp1_check_i_alloc
762
763! **************************************************************************************************
764!> \brief function to advise of changes either in the grids
765!> \param kpp1_env the kpp1_env
766!> \par History
767!> 11.2002 created [fawzi]
768!> \author Fawzi Mohamed
769! **************************************************************************************************
770 SUBROUTINE kpp1_did_change(kpp1_env)
771 TYPE(qs_kpp1_env_type) :: kpp1_env
772
773 IF (ASSOCIATED(kpp1_env%deriv_set)) THEN
774 CALL xc_dset_release(kpp1_env%deriv_set)
775 DEALLOCATE (kpp1_env%deriv_set)
776 NULLIFY (kpp1_env%deriv_set)
777 END IF
778 IF (ASSOCIATED(kpp1_env%rho_set)) THEN
779 CALL xc_rho_set_release(kpp1_env%rho_set)
780 DEALLOCATE (kpp1_env%rho_set)
781 END IF
782
783 END SUBROUTINE kpp1_did_change
784
785! **************************************************************************************************
786!> \brief ...
787!> \param rho1 ...
788!> \param rho1_tot_gspace ...
789!> \param out_unit ...
790! **************************************************************************************************
791 SUBROUTINE print_densities(rho1, rho1_tot_gspace, out_unit)
792
793 TYPE(qs_rho_type), POINTER :: rho1
794 TYPE(pw_c1d_gs_type), INTENT(IN) :: rho1_tot_gspace
795 INTEGER :: out_unit
796
797 REAL(kind=dp) :: total_rho_gspace
798 REAL(kind=dp), DIMENSION(:), POINTER :: tot_rho1_r
799
800 NULLIFY (tot_rho1_r)
801
802 total_rho_gspace = pw_integrate_function(rho1_tot_gspace, isign=-1)
803 IF (out_unit > 0) THEN
804 CALL qs_rho_get(rho1, tot_rho_r=tot_rho1_r)
805 WRITE (unit=out_unit, fmt="(T3,A,T60,F20.10)") &
806 "KPP1 total charge density (r-space):", &
807 accurate_sum(tot_rho1_r), &
808 "KPP1 total charge density (g-space):", &
809 total_rho_gspace
810 END IF
811
812 END SUBROUTINE print_densities
813
814END 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...
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 tddfpt_excitations
integer, parameter, public tddfpt_triplet
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
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
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 deallocate_qs_energy(qs_energy)
Deallocate a Quickstep energy data structure.
subroutine, public allocate_qs_energy(qs_energy)
Allocate and/or initialise a Quickstep energy data structure.
Perform a QUICKSTEP wavefunction optimization (single point)
Definition qs_energy.F:14
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_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, 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, rhs)
Get the QUICKSTEP environment.
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external)
...
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 kpp1_calc_k_p_p1(p_env, qs_env, rho1, rho1_xc)
calculates the k_p_p1 kernel of the perturbation theory
subroutine, public kpp1_create(kpp1_env)
allocates and initializes a kpp1_env
subroutine, public kpp1_calc_k_p_p1_fdiff(qs_env, k_p_p1, rho, rho1, diff)
calcualtes the k_p_p1 kernel of the perturbation theory with finite differences
subroutine, public kpp1_did_change(kpp1_env)
function to advise of changes either in the grids
subroutine, public calc_kpp1(rho1_xc, rho1, xc_section, do_tddft, lsd_singlets, lrigpw, do_excitations, do_triplet, qs_env, p_env, calc_forces, calc_virial, virial)
...
subroutine, public kpp1_check_i_alloc(kpp1_env, qs_env, do_excitations, lsd_singlets, do_triplet)
checks that the intenal storage is allocated, and allocs it if needed
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
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_build_kohn_sham_matrix(qs_env, calculate_forces, just_energy, print_active, ext_ks_matrix)
routine where the real calculations are made: the KS matrix is calculated
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)
...
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_tddft, 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, lsd_singlets, do_excitations, do_triplet, do_tddft, compute_virial, virial_xc)
Caller routine to calculate the second order potential in the direction of rho1_r.
Definition xc.F:1523
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:5364
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.