(git:33f85d8)
Loading...
Searching...
No Matches
qs_scf_post_se.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 Does all kind of post scf calculations for semi-empirical
10!> \par History
11!> Started printing preliminary stuff for MO_CUBES and MO requires some
12!> more work to complete all other functionalities
13!> - Revise MO information printout (10.05.2021, MK)
14!> \author Teodoro Laino (07.2008)
15! **************************************************************************************************
17
18 USE ai_moments, ONLY: moment
22 USE cell_types, ONLY: cell_type,&
23 pbc
31 USE cp_output_handling, ONLY: cp_p_file,&
38 USE eeq_method, ONLY: eeq_print
44 USE kinds, ONLY: default_string_length,&
45 dp
46 USE mathconstants, ONLY: twopi
49 USE orbital_pointers, ONLY: coset,&
50 ncoset
53 USE physcon, ONLY: debye
56 USE qs_kind_types, ONLY: get_qs_kind,&
60 USE qs_rho_types, ONLY: qs_rho_get,&
68#include "./base/base_uses.f90"
69
70 IMPLICIT NONE
71 PRIVATE
72
73 ! Global parameters
74 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_post_se'
76
77CONTAINS
78
79! **************************************************************************************************
80!> \brief collects possible post - scf calculations and prints info / computes properties.
81!> specific for Semi-empirical calculations
82!> \param qs_env the qs_env in which the qs_env lives
83!> \par History
84!> 07.2008 created [tlaino] - Split from qs_scf_post (general)
85!> \author tlaino
86!> \note
87!> this function changes mo_eigenvectors and mo_eigenvalues, depending on the print keys.
88!> In particular, MO_CUBES causes the MOs to be rotated to make them eigenstates of the KS
89!> matrix, and mo_eigenvalues is updated accordingly. This can, for unconverged wavefunctions,
90!> change afterwards slightly the forces (hence small numerical differences between MD
91!> with and without the debug print level). Ideally this should not happen...
92! **************************************************************************************************
93 SUBROUTINE scf_post_calculation_se(qs_env)
94
95 TYPE(qs_environment_type), POINTER :: qs_env
96
97 CHARACTER(len=*), PARAMETER :: routinen = 'scf_post_calculation_se'
98
99 INTEGER :: handle, output_unit
100 LOGICAL :: explicit, my_localized_wfn
101 TYPE(cp_logger_type), POINTER :: logger
102 TYPE(mp_para_env_type), POINTER :: para_env
103 TYPE(particle_list_type), POINTER :: particles
104 TYPE(qs_rho_type), POINTER :: rho
105 TYPE(qs_subsys_type), POINTER :: subsys
106 TYPE(section_vals_type), POINTER :: input, print_key, wfn_mix_section
107
108 CALL timeset(routinen, handle)
109
110 ! Writes the data that is already available in qs_env
111 CALL write_available_results(qs_env)
112
113 my_localized_wfn = .false.
114 NULLIFY (rho, subsys, particles, input, print_key, para_env)
115
116 logger => cp_get_default_logger()
117 output_unit = cp_logger_get_default_io_unit(logger)
118
119 cpassert(ASSOCIATED(qs_env))
120 ! Here we start with data that needs a postprocessing...
121 CALL get_qs_env(qs_env, &
122 rho=rho, &
123 input=input, &
124 subsys=subsys, &
125 para_env=para_env)
126 CALL qs_subsys_get(subsys, particles=particles)
127
128 ! Compute Atomic Charges
129 CALL qs_scf_post_charges(input, logger, qs_env, rho, para_env)
130
131 ! Moments of charge distribution
132 CALL qs_scf_post_moments(input, logger, qs_env)
133
134 ! MO_CUBES
135 print_key => section_vals_get_subs_vals(section_vals=input, &
136 subsection_name="DFT%PRINT%MO_CUBES")
137 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
138 cpwarn("Printing of MO cube files not implemented for Semi-Empirical method.")
139 END IF
140
141 ! STM
142 print_key => section_vals_get_subs_vals(section_vals=input, &
143 subsection_name="DFT%PRINT%STM")
144 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
145 cpwarn("STM not implemented for Semi-Empirical method.")
146 END IF
147
148 ! DFT+U
149 print_key => section_vals_get_subs_vals(section_vals=input, &
150 subsection_name="DFT%PRINT%PLUS_U")
151 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
152 cpwarn("DFT+U not available for Semi-Empirical method.")
153 END IF
154
155 ! Kinetic Energy
156 print_key => section_vals_get_subs_vals(section_vals=input, &
157 subsection_name="DFT%PRINT%KINETIC_ENERGY")
158 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
159 cpwarn("Kinetic energy not available for Semi-Empirical method.")
160 END IF
161
162 ! Wavefunction mixing
163 wfn_mix_section => section_vals_get_subs_vals(input, "DFT%PRINT%WFN_MIX")
164 CALL section_vals_get(wfn_mix_section, explicit=explicit)
165 IF (explicit .AND. .NOT. qs_env%run_rtp) THEN
166 cpwarn("Wavefunction mixing not implemented for Semi-Empirical method.")
167 END IF
168
169 ! Print coherent X-ray diffraction spectrum
170 print_key => section_vals_get_subs_vals(section_vals=input, &
171 subsection_name="DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
172 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
173 cpwarn("XRAY_DIFFRACTION_SPECTRUM not implemented for Semi-Empirical calculations!")
174 END IF
175
176 ! Calculation of Electric Field Gradients
177 print_key => section_vals_get_subs_vals(section_vals=input, &
178 subsection_name="DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
179 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
180 cpwarn("ELECTRIC_FIELD_GRADIENT not implemented for Semi-Empirical calculations!")
181 END IF
182
183 ! Calculation of EPR Hyperfine Coupling Tensors
184 print_key => section_vals_get_subs_vals(section_vals=input, &
185 subsection_name="DFT%PRINT%HYPERFINE_COUPLING_TENSOR")
186 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), &
187 cp_p_file)) THEN
188 cpwarn("HYPERFINE_COUPLING_TENSOR not implemented for Semi-Empirical calculations!")
189 END IF
190
191 CALL timestop(handle)
192
193 END SUBROUTINE scf_post_calculation_se
194
195! **************************************************************************************************
196!> \brief Computes and prints electric dipole moments
197!> We use the approximation for NDDO from
198!> Pople and Beveridge, Approximate Molecular Orbital Theory,
199!> Mc Graw Hill 1970
200!> mu = \sum_A [ Q_A * R_a + Tr(P_A*D_A) ]
201!> \param input ...
202!> \param logger ...
203!> \param qs_env the qs_env in which the qs_env lives
204! **************************************************************************************************
205 SUBROUTINE qs_scf_post_moments(input, logger, qs_env)
206 TYPE(section_vals_type), POINTER :: input
207 TYPE(cp_logger_type), POINTER :: logger
208 TYPE(qs_environment_type), POINTER :: qs_env
209
210 CHARACTER(LEN=default_string_length) :: description, dipole_type
211 COMPLEX(KIND=dp) :: dzeta, zeta
212 COMPLEX(KIND=dp), DIMENSION(3) :: dggamma, dzphase, ggamma, zphase
213 INTEGER :: i, iat, iatom, ikind, ix, j, nat, natom, &
214 natorb, nkind, nspin, reference, &
215 unit_nr
216 LOGICAL :: do_berry, found
217 REAL(kind=dp) :: charge_tot, ci(3), dci(3), dipole(3), dipole_deriv(3), drcc(3), dria(3), &
218 dtheta, gvec(3), q, rcc(3), ria(3), tcharge(2), theta, tmp(3), via(3), zeff
219 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: ncharge
220 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: mom
221 REAL(kind=dp), DIMENSION(:), POINTER :: ref_point
222 REAL(kind=dp), DIMENSION(:, :), POINTER :: pblock
223 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
224 TYPE(cell_type), POINTER :: cell
225 TYPE(cp_result_type), POINTER :: results
226 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p
227 TYPE(dft_control_type), POINTER :: dft_control
228 TYPE(gto_basis_set_type), POINTER :: basis_set
229 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
230 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
231 TYPE(qs_rho_type), POINTER :: rho
232 TYPE(section_vals_type), POINTER :: print_key
233 TYPE(semi_empirical_type), POINTER :: se_kind
234
235 NULLIFY (results)
236 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%MOMENTS")
237 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
238 ! Dipole Moments
239 unit_nr = cp_print_key_unit_nr(logger, input, "DFT%PRINT%MOMENTS", &
240 extension=".data", middle_name="se_dipole", log_filename=.false.)
241
242 ! Reference point
243 reference = section_get_ival(print_key, keyword_name="REFERENCE")
244 NULLIFY (ref_point)
245 description = '[DIPOLE]'
246 CALL section_vals_val_get(print_key, "REF_POINT", r_vals=ref_point)
247 CALL section_vals_val_get(print_key, "PERIODIC", l_val=do_berry)
248 CALL get_reference_point(rcc, drcc, qs_env=qs_env, reference=reference, &
249 ref_point=ref_point)
250 !
251 NULLIFY (particle_set)
252 CALL get_qs_env(qs_env=qs_env, &
253 rho=rho, &
254 cell=cell, &
255 atomic_kind_set=atomic_kind_set, &
256 natom=natom, &
257 qs_kind_set=qs_kind_set, &
258 particle_set=particle_set, &
259 results=results, &
260 dft_control=dft_control)
261
262 CALL qs_rho_get(rho, rho_ao=matrix_p)
263 nspin = SIZE(matrix_p)
264 nkind = SIZE(atomic_kind_set)
265 ! net charges
266 ALLOCATE (ncharge(natom))
267 ncharge = 0.0_dp
268 DO ikind = 1, nkind
269 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
270 CALL get_qs_kind(qs_kind_set(ikind), se_parameter=se_kind)
271 CALL get_se_param(se_kind, zeff=zeff, natorb=natorb)
272 DO iatom = 1, nat
273 iat = atomic_kind_set(ikind)%atom_list(iatom)
274 tcharge = 0.0_dp
275 DO i = 1, nspin
276 CALL dbcsr_get_block_p(matrix=matrix_p(i)%matrix, row=iat, col=iat, &
277 block=pblock, found=found)
278 IF (found) THEN
279 DO j = 1, natorb
280 tcharge(i) = tcharge(i) + pblock(j, j)
281 END DO
282 END IF
283 END DO
284 ncharge(iat) = zeff - sum(tcharge)
285 END DO
286 END DO
287 ! Contributions from net atomic charges
288 ! Dipole deriv will be the derivative of the Dipole(dM/dt=\sum e_j v_j)
289 dipole_deriv = 0.0_dp
290 dipole = 0.0_dp
291 IF (do_berry) THEN
292 dipole_type = "periodic (Berry phase)"
293 rcc = pbc(rcc, cell)
294 charge_tot = 0._dp
295 charge_tot = sum(ncharge)
296 ria = twopi*matmul(cell%h_inv, rcc)
297 zphase = cmplx(cos(ria), sin(ria), dp)**charge_tot
298
299 dria = twopi*matmul(cell%h_inv, drcc)
300 dzphase = charge_tot*cmplx(-sin(ria), cos(ria), dp)**(charge_tot - 1.0_dp)*dria
301
302 ggamma = cmplx(1.0_dp, 0.0_dp, kind=dp)
303 dggamma = cmplx(0.0_dp, 0.0_dp, kind=dp)
304 DO ikind = 1, SIZE(atomic_kind_set)
305 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
306 DO i = 1, nat
307 iat = atomic_kind_set(ikind)%atom_list(i)
308 ria = particle_set(iat)%r(:)
309 ria = pbc(ria, cell)
310 via = particle_set(iat)%v(:)
311 q = ncharge(iat)
312 DO j = 1, 3
313 gvec = twopi*cell%h_inv(j, :)
314 theta = sum(ria(:)*gvec(:))
315 dtheta = sum(via(:)*gvec(:))
316 zeta = cmplx(cos(theta), sin(theta), kind=dp)**(-q)
317 dzeta = -q*cmplx(-sin(theta), cos(theta), kind=dp)**(-q - 1.0_dp)*dtheta
318 dggamma(j) = dggamma(j)*zeta + ggamma(j)*dzeta
319 ggamma(j) = ggamma(j)*zeta
320 END DO
321 END DO
322 END DO
323 dggamma = dggamma*zphase + ggamma*dzphase
324 ggamma = ggamma*zphase
325 IF (all(real(ggamma, kind=dp) /= 0.0_dp)) THEN
326 tmp = aimag(ggamma)/real(ggamma, kind=dp)
327 ci = atan(tmp)
328 dci = (1.0_dp/(1.0_dp + tmp**2))* &
329 (aimag(dggamma)*real(ggamma, kind=dp) - aimag(ggamma)* &
330 REAL(dggamma, kind=dp))/(real(ggamma, kind=dp))**2
331 dipole = matmul(cell%hmat, ci)/twopi
332 dipole_deriv = matmul(cell%hmat, dci)/twopi
333 END IF
334 ELSE
335 dipole_type = "non-periodic"
336 DO i = 1, natom
337 ! no pbc(particle_set(i)%r(:),cell) so that the total dipole is the sum of the molecular dipoles
338 ria = particle_set(i)%r(:)
339 q = ncharge(i)
340 dipole = dipole - q*(ria - rcc)
341 dipole_deriv(:) = dipole_deriv(:) - q*(particle_set(i)%v(:) - drcc)
342 END DO
343 END IF
344 ! Contributions from atomic polarization
345 ! No contribution to dipole derivatives
346 DO ikind = 1, nkind
347 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
348 CALL get_qs_kind(qs_kind_set(ikind), basis_set=basis_set)
349 CALL get_qs_kind(qs_kind_set(ikind), se_parameter=se_kind)
350 CALL get_se_param(se_kind, natorb=natorb)
351 ALLOCATE (mom(natorb, natorb, 3))
352 mom = 0.0_dp
353 CALL atomic_moments(mom, basis_set)
354 DO iatom = 1, nat
355 iat = atomic_kind_set(ikind)%atom_list(iatom)
356 DO i = 1, nspin
357 CALL dbcsr_get_block_p(matrix=matrix_p(i)%matrix, row=iat, col=iat, &
358 block=pblock, found=found)
359 IF (found) THEN
360 cpassert(natorb == SIZE(pblock, 1))
361 ix = coset(1, 0, 0) - 1
362 dipole(1) = dipole(1) + sum(pblock*mom(:, :, ix))
363 ix = coset(0, 1, 0) - 1
364 dipole(2) = dipole(2) + sum(pblock*mom(:, :, ix))
365 ix = coset(0, 0, 1) - 1
366 dipole(3) = dipole(3) + sum(pblock*mom(:, :, ix))
367 END IF
368 END DO
369 END DO
370 DEALLOCATE (mom)
371 END DO
372 CALL cp_results_erase(results=results, description=description)
373 CALL put_results(results=results, description=description, &
374 values=dipole(1:3))
375 IF (unit_nr > 0) THEN
376 WRITE (unit_nr, '(/,T2,A,T31,A50)') &
377 'SE_DIPOLE| Dipole type', adjustr(trim(dipole_type))
378 WRITE (unit_nr, '(T2,A,T30,3(1X,F16.8))') &
379 'SE_DIPOLE| Moment [a.u.]', dipole(1:3)
380 WRITE (unit_nr, '(T2,A,T30,3(1X,F16.8))') &
381 'SE_DIPOLE| Moment [Debye]', dipole(1:3)*debye
382 WRITE (unit_nr, '(T2,A,T30,3(1X,F16.8))') &
383 'SE_DIPOLE| Derivative [a.u.]', dipole_deriv(1:3)
384 END IF
385 CALL cp_print_key_finished_output(unit_nr, logger, print_key)
386 END IF
387
388 END SUBROUTINE qs_scf_post_moments
389
390! **************************************************************************************************
391!> \brief Computes the dipole integrals for an atom (a|x|b), a,b on atom A
392!> \param mom ...
393!> \param basis_set ...
394! **************************************************************************************************
395 SUBROUTINE atomic_moments(mom, basis_set)
396 REAL(kind=dp), DIMENSION(:, :, :) :: mom
397 TYPE(gto_basis_set_type), POINTER :: basis_set
398
399 INTEGER :: i, iset, jset, ncoa, ncob, nm, nset, &
400 sgfa, sgfb
401 INTEGER, DIMENSION(:), POINTER :: la_max, la_min, npgf, nsgf
402 INTEGER, DIMENSION(:, :), POINTER :: first_sgf
403 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: work
404 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: mab
405 REAL(kind=dp), DIMENSION(3) :: rac, rbc
406 REAL(kind=dp), DIMENSION(:, :), POINTER :: rpgf, sphi, zet
407
408 rac = 0.0_dp
409 rbc = 0.0_dp
410
411 first_sgf => basis_set%first_sgf
412 la_max => basis_set%lmax
413 la_min => basis_set%lmin
414 npgf => basis_set%npgf
415 nset = basis_set%nset
416 nsgf => basis_set%nsgf_set
417 rpgf => basis_set%pgf_radius
418 sphi => basis_set%sphi
419 zet => basis_set%zet
420
421 nm = 0
422 DO iset = 1, nset
423 ncoa = npgf(iset)*ncoset(la_max(iset))
424 nm = max(nm, ncoa)
425 END DO
426 ALLOCATE (mab(nm, nm, 4), work(nm, nm))
427
428 DO iset = 1, nset
429 ncoa = npgf(iset)*ncoset(la_max(iset))
430 sgfa = first_sgf(1, iset)
431 DO jset = 1, nset
432 ncob = npgf(jset)*ncoset(la_max(jset))
433 sgfb = first_sgf(1, jset)
434 !*** Calculate the primitive integrals ***
435 CALL moment(la_max(iset), npgf(iset), zet(:, iset), rpgf(:, iset), la_min(iset), &
436 la_max(jset), npgf(jset), zet(:, jset), rpgf(:, jset), 1, rac, rbc, mab)
437 !*** Contraction step ***
438 DO i = 1, 3
439 CALL dgemm("N", "N", ncoa, nsgf(jset), ncob, 1.0_dp, mab(1, 1, i), SIZE(mab, 1), &
440 sphi(1, sgfb), SIZE(sphi, 1), 0.0_dp, work(1, 1), SIZE(work, 1))
441 CALL dgemm("T", "N", nsgf(iset), nsgf(jset), ncoa, 1.0_dp, sphi(1, sgfa), SIZE(sphi, 1), &
442 work(1, 1), SIZE(work, 1), 1.0_dp, mom(sgfa, sgfb, i), SIZE(mom, 1))
443 END DO
444 END DO
445 END DO
446 DEALLOCATE (mab, work)
447
448 END SUBROUTINE atomic_moments
449! **************************************************************************************************
450!> \brief Computes and Prints Atomic Charges with several methods
451!> \param input ...
452!> \param logger ...
453!> \param qs_env the qs_env in which the qs_env lives
454!> \param rho ...
455!> \param para_env ...
456! **************************************************************************************************
457 SUBROUTINE qs_scf_post_charges(input, logger, qs_env, rho, para_env)
458 TYPE(section_vals_type), POINTER :: input
459 TYPE(cp_logger_type), POINTER :: logger
460 TYPE(qs_environment_type), POINTER :: qs_env
461 TYPE(qs_rho_type), POINTER :: rho
462 TYPE(mp_para_env_type), POINTER :: para_env
463
464 CHARACTER(LEN=2) :: aname
465 INTEGER :: i, iat, iatom, ikind, j, nat, natom, &
466 natorb, nkind, nspin, unit_nr
467 LOGICAL :: found
468 REAL(kind=dp) :: npe, zeff
469 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: mcharge
470 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: charges
471 REAL(kind=dp), DIMENSION(:, :), POINTER :: pblock
472 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
473 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p
474 TYPE(dft_control_type), POINTER :: dft_control
475 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
476 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
477 TYPE(section_vals_type), POINTER :: print_key
478 TYPE(semi_empirical_type), POINTER :: se_kind
479
480 NULLIFY (particle_set)
481 CALL get_qs_env(qs_env=qs_env, &
482 atomic_kind_set=atomic_kind_set, &
483 natom=natom, &
484 qs_kind_set=qs_kind_set, &
485 particle_set=particle_set, &
486 dft_control=dft_control)
487
488 ! Compute the mulliken charges
489 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%MULLIKEN")
490 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
491 unit_nr = cp_print_key_unit_nr(logger, input, "DFT%PRINT%MULLIKEN", extension=".mulliken", log_filename=.false.)
492 CALL qs_rho_get(rho, rho_ao=matrix_p)
493 nspin = SIZE(matrix_p)
494 npe = real(para_env%num_pe, kind=dp)
495 ALLOCATE (charges(natom, nspin), mcharge(natom))
496 charges = 0.0_dp
497 mcharge = 0.0_dp
498 ! calculate atomic charges
499 nkind = SIZE(atomic_kind_set)
500 DO ikind = 1, nkind
501 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
502 CALL get_qs_kind(qs_kind_set(ikind), se_parameter=se_kind)
503 CALL get_se_param(se_kind, zeff=zeff, natorb=natorb)
504 DO iatom = 1, nat
505 iat = atomic_kind_set(ikind)%atom_list(iatom)
506 DO i = 1, nspin
507 CALL dbcsr_get_block_p(matrix=matrix_p(i)%matrix, row=iat, col=iat, &
508 block=pblock, found=found)
509 IF (found) THEN
510 DO j = 1, natorb
511 charges(iat, i) = charges(iat, i) + pblock(j, j)
512 END DO
513 END IF
514 END DO
515 mcharge(iat) = zeff/npe - sum(charges(iat, 1:nspin))
516 END DO
517 END DO
518 !
519 CALL para_env%sum(charges)
520 CALL para_env%sum(mcharge)
521 !
522 IF (unit_nr > 0) THEN
523 WRITE (unit=unit_nr, fmt="(/,/,T2,A)") "POPULATION ANALYSIS"
524 IF (nspin == 1) THEN
525 WRITE (unit=unit_nr, fmt="(/,T2,A,T70,A)") &
526 " # Atom Element Kind Atomic population", " Net charge"
527 DO ikind = 1, nkind
528 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
529 CALL get_qs_kind(qs_kind_set(ikind), se_parameter=se_kind, element_symbol=aname)
530 DO iatom = 1, nat
531 iat = atomic_kind_set(ikind)%atom_list(iatom)
532 WRITE (unit=unit_nr, &
533 fmt="(T2,I7,6X,A2,3X,I6,T39,F12.6,T69,F12.6)") &
534 iat, aname, ikind, charges(iat, 1), mcharge(iat)
535 END DO
536 END DO
537 WRITE (unit=unit_nr, &
538 fmt="(T2,A,T39,F12.6,T69,F12.6,/)") &
539 "# Total charge", sum(charges(:, 1)), sum(mcharge(:))
540 ELSE
541 WRITE (unit=unit_nr, fmt="(/,T2,A)") &
542 "# Atom Element Kind Atomic population (alpha,beta) Net charge Spin moment"
543 DO ikind = 1, nkind
544 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
545 CALL get_qs_kind(qs_kind_set(ikind), se_parameter=se_kind, element_symbol=aname)
546 DO iatom = 1, nat
547 iat = atomic_kind_set(ikind)%atom_list(iatom)
548 WRITE (unit=unit_nr, &
549 fmt="(T2,I6,5X,A2,2X,I6,T29,4(1X,F12.6))") &
550 iat, aname, ikind, charges(iat, 1:2), mcharge(iat), charges(iat, 1) - charges(iat, 2)
551 END DO
552 END DO
553 WRITE (unit=unit_nr, &
554 fmt="(T2,A,T29,4(1X,F12.6),/)") &
555 "# Total charge and spin", sum(charges(:, 1)), sum(charges(:, 2)), sum(mcharge(:))
556 END IF
557 END IF
558
559 CALL cp_print_key_finished_output(unit_nr, logger, input, "DFT%PRINT%MULLIKEN")
560
561 DEALLOCATE (charges, mcharge)
562 END IF
563
564 ! EEQ Charges
565 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%EEQ_CHARGES")
566 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
567 unit_nr = cp_print_key_unit_nr(logger, input, "DFT%PRINT%EEQ_CHARGES", &
568 extension=".eeq", log_filename=.false.)
569 CALL eeq_print(qs_env, unit_nr, print_level=1, ext=.false.)
570 CALL cp_print_key_finished_output(unit_nr, logger, print_key)
571 END IF
572
573 ! Compute the Lowdin charges
574 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%LOWDIN")
575 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
576 cpwarn("Lowdin charges not available for semi-empirical calculations!")
577 END IF
578
579 ! Hirshfeld charges
580 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%HIRSHFELD")
581 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
582 cpwarn("Hirshfeld charges not available for semi-empirical calculations!")
583 END IF
584
585 ! MAO
586 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%MAO_ANALYSIS")
587 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
588 cpwarn("MAO analysis not available for semi-empirical calculations!")
589 END IF
590
591 ! ED
592 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%ENERGY_DECOMPOSITION_ANALYSIS")
593 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
594 cpwarn("ED analysis not available for semi-empirical calculations!")
595 END IF
596
597 END SUBROUTINE qs_scf_post_charges
598
599! **************************************************************************************************
600!> \brief Write QS results always available (if switched on through the print_keys)
601!> \param qs_env the qs_env in which the qs_env lives
602! **************************************************************************************************
603 SUBROUTINE write_available_results(qs_env)
604 TYPE(qs_environment_type), POINTER :: qs_env
605
606 CHARACTER(len=*), PARAMETER :: routinen = 'write_available_results'
607
608 INTEGER :: after, handle, ispin, iw, output_unit
609 LOGICAL :: omit_headers
610 TYPE(cp_logger_type), POINTER :: logger
611 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_rmpv, rho_ao
612 TYPE(dft_control_type), POINTER :: dft_control
613 TYPE(mp_para_env_type), POINTER :: para_env
614 TYPE(particle_list_type), POINTER :: particles
615 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
616 TYPE(qs_rho_type), POINTER :: rho
617 TYPE(qs_scf_env_type), POINTER :: scf_env
618 TYPE(qs_subsys_type), POINTER :: subsys
619 TYPE(section_vals_type), POINTER :: dft_section, input
620
621 CALL timeset(routinen, handle)
622 NULLIFY (dft_control, particle_set, rho, ks_rmpv, dft_section, input, &
623 particles, subsys, para_env, rho_ao)
624 logger => cp_get_default_logger()
625 output_unit = cp_logger_get_default_io_unit(logger)
626
627 cpassert(ASSOCIATED(qs_env))
628 CALL get_qs_env(qs_env, &
629 dft_control=dft_control, &
630 particle_set=particle_set, &
631 rho=rho, &
632 matrix_ks=ks_rmpv, &
633 input=input, &
634 subsys=subsys, &
635 scf_env=scf_env, &
636 para_env=para_env)
637 CALL qs_subsys_get(subsys, particles=particles)
638 CALL qs_rho_get(rho, rho_ao=rho_ao)
639
640 ! Print MO information if requested
641 CALL qs_scf_write_mos(qs_env, scf_env, final_mos=.true.)
642
643 ! Aat the end of SCF printout the projected DOS for each atomic kind
644 dft_section => section_vals_get_subs_vals(input, "DFT")
645 IF (btest(cp_print_key_should_output(logger%iter_info, dft_section, "PRINT%PDOS") &
646 , cp_p_file)) THEN
647 cpwarn("PDOS not implemented for Semi-Empirical calculations!")
648 END IF
649
650 ! Print the total density (electronic + core charge)
651 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
652 "DFT%PRINT%TOT_DENSITY_CUBE"), cp_p_file)) THEN
653 cpwarn("TOT_DENSITY_CUBE not implemented for Semi-Empirical calculations!")
654 END IF
655
656 ! Write cube file with electron density
657 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
658 "DFT%PRINT%E_DENSITY_CUBE"), cp_p_file)) THEN
659 cpwarn("E_DENSITY_CUBE not implemented for Semi-Empirical calculations!")
660 END IF ! print key
661
662 ! Write cube file with EFIELD
663 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
664 "DFT%PRINT%EFIELD_CUBE"), cp_p_file)) THEN
665 cpwarn("EFIELD_CUBE not implemented for Semi-Empirical calculations!")
666 END IF ! print key
667
668 ! Write cube file with ELF
669 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
670 "DFT%PRINT%ELF_CUBE"), cp_p_file)) THEN
671 cpwarn("ELF function not implemented for Semi-Empirical calculations!")
672 END IF ! print key
673
674 ! Print the hartree potential
675 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
676 "DFT%PRINT%V_HARTREE_CUBE"), cp_p_file)) THEN
677 cpwarn("V_HARTREE_CUBE not implemented for Semi-Empirical calculations!")
678 END IF
679
680 ! Print the XC potential
681 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
682 "DFT%PRINT%V_XC_CUBE"), cp_p_file)) THEN
683 cpwarn("V_XC_CUBE not available for Semi-Empirical calculations!")
684 END IF
685
686 ! Write the density matrix
687 CALL section_vals_val_get(input, "DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
688 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
689 "DFT%PRINT%AO_MATRICES/DENSITY"), cp_p_file)) THEN
690 iw = cp_print_key_unit_nr(logger, input, "DFT%PRINT%AO_MATRICES/DENSITY", &
691 extension=".Log")
692 CALL section_vals_val_get(input, "DFT%PRINT%AO_MATRICES%NDIGITS", i_val=after)
693 after = min(max(after, 1), 16)
694 DO ispin = 1, dft_control%nspins
695 CALL cp_dbcsr_write_sparse_matrix(rho_ao(ispin)%matrix, 4, after, qs_env, &
696 para_env, output_unit=iw, omit_headers=omit_headers)
697 END DO
698 CALL cp_print_key_finished_output(iw, logger, input, &
699 "DFT%PRINT%AO_MATRICES/DENSITY")
700 END IF
701
702 ! The Kohn-Sham matrix itself
703 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
704 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"), cp_p_file)) THEN
705 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false., just_energy=.false.)
706 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
707 iw = cp_print_key_unit_nr(logger, input, "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX", &
708 extension=".Log")
709 CALL section_vals_val_get(input, "DFT%PRINT%AO_MATRICES%NDIGITS", i_val=after)
710 after = min(max(after, 1), 16)
711 CALL cp_dbcsr_write_sparse_matrix(ks_rmpv(1)%matrix, 4, after, qs_env, &
712 para_env, output_unit=iw, omit_headers=omit_headers)
713 CALL cp_print_key_finished_output(iw, logger, input, &
714 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
715 END IF
716
717 CALL timestop(handle)
718
719 END SUBROUTINE write_available_results
720
721END MODULE qs_scf_post_se
static void dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Convenient wrapper to hide Fortran nature of dgemm_, swapping a and b.
Calculation of the moment integrals over Cartesian Gaussian-type functions.
Definition ai_moments.F:17
subroutine, public moment(la_max, npgfa, zeta, rpgfa, la_min, lb_max, npgfb, zetb, rpgfb, lc_max, rac, rbc, mab)
...
Definition ai_moments.F:986
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Handles all functions related to the CELL.
Definition cell_types.F:15
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
DBCSR output in CP2K.
subroutine, public cp_dbcsr_write_sparse_matrix(sparse_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, scale, output_unit, omit_headers)
...
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
set of type/routines to handle the storage of results in force_envs
subroutine, public cp_results_erase(results, description, nval)
erase a part of result_list
set of type/routines to handle the storage of results in force_envs
Calculation of charge equilibration method.
Definition eeq_method.F:12
subroutine, public eeq_print(qs_env, iounit, print_level, ext)
...
Definition eeq_method.F:124
objects that represent the structure of input sections and the data contained in an input section
integer function, public section_get_ival(section_vals, keyword_name)
...
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Definition of mathematical constants and functions.
real(kind=dp), parameter, public twopi
Interface to the message passing library MPI.
Calculates the moment integrals <a|r^m|b>
subroutine, public get_reference_point(rpoint, drpoint, qs_env, fist_env, reference, ref_point, ifirst, ilast)
...
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
integer, dimension(:, :, :), allocatable, public coset
represent a simple array based list of the given type
Define the data structure for the particle information.
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public debye
Definition physcon.F:201
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.
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 (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
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...
subroutine, public qs_scf_write_mos(qs_env, scf_env, final_mos)
Write the MO eigenvector, eigenvalues, and occupation numbers to the output unit.
Does all kind of post scf calculations for semi-empirical.
subroutine, public scf_post_calculation_se(qs_env)
collects possible post - scf calculations and prints info / computes properties. specific for Semi-em...
module that contains the definitions of the scf types
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
Definition of the semi empirical parameter types.
subroutine, public get_se_param(sep, name, typ, defined, z, zeff, natorb, eheat, beta, sto_exponents, uss, upp, udd, uff, alp, eisol, gss, gsp, gpp, gp2, acoul, nr, de, ass, asp, app, hsp, gsd, gpd, gdd, ppddg, dpddg, ngauss)
Get info from the semi-empirical type.
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contains arbitrary information which need to be stored
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
keeps the density in various representations, keeping track of which ones are valid.