(git:ed6f26b)
Loading...
Searching...
No Matches
ed_analysis.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Calculate Energy Decomposition analysis
10!> \par History
11!> 07.2023 created [JGH]
12!> \author JGH
13! **************************************************************************************************
15 USE admm_types, ONLY: admm_type
19 USE bibliography, ONLY: eriksen2020,&
20 cite_reference
21 USE cell_types, ONLY: cell_type
22 USE core_ae, ONLY: build_erfc
24 USE cp_dbcsr_api, ONLY: &
27 USE cp_dbcsr_contrib, ONLY: dbcsr_dot,&
34 USE cp_fm_types, ONLY: &
45 USE iao_types, ONLY: iao_env_type,&
52 USE kinds, ONLY: dp
53 USE mathconstants, ONLY: pi
54 USE message_passing, ONLY: mp_comm_type,&
56 USE mulliken, ONLY: mulliken_charges
60 USE physcon, ONLY: angstrom
61 USE pw_env_types, ONLY: pw_env_get,&
63 USE pw_methods, ONLY: pw_axpy,&
64 pw_scale,&
69 USE pw_types, ONLY: pw_c1d_gs_type,&
82 USE qs_gcp_types, ONLY: qs_gcp_type
83 USE qs_integrate_potential, ONLY: integrate_v_core_rspace,&
84 integrate_v_gaussian_rspace,&
85 integrate_v_rspace
86 USE qs_kind_types, ONLY: get_qs_kind,&
88 USE qs_ks_atom, ONLY: update_ks_atom
100 USE qs_rho_types, ONLY: qs_rho_get,&
102 USE qs_vxc, ONLY: qs_xc_density
106#include "./base/base_uses.f90"
107
108 IMPLICIT NONE
109 PRIVATE
110
111 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ed_analysis'
112
113 PUBLIC :: edmf_analysis
114
115! **************************************************************************************************
116
117CONTAINS
118
119! **************************************************************************************************
120!> \brief ...
121!> \param qs_env ...
122!> \param input_section ...
123!> \param unit_nr ...
124! **************************************************************************************************
125 SUBROUTINE edmf_analysis(qs_env, input_section, unit_nr)
126 TYPE(qs_environment_type), POINTER :: qs_env
127 TYPE(section_vals_type), POINTER :: input_section
128 INTEGER, INTENT(IN) :: unit_nr
129
130 CHARACTER(len=*), PARAMETER :: routinen = 'edmf_analysis'
131
132 INTEGER :: handle, iatom, ikind, iorb, ispin, jorb, &
133 nao, natom, nimages, nkind, no, norb, &
134 nref, nspin
135 INTEGER, DIMENSION(2) :: nocc
136 INTEGER, DIMENSION(:), POINTER :: refbas_blk_sizes
137 LOGICAL :: detailed_ener, do_hfx, ewald_correction, explicit, gapw, gapw_xc, &
138 ref_orb_canonical, skip_localize, uniform_occupation, uocc
139 REAL(kind=dp) :: ateps, checksum, e1, e2, e_pot, ealpha, &
140 ecc, egcp, ehfx, ekts, evdw, focc, &
141 sum_energy
142 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: amval, atcore, ate1h, ate1xc, atecc, &
143 ateks, atener, atewald, odiag
144 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: atdet, atmul, mcharge, mweight
145 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: bcenter
146 REAL(kind=dp), DIMENSION(:), POINTER :: occupation_numbers
147 TYPE(cell_type), POINTER :: cell
148 TYPE(cp_fm_struct_type), POINTER :: fm_struct
149 TYPE(cp_fm_type) :: cvec, cvec2, smo
150 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: c_iao_coef, ciao, fij_mat, orb_weight, &
151 rotmat
152 TYPE(cp_fm_type), POINTER :: cloc, moref
153 TYPE(dbcsr_distribution_type) :: dbcsr_dist
154 TYPE(dbcsr_p_type) :: dve_mat
155 TYPE(dbcsr_p_type), ALLOCATABLE, DIMENSION(:) :: exc_mat, ks_mat, vhxc_mat
156 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: core_mat, matrix_h, matrix_hfx, &
157 matrix_ks, matrix_p, matrix_s, matrix_t
158 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: math, matp
159 TYPE(dbcsr_type) :: dkmat, dmat
160 TYPE(dbcsr_type), POINTER :: smat
161 TYPE(dft_control_type), POINTER :: dft_control
162 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: ref_basis_set_list
163 TYPE(gto_basis_set_type), POINTER :: refbasis
164 TYPE(iao_env_type) :: iao_env
165 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos, mos_loc
166 TYPE(mp_comm_type) :: group
167 TYPE(mp_para_env_type), POINTER :: para_env
168 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
169 TYPE(qs_dispersion_type), POINTER :: dispersion_env
170 TYPE(qs_energy_type), POINTER :: energy
171 TYPE(qs_gcp_type), POINTER :: gcp_env
172 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
173 TYPE(qs_kind_type), POINTER :: qs_kind
174 TYPE(qs_rho_type), POINTER :: rho
175 TYPE(section_vals_type), POINTER :: hfx_sections, input
176
177 CALL section_vals_get(input_section, explicit=explicit)
178 IF (.NOT. explicit) RETURN
179
180 CALL timeset(routinen, handle)
181
182 IF (unit_nr > 0) THEN
183 WRITE (unit=unit_nr, fmt="(/,4(T2,A))") &
184 "!-----------------------------------------------------------------------------!", &
185 "! ENERGY DECOMPOSITION ANALYSIS !", &
186 "! Janus J Eriksen, JCP 153 214109 (2020) !", &
187 "!-----------------------------------------------------------------------------!"
188 END IF
189 CALL cite_reference(eriksen2020)
190
191 ! input options
192 CALL section_vals_val_get(input_section, "REFERENCE_ORB_CANONICAL", l_val=ref_orb_canonical)
193 CALL section_vals_val_get(input_section, "DETAILED_ENERGY", l_val=detailed_ener)
194 CALL section_vals_val_get(input_section, "SKIP_LOCALIZATION", l_val=skip_localize)
195 CALL section_vals_val_get(input_section, "EWALD_ALPHA_PARAMETER", r_val=ealpha)
196 ewald_correction = (ealpha /= 0.0_dp)
197 ! k-points?
198 CALL get_qs_env(qs_env, dft_control=dft_control)
199 nimages = dft_control%nimages
200 IF (nimages > 1) THEN
201 IF (unit_nr > 0) THEN
202 WRITE (unit=unit_nr, fmt="(T2,A)") &
203 "K-Points: MAO's determined and analyzed using Gamma-Point only."
204 END IF
205 END IF
206 gapw = dft_control%qs_control%gapw
207 gapw_xc = dft_control%qs_control%gapw_xc
208 IF (ewald_correction) THEN
209 IF (gapw .OR. gapw_xc) THEN
210 CALL cp_warn(__location__, "Ewald Correction for GAPW and GAPW_XC not available.")
211 cpabort("Ewald Correction")
212 END IF
213 END IF
214 CALL get_qs_env(qs_env, input=input)
215 hfx_sections => section_vals_get_subs_vals(input, "DFT%XC%HF")
216 CALL section_vals_get(hfx_sections, explicit=do_hfx)
217
218 CALL get_qs_env(qs_env, mos=mos)
219 nspin = dft_control%nspins
220 ALLOCATE (mos_loc(nspin))
221
222 ! do we have a uniform occupation
223 uocc = .true.
224 DO ispin = 1, nspin
225 CALL get_mo_set(mos(ispin), uniform_occupation=uniform_occupation)
226 IF (.NOT. uniform_occupation) uocc = .false.
227 END DO
228 IF (unit_nr > 0) THEN
229 IF (uocc) THEN
230 WRITE (unit=unit_nr, fmt="(T2,A)") &
231 "MO's have a uniform occupation pattern"
232 ELSE
233 WRITE (unit=unit_nr, fmt="(T2,A)") &
234 "MO's have varying occupations"
235 END IF
236 END IF
237
238 ! perform IAO analysis
239 CALL iao_set_default(iao_env)
240 iao_env%do_iao = .true.
241 iao_env%do_charges = .true.
242 IF (skip_localize) THEN
243 iao_env%do_bondorbitals = .false.
244 iao_env%do_center = .false.
245 ELSE
246 iao_env%do_bondorbitals = .true.
247 iao_env%do_center = .true.
248 END IF
249 iao_env%eps_occ = 1.0e-4_dp
250 CALL get_qs_env(qs_env, cell=cell)
251 iao_env%pos_periodic = .NOT. all(cell%perd == 0)
252 no = 0
253 nocc = 0
254 DO ispin = 1, nspin
255 CALL duplicate_mo_set(mos_loc(ispin), mos(ispin))
256 CALL get_mo_set(mos_loc(ispin), nmo=norb)
257 no = max(no, norb)
258 nocc(ispin) = norb
259 IF (ref_orb_canonical) THEN
260 CALL get_mo_set(mos_loc(ispin), mo_coeff=moref)
261 CALL get_qs_env(qs_env, matrix_ks=matrix_ks)
262 CALL calculate_subspace_eigenvalues(moref, matrix_ks(ispin)%matrix, &
263 do_rotation=.true.)
264 END IF
265 END DO
266 ALLOCATE (bcenter(5, no, nspin))
267 bcenter = 0.0_dp
268 CALL iao_wfn_analysis(qs_env, iao_env, unit_nr, &
269 c_iao_coef=c_iao_coef, mos=mos_loc, bond_centers=bcenter)
270
271 ! output bond centers
272 IF (iao_env%do_bondorbitals .AND. iao_env%do_center) THEN
273 CALL print_center_spread(bcenter, nocc, iounit=unit_nr)
274 END IF
275
276 ! Calculate orbital rotation matrix
277 CALL get_qs_env(qs_env, matrix_s=matrix_s)
278 smat => matrix_s(1)%matrix
279 ALLOCATE (rotmat(nspin))
280 DO ispin = 1, nspin
281 CALL get_mo_set(mos_loc(ispin), mo_coeff=cloc)
282 CALL get_mo_set(mos(ispin), mo_coeff=moref)
283 CALL cp_fm_get_info(cloc, nrow_global=nao, ncol_global=norb)
284 CALL cp_fm_create(smo, cloc%matrix_struct)
285 NULLIFY (fm_struct)
286 CALL cp_fm_struct_create(fm_struct, nrow_global=norb, ncol_global=norb, &
287 template_fmstruct=cloc%matrix_struct)
288 CALL cp_fm_create(rotmat(ispin), fm_struct)
289 CALL cp_fm_struct_release(fm_struct)
290 ! ROTMAT = Cref(T)*S*Cloc
291 CALL cp_dbcsr_sm_fm_multiply(smat, cloc, smo, ncol=norb)
292 CALL parallel_gemm('T', 'N', norb, norb, nao, 1.0_dp, moref, &
293 smo, 0.0_dp, rotmat(ispin))
294 CALL cp_fm_release(smo)
295 END DO
296
297 ! calculate occupation matrix
298 IF (.NOT. uocc) THEN
299 ALLOCATE (fij_mat(nspin))
300 DO ispin = 1, nspin
301 CALL cp_fm_create(fij_mat(ispin), rotmat(ispin)%matrix_struct)
302 CALL cp_fm_set_all(fij_mat(ispin), 0.0_dp)
303 CALL cp_fm_create(smo, rotmat(ispin)%matrix_struct)
304 ! fii = f
305 CALL get_mo_set(mos(ispin), nmo=norb, occupation_numbers=occupation_numbers)
306 DO iorb = 1, norb
307 CALL cp_fm_set_element(fij_mat(ispin), iorb, iorb, occupation_numbers(iorb))
308 END DO
309 ! fij = U(T)*f*U
310 CALL parallel_gemm('N', 'N', norb, norb, norb, 1.0_dp, fij_mat(ispin), &
311 rotmat(ispin), 0.0_dp, smo)
312 CALL parallel_gemm('T', 'N', norb, norb, norb, 1.0_dp, rotmat(ispin), &
313 smo, 0.0_dp, fij_mat(ispin))
314 CALL cp_fm_release(smo)
315 END DO
316 END IF
317
318 ! localized orbitals in IAO basis => CIAO
319 ALLOCATE (ciao(nspin))
320 DO ispin = 1, nspin
321 CALL get_mo_set(mos_loc(ispin), mo_coeff=cloc)
322 CALL cp_fm_get_info(cloc, nrow_global=nao, ncol_global=norb)
323 CALL cp_fm_get_info(c_iao_coef(ispin), ncol_global=nref)
324 CALL cp_fm_create(smo, cloc%matrix_struct)
325 NULLIFY (fm_struct)
326 CALL cp_fm_struct_create(fm_struct, nrow_global=nref, &
327 template_fmstruct=cloc%matrix_struct)
328 CALL cp_fm_create(ciao(ispin), fm_struct)
329 CALL cp_fm_struct_release(fm_struct)
330 ! CIAO = A(T)*S*C
331 CALL cp_dbcsr_sm_fm_multiply(smat, cloc, smo, ncol=norb)
332 CALL parallel_gemm('T', 'N', nref, norb, nao, 1.0_dp, c_iao_coef(ispin), &
333 smo, 0.0_dp, ciao(ispin))
334 CALL cp_fm_release(smo)
335 END DO
336
337 ! Reference basis set
338 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
339 nkind = SIZE(qs_kind_set)
340 ALLOCATE (ref_basis_set_list(nkind))
341 DO ikind = 1, nkind
342 qs_kind => qs_kind_set(ikind)
343 NULLIFY (ref_basis_set_list(ikind)%gto_basis_set)
344 NULLIFY (refbasis)
345 CALL get_qs_kind(qs_kind=qs_kind, basis_set=refbasis, basis_type="MIN")
346 IF (ASSOCIATED(refbasis)) ref_basis_set_list(ikind)%gto_basis_set => refbasis
347 END DO
348 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, natom=natom)
349 ALLOCATE (refbas_blk_sizes(natom))
350 CALL get_particle_set(particle_set, qs_kind_set, nsgf=refbas_blk_sizes, &
351 basis=ref_basis_set_list)
352
353 ! Atomic orbital weights
354 ALLOCATE (orb_weight(nspin))
355 ALLOCATE (mcharge(natom, 1))
356 DO ispin = 1, nspin
357 CALL get_mo_set(mos_loc(ispin), mo_coeff=cloc)
358 NULLIFY (fm_struct)
359 CALL cp_fm_struct_create(fm_struct, nrow_global=natom, &
360 template_fmstruct=cloc%matrix_struct)
361 CALL cp_fm_create(orb_weight(ispin), fm_struct)
362 CALL cp_fm_struct_release(fm_struct)
363 CALL cp_fm_set_all(orb_weight(ispin), 0.0_dp)
364 END DO
365 !
366 CALL dbcsr_get_info(smat, distribution=dbcsr_dist)
367 CALL dbcsr_create(matrix=dmat, name="DMAT", &
368 dist=dbcsr_dist, matrix_type=dbcsr_type_symmetric, &
369 row_blk_size=refbas_blk_sizes, col_blk_size=refbas_blk_sizes)
371 !
372 NULLIFY (fm_struct)
373 CALL cp_fm_struct_create(fm_struct, ncol_global=1, &
374 template_fmstruct=ciao(1)%matrix_struct)
375 CALL cp_fm_create(cvec, fm_struct)
376 CALL cp_fm_create(cvec2, fm_struct)
377 CALL cp_fm_struct_release(fm_struct)
378 !
379 DO ispin = 1, nspin
380 CALL get_mo_set(mos_loc(ispin), &
381 mo_coeff=cloc, nmo=norb, &
382 occupation_numbers=occupation_numbers)
383 IF (uocc) THEN
384 ! uniform occupation
385 DO iorb = 1, norb
386 CALL cp_fm_to_fm(ciao(ispin), cvec, ncol=1, source_start=iorb, target_start=1)
387 focc = occupation_numbers(iorb)
388 CALL dbcsr_set(dmat, 0.0_dp)
389 CALL cp_dbcsr_plus_fm_fm_t(dmat, cvec, ncol=1, alpha=focc)
390 CALL iao_charges(dmat, mcharge(:, 1))
391 CALL cp_fm_set_submatrix(orb_weight(ispin), mcharge, start_row=1, &
392 start_col=iorb, n_rows=natom, n_cols=1)
393 checksum = sum(mcharge(:, 1))
394 IF (abs(focc - checksum) > 1.e-6_dp) THEN
395 CALL cp_warn(__location__, "Sum of atomic orbital weights is incorrect")
396 IF (unit_nr > 0) THEN
397 WRITE (unit=unit_nr, fmt="(T2,A,F10.6,T40,A,F10.6)") &
398 "Orbital occupation:", focc, &
399 "Sum of atomic orbital weights:", checksum
400 END IF
401 END IF
402 END DO
403 ELSE
404 ! non-diagonal occupation matrix
405 ALLOCATE (odiag(norb))
406 CALL cp_fm_get_diag(fij_mat(ispin), odiag)
407 DO iorb = 1, norb
408 IF (odiag(iorb) < 1.e-8_dp) cycle
409 CALL dbcsr_set(dmat, 0.0_dp)
410 CALL cp_fm_to_fm(ciao(ispin), cvec, ncol=1, source_start=iorb, target_start=1)
411 DO jorb = 1, norb
412 CALL cp_fm_get_element(fij_mat(ispin), iorb, jorb, focc)
413 IF (focc < 1.e-12_dp) cycle
414 CALL cp_fm_to_fm(ciao(ispin), cvec2, ncol=1, source_start=jorb, target_start=1)
415 CALL cp_dbcsr_plus_fm_fm_t(dmat, cvec, cvec2, 1, alpha=focc, symmetry_mode=1)
416 END DO
417 CALL iao_charges(dmat, mcharge(:, 1))
418 checksum = sum(mcharge(:, 1))
419 focc = odiag(iorb)
420 IF (abs(focc - checksum) > 1.e-6_dp) THEN
421 CALL cp_warn(__location__, "Sum of atomic orbital weights is incorrect")
422 IF (unit_nr > 0) THEN
423 WRITE (unit=unit_nr, fmt="(T2,A,F10.6,T40,A,F10.6)") &
424 "Orbital occupation:", focc, &
425 "Sum of atomic orbital weights:", checksum
426 END IF
427 END IF
428 mcharge(:, 1) = mcharge(:, 1)/focc
429 CALL cp_fm_set_submatrix(orb_weight(ispin), mcharge, start_row=1, &
430 start_col=iorb, n_rows=natom, n_cols=1)
431 END DO
432 DEALLOCATE (odiag)
433 END IF
434 END DO
435 DEALLOCATE (mcharge)
436 CALL dbcsr_release(dmat)
437 CALL cp_fm_release(cvec)
438 CALL cp_fm_release(cvec2)
439
440 CALL get_qs_env(qs_env, para_env=para_env)
441 group = para_env
442 ! energy arrays
443 ALLOCATE (atener(natom), ateks(natom), atecc(natom), atcore(natom))
444 ALLOCATE (ate1xc(natom), ate1h(natom), atewald(natom))
445 atener = 0.0_dp
446 ateks = 0.0_dp
447 atecc = 0.0_dp
448 atcore = 0.0_dp
449 ate1xc = 0.0_dp
450 ate1h = 0.0_dp
451 atewald = 0.0_dp
452 IF (detailed_ener) THEN
453 ALLOCATE (atdet(natom, 10), atmul(natom, 10), amval(natom))
454 atdet = 0.0_dp
455 atmul = 0.0_dp
456 END IF
457 ! atom dependent density matrix
458 CALL dbcsr_create(dkmat, template=smat)
459 CALL dbcsr_copy(dkmat, smat)
460 CALL dbcsr_set(dkmat, 0.0_dp)
461 ! KS matrix + correction
462 CALL get_qs_env(qs_env, matrix_h=matrix_h, matrix_ks=matrix_ks, kinetic=matrix_t)
463 ALLOCATE (ks_mat(nspin), core_mat(1), vhxc_mat(nspin), exc_mat(1))
464 DO ispin = 1, nspin
465 ALLOCATE (ks_mat(ispin)%matrix)
466 CALL dbcsr_create(ks_mat(ispin)%matrix, template=matrix_h(1)%matrix)
467 CALL dbcsr_copy(ks_mat(ispin)%matrix, matrix_h(1)%matrix)
468 CALL dbcsr_add(ks_mat(ispin)%matrix, matrix_ks(ispin)%matrix, 1.0_dp, 1.0_dp)
469 CALL dbcsr_scale(ks_mat(ispin)%matrix, 0.5_dp)
470 !
471 ALLOCATE (vhxc_mat(ispin)%matrix)
472 CALL dbcsr_create(vhxc_mat(ispin)%matrix, template=smat)
473 CALL dbcsr_copy(vhxc_mat(ispin)%matrix, smat)
474 CALL dbcsr_set(vhxc_mat(ispin)%matrix, 0.0_dp)
475 END DO
476 !
477 ALLOCATE (core_mat(1)%matrix)
478 CALL dbcsr_create(core_mat(1)%matrix, template=matrix_h(1)%matrix)
479 CALL dbcsr_copy(core_mat(1)%matrix, matrix_h(1)%matrix)
480 CALL dbcsr_set(core_mat(1)%matrix, 0.0_dp)
481 !
482 ALLOCATE (exc_mat(1)%matrix)
483 CALL dbcsr_create(exc_mat(1)%matrix, template=smat)
484 CALL dbcsr_copy(exc_mat(1)%matrix, smat)
485 CALL dbcsr_set(exc_mat(1)%matrix, 0.0_dp)
486 !
487 CALL vhxc_correction(qs_env, vhxc_mat, exc_mat, atecc, ate1xc, ate1h)
488 !
489 CALL get_qs_env(qs_env, rho=rho)
490 CALL qs_rho_get(rho, rho_ao=matrix_p)
491 math(1:1, 1:1) => core_mat(1:1)
492 matp(1:nspin, 1:1) => matrix_p(1:nspin)
493 CALL core_matrices(qs_env, math, matp, .false., 0, atcore=atcore)
494 CALL group%sum(atcore)
495 !
496 IF (ewald_correction) THEN
497 ALLOCATE (dve_mat%matrix)
498 CALL dbcsr_create(dve_mat%matrix, template=matrix_h(1)%matrix)
499 CALL dbcsr_copy(dve_mat%matrix, matrix_h(1)%matrix)
500 CALL dbcsr_set(dve_mat%matrix, 0.0_dp)
501 CALL vh_ewald_correction(qs_env, ealpha, dve_mat, atewald)
502 CALL group%sum(atewald)
503 END IF
504 !
505 DO ispin = 1, nspin
506 CALL dbcsr_add(ks_mat(ispin)%matrix, vhxc_mat(ispin)%matrix, 1.0_dp, 1.0_dp)
507 CALL dbcsr_add(ks_mat(ispin)%matrix, core_mat(1)%matrix, 1.0_dp, -0.5_dp)
508 END DO
509 !
510 IF (detailed_ener .AND. do_hfx) THEN
511 ALLOCATE (matrix_hfx(nspin))
512 DO ispin = 1, nspin
513 ALLOCATE (matrix_hfx(nspin)%matrix)
514 CALL dbcsr_create(matrix_hfx(ispin)%matrix, template=smat)
515 CALL dbcsr_copy(matrix_hfx(ispin)%matrix, smat)
516 CALL dbcsr_set(matrix_hfx(ispin)%matrix, 0.0_dp)
517 END DO
518 CALL get_hfx_ks_matrix(qs_env, matrix_hfx)
519 END IF
520 ! Loop over spins and atoms
521 DO ispin = 1, nspin
522 CALL get_mo_set(mos_loc(ispin), mo_coeff=cloc, nmo=norb)
523 ALLOCATE (mweight(1, norb))
524 DO iatom = 1, natom
525 CALL cp_fm_get_submatrix(orb_weight(ispin), mweight, start_row=iatom, &
526 start_col=1, n_rows=1, n_cols=norb)
527 IF (uocc) THEN
528 CALL iao_calculate_dmat(cloc, dkmat, mweight(1, :), .false.)
529 ELSE
530 CALL iao_calculate_dmat(cloc, dkmat, mweight(1, :), fij_mat(ispin))
531 END IF
532 CALL dbcsr_dot(dkmat, ks_mat(ispin)%matrix, ecc)
533 ateks(iatom) = ateks(iatom) + ecc
534 !
535 IF (detailed_ener) THEN
536 CALL dbcsr_dot(dkmat, matrix_t(1)%matrix, e1)
537 atdet(iatom, 1) = atdet(iatom, 1) + e1
538 CALL dbcsr_dot(dkmat, matrix_h(1)%matrix, e2)
539 atdet(iatom, 2) = atdet(iatom, 2) + (e2 - e1)
540 IF (do_hfx) THEN
541 CALL dbcsr_scale(matrix_hfx(ispin)%matrix, 0.5_dp)
542 CALL dbcsr_dot(dkmat, matrix_hfx(ispin)%matrix, ehfx)
543 atdet(iatom, 5) = atdet(iatom, 5) + ehfx
544 CALL dbcsr_scale(matrix_hfx(ispin)%matrix, 2.0_dp)
545 ELSE
546 ehfx = 0.0_dp
547 END IF
548 CALL dbcsr_dot(dkmat, exc_mat(1)%matrix, e1)
549 atdet(iatom, 3) = atdet(iatom, 3) + ecc - e2 - e1 - ehfx
550 atdet(iatom, 4) = atdet(iatom, 4) + e1
551 END IF
552 IF (ewald_correction) THEN
553 CALL dbcsr_dot(dkmat, dve_mat%matrix, ecc)
554 atewald(iatom) = atewald(iatom) + ecc
555 END IF
556 !
557 END DO
558 DEALLOCATE (mweight)
559 END DO
560 !
561 IF (detailed_ener) THEN
562 ! Mulliken
563 CALL get_qs_env(qs_env, rho=rho, para_env=para_env)
564 CALL qs_rho_get(rho, rho_ao=matrix_p)
565 ! kinetic energy
566 DO ispin = 1, nspin
567 CALL mulliken_charges(matrix_p(ispin)%matrix, matrix_t(1)%matrix, &
568 para_env, amval)
569 atmul(1:natom, 1) = atmul(1:natom, 1) + amval(1:natom)
570 CALL mulliken_charges(matrix_p(ispin)%matrix, matrix_h(1)%matrix, &
571 para_env, amval)
572 atmul(1:natom, 2) = atmul(1:natom, 2) + amval(1:natom)
573 atmul(1:natom, 3) = atmul(1:natom, 3) - amval(1:natom)
574 CALL mulliken_charges(matrix_p(ispin)%matrix, ks_mat(ispin)%matrix, &
575 para_env, amval)
576 atmul(1:natom, 3) = atmul(1:natom, 3) + amval(1:natom)
577 IF (do_hfx) THEN
578 CALL mulliken_charges(matrix_p(ispin)%matrix, matrix_hfx(ispin)%matrix, &
579 para_env, amval)
580 atmul(1:natom, 5) = atmul(1:natom, 5) + 0.5_dp*amval(1:natom)
581 atmul(1:natom, 3) = atmul(1:natom, 3) - 0.5_dp*amval(1:natom)
582 END IF
583 CALL mulliken_charges(matrix_p(ispin)%matrix, exc_mat(1)%matrix, &
584 para_env, amval)
585 atmul(1:natom, 4) = atmul(1:natom, 4) + amval(1:natom)
586 atmul(1:natom, 3) = atmul(1:natom, 3) - amval(1:natom)
587 END DO
588 atmul(1:natom, 2) = atmul(1:natom, 2) - atmul(1:natom, 1)
589 atmul(1:natom, 3) = atmul(1:natom, 3) + 0.5_dp*atmul(1:natom, 2)
590 atmul(1:natom, 2) = 0.5_dp*atmul(1:natom, 2) + 0.5_dp*atcore(1:natom)
591 END IF
592 !
593 CALL dbcsr_release(dkmat)
594 DO ispin = 1, nspin
595 CALL dbcsr_release(ks_mat(ispin)%matrix)
596 CALL dbcsr_release(vhxc_mat(ispin)%matrix)
597 DEALLOCATE (ks_mat(ispin)%matrix, vhxc_mat(ispin)%matrix)
598 CALL deallocate_mo_set(mos_loc(ispin))
599 END DO
600 CALL dbcsr_release(core_mat(1)%matrix)
601 DEALLOCATE (core_mat(1)%matrix)
602 CALL dbcsr_release(exc_mat(1)%matrix)
603 DEALLOCATE (exc_mat(1)%matrix)
604 DEALLOCATE (ks_mat, core_mat, vhxc_mat, exc_mat)
605 DEALLOCATE (mos_loc)
606 DEALLOCATE (refbas_blk_sizes)
607 DEALLOCATE (ref_basis_set_list)
608 IF (detailed_ener .AND. do_hfx) THEN
609 DO ispin = 1, nspin
610 CALL dbcsr_release(matrix_hfx(ispin)%matrix)
611 DEALLOCATE (matrix_hfx(ispin)%matrix)
612 END DO
613 DEALLOCATE (matrix_hfx)
614 END IF
615 IF (ewald_correction) THEN
616 CALL dbcsr_release(dve_mat%matrix)
617 DEALLOCATE (dve_mat%matrix)
618 END IF
619 CALL cp_fm_release(orb_weight)
620 CALL cp_fm_release(ciao)
621 CALL cp_fm_release(rotmat)
622 CALL cp_fm_release(c_iao_coef)
623 IF (.NOT. uocc) THEN
624 CALL cp_fm_release(fij_mat)
625 END IF
626
627 ! KS energy
628 atener(1:natom) = ateks(1:natom)
629 ! 1/2 of VPP contribution Tr[VPP(K)*P]
630 atener(1:natom) = atener(1:natom) + 0.5_dp*atcore(1:natom)
631 ! core energy corrections
632 CALL group%sum(atecc)
633 atener(1:natom) = atener(1:natom) + atecc(1:natom)
634 IF (detailed_ener) atdet(1:natom, 6) = atdet(1:natom, 6) + atecc(1:natom)
635 ! one center terms (GAPW)
636 CALL group%sum(ate1xc)
637 CALL group%sum(ate1h)
638 atener(1:natom) = atener(1:natom) + ate1xc(1:natom) + ate1h(1:natom)
639 IF (detailed_ener) THEN
640 IF (gapw .OR. gapw_xc) atdet(1:natom, 8) = atdet(1:natom, 8) + ate1xc(1:natom)
641 IF (gapw) atdet(1:natom, 9) = atdet(1:natom, 9) + ate1h(1:natom)
642 END IF
643 ! core correction
644 atecc(1:natom) = 0.0_dp
645 CALL calculate_ecore_overlap(qs_env, para_env, .false., atecc=atecc)
646 CALL group%sum(atecc)
647 atener(1:natom) = atener(1:natom) + atecc(1:natom)
648 IF (detailed_ener) atdet(1:natom, 7) = atdet(1:natom, 7) + atecc(1:natom)
649 IF (ewald_correction) THEN
650 atewald(1:natom) = atewald(1:natom) - atecc(1:natom)
651 END IF
652 ! e self
653 atecc(1:natom) = 0.0_dp
654 CALL calculate_ecore_self(qs_env, atecc=atecc)
655 CALL group%sum(atecc)
656 atener(1:natom) = atener(1:natom) + atecc(1:natom)
657 IF (detailed_ener) atdet(1:natom, 7) = atdet(1:natom, 7) + atecc(1:natom)
658 IF (ewald_correction) THEN
659 atewald(1:natom) = atewald(1:natom) - atecc(1:natom)
660 CALL calculate_ecore_alpha(qs_env, ealpha, atewald)
661 END IF
662 ! vdW pair-potentials
663 atecc(1:natom) = 0.0_dp
664 CALL get_qs_env(qs_env=qs_env, dispersion_env=dispersion_env)
665 CALL calculate_dispersion_pairpot(qs_env, dispersion_env, evdw, .false., atevdw=atecc)
666 ! Pair potential gCP energy
667 CALL get_qs_env(qs_env=qs_env, gcp_env=gcp_env)
668 IF (ASSOCIATED(gcp_env)) THEN
669 CALL calculate_gcp_pairpot(qs_env, gcp_env, egcp, .false., ategcp=atecc)
670 END IF
671 CALL group%sum(atecc)
672 atener(1:natom) = atener(1:natom) + atecc(1:natom)
673 IF (detailed_ener) atdet(1:natom, 10) = atdet(1:natom, 10) + atecc(1:natom)
674 ! distribute the entropic energy
675 CALL get_qs_env(qs_env, energy=energy)
676 ekts = energy%kts/real(natom, kind=dp)
677 atener(1:natom) = atener(1:natom) + ekts
678 ! 0.5 Vpp(at)*D + 0.5 * Vpp*D(at)
679 IF (detailed_ener) THEN
680 atdet(1:natom, 3) = atdet(1:natom, 3) + 0.5_dp*atdet(1:natom, 2)
681 atdet(1:natom, 2) = 0.5_dp*atdet(1:natom, 2) + 0.5_dp*atcore(1:natom)
682 END IF
683 !
684 IF (detailed_ener) THEN
685 IF (unit_nr > 0) THEN
686 WRITE (unit_nr, fmt="(/,T2,A)") "Detailed IAO Atomic Energy Components "
687 CALL write_atdet(unit_nr, atdet(:, 1), "Kinetic Energy")
688 CALL write_atdet(unit_nr, atdet(:, 2), "Short-Range Core and/or PP Energy")
689 CALL write_atdet(unit_nr, atdet(:, 3), "Hartree Energy (long-ranged part)")
690 CALL write_atdet(unit_nr, atdet(:, 5), "Exact Exchange Energy")
691 CALL write_atdet(unit_nr, atdet(:, 4), "Exchange-Correlation Energy")
692 CALL write_atdet(unit_nr, atdet(:, 6), "Atomic Core Hartree: Int(nc V(n+nc) dx")
693 CALL write_atdet(unit_nr, atdet(:, 7), "Core Self Energy Corrections")
694 IF (gapw) THEN
695 CALL write_atdet(unit_nr, atdet(:, 9), "GAPW: 1-center Hartree Energy")
696 END IF
697 IF (gapw .OR. gapw_xc) THEN
698 CALL write_atdet(unit_nr, atdet(:, 8), "GAPW: 1-center XC Energy")
699 END IF
700 IF (abs(evdw) > 1.e-14_dp) THEN
701 CALL write_atdet(unit_nr, atdet(:, 10), "vdW Pairpotential Energy")
702 END IF
703 DO iatom = 1, natom
704 atecc(iatom) = sum(atdet(iatom, 1:10)) - atener(iatom)
705 END DO
706 CALL write_atdet(unit_nr, atecc(:), "Missing Energy")
707 !
708 WRITE (unit_nr, fmt="(/,T2,A)") "Detailed Mulliken Atomic Energy Components "
709 CALL write_atdet(unit_nr, atmul(:, 1), "Kinetic Energy")
710 CALL write_atdet(unit_nr, atmul(:, 2), "Short-Range Core and/or PP Energy")
711 CALL write_atdet(unit_nr, atmul(:, 3), "Hartree Energy (long-ranged part)")
712 CALL write_atdet(unit_nr, atmul(:, 5), "Exact Exchange Energy")
713 CALL write_atdet(unit_nr, atmul(:, 4), "Exchange-Correlation Energy")
714 CALL write_atdet(unit_nr, atdet(:, 6), "Atomic Core Hartree: Int(nc V(n+nc) dx")
715 CALL write_atdet(unit_nr, atdet(:, 7), "Core Self Energy Corrections")
716 IF (gapw) THEN
717 CALL write_atdet(unit_nr, atdet(:, 9), "GAPW: 1-center Hartree Energy")
718 END IF
719 IF (gapw .OR. gapw_xc) THEN
720 CALL write_atdet(unit_nr, atdet(:, 8), "GAPW: 1-center XC Energy")
721 END IF
722 IF (abs(evdw) > 1.e-14_dp) THEN
723 CALL write_atdet(unit_nr, atdet(:, 10), "vdW Pairpotential Energy")
724 END IF
725 END IF
726 END IF
727
728 IF (unit_nr > 0) THEN
729 e_pot = energy%total
730 ateps = 1.e-6_dp
731 CALL write_atener(unit_nr, particle_set, atener, "Atomic Energy Decomposition")
732 sum_energy = sum(atener(:))
733 checksum = abs(e_pot - sum_energy)
734 WRITE (unit=unit_nr, fmt="((T2,A,T56,F25.13))") &
735 "Potential energy (Atomic):", sum_energy, &
736 "Potential energy (Total) :", e_pot, &
737 "Difference :", checksum
738 cpassert((checksum < ateps*abs(e_pot)))
739 !
740 IF (ewald_correction) THEN
741 WRITE (unit=unit_nr, fmt="(/,(T2,A,F10.3,A))") "Universal Ewald Parameter: ", ealpha, " [Angstrom]"
742 CALL write_atener(unit_nr, particle_set, atewald, "Change in Atomic Energy Decomposition")
743 sum_energy = sum(atewald(:))
744 WRITE (unit=unit_nr, fmt="((T2,A,T56,F25.13))") &
745 "Total Change in Potential energy:", sum_energy
746 END IF
747 END IF
748
749 IF (detailed_ener) THEN
750 DEALLOCATE (atdet, atmul, amval)
751 END IF
752
753 IF (unit_nr > 0) THEN
754 WRITE (unit=unit_nr, fmt="(/,T2,A)") &
755 "!--------------------------- END OF ED ANALYSIS ------------------------------!"
756 END IF
757 DEALLOCATE (bcenter)
758 DEALLOCATE (atener, ateks, atecc, atcore, ate1xc, ate1h, atewald)
759
760 CALL timestop(handle)
761
762 END SUBROUTINE edmf_analysis
763
764! **************************************************************************************************
765!> \brief ...
766!> \param qs_env ...
767!> \param vhxc_mat ...
768!> \param exc_mat ...
769!> \param atecc ...
770!> \param ate1xc ...
771!> \param ate1h ...
772! **************************************************************************************************
773 SUBROUTINE vhxc_correction(qs_env, vhxc_mat, exc_mat, atecc, ate1xc, ate1h)
774 TYPE(qs_environment_type), POINTER :: qs_env
775 TYPE(dbcsr_p_type), DIMENSION(:) :: vhxc_mat, exc_mat
776 REAL(kind=dp), DIMENSION(:), INTENT(INOUT) :: atecc, ate1xc, ate1h
777
778 CHARACTER(len=*), PARAMETER :: routinen = 'vhxc_correction'
779
780 INTEGER :: handle, iatom, ispin, natom, nspins
781 LOGICAL :: do_admm_corr, gapw, gapw_xc
782 REAL(kind=dp) :: eh1, exc1
783 TYPE(admm_type), POINTER :: admm_env
784 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
785 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_p
786 TYPE(dft_control_type), POINTER :: dft_control
787 TYPE(ecoul_1center_type), DIMENSION(:), POINTER :: ecoul_1c
788 TYPE(local_rho_type), POINTER :: local_rho_set
789 TYPE(mp_para_env_type), POINTER :: para_env
790 TYPE(pw_env_type), POINTER :: pw_env
791 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
792 TYPE(pw_r3d_rs_type) :: xc_den
793 TYPE(pw_r3d_rs_type), ALLOCATABLE, DIMENSION(:) :: vtau, vxc
794 TYPE(pw_r3d_rs_type), POINTER :: v_hartree_rspace
795 TYPE(qs_dispersion_type), POINTER :: dispersion_env
796 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
797 TYPE(qs_ks_env_type), POINTER :: ks_env
798 TYPE(qs_rho_type), POINTER :: rho_struct
799 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom_set
800 TYPE(section_vals_type), POINTER :: xc_fun_section, xc_section
801 TYPE(xc_rho_cflags_type) :: needs
802
803 CALL timeset(routinen, handle)
804
805 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control, pw_env=pw_env)
806
807 nspins = dft_control%nspins
808 gapw = dft_control%qs_control%gapw
809 gapw_xc = dft_control%qs_control%gapw_xc
810 do_admm_corr = .false.
811 IF (dft_control%do_admm) THEN
812 IF (qs_env%admm_env%aux_exch_func /= do_admm_aux_exch_func_none) do_admm_corr = .true.
813 END IF
814 IF (do_admm_corr) THEN
815 CALL get_qs_env(qs_env, admm_env=admm_env)
816 xc_section => admm_env%xc_section_aux
817 ELSE
818 xc_section => section_vals_get_subs_vals(qs_env%input, "DFT%XC")
819 END IF
820 xc_fun_section => section_vals_get_subs_vals(xc_section, "XC_FUNCTIONAL")
821 needs = xc_functionals_get_needs(xc_fun_section, (nspins == 2), .true.)
822
823 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
824 CALL auxbas_pw_pool%create_pw(xc_den)
825 ALLOCATE (vxc(nspins))
826 DO ispin = 1, nspins
827 CALL auxbas_pw_pool%create_pw(vxc(ispin))
828 END DO
829 IF (needs%tau .OR. needs%tau_spin) THEN
830 ALLOCATE (vtau(nspins))
831 DO ispin = 1, nspins
832 CALL auxbas_pw_pool%create_pw(vtau(ispin))
833 END DO
834 END IF
835
836 ! Nuclear charge correction
837 CALL get_qs_env(qs_env, v_hartree_rspace=v_hartree_rspace)
838 CALL integrate_v_core_rspace(v_hartree_rspace, qs_env, atecc=atecc)
839 IF (gapw .OR. gapw_xc) THEN
840 CALL get_qs_env(qs_env=qs_env, local_rho_set=local_rho_set, &
841 rho_atom_set=rho_atom_set, ecoul_1c=ecoul_1c, &
842 natom=natom, para_env=para_env)
843 CALL zero_rho_atom_integrals(rho_atom_set)
844 CALL calculate_vxc_atom(qs_env, .false., exc1)
845 IF (gapw) THEN
846 CALL vh_1c_gg_integrals(qs_env, eh1, ecoul_1c, local_rho_set, para_env, tddft=.false.)
847 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
848 CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace, para_env, calculate_forces=.false., &
849 local_rho_set=local_rho_set, atener=atecc)
850 END IF
851 END IF
852
853 IF (gapw_xc) THEN
854 CALL get_qs_env(qs_env, rho_xc=rho_struct, dispersion_env=dispersion_env)
855 ELSE
856 CALL get_qs_env(qs_env, rho=rho_struct, dispersion_env=dispersion_env)
857 END IF
858 !
859 cpassert(.NOT. do_admm_corr)
860 !
861 IF (needs%tau .OR. needs%tau_spin) THEN
862 CALL qs_xc_density(ks_env, rho_struct, xc_section, dispersion_env=dispersion_env, &
863 xc_den=xc_den, vxc=vxc, vtau=vtau)
864 ELSE
865 CALL qs_xc_density(ks_env, rho_struct, xc_section, dispersion_env=dispersion_env, &
866 xc_den=xc_den, vxc=vxc)
867 END IF
868 DO ispin = 1, nspins
869 CALL pw_scale(vxc(ispin), -0.5_dp)
870 CALL pw_axpy(xc_den, vxc(ispin))
871 CALL pw_scale(vxc(ispin), vxc(ispin)%pw_grid%dvol)
872 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=vxc(ispin), &
873 hmat=vhxc_mat(ispin), calculate_forces=.false., &
874 gapw=(gapw .OR. gapw_xc))
875 IF (needs%tau .OR. needs%tau_spin) THEN
876 CALL pw_scale(vtau(ispin), -0.5_dp*vtau(ispin)%pw_grid%dvol)
877 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=vtau(ispin), &
878 hmat=vhxc_mat(ispin), calculate_forces=.false., &
879 compute_tau=.true., gapw=(gapw .OR. gapw_xc))
880 END IF
881 END DO
882 CALL pw_scale(xc_den, xc_den%pw_grid%dvol)
883 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=xc_den, &
884 hmat=exc_mat(1), calculate_forces=.false., &
885 gapw=(gapw .OR. gapw_xc))
886
887 IF (gapw .OR. gapw_xc) THEN
888 ! remove one-center potential matrix part
889 CALL qs_rho_get(rho_struct, rho_ao_kp=matrix_p)
890 CALL update_ks_atom(qs_env, vhxc_mat, matrix_p, forces=.false., kscale=-0.5_dp)
891 !
892 DO iatom = 1, natom
893 ate1xc(iatom) = ate1xc(iatom) + &
894 rho_atom_set(iatom)%exc_h - rho_atom_set(iatom)%exc_s
895 END DO
896 IF (gapw) THEN
897 DO iatom = 1, natom
898 ate1h(iatom) = ate1h(iatom) + &
899 ecoul_1c(iatom)%ecoul_1_h - ecoul_1c(iatom)%ecoul_1_s + &
900 ecoul_1c(iatom)%ecoul_1_z - ecoul_1c(iatom)%ecoul_1_0
901 END DO
902 END IF
903 END IF
904
905 CALL auxbas_pw_pool%give_back_pw(xc_den)
906 DO ispin = 1, nspins
907 CALL auxbas_pw_pool%give_back_pw(vxc(ispin))
908 END DO
909 IF (needs%tau .OR. needs%tau_spin) THEN
910 DO ispin = 1, nspins
911 CALL auxbas_pw_pool%give_back_pw(vtau(ispin))
912 END DO
913 END IF
914
915 CALL timestop(handle)
916
917 END SUBROUTINE vhxc_correction
918
919! **************************************************************************************************
920!> \brief ...
921!> \param qs_env ...
922!> \param ealpha ...
923!> \param vh_mat ...
924!> \param atewd ...
925! **************************************************************************************************
926 SUBROUTINE vh_ewald_correction(qs_env, ealpha, vh_mat, atewd)
927 TYPE(qs_environment_type), POINTER :: qs_env
928 REAL(kind=dp), INTENT(IN) :: ealpha
929 TYPE(dbcsr_p_type) :: vh_mat
930 REAL(kind=dp), DIMENSION(:), INTENT(INOUT) :: atewd
931
932 CHARACTER(len=*), PARAMETER :: routinen = 'vh_ewald_correction'
933
934 INTEGER :: handle, ikind, ispin, natom, nkind
935 REAL(kind=dp) :: eps_core_charge, rhotot, zeff
936 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: alpha, atcore, atecc, ccore
937 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
938 TYPE(dbcsr_p_type) :: e_mat
939 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p
940 TYPE(dft_control_type), POINTER :: dft_control
941 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
942 POINTER :: sab_orb, sac_ae
943 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
944 TYPE(pw_c1d_gs_type) :: rho_tot_ewd_g, v_hewd_gspace
945 TYPE(pw_env_type), POINTER :: pw_env
946 TYPE(pw_poisson_type), POINTER :: poisson_env
947 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
948 TYPE(pw_r3d_rs_type) :: rho_tot_ewd_r, v_hewd_rspace
949 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r
950 TYPE(pw_r3d_rs_type), POINTER :: v_hartree_rspace
951 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
952 TYPE(qs_rho_type), POINTER :: rho
953
954 CALL timeset(routinen, handle)
955
956 natom = SIZE(atewd)
957 ALLOCATE (atecc(natom), atcore(natom))
958 CALL get_qs_env(qs_env=qs_env, nkind=nkind, qs_kind_set=qs_kind_set, &
959 dft_control=dft_control)
960 ALLOCATE (alpha(nkind), ccore(nkind))
961 DO ikind = 1, nkind
962 CALL get_qs_kind(qs_kind_set(ikind), zeff=zeff)
963 alpha(ikind) = ealpha
964 ccore(ikind) = zeff*(ealpha/pi)**1.5_dp
965 END DO
966 !
967 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
968 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
969 poisson_env=poisson_env)
970 !
971 CALL auxbas_pw_pool%create_pw(v_hewd_gspace)
972 CALL auxbas_pw_pool%create_pw(v_hewd_rspace)
973 CALL auxbas_pw_pool%create_pw(rho_tot_ewd_g)
974 CALL auxbas_pw_pool%create_pw(rho_tot_ewd_r)
975 rhotot = 0.0_dp
976 CALL calculate_rho_core(rho_tot_ewd_r, rhotot, qs_env, calpha=alpha, ccore=ccore)
977 ! Get the total density in g-space [ions + electrons]
978 CALL get_qs_env(qs_env=qs_env, rho=rho)
979 CALL qs_rho_get(rho, rho_r=rho_r)
980 DO ispin = 1, dft_control%nspins
981 CALL pw_axpy(rho_r(ispin), rho_tot_ewd_r)
982 END DO
983 CALL pw_transfer(rho_tot_ewd_r, rho_tot_ewd_g)
984 !
985 CALL pw_poisson_solve(poisson_env, density=rho_tot_ewd_g, vhartree=v_hewd_gspace)
986 CALL pw_transfer(v_hewd_gspace, v_hewd_rspace)
987 CALL pw_scale(v_hewd_rspace, v_hewd_rspace%pw_grid%dvol)
988 atecc = 0.0_dp
989 CALL integrate_v_gaussian_rspace(v_hewd_rspace, qs_env, alpha, ccore, atecc)
990 atewd(1:natom) = atewd(1:natom) + atecc(1:natom)
991 !
992 atecc = 0.0_dp
993 CALL get_qs_env(qs_env, v_hartree_rspace=v_hartree_rspace)
994 CALL integrate_v_core_rspace(v_hartree_rspace, qs_env, atecc=atecc)
995 atewd(1:natom) = atewd(1:natom) - atecc(1:natom)
996 !
997 CALL pw_axpy(v_hartree_rspace, v_hewd_rspace, -1.0_dp)
998 CALL dbcsr_set(vh_mat%matrix, 0.0_dp)
999 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_hewd_rspace, hmat=vh_mat, &
1000 calculate_forces=.false.)
1001 !
1002 CALL dbcsr_scale(vh_mat%matrix, 0.5_dp)
1003 !
1004 ! delta erfc
1005 CALL qs_rho_get(rho, rho_ao=matrix_p)
1006 eps_core_charge = dft_control%qs_control%eps_core_charge
1007 ALLOCATE (e_mat%matrix)
1008 CALL dbcsr_create(e_mat%matrix, template=vh_mat%matrix)
1009 CALL dbcsr_copy(e_mat%matrix, vh_mat%matrix)
1010 !
1011 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, &
1012 particle_set=particle_set, sab_orb=sab_orb, sac_ppl=sac_ae)
1013 CALL dbcsr_set(e_mat%matrix, 0.0_dp)
1014 atcore = 0.0_dp
1015 CALL build_erfc(e_mat, matrix_p, qs_kind_set, atomic_kind_set, particle_set, &
1016 alpha, ccore, eps_core_charge, sab_orb, sac_ae, atcore)
1017 atewd(1:natom) = atewd(1:natom) + 0.5_dp*atcore(1:natom)
1018 CALL dbcsr_add(vh_mat%matrix, e_mat%matrix, 1.0_dp, 0.5_dp)
1019 DO ikind = 1, nkind
1020 CALL get_qs_kind(qs_kind_set(ikind), alpha_core_charge=alpha(ikind), &
1021 ccore_charge=ccore(ikind))
1022 END DO
1023 CALL dbcsr_set(e_mat%matrix, 0.0_dp)
1024 atcore = 0.0_dp
1025 CALL build_erfc(e_mat, matrix_p, qs_kind_set, atomic_kind_set, particle_set, &
1026 alpha, ccore, eps_core_charge, sab_orb, sac_ae, atcore)
1027 atewd(1:natom) = atewd(1:natom) - 0.5_dp*atcore(1:natom)
1028 CALL dbcsr_add(vh_mat%matrix, e_mat%matrix, 1.0_dp, -0.5_dp)
1029 !
1030 CALL dbcsr_release(e_mat%matrix)
1031 DEALLOCATE (e_mat%matrix)
1032 CALL auxbas_pw_pool%give_back_pw(v_hewd_gspace)
1033 CALL auxbas_pw_pool%give_back_pw(v_hewd_rspace)
1034 CALL auxbas_pw_pool%give_back_pw(rho_tot_ewd_g)
1035 CALL auxbas_pw_pool%give_back_pw(rho_tot_ewd_r)
1036 DEALLOCATE (atecc, atcore)
1037 DEALLOCATE (alpha, ccore)
1038
1039 CALL timestop(handle)
1040
1041 END SUBROUTINE vh_ewald_correction
1042
1043! **************************************************************************************************
1044!> \brief ...
1045!> \param qs_env ...
1046!> \param matrix_hfx ...
1047! **************************************************************************************************
1048 SUBROUTINE get_hfx_ks_matrix(qs_env, matrix_hfx)
1049 TYPE(qs_environment_type), POINTER :: qs_env
1050 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_hfx
1051
1052 CHARACTER(len=*), PARAMETER :: routinen = 'get_hfx_ks_matrix'
1053
1054 INTEGER :: handle
1055 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p
1056 TYPE(qs_rho_type), POINTER :: rho
1057
1058 CALL timeset(routinen, handle)
1059
1060 CALL get_qs_env(qs_env, rho=rho)
1061 CALL qs_rho_get(rho, rho_ao=matrix_p)
1062 CALL tddft_hfx_matrix(matrix_hfx, matrix_p, qs_env, update_energy=.false., &
1063 recalc_integrals=.false.)
1064
1065 CALL timestop(handle)
1066
1067 END SUBROUTINE get_hfx_ks_matrix
1068! **************************************************************************************************
1069!> \brief Write the atomic coordinates, types, and energies
1070!> \param iounit ...
1071!> \param particle_set ...
1072!> \param atener ...
1073!> \param label ...
1074!> \date 05.06.2023
1075!> \author JGH
1076!> \version 1.0
1077! **************************************************************************************************
1078 SUBROUTINE write_atener(iounit, particle_set, atener, label)
1079
1080 INTEGER, INTENT(IN) :: iounit
1081 TYPE(particle_type), DIMENSION(:) :: particle_set
1082 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: atener
1083 CHARACTER(LEN=*), INTENT(IN) :: label
1084
1085 INTEGER :: i, natom
1086
1087 IF (iounit > 0) THEN
1088 WRITE (unit=iounit, fmt="(/,T2,A)") trim(label)
1089 WRITE (unit=iounit, fmt="(T4,A,T30,A,T42,A,T54,A,T69,A)") &
1090 "Atom Element", "X", "Y", "Z", "Energy[a.u.]"
1091 natom = SIZE(atener)
1092 DO i = 1, natom
1093 WRITE (unit=iounit, fmt="(I6,T12,A2,T24,3F12.6,F21.10)") i, &
1094 trim(adjustl(particle_set(i)%atomic_kind%element_symbol)), &
1095 particle_set(i)%r(1:3)*angstrom, atener(i)
1096 END DO
1097 WRITE (unit=iounit, fmt="(A)") ""
1098 END IF
1099
1100 END SUBROUTINE write_atener
1101
1102! **************************************************************************************************
1103!> \brief Write the one component of atomic energies
1104!> \param iounit ...
1105!> \param atener ...
1106!> \param label ...
1107!> \date 18.08.2023
1108!> \author JGH
1109!> \version 1.0
1110! **************************************************************************************************
1111 SUBROUTINE write_atdet(iounit, atener, label)
1112 INTEGER, INTENT(IN) :: iounit
1113 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: atener
1114 CHARACTER(LEN=*), INTENT(IN) :: label
1115
1116 INTEGER :: natom
1117
1118 IF (iounit > 0) THEN
1119 natom = SIZE(atener)
1120 WRITE (unit=iounit, fmt="(T2,A)") trim(label)
1121 WRITE (unit=iounit, fmt="(5G16.8)") atener(1:natom)
1122 END IF
1123
1124 END SUBROUTINE write_atdet
1125
1126END MODULE ed_analysis
Types and set/get functions for auxiliary density matrix methods.
Definition admm_types.F:15
Define the atomic kind types and their sub types.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public eriksen2020
Handles all functions related to the CELL.
Definition cell_types.F:15
Calculation of the nuclear attraction contribution to the core Hamiltonian <a|erfc|b> :we only calcul...
Definition core_ae.F:14
subroutine, public build_erfc(matrix_h, matrix_p, qs_kind_set, atomic_kind_set, particle_set, calpha, ccore, eps_core_charge, sab_orb, sac_ae, atcore)
Integrals = -Z*erfc(a*r)/r.
Definition core_ae.F:607
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
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.
subroutine, public dbcsr_reserve_diag_blocks(matrix)
Reserves all diagonal blocks.
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_get_diag(matrix, diag)
returns the diagonal elements of a fm
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_get_element(matrix, irow_global, icol_global, alpha, local)
returns an element of a fm this value is valid on every cpu using this call is expensive
subroutine, public cp_fm_set_submatrix(fm, new_values, start_row, start_col, n_rows, n_cols, alpha, beta, transpose)
sets a submatrix of a full matrix fm(start_row:start_row+n_rows,start_col:start_col+n_cols) = alpha*o...
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
gets a submatrix of a full matrix op(target_m)(1:n_rows,1:n_cols) =fm(start_row:start_row+n_rows,...
subroutine, public cp_fm_set_element(matrix, irow_global, icol_global, alpha)
sets an element of a matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
Calculate Energy Decomposition analysis.
Definition ed_analysis.F:14
subroutine, public edmf_analysis(qs_env, input_section, unit_nr)
...
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...
Utilities for hfx and admm methods.
subroutine, public tddft_hfx_matrix(matrix_ks, rho_ao, qs_env, update_energy, recalc_integrals, external_hfx_sections, external_x_data, external_para_env)
Add the hfx contributions to the Hamiltonian.
Calculate intrinsic atomic orbitals and analyze wavefunctions.
subroutine, public iao_wfn_analysis(qs_env, iao_env, unit_nr, c_iao_coef, mos, bond_centers)
...
subroutine, public print_center_spread(moments, nocc, print_section, iounit)
prints charge center and spreads for all orbitals
subroutine, public iao_charges(p_matrix, charges)
compute the atomic charges (orthogonal basis)
Calculate ntrinsic atomic orbitals and analyze wavefunctions.
Definition iao_types.F:14
subroutine, public iao_set_default(iao_env)
...
Definition iao_types.F:74
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_admm_aux_exch_func_none
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
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
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Interface to the message passing library MPI.
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
Definition mulliken.F:13
basic linear algebra operations for full matrixes
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis)
Get the components of a particle set.
Define the data structure for the particle information.
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public angstrom
Definition physcon.F:144
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
functions related to the poisson solver on regular grids
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
Calculation of the energies concerning the core charge distribution.
subroutine, public calculate_ecore_overlap(qs_env, para_env, calculate_forces, molecular, e_overlap_core, atecc)
Calculate the overlap energy of the core charge distribution.
subroutine, public calculate_ecore_self(qs_env, e_self_core, atecc)
Calculate the self energy of the core charge distribution.
subroutine, public calculate_ecore_alpha(qs_env, alpha, atecc)
Calculate the overlap and self energy of the core charge distribution for a given alpha Use a minimum...
Calculation of the core Hamiltonian integral matrix <a|H|b> over Cartesian Gaussian-type functions.
subroutine, public core_matrices(qs_env, matrix_h, matrix_p, calculate_forces, nder, atcore)
...
Calculation of dispersion using pair potentials.
subroutine, public calculate_dispersion_pairpot(qs_env, dispersion_env, energy, calculate_forces, atevdw)
...
Definition of disperson types for DFT calculations.
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_pp, 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, 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)
Get the QUICKSTEP environment.
Calculation of gCP pair potentials.
subroutine, public calculate_gcp_pairpot(qs_env, gcp_env, energy, calculate_forces, ategcp)
...
Definition of gCP types for DFT calculations.
Integrate single or product functions over a potential on a RS grid.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
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
collects routines that perform operations directly related to MOs
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public duplicate_mo_set(mo_set_new, mo_set_old)
allocate a new mo_set, and copy the old data
subroutine, public deallocate_mo_set(mo_set)
Deallocate a wavefunction data structure.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
subroutine, public integrate_vhg0_rspace(qs_env, v_rspace, para_env, calculate_forces, local_rho_set, local_rho_set_2nd, atener, kforce, my_pools, my_rs_descs)
...
subroutine, public zero_rho_atom_integrals(rho_atom_set)
...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
routines that build the integrals of the Vxc potential calculated for the atomic density in the basis...
Definition qs_vxc_atom.F:12
subroutine, public calculate_vxc_atom(qs_env, energy_only, exc1, gradient_atom_set, adiabatic_rescale_factor, kind_set_external, rho_atom_set_external, xc_section_external)
...
Definition qs_vxc_atom.F:85
subroutine, public qs_xc_density(ks_env, rho_struct, xc_section, dispersion_env, xc_ener, xc_den, vxc, vtau)
calculates the XC density: E_xc(r) - V_xc(r)*rho(r) or E_xc(r)/rho(r)
Definition qs_vxc.F:573
type(xc_rho_cflags_type) function, public xc_functionals_get_needs(functionals, lsd, calc_potential)
...
contains the structure
stores some data used in wavefunction fitting
Definition admm_types.F:120
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
keeps the information about the structure of a full matrix
represent a full matrix
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.
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.
contains a flag for each component of xc_rho_set, so that you can use it to tell which components you...