(git:744416f)
Loading...
Searching...
No Matches
kg_correction.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 Routines for a Kim-Gordon-like partitioning into molecular subunits
10!> \par History
11!> 2012.06 created [Martin Haeufel]
12!> \author Martin Haeufel and Florian Schiffmann
13! **************************************************************************************************
17 USE cp_dbcsr_api, ONLY: dbcsr_add,&
31 USE kinds, ONLY: dp
40 USE pw_env_types, ONLY: pw_env_get,&
42 USE pw_methods, ONLY: pw_integral_ab,&
45 USE pw_types, ONLY: pw_r3d_rs_type
48 USE qs_fxc, ONLY: qs_fxc_create
49 USE qs_integrate_potential, ONLY: integrate_v_rspace,&
50 integrate_v_rspace_one_center
55 USE qs_rho_types, ONLY: qs_rho_create,&
61 USE qs_vxc, ONLY: qs_vxc_create
62 USE virial_types, ONLY: virial_type
64#include "./base/base_uses.f90"
65
66 IMPLICIT NONE
67
68 PRIVATE
69
70 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'kg_correction'
71
72 PUBLIC :: kg_ekin_subset
73
74CONTAINS
75
76! **************************************************************************************************
77!> \brief Calculates the subsystem Hohenberg-Kohn kinetic energy and the forces
78!> \param qs_env ...
79!> \param ks_matrix ...
80!> \param ekin_mol ...
81!> \param calc_force ...
82!> \param do_kernel Contribution of kinetic energy functional to kernel in response calculation
83!> \param pmat_ext Response density used to fold 2nd deriv or to integrate kinetic energy functional
84!> \par History
85!> 2012.06 created [Martin Haeufel]
86!> 2014.01 added atomic potential option [JGH]
87!> 2020.01 Added KG contribution to linear response [fbelle]
88!> \author Martin Haeufel and Florian Schiffmann
89! **************************************************************************************************
90 SUBROUTINE kg_ekin_subset(qs_env, ks_matrix, ekin_mol, calc_force, do_kernel, pmat_ext)
91 TYPE(qs_environment_type), POINTER :: qs_env
92 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_matrix
93 REAL(kind=dp), INTENT(out) :: ekin_mol
94 LOGICAL, INTENT(IN) :: calc_force, do_kernel
95 TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
96 POINTER :: pmat_ext
97
98 LOGICAL :: lrigpw
99 TYPE(dft_control_type), POINTER :: dft_control
100 TYPE(kg_environment_type), POINTER :: kg_env
101
102 CALL get_qs_env(qs_env, kg_env=kg_env, dft_control=dft_control)
103 lrigpw = dft_control%qs_control%lrigpw
104 IF ((kg_env%tnadd_method == kg_tnadd_embed_ri .OR. &
105 (kg_env%tnadd_method == kg_tnadd_embed .AND. lrigpw)) .AND. &
106 kg_uses_kinetic_energy_density(kg_env, dft_control%lsd)) THEN
107 cpabort("KG LRI/RI embedding with meta-kinetic energy functionals not implemented")
108 END IF
109 IF (kg_env%tnadd_method == kg_tnadd_embed) THEN
110 IF (lrigpw) THEN
111 CALL kg_ekin_embed_lri(qs_env, kg_env, ks_matrix, ekin_mol, calc_force)
112 ELSE
113 CALL kg_ekin_embed(qs_env, kg_env, ks_matrix, ekin_mol, calc_force, &
114 do_kernel, pmat_ext)
115 END IF
116 ELSE IF (kg_env%tnadd_method == kg_tnadd_embed_ri) THEN
117 CALL kg_ekin_ri_embed(qs_env, kg_env, ks_matrix, ekin_mol, calc_force, &
118 do_kernel, pmat_ext)
119 ELSE IF (kg_env%tnadd_method == kg_tnadd_atomic) THEN
120 CALL kg_ekin_atomic(qs_env, ks_matrix, ekin_mol)
121 ELSE IF (kg_env%tnadd_method == kg_tnadd_none) THEN
122 ekin_mol = 0.0_dp
123 ELSE
124 cpabort("Unknown KG embedding method")
125 END IF
126
127 END SUBROUTINE kg_ekin_subset
128
129! **************************************************************************************************
130!> \brief Returns whether the KG XC section needs the kinetic energy density.
131!> \param kg_env Kim-Gordon environment
132!> \param lsd spin-polarized calculation flag
133!> \return ...
134! **************************************************************************************************
135 FUNCTION kg_uses_kinetic_energy_density(kg_env, lsd) RESULT(res)
136 TYPE(kg_environment_type), POINTER :: kg_env
137 LOGICAL, INTENT(IN) :: lsd
138 LOGICAL :: res
139
140 LOGICAL :: explicit
141 TYPE(section_vals_type), POINTER :: xc_fun_section
142
143 res = .false.
144 IF (.NOT. ASSOCIATED(kg_env%xc_section_kg)) RETURN
145
146 xc_fun_section => section_vals_get_subs_vals(kg_env%xc_section_kg, "XC_FUNCTIONAL")
147 CALL section_vals_get(xc_fun_section, explicit=explicit)
148 IF (explicit) res = xc_uses_kinetic_energy_density(xc_fun_section, lsd)
149
150 END FUNCTION kg_uses_kinetic_energy_density
151
152! **************************************************************************************************
153!> \brief ...
154!> \param qs_env ...
155!> \param kg_env ...
156!> \param ks_matrix ...
157!> \param ekin_mol ...
158!> \param calc_force ...
159!> \param do_kernel Contribution of kinetic energy functional to kernel in response calculation
160!> \param pmat_ext Response density used to fold 2nd deriv or to integrate kinetic energy functional
161! **************************************************************************************************
162 SUBROUTINE kg_ekin_embed(qs_env, kg_env, ks_matrix, ekin_mol, calc_force, do_kernel, pmat_ext)
163 TYPE(qs_environment_type), POINTER :: qs_env
164 TYPE(kg_environment_type), POINTER :: kg_env
165 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_matrix
166 REAL(kind=dp), INTENT(out) :: ekin_mol
167 LOGICAL, INTENT(IN) :: calc_force, do_kernel
168 TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
169 POINTER :: pmat_ext
170
171 CHARACTER(LEN=*), PARAMETER :: routinen = 'kg_ekin_embed'
172
173 CHARACTER(LEN=10) :: basis_type
174 INTEGER :: handle, iounit, ispin, isub, nspins
175 LOGICAL :: gapw, gapw_xc, use_gapw_soft, use_virial
176 REAL(kind=dp) :: alpha, ekin_imol
177 REAL(kind=dp), DIMENSION(3, 3) :: xcvirial
178 TYPE(cp_logger_type), POINTER :: logger
179 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: density_matrix
180 TYPE(dft_control_type), POINTER :: dft_control
181 TYPE(pw_env_type), POINTER :: pw_env
182 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
183 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho1_r, rho_r, tau1_r, vxc_rho, vxc_tau
184 TYPE(qs_ks_env_type), POINTER :: ks_env
185 TYPE(qs_rho_type), POINTER :: old_rho, rho1, rho1_use, rho1_xc, &
186 rho_struct, rho_use, rho_xc
187 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho0_atom_set, rho1_atom_set
188 TYPE(section_vals_type), POINTER :: xc_section
189 TYPE(virial_type), POINTER :: virial
190
191 CALL timeset(routinen, handle)
192
193 logger => cp_get_default_logger()
194 iounit = cp_logger_get_default_unit_nr(logger)
195
196 NULLIFY (ks_env, dft_control, old_rho, pw_env, rho1_use, rho1_xc, rho_struct, &
197 rho_use, rho_xc, virial, vxc_rho, vxc_tau)
198 NULLIFY (rho0_atom_set, rho1_atom_set)
199
200 CALL get_qs_env(qs_env, &
201 ks_env=ks_env, &
202 rho=old_rho, &
203 dft_control=dft_control, &
204 virial=virial, &
205 pw_env=pw_env)
206 nspins = dft_control%nspins
207 gapw = dft_control%qs_control%gapw
208 gapw_xc = dft_control%qs_control%gapw_xc
209 use_gapw_soft = gapw .OR. gapw_xc
210 IF (use_gapw_soft) THEN
211 basis_type = "ORB_SOFT"
212 ELSE
213 basis_type = "ORB"
214 END IF
215 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
216 use_virial = use_virial .AND. calc_force
217
218 ! Kernel potential in response calculation (no forces calculated at this point)
219 ! requires spin-factor
220 ! alpha = 2 closed-shell
221 ! alpha = 1 open-shell
222 alpha = 1.0_dp
223 IF (do_kernel .AND. .NOT. calc_force .AND. nspins == 1) alpha = 2.0_dp
224
225 NULLIFY (auxbas_pw_pool)
226 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
227
228 ! get the density matrix
229 CALL qs_rho_get(old_rho, rho_ao=density_matrix)
230 ! allocate and initialize the density
231 ALLOCATE (rho_struct)
232 CALL qs_rho_create(rho_struct)
233 ! set the density matrix to the blocked matrix
234 CALL qs_rho_set(rho_struct, rho_ao=density_matrix) ! blocked_matrix
235 CALL qs_rho_rebuild(rho_struct, qs_env, rebuild_ao=.false., rebuild_grids=.true.)
236 IF (gapw_xc) THEN
237 ALLOCATE (rho_xc)
238 CALL qs_rho_create(rho_xc)
239 CALL qs_rho_rebuild(rho_xc, qs_env, rebuild_ao=.true., rebuild_grids=.true.)
240 END IF
241 ! full density kinetic energy term
242 IF (gapw_xc) THEN
243 CALL qs_rho_update_rho(rho_struct, qs_env, rho_xc_external=rho_xc)
244 rho_use => rho_xc
245 ELSE
246 CALL qs_rho_update_rho(rho_struct, qs_env)
247 rho_use => rho_struct
248 END IF
249 ! get blocked density that has been put on grid
250 CALL qs_rho_get(rho_use, rho_r=rho_r)
251
252 ! If external density associated then it is needed either for
253 ! 1) folding of second derivative while partially integrating, or
254 ! 2) integration of response forces
255 NULLIFY (rho1)
256 IF (PRESENT(pmat_ext)) THEN
257 ALLOCATE (rho1)
258 CALL qs_rho_create(rho1)
259 CALL qs_rho_set(rho1, rho_ao=pmat_ext)
260 CALL qs_rho_rebuild(rho1, qs_env, rebuild_ao=.false., rebuild_grids=.true.)
261 IF (gapw_xc) THEN
262 ALLOCATE (rho1_xc)
263 CALL qs_rho_create(rho1_xc)
264 CALL qs_rho_rebuild(rho1_xc, qs_env, rebuild_ao=.true., rebuild_grids=.true.)
265 CALL qs_rho_update_rho(rho1, qs_env, rho_xc_external=rho1_xc)
266 rho1_use => rho1_xc
267 ELSE
268 CALL qs_rho_update_rho(rho1, qs_env)
269 rho1_use => rho1
270 END IF
271 END IF
272
273 ! XC-section pointing to kinetic energy functional in KG environment
274 NULLIFY (xc_section)
275 xc_section => kg_env%xc_section_kg
276
277 ekin_imol = 0.0_dp
278
279 ! calculate xc potential or kernel
280 IF (do_kernel) THEN
281 ! derivation wrt to rho_struct and evaluation at rho_struct
282 IF (use_virial) virial%pv_xc = 0.0_dp
283 CALL qs_fxc_create(qs_env, rho_use, rho1_use, rho0_atom_set, &
284 xc_section, .false., &
285 vxc_rho, vxc_tau, rho1_atom_set, &
286 compute_virial=use_virial, virial_xc=virial%pv_xc)
287 ELSE
288 CALL qs_vxc_create(ks_env=ks_env, &
289 rho_struct=rho_use, &
290 xc_section=xc_section, &
291 vxc_rho=vxc_rho, &
292 vxc_tau=vxc_tau, &
293 exc=ekin_imol)
294 END IF
295
296 ! Integrate xc-potential with external density for outer response forces
297 IF (PRESENT(pmat_ext) .AND. .NOT. do_kernel) THEN
298 CALL qs_rho_get(rho1, rho_ao=density_matrix)
299 CALL qs_rho_get(rho1_use, rho_r=rho1_r, tau_r=tau1_r)
300 ! Direct volume term of virial
301 ! xc-potential is unscaled
302 IF (use_virial) THEN
303 ekin_imol = 0.0_dp
304 DO ispin = 1, nspins
305 ekin_imol = ekin_imol + pw_integral_ab(rho1_r(ispin), vxc_rho(ispin))
306 IF (ASSOCIATED(vxc_tau)) THEN
307 ekin_imol = ekin_imol + pw_integral_ab(tau1_r(ispin), vxc_tau(ispin))
308 END IF
309 END DO
310 END IF
311 END IF
312
313 DO ispin = 1, nspins
314 CALL pw_scale(vxc_rho(ispin), alpha*vxc_rho(ispin)%pw_grid%dvol)
315 END DO
316
317 DO ispin = 1, nspins
318 CALL integrate_v_rspace(v_rspace=vxc_rho(ispin), &
319 pmat=density_matrix(ispin), hmat=ks_matrix(ispin), &
320 qs_env=qs_env, calculate_forces=calc_force, gapw=use_gapw_soft)
321 CALL auxbas_pw_pool%give_back_pw(vxc_rho(ispin))
322 IF (ASSOCIATED(vxc_tau)) THEN
323 CALL pw_scale(vxc_tau(ispin), alpha*vxc_tau(ispin)%pw_grid%dvol)
324 CALL integrate_v_rspace(v_rspace=vxc_tau(ispin), &
325 pmat=density_matrix(ispin), hmat=ks_matrix(ispin), &
326 qs_env=qs_env, compute_tau=.true., &
327 calculate_forces=calc_force, gapw=use_gapw_soft)
328 CALL auxbas_pw_pool%give_back_pw(vxc_tau(ispin))
329 END IF
330 END DO
331 DEALLOCATE (vxc_rho)
332 IF (ASSOCIATED(vxc_tau)) DEALLOCATE (vxc_tau)
333 ekin_mol = -ekin_imol
334 xcvirial(1:3, 1:3) = 0.0_dp
335 IF (use_virial) THEN
336 xcvirial(1:3, 1:3) = xcvirial(1:3, 1:3) - virial%pv_xc(1:3, 1:3)
337 END IF
338
339 ! loop over all subsets
340 DO isub = 1, kg_env%nsubsets
341 ! calculate the densities for the given blocked density matrix
342 ! pass the subset task_list
343 IF (gapw_xc) THEN
344 CALL qs_rho_update_rho(rho_struct, qs_env, rho_xc_external=rho_xc, &
345 task_list_external=kg_env%subset(isub)%task_list, &
346 task_list_external_soft=kg_env%subset(isub)%task_list)
347 rho_use => rho_xc
348 ELSE
349 CALL qs_rho_update_rho(rho_struct, qs_env, &
350 task_list_external=kg_env%subset(isub)%task_list)
351 rho_use => rho_struct
352 END IF
353 ! Same for external (response) density if present
354 IF (PRESENT(pmat_ext)) THEN
355 IF (gapw_xc) THEN
356 CALL qs_rho_update_rho(rho1, qs_env, rho_xc_external=rho1_xc, &
357 task_list_external=kg_env%subset(isub)%task_list, &
358 task_list_external_soft=kg_env%subset(isub)%task_list)
359 rho1_use => rho1_xc
360 ELSE
361 CALL qs_rho_update_rho(rho1, qs_env, &
362 task_list_external=kg_env%subset(isub)%task_list)
363 rho1_use => rho1
364 END IF
365 END IF
366
367 ekin_imol = 0.0_dp
368 NULLIFY (vxc_rho, vxc_tau)
369
370 ! calculate Hohenberg-Kohn kinetic energy of the density
371 ! corresponding to the remaining molecular block(s)
372 ! info per block in rho_struct now
373
374 ! calculate xc-potential or kernel
375 IF (do_kernel) THEN
376 IF (use_virial) virial%pv_xc = 0.0_dp
377 CALL qs_fxc_create(qs_env, rho_use, rho1_use, rho0_atom_set, &
378 xc_section, .false., &
379 vxc_rho, vxc_tau, rho1_atom_set, &
380 compute_virial=use_virial, virial_xc=virial%pv_xc)
381 ELSE
382 CALL qs_vxc_create(ks_env=ks_env, &
383 rho_struct=rho_use, &
384 xc_section=xc_section, &
385 vxc_rho=vxc_rho, &
386 vxc_tau=vxc_tau, &
387 exc=ekin_imol)
388 END IF
389
390 ! Integrate with response density for outer response forces
391 IF (PRESENT(pmat_ext) .AND. .NOT. do_kernel) THEN
392 CALL qs_rho_get(rho1, rho_ao=density_matrix)
393 CALL qs_rho_get(rho1_use, rho_r=rho1_r, tau_r=tau1_r)
394 ! Direct volume term of virial
395 ! xc-potential is unscaled
396 IF (use_virial) THEN
397 ekin_imol = 0.0_dp
398 DO ispin = 1, nspins
399 ekin_imol = ekin_imol + pw_integral_ab(rho1_r(ispin), vxc_rho(ispin))
400 IF (ASSOCIATED(vxc_tau)) THEN
401 ekin_imol = ekin_imol + pw_integral_ab(tau1_r(ispin), vxc_tau(ispin))
402 END IF
403 END DO
404 END IF
405 END IF
406
407 DO ispin = 1, nspins
408 CALL pw_scale(vxc_rho(ispin), -alpha*vxc_rho(ispin)%pw_grid%dvol)
409
410 CALL integrate_v_rspace(v_rspace=vxc_rho(ispin), &
411 pmat=density_matrix(ispin), &
412 hmat=ks_matrix(ispin), &
413 qs_env=qs_env, &
414 calculate_forces=calc_force, &
415 basis_type=basis_type, &
416 task_list_external=kg_env%subset(isub)%task_list)
417 ! clean up vxc_rho
418 CALL auxbas_pw_pool%give_back_pw(vxc_rho(ispin))
419 IF (ASSOCIATED(vxc_tau)) THEN
420 CALL pw_scale(vxc_tau(ispin), -alpha*vxc_tau(ispin)%pw_grid%dvol)
421 CALL integrate_v_rspace(v_rspace=vxc_tau(ispin), &
422 pmat=density_matrix(ispin), &
423 hmat=ks_matrix(ispin), &
424 qs_env=qs_env, &
425 compute_tau=.true., &
426 calculate_forces=calc_force, &
427 basis_type=basis_type, &
428 task_list_external=kg_env%subset(isub)%task_list)
429 ! clean up vxc_rho
430 CALL auxbas_pw_pool%give_back_pw(vxc_tau(ispin))
431 END IF
432 END DO
433 DEALLOCATE (vxc_rho)
434 IF (ASSOCIATED(vxc_tau)) DEALLOCATE (vxc_tau)
435
436 ekin_mol = ekin_mol + ekin_imol
437
438 IF (use_virial) THEN
439 xcvirial(1:3, 1:3) = xcvirial(1:3, 1:3) + virial%pv_xc(1:3, 1:3)
440 END IF
441
442 END DO
443
444 IF (use_virial) THEN
445 virial%pv_xc(1:3, 1:3) = xcvirial(1:3, 1:3)
446 END IF
447
448 ! clean up rho_struct
449 CALL qs_rho_unset_rho_ao(rho_struct)
450 CALL qs_rho_release(rho_struct)
451 DEALLOCATE (rho_struct)
452 IF (ASSOCIATED(rho_xc)) THEN
453 CALL qs_rho_release(rho_xc)
454 DEALLOCATE (rho_xc)
455 END IF
456 IF (PRESENT(pmat_ext)) THEN
457 CALL qs_rho_unset_rho_ao(rho1)
458 CALL qs_rho_release(rho1)
459 DEALLOCATE (rho1)
460 IF (ASSOCIATED(rho1_xc)) THEN
461 CALL qs_rho_release(rho1_xc)
462 DEALLOCATE (rho1_xc)
463 END IF
464 END IF
465
466 CALL timestop(handle)
467
468 END SUBROUTINE kg_ekin_embed
469
470! **************************************************************************************************
471!> \brief ...
472!> \param qs_env ...
473!> \param kg_env ...
474!> \param ks_matrix ...
475!> \param ekin_mol ...
476!> \param calc_force ...
477! **************************************************************************************************
478 SUBROUTINE kg_ekin_embed_lri(qs_env, kg_env, ks_matrix, ekin_mol, calc_force)
479 TYPE(qs_environment_type), POINTER :: qs_env
480 TYPE(kg_environment_type), POINTER :: kg_env
481 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_matrix
482 REAL(kind=dp), INTENT(out) :: ekin_mol
483 LOGICAL :: calc_force
484
485 CHARACTER(LEN=*), PARAMETER :: routinen = 'kg_ekin_embed_lri'
486
487 INTEGER :: color, handle, iatom, ikind, imol, &
488 ispin, isub, natom, nkind, nspins
489 INTEGER, ALLOCATABLE, DIMENSION(:) :: atomlist
490 LOGICAL :: use_virial
491 REAL(kind=dp) :: ekin_imol
492 REAL(kind=dp), DIMENSION(3, 3) :: xcvirial
493 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
494 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: density_matrix, ksmat
495 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: pmat
496 TYPE(dft_control_type), POINTER :: dft_control
497 TYPE(lri_density_type), POINTER :: lri_density
498 TYPE(lri_environment_type), POINTER :: lri_env
499 TYPE(lri_kind_type), DIMENSION(:), POINTER :: lri_v_int
500 TYPE(mp_para_env_type), POINTER :: para_env
501 TYPE(pw_env_type), POINTER :: pw_env
502 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
503 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: vxc_rho, vxc_tau
504 TYPE(qs_ks_env_type), POINTER :: ks_env
505 TYPE(qs_rho_type), POINTER :: old_rho, rho_struct
506 TYPE(virial_type), POINTER :: virial
507
508 CALL timeset(routinen, handle)
509
510 NULLIFY (vxc_rho, vxc_tau, old_rho, rho_struct, ks_env)
511
512 CALL get_qs_env(qs_env, dft_control=dft_control)
513
514 ! get set of molecules, natom, dft_control, pw_env
515 CALL get_qs_env(qs_env, &
516 ks_env=ks_env, &
517 rho=old_rho, &
518 natom=natom, &
519 dft_control=dft_control, &
520 virial=virial, &
521 para_env=para_env, &
522 pw_env=pw_env)
523
524 nspins = dft_control%nspins
525 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
526 use_virial = use_virial .AND. calc_force
527
528 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
529
530 ! get the density matrix
531 CALL qs_rho_get(old_rho, rho_ao=density_matrix)
532 ! allocate and initialize the density
533 ALLOCATE (rho_struct)
534 CALL qs_rho_create(rho_struct)
535 ! set the density matrix to the blocked matrix
536 CALL qs_rho_set(rho_struct, rho_ao=density_matrix) ! blocked_matrix
537 CALL qs_rho_rebuild(rho_struct, qs_env, rebuild_ao=.false., rebuild_grids=.true.)
538
539 CALL get_qs_env(qs_env, lri_env=lri_env, lri_density=lri_density, nkind=nkind)
540 IF (lri_env%exact_1c_terms) THEN
541 cpabort(" KG with LRI and exact one-center terms not implemented")
542 END IF
543 ALLOCATE (atomlist(natom))
544 DO ispin = 1, nspins
545 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
546 DO ikind = 1, nkind
547 lri_v_int(ikind)%v_int = 0.0_dp
548 IF (calc_force) THEN
549 lri_v_int(ikind)%v_dadr = 0.0_dp
550 lri_v_int(ikind)%v_dfdr = 0.0_dp
551 END IF
552 END DO
553 END DO
554
555 ! full density kinetic energy term
556 atomlist = 1
557 CALL lri_kg_rho_update(rho_struct, qs_env, lri_env, lri_density, atomlist)
558 ekin_imol = 0.0_dp
559 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_struct, xc_section=kg_env%xc_section_kg, &
560 vxc_rho=vxc_rho, vxc_tau=vxc_tau, exc=ekin_imol)
561 IF (ASSOCIATED(vxc_tau)) THEN
562 cpabort(" KG with meta-kinetic energy functionals not implemented")
563 END IF
564 DO ispin = 1, nspins
565 CALL pw_scale(vxc_rho(ispin), vxc_rho(ispin)%pw_grid%dvol)
566 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
567 CALL integrate_v_rspace_one_center(vxc_rho(ispin), qs_env, lri_v_int, calc_force, "LRI_AUX")
568 CALL auxbas_pw_pool%give_back_pw(vxc_rho(ispin))
569 END DO
570 DEALLOCATE (vxc_rho)
571 ekin_mol = -ekin_imol
572 xcvirial(1:3, 1:3) = 0.0_dp
573 IF (use_virial) xcvirial(1:3, 1:3) = xcvirial(1:3, 1:3) - virial%pv_xc(1:3, 1:3)
574
575 ! loop over all subsets
576 DO isub = 1, kg_env%nsubsets
577 atomlist = 0
578 DO iatom = 1, natom
579 imol = kg_env%atom_to_molecule(iatom)
580 color = kg_env%subset_of_mol(imol)
581 IF (color == isub) atomlist(iatom) = 1
582 END DO
583 CALL lri_kg_rho_update(rho_struct, qs_env, lri_env, lri_density, atomlist)
584
585 ekin_imol = 0.0_dp
586 ! calc Hohenberg-Kohn kin. energy of the density corresp. to the remaining molecular block(s)
587 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_struct, xc_section=kg_env%xc_section_kg, &
588 vxc_rho=vxc_rho, vxc_tau=vxc_tau, exc=ekin_imol)
589 ekin_mol = ekin_mol + ekin_imol
590
591 DO ispin = 1, nspins
592 CALL pw_scale(vxc_rho(ispin), -vxc_rho(ispin)%pw_grid%dvol)
593 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
594 CALL integrate_v_rspace_one_center(vxc_rho(ispin), qs_env, &
595 lri_v_int, calc_force, &
596 "LRI_AUX", atomlist=atomlist)
597 ! clean up vxc_rho
598 CALL auxbas_pw_pool%give_back_pw(vxc_rho(ispin))
599 END DO
600 DEALLOCATE (vxc_rho)
601
602 IF (use_virial) THEN
603 xcvirial(1:3, 1:3) = xcvirial(1:3, 1:3) + virial%pv_xc(1:3, 1:3)
604 END IF
605
606 END DO
607
608 IF (use_virial) THEN
609 virial%pv_xc(1:3, 1:3) = xcvirial(1:3, 1:3)
610 END IF
611
612 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
613 ALLOCATE (ksmat(1))
614 DO ispin = 1, nspins
615 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
616 DO ikind = 1, nkind
617 CALL para_env%sum(lri_v_int(ikind)%v_int)
618 END DO
619 ksmat(1)%matrix => ks_matrix(ispin)%matrix
620 CALL calculate_lri_ks_matrix(lri_env, lri_v_int, ksmat, atomic_kind_set)
621 END DO
622 IF (calc_force) THEN
623 pmat(1:nspins, 1:1) => density_matrix(1:nspins)
624 CALL calculate_lri_forces(lri_env, lri_density, qs_env, pmat, atomic_kind_set)
625 END IF
626 DEALLOCATE (atomlist, ksmat)
627
628 ! clean up rho_struct
629 CALL qs_rho_unset_rho_ao(rho_struct)
630 CALL qs_rho_release(rho_struct)
631 DEALLOCATE (rho_struct)
632
633 CALL timestop(handle)
634
635 END SUBROUTINE kg_ekin_embed_lri
636
637! **************************************************************************************************
638!> \brief ...
639!> \param qs_env ...
640!> \param kg_env ...
641!> \param ks_matrix ...
642!> \param ekin_mol ...
643!> \param calc_force ...
644!> \param do_kernel Contribution of kinetic energy functional to kernel in response calculation
645!> \param pmat_ext Response density used to fold 2nd deriv or to integrate kinetic energy functional
646! **************************************************************************************************
647 SUBROUTINE kg_ekin_ri_embed(qs_env, kg_env, ks_matrix, ekin_mol, calc_force, &
648 do_kernel, pmat_ext)
649 TYPE(qs_environment_type), POINTER :: qs_env
650 TYPE(kg_environment_type), POINTER :: kg_env
651 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_matrix
652 REAL(kind=dp), INTENT(out) :: ekin_mol
653 LOGICAL :: calc_force, do_kernel
654 TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
655 POINTER :: pmat_ext
656
657 CHARACTER(LEN=*), PARAMETER :: routinen = 'kg_ekin_ri_embed'
658
659 INTEGER :: color, handle, iatom, ikind, imol, &
660 iounit, ispin, isub, natom, nkind, &
661 nspins
662 INTEGER, ALLOCATABLE, DIMENSION(:) :: atomlist
663 INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
664 LOGICAL :: use_virial
665 REAL(kind=dp) :: alpha, ekin_imol
666 REAL(kind=dp), DIMENSION(3, 3) :: xcvirial
667 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
668 TYPE(cp_logger_type), POINTER :: logger
669 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: density_matrix, ksmat
670 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: pmat
671 TYPE(dft_control_type), POINTER :: dft_control
672 TYPE(lri_density_type), POINTER :: lri_density, lri_rho1
673 TYPE(lri_environment_type), POINTER :: lri_env, lri_env1
674 TYPE(lri_kind_type), DIMENSION(:), POINTER :: lri_v_int
675 TYPE(mp_para_env_type), POINTER :: para_env
676 TYPE(pw_env_type), POINTER :: pw_env
677 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
678 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: vxc_rho, vxc_tau
679 TYPE(qs_ks_env_type), POINTER :: ks_env
680 TYPE(qs_rho_type), POINTER :: rho, rho1, rho_struct
681 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho0_atom_set, rho1_atom_set
682 TYPE(section_vals_type), POINTER :: xc_section
683 TYPE(virial_type), POINTER :: virial
684
685 CALL timeset(routinen, handle)
686
687 logger => cp_get_default_logger()
688 iounit = cp_logger_get_default_unit_nr(logger)
689
690 NULLIFY (rho0_atom_set, rho1_atom_set)
691
692 CALL get_qs_env(qs_env, &
693 ks_env=ks_env, &
694 rho=rho, &
695 natom=natom, &
696 nkind=nkind, &
697 dft_control=dft_control, &
698 virial=virial, &
699 para_env=para_env, &
700 pw_env=pw_env)
701
702 nspins = dft_control%nspins
703 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
704 use_virial = use_virial .AND. calc_force
705
706 ! Kernel potential in response calculation (no forces calculated at this point)
707 ! requires spin-factor
708 ! alpha = 2 closed-shell
709 ! alpha = 1 open-shell
710 alpha = 1.0_dp
711 IF (do_kernel .AND. .NOT. calc_force .AND. nspins == 1) alpha = 2.0_dp
712
713 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
714
715 ! get the density matrix
716 CALL qs_rho_get(rho, rho_ao=density_matrix)
717 ! allocate and initialize the density
718 NULLIFY (rho_struct)
719 ALLOCATE (rho_struct)
720 CALL qs_rho_create(rho_struct)
721 ! set the density matrix to the blocked matrix
722 CALL qs_rho_set(rho_struct, rho_ao=density_matrix)
723 CALL qs_rho_rebuild(rho_struct, qs_env, rebuild_ao=.false., rebuild_grids=.true.)
724
725 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
726 ALLOCATE (cell_to_index(1, 1, 1))
727 cell_to_index(1, 1, 1) = 1
728 lri_env => kg_env%lri_env
729 lri_density => kg_env%lri_density
730
731 NULLIFY (pmat)
732 ALLOCATE (pmat(nspins, 1))
733 DO ispin = 1, nspins
734 pmat(ispin, 1)%matrix => density_matrix(ispin)%matrix
735 END DO
736 CALL calculate_lri_densities(lri_env, lri_density, qs_env, pmat, cell_to_index, &
737 rho_struct, atomic_kind_set, para_env, response_density=.false.)
738 kg_env%lri_density => lri_density
739
740 DEALLOCATE (pmat)
741
742 IF (PRESENT(pmat_ext)) THEN
743 ! If external density associated then it is needed either for
744 ! 1) folding of second derivative while partially integrating, or
745 ! 2) integration of response forces
746 NULLIFY (rho1)
747 ALLOCATE (rho1)
748 CALL qs_rho_create(rho1)
749 CALL qs_rho_set(rho1, rho_ao=pmat_ext)
750 CALL qs_rho_rebuild(rho1, qs_env, rebuild_ao=.false., rebuild_grids=.true.)
751
752 lri_env1 => kg_env%lri_env1
753 lri_rho1 => kg_env%lri_rho1
754 ! calculate external density as LRI-densities
755 NULLIFY (pmat)
756 ALLOCATE (pmat(nspins, 1))
757 DO ispin = 1, nspins
758 pmat(ispin, 1)%matrix => pmat_ext(ispin)%matrix
759 END DO
760 CALL calculate_lri_densities(lri_env1, lri_rho1, qs_env, pmat, cell_to_index, &
761 rho1, atomic_kind_set, para_env, response_density=.false.)
762 kg_env%lri_rho1 => lri_rho1
763 DEALLOCATE (pmat)
764
765 END IF
766
767 ! XC-section pointing to kinetic energy functional in KG environment
768 NULLIFY (xc_section)
769 xc_section => kg_env%xc_section_kg
770
771 ! full density kinetic energy term
772 ekin_imol = 0.0_dp
773 NULLIFY (vxc_rho, vxc_tau)
774
775 ! calculate xc potential or kernel
776 IF (do_kernel) THEN
777 ! kernel total
778 ! derivation wrt to rho_struct and evaluation at rho_struct
779 CALL qs_fxc_create(qs_env, rho_struct, rho1, rho0_atom_set, &
780 xc_section, .false., &
781 vxc_rho, vxc_tau, rho1_atom_set)
782 ELSE
783 ! vxc total
784 CALL qs_vxc_create(ks_env=ks_env, &
785 rho_struct=rho_struct, &
786 xc_section=xc_section, &
787 vxc_rho=vxc_rho, &
788 vxc_tau=vxc_tau, &
789 exc=ekin_imol)
790
791 END IF
792
793 IF (ASSOCIATED(vxc_tau)) THEN
794 cpabort(" KG with meta-kinetic energy functionals not implemented")
795 END IF
796
797 DO ispin = 1, nspins
798 CALL pw_scale(vxc_rho(ispin), alpha*vxc_rho(ispin)%pw_grid%dvol)
799
800 IF (PRESENT(pmat_ext) .AND. .NOT. do_kernel) THEN
801 ! int w/ pmat_ext
802 lri_v_int => lri_rho1%lri_coefs(ispin)%lri_kinds
803 ELSE
804 ! int w/ rho_ao
805 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
806 END IF
807 CALL integrate_v_rspace_one_center(vxc_rho(ispin), qs_env, lri_v_int, calc_force, "LRI_AUX")
808 CALL auxbas_pw_pool%give_back_pw(vxc_rho(ispin))
809 END DO
810
811 DEALLOCATE (vxc_rho)
812 ekin_mol = -ekin_imol
813 xcvirial(1:3, 1:3) = 0.0_dp
814 IF (use_virial) xcvirial(1:3, 1:3) = xcvirial(1:3, 1:3) - virial%pv_xc(1:3, 1:3)
815
816 ! loop over all subsets
817 ALLOCATE (atomlist(natom))
818 DO isub = 1, kg_env%nsubsets
819 atomlist = 0
820 DO iatom = 1, natom
821 imol = kg_env%atom_to_molecule(iatom)
822 color = kg_env%subset_of_mol(imol)
823 IF (color == isub) atomlist(iatom) = 1
824 END DO
825 ! update ground-state density
826 CALL lri_kg_rho_update(rho_struct, qs_env, lri_env, lri_density, atomlist)
827
828 ! Same for external (response) density if present
829 IF (PRESENT(pmat_ext)) THEN
830 ! update response density
831 CALL lri_kg_rho_update(rho1, qs_env, lri_env1, lri_rho1, atomlist)
832 END IF
833
834 ekin_imol = 0.0_dp
835 ! calc Hohenberg-Kohn kin. energy of the density corresp. to the remaining molecular block(s)
836 NULLIFY (vxc_rho, vxc_tau)
837
838 ! calculate xc potential or kernel
839 IF (do_kernel) THEN
840 ! subsys kernel
841 CALL qs_fxc_create(qs_env, rho_struct, rho1, rho0_atom_set, &
842 xc_section, .false., &
843 vxc_rho, vxc_tau, rho1_atom_set)
844 ELSE
845
846 ! subsys xc-potential
847 CALL qs_vxc_create(ks_env=ks_env, &
848 rho_struct=rho_struct, &
849 xc_section=xc_section, &
850 vxc_rho=vxc_rho, &
851 vxc_tau=vxc_tau, &
852 exc=ekin_imol)
853 END IF
854 ekin_mol = ekin_mol + ekin_imol
855
856 DO ispin = 1, nspins
857 CALL pw_scale(vxc_rho(ispin), -alpha*vxc_rho(ispin)%pw_grid%dvol)
858
859 IF (PRESENT(pmat_ext) .AND. .NOT. do_kernel) THEN
860 ! int w/ pmat_ext
861 lri_v_int => lri_rho1%lri_coefs(ispin)%lri_kinds
862 ELSE
863 ! int w/ rho_ao
864 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
865 END IF
866
867 CALL integrate_v_rspace_one_center(vxc_rho(ispin), qs_env, &
868 lri_v_int, calc_force, &
869 "LRI_AUX", atomlist=atomlist)
870 ! clean up vxc_rho
871 CALL auxbas_pw_pool%give_back_pw(vxc_rho(ispin))
872 END DO
873 DEALLOCATE (vxc_rho)
874
875 IF (use_virial) THEN
876 xcvirial(1:3, 1:3) = xcvirial(1:3, 1:3) + virial%pv_xc(1:3, 1:3)
877 END IF
878
879 END DO
880
881 IF (use_virial) THEN
882 virial%pv_xc(1:3, 1:3) = xcvirial(1:3, 1:3)
883 END IF
884
885 ALLOCATE (ksmat(1))
886 DO ispin = 1, nspins
887 ksmat(1)%matrix => ks_matrix(ispin)%matrix
888 IF (PRESENT(pmat_ext) .AND. .NOT. do_kernel) THEN
889 ! KS int with rho_ext"
890 lri_v_int => lri_rho1%lri_coefs(ispin)%lri_kinds
891 DO ikind = 1, nkind
892 CALL para_env%sum(lri_v_int(ikind)%v_int)
893 END DO
894 CALL calculate_lri_ks_matrix(lri_env1, lri_v_int, ksmat, atomic_kind_set)
895 ELSE
896 ! KS int with rho_ao"
897 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
898 DO ikind = 1, nkind
899 CALL para_env%sum(lri_v_int(ikind)%v_int)
900 END DO
901 CALL calculate_lri_ks_matrix(lri_env, lri_v_int, ksmat, atomic_kind_set)
902 END IF
903
904 END DO
905 IF (calc_force) THEN
906
907 NULLIFY (pmat)
908 ALLOCATE (pmat(nspins, 1))
909
910 IF (PRESENT(pmat_ext) .AND. .NOT. do_kernel) THEN
911 ! Forces with rho_ext
912 DO ispin = 1, nspins
913 pmat(ispin, 1)%matrix => pmat_ext(ispin)%matrix
914 END DO
915 CALL calculate_lri_forces(lri_env1, lri_rho1, qs_env, pmat, atomic_kind_set)
916 ELSE
917 ! Forces with rho_ao
918 DO ispin = 1, nspins
919 pmat(ispin, 1)%matrix => density_matrix(ispin)%matrix
920 END DO
921 CALL calculate_lri_forces(lri_env, lri_density, qs_env, pmat, atomic_kind_set)
922 END IF
923
924 DEALLOCATE (pmat)
925
926 END IF
927 DEALLOCATE (atomlist, ksmat)
928
929 ! clean up rho_struct
930 CALL qs_rho_unset_rho_ao(rho_struct)
931 CALL qs_rho_release(rho_struct)
932 DEALLOCATE (rho_struct)
933 IF (PRESENT(pmat_ext)) THEN
934 CALL qs_rho_unset_rho_ao(rho1)
935 CALL qs_rho_release(rho1)
936 DEALLOCATE (rho1)
937 END IF
938 DEALLOCATE (cell_to_index)
939
940 CALL timestop(handle)
941
942 END SUBROUTINE kg_ekin_ri_embed
943
944! **************************************************************************************************
945!> \brief ...
946!> \param qs_env ...
947!> \param ks_matrix ...
948!> \param ekin_mol ...
949! **************************************************************************************************
950 SUBROUTINE kg_ekin_atomic(qs_env, ks_matrix, ekin_mol)
951 TYPE(qs_environment_type), POINTER :: qs_env
952 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_matrix
953 REAL(kind=dp), INTENT(out) :: ekin_mol
954
955 CHARACTER(LEN=*), PARAMETER :: routinen = 'kg_ekin_atomic'
956
957 INTEGER :: handle, ispin, nspins
958 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: density_matrix, tnadd_matrix
959 TYPE(kg_environment_type), POINTER :: kg_env
960 TYPE(qs_rho_type), POINTER :: rho
961
962 NULLIFY (rho, kg_env, density_matrix, tnadd_matrix)
963
964 CALL timeset(routinen, handle)
965 CALL get_qs_env(qs_env, kg_env=kg_env, rho=rho)
966
967 nspins = SIZE(ks_matrix)
968 ! get the density matrix
969 CALL qs_rho_get(rho, rho_ao=density_matrix)
970 ! get the tnadd matrix
971 tnadd_matrix => kg_env%tnadd_mat
972
973 ekin_mol = 0.0_dp
974 DO ispin = 1, nspins
975 CALL dbcsr_dot(tnadd_matrix(1)%matrix, density_matrix(ispin)%matrix, ekin_mol)
976 CALL dbcsr_add(ks_matrix(ispin)%matrix, tnadd_matrix(1)%matrix, &
977 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
978 END DO
979 ! definition is inverted (see qs_ks_methods)
980 ekin_mol = -ekin_mol
981
982 CALL timestop(handle)
983
984 END SUBROUTINE kg_ekin_atomic
985
986END MODULE kg_correction
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_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_dot(matrix_a, matrix_b, trace)
Computes the dot product of two matrices, also known as the trace of their matrix product.
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public kg_tnadd_none
integer, parameter, public kg_tnadd_embed_ri
integer, parameter, public kg_tnadd_embed
integer, parameter, public kg_tnadd_atomic
objects that represent the structure of input sections and the data contained in an input section
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
Routines for a Kim-Gordon-like partitioning into molecular subunits.
subroutine, public kg_ekin_subset(qs_env, ks_matrix, ekin_mol, calc_force, do_kernel, pmat_ext)
Calculates the subsystem Hohenberg-Kohn kinetic energy and the forces.
Types needed for a Kim-Gordon-like partitioning into molecular subunits.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Calculates integral matrices for LRIGPW method lri : local resolution of the identity.
subroutine, public lri_kg_rho_update(rho_struct, qs_env, lri_env, lri_density, atomlist)
...
subroutine, public calculate_lri_densities(lri_env, lri_density, qs_env, pmatrix, cell_to_index, lri_rho_struct, atomic_kind_set, para_env, response_density)
performs the fitting of the density and distributes the fitted density on the grid
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
Calculates forces for LRIGPW method lri : local resolution of the identity.
Definition lri_forces.F:16
subroutine, public calculate_lri_forces(lri_env, lri_density, qs_env, pmatrix, atomic_kind_set)
calculates the lri forces
Definition lri_forces.F:81
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
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, matrix_vhxc, 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.
Setup Routine for Fxc Potentials.
Definition qs_fxc.F:29
subroutine, public qs_fxc_create(qs_env, rho0_struct, rho1_struct, rho0_atom_set, xc_section, do_onecenter, fxc_rho, fxc_tau, rho1_atom_set, do_scale, is_triplet, spinflip, no_weights, uf_grid_results, pw_env_ext, kind_set_external, para_env_external, compute_virial, virial_xc)
...
Definition qs_fxc.F:118
Integrate single or product functions over a potential on a RS grid.
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
subroutine, public qs_rho_rebuild(rho, qs_env, rebuild_ao, rebuild_grids, admm, pw_env_external)
rebuilds rho (if necessary allocating and initializing it)
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_set(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)
...
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...
subroutine, public qs_rho_unset_rho_ao(rho_struct)
Unsets the rho_ao / rho_ao_kp field without calling kpoint_transitional_release().
subroutine, public qs_rho_create(rho)
Allocates a new instance of rho.
subroutine, public qs_rho_release(rho_struct)
releases a rho_struct by decreasing the reference count by one and deallocating if it reaches 0 (to b...
subroutine, public qs_vxc_create(ks_env, rho_struct, xc_section, vxc_rho, vxc_tau, exc, just_energy, edisp, dispersion_env, adiabatic_rescale_factor, pw_env_external, native_skala_atom_force, qs_env_external, native_gapw_composite_override, native_skala_defer_to_atom_composite)
calculates and allocates the xc potential, already reducing it to the dependence on rho and the one o...
Definition qs_vxc.F:118
Exchange and Correlation functional calculations.
Definition xc.F:17
logical function, public xc_uses_kinetic_energy_density(xc_fun_section, lsd)
...
Definition xc.F:96
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...
Contains all the info needed for KG runs...
stores all the informations relevant to an mpi environment
contained for different pw related things
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.