(git:a145afa)
Loading...
Searching...
No Matches
qs_scf_output.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
9 USE admm_types, ONLY: admm_type
14 USE cp_dbcsr_api, ONLY: dbcsr_p_type,&
24 USE cp_output_handling, ONLY: cp_p_file,&
29 USE input_constants, ONLY: &
42 USE kahan_sum, ONLY: accurate_sum
43 USE kinds, ONLY: default_string_length,&
44 dp
45 USE kpoint_types, ONLY: kpoint_type
46 USE machine, ONLY: m_flush
49 USE physcon, ONLY: evolt,&
52 USE ps_implicit_types, ONLY: mixed_bc,&
56 USE pw_env_types, ONLY: pw_env_type
71 USE qs_mo_types, ONLY: allocate_mo_set,&
77 USE qs_rho_types, ONLY: qs_rho_get,&
80 USE qs_scf_types, ONLY: ot_method_nr,&
84#include "./base/base_uses.f90"
85
86 IMPLICIT NONE
87
88 PRIVATE
89
90 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_output'
91
92 PUBLIC :: qs_scf_loop_info, &
102
103CONTAINS
104
105! **************************************************************************************************
106!> \brief writes a summary of information after scf
107!> \param output_unit ...
108!> \param qs_env ...
109! **************************************************************************************************
110 SUBROUTINE qs_scf_print_summary(output_unit, qs_env)
111 INTEGER, INTENT(IN) :: output_unit
112 TYPE(qs_environment_type), POINTER :: qs_env
113
114 INTEGER :: nelectron_total
115 LOGICAL :: gapw, gapw_xc, qmmm
116 TYPE(dft_control_type), POINTER :: dft_control
117 TYPE(qs_charges_type), POINTER :: qs_charges
118 TYPE(qs_energy_type), POINTER :: energy
119 TYPE(qs_rho_type), POINTER :: rho
120 TYPE(qs_scf_env_type), POINTER :: scf_env
121
122 NULLIFY (rho, energy, dft_control, scf_env, qs_charges)
123 CALL get_qs_env(qs_env=qs_env, rho=rho, energy=energy, dft_control=dft_control, &
124 scf_env=scf_env, qs_charges=qs_charges)
125
126 gapw = dft_control%qs_control%gapw
127 gapw_xc = dft_control%qs_control%gapw_xc
128 qmmm = qs_env%qmmm
129 nelectron_total = scf_env%nelectron
130
131 CALL qs_scf_print_scf_summary(output_unit, rho, qs_charges, energy, nelectron_total, &
132 dft_control, qmmm, qs_env, gapw, gapw_xc)
133
134 END SUBROUTINE qs_scf_print_summary
135
136! **************************************************************************************************
137!> \brief writes basic information at the beginning of an scf run
138!> \param output_unit ...
139!> \param mos ...
140!> \param dft_control ...
141!> \param ndep ...
142! **************************************************************************************************
143 SUBROUTINE qs_scf_initial_info(output_unit, mos, dft_control, ndep)
144 INTEGER :: output_unit
145 TYPE(mo_set_type), DIMENSION(:), INTENT(IN) :: mos
146 TYPE(dft_control_type), POINTER :: dft_control
147 INTEGER, INTENT(IN) :: ndep
148
149 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_scf_initial_info'
150
151 INTEGER :: handle, homo, ispin, nao, &
152 nelectron_spin, nmo
153
154 CALL timeset(routinen, handle)
155
156 IF (output_unit > 0) THEN
157 DO ispin = 1, dft_control%nspins
158 CALL get_mo_set(mo_set=mos(ispin), &
159 homo=homo, &
160 nelectron=nelectron_spin, &
161 nao=nao, &
162 nmo=nmo)
163 IF (dft_control%nspins > 1) THEN
164 WRITE (unit=output_unit, fmt="(/,T2,A,I2)") "Spin", ispin
165 END IF
166 WRITE (unit=output_unit, fmt="(/,(T2,A,T71,I10))") &
167 "Number of electrons:", nelectron_spin, &
168 "Number of occupied orbitals:", homo, &
169 "Number of molecular orbitals:", nmo
170 END DO
171 WRITE (unit=output_unit, fmt="(/,(T2,A,T71,I10))") &
172 "Number of orbital functions:", nao, &
173 "Number of independent orbital functions:", nao - ndep
174 END IF
175
176 CALL timestop(handle)
177
178 END SUBROUTINE qs_scf_initial_info
179
180! **************************************************************************************************
181!> \brief Write the MO eigenvector, eigenvalues, and occupation numbers to the output unit
182!> \param qs_env ...
183!> \param scf_env ...
184!> \param final_mos ...
185!> \par History
186!> - Revise MO printout to enable eigenvalues with OT (05.05.2021, MK)
187! **************************************************************************************************
188 SUBROUTINE qs_scf_write_mos(qs_env, scf_env, final_mos)
189 TYPE(qs_environment_type), POINTER :: qs_env
190 TYPE(qs_scf_env_type), POINTER :: scf_env
191 LOGICAL, INTENT(IN) :: final_mos
192
193 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_scf_write_mos'
194
195 CHARACTER(LEN=2) :: solver_method
196 CHARACTER(LEN=3*default_string_length) :: message
197 CHARACTER(LEN=5) :: spin
198 CHARACTER(LEN=default_string_length), &
199 DIMENSION(:), POINTER :: tmpstringlist
200 INTEGER :: handle, homo, ikp, ispin, iw, kpoint, &
201 nao, nelectron, nkp, nmo, nspin, numo
202 INTEGER, DIMENSION(2) :: nmos_occ
203 INTEGER, DIMENSION(:), POINTER :: mo_index_range
204 LOGICAL :: do_kpoints, do_printout, print_eigvals, &
205 print_eigvecs, print_mo_info, &
206 print_occup, print_occup_stats
207 REAL(kind=dp) :: flexible_electron_count, maxocc, n_el_f, &
208 occup_stats_occ_threshold
209 REAL(kind=dp), DIMENSION(:), POINTER :: mo_eigenvalues, umo_eigenvalues
210 TYPE(admm_type), POINTER :: admm_env
211 TYPE(cp_blacs_env_type), POINTER :: blacs_env
212 TYPE(cp_fm_struct_type), POINTER :: fm_struct_tmp
213 TYPE(cp_fm_type), POINTER :: mo_coeff, umo_coeff
214 TYPE(cp_logger_type), POINTER :: logger
215 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks, s
216 TYPE(dbcsr_type), POINTER :: matrix_ks, matrix_s, mo_coeff_deriv
217 TYPE(dft_control_type), POINTER :: dft_control
218 TYPE(kpoint_type), POINTER :: kpoints
219 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
220 TYPE(mo_set_type), POINTER :: mo_set, umo_set
221 TYPE(mp_para_env_type), POINTER :: para_env
222 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
223 TYPE(preconditioner_type), POINTER :: local_preconditioner
224 TYPE(qs_environment_type), POINTER :: cart_overlap_qs_env
225 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
226 TYPE(scf_control_type), POINTER :: scf_control
227 TYPE(section_vals_type), POINTER :: dft_section, input
228
229 CALL timeset(routinen, handle)
230
231 cpassert(ASSOCIATED(qs_env))
232
233 ! Retrieve the required information for the requested print output
234 CALL get_qs_env(qs_env, &
235 blacs_env=blacs_env, &
236 dft_control=dft_control, &
237 do_kpoints=do_kpoints, &
238 input=input, &
239 qs_kind_set=qs_kind_set, &
240 para_env=para_env, &
241 particle_set=particle_set, &
242 scf_control=scf_control)
243
244 ! Quick return, if no printout of MO information is requested
245 dft_section => section_vals_get_subs_vals(input, "DFT")
246 CALL section_vals_val_get(dft_section, "PRINT%MO%EIGENVALUES", l_val=print_eigvals)
247 CALL section_vals_val_get(dft_section, "PRINT%MO%EIGENVECTORS", l_val=print_eigvecs)
248 CALL section_vals_val_get(dft_section, "PRINT%MO%OCCUPATION_NUMBERS", l_val=print_occup)
249 CALL section_vals_val_get(dft_section, "PRINT%MO%OCCUPATION_NUMBERS_STATS", c_vals=tmpstringlist)
250
251 print_occup_stats = .false.
252 occup_stats_occ_threshold = 1e-6_dp
253 IF (SIZE(tmpstringlist) > 0) THEN ! the lone_keyword_c_vals doesn't work as advertised, handle it manually
254 print_occup_stats = .true.
255 IF (len_trim(tmpstringlist(1)) > 0) THEN
256 READ (tmpstringlist(1), *) print_occup_stats
257 END IF
258 END IF
259 IF (SIZE(tmpstringlist) > 1) THEN
260 READ (tmpstringlist(2), *) occup_stats_occ_threshold
261 END IF
262
263 logger => cp_get_default_logger()
264 print_mo_info = (cp_print_key_should_output(logger%iter_info, dft_section, "PRINT%MO") /= 0)
265
266 IF ((.NOT. print_mo_info) .OR. (.NOT. (print_eigvals .OR. print_eigvecs .OR. print_occup .OR. print_occup_stats))) THEN
267 CALL timestop(handle)
268 RETURN
269 END IF
270
271 NULLIFY (fm_struct_tmp)
272 NULLIFY (mo_coeff)
273 NULLIFY (mo_coeff_deriv)
274 NULLIFY (mo_eigenvalues)
275 NULLIFY (mo_set)
276 NULLIFY (umo_coeff)
277 NULLIFY (umo_eigenvalues)
278 NULLIFY (umo_set)
279
280 do_printout = .true.
281 nspin = dft_control%nspins
282 nmos_occ = 0
283
284 ! Check, if we have k points
285 IF (do_kpoints) THEN
286 CALL get_qs_env(qs_env, kpoints=kpoints)
287 nkp = SIZE(kpoints%kp_env)
288 ELSE
289 CALL get_qs_env(qs_env, matrix_ks=ks, matrix_s=s)
290 cpassert(ASSOCIATED(ks))
291 cpassert(ASSOCIATED(s))
292 nkp = 1
293 END IF
294
295 kp_loop: DO ikp = 1, nkp
296
297 IF (do_kpoints) THEN
298 mos => kpoints%kp_env(ikp)%kpoint_env%mos(1, :)
299 kpoint = ikp
300 ELSE
301 CALL get_qs_env(qs_env, matrix_ks=ks, mos=mos)
302 kpoint = 0 ! Gamma point only
303 END IF
304 cpassert(ASSOCIATED(mos))
305
306 ! Prepare MO information for printout
307 DO ispin = 1, nspin
308
309 ! Calculate MO eigenvalues and eigenvector when OT is used
310 IF (scf_env%method == ot_method_nr) THEN
311
312 solver_method = "OT"
313
314 IF (do_kpoints) THEN
315 cpabort("The OT method is not implemented for k points")
316 END IF
317
318 IF (final_mos) THEN
319
320 matrix_ks => ks(ispin)%matrix
321 matrix_s => s(1)%matrix
322
323 ! With ADMM, we have to modify the Kohn-Sham matrix
324 IF (dft_control%do_admm) THEN
325 CALL get_qs_env(qs_env, admm_env=admm_env)
326 CALL admm_correct_for_eigenvalues(ispin, admm_env, matrix_ks)
327 END IF
328
329 mo_set => mos(ispin)
330 CALL get_mo_set(mo_set=mo_set, &
331 mo_coeff=mo_coeff, &
332 eigenvalues=mo_eigenvalues, &
333 homo=homo, &
334 maxocc=maxocc, &
335 nelectron=nelectron, &
336 n_el_f=n_el_f, &
337 nao=nao, &
338 nmo=nmo, &
339 flexible_electron_count=flexible_electron_count)
340
341 IF (ASSOCIATED(qs_env%mo_derivs)) THEN
342 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
343 ELSE
344 mo_coeff_deriv => null()
345 END IF
346
347 ! Update the eigenvalues of the occupied orbitals
348 CALL calculate_subspace_eigenvalues(orbitals=mo_coeff, &
349 ks_matrix=matrix_ks, &
350 evals_arg=mo_eigenvalues, &
351 co_rotate_dbcsr=mo_coeff_deriv)
352 CALL set_mo_occupation(mo_set=mo_set)
353
354 ! Retrieve the index of the last MO for which a printout is requested
355 mo_index_range => section_get_ivals(dft_section, "PRINT%MO%MO_INDEX_RANGE")
356 cpassert(ASSOCIATED(mo_index_range))
357 IF (mo_index_range(2) < 0) THEN
358 numo = nao - homo
359 ELSE
360 numo = min(mo_index_range(2) - homo, nao - homo)
361 END IF
362
363 ! Calculate the unoccupied MO set (umo_set) with OT if needed
364 IF (numo > 0) THEN
365
366 ! Create temporary virtual MO set for printout
367 CALL cp_fm_struct_create(fm_struct_tmp, &
368 context=blacs_env, &
369 para_env=para_env, &
370 nrow_global=nao, &
371 ncol_global=numo)
372 ALLOCATE (umo_set)
373 CALL allocate_mo_set(mo_set=umo_set, &
374 nao=nao, &
375 nmo=numo, &
376 nelectron=0, &
377 n_el_f=n_el_f, &
378 maxocc=maxocc, &
379 flexible_electron_count=flexible_electron_count)
380 CALL init_mo_set(mo_set=umo_set, &
381 fm_struct=fm_struct_tmp, &
382 name="Temporary MO set (unoccupied MOs only) for printout")
383 CALL cp_fm_struct_release(fm_struct_tmp)
384 CALL get_mo_set(mo_set=umo_set, &
385 mo_coeff=umo_coeff, &
386 eigenvalues=umo_eigenvalues)
387
388 ! Prepare printout of the additional unoccupied MOs when OT is being employed
389 CALL cp_fm_init_random(umo_coeff)
390
391 ! The FULL_ALL preconditioner makes not much sense for the unoccupied orbitals
392 NULLIFY (local_preconditioner)
393 IF (ASSOCIATED(scf_env%ot_preconditioner)) THEN
394 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
395 IF (local_preconditioner%in_use == ot_precond_full_all) THEN
396 NULLIFY (local_preconditioner)
397 END IF
398 END IF
399
400 ! Calculate the MO information for the request MO index range
401 CALL ot_eigensolver(matrix_h=matrix_ks, &
402 matrix_s=matrix_s, &
403 matrix_c_fm=umo_coeff, &
404 matrix_orthogonal_space_fm=mo_coeff, &
405 eps_gradient=scf_control%eps_lumos, &
406 preconditioner=local_preconditioner, &
407 iter_max=scf_control%max_iter_lumos, &
408 size_ortho_space=nmo)
409
410 CALL calculate_subspace_eigenvalues(orbitals=umo_coeff, &
411 ks_matrix=matrix_ks, &
412 evals_arg=umo_eigenvalues)
413 CALL set_mo_occupation(mo_set=umo_set)
414
415 END IF ! numo > 0
416
417 ! With ADMM, we have to undo the modification of the Kohn-Sham matrix
418 IF (dft_control%do_admm) THEN
419 CALL admm_uncorrect_for_eigenvalues(ispin, admm_env, matrix_ks)
420 END IF
421
422 ELSE
423
424 message = "The MO information is only calculated after SCF convergence "// &
425 "is achieved when the orbital transformation (OT) method is used"
426 cpwarn(trim(message))
427 do_printout = .false.
428 EXIT kp_loop
429
430 END IF ! final MOs
431
432 ELSE
433
434 solver_method = "TD"
435 mo_set => mos(ispin)
436 NULLIFY (umo_set)
437
438 END IF ! OT is used
439
440 ! Print MO information
441 NULLIFY (cart_overlap_qs_env)
442 IF ((ikp == 1) .AND. (ispin == 1)) cart_overlap_qs_env => qs_env
443 IF (nspin > 1) THEN
444 SELECT CASE (ispin)
445 CASE (1)
446 spin = "ALPHA"
447 CASE (2)
448 spin = "BETA"
449 CASE DEFAULT
450 cpabort("Invalid spin")
451 END SELECT
452 IF (ASSOCIATED(umo_set)) THEN
453 CALL write_mo_set_to_output_unit(mo_set, qs_kind_set, particle_set, dft_section, 4, kpoint, &
454 final_mos=final_mos, spin=trim(spin), solver_method=solver_method, &
455 umo_set=umo_set, qs_env=cart_overlap_qs_env)
456 ELSE
457 CALL write_mo_set_to_output_unit(mo_set, qs_kind_set, particle_set, dft_section, 4, kpoint, &
458 final_mos=final_mos, spin=trim(spin), solver_method=solver_method, &
459 qs_env=cart_overlap_qs_env)
460 END IF
461 ELSE
462 IF (ASSOCIATED(umo_set)) THEN
463 CALL write_mo_set_to_output_unit(mo_set, qs_kind_set, particle_set, dft_section, 4, kpoint, &
464 final_mos=final_mos, solver_method=solver_method, &
465 umo_set=umo_set, qs_env=cart_overlap_qs_env)
466 ELSE
467 CALL write_mo_set_to_output_unit(mo_set, qs_kind_set, particle_set, dft_section, 4, kpoint, &
468 final_mos=final_mos, solver_method=solver_method, &
469 qs_env=cart_overlap_qs_env)
470 END IF
471 END IF
472
473 nmos_occ(ispin) = max(nmos_occ(ispin), count(mo_set%occupation_numbers > occup_stats_occ_threshold))
474
475 ! Deallocate temporary objects needed for OT
476 IF (scf_env%method == ot_method_nr) THEN
477 IF (ASSOCIATED(umo_set)) THEN
478 CALL deallocate_mo_set(umo_set)
479 DEALLOCATE (umo_set)
480 END IF
481 NULLIFY (matrix_ks)
482 NULLIFY (matrix_s)
483 END IF
484 NULLIFY (mo_set)
485
486 END DO ! ispin
487
488 END DO kp_loop
489
490 IF (do_printout .AND. print_mo_info .AND. print_occup_stats) THEN
491 iw = cp_print_key_unit_nr(logger, dft_section, "PRINT%MO", &
492 ignore_should_output=print_mo_info, &
493 extension=".MOLog")
494 IF (iw > 0) THEN
495 IF (SIZE(mos) > 1) THEN
496 WRITE (unit=iw, fmt="(A,I4)") " MO| Total occupied (ALPHA):", nmos_occ(1)
497 WRITE (unit=iw, fmt="(A,I4)") " MO| Total occupied (BETA): ", nmos_occ(2)
498 ELSE
499 WRITE (unit=iw, fmt="(A,I4)") " MO| Total occupied: ", nmos_occ(1)
500 END IF
501 WRITE (unit=iw, fmt="(A)") ""
502 END IF
503 CALL cp_print_key_finished_output(iw, logger, dft_section, "PRINT%MO", &
504 ignore_should_output=print_mo_info)
505 END IF
506
507 CALL timestop(handle)
508
509 END SUBROUTINE qs_scf_write_mos
510
511! **************************************************************************************************
512!> \brief writes basic information obtained in a scf outer loop step
513!> \param output_unit ...
514!> \param scf_control ...
515!> \param scf_env ...
516!> \param energy ...
517!> \param total_steps ...
518!> \param should_stop ...
519!> \param outer_loop_converged ...
520! **************************************************************************************************
521 SUBROUTINE qs_scf_outer_loop_info(output_unit, scf_control, scf_env, &
522 energy, total_steps, should_stop, outer_loop_converged)
523 INTEGER :: output_unit
524 TYPE(scf_control_type), POINTER :: scf_control
525 TYPE(qs_scf_env_type), POINTER :: scf_env
526 TYPE(qs_energy_type), POINTER :: energy
527 INTEGER :: total_steps
528 LOGICAL, INTENT(IN) :: should_stop, outer_loop_converged
529
530 REAL(kind=dp) :: outer_loop_eps
531
532 outer_loop_eps = sqrt(maxval(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count)**2))
533 IF (output_unit > 0) WRITE (output_unit, '(/,T3,A,I4,A,E10.2,A,F22.10)') &
534 "outer SCF iter = ", scf_env%outer_scf%iter_count, &
535 " RMS gradient = ", outer_loop_eps, " energy =", energy%total
536
537 IF (outer_loop_converged) THEN
538 IF (output_unit > 0) WRITE (output_unit, '(T3,A,I4,A,I4,A,/)') &
539 "outer SCF loop converged in", scf_env%outer_scf%iter_count, &
540 " iterations or ", total_steps, " steps"
541 ELSE IF (scf_env%outer_scf%iter_count > scf_control%outer_scf%max_scf &
542 .OR. should_stop) THEN
543 IF (output_unit > 0) WRITE (output_unit, '(T3,A,I4,A,I4,A,/)') &
544 "outer SCF loop FAILED to converge after ", &
545 scf_env%outer_scf%iter_count, " iterations or ", total_steps, " steps"
546 END IF
547
548 END SUBROUTINE qs_scf_outer_loop_info
549
550! **************************************************************************************************
551!> \brief writes basic information obtained in a scf step
552!> \param scf_env ...
553!> \param output_unit ...
554!> \param just_energy ...
555!> \param t1 ...
556!> \param t2 ...
557!> \param energy ...
558! **************************************************************************************************
559 SUBROUTINE qs_scf_loop_info(scf_env, output_unit, just_energy, t1, t2, energy)
560
561 TYPE(qs_scf_env_type), POINTER :: scf_env
562 INTEGER :: output_unit
563 LOGICAL :: just_energy
564 REAL(kind=dp) :: t1, t2
565 TYPE(qs_energy_type), POINTER :: energy
566
567 IF ((output_unit > 0) .AND. scf_env%print_iter_line) THEN
568 IF (just_energy) THEN
569 WRITE (unit=output_unit, &
570 fmt="(T2,A,1X,A,T20,E8.2,1X,F6.1,16X,F20.10)") &
571 " -", trim(scf_env%iter_method), scf_env%iter_param, t2 - t1, energy%total
572 ELSE
573 IF ((abs(scf_env%iter_delta) < 1.0e-8_dp) .OR. &
574 (abs(scf_env%iter_delta) >= 1.0e5_dp)) THEN
575 WRITE (unit=output_unit, &
576 fmt="(T2,I5,1X,A,T20,E8.2,1X,F6.1,1X,ES14.4,1X,F20.10,1X,ES9.2)") &
577 scf_env%iter_count, trim(scf_env%iter_method), scf_env%iter_param, &
578 t2 - t1, scf_env%iter_delta, energy%total, energy%total - energy%tot_old
579 ELSE
580 WRITE (unit=output_unit, &
581 fmt="(T2,I5,1X,A,T20,E8.2,1X,F6.1,1X,F14.8,1X,F20.10,1X,ES9.2)") &
582 scf_env%iter_count, trim(scf_env%iter_method), scf_env%iter_param, &
583 t2 - t1, scf_env%iter_delta, energy%total, energy%total - energy%tot_old
584 END IF
585 END IF
586 END IF
587
588 END SUBROUTINE qs_scf_loop_info
589
590! **************************************************************************************************
591!> \brief writes rather detailed summary of densities and energies
592!> after the SCF
593!> \param output_unit ...
594!> \param rho ...
595!> \param qs_charges ...
596!> \param energy ...
597!> \param nelectron_total ...
598!> \param dft_control ...
599!> \param qmmm ...
600!> \param qs_env ...
601!> \param gapw ...
602!> \param gapw_xc ...
603!> \par History
604!> 03.2006 created [Joost VandeVondele]
605!> 10.2019 print dipole moment [SGh]
606!> 11.2022 print SCCS results [MK]
607! **************************************************************************************************
608 SUBROUTINE qs_scf_print_scf_summary(output_unit, rho, qs_charges, energy, nelectron_total, &
609 dft_control, qmmm, qs_env, gapw, gapw_xc)
610 INTEGER, INTENT(IN) :: output_unit
611 TYPE(qs_rho_type), POINTER :: rho
612 TYPE(qs_charges_type), POINTER :: qs_charges
613 TYPE(qs_energy_type), POINTER :: energy
614 INTEGER, INTENT(IN) :: nelectron_total
615 TYPE(dft_control_type), POINTER :: dft_control
616 LOGICAL, INTENT(IN) :: qmmm
617 TYPE(qs_environment_type), POINTER :: qs_env
618 LOGICAL, INTENT(IN) :: gapw, gapw_xc
619
620 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_scf_print_scf_summary'
621
622 INTEGER :: bc, handle, ispin, psolver
623 REAL(kind=dp) :: e_extrapolated, exc1_energy, exc_energy, &
624 implicit_ps_ehartree, tot1_h, tot1_s
625 REAL(kind=dp), DIMENSION(:), POINTER :: tot_rho_r
626 TYPE(pw_env_type), POINTER :: pw_env
627 TYPE(scf_control_type), POINTER :: scf_control
628
629 NULLIFY (tot_rho_r, pw_env)
630 CALL timeset(routinen, handle)
631
632 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, scf_control=scf_control)
633 psolver = pw_env%poisson_env%parameters%solver
634
635 IF (output_unit > 0) THEN
636 CALL qs_rho_get(rho, tot_rho_r=tot_rho_r)
637 IF (.NOT. (dft_control%qs_control%semi_empirical .OR. &
638 dft_control%qs_control%xtb .OR. &
639 dft_control%qs_control%dftb)) THEN
640 WRITE (unit=output_unit, fmt="(/,(T3,A,T41,2F20.10))") &
641 "Electronic density on regular grids: ", &
642 accurate_sum(tot_rho_r), &
643 accurate_sum(tot_rho_r) + nelectron_total, &
644 "Core density on regular grids:", &
645 qs_charges%total_rho_core_rspace, &
646 qs_charges%total_rho_core_rspace + &
647 qs_charges%total_rho1_hard_nuc - &
648 REAL(nelectron_total + dft_control%charge, dp)
649
650 IF (dft_control%correct_surf_dip) THEN
651 WRITE (unit=output_unit, fmt="((T3,A,/,T3,A,T41,F20.10))") &
652 "Total dipole moment perpendicular to ", &
653 "the slab [electrons-Angstroem]: ", &
654 qs_env%surface_dipole_moment
655 END IF
656
657 IF (gapw) THEN
658 tot1_h = qs_charges%total_rho1_hard(1)
659 tot1_s = qs_charges%total_rho1_soft(1)
660 DO ispin = 2, dft_control%nspins
661 tot1_h = tot1_h + qs_charges%total_rho1_hard(ispin)
662 tot1_s = tot1_s + qs_charges%total_rho1_soft(ispin)
663 END DO
664 WRITE (unit=output_unit, fmt="((T3,A,T41,2F20.10))") &
665 "Hard and soft densities (Lebedev):", &
666 tot1_h, tot1_s
667 WRITE (unit=output_unit, fmt="(T3,A,T41,F20.10)") &
668 "Total Rho_soft + Rho1_hard - Rho1_soft (r-space): ", &
669 accurate_sum(tot_rho_r) + tot1_h - tot1_s, &
670 "Total charge density (r-space): ", &
671 accurate_sum(tot_rho_r) + tot1_h - tot1_s &
672 + qs_charges%total_rho_core_rspace &
673 + qs_charges%total_rho1_hard_nuc
674 IF (qs_charges%total_rho1_hard_nuc /= 0.0_dp) THEN
675 WRITE (unit=output_unit, fmt="(T3,A,T41,F20.10)") &
676 "Total CNEO nuc. char. den. (Lebedev): ", &
677 qs_charges%total_rho1_hard_nuc, &
678 "Total CNEO soft char. den. (Lebedev): ", &
679 qs_charges%total_rho1_soft_nuc_lebedev, &
680 "Total CNEO soft char. den. (r-space): ", &
681 qs_charges%total_rho1_soft_nuc_rspace, &
682 "Total soft Rho_e+n+0 (g-space):", &
683 qs_charges%total_rho_gspace
684 ELSE
685 WRITE (unit=output_unit, fmt="(T3,A,T41,F20.10)") &
686 "Total Rho_soft + Rho0_soft (g-space):", &
687 qs_charges%total_rho_gspace
688 END IF
689 ! only add total_rho1_hard_nuc for gapw as cneo requires gapw
690 ELSE
691 WRITE (unit=output_unit, fmt="(T3,A,T41,F20.10)") &
692 "Total charge density on r-space grids: ", &
693 accurate_sum(tot_rho_r) + &
694 qs_charges%total_rho_core_rspace, &
695 "Total charge density g-space grids: ", &
696 qs_charges%total_rho_gspace
697 END IF
698 END IF
699 IF (dft_control%qs_control%semi_empirical) THEN
700 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
701 "Core-core repulsion energy [eV]: ", energy%core_overlap*evolt, &
702 "Core Hamiltonian energy [eV]: ", energy%core*evolt, &
703 "Two-electron integral energy [eV]: ", energy%hartree*evolt, &
704 "Electronic energy [eV]: ", &
705 (energy%core + 0.5_dp*energy%hartree)*evolt
706 IF (energy%dispersion /= 0.0_dp) THEN
707 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
708 "Dispersion energy [eV]: ", energy%dispersion*evolt
709 END IF
710 ELSE IF (dft_control%qs_control%dftb) THEN
711 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
712 "Core Hamiltonian energy: ", energy%core, &
713 "Repulsive potential energy: ", energy%repulsive, &
714 "Electronic energy: ", energy%hartree, &
715 "Dispersion energy: ", energy%dispersion
716 IF (energy%dftb3 /= 0.0_dp) THEN
717 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
718 "DFTB3 3rd order energy: ", energy%dftb3
719 END IF
720 IF (energy%efield /= 0.0_dp) THEN
721 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
722 "Electric field interaction energy: ", energy%efield
723 END IF
724 ELSE IF (dft_control%qs_control%xtb) THEN
725 IF (dft_control%qs_control%xtb_control%do_tblite) THEN
726 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
727 "Core Hamiltonian energy: ", energy%core, &
728 "Repulsive potential energy: ", energy%repulsive, &
729 "Electrostatic energy: ", energy%el_stat, &
730 "Self-consistent dispersion energy: ", energy%dispersion_sc, &
731 "Non-self consistent dispersion energy: ", energy%dispersion, &
732 "Correction for halogen bonding: ", energy%xtb_xb_inter
733 ELSE
734 IF (dft_control%qs_control%xtb_control%gfn_type == 0) THEN
735 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
736 "Core Hamiltonian energy: ", energy%core, &
737 "Repulsive potential energy: ", energy%repulsive, &
738 "SRB Correction energy: ", energy%srb, &
739 "Charge equilibration energy: ", energy%eeq, &
740 "Dispersion energy: ", energy%dispersion
741 ELSE IF (dft_control%qs_control%xtb_control%gfn_type == 1) THEN
742 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
743 "Core Hamiltonian energy: ", energy%core, &
744 "Repulsive potential energy: ", energy%repulsive, &
745 "Electronic energy: ", energy%hartree, &
746 "DFTB3 3rd order energy: ", energy%dftb3, &
747 "Dispersion energy: ", energy%dispersion
748 IF (dft_control%qs_control%xtb_control%xb_interaction) THEN
749 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
750 "Correction for halogen bonding: ", energy%xtb_xb_inter
751 END IF
752 ELSE IF (dft_control%qs_control%xtb_control%gfn_type == 2) THEN
753 cpabort("gfn_typ 2 NYA")
754 ELSE
755 cpabort("invalid gfn_typ")
756 END IF
757 END IF
758 IF (dft_control%qs_control%xtb_control%do_nonbonded) THEN
759 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
760 "Correction for nonbonded interactions: ", energy%xtb_nonbonded
761 END IF
762 IF (energy%efield /= 0.0_dp) THEN
763 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
764 "Electric field interaction energy: ", energy%efield
765 END IF
766 ELSE
767 IF (dft_control%do_admm) THEN
768 exc_energy = energy%exc + energy%exc_aux_fit
769 IF (gapw .OR. gapw_xc) exc1_energy = energy%exc1 + energy%exc1_aux_fit
770 ELSE
771 exc_energy = energy%exc
772 IF (gapw .OR. gapw_xc) exc1_energy = energy%exc1
773 END IF
774
775 IF (psolver == pw_poisson_implicit) THEN
776 implicit_ps_ehartree = pw_env%poisson_env%implicit_env%ehartree
777 bc = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
778 SELECT CASE (bc)
780 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
781 "Overlap energy of the core charge distribution:", energy%core_overlap, &
782 "Self energy of the core charge distribution: ", energy%core_self, &
783 "Core Hamiltonian energy: ", energy%core, &
784 "Hartree energy: ", implicit_ps_ehartree, &
785 "Electric enthalpy: ", energy%hartree, &
786 "Exchange-correlation energy: ", exc_energy
787 CASE (periodic_bc, neumann_bc)
788 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
789 "Overlap energy of the core charge distribution:", energy%core_overlap, &
790 "Self energy of the core charge distribution: ", energy%core_self, &
791 "Core Hamiltonian energy: ", energy%core, &
792 "Hartree energy: ", energy%hartree, &
793 "Exchange-correlation energy: ", exc_energy
794 END SELECT
795 ELSE
796 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
797 "Overlap energy of the core charge distribution:", energy%core_overlap, &
798 "Self energy of the core charge distribution: ", energy%core_self, &
799 "Core Hamiltonian energy: ", energy%core, &
800 "Hartree energy: ", energy%hartree, &
801 "Exchange-correlation energy: ", exc_energy
802 END IF
803 IF (energy%e_hartree /= 0.0_dp) THEN
804 WRITE (unit=output_unit, fmt="(T3,A,/,T3,A,T56,F25.14)") &
805 "Coulomb Electron-Electron Interaction Energy ", &
806 "- Already included in the total Hartree term ", energy%e_hartree
807 END IF
808 IF (energy%ex /= 0.0_dp) THEN
809 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
810 "Hartree-Fock Exchange energy: ", energy%ex
811 END IF
812 IF (energy%dispersion /= 0.0_dp) THEN
813 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
814 "Dispersion energy: ", energy%dispersion
815 END IF
816 IF (energy%gcp /= 0.0_dp) THEN
817 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
818 "gCP energy: ", energy%gcp
819 END IF
820 IF (energy%efield /= 0.0_dp) THEN
821 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
822 "Electric field interaction energy: ", energy%efield
823 END IF
824 IF (gapw) THEN
825 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
826 "GAPW| Exc from hard and soft atomic rho1: ", exc1_energy, &
827 "GAPW| local Eh = 1 center integrals: ", energy%hartree_1c
828 END IF
829 IF (gapw_xc) THEN
830 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
831 "GAPW_XC| Exc from hard and soft atomic rho1: ", exc1_energy
832 END IF
833 IF (energy%core_cneo /= 0.0_dp) THEN
834 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
835 "CNEO| quantum nuclear core energy: ", energy%core_cneo
836 END IF
837 END IF
838 IF (dft_control%hairy_probes .EQV. .true.) THEN
839 WRITE (unit=output_unit, fmt="((T3,A,T56,F25.14))") &
840 "Electronic entropic energy:", energy%kTS
841 WRITE (unit=output_unit, fmt="((T3,A,T56,F25.14))") &
842 "Fermi energy:", energy%efermi
843 END IF
844 IF (dft_control%smear) THEN
845 SELECT CASE (scf_control%smear%method)
847 ! kTS does not have physical meaning in these smearing methods
848 WRITE (unit=output_unit, fmt="((T3,A,T56,F25.14))") &
849 "Smearing free energy correction:", energy%kTS
850 CASE DEFAULT
851 WRITE (unit=output_unit, fmt="((T3,A,T56,F25.14))") &
852 "Electronic entropic energy:", energy%kTS
853 END SELECT
854 WRITE (unit=output_unit, fmt="((T3,A,T56,F25.14))") &
855 "Fermi energy:", energy%efermi
856 END IF
857 IF (dft_control%dft_plus_u) THEN
858 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
859 "DFT+U energy:", energy%dft_plus_u
860 END IF
861 IF (dft_control%do_sccs) THEN
862 WRITE (unit=output_unit, fmt="(A)") ""
863 CALL print_sccs_results(energy, dft_control%sccs_control, output_unit)
864 END IF
865 IF (qmmm) THEN
866 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
867 "QM/MM Electrostatic energy: ", energy%qmmm_el
868 IF (qs_env%qmmm_env_qm%image_charge) THEN
869 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
870 "QM/MM image charge energy: ", energy%image_charge
871 END IF
872 END IF
873 IF (dft_control%qs_control%mulliken_restraint) THEN
874 WRITE (unit=output_unit, fmt="(T3,A,T56,F25.14)") &
875 "Mulliken restraint energy: ", energy%mulliken
876 END IF
877 IF (dft_control%qs_control%semi_empirical) THEN
878 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
879 "Total energy [eV]: ", energy%total*evolt
880 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
881 "Atomic reference energy [eV]: ", energy%core_self*evolt, &
882 "Heat of formation [kcal/mol]: ", &
883 (energy%total + energy%core_self)*kcalmol
884 ELSE
885 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
886 "Total energy: ", energy%total
887 IF (dft_control%smear) THEN
888 SELECT CASE (scf_control%smear%method)
889 CASE (smear_fermi_dirac)
890 e_extrapolated = energy%total - 0.5_dp*energy%kTS
891 WRITE (unit=output_unit, fmt="((T3,A,T56,F25.14))") &
892 "Total energy (extrapolated to T->0): ", e_extrapolated
893 IF (scf_control%gce%do_gce) THEN
894 WRITE (unit=output_unit, fmt="(/,(T3,A,T56,F25.14))") &
895 "GCE work function [eV]: ", scf_control%gce%prev_workfunction*evolt
896 WRITE (unit=output_unit, fmt="((T3,A,T56,ES25.10))") &
897 "GCE WF-TWF [eV]: ", (scf_control%gce%prev_workfunction - &
898 scf_control%gce%target_workfunction)*evolt
899 WRITE (unit=output_unit, fmt="((T3,A,T56,F25.14))") &
900 "GCE charge [e]: ", dft_control%pcc_control%charge
901 WRITE (unit=output_unit, fmt="((T3,A,T56,F25.14))") &
902 "GCE free energy: ", (dft_control%pcc_control%charge + dft_control%charge) &
903 *scf_control%gce%prev_workfunction*evolt
904 END IF
905 CASE (smear_gaussian)
906 e_extrapolated = energy%total - 0.5_dp*energy%kTS
907 WRITE (unit=output_unit, fmt="((T3,A,T56,F25.14))") &
908 "Total energy (extrapolated to sigma->0): ", e_extrapolated
909 CASE (smear_mp, smear_mv)
910 ! Sigma->0 extrapolation does not apply to MP or MV method.
911 END SELECT
912 END IF
913 END IF
914 IF (qmmm) THEN
915 IF (qs_env%qmmm_env_qm%image_charge) THEN
916 CALL print_image_coefficients(qs_env%image_coeff, qs_env)
917 END IF
918 END IF
919 CALL m_flush(output_unit)
920 END IF
921
922 CALL timestop(handle)
923
924 END SUBROUTINE qs_scf_print_scf_summary
925
926! **************************************************************************************************
927!> \brief collects the 'heavy duty' printing tasks out of the SCF loop
928!> \param qs_env ...
929!> \param scf_env ...
930!> \param para_env ...
931!> \par History
932!> 03.2006 created [Joost VandeVondele]
933! **************************************************************************************************
934 SUBROUTINE qs_scf_loop_print(qs_env, scf_env, para_env)
935 TYPE(qs_environment_type), POINTER :: qs_env
936 TYPE(qs_scf_env_type), POINTER :: scf_env
937 TYPE(mp_para_env_type), POINTER :: para_env
938
939 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_scf_loop_print'
940
941 INTEGER :: after, handle, ic, ispin, iw
942 LOGICAL :: do_kpoints, omit_headers
943 REAL(kind=dp) :: mo_mag_max, mo_mag_min, orthonormality
944 TYPE(cp_logger_type), POINTER :: logger
945 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_ks, matrix_p, matrix_s
946 TYPE(dft_control_type), POINTER :: dft_control
947 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
948 TYPE(qs_rho_type), POINTER :: rho
949 TYPE(section_vals_type), POINTER :: dft_section, input, scf_section
950
951 logger => cp_get_default_logger()
952 CALL timeset(routinen, handle)
953
954 CALL get_qs_env(qs_env=qs_env, input=input, dft_control=dft_control, &
955 do_kpoints=do_kpoints)
956
957 dft_section => section_vals_get_subs_vals(input, "DFT")
958 scf_section => section_vals_get_subs_vals(dft_section, "SCF")
959
960 CALL section_vals_val_get(input, "DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
961 DO ispin = 1, dft_control%nspins
962
963 IF (btest(cp_print_key_should_output(logger%iter_info, &
964 dft_section, "PRINT%AO_MATRICES/DENSITY"), cp_p_file)) THEN
965 CALL get_qs_env(qs_env, rho=rho)
966 CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
967 iw = cp_print_key_unit_nr(logger, dft_section, "PRINT%AO_MATRICES/DENSITY", &
968 extension=".Log")
969 CALL section_vals_val_get(dft_section, "PRINT%AO_MATRICES%NDIGITS", i_val=after)
970 after = min(max(after, 1), 16)
971 DO ic = 1, SIZE(matrix_p, 2)
972 CALL cp_dbcsr_write_sparse_matrix(matrix_p(ispin, ic)%matrix, 4, after, qs_env, para_env, &
973 output_unit=iw, omit_headers=omit_headers)
974 END DO
975 CALL cp_print_key_finished_output(iw, logger, dft_section, &
976 "PRINT%AO_MATRICES/DENSITY")
977 END IF
978
979 IF (btest(cp_print_key_should_output(logger%iter_info, &
980 dft_section, "PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"), cp_p_file)) THEN
981 iw = cp_print_key_unit_nr(logger, dft_section, "PRINT%AO_MATRICES/KOHN_SHAM_MATRIX", &
982 extension=".Log")
983 CALL section_vals_val_get(dft_section, "PRINT%AO_MATRICES%NDIGITS", i_val=after)
984 after = min(max(after, 1), 16)
985 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=matrix_ks)
986 DO ic = 1, SIZE(matrix_ks, 2)
987 IF (dft_control%qs_control%semi_empirical) THEN
988 CALL cp_dbcsr_write_sparse_matrix(matrix_ks(ispin, ic)%matrix, 4, after, qs_env, para_env, &
989 scale=evolt, output_unit=iw, omit_headers=omit_headers)
990 ELSE
991 CALL cp_dbcsr_write_sparse_matrix(matrix_ks(ispin, ic)%matrix, 4, after, qs_env, para_env, &
992 output_unit=iw, omit_headers=omit_headers)
993 END IF
994 END DO
995 CALL cp_print_key_finished_output(iw, logger, dft_section, &
996 "PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
997 END IF
998
999 END DO
1000
1001 IF (btest(cp_print_key_should_output(logger%iter_info, &
1002 scf_section, "PRINT%MO_ORTHONORMALITY"), cp_p_file)) THEN
1003 IF (do_kpoints) THEN
1004 iw = cp_print_key_unit_nr(logger, scf_section, "PRINT%MO_ORTHONORMALITY", &
1005 extension=".scfLog")
1006 IF (iw > 0) THEN
1007 WRITE (iw, '(T8,A)') &
1008 " K-points: Maximum deviation from MO S-orthonormality not determined"
1009 END IF
1010 CALL cp_print_key_finished_output(iw, logger, scf_section, &
1011 "PRINT%MO_ORTHONORMALITY")
1012 ELSE
1013 CALL get_qs_env(qs_env, mos=mos)
1014 IF (scf_env%method == special_diag_method_nr) THEN
1015 CALL calculate_orthonormality(orthonormality, mos)
1016 ELSE
1017 CALL get_qs_env(qs_env=qs_env, matrix_s_kp=matrix_s)
1018 CALL calculate_orthonormality(orthonormality, mos, matrix_s(1, 1)%matrix)
1019 END IF
1020 iw = cp_print_key_unit_nr(logger, scf_section, "PRINT%MO_ORTHONORMALITY", &
1021 extension=".scfLog")
1022 IF (iw > 0) THEN
1023 WRITE (iw, '(T8,A,T61,E20.4)') &
1024 " Maximum deviation from MO S-orthonormality", orthonormality
1025 END IF
1026 CALL cp_print_key_finished_output(iw, logger, scf_section, &
1027 "PRINT%MO_ORTHONORMALITY")
1028 END IF
1029 END IF
1030 IF (btest(cp_print_key_should_output(logger%iter_info, &
1031 scf_section, "PRINT%MO_MAGNITUDE"), cp_p_file)) THEN
1032 IF (do_kpoints) THEN
1033 iw = cp_print_key_unit_nr(logger, scf_section, "PRINT%MO_MAGNITUDE", &
1034 extension=".scfLog")
1035 IF (iw > 0) THEN
1036 WRITE (iw, '(T8,A)') &
1037 " K-points: Minimum/Maximum MO magnitude not determined"
1038 END IF
1039 CALL cp_print_key_finished_output(iw, logger, scf_section, &
1040 "PRINT%MO_MAGNITUDE")
1041 ELSE
1042 CALL get_qs_env(qs_env, mos=mos)
1043 CALL calculate_magnitude(mos, mo_mag_min, mo_mag_max)
1044 iw = cp_print_key_unit_nr(logger, scf_section, "PRINT%MO_MAGNITUDE", &
1045 extension=".scfLog")
1046 IF (iw > 0) THEN
1047 WRITE (iw, '(T8,A,T41,2E20.4)') &
1048 " Minimum/Maximum MO magnitude ", mo_mag_min, mo_mag_max
1049 END IF
1050 CALL cp_print_key_finished_output(iw, logger, scf_section, &
1051 "PRINT%MO_MAGNITUDE")
1052 END IF
1053 END IF
1054
1055 CALL timestop(handle)
1056
1057 END SUBROUTINE qs_scf_loop_print
1058
1059! **************************************************************************************************
1060!> \brief writes CDFT constraint information and optionally CDFT scf loop info
1061!> \param output_unit where to write the information
1062!> \param scf_control settings of the SCF loop
1063!> \param scf_env the env which holds convergence data
1064!> \param cdft_control the env which holds information about the constraint
1065!> \param energy the total energy
1066!> \param total_steps the total number of performed SCF iterations
1067!> \param should_stop if the calculation should stop
1068!> \param outer_loop_converged logical which determines if the CDFT SCF loop converged
1069!> \param cdft_loop logical which determines a CDFT SCF loop is active
1070!> \par History
1071!> 12.2015 created [Nico Holmberg]
1072! **************************************************************************************************
1073 SUBROUTINE qs_scf_cdft_info(output_unit, scf_control, scf_env, cdft_control, &
1074 energy, total_steps, should_stop, outer_loop_converged, &
1075 cdft_loop)
1076 INTEGER :: output_unit
1077 TYPE(scf_control_type), POINTER :: scf_control
1078 TYPE(qs_scf_env_type), POINTER :: scf_env
1079 TYPE(cdft_control_type), POINTER :: cdft_control
1080 TYPE(qs_energy_type), POINTER :: energy
1081 INTEGER :: total_steps
1082 LOGICAL, INTENT(IN) :: should_stop, outer_loop_converged, &
1083 cdft_loop
1084
1085 REAL(kind=dp) :: outer_loop_eps
1086
1087 IF (cdft_loop) THEN
1088 outer_loop_eps = sqrt(maxval(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count)**2))
1089 IF (output_unit > 0) WRITE (output_unit, '(/,T3,A,I4,A,E10.2,A,F22.10)') &
1090 "CDFT SCF iter = ", scf_env%outer_scf%iter_count, &
1091 " RMS gradient = ", outer_loop_eps, " energy =", energy%total
1092 IF (outer_loop_converged) THEN
1093 IF (output_unit > 0) WRITE (output_unit, '(T3,A,I4,A,I4,A,/)') &
1094 "CDFT SCF loop converged in", scf_env%outer_scf%iter_count, &
1095 " iterations or ", total_steps, " steps"
1096 END IF
1097 IF ((scf_env%outer_scf%iter_count > scf_control%outer_scf%max_scf .OR. should_stop) &
1098 .AND. .NOT. outer_loop_converged) THEN
1099 IF (output_unit > 0) WRITE (output_unit, '(T3,A,I4,A,I4,A,/)') &
1100 "CDFT SCF loop FAILED to converge after ", &
1101 scf_env%outer_scf%iter_count, " iterations or ", total_steps, " steps"
1102 END IF
1103 END IF
1104 CALL qs_scf_cdft_constraint_info(output_unit, cdft_control)
1105
1106 END SUBROUTINE qs_scf_cdft_info
1107
1108! **************************************************************************************************
1109!> \brief writes information about the CDFT env
1110!> \param output_unit where to write the information
1111!> \param cdft_control the CDFT env that stores information about the constraint calculation
1112!> \par History
1113!> 12.2015 created [Nico Holmberg]
1114! **************************************************************************************************
1115 SUBROUTINE qs_scf_cdft_initial_info(output_unit, cdft_control)
1116 INTEGER :: output_unit
1117 TYPE(cdft_control_type), POINTER :: cdft_control
1118
1119 IF (output_unit > 0) THEN
1120 WRITE (output_unit, '(/,A)') &
1121 " ---------------------------------- CDFT --------------------------------------"
1122 WRITE (output_unit, '(A)') &
1123 " Optimizing a density constraint in an external SCF loop "
1124 WRITE (output_unit, '(A)') " "
1125 SELECT CASE (cdft_control%type)
1127 WRITE (output_unit, '(A)') " Type of constraint: Hirshfeld"
1129 WRITE (output_unit, '(A)') " Type of constraint: Becke"
1130 END SELECT
1131 WRITE (output_unit, '(A,I8)') " Number of constraints: ", SIZE(cdft_control%group)
1132 WRITE (output_unit, '(A,L8)') " Using fragment densities:", cdft_control%fragment_density
1133 WRITE (output_unit, '(A)') " "
1134 IF (cdft_control%atomic_charges) WRITE (output_unit, '(A,/)') " Calculating atomic CDFT charges"
1135 SELECT CASE (cdft_control%constraint_control%optimizer)
1137 WRITE (output_unit, '(A)') &
1138 " Minimizer : SD : steepest descent"
1140 WRITE (output_unit, '(A)') &
1141 " Minimizer : DIIS : direct inversion"
1142 WRITE (output_unit, '(A)') &
1143 " in the iterative subspace"
1144 WRITE (output_unit, '(A,I3,A)') &
1145 " using ", &
1146 cdft_control%constraint_control%diis_buffer_length, " DIIS vectors"
1148 WRITE (output_unit, '(A)') &
1149 " Minimizer : BISECT : gradient bisection"
1150 WRITE (output_unit, '(A,I3)') &
1151 " using a trust count of", &
1152 cdft_control%constraint_control%bisect_trust_count
1155 CALL cdft_opt_type_write(cdft_control%constraint_control%cdft_opt_control, &
1156 cdft_control%constraint_control%optimizer, output_unit)
1158 WRITE (output_unit, '(A)') " Minimizer : Secant"
1159 CASE DEFAULT
1160 cpabort("Unknown CDFT outer_scf optimizer")
1161 END SELECT
1162 WRITE (output_unit, '(/,A,L7)') &
1163 " Reusing OT preconditioner: ", cdft_control%reuse_precond
1164 IF (cdft_control%reuse_precond) THEN
1165 WRITE (output_unit, '(A,I3,A,I3,A)') &
1166 " using old preconditioner for up to ", &
1167 cdft_control%max_reuse, " subsequent CDFT SCF"
1168 WRITE (output_unit, '(A,I3,A,I3,A)') &
1169 " iterations if the relevant loop converged in less than ", &
1170 cdft_control%precond_freq, " steps"
1171 END IF
1172 SELECT CASE (cdft_control%type)
1174 WRITE (output_unit, '(/,A)') " Hirshfeld constraint settings"
1175 WRITE (output_unit, '(A)') " "
1176 SELECT CASE (cdft_control%hirshfeld_control%shape_function)
1178 WRITE (output_unit, '(A, A8)') &
1179 " Shape function type: ", "Gaussian"
1180 WRITE (output_unit, '(A)', advance='NO') &
1181 " Type of Gaussian: "
1182 SELECT CASE (cdft_control%hirshfeld_control%gaussian_shape)
1183 CASE (radius_default)
1184 WRITE (output_unit, '(A13)') "Default"
1185 CASE (radius_covalent)
1186 WRITE (output_unit, '(A13)') "Covalent"
1187 CASE (radius_single)
1188 WRITE (output_unit, '(A13)') "Fixed radius"
1189 CASE (radius_vdw)
1190 WRITE (output_unit, '(A13)') "Van der Waals"
1191 CASE (radius_user)
1192 WRITE (output_unit, '(A13)') "User-defined"
1193
1194 END SELECT
1196 WRITE (output_unit, '(A, A8)') &
1197 " Shape function type: ", "Density"
1198 END SELECT
1200 WRITE (output_unit, '(/, A)') " Becke constraint settings"
1201 WRITE (output_unit, '(A)') " "
1202 SELECT CASE (cdft_control%becke_control%cutoff_type)
1203 CASE (becke_cutoff_global)
1204 WRITE (output_unit, '(A,F8.3,A)') &
1205 " Cutoff for partitioning :", cp_unit_from_cp2k(cdft_control%becke_control%rglobal, &
1206 "angstrom"), " angstrom"
1208 WRITE (output_unit, '(A)') &
1209 " Using element specific cutoffs for partitioning"
1210 END SELECT
1211 WRITE (output_unit, '(A,L7)') &
1212 " Skipping distant gpoints: ", cdft_control%becke_control%should_skip
1213 WRITE (output_unit, '(A,L7)') &
1214 " Precompute gradients : ", cdft_control%becke_control%in_memory
1215 WRITE (output_unit, '(A)') " "
1216 IF (cdft_control%becke_control%adjust) THEN
1217 WRITE (output_unit, '(A)') &
1218 " Using atomic radii to generate a heteronuclear charge partitioning"
1219 END IF
1220 WRITE (output_unit, '(A)') " "
1221 IF (.NOT. cdft_control%becke_control%cavity_confine) THEN
1222 WRITE (output_unit, '(A)') &
1223 " No confinement is active"
1224 ELSE
1225 WRITE (output_unit, '(A)') " Confinement using a Gaussian shaped cavity is active"
1226 SELECT CASE (cdft_control%becke_control%cavity_shape)
1227 CASE (radius_single)
1228 WRITE (output_unit, '(A,F8.4, A)') &
1229 " Type of Gaussian : Fixed radius: ", &
1230 cp_unit_from_cp2k(cdft_control%becke_control%rcavity, "angstrom"), " angstrom"
1231 CASE (radius_covalent)
1232 WRITE (output_unit, '(A)') &
1233 " Type of Gaussian : Covalent radius "
1234 CASE (radius_vdw)
1235 WRITE (output_unit, '(A)') &
1236 " Type of Gaussian : vdW radius "
1237 CASE (radius_user)
1238 WRITE (output_unit, '(A)') &
1239 " Type of Gaussian : User radius "
1240 END SELECT
1241 WRITE (output_unit, '(A,ES12.4)') &
1242 " Cavity threshold : ", cdft_control%becke_control%eps_cavity
1243 END IF
1244 END SELECT
1245 WRITE (output_unit, '(/,A)') &
1246 " ---------------------------------- CDFT --------------------------------------"
1247 END IF
1248
1249 END SUBROUTINE qs_scf_cdft_initial_info
1250
1251! **************************************************************************************************
1252!> \brief writes CDFT constraint information
1253!> \param output_unit where to write the information
1254!> \param cdft_control the env which holds information about the constraint
1255!> \par History
1256!> 08.2018 separated from qs_scf_cdft_info to make code callable elsewhere [Nico Holmberg]
1257! **************************************************************************************************
1258 SUBROUTINE qs_scf_cdft_constraint_info(output_unit, cdft_control)
1259 INTEGER :: output_unit
1260 TYPE(cdft_control_type), POINTER :: cdft_control
1261
1262 INTEGER :: igroup
1263
1264 IF (output_unit > 0) THEN
1265 SELECT CASE (cdft_control%type)
1267 WRITE (output_unit, '(/,T3,A,T60)') &
1268 '------------------- Hirshfeld constraint information -------------------'
1270 WRITE (output_unit, '(/,T3,A,T60)') &
1271 '--------------------- Becke constraint information ---------------------'
1272 CASE DEFAULT
1273 cpabort("Unknown CDFT constraint.")
1274 END SELECT
1275 DO igroup = 1, SIZE(cdft_control%target)
1276 IF (igroup > 1) WRITE (output_unit, '(T3,A)') ' '
1277 WRITE (output_unit, '(T3,A,T54,(3X,I18))') &
1278 'Atomic group :', igroup
1279 SELECT CASE (cdft_control%group(igroup)%constraint_type)
1281 IF (cdft_control%group(igroup)%is_fragment_constraint) THEN
1282 WRITE (output_unit, '(T3,A,T42,A)') &
1283 'Type of constraint :', adjustr('Charge density constraint (frag.)')
1284 ELSE
1285 WRITE (output_unit, '(T3,A,T50,A)') &
1286 'Type of constraint :', adjustr('Charge density constraint')
1287 END IF
1289 IF (cdft_control%group(igroup)%is_fragment_constraint) THEN
1290 WRITE (output_unit, '(T3,A,T35,A)') &
1291 'Type of constraint :', adjustr('Magnetization density constraint (frag.)')
1292 ELSE
1293 WRITE (output_unit, '(T3,A,T43,A)') &
1294 'Type of constraint :', adjustr('Magnetization density constraint')
1295 END IF
1297 IF (cdft_control%group(igroup)%is_fragment_constraint) THEN
1298 WRITE (output_unit, '(T3,A,T38,A)') &
1299 'Type of constraint :', adjustr('Alpha spin density constraint (frag.)')
1300 ELSE
1301 WRITE (output_unit, '(T3,A,T46,A)') &
1302 'Type of constraint :', adjustr('Alpha spin density constraint')
1303 END IF
1305 IF (cdft_control%group(igroup)%is_fragment_constraint) THEN
1306 WRITE (output_unit, '(T3,A,T39,A)') &
1307 'Type of constraint :', adjustr('Beta spin density constraint (frag.)')
1308 ELSE
1309 WRITE (output_unit, '(T3,A,T47,A)') &
1310 'Type of constraint :', adjustr('Beta spin density constraint')
1311 END IF
1312 CASE DEFAULT
1313 cpabort("Unknown constraint type.")
1314 END SELECT
1315 WRITE (output_unit, '(T3,A,T54,(3X,F18.12))') &
1316 'Target value of constraint :', cdft_control%target(igroup)
1317 WRITE (output_unit, '(T3,A,T54,(3X,F18.12))') &
1318 'Current value of constraint :', cdft_control%value(igroup)
1319 WRITE (output_unit, '(T3,A,T59,(3X,ES13.3))') &
1320 'Deviation from target :', cdft_control%value(igroup) - cdft_control%target(igroup)
1321 WRITE (output_unit, '(T3,A,T54,(3X,F18.12))') &
1322 'Strength of constraint :', cdft_control%strength(igroup)
1323 END DO
1324 WRITE (output_unit, '(T3,A)') &
1325 '------------------------------------------------------------------------'
1326 END IF
1327
1328 END SUBROUTINE qs_scf_cdft_constraint_info
1329
1330! **************************************************************************************************
1331!> \brief Print grand canonical SCF information for the current SCF iteration.
1332!> \param output_unit output unit used for SCF program run information
1333!> \param qs_env QS environment
1334!> \param just_energy whether this is an energy-only step
1335! **************************************************************************************************
1336 SUBROUTINE qs_scf_gce_info(output_unit, qs_env, just_energy)
1337
1338 INTEGER, INTENT(IN) :: output_unit
1339 TYPE(qs_environment_type), POINTER :: qs_env
1340 LOGICAL, INTENT(IN) :: just_energy
1341
1342 REAL(kind=dp) :: charge, current_wf_ev, delta_wf_ev, &
1343 free_ener, target_wf_ev
1344 TYPE(dft_control_type), POINTER :: dft_control
1345
1346 IF (output_unit <= 0) RETURN
1347 IF (just_energy) RETURN
1348
1349 current_wf_ev = qs_env%scf_control%gce%prev_workfunction*evolt
1350 target_wf_ev = qs_env%scf_control%gce%target_workfunction*evolt
1351 delta_wf_ev = current_wf_ev - target_wf_ev
1352
1353 CALL get_qs_env(qs_env, dft_control=dft_control)
1354 charge = dft_control%pcc_control%charge
1355 free_ener = (charge + dft_control%charge)*qs_env%scf_control%gce%prev_workfunction
1356
1357 WRITE (unit=output_unit, &
1358 fmt="(T8,A,T13,A,T24,A,T27,F6.1,A,T40,A,T56,A,T59,ES10.2,A)") &
1359 "GCE", "WF", "=", current_wf_ev, " eV", &
1360 "WF-TWF", "=", delta_wf_ev, " eV"
1361
1362 WRITE (unit=output_unit, &
1363 fmt="(T13,A,T24,A,T27,F7.3,A,T40,A,T56,A,T59,F14.10,A)") &
1364 "Charge", "=", charge, " e", &
1365 "GCE free energy", "=", free_ener, " a.u."
1366
1367 END SUBROUTINE qs_scf_gce_info
1368
1369END MODULE qs_scf_output
Types and set/get functions for auxiliary density matrix methods.
Definition admm_types.F:15
Contains methods used in the context of density fitting.
Definition admm_utils.F:15
subroutine, public admm_uncorrect_for_eigenvalues(ispin, admm_env, ks_matrix)
...
Definition admm_utils.F:127
subroutine, public admm_correct_for_eigenvalues(ispin, admm_env, ks_matrix)
...
Definition admm_utils.F:53
methods related to the blacs parallel environment
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, cartesian_basis)
...
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_init_random(matrix, ncol, start_col)
fills a matrix with random numbers
various routines to log and control the output. The idea is that decisions about where to log should ...
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...
unit conversion facility
Definition cp_units.F:30
real(kind=dp) function, public cp_unit_from_cp2k(value, unit_str, defaults, power)
converts from the internal cp2k units to the given unit
Definition cp_units.F:1251
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public smear_fermi_dirac
integer, parameter, public radius_vdw
integer, parameter, public outer_scf_optimizer_sd
integer, parameter, public cdft_beta_constraint
integer, parameter, public cdft_magnetization_constraint
integer, parameter, public outer_scf_optimizer_bisect
integer, parameter, public outer_scf_optimizer_secant
integer, parameter, public becke_cutoff_element
integer, parameter, public radius_default
integer, parameter, public outer_scf_optimizer_broyden
integer, parameter, public cdft_charge_constraint
integer, parameter, public outer_scf_becke_constraint
integer, parameter, public radius_user
integer, parameter, public smear_gaussian
integer, parameter, public shape_function_density
integer, parameter, public outer_scf_hirshfeld_constraint
integer, parameter, public radius_covalent
integer, parameter, public smear_mv
integer, parameter, public shape_function_gaussian
integer, parameter, public radius_single
integer, parameter, public outer_scf_optimizer_newton_ls
integer, parameter, public outer_scf_optimizer_newton
integer, parameter, public smear_mp
integer, parameter, public becke_cutoff_global
integer, parameter, public cdft_alpha_constraint
integer, parameter, public outer_scf_optimizer_diis
integer, parameter, public ot_precond_full_all
objects that represent the structure of input sections and the data contained in an input section
integer function, dimension(:), pointer, public section_get_ivals(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_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
sums arrays of real/complex numbers with much reduced round-off as compared to a naive implementation...
Definition kahan_sum.F:29
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
Types and basic routines needed for a kpoint calculation.
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:124
Interface to the message passing library MPI.
Define the data structure for the particle information.
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public kcalmol
Definition physcon.F:171
real(kind=dp), parameter, public evolt
Definition physcon.F:183
types of preconditioners
computes preconditioners, and implements methods to apply them currently used in qs_ot
Types containing essential information for running implicit (iterative) Poisson solver.
integer, parameter, public neumann_bc
integer, parameter, public mixed_bc
integer, parameter, public mixed_periodic_bc
integer, parameter, public periodic_bc
container for various plainwaves related things
functions related to the poisson solver on regular grids
integer, parameter, public pw_poisson_implicit
Routines for image charge calculation within QM/MM.
subroutine, public print_image_coefficients(image_coeff, qs_env)
Print image coefficients.
Control parameters for optimizers that work with CDFT constraints.
subroutine, public cdft_opt_type_write(cdft_opt_control, optimizer, output_unit)
writes information about the CDFT optimizer object
Defines CDFT control structures.
container for information about total charges on the grids
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
Definition and initialisation of the mo data type.
Definition qs_mo_io.F:21
subroutine, public write_mo_set_to_output_unit(mo_set, qs_kind_set, particle_set, dft_section, before, kpoint, final_mos, spin, solver_method, rtp, cpart, sim_step, umo_set, qs_env)
Write MO information to output file (eigenvalues, occupation numbers, coefficients)
Definition qs_mo_io.F:1023
collects routines that perform operations directly related to MOs
subroutine, public calculate_magnitude(mo_array, mo_mag_min, mo_mag_max)
...
subroutine, public calculate_orthonormality(orthonormality, mo_array, matrix_s)
...
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name, counter)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
subroutine, public allocate_mo_set(mo_set, nao, nmo, nelectron, n_el_f, maxocc, flexible_electron_count)
Allocates a mo set and partially initializes it (nao,nmo,nelectron, and flexible_electron_count are v...
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.
an eigen-space solver for the generalised symmetric eigenvalue problem for sparse matrices,...
subroutine, public ot_eigensolver(matrix_h, matrix_s, matrix_orthogonal_space_fm, matrix_c_fm, preconditioner, eps_gradient, iter_max, size_ortho_space, silent, ot_settings)
...
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...
Self-consistent continuum solvation (SCCS) model implementation.
Definition qs_sccs.F:29
subroutine, public print_sccs_results(energy, sccs_control, output_unit)
Print SCCS results.
Definition qs_sccs.F:1501
subroutine, public qs_scf_print_summary(output_unit, qs_env)
writes a summary of information after scf
subroutine, public qs_scf_cdft_constraint_info(output_unit, cdft_control)
writes CDFT constraint information
subroutine, public qs_scf_loop_print(qs_env, scf_env, para_env)
collects the 'heavy duty' printing tasks out of the SCF loop
subroutine, public qs_scf_outer_loop_info(output_unit, scf_control, scf_env, energy, total_steps, should_stop, outer_loop_converged)
writes basic information obtained in a scf outer loop step
subroutine, public qs_scf_initial_info(output_unit, mos, dft_control, ndep)
writes basic information at the beginning of an scf run
subroutine, public qs_scf_write_mos(qs_env, scf_env, final_mos)
Write the MO eigenvector, eigenvalues, and occupation numbers to the output unit.
subroutine, public qs_scf_loop_info(scf_env, output_unit, just_energy, t1, t2, energy)
writes basic information obtained in a scf step
subroutine, public qs_scf_cdft_info(output_unit, scf_control, scf_env, cdft_control, energy, total_steps, should_stop, outer_loop_converged, cdft_loop)
writes CDFT constraint information and optionally CDFT scf loop info
subroutine, public qs_scf_cdft_initial_info(output_unit, cdft_control)
writes information about the CDFT env
subroutine, public qs_scf_gce_info(output_unit, qs_env, just_energy)
Print grand canonical SCF information for the current SCF iteration.
module that contains the definitions of the scf types
integer, parameter, public ot_method_nr
integer, parameter, public special_diag_method_nr
parameters that control an scf iteration
stores some data used in wavefunction fitting
Definition admm_types.F:120
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Contains information about kpoints.
stores all the informations relevant to an mpi environment
contained for different pw related things
Container for information about total charges on the grids.
Provides all information about a quickstep kind.
keeps the density in various representations, keeping track of which ones are valid.