(git:374b731)
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-2024 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
29 USE cp_fm_types, ONLY: &
33 USE dbcsr_api, ONLY: &
34 dbcsr_add, dbcsr_copy, dbcsr_create, dbcsr_distribution_type, dbcsr_dot, dbcsr_get_info, &
35 dbcsr_p_type, dbcsr_release, dbcsr_reserve_diag_blocks, dbcsr_scale, dbcsr_set, &
36 dbcsr_type, dbcsr_type_symmetric
44 USE iao_types, ONLY: iao_env_type,&
51 USE kinds, ONLY: dp
52 USE mathconstants, ONLY: pi
53 USE message_passing, ONLY: mp_comm_type,&
55 USE mulliken, ONLY: mulliken_charges
59 USE physcon, ONLY: angstrom
60 USE pw_env_types, ONLY: pw_env_get,&
62 USE pw_methods, ONLY: pw_axpy,&
63 pw_scale,&
68 USE pw_types, ONLY: pw_c1d_gs_type,&
80 USE qs_gcp_types, ONLY: qs_gcp_type
81 USE qs_integrate_potential, ONLY: integrate_v_core_rspace,&
82 integrate_v_gaussian_rspace,&
83 integrate_v_rspace
84 USE qs_kind_types, ONLY: get_qs_kind,&
86 USE qs_ks_atom, ONLY: update_ks_atom
98 USE qs_rho_types, ONLY: qs_rho_get,&
100 USE qs_vxc, ONLY: qs_xc_density
104#include "./base/base_uses.f90"
105
106 IMPLICIT NONE
107 PRIVATE
108
109 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ed_analysis'
110
111 PUBLIC :: edmf_analysis
112
113! **************************************************************************************************
114
115CONTAINS
116
117! **************************************************************************************************
118!> \brief ...
119!> \param qs_env ...
120!> \param input_section ...
121!> \param unit_nr ...
122! **************************************************************************************************
123 SUBROUTINE edmf_analysis(qs_env, input_section, unit_nr)
124 TYPE(qs_environment_type), POINTER :: qs_env
125 TYPE(section_vals_type), POINTER :: input_section
126 INTEGER, INTENT(IN) :: unit_nr
127
128 CHARACTER(len=*), PARAMETER :: routinen = 'edmf_analysis'
129
130 INTEGER :: handle, iatom, ikind, iorb, ispin, jorb, &
131 nao, natom, nimages, nkind, no, norb, &
132 nref, nspin
133 INTEGER, DIMENSION(2) :: nocc
134 INTEGER, DIMENSION(:), POINTER :: refbas_blk_sizes
135 LOGICAL :: detailed_ener, do_hfx, ewald_correction, explicit, gapw, gapw_xc, &
136 ref_orb_canonical, skip_localize, uniform_occupation, uocc
137 REAL(kind=dp) :: ateps, checksum, e1, e2, e_pot, ealpha, &
138 ecc, egcp, ehfx, ekts, evdw, focc, &
139 sum_energy
140 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: amval, ate1h, ate1xc, atecc, ateks, &
141 atener, atewald, odiag
142 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: atdet, atmul, mcharge, mweight
143 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: bcenter
144 REAL(kind=dp), DIMENSION(:), POINTER :: occupation_numbers
145 TYPE(cell_type), POINTER :: cell
146 TYPE(cp_fm_struct_type), POINTER :: fm_struct
147 TYPE(cp_fm_type) :: cvec, cvec2, smo
148 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: c_iao_coef, ciao, fij_mat, orb_weight, &
149 rotmat
150 TYPE(cp_fm_type), POINTER :: cloc, moref
151 TYPE(dbcsr_distribution_type) :: dbcsr_dist
152 TYPE(dbcsr_p_type) :: dve_mat
153 TYPE(dbcsr_p_type), ALLOCATABLE, DIMENSION(:) :: exc_mat, ks_mat, vhxc_mat
154 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_h, matrix_hfx, matrix_ks, &
155 matrix_p, matrix_s, matrix_t
156 TYPE(dbcsr_type) :: dkmat, dmat
157 TYPE(dbcsr_type), POINTER :: smat
158 TYPE(dft_control_type), POINTER :: dft_control
159 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: ref_basis_set_list
160 TYPE(gto_basis_set_type), POINTER :: refbasis
161 TYPE(iao_env_type) :: iao_env
162 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos, mos_loc
163 TYPE(mp_comm_type) :: group
164 TYPE(mp_para_env_type), POINTER :: para_env
165 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
166 TYPE(qs_dispersion_type), POINTER :: dispersion_env
167 TYPE(qs_energy_type), POINTER :: energy
168 TYPE(qs_gcp_type), POINTER :: gcp_env
169 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
170 TYPE(qs_kind_type), POINTER :: qs_kind
171 TYPE(qs_rho_type), POINTER :: rho
172 TYPE(section_vals_type), POINTER :: hfx_sections, input
173
174 CALL section_vals_get(input_section, explicit=explicit)
175 IF (.NOT. explicit) RETURN
176
177 CALL timeset(routinen, handle)
178
179 IF (unit_nr > 0) THEN
180 WRITE (unit=unit_nr, fmt="(/,4(T2,A))") &
181 "!-----------------------------------------------------------------------------!", &
182 "! ENERGY DECOMPOSITION ANALYSIS !", &
183 "! Janus J Eriksen, JCP 153 214109 (2020) !", &
184 "!-----------------------------------------------------------------------------!"
185 END IF
186 CALL cite_reference(eriksen2020)
187
188 ! input options
189 CALL section_vals_val_get(input_section, "REFERENCE_ORB_CANONICAL", l_val=ref_orb_canonical)
190 CALL section_vals_val_get(input_section, "DETAILED_ENERGY", l_val=detailed_ener)
191 CALL section_vals_val_get(input_section, "SKIP_LOCALIZATION", l_val=skip_localize)
192 CALL section_vals_val_get(input_section, "EWALD_ALPHA_PARAMETER", r_val=ealpha)
193 ewald_correction = (ealpha /= 0.0_dp)
194 ! k-points?
195 CALL get_qs_env(qs_env, dft_control=dft_control)
196 nimages = dft_control%nimages
197 IF (nimages > 1) THEN
198 IF (unit_nr > 0) THEN
199 WRITE (unit=unit_nr, fmt="(T2,A)") &
200 "K-Points: MAO's determined and analyzed using Gamma-Point only."
201 END IF
202 END IF
203 gapw = dft_control%qs_control%gapw
204 gapw_xc = dft_control%qs_control%gapw_xc
205 IF (ewald_correction) THEN
206 IF (gapw .OR. gapw_xc) THEN
207 CALL cp_warn(__location__, "Ewald Correction for GAPW and GAPW_XC not available.")
208 cpabort("Ewald Correction")
209 END IF
210 END IF
211 CALL get_qs_env(qs_env, input=input)
212 hfx_sections => section_vals_get_subs_vals(input, "DFT%XC%HF")
213 CALL section_vals_get(hfx_sections, explicit=do_hfx)
214
215 CALL get_qs_env(qs_env, mos=mos)
216 nspin = dft_control%nspins
217 ALLOCATE (mos_loc(nspin))
218
219 ! do we have a uniform occupation
220 uocc = .true.
221 DO ispin = 1, nspin
222 CALL get_mo_set(mos(ispin), uniform_occupation=uniform_occupation)
223 IF (.NOT. uniform_occupation) uocc = .false.
224 END DO
225 IF (unit_nr > 0) THEN
226 IF (uocc) THEN
227 WRITE (unit=unit_nr, fmt="(T2,A)") &
228 "MO's have a uniform occupation pattern"
229 ELSE
230 WRITE (unit=unit_nr, fmt="(T2,A)") &
231 "MO's have varying occupations"
232 END IF
233 END IF
234
235 ! perform IAO analysis
236 CALL iao_set_default(iao_env)
237 iao_env%do_iao = .true.
238 iao_env%do_charges = .true.
239 IF (skip_localize) THEN
240 iao_env%do_bondorbitals = .false.
241 iao_env%do_center = .false.
242 ELSE
243 iao_env%do_bondorbitals = .true.
244 iao_env%do_center = .true.
245 END IF
246 iao_env%eps_occ = 1.0e-4_dp
247 CALL get_qs_env(qs_env, cell=cell)
248 iao_env%pos_periodic = .NOT. all(cell%perd == 0)
249 no = 0
250 nocc = 0
251 DO ispin = 1, nspin
252 CALL duplicate_mo_set(mos_loc(ispin), mos(ispin))
253 CALL get_mo_set(mos_loc(ispin), nmo=norb)
254 no = max(no, norb)
255 nocc(ispin) = norb
256 IF (ref_orb_canonical) THEN
257 CALL get_mo_set(mos_loc(ispin), mo_coeff=moref)
258 CALL get_qs_env(qs_env, matrix_ks=matrix_ks)
259 CALL calculate_subspace_eigenvalues(moref, matrix_ks(ispin)%matrix, &
260 do_rotation=.true.)
261 END IF
262 END DO
263 ALLOCATE (bcenter(5, no, nspin))
264 bcenter = 0.0_dp
265 CALL iao_wfn_analysis(qs_env, iao_env, unit_nr, &
266 c_iao_coef=c_iao_coef, mos=mos_loc, bond_centers=bcenter)
267
268 ! output bond centers
269 IF (iao_env%do_bondorbitals .AND. iao_env%do_center) THEN
270 CALL print_center_spread(bcenter, nocc, iounit=unit_nr)
271 END IF
272
273 ! Calculate orbital rotation matrix
274 CALL get_qs_env(qs_env, matrix_s=matrix_s)
275 smat => matrix_s(1)%matrix
276 ALLOCATE (rotmat(nspin))
277 DO ispin = 1, nspin
278 CALL get_mo_set(mos_loc(ispin), mo_coeff=cloc)
279 CALL get_mo_set(mos(ispin), mo_coeff=moref)
280 CALL cp_fm_get_info(cloc, nrow_global=nao, ncol_global=norb)
281 CALL cp_fm_create(smo, cloc%matrix_struct)
282 NULLIFY (fm_struct)
283 CALL cp_fm_struct_create(fm_struct, nrow_global=norb, ncol_global=norb, &
284 template_fmstruct=cloc%matrix_struct)
285 CALL cp_fm_create(rotmat(ispin), fm_struct)
286 CALL cp_fm_struct_release(fm_struct)
287 ! ROTMAT = Cref(T)*S*Cloc
288 CALL cp_dbcsr_sm_fm_multiply(smat, cloc, smo, ncol=norb)
289 CALL parallel_gemm('T', 'N', norb, norb, nao, 1.0_dp, moref, &
290 smo, 0.0_dp, rotmat(ispin))
291 CALL cp_fm_release(smo)
292 END DO
293
294 ! calculate occupation matrix
295 IF (.NOT. uocc) THEN
296 ALLOCATE (fij_mat(nspin))
297 DO ispin = 1, nspin
298 CALL cp_fm_create(fij_mat(ispin), rotmat(ispin)%matrix_struct)
299 CALL cp_fm_set_all(fij_mat(ispin), 0.0_dp)
300 CALL cp_fm_create(smo, rotmat(ispin)%matrix_struct)
301 ! fii = f
302 CALL get_mo_set(mos(ispin), nmo=norb, occupation_numbers=occupation_numbers)
303 DO iorb = 1, norb
304 CALL cp_fm_set_element(fij_mat(ispin), iorb, iorb, occupation_numbers(iorb))
305 END DO
306 ! fij = U(T)*f*U
307 CALL parallel_gemm('N', 'N', norb, norb, norb, 1.0_dp, fij_mat(ispin), &
308 rotmat(ispin), 0.0_dp, smo)
309 CALL parallel_gemm('T', 'N', norb, norb, norb, 1.0_dp, rotmat(ispin), &
310 smo, 0.0_dp, fij_mat(ispin))
311 CALL cp_fm_release(smo)
312 END DO
313 END IF
314
315 ! localized orbitals in IAO basis => CIAO
316 ALLOCATE (ciao(nspin))
317 DO ispin = 1, nspin
318 CALL get_mo_set(mos_loc(ispin), mo_coeff=cloc)
319 CALL cp_fm_get_info(cloc, nrow_global=nao, ncol_global=norb)
320 CALL cp_fm_get_info(c_iao_coef(ispin), ncol_global=nref)
321 CALL cp_fm_create(smo, cloc%matrix_struct)
322 NULLIFY (fm_struct)
323 CALL cp_fm_struct_create(fm_struct, nrow_global=nref, &
324 template_fmstruct=cloc%matrix_struct)
325 CALL cp_fm_create(ciao(ispin), fm_struct)
326 CALL cp_fm_struct_release(fm_struct)
327 ! CIAO = A(T)*S*C
328 CALL cp_dbcsr_sm_fm_multiply(smat, cloc, smo, ncol=norb)
329 CALL parallel_gemm('T', 'N', nref, norb, nao, 1.0_dp, c_iao_coef(ispin), &
330 smo, 0.0_dp, ciao(ispin))
331 CALL cp_fm_release(smo)
332 END DO
333
334 ! Reference basis set
335 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
336 nkind = SIZE(qs_kind_set)
337 ALLOCATE (ref_basis_set_list(nkind))
338 DO ikind = 1, nkind
339 qs_kind => qs_kind_set(ikind)
340 NULLIFY (ref_basis_set_list(ikind)%gto_basis_set)
341 NULLIFY (refbasis)
342 CALL get_qs_kind(qs_kind=qs_kind, basis_set=refbasis, basis_type="MIN")
343 IF (ASSOCIATED(refbasis)) ref_basis_set_list(ikind)%gto_basis_set => refbasis
344 END DO
345 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, natom=natom)
346 ALLOCATE (refbas_blk_sizes(natom))
347 CALL get_particle_set(particle_set, qs_kind_set, nsgf=refbas_blk_sizes, &
348 basis=ref_basis_set_list)
349
350 ! Atomic orbital weights
351 ALLOCATE (orb_weight(nspin))
352 ALLOCATE (mcharge(natom, 1))
353 DO ispin = 1, nspin
354 CALL get_mo_set(mos_loc(ispin), mo_coeff=cloc)
355 NULLIFY (fm_struct)
356 CALL cp_fm_struct_create(fm_struct, nrow_global=natom, &
357 template_fmstruct=cloc%matrix_struct)
358 CALL cp_fm_create(orb_weight(ispin), fm_struct)
359 CALL cp_fm_struct_release(fm_struct)
360 CALL cp_fm_set_all(orb_weight(ispin), 0.0_dp)
361 END DO
362 !
363 CALL dbcsr_get_info(smat, distribution=dbcsr_dist)
364 CALL dbcsr_create(matrix=dmat, name="DMAT", &
365 dist=dbcsr_dist, matrix_type=dbcsr_type_symmetric, &
366 row_blk_size=refbas_blk_sizes, col_blk_size=refbas_blk_sizes, &
367 nze=0)
368 CALL dbcsr_reserve_diag_blocks(dmat)
369 !
370 NULLIFY (fm_struct)
371 CALL cp_fm_struct_create(fm_struct, ncol_global=1, &
372 template_fmstruct=ciao(1)%matrix_struct)
373 CALL cp_fm_create(cvec, fm_struct)
374 CALL cp_fm_create(cvec2, fm_struct)
375 CALL cp_fm_struct_release(fm_struct)
376 !
377 DO ispin = 1, nspin
378 CALL get_mo_set(mos_loc(ispin), &
379 mo_coeff=cloc, nmo=norb, &
380 occupation_numbers=occupation_numbers)
381 IF (uocc) THEN
382 ! uniform occupation
383 DO iorb = 1, norb
384 CALL cp_fm_to_fm(ciao(ispin), cvec, ncol=1, source_start=iorb, target_start=1)
385 focc = occupation_numbers(iorb)
386 CALL dbcsr_set(dmat, 0.0_dp)
387 CALL cp_dbcsr_plus_fm_fm_t(dmat, cvec, ncol=1, alpha=focc)
388 CALL iao_charges(dmat, mcharge(:, 1))
389 CALL cp_fm_set_submatrix(orb_weight(ispin), mcharge, start_row=1, &
390 start_col=iorb, n_rows=natom, n_cols=1)
391 checksum = sum(mcharge(:, 1))
392 IF (abs(focc - checksum) > 1.e-6_dp) THEN
393 CALL cp_warn(__location__, "Sum of atomic orbital weights is incorrect")
394 IF (unit_nr > 0) THEN
395 WRITE (unit=unit_nr, fmt="(T2,A,F10.6,T40,A,F10.6)") &
396 "Orbital occupation:", focc, &
397 "Sum of atomic orbital weights:", checksum
398 END IF
399 END IF
400 END DO
401 ELSE
402 ! non-diagonal occupation matrix
403 ALLOCATE (odiag(norb))
404 CALL cp_fm_get_diag(fij_mat(ispin), odiag)
405 DO iorb = 1, norb
406 IF (odiag(iorb) < 1.e-8_dp) cycle
407 CALL dbcsr_set(dmat, 0.0_dp)
408 CALL cp_fm_to_fm(ciao(ispin), cvec, ncol=1, source_start=iorb, target_start=1)
409 DO jorb = 1, norb
410 CALL cp_fm_get_element(fij_mat(ispin), iorb, jorb, focc)
411 IF (focc < 1.e-12_dp) cycle
412 CALL cp_fm_to_fm(ciao(ispin), cvec2, ncol=1, source_start=jorb, target_start=1)
413 CALL cp_dbcsr_plus_fm_fm_t(dmat, cvec, cvec2, 1, alpha=focc, symmetry_mode=1)
414 END DO
415 CALL iao_charges(dmat, mcharge(:, 1))
416 checksum = sum(mcharge(:, 1))
417 focc = odiag(iorb)
418 IF (abs(focc - checksum) > 1.e-6_dp) THEN
419 CALL cp_warn(__location__, "Sum of atomic orbital weights is incorrect")
420 IF (unit_nr > 0) THEN
421 WRITE (unit=unit_nr, fmt="(T2,A,F10.6,T40,A,F10.6)") &
422 "Orbital occupation:", focc, &
423 "Sum of atomic orbital weights:", checksum
424 END IF
425 END IF
426 mcharge(:, 1) = mcharge(:, 1)/focc
427 CALL cp_fm_set_submatrix(orb_weight(ispin), mcharge, start_row=1, &
428 start_col=iorb, n_rows=natom, n_cols=1)
429 END DO
430 DEALLOCATE (odiag)
431 END IF
432 END DO
433 DEALLOCATE (mcharge)
434 CALL dbcsr_release(dmat)
435 CALL cp_fm_release(cvec)
436 CALL cp_fm_release(cvec2)
437
438 ! energy arrays
439 ALLOCATE (atener(natom), ateks(natom), atecc(natom))
440 ALLOCATE (ate1xc(natom), ate1h(natom), atewald(natom))
441 atener = 0.0_dp
442 ateks = 0.0_dp
443 atecc = 0.0_dp
444 ate1xc = 0.0_dp
445 ate1h = 0.0_dp
446 atewald = 0.0_dp
447 IF (detailed_ener) THEN
448 ALLOCATE (atdet(natom, 10), atmul(natom, 10), amval(natom))
449 atdet = 0.0_dp
450 atmul = 0.0_dp
451 END IF
452 ! atom dependent density matrix
453 CALL dbcsr_create(dkmat, template=smat)
454 CALL dbcsr_copy(dkmat, smat)
455 CALL dbcsr_set(dkmat, 0.0_dp)
456 ! KS matrix + correction
457 CALL get_qs_env(qs_env, matrix_h=matrix_h, matrix_ks=matrix_ks, kinetic=matrix_t)
458 ALLOCATE (ks_mat(nspin), vhxc_mat(nspin), exc_mat(1))
459 DO ispin = 1, nspin
460 ALLOCATE (ks_mat(ispin)%matrix)
461 CALL dbcsr_create(ks_mat(ispin)%matrix, template=matrix_h(1)%matrix)
462 CALL dbcsr_copy(ks_mat(ispin)%matrix, matrix_h(1)%matrix)
463 CALL dbcsr_add(ks_mat(ispin)%matrix, matrix_ks(ispin)%matrix, 1.0_dp, 1.0_dp)
464 CALL dbcsr_scale(ks_mat(ispin)%matrix, 0.5_dp)
465 !
466 ALLOCATE (vhxc_mat(ispin)%matrix)
467 CALL dbcsr_create(vhxc_mat(ispin)%matrix, template=smat)
468 CALL dbcsr_copy(vhxc_mat(ispin)%matrix, smat)
469 CALL dbcsr_set(vhxc_mat(ispin)%matrix, 0.0_dp)
470 END DO
471 ALLOCATE (exc_mat(1)%matrix)
472 CALL dbcsr_create(exc_mat(1)%matrix, template=smat)
473 CALL dbcsr_copy(exc_mat(1)%matrix, smat)
474 CALL dbcsr_set(exc_mat(1)%matrix, 0.0_dp)
475 !
476 CALL vhxc_correction(qs_env, vhxc_mat, exc_mat, atecc, ate1xc, ate1h)
477 !
478 IF (ewald_correction) THEN
479 ALLOCATE (dve_mat%matrix)
480 CALL dbcsr_create(dve_mat%matrix, template=matrix_h(1)%matrix)
481 CALL dbcsr_copy(dve_mat%matrix, matrix_h(1)%matrix)
482 CALL dbcsr_set(dve_mat%matrix, 0.0_dp)
483 CALL vh_ewald_correction(qs_env, ealpha, dve_mat, atewald)
484 END IF
485 !
486 DO ispin = 1, nspin
487 CALL dbcsr_add(ks_mat(ispin)%matrix, vhxc_mat(ispin)%matrix, 1.0_dp, 1.0_dp)
488 END DO
489 !
490 IF (detailed_ener .AND. do_hfx) THEN
491 ALLOCATE (matrix_hfx(nspin))
492 DO ispin = 1, nspin
493 ALLOCATE (matrix_hfx(nspin)%matrix)
494 CALL dbcsr_create(matrix_hfx(ispin)%matrix, template=smat)
495 CALL dbcsr_copy(matrix_hfx(ispin)%matrix, smat)
496 CALL dbcsr_set(matrix_hfx(ispin)%matrix, 0.0_dp)
497 END DO
498 CALL get_hfx_ks_matrix(qs_env, matrix_hfx)
499 END IF
500 ! Loop over spins and atoms
501 DO ispin = 1, nspin
502 CALL get_mo_set(mos_loc(ispin), mo_coeff=cloc, nmo=norb)
503 ALLOCATE (mweight(1, norb))
504 DO iatom = 1, natom
505 CALL cp_fm_get_submatrix(orb_weight(ispin), mweight, start_row=iatom, &
506 start_col=1, n_rows=1, n_cols=norb)
507 IF (uocc) THEN
508 CALL iao_calculate_dmat(cloc, dkmat, mweight(1, :), .false.)
509 ELSE
510 CALL iao_calculate_dmat(cloc, dkmat, mweight(1, :), fij_mat(ispin))
511 END IF
512 CALL dbcsr_dot(dkmat, ks_mat(ispin)%matrix, ecc)
513 ateks(iatom) = ateks(iatom) + ecc
514 !
515 IF (detailed_ener) THEN
516 CALL dbcsr_dot(dkmat, matrix_t(1)%matrix, e1)
517 atdet(iatom, 1) = atdet(iatom, 1) + e1
518 CALL dbcsr_dot(dkmat, matrix_h(1)%matrix, e2)
519 atdet(iatom, 2) = atdet(iatom, 2) + (e2 - e1)
520 IF (do_hfx) THEN
521 CALL dbcsr_scale(matrix_hfx(ispin)%matrix, 0.5_dp)
522 CALL dbcsr_dot(dkmat, matrix_hfx(ispin)%matrix, ehfx)
523 atdet(iatom, 5) = atdet(iatom, 5) + ehfx
524 CALL dbcsr_scale(matrix_hfx(ispin)%matrix, 2.0_dp)
525 ELSE
526 ehfx = 0.0_dp
527 END IF
528 CALL dbcsr_dot(dkmat, exc_mat(1)%matrix, e1)
529 atdet(iatom, 3) = atdet(iatom, 3) + ecc - e2 - e1 - ehfx
530 atdet(iatom, 4) = atdet(iatom, 4) + e1
531 END IF
532 IF (ewald_correction) THEN
533 CALL dbcsr_dot(dkmat, dve_mat%matrix, ecc)
534 atewald(iatom) = atewald(iatom) + ecc
535 END IF
536 !
537 END DO
538 DEALLOCATE (mweight)
539 END DO
540 !
541 IF (detailed_ener) THEN
542 ! Mulliken
543 CALL get_qs_env(qs_env, rho=rho, para_env=para_env)
544 CALL qs_rho_get(rho, rho_ao=matrix_p)
545 ! kinetic energy
546 DO ispin = 1, nspin
547 CALL mulliken_charges(matrix_p(ispin)%matrix, matrix_t(1)%matrix, &
548 para_env, amval)
549 atmul(1:natom, 1) = atmul(1:natom, 1) + amval(1:natom)
550 CALL mulliken_charges(matrix_p(ispin)%matrix, matrix_h(1)%matrix, &
551 para_env, amval)
552 atmul(1:natom, 2) = atmul(1:natom, 2) + amval(1:natom)
553 atmul(1:natom, 3) = atmul(1:natom, 3) - amval(1:natom)
554 CALL mulliken_charges(matrix_p(ispin)%matrix, ks_mat(ispin)%matrix, &
555 para_env, amval)
556 atmul(1:natom, 3) = atmul(1:natom, 3) + amval(1:natom)
557 IF (do_hfx) THEN
558 CALL mulliken_charges(matrix_p(ispin)%matrix, matrix_hfx(ispin)%matrix, &
559 para_env, amval)
560 atmul(1:natom, 5) = atmul(1:natom, 5) + 0.5_dp*amval(1:natom)
561 atmul(1:natom, 3) = atmul(1:natom, 3) - 0.5_dp*amval(1:natom)
562 END IF
563 CALL mulliken_charges(matrix_p(ispin)%matrix, exc_mat(1)%matrix, &
564 para_env, amval)
565 atmul(1:natom, 4) = atmul(1:natom, 4) + amval(1:natom)
566 atmul(1:natom, 3) = atmul(1:natom, 3) - amval(1:natom)
567 END DO
568 atmul(1:natom, 2) = atmul(1:natom, 2) - atmul(1:natom, 1)
569 END IF
570 !
571 CALL dbcsr_release(dkmat)
572 DO ispin = 1, nspin
573 CALL dbcsr_release(ks_mat(ispin)%matrix)
574 CALL dbcsr_release(vhxc_mat(ispin)%matrix)
575 DEALLOCATE (ks_mat(ispin)%matrix, vhxc_mat(ispin)%matrix)
576 CALL deallocate_mo_set(mos_loc(ispin))
577 END DO
578 CALL dbcsr_release(exc_mat(1)%matrix)
579 DEALLOCATE (exc_mat(1)%matrix)
580 DEALLOCATE (ks_mat, vhxc_mat, exc_mat)
581 DEALLOCATE (mos_loc)
582 DEALLOCATE (refbas_blk_sizes)
583 DEALLOCATE (ref_basis_set_list)
584 IF (detailed_ener .AND. do_hfx) THEN
585 DO ispin = 1, nspin
586 CALL dbcsr_release(matrix_hfx(ispin)%matrix)
587 DEALLOCATE (matrix_hfx(ispin)%matrix)
588 END DO
589 DEALLOCATE (matrix_hfx)
590 END IF
591 IF (ewald_correction) THEN
592 CALL dbcsr_release(dve_mat%matrix)
593 DEALLOCATE (dve_mat%matrix)
594 END IF
595 CALL cp_fm_release(orb_weight)
596 CALL cp_fm_release(ciao)
597 CALL cp_fm_release(rotmat)
598 CALL cp_fm_release(c_iao_coef)
599 IF (.NOT. uocc) THEN
600 CALL cp_fm_release(fij_mat)
601 END IF
602
603 CALL get_qs_env(qs_env, para_env=para_env)
604 group = para_env
605 ! KS energy
606 atener(1:natom) = ateks(1:natom)
607 ! core energy corrections
608 CALL group%sum(atecc)
609 atener(1:natom) = atener(1:natom) + atecc(1:natom)
610 IF (detailed_ener) atdet(1:natom, 6) = atdet(1:natom, 6) + atecc(1:natom)
611 ! one center terms (GAPW)
612 CALL group%sum(ate1xc)
613 CALL group%sum(ate1h)
614 atener(1:natom) = atener(1:natom) + ate1xc(1:natom) + ate1h(1:natom)
615 IF (detailed_ener) THEN
616 IF (gapw .OR. gapw_xc) atdet(1:natom, 8) = atdet(1:natom, 8) + ate1xc(1:natom)
617 IF (gapw) atdet(1:natom, 9) = atdet(1:natom, 9) + ate1h(1:natom)
618 END IF
619 ! core correction
620 atecc(1:natom) = 0.0_dp
621 CALL calculate_ecore_overlap(qs_env, para_env, .false., atecc=atecc)
622 CALL group%sum(atecc)
623 atener(1:natom) = atener(1:natom) + atecc(1:natom)
624 IF (detailed_ener) atdet(1:natom, 7) = atdet(1:natom, 7) + atecc(1:natom)
625 IF (ewald_correction) THEN
626 atewald(1:natom) = atewald(1:natom) - atecc(1:natom)
627 END IF
628 ! e self
629 atecc(1:natom) = 0.0_dp
630 CALL calculate_ecore_self(qs_env, atecc=atecc)
631 CALL group%sum(atecc)
632 atener(1:natom) = atener(1:natom) + atecc(1:natom)
633 IF (detailed_ener) atdet(1:natom, 7) = atdet(1:natom, 7) + atecc(1:natom)
634 IF (ewald_correction) THEN
635 atewald(1:natom) = atewald(1:natom) - atecc(1:natom)
636 CALL calculate_ecore_alpha(qs_env, ealpha, atewald)
637 END IF
638 ! vdW pair-potentials
639 atecc(1:natom) = 0.0_dp
640 CALL get_qs_env(qs_env=qs_env, dispersion_env=dispersion_env)
641 CALL calculate_dispersion_pairpot(qs_env, dispersion_env, evdw, .false., atevdw=atecc)
642 ! Pair potential gCP energy
643 CALL get_qs_env(qs_env=qs_env, gcp_env=gcp_env)
644 IF (ASSOCIATED(gcp_env)) THEN
645 CALL calculate_gcp_pairpot(qs_env, gcp_env, egcp, .false., ategcp=atecc)
646 END IF
647 CALL group%sum(atecc)
648 atener(1:natom) = atener(1:natom) + atecc(1:natom)
649 IF (detailed_ener) atdet(1:natom, 10) = atdet(1:natom, 10) + atecc(1:natom)
650 ! distribute the entropic energy
651 CALL get_qs_env(qs_env, energy=energy)
652 ekts = energy%kts/real(natom, kind=dp)
653 atener(1:natom) = atener(1:natom) + ekts
654
655 IF (detailed_ener) THEN
656 IF (unit_nr > 0) THEN
657 WRITE (unit_nr, fmt="(/,T2,A)") "Detailed IAO Atomic Energy Components "
658 CALL write_atdet(unit_nr, atdet(:, 1), "Kinetic Energy")
659 CALL write_atdet(unit_nr, atdet(:, 2), "Short-Range Core and/or PP Energy")
660 CALL write_atdet(unit_nr, atdet(:, 3), "Hartree Energy (long-ranged part)")
661 CALL write_atdet(unit_nr, atdet(:, 5), "Exact Exchange Energy")
662 CALL write_atdet(unit_nr, atdet(:, 4), "Exchange-Correlation Energy")
663 CALL write_atdet(unit_nr, atdet(:, 6), "Atomic Core Hartree: Int(nc V(n+nc) dx")
664 CALL write_atdet(unit_nr, atdet(:, 7), "Core Self Energy Corrections")
665 IF (gapw) THEN
666 CALL write_atdet(unit_nr, atdet(:, 9), "GAPW: 1-center Hartree Energy")
667 END IF
668 IF (gapw .OR. gapw_xc) THEN
669 CALL write_atdet(unit_nr, atdet(:, 8), "GAPW: 1-center XC Energy")
670 END IF
671 IF (abs(evdw) > 1.e-14_dp) THEN
672 CALL write_atdet(unit_nr, atdet(:, 10), "vdW Pairpotential Energy")
673 END IF
674 DO iatom = 1, natom
675 atecc(iatom) = sum(atdet(iatom, 1:10)) - atener(iatom)
676 END DO
677 CALL write_atdet(unit_nr, atecc(:), "Missing Energy")
678 !
679 WRITE (unit_nr, fmt="(/,T2,A)") "Detailed Mulliken Atomic Energy Components "
680 CALL write_atdet(unit_nr, atmul(:, 1), "Kinetic Energy")
681 CALL write_atdet(unit_nr, atmul(:, 2), "Short-Range Core and/or PP Energy")
682 CALL write_atdet(unit_nr, atmul(:, 3), "Hartree Energy (long-ranged part)")
683 CALL write_atdet(unit_nr, atmul(:, 5), "Exact Exchange Energy")
684 CALL write_atdet(unit_nr, atmul(:, 4), "Exchange-Correlation Energy")
685 CALL write_atdet(unit_nr, atdet(:, 6), "Atomic Core Hartree: Int(nc V(n+nc) dx")
686 CALL write_atdet(unit_nr, atdet(:, 7), "Core Self Energy Corrections")
687 IF (gapw) THEN
688 CALL write_atdet(unit_nr, atdet(:, 9), "GAPW: 1-center Hartree Energy")
689 END IF
690 IF (gapw .OR. gapw_xc) THEN
691 CALL write_atdet(unit_nr, atdet(:, 8), "GAPW: 1-center XC Energy")
692 END IF
693 IF (abs(evdw) > 1.e-14_dp) THEN
694 CALL write_atdet(unit_nr, atdet(:, 10), "vdW Pairpotential Energy")
695 END IF
696 END IF
697 END IF
698
699 IF (unit_nr > 0) THEN
700 e_pot = energy%total
701 ateps = 1.e-6_dp
702 CALL write_atener(unit_nr, particle_set, atener, "Atomic Energy Decomposition")
703 sum_energy = sum(atener(:))
704 checksum = abs(e_pot - sum_energy)
705 WRITE (unit=unit_nr, fmt="((T2,A,T56,F25.13))") &
706 "Potential energy (Atomic):", sum_energy, &
707 "Potential energy (Total) :", e_pot, &
708 "Difference :", checksum
709 cpassert((checksum < ateps*abs(e_pot)))
710 !
711 IF (ewald_correction) THEN
712 WRITE (unit=unit_nr, fmt="(/,(T2,A,F10.3,A))") "Universal Ewald Parameter: ", ealpha, " [Angstrom]"
713 CALL write_atener(unit_nr, particle_set, atewald, "Change in Atomic Energy Decomposition")
714 sum_energy = sum(atewald(:))
715 WRITE (unit=unit_nr, fmt="((T2,A,T56,F25.13))") &
716 "Total Change in Potential energy:", sum_energy
717 END IF
718 END IF
719
720 IF (detailed_ener) THEN
721 DEALLOCATE (atdet, atmul, amval)
722 END IF
723
724 IF (unit_nr > 0) THEN
725 WRITE (unit=unit_nr, fmt="(/,T2,A)") &
726 "!--------------------------- END OF ED ANALYSIS ------------------------------!"
727 END IF
728 DEALLOCATE (bcenter)
729 DEALLOCATE (atener, ateks, atecc, ate1xc, ate1h, atewald)
730
731 CALL timestop(handle)
732
733 END SUBROUTINE edmf_analysis
734
735! **************************************************************************************************
736!> \brief ...
737!> \param qs_env ...
738!> \param vhxc_mat ...
739!> \param exc_mat ...
740!> \param atecc ...
741!> \param ate1xc ...
742!> \param ate1h ...
743! **************************************************************************************************
744 SUBROUTINE vhxc_correction(qs_env, vhxc_mat, exc_mat, atecc, ate1xc, ate1h)
745 TYPE(qs_environment_type), POINTER :: qs_env
746 TYPE(dbcsr_p_type), DIMENSION(:) :: vhxc_mat, exc_mat
747 REAL(kind=dp), DIMENSION(:), INTENT(INOUT) :: atecc, ate1xc, ate1h
748
749 CHARACTER(len=*), PARAMETER :: routinen = 'vhxc_correction'
750
751 INTEGER :: handle, iatom, ispin, natom, nspins
752 LOGICAL :: do_admm_corr, gapw, gapw_xc
753 REAL(kind=dp) :: eh1, exc1
754 TYPE(admm_type), POINTER :: admm_env
755 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
756 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_p
757 TYPE(dft_control_type), POINTER :: dft_control
758 TYPE(ecoul_1center_type), DIMENSION(:), POINTER :: ecoul_1c
759 TYPE(local_rho_type), POINTER :: local_rho_set
760 TYPE(mp_para_env_type), POINTER :: para_env
761 TYPE(pw_env_type), POINTER :: pw_env
762 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
763 TYPE(pw_r3d_rs_type) :: xc_den
764 TYPE(pw_r3d_rs_type), ALLOCATABLE, DIMENSION(:) :: vtau, vxc
765 TYPE(pw_r3d_rs_type), POINTER :: v_hartree_rspace
766 TYPE(qs_dispersion_type), POINTER :: dispersion_env
767 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
768 TYPE(qs_ks_env_type), POINTER :: ks_env
769 TYPE(qs_rho_type), POINTER :: rho_struct
770 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom_set
771 TYPE(section_vals_type), POINTER :: xc_fun_section, xc_section
772 TYPE(xc_rho_cflags_type) :: needs
773
774 CALL timeset(routinen, handle)
775
776 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control, pw_env=pw_env)
777
778 nspins = dft_control%nspins
779 gapw = dft_control%qs_control%gapw
780 gapw_xc = dft_control%qs_control%gapw_xc
781 do_admm_corr = .false.
782 IF (dft_control%do_admm) THEN
783 IF (qs_env%admm_env%aux_exch_func /= do_admm_aux_exch_func_none) do_admm_corr = .true.
784 END IF
785 IF (do_admm_corr) THEN
786 CALL get_qs_env(qs_env, admm_env=admm_env)
787 xc_section => admm_env%xc_section_aux
788 ELSE
789 xc_section => section_vals_get_subs_vals(qs_env%input, "DFT%XC")
790 END IF
791 xc_fun_section => section_vals_get_subs_vals(xc_section, "XC_FUNCTIONAL")
792 needs = xc_functionals_get_needs(xc_fun_section, (nspins == 2), .true.)
793
794 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
795 CALL auxbas_pw_pool%create_pw(xc_den)
796 ALLOCATE (vxc(nspins))
797 DO ispin = 1, nspins
798 CALL auxbas_pw_pool%create_pw(vxc(ispin))
799 END DO
800 IF (needs%tau .OR. needs%tau_spin) THEN
801 ALLOCATE (vtau(nspins))
802 DO ispin = 1, nspins
803 CALL auxbas_pw_pool%create_pw(vtau(ispin))
804 END DO
805 END IF
806
807 ! Nuclear charge correction
808 CALL get_qs_env(qs_env, v_hartree_rspace=v_hartree_rspace)
809 CALL integrate_v_core_rspace(v_hartree_rspace, qs_env, atecc=atecc)
810 IF (gapw .OR. gapw_xc) THEN
811 CALL get_qs_env(qs_env=qs_env, local_rho_set=local_rho_set, &
812 rho_atom_set=rho_atom_set, ecoul_1c=ecoul_1c, &
813 natom=natom, para_env=para_env)
814 CALL zero_rho_atom_integrals(rho_atom_set)
815 CALL calculate_vxc_atom(qs_env, .false., exc1)
816 IF (gapw) THEN
817 CALL vh_1c_gg_integrals(qs_env, eh1, ecoul_1c, local_rho_set, para_env, tddft=.false.)
818 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
819 CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace, para_env, calculate_forces=.false., &
820 local_rho_set=local_rho_set, atener=atecc)
821 END IF
822 END IF
823
824 IF (gapw_xc) THEN
825 CALL get_qs_env(qs_env, rho_xc=rho_struct, dispersion_env=dispersion_env)
826 ELSE
827 CALL get_qs_env(qs_env, rho=rho_struct, dispersion_env=dispersion_env)
828 END IF
829 !
830 cpassert(.NOT. do_admm_corr)
831 !
832 IF (needs%tau .OR. needs%tau_spin) THEN
833 CALL qs_xc_density(ks_env, rho_struct, xc_section, dispersion_env=dispersion_env, &
834 xc_den=xc_den, vxc=vxc, vtau=vtau)
835 ELSE
836 CALL qs_xc_density(ks_env, rho_struct, xc_section, dispersion_env=dispersion_env, &
837 xc_den=xc_den, vxc=vxc)
838 END IF
839 DO ispin = 1, nspins
840 CALL pw_scale(vxc(ispin), -0.5_dp)
841 CALL pw_axpy(xc_den, vxc(ispin))
842 CALL pw_scale(vxc(ispin), vxc(ispin)%pw_grid%dvol)
843 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=vxc(ispin), &
844 hmat=vhxc_mat(ispin), calculate_forces=.false., &
845 gapw=(gapw .OR. gapw_xc))
846 IF (needs%tau .OR. needs%tau_spin) THEN
847 CALL pw_scale(vtau(ispin), -0.5_dp*vtau(ispin)%pw_grid%dvol)
848 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=vtau(ispin), &
849 hmat=vhxc_mat(ispin), calculate_forces=.false., &
850 compute_tau=.true., gapw=(gapw .OR. gapw_xc))
851 END IF
852 END DO
853 CALL pw_scale(xc_den, xc_den%pw_grid%dvol)
854 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=xc_den, &
855 hmat=exc_mat(1), calculate_forces=.false., &
856 gapw=(gapw .OR. gapw_xc))
857
858 IF (gapw .OR. gapw_xc) THEN
859 ! remove one-center potential matrix part
860 CALL qs_rho_get(rho_struct, rho_ao_kp=matrix_p)
861 CALL update_ks_atom(qs_env, vhxc_mat, matrix_p, forces=.false., kscale=-0.5_dp)
862 !
863 DO iatom = 1, natom
864 ate1xc(iatom) = ate1xc(iatom) + &
865 rho_atom_set(iatom)%exc_h - rho_atom_set(iatom)%exc_s
866 END DO
867 IF (gapw) THEN
868 DO iatom = 1, natom
869 ate1h(iatom) = ate1h(iatom) + &
870 ecoul_1c(iatom)%ecoul_1_h - ecoul_1c(iatom)%ecoul_1_s + &
871 ecoul_1c(iatom)%ecoul_1_z - ecoul_1c(iatom)%ecoul_1_0
872 END DO
873 END IF
874 END IF
875
876 CALL auxbas_pw_pool%give_back_pw(xc_den)
877 DO ispin = 1, nspins
878 CALL auxbas_pw_pool%give_back_pw(vxc(ispin))
879 END DO
880 IF (needs%tau .OR. needs%tau_spin) THEN
881 DO ispin = 1, nspins
882 CALL auxbas_pw_pool%give_back_pw(vtau(ispin))
883 END DO
884 END IF
885
886 CALL timestop(handle)
887
888 END SUBROUTINE vhxc_correction
889
890! **************************************************************************************************
891!> \brief ...
892!> \param qs_env ...
893!> \param ealpha ...
894!> \param vh_mat ...
895!> \param atewd ...
896! **************************************************************************************************
897 SUBROUTINE vh_ewald_correction(qs_env, ealpha, vh_mat, atewd)
898 TYPE(qs_environment_type), POINTER :: qs_env
899 REAL(kind=dp), INTENT(IN) :: ealpha
900 TYPE(dbcsr_p_type) :: vh_mat
901 REAL(kind=dp), DIMENSION(:), INTENT(INOUT) :: atewd
902
903 CHARACTER(len=*), PARAMETER :: routinen = 'vh_ewald_correction'
904
905 INTEGER :: handle, ikind, ispin, natom, nkind
906 REAL(kind=dp) :: eps_core_charge, rhotot, zeff
907 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: alpha, atecc, ccore
908 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
909 TYPE(dft_control_type), POINTER :: dft_control
910 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
911 POINTER :: sab_orb, sac_ae
912 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
913 TYPE(pw_c1d_gs_type) :: rho_tot_ewd_g, v_hewd_gspace
914 TYPE(pw_env_type), POINTER :: pw_env
915 TYPE(pw_poisson_type), POINTER :: poisson_env
916 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
917 TYPE(pw_r3d_rs_type) :: rho_tot_ewd_r, v_hewd_rspace
918 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r
919 TYPE(pw_r3d_rs_type), POINTER :: v_hartree_rspace
920 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
921 TYPE(qs_rho_type), POINTER :: rho
922
923 CALL timeset(routinen, handle)
924
925 natom = SIZE(atewd)
926 ALLOCATE (atecc(natom))
927 CALL get_qs_env(qs_env=qs_env, nkind=nkind, qs_kind_set=qs_kind_set, &
928 dft_control=dft_control)
929 ALLOCATE (alpha(nkind), ccore(nkind))
930 DO ikind = 1, nkind
931 CALL get_qs_kind(qs_kind_set(ikind), zeff=zeff)
932 alpha(ikind) = ealpha
933 ccore(ikind) = zeff*(ealpha/pi)**1.5_dp
934 END DO
935 !
936 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
937 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
938 poisson_env=poisson_env)
939 !
940 CALL auxbas_pw_pool%create_pw(v_hewd_gspace)
941 CALL auxbas_pw_pool%create_pw(v_hewd_rspace)
942 CALL auxbas_pw_pool%create_pw(rho_tot_ewd_g)
943 CALL auxbas_pw_pool%create_pw(rho_tot_ewd_r)
944 rhotot = 0.0_dp
945 CALL calculate_rho_core(rho_tot_ewd_r, rhotot, qs_env, calpha=alpha, ccore=ccore)
946 ! Get the total density in g-space [ions + electrons]
947 CALL get_qs_env(qs_env=qs_env, rho=rho)
948 CALL qs_rho_get(rho, rho_r=rho_r)
949 DO ispin = 1, dft_control%nspins
950 CALL pw_axpy(rho_r(ispin), rho_tot_ewd_r)
951 END DO
952 CALL pw_transfer(rho_tot_ewd_r, rho_tot_ewd_g)
953 !
954 CALL pw_poisson_solve(poisson_env, density=rho_tot_ewd_g, vhartree=v_hewd_gspace)
955 CALL pw_transfer(v_hewd_gspace, v_hewd_rspace)
956 CALL pw_scale(v_hewd_rspace, v_hewd_rspace%pw_grid%dvol)
957 atecc = 0.0_dp
958 CALL integrate_v_gaussian_rspace(v_hewd_rspace, qs_env, alpha, ccore, atecc)
959 atewd(1:natom) = atewd(1:natom) + atecc(1:natom)
960 !
961 atecc = 0.0_dp
962 CALL get_qs_env(qs_env, v_hartree_rspace=v_hartree_rspace)
963 CALL integrate_v_core_rspace(v_hartree_rspace, qs_env, atecc=atecc)
964 atewd(1:natom) = atewd(1:natom) - atecc(1:natom)
965 !
966 CALL pw_axpy(v_hartree_rspace, v_hewd_rspace, -1.0_dp)
967 CALL dbcsr_set(vh_mat%matrix, 0.0_dp)
968 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_hewd_rspace, hmat=vh_mat, &
969 calculate_forces=.false.)
970 !
971 CALL dbcsr_scale(vh_mat%matrix, 0.5_dp)
972 !
973 ! delta erfc
974 eps_core_charge = dft_control%qs_control%eps_core_charge
975 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, &
976 particle_set=particle_set, sab_orb=sab_orb, sac_ppl=sac_ae)
977 CALL build_erfc(vh_mat, qs_kind_set, atomic_kind_set, particle_set, &
978 alpha, ccore, eps_core_charge, sab_orb, sac_ae)
979 CALL dbcsr_scale(vh_mat%matrix, -1.0_dp)
980 DO ikind = 1, nkind
981 CALL get_qs_kind(qs_kind_set(ikind), alpha_core_charge=alpha(ikind), &
982 ccore_charge=ccore(ikind))
983 END DO
984 CALL build_erfc(vh_mat, qs_kind_set, atomic_kind_set, particle_set, &
985 alpha, ccore, eps_core_charge, sab_orb, sac_ae)
986 CALL dbcsr_scale(vh_mat%matrix, -1.0_dp)
987 !
988 CALL auxbas_pw_pool%give_back_pw(v_hewd_gspace)
989 CALL auxbas_pw_pool%give_back_pw(v_hewd_rspace)
990 CALL auxbas_pw_pool%give_back_pw(rho_tot_ewd_g)
991 CALL auxbas_pw_pool%give_back_pw(rho_tot_ewd_r)
992 DEALLOCATE (atecc)
993 DEALLOCATE (alpha, ccore)
994
995 CALL timestop(handle)
996
997 END SUBROUTINE vh_ewald_correction
998
999! **************************************************************************************************
1000!> \brief ...
1001!> \param qs_env ...
1002!> \param matrix_hfx ...
1003! **************************************************************************************************
1004 SUBROUTINE get_hfx_ks_matrix(qs_env, matrix_hfx)
1005 TYPE(qs_environment_type), POINTER :: qs_env
1006 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_hfx
1007
1008 CHARACTER(len=*), PARAMETER :: routinen = 'get_hfx_ks_matrix'
1009
1010 INTEGER :: handle
1011 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p
1012 TYPE(qs_rho_type), POINTER :: rho
1013
1014 CALL timeset(routinen, handle)
1015
1016 CALL get_qs_env(qs_env, rho=rho)
1017 CALL qs_rho_get(rho, rho_ao=matrix_p)
1018 CALL tddft_hfx_matrix(matrix_hfx, matrix_p, qs_env, update_energy=.false., &
1019 recalc_integrals=.false.)
1020
1021 CALL timestop(handle)
1022
1023 END SUBROUTINE get_hfx_ks_matrix
1024! **************************************************************************************************
1025!> \brief Write the atomic coordinates, types, and energies
1026!> \param iounit ...
1027!> \param particle_set ...
1028!> \param atener ...
1029!> \param label ...
1030!> \date 05.06.2023
1031!> \author JGH
1032!> \version 1.0
1033! **************************************************************************************************
1034 SUBROUTINE write_atener(iounit, particle_set, atener, label)
1035
1036 INTEGER, INTENT(IN) :: iounit
1037 TYPE(particle_type), DIMENSION(:) :: particle_set
1038 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: atener
1039 CHARACTER(LEN=*), INTENT(IN) :: label
1040
1041 INTEGER :: i, natom
1042
1043 IF (iounit > 0) THEN
1044 WRITE (unit=iounit, fmt="(/,T2,A)") trim(label)
1045 WRITE (unit=iounit, fmt="(T4,A,T30,A,T42,A,T54,A,T69,A)") &
1046 "Atom Element", "X", "Y", "Z", "Energy[a.u.]"
1047 natom = SIZE(atener)
1048 DO i = 1, natom
1049 WRITE (unit=iounit, fmt="(I6,T12,A2,T24,3F12.6,F21.10)") i, &
1050 trim(adjustl(particle_set(i)%atomic_kind%element_symbol)), &
1051 particle_set(i)%r(1:3)*angstrom, atener(i)
1052 END DO
1053 WRITE (unit=iounit, fmt="(A)") ""
1054 END IF
1055
1056 END SUBROUTINE write_atener
1057
1058! **************************************************************************************************
1059!> \brief Write the one component of atomic energies
1060!> \param iounit ...
1061!> \param atener ...
1062!> \param label ...
1063!> \date 18.08.2023
1064!> \author JGH
1065!> \version 1.0
1066! **************************************************************************************************
1067 SUBROUTINE write_atdet(iounit, atener, label)
1068 INTEGER, INTENT(IN) :: iounit
1069 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: atener
1070 CHARACTER(LEN=*), INTENT(IN) :: label
1071
1072 INTEGER :: natom
1073
1074 IF (iounit > 0) THEN
1075 natom = SIZE(atener)
1076 WRITE (unit=iounit, fmt="(T2,A)") trim(label)
1077 WRITE (unit=iounit, fmt="(5G16.8)") atener(1:natom)
1078 END IF
1079
1080 END SUBROUTINE write_atdet
1081
1082END 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, qs_kind_set, atomic_kind_set, particle_set, calpha, ccore, eps_core_charge, sab_orb, sac_ae)
Integrals = -Z*erfc(a*r)/r.
Definition core_ae.F:586
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
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)
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 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_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, rhs)
Get the QUICKSTEP environment.
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, 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_r3d_rs_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_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)
...
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:87
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...