(git:561f475)
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,&
23 USE ec_methods, ONLY: create_kernel
32 USE kinds, ONLY: dp
41 USE pw_env_types, ONLY: pw_env_get,&
43 USE pw_methods, ONLY: pw_integral_ab,&
46 USE pw_types, ONLY: pw_c1d_gs_type,&
50 USE qs_integrate_potential, ONLY: integrate_v_rspace,&
51 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_c1d_gs_type), DIMENSION(:), POINTER :: rho1_g
182 TYPE(pw_env_type), POINTER :: pw_env
183 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
184 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho1_r, rho_r, tau1_r, vxc_rho, vxc_tau
185 TYPE(qs_ks_env_type), POINTER :: ks_env
186 TYPE(qs_rho_type), POINTER :: old_rho, rho1, rho1_use, rho1_xc, &
187 rho_struct, rho_use, rho_xc
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
199 CALL get_qs_env(qs_env, &
200 ks_env=ks_env, &
201 rho=old_rho, &
202 dft_control=dft_control, &
203 virial=virial, &
204 pw_env=pw_env)
205 nspins = dft_control%nspins
206 gapw = dft_control%qs_control%gapw
207 gapw_xc = dft_control%qs_control%gapw_xc
208 use_gapw_soft = gapw .OR. gapw_xc
209 IF (use_gapw_soft) THEN
210 basis_type = "ORB_SOFT"
211 ELSE
212 basis_type = "ORB"
213 END IF
214 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
215 use_virial = use_virial .AND. calc_force
216
217 ! Kernel potential in response calculation (no forces calculated at this point)
218 ! requires spin-factor
219 ! alpha = 2 closed-shell
220 ! alpha = 1 open-shell
221 alpha = 1.0_dp
222 IF (do_kernel .AND. .NOT. calc_force .AND. nspins == 1) alpha = 2.0_dp
223
224 NULLIFY (auxbas_pw_pool)
225 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
226
227 ! get the density matrix
228 CALL qs_rho_get(old_rho, rho_ao=density_matrix)
229 ! allocate and initialize the density
230 ALLOCATE (rho_struct)
231 CALL qs_rho_create(rho_struct)
232 ! set the density matrix to the blocked matrix
233 CALL qs_rho_set(rho_struct, rho_ao=density_matrix) ! blocked_matrix
234 CALL qs_rho_rebuild(rho_struct, qs_env, rebuild_ao=.false., rebuild_grids=.true.)
235 IF (gapw_xc) THEN
236 ALLOCATE (rho_xc)
237 CALL qs_rho_create(rho_xc)
238 CALL qs_rho_rebuild(rho_xc, qs_env, rebuild_ao=.true., rebuild_grids=.true.)
239 END IF
240 ! full density kinetic energy term
241 IF (gapw_xc) THEN
242 CALL qs_rho_update_rho(rho_struct, qs_env, rho_xc_external=rho_xc)
243 rho_use => rho_xc
244 ELSE
245 CALL qs_rho_update_rho(rho_struct, qs_env)
246 rho_use => rho_struct
247 END IF
248 ! get blocked density that has been put on grid
249 CALL qs_rho_get(rho_use, rho_r=rho_r)
250
251 ! If external density associated then it is needed either for
252 ! 1) folding of second derivative while partially integrating, or
253 ! 2) integration of response forces
254 NULLIFY (rho1)
255 IF (PRESENT(pmat_ext)) THEN
256 ALLOCATE (rho1)
257 CALL qs_rho_create(rho1)
258 CALL qs_rho_set(rho1, rho_ao=pmat_ext)
259 CALL qs_rho_rebuild(rho1, qs_env, rebuild_ao=.false., rebuild_grids=.true.)
260 IF (gapw_xc) THEN
261 ALLOCATE (rho1_xc)
262 CALL qs_rho_create(rho1_xc)
263 CALL qs_rho_rebuild(rho1_xc, qs_env, rebuild_ao=.true., rebuild_grids=.true.)
264 CALL qs_rho_update_rho(rho1, qs_env, rho_xc_external=rho1_xc)
265 rho1_use => rho1_xc
266 ELSE
267 CALL qs_rho_update_rho(rho1, qs_env)
268 rho1_use => rho1
269 END IF
270 END IF
271
272 ! XC-section pointing to kinetic energy functional in KG environment
273 NULLIFY (xc_section)
274 xc_section => kg_env%xc_section_kg
275
276 ekin_imol = 0.0_dp
277
278 ! calculate xc potential or kernel
279 IF (do_kernel) THEN
280 ! derivation wrt to rho_struct and evaluation at rho_struct
281 IF (use_virial) virial%pv_xc = 0.0_dp
282 CALL qs_rho_get(rho1_use, rho_r=rho1_r, rho_g=rho1_g, tau_r=tau1_r)
283 CALL create_kernel(qs_env, &
284 vxc=vxc_rho, &
285 vxc_tau=vxc_tau, &
286 rho=rho_use, &
287 rho1_r=rho1_r, &
288 rho1_g=rho1_g, &
289 tau1_r=tau1_r, &
290 xc_section=xc_section, &
291 compute_virial=use_virial, &
292 virial_xc=virial%pv_xc)
293 ELSE
294 CALL qs_vxc_create(ks_env=ks_env, &
295 rho_struct=rho_use, &
296 xc_section=xc_section, &
297 vxc_rho=vxc_rho, &
298 vxc_tau=vxc_tau, &
299 exc=ekin_imol)
300 END IF
301
302 ! Integrate xc-potential with external density for outer response forces
303 IF (PRESENT(pmat_ext) .AND. .NOT. do_kernel) THEN
304 CALL qs_rho_get(rho1, rho_ao=density_matrix)
305 CALL qs_rho_get(rho1_use, rho_r=rho1_r, tau_r=tau1_r)
306 ! Direct volume term of virial
307 ! xc-potential is unscaled
308 IF (use_virial) THEN
309 ekin_imol = 0.0_dp
310 DO ispin = 1, nspins
311 ekin_imol = ekin_imol + pw_integral_ab(rho1_r(ispin), vxc_rho(ispin))
312 IF (ASSOCIATED(vxc_tau)) &
313 ekin_imol = ekin_imol + pw_integral_ab(tau1_r(ispin), vxc_tau(ispin))
314 END DO
315 END IF
316 END IF
317
318 DO ispin = 1, nspins
319 CALL pw_scale(vxc_rho(ispin), alpha*vxc_rho(ispin)%pw_grid%dvol)
320 END DO
321
322 DO ispin = 1, nspins
323 CALL integrate_v_rspace(v_rspace=vxc_rho(ispin), &
324 pmat=density_matrix(ispin), hmat=ks_matrix(ispin), &
325 qs_env=qs_env, calculate_forces=calc_force, gapw=use_gapw_soft)
326 CALL auxbas_pw_pool%give_back_pw(vxc_rho(ispin))
327 IF (ASSOCIATED(vxc_tau)) THEN
328 CALL pw_scale(vxc_tau(ispin), alpha*vxc_tau(ispin)%pw_grid%dvol)
329 CALL integrate_v_rspace(v_rspace=vxc_tau(ispin), &
330 pmat=density_matrix(ispin), hmat=ks_matrix(ispin), &
331 qs_env=qs_env, compute_tau=.true., &
332 calculate_forces=calc_force, gapw=use_gapw_soft)
333 CALL auxbas_pw_pool%give_back_pw(vxc_tau(ispin))
334 END IF
335 END DO
336 DEALLOCATE (vxc_rho)
337 IF (ASSOCIATED(vxc_tau)) DEALLOCATE (vxc_tau)
338 ekin_mol = -ekin_imol
339 xcvirial(1:3, 1:3) = 0.0_dp
340 IF (use_virial) THEN
341 xcvirial(1:3, 1:3) = xcvirial(1:3, 1:3) - virial%pv_xc(1:3, 1:3)
342 END IF
343
344 ! loop over all subsets
345 DO isub = 1, kg_env%nsubsets
346 ! calculate the densities for the given blocked density matrix
347 ! pass the subset task_list
348 IF (gapw_xc) THEN
349 CALL qs_rho_update_rho(rho_struct, qs_env, rho_xc_external=rho_xc, &
350 task_list_external=kg_env%subset(isub)%task_list, &
351 task_list_external_soft=kg_env%subset(isub)%task_list)
352 rho_use => rho_xc
353 ELSE
354 CALL qs_rho_update_rho(rho_struct, qs_env, &
355 task_list_external=kg_env%subset(isub)%task_list)
356 rho_use => rho_struct
357 END IF
358 ! Same for external (response) density if present
359 IF (PRESENT(pmat_ext)) THEN
360 IF (gapw_xc) THEN
361 CALL qs_rho_update_rho(rho1, qs_env, rho_xc_external=rho1_xc, &
362 task_list_external=kg_env%subset(isub)%task_list, &
363 task_list_external_soft=kg_env%subset(isub)%task_list)
364 rho1_use => rho1_xc
365 ELSE
366 CALL qs_rho_update_rho(rho1, qs_env, &
367 task_list_external=kg_env%subset(isub)%task_list)
368 rho1_use => rho1
369 END IF
370 END IF
371
372 ekin_imol = 0.0_dp
373 NULLIFY (vxc_rho, vxc_tau)
374
375 ! calculate Hohenberg-Kohn kinetic energy of the density
376 ! corresponding to the remaining molecular block(s)
377 ! info per block in rho_struct now
378
379 ! calculate xc-potential or kernel
380 IF (do_kernel) THEN
381 IF (use_virial) virial%pv_xc = 0.0_dp
382 CALL qs_rho_get(rho1_use, rho_r=rho1_r, rho_g=rho1_g, tau_r=tau1_r)
383 CALL create_kernel(qs_env, &
384 vxc=vxc_rho, &
385 vxc_tau=vxc_tau, &
386 rho=rho_use, &
387 rho1_r=rho1_r, &
388 rho1_g=rho1_g, &
389 tau1_r=tau1_r, &
390 xc_section=xc_section, &
391 compute_virial=use_virial, &
392 virial_xc=virial%pv_xc)
393 ELSE
394 CALL qs_vxc_create(ks_env=ks_env, &
395 rho_struct=rho_use, &
396 xc_section=xc_section, &
397 vxc_rho=vxc_rho, &
398 vxc_tau=vxc_tau, &
399 exc=ekin_imol)
400 END IF
401
402 ! Integrate with response density for outer response forces
403 IF (PRESENT(pmat_ext) .AND. .NOT. do_kernel) THEN
404 CALL qs_rho_get(rho1, rho_ao=density_matrix)
405 CALL qs_rho_get(rho1_use, rho_r=rho1_r, tau_r=tau1_r)
406 ! Direct volume term of virial
407 ! xc-potential is unscaled
408 IF (use_virial) THEN
409 ekin_imol = 0.0_dp
410 DO ispin = 1, nspins
411 ekin_imol = ekin_imol + pw_integral_ab(rho1_r(ispin), vxc_rho(ispin))
412 IF (ASSOCIATED(vxc_tau)) &
413 ekin_imol = ekin_imol + pw_integral_ab(tau1_r(ispin), vxc_tau(ispin))
414 END DO
415 END IF
416 END IF
417
418 DO ispin = 1, nspins
419 CALL pw_scale(vxc_rho(ispin), -alpha*vxc_rho(ispin)%pw_grid%dvol)
420
421 CALL integrate_v_rspace(v_rspace=vxc_rho(ispin), &
422 pmat=density_matrix(ispin), &
423 hmat=ks_matrix(ispin), &
424 qs_env=qs_env, &
425 calculate_forces=calc_force, &
426 basis_type=basis_type, &
427 task_list_external=kg_env%subset(isub)%task_list)
428 ! clean up vxc_rho
429 CALL auxbas_pw_pool%give_back_pw(vxc_rho(ispin))
430 IF (ASSOCIATED(vxc_tau)) THEN
431 CALL pw_scale(vxc_tau(ispin), -alpha*vxc_tau(ispin)%pw_grid%dvol)
432 CALL integrate_v_rspace(v_rspace=vxc_tau(ispin), &
433 pmat=density_matrix(ispin), &
434 hmat=ks_matrix(ispin), &
435 qs_env=qs_env, &
436 compute_tau=.true., &
437 calculate_forces=calc_force, &
438 basis_type=basis_type, &
439 task_list_external=kg_env%subset(isub)%task_list)
440 ! clean up vxc_rho
441 CALL auxbas_pw_pool%give_back_pw(vxc_tau(ispin))
442 END IF
443 END DO
444 DEALLOCATE (vxc_rho)
445 IF (ASSOCIATED(vxc_tau)) DEALLOCATE (vxc_tau)
446
447 ekin_mol = ekin_mol + ekin_imol
448
449 IF (use_virial) THEN
450 xcvirial(1:3, 1:3) = xcvirial(1:3, 1:3) + virial%pv_xc(1:3, 1:3)
451 END IF
452
453 END DO
454
455 IF (use_virial) THEN
456 virial%pv_xc(1:3, 1:3) = xcvirial(1:3, 1:3)
457 END IF
458
459 ! clean up rho_struct
460 CALL qs_rho_unset_rho_ao(rho_struct)
461 CALL qs_rho_release(rho_struct)
462 DEALLOCATE (rho_struct)
463 IF (ASSOCIATED(rho_xc)) THEN
464 CALL qs_rho_release(rho_xc)
465 DEALLOCATE (rho_xc)
466 END IF
467 IF (PRESENT(pmat_ext)) THEN
468 CALL qs_rho_unset_rho_ao(rho1)
469 CALL qs_rho_release(rho1)
470 DEALLOCATE (rho1)
471 IF (ASSOCIATED(rho1_xc)) THEN
472 CALL qs_rho_release(rho1_xc)
473 DEALLOCATE (rho1_xc)
474 END IF
475 END IF
476
477 CALL timestop(handle)
478
479 END SUBROUTINE kg_ekin_embed
480
481! **************************************************************************************************
482!> \brief ...
483!> \param qs_env ...
484!> \param kg_env ...
485!> \param ks_matrix ...
486!> \param ekin_mol ...
487!> \param calc_force ...
488! **************************************************************************************************
489 SUBROUTINE kg_ekin_embed_lri(qs_env, kg_env, ks_matrix, ekin_mol, calc_force)
490 TYPE(qs_environment_type), POINTER :: qs_env
491 TYPE(kg_environment_type), POINTER :: kg_env
492 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_matrix
493 REAL(kind=dp), INTENT(out) :: ekin_mol
494 LOGICAL :: calc_force
495
496 CHARACTER(LEN=*), PARAMETER :: routinen = 'kg_ekin_embed_lri'
497
498 INTEGER :: color, handle, iatom, ikind, imol, &
499 ispin, isub, natom, nkind, nspins
500 INTEGER, ALLOCATABLE, DIMENSION(:) :: atomlist
501 LOGICAL :: use_virial
502 REAL(kind=dp) :: ekin_imol
503 REAL(kind=dp), DIMENSION(3, 3) :: xcvirial
504 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
505 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: density_matrix, ksmat
506 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: pmat
507 TYPE(dft_control_type), POINTER :: dft_control
508 TYPE(lri_density_type), POINTER :: lri_density
509 TYPE(lri_environment_type), POINTER :: lri_env
510 TYPE(lri_kind_type), DIMENSION(:), POINTER :: lri_v_int
511 TYPE(mp_para_env_type), POINTER :: para_env
512 TYPE(pw_env_type), POINTER :: pw_env
513 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
514 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: vxc_rho, vxc_tau
515 TYPE(qs_ks_env_type), POINTER :: ks_env
516 TYPE(qs_rho_type), POINTER :: old_rho, rho_struct
517 TYPE(virial_type), POINTER :: virial
518
519 CALL timeset(routinen, handle)
520
521 NULLIFY (vxc_rho, vxc_tau, old_rho, rho_struct, ks_env)
522
523 CALL get_qs_env(qs_env, dft_control=dft_control)
524
525 ! get set of molecules, natom, dft_control, pw_env
526 CALL get_qs_env(qs_env, &
527 ks_env=ks_env, &
528 rho=old_rho, &
529 natom=natom, &
530 dft_control=dft_control, &
531 virial=virial, &
532 para_env=para_env, &
533 pw_env=pw_env)
534
535 nspins = dft_control%nspins
536 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
537 use_virial = use_virial .AND. calc_force
538
539 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
540
541 ! get the density matrix
542 CALL qs_rho_get(old_rho, rho_ao=density_matrix)
543 ! allocate and initialize the density
544 ALLOCATE (rho_struct)
545 CALL qs_rho_create(rho_struct)
546 ! set the density matrix to the blocked matrix
547 CALL qs_rho_set(rho_struct, rho_ao=density_matrix) ! blocked_matrix
548 CALL qs_rho_rebuild(rho_struct, qs_env, rebuild_ao=.false., rebuild_grids=.true.)
549
550 CALL get_qs_env(qs_env, lri_env=lri_env, lri_density=lri_density, nkind=nkind)
551 IF (lri_env%exact_1c_terms) THEN
552 cpabort(" KG with LRI and exact one-center terms not implemented")
553 END IF
554 ALLOCATE (atomlist(natom))
555 DO ispin = 1, nspins
556 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
557 DO ikind = 1, nkind
558 lri_v_int(ikind)%v_int = 0.0_dp
559 IF (calc_force) THEN
560 lri_v_int(ikind)%v_dadr = 0.0_dp
561 lri_v_int(ikind)%v_dfdr = 0.0_dp
562 END IF
563 END DO
564 END DO
565
566 ! full density kinetic energy term
567 atomlist = 1
568 CALL lri_kg_rho_update(rho_struct, qs_env, lri_env, lri_density, atomlist)
569 ekin_imol = 0.0_dp
570 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_struct, xc_section=kg_env%xc_section_kg, &
571 vxc_rho=vxc_rho, vxc_tau=vxc_tau, exc=ekin_imol)
572 IF (ASSOCIATED(vxc_tau)) THEN
573 cpabort(" KG with meta-kinetic energy functionals not implemented")
574 END IF
575 DO ispin = 1, nspins
576 CALL pw_scale(vxc_rho(ispin), vxc_rho(ispin)%pw_grid%dvol)
577 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
578 CALL integrate_v_rspace_one_center(vxc_rho(ispin), qs_env, lri_v_int, calc_force, "LRI_AUX")
579 CALL auxbas_pw_pool%give_back_pw(vxc_rho(ispin))
580 END DO
581 DEALLOCATE (vxc_rho)
582 ekin_mol = -ekin_imol
583 xcvirial(1:3, 1:3) = 0.0_dp
584 IF (use_virial) xcvirial(1:3, 1:3) = xcvirial(1:3, 1:3) - virial%pv_xc(1:3, 1:3)
585
586 ! loop over all subsets
587 DO isub = 1, kg_env%nsubsets
588 atomlist = 0
589 DO iatom = 1, natom
590 imol = kg_env%atom_to_molecule(iatom)
591 color = kg_env%subset_of_mol(imol)
592 IF (color == isub) atomlist(iatom) = 1
593 END DO
594 CALL lri_kg_rho_update(rho_struct, qs_env, lri_env, lri_density, atomlist)
595
596 ekin_imol = 0.0_dp
597 ! calc Hohenberg-Kohn kin. energy of the density corresp. to the remaining molecular block(s)
598 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_struct, xc_section=kg_env%xc_section_kg, &
599 vxc_rho=vxc_rho, vxc_tau=vxc_tau, exc=ekin_imol)
600 ekin_mol = ekin_mol + ekin_imol
601
602 DO ispin = 1, nspins
603 CALL pw_scale(vxc_rho(ispin), -vxc_rho(ispin)%pw_grid%dvol)
604 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
605 CALL integrate_v_rspace_one_center(vxc_rho(ispin), qs_env, &
606 lri_v_int, calc_force, &
607 "LRI_AUX", atomlist=atomlist)
608 ! clean up vxc_rho
609 CALL auxbas_pw_pool%give_back_pw(vxc_rho(ispin))
610 END DO
611 DEALLOCATE (vxc_rho)
612
613 IF (use_virial) THEN
614 xcvirial(1:3, 1:3) = xcvirial(1:3, 1:3) + virial%pv_xc(1:3, 1:3)
615 END IF
616
617 END DO
618
619 IF (use_virial) THEN
620 virial%pv_xc(1:3, 1:3) = xcvirial(1:3, 1:3)
621 END IF
622
623 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
624 ALLOCATE (ksmat(1))
625 DO ispin = 1, nspins
626 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
627 DO ikind = 1, nkind
628 CALL para_env%sum(lri_v_int(ikind)%v_int)
629 END DO
630 ksmat(1)%matrix => ks_matrix(ispin)%matrix
631 CALL calculate_lri_ks_matrix(lri_env, lri_v_int, ksmat, atomic_kind_set)
632 END DO
633 IF (calc_force) THEN
634 pmat(1:nspins, 1:1) => density_matrix(1:nspins)
635 CALL calculate_lri_forces(lri_env, lri_density, qs_env, pmat, atomic_kind_set)
636 END IF
637 DEALLOCATE (atomlist, ksmat)
638
639 ! clean up rho_struct
640 CALL qs_rho_unset_rho_ao(rho_struct)
641 CALL qs_rho_release(rho_struct)
642 DEALLOCATE (rho_struct)
643
644 CALL timestop(handle)
645
646 END SUBROUTINE kg_ekin_embed_lri
647
648! **************************************************************************************************
649!> \brief ...
650!> \param qs_env ...
651!> \param kg_env ...
652!> \param ks_matrix ...
653!> \param ekin_mol ...
654!> \param calc_force ...
655!> \param do_kernel Contribution of kinetic energy functional to kernel in response calculation
656!> \param pmat_ext Response density used to fold 2nd deriv or to integrate kinetic energy functional
657! **************************************************************************************************
658 SUBROUTINE kg_ekin_ri_embed(qs_env, kg_env, ks_matrix, ekin_mol, calc_force, &
659 do_kernel, pmat_ext)
660 TYPE(qs_environment_type), POINTER :: qs_env
661 TYPE(kg_environment_type), POINTER :: kg_env
662 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_matrix
663 REAL(kind=dp), INTENT(out) :: ekin_mol
664 LOGICAL :: calc_force, do_kernel
665 TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
666 POINTER :: pmat_ext
667
668 CHARACTER(LEN=*), PARAMETER :: routinen = 'kg_ekin_ri_embed'
669
670 INTEGER :: color, handle, iatom, ikind, imol, &
671 iounit, ispin, isub, natom, nkind, &
672 nspins
673 INTEGER, ALLOCATABLE, DIMENSION(:) :: atomlist
674 INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
675 LOGICAL :: use_virial
676 REAL(kind=dp) :: alpha, ekin_imol
677 REAL(kind=dp), DIMENSION(3, 3) :: xcvirial
678 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
679 TYPE(cp_logger_type), POINTER :: logger
680 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: density_matrix, ksmat
681 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: pmat
682 TYPE(dft_control_type), POINTER :: dft_control
683 TYPE(lri_density_type), POINTER :: lri_density, lri_rho1
684 TYPE(lri_environment_type), POINTER :: lri_env, lri_env1
685 TYPE(lri_kind_type), DIMENSION(:), POINTER :: lri_v_int
686 TYPE(mp_para_env_type), POINTER :: para_env
687 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho1_g
688 TYPE(pw_env_type), POINTER :: pw_env
689 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
690 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho1_r, tau1_r, vxc_rho, vxc_tau
691 TYPE(qs_ks_env_type), POINTER :: ks_env
692 TYPE(qs_rho_type), POINTER :: rho, rho1, rho_struct
693 TYPE(section_vals_type), POINTER :: xc_section
694 TYPE(virial_type), POINTER :: virial
695
696 CALL timeset(routinen, handle)
697
698 logger => cp_get_default_logger()
699 iounit = cp_logger_get_default_unit_nr(logger)
700
701 CALL get_qs_env(qs_env, &
702 ks_env=ks_env, &
703 rho=rho, &
704 natom=natom, &
705 nkind=nkind, &
706 dft_control=dft_control, &
707 virial=virial, &
708 para_env=para_env, &
709 pw_env=pw_env)
710
711 nspins = dft_control%nspins
712 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
713 use_virial = use_virial .AND. calc_force
714
715 ! Kernel potential in response calculation (no forces calculated at this point)
716 ! requires spin-factor
717 ! alpha = 2 closed-shell
718 ! alpha = 1 open-shell
719 alpha = 1.0_dp
720 IF (do_kernel .AND. .NOT. calc_force .AND. nspins == 1) alpha = 2.0_dp
721
722 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
723
724 ! get the density matrix
725 CALL qs_rho_get(rho, rho_ao=density_matrix)
726 ! allocate and initialize the density
727 NULLIFY (rho_struct)
728 ALLOCATE (rho_struct)
729 CALL qs_rho_create(rho_struct)
730 ! set the density matrix to the blocked matrix
731 CALL qs_rho_set(rho_struct, rho_ao=density_matrix)
732 CALL qs_rho_rebuild(rho_struct, qs_env, rebuild_ao=.false., rebuild_grids=.true.)
733
734 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
735 ALLOCATE (cell_to_index(1, 1, 1))
736 cell_to_index(1, 1, 1) = 1
737 lri_env => kg_env%lri_env
738 lri_density => kg_env%lri_density
739
740 NULLIFY (pmat)
741 ALLOCATE (pmat(nspins, 1))
742 DO ispin = 1, nspins
743 pmat(ispin, 1)%matrix => density_matrix(ispin)%matrix
744 END DO
745 CALL calculate_lri_densities(lri_env, lri_density, qs_env, pmat, cell_to_index, &
746 rho_struct, atomic_kind_set, para_env, response_density=.false.)
747 kg_env%lri_density => lri_density
748
749 DEALLOCATE (pmat)
750
751 IF (PRESENT(pmat_ext)) THEN
752 ! If external density associated then it is needed either for
753 ! 1) folding of second derivative while partially integrating, or
754 ! 2) integration of response forces
755 NULLIFY (rho1)
756 ALLOCATE (rho1)
757 CALL qs_rho_create(rho1)
758 CALL qs_rho_set(rho1, rho_ao=pmat_ext)
759 CALL qs_rho_rebuild(rho1, qs_env, rebuild_ao=.false., rebuild_grids=.true.)
760
761 lri_env1 => kg_env%lri_env1
762 lri_rho1 => kg_env%lri_rho1
763 ! calculate external density as LRI-densities
764 NULLIFY (pmat)
765 ALLOCATE (pmat(nspins, 1))
766 DO ispin = 1, nspins
767 pmat(ispin, 1)%matrix => pmat_ext(ispin)%matrix
768 END DO
769 CALL calculate_lri_densities(lri_env1, lri_rho1, qs_env, pmat, cell_to_index, &
770 rho1, atomic_kind_set, para_env, response_density=.false.)
771 kg_env%lri_rho1 => lri_rho1
772 DEALLOCATE (pmat)
773
774 END IF
775
776 ! XC-section pointing to kinetic energy functional in KG environment
777 NULLIFY (xc_section)
778 xc_section => kg_env%xc_section_kg
779
780 ! full density kinetic energy term
781 ekin_imol = 0.0_dp
782 NULLIFY (vxc_rho, vxc_tau)
783
784 ! calculate xc potential or kernel
785 IF (do_kernel) THEN
786 ! kernel total
787 ! derivation wrt to rho_struct and evaluation at rho_struct
788 CALL qs_rho_get(rho1, rho_r=rho1_r, rho_g=rho1_g, tau_r=tau1_r)
789 CALL create_kernel(qs_env, &
790 vxc=vxc_rho, &
791 vxc_tau=vxc_tau, &
792 rho=rho_struct, &
793 rho1_r=rho1_r, &
794 rho1_g=rho1_g, &
795 tau1_r=tau1_r, &
796 xc_section=xc_section)
797 ELSE
798 ! vxc total
799 CALL qs_vxc_create(ks_env=ks_env, &
800 rho_struct=rho_struct, &
801 xc_section=xc_section, &
802 vxc_rho=vxc_rho, &
803 vxc_tau=vxc_tau, &
804 exc=ekin_imol)
805
806 END IF
807
808 IF (ASSOCIATED(vxc_tau)) THEN
809 cpabort(" KG with meta-kinetic energy functionals not implemented")
810 END IF
811
812 DO ispin = 1, nspins
813 CALL pw_scale(vxc_rho(ispin), alpha*vxc_rho(ispin)%pw_grid%dvol)
814
815 IF (PRESENT(pmat_ext) .AND. .NOT. do_kernel) THEN
816 ! int w/ pmat_ext
817 lri_v_int => lri_rho1%lri_coefs(ispin)%lri_kinds
818 ELSE
819 ! int w/ rho_ao
820 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
821 END IF
822 CALL integrate_v_rspace_one_center(vxc_rho(ispin), qs_env, lri_v_int, calc_force, "LRI_AUX")
823 CALL auxbas_pw_pool%give_back_pw(vxc_rho(ispin))
824 END DO
825
826 DEALLOCATE (vxc_rho)
827 ekin_mol = -ekin_imol
828 xcvirial(1:3, 1:3) = 0.0_dp
829 IF (use_virial) xcvirial(1:3, 1:3) = xcvirial(1:3, 1:3) - virial%pv_xc(1:3, 1:3)
830
831 ! loop over all subsets
832 ALLOCATE (atomlist(natom))
833 DO isub = 1, kg_env%nsubsets
834 atomlist = 0
835 DO iatom = 1, natom
836 imol = kg_env%atom_to_molecule(iatom)
837 color = kg_env%subset_of_mol(imol)
838 IF (color == isub) atomlist(iatom) = 1
839 END DO
840 ! update ground-state density
841 CALL lri_kg_rho_update(rho_struct, qs_env, lri_env, lri_density, atomlist)
842
843 ! Same for external (response) density if present
844 IF (PRESENT(pmat_ext)) THEN
845 ! update response density
846 CALL lri_kg_rho_update(rho1, qs_env, lri_env1, lri_rho1, atomlist)
847 END IF
848
849 ekin_imol = 0.0_dp
850 ! calc Hohenberg-Kohn kin. energy of the density corresp. to the remaining molecular block(s)
851 NULLIFY (vxc_rho, vxc_tau)
852
853 ! calculate xc potential or kernel
854 IF (do_kernel) THEN
855 ! subsys kernel
856 CALL qs_rho_get(rho1, rho_r=rho1_r, rho_g=rho1_g, tau_r=tau1_r)
857 CALL create_kernel(qs_env, &
858 vxc=vxc_rho, &
859 vxc_tau=vxc_tau, &
860 rho=rho_struct, &
861 rho1_r=rho1_r, &
862 rho1_g=rho1_g, &
863 tau1_r=tau1_r, &
864 xc_section=xc_section)
865 ELSE
866
867 ! subsys xc-potential
868 CALL qs_vxc_create(ks_env=ks_env, &
869 rho_struct=rho_struct, &
870 xc_section=xc_section, &
871 vxc_rho=vxc_rho, &
872 vxc_tau=vxc_tau, &
873 exc=ekin_imol)
874 END IF
875 ekin_mol = ekin_mol + ekin_imol
876
877 DO ispin = 1, nspins
878 CALL pw_scale(vxc_rho(ispin), -alpha*vxc_rho(ispin)%pw_grid%dvol)
879
880 IF (PRESENT(pmat_ext) .AND. .NOT. do_kernel) THEN
881 ! int w/ pmat_ext
882 lri_v_int => lri_rho1%lri_coefs(ispin)%lri_kinds
883 ELSE
884 ! int w/ rho_ao
885 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
886 END IF
887
888 CALL integrate_v_rspace_one_center(vxc_rho(ispin), qs_env, &
889 lri_v_int, calc_force, &
890 "LRI_AUX", atomlist=atomlist)
891 ! clean up vxc_rho
892 CALL auxbas_pw_pool%give_back_pw(vxc_rho(ispin))
893 END DO
894 DEALLOCATE (vxc_rho)
895
896 IF (use_virial) THEN
897 xcvirial(1:3, 1:3) = xcvirial(1:3, 1:3) + virial%pv_xc(1:3, 1:3)
898 END IF
899
900 END DO
901
902 IF (use_virial) THEN
903 virial%pv_xc(1:3, 1:3) = xcvirial(1:3, 1:3)
904 END IF
905
906 ALLOCATE (ksmat(1))
907 DO ispin = 1, nspins
908 ksmat(1)%matrix => ks_matrix(ispin)%matrix
909 IF (PRESENT(pmat_ext) .AND. .NOT. do_kernel) THEN
910 ! KS int with rho_ext"
911 lri_v_int => lri_rho1%lri_coefs(ispin)%lri_kinds
912 DO ikind = 1, nkind
913 CALL para_env%sum(lri_v_int(ikind)%v_int)
914 END DO
915 CALL calculate_lri_ks_matrix(lri_env1, lri_v_int, ksmat, atomic_kind_set)
916 ELSE
917 ! KS int with rho_ao"
918 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
919 DO ikind = 1, nkind
920 CALL para_env%sum(lri_v_int(ikind)%v_int)
921 END DO
922 CALL calculate_lri_ks_matrix(lri_env, lri_v_int, ksmat, atomic_kind_set)
923 END IF
924
925 END DO
926 IF (calc_force) THEN
927
928 NULLIFY (pmat)
929 ALLOCATE (pmat(nspins, 1))
930
931 IF (PRESENT(pmat_ext) .AND. .NOT. do_kernel) THEN
932 ! Forces with rho_ext
933 DO ispin = 1, nspins
934 pmat(ispin, 1)%matrix => pmat_ext(ispin)%matrix
935 END DO
936 CALL calculate_lri_forces(lri_env1, lri_rho1, qs_env, pmat, atomic_kind_set)
937 ELSE
938 ! Forces with rho_ao
939 DO ispin = 1, nspins
940 pmat(ispin, 1)%matrix => density_matrix(ispin)%matrix
941 END DO
942 CALL calculate_lri_forces(lri_env, lri_density, qs_env, pmat, atomic_kind_set)
943 END IF
944
945 DEALLOCATE (pmat)
946
947 END IF
948 DEALLOCATE (atomlist, ksmat)
949
950 ! clean up rho_struct
951 CALL qs_rho_unset_rho_ao(rho_struct)
952 CALL qs_rho_release(rho_struct)
953 DEALLOCATE (rho_struct)
954 IF (PRESENT(pmat_ext)) THEN
955 CALL qs_rho_unset_rho_ao(rho1)
956 CALL qs_rho_release(rho1)
957 DEALLOCATE (rho1)
958 END IF
959 DEALLOCATE (cell_to_index)
960
961 CALL timestop(handle)
962
963 END SUBROUTINE kg_ekin_ri_embed
964
965! **************************************************************************************************
966!> \brief ...
967!> \param qs_env ...
968!> \param ks_matrix ...
969!> \param ekin_mol ...
970! **************************************************************************************************
971 SUBROUTINE kg_ekin_atomic(qs_env, ks_matrix, ekin_mol)
972 TYPE(qs_environment_type), POINTER :: qs_env
973 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_matrix
974 REAL(kind=dp), INTENT(out) :: ekin_mol
975
976 CHARACTER(LEN=*), PARAMETER :: routinen = 'kg_ekin_atomic'
977
978 INTEGER :: handle, ispin, nspins
979 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: density_matrix, tnadd_matrix
980 TYPE(kg_environment_type), POINTER :: kg_env
981 TYPE(qs_rho_type), POINTER :: rho
982
983 NULLIFY (rho, kg_env, density_matrix, tnadd_matrix)
984
985 CALL timeset(routinen, handle)
986 CALL get_qs_env(qs_env, kg_env=kg_env, rho=rho)
987
988 nspins = SIZE(ks_matrix)
989 ! get the density matrix
990 CALL qs_rho_get(rho, rho_ao=density_matrix)
991 ! get the tnadd matrix
992 tnadd_matrix => kg_env%tnadd_mat
993
994 ekin_mol = 0.0_dp
995 DO ispin = 1, nspins
996 CALL dbcsr_dot(tnadd_matrix(1)%matrix, density_matrix(ispin)%matrix, ekin_mol)
997 CALL dbcsr_add(ks_matrix(ispin)%matrix, tnadd_matrix(1)%matrix, &
998 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
999 END DO
1000 ! definition is inverted (see qs_ks_methods)
1001 ekin_mol = -ekin_mol
1002
1003 CALL timestop(handle)
1004
1005 END SUBROUTINE kg_ekin_atomic
1006
1007END 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
Routines used for Harris functional Kohn-Sham calculation.
Definition ec_methods.F:15
subroutine, public create_kernel(qs_env, vxc, vxc_tau, rho, rho1_r, rho1_g, tau1_r, xc_section, compute_virial, virial_xc)
Creation of second derivative xc-potential.
Definition ec_methods.F:89
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, 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.
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)
calculates and allocates the xc potential, already reducing it to the dependence on rho and the one o...
Definition qs_vxc.F:102
Exchange and Correlation functional calculations.
Definition xc.F:17
logical function, public xc_uses_kinetic_energy_density(xc_fun_section, lsd)
...
Definition xc.F:95
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.