(git:374b731)
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-2024 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
29 USE cp_output_handling, ONLY: cp_p_file,&
36 USE dbcsr_api, ONLY: dbcsr_get_block_p,&
37 dbcsr_p_type
43 USE kinds, ONLY: default_string_length,&
44 dp
45 USE mathconstants, ONLY: twopi
48 USE orbital_pointers, ONLY: coset,&
49 ncoset
52 USE physcon, ONLY: debye
55 USE qs_kind_types, ONLY: get_qs_kind,&
59 USE qs_rho_types, ONLY: qs_rho_get,&
67#include "./base/base_uses.f90"
68
69 IMPLICIT NONE
70 PRIVATE
71
72 ! Global parameters
73 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_post_se'
75
76CONTAINS
77
78! **************************************************************************************************
79!> \brief collects possible post - scf calculations and prints info / computes properties.
80!> specific for Semi-empirical calculations
81!> \param qs_env the qs_env in which the qs_env lives
82!> \par History
83!> 07.2008 created [tlaino] - Split from qs_scf_post (general)
84!> \author tlaino
85!> \note
86!> this function changes mo_eigenvectors and mo_eigenvalues, depending on the print keys.
87!> In particular, MO_CUBES causes the MOs to be rotated to make them eigenstates of the KS
88!> matrix, and mo_eigenvalues is updated accordingly. This can, for unconverged wavefunctions,
89!> change afterwards slightly the forces (hence small numerical differences between MD
90!> with and without the debug print level). Ideally this should not happen...
91! **************************************************************************************************
92 SUBROUTINE scf_post_calculation_se(qs_env)
93
94 TYPE(qs_environment_type), POINTER :: qs_env
95
96 CHARACTER(len=*), PARAMETER :: routinen = 'scf_post_calculation_se'
97
98 INTEGER :: handle, output_unit
99 LOGICAL :: explicit, my_localized_wfn
100 TYPE(cp_logger_type), POINTER :: logger
101 TYPE(mp_para_env_type), POINTER :: para_env
102 TYPE(particle_list_type), POINTER :: particles
103 TYPE(qs_rho_type), POINTER :: rho
104 TYPE(qs_subsys_type), POINTER :: subsys
105 TYPE(section_vals_type), POINTER :: input, print_key, wfn_mix_section
106
107 CALL timeset(routinen, handle)
108
109 ! Writes the data that is already available in qs_env
110 CALL write_available_results(qs_env)
111
112 my_localized_wfn = .false.
113 NULLIFY (rho, subsys, particles, input, print_key, para_env)
114
115 logger => cp_get_default_logger()
116 output_unit = cp_logger_get_default_io_unit(logger)
117
118 cpassert(ASSOCIATED(qs_env))
119 ! Here we start with data that needs a postprocessing...
120 CALL get_qs_env(qs_env, &
121 rho=rho, &
122 input=input, &
123 subsys=subsys, &
124 para_env=para_env)
125 CALL qs_subsys_get(subsys, particles=particles)
126
127 ! Compute Atomic Charges
128 CALL qs_scf_post_charges(input, logger, qs_env, rho, para_env)
129
130 ! Moments of charge distribution
131 CALL qs_scf_post_moments(input, logger, qs_env)
132
133 ! MO_CUBES
134 print_key => section_vals_get_subs_vals(section_vals=input, &
135 subsection_name="DFT%PRINT%MO_CUBES")
136 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
137 cpwarn("Printing of MO cube files not implemented for Semi-Empirical method.")
138 END IF
139
140 ! STM
141 print_key => section_vals_get_subs_vals(section_vals=input, &
142 subsection_name="DFT%PRINT%STM")
143 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
144 cpwarn("STM not implemented for Semi-Empirical method.")
145 END IF
146
147 ! DFT+U
148 print_key => section_vals_get_subs_vals(section_vals=input, &
149 subsection_name="DFT%PRINT%PLUS_U")
150 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
151 cpwarn("DFT+U not available for Semi-Empirical method.")
152 END IF
153
154 ! Kinetic Energy
155 print_key => section_vals_get_subs_vals(section_vals=input, &
156 subsection_name="DFT%PRINT%KINETIC_ENERGY")
157 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
158 cpwarn("Kinetic energy not available for Semi-Empirical method.")
159 END IF
160
161 ! Wavefunction mixing
162 wfn_mix_section => section_vals_get_subs_vals(input, "DFT%PRINT%WFN_MIX")
163 CALL section_vals_get(wfn_mix_section, explicit=explicit)
164 IF (explicit .AND. .NOT. qs_env%run_rtp) THEN
165 cpwarn("Wavefunction mixing not implemented for Semi-Empirical method.")
166 END IF
167
168 ! Print coherent X-ray diffraction spectrum
169 print_key => section_vals_get_subs_vals(section_vals=input, &
170 subsection_name="DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
171 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
172 cpwarn("XRAY_DIFFRACTION_SPECTRUM not implemented for Semi-Empirical calculations!!")
173 END IF
174
175 ! Calculation of Electric Field Gradients
176 print_key => section_vals_get_subs_vals(section_vals=input, &
177 subsection_name="DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
178 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
179 cpwarn("ELECTRIC_FIELD_GRADIENT not implemented for Semi-Empirical calculations!!")
180 END IF
181
182 ! Calculation of EPR Hyperfine Coupling Tensors
183 print_key => section_vals_get_subs_vals(section_vals=input, &
184 subsection_name="DFT%PRINT%HYPERFINE_COUPLING_TENSOR")
185 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), &
186 cp_p_file)) THEN
187 cpwarn("HYPERFINE_COUPLING_TENSOR not implemented for Semi-Empirical calculations!!")
188 END IF
189
190 CALL timestop(handle)
191
192 END SUBROUTINE scf_post_calculation_se
193
194! **************************************************************************************************
195!> \brief Computes and prints electric dipole moments
196!> We use the approximation for NDDO from
197!> Pople and Beveridge, Approximate Molecular Orbital Theory,
198!> Mc Graw Hill 1970
199!> mu = \sum_A [ Q_A * R_a + Tr(P_A*D_A) ]
200!> \param input ...
201!> \param logger ...
202!> \param qs_env the qs_env in which the qs_env lives
203! **************************************************************************************************
204 SUBROUTINE qs_scf_post_moments(input, logger, qs_env)
205 TYPE(section_vals_type), POINTER :: input
206 TYPE(cp_logger_type), POINTER :: logger
207 TYPE(qs_environment_type), POINTER :: qs_env
208
209 CHARACTER(LEN=default_string_length) :: description, dipole_type
210 COMPLEX(KIND=dp) :: dzeta, zeta
211 COMPLEX(KIND=dp), DIMENSION(3) :: dggamma, dzphase, ggamma, zphase
212 INTEGER :: i, iat, iatom, ikind, ix, j, nat, natom, &
213 natorb, nkind, nspin, reference, &
214 unit_nr
215 LOGICAL :: do_berry, found
216 REAL(kind=dp) :: charge_tot, ci(3), dci(3), dipole(3), dipole_deriv(3), drcc(3), dria(3), &
217 dtheta, gvec(3), q, rcc(3), ria(3), tcharge(2), theta, tmp(3), via(3), zeff
218 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: ncharge
219 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: mom
220 REAL(kind=dp), DIMENSION(:), POINTER :: ref_point
221 REAL(kind=dp), DIMENSION(:, :), POINTER :: pblock
222 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
223 TYPE(cell_type), POINTER :: cell
224 TYPE(cp_result_type), POINTER :: results
225 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p
226 TYPE(dft_control_type), POINTER :: dft_control
227 TYPE(gto_basis_set_type), POINTER :: basis_set
228 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
229 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
230 TYPE(qs_rho_type), POINTER :: rho
231 TYPE(section_vals_type), POINTER :: print_key
232 TYPE(semi_empirical_type), POINTER :: se_kind
233
234 NULLIFY (results)
235 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%MOMENTS")
236 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
237 ! Dipole Moments
238 unit_nr = cp_print_key_unit_nr(logger, input, "DFT%PRINT%MOMENTS", &
239 extension=".data", middle_name="se_dipole", log_filename=.false.)
240
241 ! Reference point
242 reference = section_get_ival(print_key, keyword_name="REFERENCE")
243 NULLIFY (ref_point)
244 description = '[DIPOLE]'
245 CALL section_vals_val_get(print_key, "REF_POINT", r_vals=ref_point)
246 CALL section_vals_val_get(print_key, "PERIODIC", l_val=do_berry)
247 CALL get_reference_point(rcc, drcc, qs_env=qs_env, reference=reference, &
248 ref_point=ref_point)
249 !
250 NULLIFY (particle_set)
251 CALL get_qs_env(qs_env=qs_env, &
252 rho=rho, &
253 cell=cell, &
254 atomic_kind_set=atomic_kind_set, &
255 natom=natom, &
256 qs_kind_set=qs_kind_set, &
257 particle_set=particle_set, &
258 results=results, &
259 dft_control=dft_control)
260
261 CALL qs_rho_get(rho, rho_ao=matrix_p)
262 nspin = SIZE(matrix_p)
263 nkind = SIZE(atomic_kind_set)
264 ! net charges
265 ALLOCATE (ncharge(natom))
266 ncharge = 0.0_dp
267 DO ikind = 1, nkind
268 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
269 CALL get_qs_kind(qs_kind_set(ikind), se_parameter=se_kind)
270 CALL get_se_param(se_kind, zeff=zeff, natorb=natorb)
271 DO iatom = 1, nat
272 iat = atomic_kind_set(ikind)%atom_list(iatom)
273 tcharge = 0.0_dp
274 DO i = 1, nspin
275 CALL dbcsr_get_block_p(matrix=matrix_p(i)%matrix, row=iat, col=iat, &
276 block=pblock, found=found)
277 IF (found) THEN
278 DO j = 1, natorb
279 tcharge(i) = tcharge(i) + pblock(j, j)
280 END DO
281 END IF
282 END DO
283 ncharge(iat) = zeff - sum(tcharge)
284 END DO
285 END DO
286 ! Contributions from net atomic charges
287 ! Dipole deriv will be the derivative of the Dipole(dM/dt=\sum e_j v_j)
288 dipole_deriv = 0.0_dp
289 dipole = 0.0_dp
290 IF (do_berry) THEN
291 dipole_type = "periodic (Berry phase)"
292 rcc = pbc(rcc, cell)
293 charge_tot = 0._dp
294 charge_tot = sum(ncharge)
295 ria = twopi*matmul(cell%h_inv, rcc)
296 zphase = cmplx(cos(ria), sin(ria), dp)**charge_tot
297
298 dria = twopi*matmul(cell%h_inv, drcc)
299 dzphase = charge_tot*cmplx(-sin(ria), cos(ria), dp)**(charge_tot - 1.0_dp)*dria
300
301 ggamma = cmplx(1.0_dp, 0.0_dp, kind=dp)
302 dggamma = cmplx(0.0_dp, 0.0_dp, kind=dp)
303 DO ikind = 1, SIZE(atomic_kind_set)
304 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
305 DO i = 1, nat
306 iat = atomic_kind_set(ikind)%atom_list(i)
307 ria = particle_set(iat)%r(:)
308 ria = pbc(ria, cell)
309 via = particle_set(iat)%v(:)
310 q = ncharge(iat)
311 DO j = 1, 3
312 gvec = twopi*cell%h_inv(j, :)
313 theta = sum(ria(:)*gvec(:))
314 dtheta = sum(via(:)*gvec(:))
315 zeta = cmplx(cos(theta), sin(theta), kind=dp)**(-q)
316 dzeta = -q*cmplx(-sin(theta), cos(theta), kind=dp)**(-q - 1.0_dp)*dtheta
317 dggamma(j) = dggamma(j)*zeta + ggamma(j)*dzeta
318 ggamma(j) = ggamma(j)*zeta
319 END DO
320 END DO
321 END DO
322 dggamma = dggamma*zphase + ggamma*dzphase
323 ggamma = ggamma*zphase
324 IF (all(real(ggamma, kind=dp) /= 0.0_dp)) THEN
325 tmp = aimag(ggamma)/real(ggamma, kind=dp)
326 ci = atan(tmp)
327 dci = (1.0_dp/(1.0_dp + tmp**2))* &
328 (aimag(dggamma)*real(ggamma, kind=dp) - aimag(ggamma)* &
329 REAL(dggamma, kind=dp))/(real(ggamma, kind=dp))**2
330 dipole = matmul(cell%hmat, ci)/twopi
331 dipole_deriv = matmul(cell%hmat, dci)/twopi
332 END IF
333 ELSE
334 dipole_type = "non-periodic"
335 DO i = 1, natom
336 ! no pbc(particle_set(i)%r(:),cell) so that the total dipole is the sum of the molecular dipoles
337 ria = particle_set(i)%r(:)
338 q = ncharge(i)
339 dipole = dipole - q*(ria - rcc)
340 dipole_deriv(:) = dipole_deriv(:) - q*(particle_set(i)%v(:) - drcc)
341 END DO
342 END IF
343 ! Contributions from atomic polarization
344 ! No contribution to dipole derivatives
345 DO ikind = 1, nkind
346 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
347 CALL get_qs_kind(qs_kind_set(ikind), basis_set=basis_set)
348 CALL get_qs_kind(qs_kind_set(ikind), se_parameter=se_kind)
349 CALL get_se_param(se_kind, natorb=natorb)
350 ALLOCATE (mom(natorb, natorb, 3))
351 mom = 0.0_dp
352 CALL atomic_moments(mom, basis_set)
353 DO iatom = 1, nat
354 iat = atomic_kind_set(ikind)%atom_list(iatom)
355 DO i = 1, nspin
356 CALL dbcsr_get_block_p(matrix=matrix_p(i)%matrix, row=iat, col=iat, &
357 block=pblock, found=found)
358 IF (found) THEN
359 cpassert(natorb == SIZE(pblock, 1))
360 ix = coset(1, 0, 0) - 1
361 dipole(1) = dipole(1) + sum(pblock*mom(:, :, ix))
362 ix = coset(0, 1, 0) - 1
363 dipole(2) = dipole(2) + sum(pblock*mom(:, :, ix))
364 ix = coset(0, 0, 1) - 1
365 dipole(3) = dipole(3) + sum(pblock*mom(:, :, ix))
366 END IF
367 END DO
368 END DO
369 DEALLOCATE (mom)
370 END DO
371 CALL cp_results_erase(results=results, description=description)
372 CALL put_results(results=results, description=description, &
373 values=dipole(1:3))
374 IF (unit_nr > 0) THEN
375 WRITE (unit_nr, '(/,T2,A,T31,A50)') &
376 'SE_DIPOLE| Dipole type', adjustr(trim(dipole_type))
377 WRITE (unit_nr, '(T2,A,T30,3(1X,F16.8))') &
378 'SE_DIPOLE| Moment [a.u.]', dipole(1:3)
379 WRITE (unit_nr, '(T2,A,T30,3(1X,F16.8))') &
380 'SE_DIPOLE| Moment [Debye]', dipole(1:3)*debye
381 WRITE (unit_nr, '(T2,A,T30,3(1X,F16.8))') &
382 'SE_DIPOLE| Derivative [a.u.]', dipole_deriv(1:3)
383 END IF
384 CALL cp_print_key_finished_output(unit_nr, logger, print_key)
385 END IF
386
387 END SUBROUTINE qs_scf_post_moments
388
389! **************************************************************************************************
390!> \brief Computes the dipole integrals for an atom (a|x|b), a,b on atom A
391!> \param mom ...
392!> \param basis_set ...
393! **************************************************************************************************
394 SUBROUTINE atomic_moments(mom, basis_set)
395 REAL(kind=dp), DIMENSION(:, :, :) :: mom
396 TYPE(gto_basis_set_type), POINTER :: basis_set
397
398 INTEGER :: i, iset, jset, ncoa, ncob, nm, nset, &
399 sgfa, sgfb
400 INTEGER, DIMENSION(:), POINTER :: la_max, la_min, npgf, nsgf
401 INTEGER, DIMENSION(:, :), POINTER :: first_sgf
402 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: work
403 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: mab
404 REAL(kind=dp), DIMENSION(3) :: rac, rbc
405 REAL(kind=dp), DIMENSION(:, :), POINTER :: rpgf, sphi, zet
406
407 rac = 0.0_dp
408 rbc = 0.0_dp
409
410 first_sgf => basis_set%first_sgf
411 la_max => basis_set%lmax
412 la_min => basis_set%lmin
413 npgf => basis_set%npgf
414 nset = basis_set%nset
415 nsgf => basis_set%nsgf_set
416 rpgf => basis_set%pgf_radius
417 sphi => basis_set%sphi
418 zet => basis_set%zet
419
420 nm = 0
421 DO iset = 1, nset
422 ncoa = npgf(iset)*ncoset(la_max(iset))
423 nm = max(nm, ncoa)
424 END DO
425 ALLOCATE (mab(nm, nm, 4), work(nm, nm))
426
427 DO iset = 1, nset
428 ncoa = npgf(iset)*ncoset(la_max(iset))
429 sgfa = first_sgf(1, iset)
430 DO jset = 1, nset
431 ncob = npgf(jset)*ncoset(la_max(jset))
432 sgfb = first_sgf(1, jset)
433 !*** Calculate the primitive integrals ***
434 CALL moment(la_max(iset), npgf(iset), zet(:, iset), rpgf(:, iset), la_min(iset), &
435 la_max(jset), npgf(jset), zet(:, jset), rpgf(:, jset), 1, rac, rbc, mab)
436 !*** Contraction step ***
437 DO i = 1, 3
438 CALL dgemm("N", "N", ncoa, nsgf(jset), ncob, 1.0_dp, mab(1, 1, i), SIZE(mab, 1), &
439 sphi(1, sgfb), SIZE(sphi, 1), 0.0_dp, work(1, 1), SIZE(work, 1))
440 CALL dgemm("T", "N", nsgf(iset), nsgf(jset), ncoa, 1.0_dp, sphi(1, sgfa), SIZE(sphi, 1), &
441 work(1, 1), SIZE(work, 1), 1.0_dp, mom(sgfa, sgfb, i), SIZE(mom, 1))
442 END DO
443 END DO
444 END DO
445 DEALLOCATE (mab, work)
446
447 END SUBROUTINE atomic_moments
448! **************************************************************************************************
449!> \brief Computes and Prints Atomic Charges with several methods
450!> \param input ...
451!> \param logger ...
452!> \param qs_env the qs_env in which the qs_env lives
453!> \param rho ...
454!> \param para_env ...
455! **************************************************************************************************
456 SUBROUTINE qs_scf_post_charges(input, logger, qs_env, rho, para_env)
457 TYPE(section_vals_type), POINTER :: input
458 TYPE(cp_logger_type), POINTER :: logger
459 TYPE(qs_environment_type), POINTER :: qs_env
460 TYPE(qs_rho_type), POINTER :: rho
461 TYPE(mp_para_env_type), POINTER :: para_env
462
463 CHARACTER(LEN=2) :: aname
464 INTEGER :: i, iat, iatom, ikind, j, nat, natom, &
465 natorb, nkind, nspin, unit_nr
466 LOGICAL :: found
467 REAL(kind=dp) :: npe, zeff
468 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: mcharge
469 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: charges
470 REAL(kind=dp), DIMENSION(:, :), POINTER :: pblock
471 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
472 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p
473 TYPE(dft_control_type), POINTER :: dft_control
474 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
475 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
476 TYPE(section_vals_type), POINTER :: print_key
477 TYPE(semi_empirical_type), POINTER :: se_kind
478
479 NULLIFY (particle_set)
480 CALL get_qs_env(qs_env=qs_env, &
481 atomic_kind_set=atomic_kind_set, &
482 natom=natom, &
483 qs_kind_set=qs_kind_set, &
484 particle_set=particle_set, &
485 dft_control=dft_control)
486
487 ! Compute the mulliken charges
488 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%MULLIKEN")
489 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
490 unit_nr = cp_print_key_unit_nr(logger, input, "DFT%PRINT%MULLIKEN", extension=".mulliken", log_filename=.false.)
491 CALL qs_rho_get(rho, rho_ao=matrix_p)
492 nspin = SIZE(matrix_p)
493 npe = real(para_env%num_pe, kind=dp)
494 ALLOCATE (charges(natom, nspin), mcharge(natom))
495 charges = 0.0_dp
496 mcharge = 0.0_dp
497 ! calculate atomic charges
498 nkind = SIZE(atomic_kind_set)
499 DO ikind = 1, nkind
500 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
501 CALL get_qs_kind(qs_kind_set(ikind), se_parameter=se_kind)
502 CALL get_se_param(se_kind, zeff=zeff, natorb=natorb)
503 DO iatom = 1, nat
504 iat = atomic_kind_set(ikind)%atom_list(iatom)
505 DO i = 1, nspin
506 CALL dbcsr_get_block_p(matrix=matrix_p(i)%matrix, row=iat, col=iat, &
507 block=pblock, found=found)
508 IF (found) THEN
509 DO j = 1, natorb
510 charges(iat, i) = charges(iat, i) + pblock(j, j)
511 END DO
512 END IF
513 END DO
514 mcharge(iat) = zeff/npe - sum(charges(iat, 1:nspin))
515 END DO
516 END DO
517 !
518 CALL para_env%sum(charges)
519 CALL para_env%sum(mcharge)
520 !
521 IF (unit_nr > 0) THEN
522 WRITE (unit=unit_nr, fmt="(/,/,T2,A)") "POPULATION ANALYSIS"
523 IF (nspin == 1) THEN
524 WRITE (unit=unit_nr, fmt="(/,T2,A,T70,A)") &
525 " # Atom Element Kind Atomic population", " Net charge"
526 DO ikind = 1, nkind
527 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
528 CALL get_qs_kind(qs_kind_set(ikind), se_parameter=se_kind, element_symbol=aname)
529 DO iatom = 1, nat
530 iat = atomic_kind_set(ikind)%atom_list(iatom)
531 WRITE (unit=unit_nr, &
532 fmt="(T2,I7,6X,A2,3X,I6,T39,F12.6,T69,F12.6)") &
533 iat, aname, ikind, charges(iat, 1), mcharge(iat)
534 END DO
535 END DO
536 WRITE (unit=unit_nr, &
537 fmt="(T2,A,T39,F12.6,T69,F12.6,/)") &
538 "# Total charge", sum(charges(:, 1)), sum(mcharge(:))
539 ELSE
540 WRITE (unit=unit_nr, fmt="(/,T2,A)") &
541 "# Atom Element Kind Atomic population (alpha,beta) Net charge Spin moment"
542 DO ikind = 1, nkind
543 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
544 CALL get_qs_kind(qs_kind_set(ikind), se_parameter=se_kind, element_symbol=aname)
545 DO iatom = 1, nat
546 iat = atomic_kind_set(ikind)%atom_list(iatom)
547 WRITE (unit=unit_nr, &
548 fmt="(T2,I6,5X,A2,2X,I6,T29,4(1X,F12.6))") &
549 iat, aname, ikind, charges(iat, 1:2), mcharge(iat), charges(iat, 1) - charges(iat, 2)
550 END DO
551 END DO
552 WRITE (unit=unit_nr, &
553 fmt="(T2,A,T29,4(1X,F12.6),/)") &
554 "# Total charge and spin", sum(charges(:, 1)), sum(charges(:, 2)), sum(mcharge(:))
555 END IF
556 END IF
557
558 CALL cp_print_key_finished_output(unit_nr, logger, input, "DFT%PRINT%MULLIKEN")
559
560 DEALLOCATE (charges, mcharge)
561 END IF
562
563 ! Compute the Lowdin charges
564 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%LOWDIN")
565 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
566 cpwarn("Lowdin charges not available for semi-empirical calculations!")
567 END IF
568
569 ! Hirshfeld charges
570 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%HIRSHFELD")
571 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
572 cpwarn("Hirshfeld charges not available for semi-empirical calculations!")
573 END IF
574
575 ! MAO
576 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%MAO_ANALYSIS")
577 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
578 cpwarn("MAO analysis not available for semi-empirical calculations!")
579 END IF
580
581 ! ED
582 print_key => section_vals_get_subs_vals(input, "DFT%PRINT%ENERGY_DECOMPOSITION_ANALYSIS")
583 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
584 cpwarn("ED analysis not available for semi-empirical calculations!")
585 END IF
586
587 END SUBROUTINE qs_scf_post_charges
588
589! **************************************************************************************************
590!> \brief Write QS results always available (if switched on through the print_keys)
591!> \param qs_env the qs_env in which the qs_env lives
592! **************************************************************************************************
593 SUBROUTINE write_available_results(qs_env)
594 TYPE(qs_environment_type), POINTER :: qs_env
595
596 CHARACTER(len=*), PARAMETER :: routinen = 'write_available_results'
597
598 INTEGER :: after, handle, ispin, iw, output_unit
599 LOGICAL :: omit_headers
600 TYPE(cp_logger_type), POINTER :: logger
601 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_rmpv, rho_ao
602 TYPE(dft_control_type), POINTER :: dft_control
603 TYPE(mp_para_env_type), POINTER :: para_env
604 TYPE(particle_list_type), POINTER :: particles
605 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
606 TYPE(qs_rho_type), POINTER :: rho
607 TYPE(qs_scf_env_type), POINTER :: scf_env
608 TYPE(qs_subsys_type), POINTER :: subsys
609 TYPE(section_vals_type), POINTER :: dft_section, input
610
611 CALL timeset(routinen, handle)
612 NULLIFY (dft_control, particle_set, rho, ks_rmpv, dft_section, input, &
613 particles, subsys, para_env, rho_ao)
614 logger => cp_get_default_logger()
615 output_unit = cp_logger_get_default_io_unit(logger)
616
617 cpassert(ASSOCIATED(qs_env))
618 CALL get_qs_env(qs_env, &
619 dft_control=dft_control, &
620 particle_set=particle_set, &
621 rho=rho, &
622 matrix_ks=ks_rmpv, &
623 input=input, &
624 subsys=subsys, &
625 scf_env=scf_env, &
626 para_env=para_env)
627 CALL qs_subsys_get(subsys, particles=particles)
628 CALL qs_rho_get(rho, rho_ao=rho_ao)
629
630 ! Print MO information if requested
631 CALL qs_scf_write_mos(qs_env, scf_env, final_mos=.true.)
632
633 ! Aat the end of SCF printout the projected DOS for each atomic kind
634 dft_section => section_vals_get_subs_vals(input, "DFT")
635 IF (btest(cp_print_key_should_output(logger%iter_info, dft_section, "PRINT%PDOS") &
636 , cp_p_file)) THEN
637 cpwarn("PDOS not implemented for Semi-Empirical calculations!!")
638 END IF
639
640 ! Print the total density (electronic + core charge)
641 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
642 "DFT%PRINT%TOT_DENSITY_CUBE"), cp_p_file)) THEN
643 cpwarn("TOT_DENSITY_CUBE not implemented for Semi-Empirical calculations!!")
644 END IF
645
646 ! Write cube file with electron density
647 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
648 "DFT%PRINT%E_DENSITY_CUBE"), cp_p_file)) THEN
649 cpwarn("E_DENSITY_CUBE not implemented for Semi-Empirical calculations!!")
650 END IF ! print key
651
652 ! Write cube file with EFIELD
653 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
654 "DFT%PRINT%EFIELD_CUBE"), cp_p_file)) THEN
655 cpwarn("EFIELD_CUBE not implemented for Semi-Empirical calculations!!")
656 END IF ! print key
657
658 ! Write cube file with ELF
659 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
660 "DFT%PRINT%ELF_CUBE"), cp_p_file)) THEN
661 cpwarn("ELF function not implemented for Semi-Empirical calculations!!")
662 END IF ! print key
663
664 ! Print the hartree potential
665 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
666 "DFT%PRINT%V_HARTREE_CUBE"), cp_p_file)) THEN
667 cpwarn("V_HARTREE_CUBE not implemented for Semi-Empirical calculations!!")
668 END IF
669
670 ! Print the XC potential
671 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
672 "DFT%PRINT%V_XC_CUBE"), cp_p_file)) THEN
673 cpwarn("V_XC_CUBE not available for Semi-Empirical calculations!!")
674 END IF
675
676 ! Write the density matrix
677 CALL section_vals_val_get(input, "DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
678 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
679 "DFT%PRINT%AO_MATRICES/DENSITY"), cp_p_file)) THEN
680 iw = cp_print_key_unit_nr(logger, input, "DFT%PRINT%AO_MATRICES/DENSITY", &
681 extension=".Log")
682 CALL section_vals_val_get(input, "DFT%PRINT%AO_MATRICES%NDIGITS", i_val=after)
683 after = min(max(after, 1), 16)
684 DO ispin = 1, dft_control%nspins
685 CALL cp_dbcsr_write_sparse_matrix(rho_ao(ispin)%matrix, 4, after, qs_env, &
686 para_env, output_unit=iw, omit_headers=omit_headers)
687 END DO
688 CALL cp_print_key_finished_output(iw, logger, input, &
689 "DFT%PRINT%AO_MATRICES/DENSITY")
690 END IF
691
692 ! The Kohn-Sham matrix itself
693 IF (btest(cp_print_key_should_output(logger%iter_info, input, &
694 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"), cp_p_file)) THEN
695 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false., just_energy=.false.)
696 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
697 iw = cp_print_key_unit_nr(logger, input, "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX", &
698 extension=".Log")
699 CALL section_vals_val_get(input, "DFT%PRINT%AO_MATRICES%NDIGITS", i_val=after)
700 after = min(max(after, 1), 16)
701 CALL cp_dbcsr_write_sparse_matrix(ks_rmpv(1)%matrix, 4, after, qs_env, &
702 para_env, output_unit=iw, omit_headers=omit_headers)
703 CALL cp_print_key_finished_output(iw, logger, input, &
704 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
705 END IF
706
707 CALL timestop(handle)
708
709 END SUBROUTINE write_available_results
710
711END 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...
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
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_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.
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 (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.