(git:b977e33)
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,&
18  USE atomic_kind_types, ONLY: atomic_kind_type
19  USE cp_control_types, ONLY: dft_control_type
23  cp_logger_type,&
24  cp_to_string
28  USE dbcsr_api, ONLY: dbcsr_add,&
29  dbcsr_copy,&
30  dbcsr_p_type,&
31  dbcsr_scale,&
32  dbcsr_set
42  section_vals_type,&
44  USE kahan_sum, ONLY: accurate_sum
45  USE kinds, ONLY: dp
46  USE lri_environment_types, ONLY: lri_density_type,&
47  lri_environment_type,&
48  lri_kind_type
50  USE message_passing, ONLY: mp_para_env_type
51  USE pw_env_types, ONLY: pw_env_get,&
52  pw_env_type
53  USE pw_methods, ONLY: pw_axpy,&
54  pw_copy,&
55  pw_integrate_function,&
56  pw_scale,&
57  pw_transfer
58  USE pw_poisson_methods, ONLY: pw_poisson_solve
59  USE pw_poisson_types, ONLY: pw_poisson_type
60  USE pw_pool_types, ONLY: pw_pool_type
61  USE pw_types, ONLY: pw_c1d_gs_type,&
62  pw_r3d_rs_type
65  qs_energy_type
66  USE qs_environment_types, ONLY: get_qs_env,&
67  qs_environment_type
69  USE qs_integrate_potential, ONLY: integrate_v_rspace,&
70  integrate_v_rspace_diagonal,&
71  integrate_v_rspace_one_center
72  USE qs_kpp1_env_types, ONLY: qs_kpp1_env_type
73  USE qs_ks_atom, ONLY: update_ks_atom
75  USE qs_p_env_types, ONLY: qs_p_env_type
77  USE qs_rho_atom_types, ONLY: rho_atom_type
78  USE qs_rho_types, ONLY: qs_rho_get,&
79  qs_rho_type
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, &
99  calc_kpp1
100 
101 CONTAINS
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 
814 END 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
Definition: pw_env_types.F:14
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
Definition: pw_env_types.F:113
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 ...
Definition: pw_pool_types.F:24
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
Definition: qs_ks_methods.F:22
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...
Definition: qs_rho_types.F:18
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...
Definition: qs_rho_types.F:229
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)
...
Definition: qs_vxc_atom.F:446
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