LCOV - code coverage report
Current view: top level - src - qs_scf_output.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:2fce0f8) Lines: 451 483 93.4 %
Date: 2024-12-21 06:28:57 Functions: 10 10 100.0 %

          Line data    Source code
       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             : MODULE qs_scf_output
       9             :    USE admm_types,                      ONLY: admm_type
      10             :    USE admm_utils,                      ONLY: admm_correct_for_eigenvalues,&
      11             :                                               admm_uncorrect_for_eigenvalues
      12             :    USE atomic_kind_types,               ONLY: atomic_kind_type
      13             :    USE cp_blacs_env,                    ONLY: cp_blacs_env_type
      14             :    USE cp_control_types,                ONLY: dft_control_type
      15             :    USE cp_dbcsr_api,                    ONLY: dbcsr_p_type,&
      16             :                                               dbcsr_type
      17             :    USE cp_dbcsr_output,                 ONLY: cp_dbcsr_write_sparse_matrix
      18             :    USE cp_fm_struct,                    ONLY: cp_fm_struct_create,&
      19             :                                               cp_fm_struct_release,&
      20             :                                               cp_fm_struct_type
      21             :    USE cp_fm_types,                     ONLY: cp_fm_init_random,&
      22             :                                               cp_fm_type
      23             :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      24             :                                               cp_logger_type
      25             :    USE cp_output_handling,              ONLY: cp_p_file,&
      26             :                                               cp_print_key_finished_output,&
      27             :                                               cp_print_key_should_output,&
      28             :                                               cp_print_key_unit_nr
      29             :    USE cp_units,                        ONLY: cp_unit_from_cp2k
      30             :    USE input_constants,                 ONLY: &
      31             :         becke_cutoff_element, becke_cutoff_global, cdft_alpha_constraint, cdft_beta_constraint, &
      32             :         cdft_charge_constraint, cdft_magnetization_constraint, ot_precond_full_all, &
      33             :         outer_scf_becke_constraint, outer_scf_hirshfeld_constraint, outer_scf_optimizer_bisect, &
      34             :         outer_scf_optimizer_broyden, outer_scf_optimizer_diis, outer_scf_optimizer_newton, &
      35             :         outer_scf_optimizer_newton_ls, outer_scf_optimizer_sd, outer_scf_optimizer_secant, &
      36             :         radius_covalent, radius_default, radius_single, radius_user, radius_vdw, &
      37             :         shape_function_density, shape_function_gaussian
      38             :    USE input_section_types,             ONLY: section_get_ivals,&
      39             :                                               section_vals_get_subs_vals,&
      40             :                                               section_vals_type,&
      41             :                                               section_vals_val_get
      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
      47             :    USE message_passing,                 ONLY: mp_para_env_type
      48             :    USE particle_types,                  ONLY: particle_type
      49             :    USE physcon,                         ONLY: evolt,&
      50             :                                               kcalmol
      51             :    USE preconditioner_types,            ONLY: preconditioner_type
      52             :    USE ps_implicit_types,               ONLY: MIXED_BC,&
      53             :                                               MIXED_PERIODIC_BC,&
      54             :                                               NEUMANN_BC,&
      55             :                                               PERIODIC_BC
      56             :    USE pw_env_types,                    ONLY: pw_env_type
      57             :    USE pw_poisson_types,                ONLY: pw_poisson_implicit
      58             :    USE qmmm_image_charge,               ONLY: print_image_coefficients
      59             :    USE qs_cdft_opt_types,               ONLY: cdft_opt_type_write
      60             :    USE qs_cdft_types,                   ONLY: cdft_control_type
      61             :    USE qs_charges_types,                ONLY: qs_charges_type
      62             :    USE qs_energy_types,                 ONLY: qs_energy_type
      63             :    USE qs_environment_types,            ONLY: get_qs_env,&
      64             :                                               qs_environment_type
      65             :    USE qs_kind_types,                   ONLY: qs_kind_type
      66             :    USE qs_mo_io,                        ONLY: write_mo_set_to_output_unit
      67             :    USE qs_mo_methods,                   ONLY: calculate_magnitude,&
      68             :                                               calculate_orthonormality,&
      69             :                                               calculate_subspace_eigenvalues
      70             :    USE qs_mo_occupation,                ONLY: set_mo_occupation
      71             :    USE qs_mo_types,                     ONLY: allocate_mo_set,&
      72             :                                               deallocate_mo_set,&
      73             :                                               get_mo_set,&
      74             :                                               init_mo_set,&
      75             :                                               mo_set_type
      76             :    USE qs_ot_eigensolver,               ONLY: ot_eigensolver
      77             :    USE qs_rho_types,                    ONLY: qs_rho_get,&
      78             :                                               qs_rho_type
      79             :    USE qs_sccs,                         ONLY: print_sccs_results
      80             :    USE qs_scf_types,                    ONLY: ot_method_nr,&
      81             :                                               qs_scf_env_type,&
      82             :                                               special_diag_method_nr
      83             :    USE scf_control_types,               ONLY: scf_control_type
      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, &
      93             :              qs_scf_print_summary, &
      94             :              qs_scf_loop_print, &
      95             :              qs_scf_outer_loop_info, &
      96             :              qs_scf_initial_info, &
      97             :              qs_scf_write_mos, &
      98             :              qs_scf_cdft_info, &
      99             :              qs_scf_cdft_initial_info, &
     100             :              qs_scf_cdft_constraint_info
     101             : 
     102             : CONTAINS
     103             : 
     104             : ! **************************************************************************************************
     105             : !> \brief writes a summary of information after scf
     106             : !> \param output_unit ...
     107             : !> \param qs_env ...
     108             : ! **************************************************************************************************
     109       18262 :    SUBROUTINE qs_scf_print_summary(output_unit, qs_env)
     110             :       INTEGER, INTENT(IN)                                :: output_unit
     111             :       TYPE(qs_environment_type), POINTER                 :: qs_env
     112             : 
     113             :       INTEGER                                            :: nelectron_total
     114             :       LOGICAL                                            :: gapw, gapw_xc, qmmm
     115             :       TYPE(dft_control_type), POINTER                    :: dft_control
     116             :       TYPE(qs_charges_type), POINTER                     :: qs_charges
     117             :       TYPE(qs_energy_type), POINTER                      :: energy
     118             :       TYPE(qs_rho_type), POINTER                         :: rho
     119             :       TYPE(qs_scf_env_type), POINTER                     :: scf_env
     120             : 
     121       18262 :       NULLIFY (rho, energy, dft_control, scf_env, qs_charges)
     122             :       CALL get_qs_env(qs_env=qs_env, rho=rho, energy=energy, dft_control=dft_control, &
     123       18262 :                       scf_env=scf_env, qs_charges=qs_charges)
     124             : 
     125       18262 :       gapw = dft_control%qs_control%gapw
     126       18262 :       gapw_xc = dft_control%qs_control%gapw_xc
     127       18262 :       qmmm = qs_env%qmmm
     128       18262 :       nelectron_total = scf_env%nelectron
     129             : 
     130             :       CALL qs_scf_print_scf_summary(output_unit, rho, qs_charges, energy, nelectron_total, &
     131       18262 :                                     dft_control, qmmm, qs_env, gapw, gapw_xc)
     132             : 
     133       18262 :    END SUBROUTINE qs_scf_print_summary
     134             : 
     135             : ! **************************************************************************************************
     136             : !> \brief writes basic information at the beginning of an scf run
     137             : !> \param output_unit ...
     138             : !> \param mos ...
     139             : !> \param dft_control ...
     140             : ! **************************************************************************************************
     141       19005 :    SUBROUTINE qs_scf_initial_info(output_unit, mos, dft_control)
     142             :       INTEGER                                            :: output_unit
     143             :       TYPE(mo_set_type), DIMENSION(:), INTENT(IN)        :: mos
     144             :       TYPE(dft_control_type), POINTER                    :: dft_control
     145             : 
     146             :       INTEGER                                            :: homo, ispin, nao, nelectron_spin, nmo
     147             : 
     148       19005 :       IF (output_unit > 0) THEN
     149       20654 :          DO ispin = 1, dft_control%nspins
     150             :             CALL get_mo_set(mo_set=mos(ispin), &
     151             :                             homo=homo, &
     152             :                             nelectron=nelectron_spin, &
     153             :                             nao=nao, &
     154       10970 :                             nmo=nmo)
     155       10970 :             IF (dft_control%nspins > 1) THEN
     156        2572 :                WRITE (UNIT=output_unit, FMT="(/,T2,A,I2)") "Spin", ispin
     157             :             END IF
     158             :             WRITE (UNIT=output_unit, FMT="(/,(T2,A,T71,I10))") &
     159       10970 :                "Number of electrons:", nelectron_spin, &
     160       10970 :                "Number of occupied orbitals:", homo, &
     161       42594 :                "Number of molecular orbitals:", nmo
     162             :          END DO
     163             :          WRITE (UNIT=output_unit, FMT="(/,T2,A,T71,I10)") &
     164        9684 :             "Number of orbital functions:", nao
     165             :       END IF
     166             : 
     167       19005 :    END SUBROUTINE qs_scf_initial_info
     168             : 
     169             : ! **************************************************************************************************
     170             : !> \brief Write the MO eigenvector, eigenvalues, and occupation numbers to the output unit
     171             : !> \param qs_env ...
     172             : !> \param scf_env ...
     173             : !> \param final_mos ...
     174             : !> \par History
     175             : !>      - Revise MO printout to enable eigenvalues with OT (05.05.2021, MK)
     176             : ! **************************************************************************************************
     177      654624 :    SUBROUTINE qs_scf_write_mos(qs_env, scf_env, final_mos)
     178             :       TYPE(qs_environment_type), POINTER                 :: qs_env
     179             :       TYPE(qs_scf_env_type), POINTER                     :: scf_env
     180             :       LOGICAL, INTENT(IN)                                :: final_mos
     181             : 
     182             :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'qs_scf_write_mos'
     183             : 
     184             :       CHARACTER(LEN=2)                                   :: solver_method
     185             :       CHARACTER(LEN=3*default_string_length)             :: message
     186             :       CHARACTER(LEN=5)                                   :: spin
     187             :       CHARACTER(LEN=default_string_length), &
     188      163656 :          DIMENSION(:), POINTER                           :: tmpstringlist
     189             :       INTEGER                                            :: handle, homo, ikp, ispin, iw, kpoint, &
     190             :                                                             nao, nelectron, nkp, nmo, nspin, numo
     191             :       INTEGER, DIMENSION(2)                              :: nmos_occ
     192      163656 :       INTEGER, DIMENSION(:), POINTER                     :: mo_index_range
     193             :       LOGICAL                                            :: do_kpoints, print_eigvals, &
     194             :                                                             print_eigvecs, print_mo_info, &
     195             :                                                             print_occup, print_occup_stats
     196             :       REAL(KIND=dp)                                      :: flexible_electron_count, maxocc, n_el_f, &
     197             :                                                             occup_stats_occ_threshold
     198      163656 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: mo_eigenvalues, umo_eigenvalues
     199             :       TYPE(admm_type), POINTER                           :: admm_env
     200      163656 :       TYPE(atomic_kind_type), DIMENSION(:), POINTER      :: atomic_kind_set
     201             :       TYPE(cp_blacs_env_type), POINTER                   :: blacs_env
     202             :       TYPE(cp_fm_struct_type), POINTER                   :: fm_struct_tmp
     203             :       TYPE(cp_fm_type), POINTER                          :: mo_coeff, umo_coeff
     204             :       TYPE(cp_logger_type), POINTER                      :: logger
     205      163656 :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: ks, s
     206             :       TYPE(dbcsr_type), POINTER                          :: matrix_ks, matrix_s
     207             :       TYPE(dft_control_type), POINTER                    :: dft_control
     208             :       TYPE(kpoint_type), POINTER                         :: kpoints
     209      163656 :       TYPE(mo_set_type), DIMENSION(:), POINTER           :: mos
     210             :       TYPE(mo_set_type), POINTER                         :: mo_set, umo_set
     211             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     212      163656 :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
     213             :       TYPE(preconditioner_type), POINTER                 :: local_preconditioner
     214      163656 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     215             :       TYPE(scf_control_type), POINTER                    :: scf_control
     216             :       TYPE(section_vals_type), POINTER                   :: dft_section, input
     217             : 
     218      163656 :       CALL timeset(routineN, handle)
     219             : 
     220      163656 :       CPASSERT(ASSOCIATED(qs_env))
     221             : 
     222             :       ! Retrieve the required information for the requested print output
     223             :       CALL get_qs_env(qs_env, &
     224             :                       atomic_kind_set=atomic_kind_set, &
     225             :                       blacs_env=blacs_env, &
     226             :                       dft_control=dft_control, &
     227             :                       do_kpoints=do_kpoints, &
     228             :                       input=input, &
     229             :                       qs_kind_set=qs_kind_set, &
     230             :                       para_env=para_env, &
     231             :                       particle_set=particle_set, &
     232      163656 :                       scf_control=scf_control)
     233             : 
     234             :       ! Quick return, if no printout of MO information is requested
     235      163656 :       dft_section => section_vals_get_subs_vals(input, "DFT")
     236      163656 :       CALL section_vals_val_get(dft_section, "PRINT%MO%EIGENVALUES", l_val=print_eigvals)
     237      163656 :       CALL section_vals_val_get(dft_section, "PRINT%MO%EIGENVECTORS", l_val=print_eigvecs)
     238      163656 :       CALL section_vals_val_get(dft_section, "PRINT%MO%OCCUPATION_NUMBERS", l_val=print_occup)
     239      163656 :       CALL section_vals_val_get(dft_section, "PRINT%MO%OCCUPATION_NUMBERS_STATS", c_vals=tmpstringlist)
     240             : 
     241      163656 :       print_occup_stats = .FALSE.
     242      163656 :       occup_stats_occ_threshold = 1e-6_dp
     243      163656 :       IF (SIZE(tmpstringlist) > 0) THEN  ! the lone_keyword_c_vals doesn't work as advertised, handle it manually
     244      163656 :          print_occup_stats = .TRUE.
     245      163656 :          IF (LEN_TRIM(tmpstringlist(1)) > 0) &
     246      163656 :             READ (tmpstringlist(1), *) print_occup_stats
     247             :       END IF
     248      163656 :       IF (SIZE(tmpstringlist) > 1) &
     249      163656 :          READ (tmpstringlist(2), *) occup_stats_occ_threshold
     250             : 
     251      163656 :       logger => cp_get_default_logger()
     252      163656 :       print_mo_info = (cp_print_key_should_output(logger%iter_info, dft_section, "PRINT%MO") /= 0) .OR. final_mos
     253             : 
     254      163656 :       IF ((.NOT. print_mo_info) .OR. (.NOT. (print_eigvals .OR. print_eigvecs .OR. print_occup .OR. print_occup_stats))) THEN
     255      157552 :          CALL timestop(handle)
     256      157552 :          RETURN
     257             :       END IF
     258             : 
     259        6104 :       NULLIFY (fm_struct_tmp)
     260        6104 :       NULLIFY (mo_coeff)
     261        6104 :       NULLIFY (mo_eigenvalues)
     262        6104 :       NULLIFY (mo_set)
     263        6104 :       NULLIFY (umo_coeff)
     264        6104 :       NULLIFY (umo_eigenvalues)
     265        6104 :       NULLIFY (umo_set)
     266             : 
     267        6104 :       nspin = dft_control%nspins
     268        6104 :       nmos_occ = 0
     269             : 
     270             :       ! Check, if we have k points
     271        6104 :       IF (do_kpoints) THEN
     272          10 :          CALL get_qs_env(qs_env, kpoints=kpoints)
     273          10 :          nkp = SIZE(kpoints%kp_env)
     274             :       ELSE
     275        6094 :          CALL get_qs_env(qs_env, matrix_ks=ks, matrix_s=s)
     276        6094 :          CPASSERT(ASSOCIATED(ks))
     277        6094 :          CPASSERT(ASSOCIATED(s))
     278             :          nkp = 1
     279             :       END IF
     280             : 
     281       12400 :       DO ikp = 1, nkp
     282             : 
     283        6296 :          IF (do_kpoints) THEN
     284         202 :             mos => kpoints%kp_env(ikp)%kpoint_env%mos(1, :)
     285         202 :             kpoint = ikp
     286             :          ELSE
     287        6094 :             CALL get_qs_env(qs_env, matrix_ks=ks, mos=mos)
     288        6094 :             kpoint = 0 ! Gamma point only
     289             :          END IF
     290        6296 :          CPASSERT(ASSOCIATED(mos))
     291             : 
     292             :          ! Prepare MO information for printout
     293       19002 :          DO ispin = 1, nspin
     294             : 
     295             :             ! Calculate MO eigenvalues and eigenvector when OT is used
     296        6602 :             IF (scf_env%method == ot_method_nr) THEN
     297             : 
     298        1876 :                solver_method = "OT"
     299             : 
     300        1876 :                IF (do_kpoints) THEN
     301           0 :                   CPABORT("The OT method is not implemented for k points")
     302             :                END IF
     303             : 
     304        1876 :                matrix_ks => ks(ispin)%matrix
     305        1876 :                matrix_s => s(1)%matrix
     306             : 
     307             :                ! With ADMM, we have to modify the Kohn-Sham matrix
     308        1876 :                IF (dft_control%do_admm) THEN
     309           0 :                   CALL get_qs_env(qs_env, admm_env=admm_env)
     310           0 :                   CALL admm_correct_for_eigenvalues(ispin, admm_env, matrix_ks)
     311             :                END IF
     312             : 
     313        1876 :                mo_set => mos(ispin)
     314             :                CALL get_mo_set(mo_set=mo_set, &
     315             :                                mo_coeff=mo_coeff, &
     316             :                                eigenvalues=mo_eigenvalues, &
     317             :                                homo=homo, &
     318             :                                maxocc=maxocc, &
     319             :                                nelectron=nelectron, &
     320             :                                n_el_f=n_el_f, &
     321             :                                nao=nao, &
     322             :                                nmo=nmo, &
     323        1876 :                                flexible_electron_count=flexible_electron_count)
     324             : 
     325             :                ! Retrieve the index of the last MO for which a printout is requested
     326        1876 :                mo_index_range => section_get_ivals(dft_section, "PRINT%MO%MO_INDEX_RANGE")
     327        1876 :                CPASSERT(ASSOCIATED(mo_index_range))
     328        1876 :                numo = MIN(mo_index_range(2) - homo, nao - homo)
     329             : 
     330        1876 :                IF (.NOT. final_mos) THEN
     331        1654 :                   numo = 0
     332             :                   message = "The MO information for unoccupied MOs is only calculated after "// &
     333             :                             "SCF convergence is achieved when the orbital transformation (OT) "// &
     334        1654 :                             "method is used"
     335        1654 :                   CPWARN(TRIM(message))
     336             :                END IF
     337             : 
     338             :                ! Calculate the unoccupied MO set (umo_set) with OT if needed
     339        1876 :                IF (numo > 0) THEN
     340             : 
     341             :                   ! Create temporary virtual MO set for printout
     342             :                   CALL cp_fm_struct_create(fm_struct_tmp, &
     343             :                                            context=blacs_env, &
     344             :                                            para_env=para_env, &
     345             :                                            nrow_global=nao, &
     346          20 :                                            ncol_global=numo)
     347          20 :                   ALLOCATE (umo_set)
     348             :                   CALL allocate_mo_set(mo_set=umo_set, &
     349             :                                        nao=nao, &
     350             :                                        nmo=numo, &
     351             :                                        nelectron=0, &
     352             :                                        n_el_f=n_el_f, &
     353             :                                        maxocc=maxocc, &
     354          20 :                                        flexible_electron_count=flexible_electron_count)
     355             :                   CALL init_mo_set(mo_set=umo_set, &
     356             :                                    fm_struct=fm_struct_tmp, &
     357          20 :                                    name="Temporary MO set (unoccupied MOs only)for printout")
     358          20 :                   CALL cp_fm_struct_release(fm_struct_tmp)
     359             :                   CALL get_mo_set(mo_set=umo_set, &
     360             :                                   mo_coeff=umo_coeff, &
     361          20 :                                   eigenvalues=umo_eigenvalues)
     362             : 
     363             :                   ! Calculate the MO information for the request MO index range
     364          20 :                   IF (final_mos) THEN
     365             :                      ! Prepare printout of the additional unoccupied MOs when OT is being employed
     366          20 :                      CALL cp_fm_init_random(umo_coeff)
     367             :                      ! The FULL_ALL preconditioner makes not much sense for the unoccupied orbitals
     368          20 :                      NULLIFY (local_preconditioner)
     369          20 :                      IF (ASSOCIATED(scf_env%ot_preconditioner)) THEN
     370          20 :                         local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
     371          20 :                         IF (local_preconditioner%in_use == ot_precond_full_all) THEN
     372           0 :                            NULLIFY (local_preconditioner)
     373             :                         END IF
     374             :                      END IF
     375             :                      CALL ot_eigensolver(matrix_h=matrix_ks, &
     376             :                                          matrix_s=matrix_s, &
     377             :                                          matrix_c_fm=umo_coeff, &
     378             :                                          matrix_orthogonal_space_fm=mo_coeff, &
     379             :                                          eps_gradient=scf_control%eps_lumos, &
     380             :                                          preconditioner=local_preconditioner, &
     381             :                                          iter_max=scf_control%max_iter_lumos, &
     382          20 :                                          size_ortho_space=nmo)
     383             :                   END IF
     384             : 
     385             :                   CALL calculate_subspace_eigenvalues(orbitals=umo_coeff, &
     386             :                                                       ks_matrix=matrix_ks, &
     387             :                                                       evals_arg=umo_eigenvalues, &
     388          20 :                                                       do_rotation=.TRUE.)
     389          20 :                   CALL set_mo_occupation(mo_set=umo_set)
     390             : 
     391             :                   ! With ADMM, we have to undo the modification of the Kohn-Sham matrix
     392          20 :                   IF (dft_control%do_admm) THEN
     393           0 :                      CALL admm_uncorrect_for_eigenvalues(ispin, admm_env, matrix_ks)
     394             :                   END IF
     395             : 
     396             :                ELSE
     397             : 
     398             :                   NULLIFY (umo_set)
     399             : 
     400             :                END IF ! numo > 0
     401             : 
     402             :             ELSE
     403             : 
     404        4726 :                solver_method = "TD"
     405        4726 :                mo_set => mos(ispin)
     406        4726 :                NULLIFY (umo_set)
     407             : 
     408             :             END IF ! OT is used
     409             : 
     410             :             ! Print MO information
     411        6602 :             IF (nspin > 1) THEN
     412         306 :                SELECT CASE (ispin)
     413             :                CASE (1)
     414         306 :                   spin = "ALPHA"
     415             :                CASE (2)
     416         306 :                   spin = "BETA"
     417             :                CASE DEFAULT
     418         612 :                   CPABORT("Invalid spin")
     419             :                END SELECT
     420         612 :                IF (ASSOCIATED(umo_set)) THEN
     421             :                   CALL write_mo_set_to_output_unit(mo_set, atomic_kind_set, qs_kind_set, particle_set, &
     422             :                                                    dft_section, 4, kpoint, final_mos=final_mos, spin=TRIM(spin), &
     423          12 :                                                    solver_method=solver_method, umo_set=umo_set)
     424             :                ELSE
     425             :                   CALL write_mo_set_to_output_unit(mo_set, atomic_kind_set, qs_kind_set, particle_set, &
     426             :                                                    dft_section, 4, kpoint, final_mos=final_mos, spin=TRIM(spin), &
     427         600 :                                                    solver_method=solver_method)
     428             :                END IF
     429             :             ELSE
     430        5990 :                IF (ASSOCIATED(umo_set)) THEN
     431             :                   CALL write_mo_set_to_output_unit(mo_set, atomic_kind_set, qs_kind_set, particle_set, &
     432             :                                                    dft_section, 4, kpoint, final_mos=final_mos, &
     433           8 :                                                    solver_method=solver_method, umo_set=umo_set)
     434             :                ELSE
     435             :                   CALL write_mo_set_to_output_unit(mo_set, atomic_kind_set, qs_kind_set, particle_set, &
     436             :                                                    dft_section, 4, kpoint, final_mos=final_mos, &
     437        5982 :                                                    solver_method=solver_method)
     438             :                END IF
     439             :             END IF
     440             : 
     441       52046 :             nmos_occ(ispin) = MAX(nmos_occ(ispin), COUNT(mo_set%occupation_numbers > occup_stats_occ_threshold))
     442             : 
     443             :             ! Deallocate temporary objects needed for OT
     444        6602 :             IF (scf_env%method == ot_method_nr) THEN
     445        1876 :                IF (ASSOCIATED(umo_set)) THEN
     446          20 :                   CALL deallocate_mo_set(umo_set)
     447          20 :                   DEALLOCATE (umo_set)
     448             :                END IF
     449        1876 :                NULLIFY (matrix_ks)
     450        1876 :                NULLIFY (matrix_s)
     451             :             END IF
     452       12898 :             NULLIFY (mo_set)
     453             : 
     454             :          END DO ! ispin
     455             : 
     456             :       END DO ! k point loop
     457             : 
     458        6104 :       IF (print_mo_info .AND. print_occup_stats) THEN
     459             :          iw = cp_print_key_unit_nr(logger, dft_section, "PRINT%MO", &
     460             :                                    ignore_should_output=print_mo_info, &
     461           0 :                                    extension=".MOLog")
     462           0 :          IF (iw > 0) THEN
     463           0 :             IF (SIZE(mos) > 1) THEN
     464           0 :                WRITE (UNIT=iw, FMT="(A,I4)") " MO| Total occupied (ALPHA):", nmos_occ(1)
     465           0 :                WRITE (UNIT=iw, FMT="(A,I4)") " MO| Total occupied (BETA): ", nmos_occ(2)
     466             :             ELSE
     467           0 :                WRITE (UNIT=iw, FMT="(A,I4)") " MO| Total occupied: ", nmos_occ(1)
     468             :             END IF
     469           0 :             WRITE (UNIT=iw, FMT="(A)") ""
     470             :          END IF
     471             :          CALL cp_print_key_finished_output(iw, logger, dft_section, "PRINT%MO", &
     472           0 :                                            ignore_should_output=print_mo_info)
     473             :       END IF
     474             : 
     475        6104 :       CALL timestop(handle)
     476             : 
     477      163656 :    END SUBROUTINE qs_scf_write_mos
     478             : 
     479             : ! **************************************************************************************************
     480             : !> \brief writes basic information obtained in a scf outer loop step
     481             : !> \param output_unit ...
     482             : !> \param scf_control ...
     483             : !> \param scf_env ...
     484             : !> \param energy ...
     485             : !> \param total_steps ...
     486             : !> \param should_stop ...
     487             : !> \param outer_loop_converged ...
     488             : ! **************************************************************************************************
     489        5028 :    SUBROUTINE qs_scf_outer_loop_info(output_unit, scf_control, scf_env, &
     490             :                                      energy, total_steps, should_stop, outer_loop_converged)
     491             :       INTEGER                                            :: output_unit
     492             :       TYPE(scf_control_type), POINTER                    :: scf_control
     493             :       TYPE(qs_scf_env_type), POINTER                     :: scf_env
     494             :       TYPE(qs_energy_type), POINTER                      :: energy
     495             :       INTEGER                                            :: total_steps
     496             :       LOGICAL, INTENT(IN)                                :: should_stop, outer_loop_converged
     497             : 
     498             :       REAL(KIND=dp)                                      :: outer_loop_eps
     499             : 
     500       15084 :       outer_loop_eps = SQRT(MAXVAL(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count)**2))
     501        5028 :       IF (output_unit > 0) WRITE (output_unit, '(/,T3,A,I4,A,E10.2,A,F22.10)') &
     502        2631 :          "outer SCF iter = ", scf_env%outer_scf%iter_count, &
     503        5262 :          " RMS gradient = ", outer_loop_eps, " energy =", energy%total
     504             : 
     505        5028 :       IF (outer_loop_converged) THEN
     506        3997 :          IF (output_unit > 0) WRITE (output_unit, '(T3,A,I4,A,I4,A,/)') &
     507        2108 :             "outer SCF loop converged in", scf_env%outer_scf%iter_count, &
     508        4216 :             " iterations or ", total_steps, " steps"
     509             :       ELSE IF (scf_env%outer_scf%iter_count > scf_control%outer_scf%max_scf &
     510        1031 :                .OR. should_stop) THEN
     511         128 :          IF (output_unit > 0) WRITE (output_unit, '(T3,A,I4,A,I4,A,/)') &
     512          64 :             "outer SCF loop FAILED to converge after ", &
     513         128 :             scf_env%outer_scf%iter_count, " iterations or ", total_steps, " steps"
     514             :       END IF
     515             : 
     516        5028 :    END SUBROUTINE qs_scf_outer_loop_info
     517             : 
     518             : ! **************************************************************************************************
     519             : !> \brief writes basic information obtained in a scf step
     520             : !> \param scf_env ...
     521             : !> \param output_unit ...
     522             : !> \param just_energy ...
     523             : !> \param t1 ...
     524             : !> \param t2 ...
     525             : !> \param energy ...
     526             : ! **************************************************************************************************
     527      148203 :    SUBROUTINE qs_scf_loop_info(scf_env, output_unit, just_energy, t1, t2, energy)
     528             : 
     529             :       TYPE(qs_scf_env_type), POINTER                     :: scf_env
     530             :       INTEGER                                            :: output_unit
     531             :       LOGICAL                                            :: just_energy
     532             :       REAL(KIND=dp)                                      :: t1, t2
     533             :       TYPE(qs_energy_type), POINTER                      :: energy
     534             : 
     535      148203 :       IF ((output_unit > 0) .AND. scf_env%print_iter_line) THEN
     536       75333 :          IF (just_energy) THEN
     537             :             WRITE (UNIT=output_unit, &
     538             :                    FMT="(T2,I5,1X,A,T20,E8.2,1X,F6.1,16X,F20.10)") &
     539        5268 :                scf_env%iter_count, TRIM(scf_env%iter_method), scf_env%iter_param, &
     540       10536 :                t2 - t1, energy%total
     541             :          ELSE
     542       67721 :             IF ((ABS(scf_env%iter_delta) < 1.0E-8_dp) .OR. &
     543       70065 :                 (ABS(scf_env%iter_delta) >= 1.0E5_dp)) THEN
     544             :                WRITE (UNIT=output_unit, &
     545             :                       FMT="(T2,I5,1X,A,T20,E8.2,1X,F6.1,1X,ES14.4,1X,F20.10,1X,ES9.2)") &
     546        2344 :                   scf_env%iter_count, TRIM(scf_env%iter_method), scf_env%iter_param, &
     547        4688 :                   t2 - t1, scf_env%iter_delta, energy%total, energy%total - energy%tot_old
     548             :             ELSE
     549             :                WRITE (UNIT=output_unit, &
     550             :                       FMT="(T2,I5,1X,A,T20,E8.2,1X,F6.1,1X,F14.8,1X,F20.10,1X,ES9.2)") &
     551       67721 :                   scf_env%iter_count, TRIM(scf_env%iter_method), scf_env%iter_param, &
     552      135442 :                   t2 - t1, scf_env%iter_delta, energy%total, energy%total - energy%tot_old
     553             :             END IF
     554             :          END IF
     555             :       END IF
     556             : 
     557      148203 :    END SUBROUTINE qs_scf_loop_info
     558             : 
     559             : ! **************************************************************************************************
     560             : !> \brief writes rather detailed summary of densities and energies
     561             : !>      after the SCF
     562             : !> \param output_unit ...
     563             : !> \param rho ...
     564             : !> \param qs_charges ...
     565             : !> \param energy ...
     566             : !> \param nelectron_total ...
     567             : !> \param dft_control ...
     568             : !> \param qmmm ...
     569             : !> \param qs_env ...
     570             : !> \param gapw ...
     571             : !> \param gapw_xc ...
     572             : !> \par History
     573             : !>      03.2006 created [Joost VandeVondele]
     574             : !>      10.2019 print dipole moment [SGh]
     575             : !>      11.2022 print SCCS results [MK]
     576             : ! **************************************************************************************************
     577       18262 :    SUBROUTINE qs_scf_print_scf_summary(output_unit, rho, qs_charges, energy, nelectron_total, &
     578             :                                        dft_control, qmmm, qs_env, gapw, gapw_xc)
     579             :       INTEGER, INTENT(IN)                                :: output_unit
     580             :       TYPE(qs_rho_type), POINTER                         :: rho
     581             :       TYPE(qs_charges_type), POINTER                     :: qs_charges
     582             :       TYPE(qs_energy_type), POINTER                      :: energy
     583             :       INTEGER, INTENT(IN)                                :: nelectron_total
     584             :       TYPE(dft_control_type), POINTER                    :: dft_control
     585             :       LOGICAL, INTENT(IN)                                :: qmmm
     586             :       TYPE(qs_environment_type), POINTER                 :: qs_env
     587             :       LOGICAL, INTENT(IN)                                :: gapw, gapw_xc
     588             : 
     589             :       CHARACTER(LEN=*), PARAMETER :: routineN = 'qs_scf_print_scf_summary'
     590             : 
     591             :       INTEGER                                            :: bc, handle, ispin, psolver
     592             :       REAL(kind=dp)                                      :: exc1_energy, exc_energy, &
     593             :                                                             implicit_ps_ehartree, tot1_h, tot1_s
     594       18262 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: tot_rho_r
     595             :       TYPE(pw_env_type), POINTER                         :: pw_env
     596             : 
     597       18262 :       NULLIFY (tot_rho_r, pw_env)
     598       18262 :       CALL timeset(routineN, handle)
     599             : 
     600       18262 :       CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
     601       18262 :       psolver = pw_env%poisson_env%parameters%solver
     602             : 
     603       18262 :       IF (output_unit > 0) THEN
     604        9320 :          CALL qs_rho_get(rho, tot_rho_r=tot_rho_r)
     605        9320 :          IF (.NOT. (dft_control%qs_control%semi_empirical .OR. &
     606             :                     dft_control%qs_control%xtb .OR. &
     607             :                     dft_control%qs_control%dftb)) THEN
     608             :             WRITE (UNIT=output_unit, FMT="(/,(T3,A,T41,2F20.10))") &
     609        5309 :                "Electronic density on regular grids: ", &
     610        5309 :                accurate_sum(tot_rho_r), &
     611        5309 :                accurate_sum(tot_rho_r) + nelectron_total, &
     612        5309 :                "Core density on regular grids:", &
     613        5309 :                qs_charges%total_rho_core_rspace, &
     614       10618 :                qs_charges%total_rho_core_rspace - REAL(nelectron_total + dft_control%charge, dp)
     615             : 
     616        5309 :             IF (dft_control%correct_surf_dip) THEN
     617             :                WRITE (UNIT=output_unit, FMT="((T3,A,/,T3,A,T41,F20.10))") &
     618           5 :                   "Total dipole moment perpendicular to ", &
     619           5 :                   "the slab [electrons-Angstroem]: ", &
     620          10 :                   qs_env%surface_dipole_moment
     621             :             END IF
     622             : 
     623        5309 :             IF (gapw) THEN
     624         759 :                tot1_h = qs_charges%total_rho1_hard(1)
     625         759 :                tot1_s = qs_charges%total_rho1_soft(1)
     626         957 :                DO ispin = 2, dft_control%nspins
     627         198 :                   tot1_h = tot1_h + qs_charges%total_rho1_hard(ispin)
     628         957 :                   tot1_s = tot1_s + qs_charges%total_rho1_soft(ispin)
     629             :                END DO
     630             :                WRITE (UNIT=output_unit, FMT="((T3,A,T41,2F20.10))") &
     631         759 :                   "Hard and soft densities (Lebedev):", &
     632        1518 :                   tot1_h, tot1_s
     633             :                WRITE (UNIT=output_unit, FMT="(T3,A,T41,F20.10)") &
     634         759 :                   "Total Rho_soft + Rho1_hard - Rho1_soft (r-space): ", &
     635         759 :                   accurate_sum(tot_rho_r) + tot1_h - tot1_s, &
     636         759 :                   "Total charge density (r-space):      ", &
     637             :                   accurate_sum(tot_rho_r) + tot1_h - tot1_s &
     638         759 :                   + qs_charges%total_rho_core_rspace, &
     639         759 :                   "Total Rho_soft + Rho0_soft (g-space):", &
     640        1518 :                   qs_charges%total_rho_gspace
     641             :             ELSE
     642             :                WRITE (UNIT=output_unit, FMT="(T3,A,T41,F20.10)") &
     643        4550 :                   "Total charge density on r-space grids:     ", &
     644             :                   accurate_sum(tot_rho_r) + &
     645        4550 :                   qs_charges%total_rho_core_rspace, &
     646        4550 :                   "Total charge density g-space grids:     ", &
     647        9100 :                   qs_charges%total_rho_gspace
     648             :             END IF
     649             :          END IF
     650        9320 :          IF (dft_control%qs_control%semi_empirical) THEN
     651             :             WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     652        1928 :                "Core-core repulsion energy [eV]:               ", energy%core_overlap*evolt, &
     653        1928 :                "Core Hamiltonian energy [eV]:                  ", energy%core*evolt, &
     654        1928 :                "Two-electron integral energy [eV]:             ", energy%hartree*evolt, &
     655        1928 :                "Electronic energy [eV]:                        ", &
     656        3856 :                (energy%core + 0.5_dp*energy%hartree)*evolt
     657        1928 :             IF (energy%dispersion /= 0.0_dp) &
     658             :                WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     659           8 :                "Dispersion energy [eV]:                     ", energy%dispersion*evolt
     660        7392 :          ELSEIF (dft_control%qs_control%dftb) THEN
     661             :             WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     662         682 :                "Core Hamiltonian energy:                       ", energy%core, &
     663         682 :                "Repulsive potential energy:                    ", energy%repulsive, &
     664         682 :                "Electronic energy:                             ", energy%hartree, &
     665        1364 :                "Dispersion energy:                             ", energy%dispersion
     666         682 :             IF (energy%dftb3 /= 0.0_dp) &
     667             :                WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     668         136 :                "DFTB3 3rd order energy:                     ", energy%dftb3
     669         682 :             IF (energy%efield /= 0.0_dp) &
     670             :                WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     671          16 :                "Electric field interaction energy:          ", energy%efield
     672        6710 :          ELSEIF (dft_control%qs_control%xtb) THEN
     673        1401 :             IF (dft_control%qs_control%xtb_control%gfn_type == 0) THEN
     674             :                WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     675           0 :                   "Core Hamiltonian energy:                       ", energy%core, &
     676           0 :                   "Repulsive potential energy:                    ", energy%repulsive, &
     677           0 :                   "SRB Correction energy:                         ", energy%srb, &
     678           0 :                   "Charge equilibration energy:                   ", energy%eeq, &
     679           0 :                   "Dispersion energy:                             ", energy%dispersion
     680        1401 :             ELSEIF (dft_control%qs_control%xtb_control%gfn_type == 1) THEN
     681             :                WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     682        1401 :                   "Core Hamiltonian energy:                       ", energy%core, &
     683        1401 :                   "Repulsive potential energy:                    ", energy%repulsive, &
     684        1401 :                   "Electronic energy:                             ", energy%hartree, &
     685        1401 :                   "DFTB3 3rd order energy:                        ", energy%dftb3, &
     686        2802 :                   "Dispersion energy:                             ", energy%dispersion
     687        1401 :                IF (dft_control%qs_control%xtb_control%xb_interaction) &
     688             :                   WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     689        1401 :                   "Correction for halogen bonding:                ", energy%xtb_xb_inter
     690           0 :             ELSEIF (dft_control%qs_control%xtb_control%gfn_type == 2) THEN
     691           0 :                CPABORT("gfn_typ 2 NYA")
     692             :             ELSE
     693           0 :                CPABORT("invalid gfn_typ")
     694             :             END IF
     695        1401 :             IF (dft_control%qs_control%xtb_control%do_nonbonded) &
     696             :                WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     697          12 :                "Correction for nonbonded interactions:         ", energy%xtb_nonbonded
     698        1401 :             IF (energy%efield /= 0.0_dp) &
     699             :                WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     700         309 :                "Electric field interaction energy:          ", energy%efield
     701             :          ELSE
     702        5309 :             IF (dft_control%do_admm) THEN
     703         435 :                exc_energy = energy%exc + energy%exc_aux_fit
     704         435 :                IF (gapw .OR. gapw_xc) exc1_energy = energy%exc1 + energy%exc1_aux_fit
     705             :             ELSE
     706        4874 :                exc_energy = energy%exc
     707        4874 :                IF (gapw .OR. gapw_xc) exc1_energy = energy%exc1
     708             :             END IF
     709             : 
     710        5309 :             IF (psolver .EQ. pw_poisson_implicit) THEN
     711          60 :                implicit_ps_ehartree = pw_env%poisson_env%implicit_env%ehartree
     712          60 :                bc = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
     713          41 :                SELECT CASE (bc)
     714             :                CASE (MIXED_PERIODIC_BC, MIXED_BC)
     715             :                   WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     716          41 :                      "Overlap energy of the core charge distribution:", energy%core_overlap, &
     717          41 :                      "Self energy of the core charge distribution:   ", energy%core_self, &
     718          41 :                      "Core Hamiltonian energy:                       ", energy%core, &
     719          41 :                      "Hartree energy:                                ", implicit_ps_ehartree, &
     720          41 :                      "Electric enthalpy:                             ", energy%hartree, &
     721          82 :                      "Exchange-correlation energy:                   ", exc_energy
     722             :                CASE (PERIODIC_BC, NEUMANN_BC)
     723             :                   WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     724          19 :                      "Overlap energy of the core charge distribution:", energy%core_overlap, &
     725          19 :                      "Self energy of the core charge distribution:   ", energy%core_self, &
     726          19 :                      "Core Hamiltonian energy:                       ", energy%core, &
     727          19 :                      "Hartree energy:                                ", energy%hartree, &
     728          79 :                      "Exchange-correlation energy:                   ", exc_energy
     729             :                END SELECT
     730             :             ELSE
     731             :                WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     732        5249 :                   "Overlap energy of the core charge distribution:", energy%core_overlap, &
     733        5249 :                   "Self energy of the core charge distribution:   ", energy%core_self, &
     734        5249 :                   "Core Hamiltonian energy:                       ", energy%core, &
     735        5249 :                   "Hartree energy:                                ", energy%hartree, &
     736       10498 :                   "Exchange-correlation energy:                   ", exc_energy
     737             :             END IF
     738        5309 :             IF (energy%e_hartree /= 0.0_dp) &
     739             :                WRITE (UNIT=output_unit, FMT="(T3,A,/,T3,A,T56,F25.14)") &
     740          44 :                "Coulomb Electron-Electron Interaction Energy ", &
     741          88 :                "- Already included in the total Hartree term ", energy%e_hartree
     742        5309 :             IF (energy%ex /= 0.0_dp) &
     743             :                WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     744        1021 :                "Hartree-Fock Exchange energy:                  ", energy%ex
     745        5309 :             IF (energy%dispersion /= 0.0_dp) &
     746             :                WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     747         142 :                "Dispersion energy:                             ", energy%dispersion
     748        5309 :             IF (energy%gcp /= 0.0_dp) &
     749             :                WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     750           0 :                "gCP energy:                                    ", energy%gcp
     751        5309 :             IF (energy%efield /= 0.0_dp) &
     752             :                WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     753         353 :                "Electric field interaction energy:          ", energy%efield
     754        5309 :             IF (gapw) THEN
     755             :                WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     756         759 :                   "GAPW| Exc from hard and soft atomic rho1:      ", exc1_energy, &
     757        1518 :                   "GAPW| local Eh = 1 center integrals:           ", energy%hartree_1c
     758             :             END IF
     759        5309 :             IF (gapw_xc) THEN
     760             :                WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     761         137 :                   "GAPW_XC| Exc from hard and soft atomic rho1:      ", exc1_energy
     762             :             END IF
     763             :          END IF
     764        9320 :          IF (dft_control%smear) THEN
     765             :             WRITE (UNIT=output_unit, FMT="((T3,A,T56,F25.14))") &
     766         237 :                "Electronic entropic energy:", energy%kTS
     767             :             WRITE (UNIT=output_unit, FMT="((T3,A,T56,F25.14))") &
     768         237 :                "Fermi energy:", energy%efermi
     769             :          END IF
     770        9320 :          IF (dft_control%dft_plus_u) THEN
     771             :             WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     772          48 :                "DFT+U energy:", energy%dft_plus_u
     773             :          END IF
     774        9320 :          IF (dft_control%do_sccs) THEN
     775           6 :             WRITE (UNIT=output_unit, FMT="(A)") ""
     776           6 :             CALL print_sccs_results(energy, dft_control%sccs_control, output_unit)
     777             :          END IF
     778        9320 :          IF (qmmm) THEN
     779             :             WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     780        1746 :                "QM/MM Electrostatic energy:                    ", energy%qmmm_el
     781        1746 :             IF (qs_env%qmmm_env_qm%image_charge) THEN
     782             :                WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     783          10 :                   "QM/MM image charge energy:                ", energy%image_charge
     784             :             END IF
     785             :          END IF
     786        9320 :          IF (dft_control%qs_control%mulliken_restraint) THEN
     787             :             WRITE (UNIT=output_unit, FMT="(T3,A,T56,F25.14)") &
     788           3 :                "Mulliken restraint energy: ", energy%mulliken
     789             :          END IF
     790        9320 :          IF (dft_control%qs_control%semi_empirical) THEN
     791             :             WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     792        1928 :                "Total energy [eV]:                             ", energy%total*evolt
     793             :             WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     794        1928 :                "Atomic reference energy [eV]:                  ", energy%core_self*evolt, &
     795        1928 :                "Heat of formation [kcal/mol]:                  ", &
     796        3856 :                (energy%total + energy%core_self)*kcalmol
     797             :          ELSE
     798             :             WRITE (UNIT=output_unit, FMT="(/,(T3,A,T56,F25.14))") &
     799        7392 :                "Total energy:                                  ", energy%total
     800             :          END IF
     801        9320 :          IF (qmmm) THEN
     802        1746 :             IF (qs_env%qmmm_env_qm%image_charge) THEN
     803          10 :                CALL print_image_coefficients(qs_env%image_coeff, qs_env)
     804             :             END IF
     805             :          END IF
     806        9320 :          CALL m_flush(output_unit)
     807             :       END IF
     808             : 
     809       18262 :       CALL timestop(handle)
     810             : 
     811       18262 :    END SUBROUTINE qs_scf_print_scf_summary
     812             : 
     813             : ! **************************************************************************************************
     814             : !> \brief collects the 'heavy duty' printing tasks out of the SCF loop
     815             : !> \param qs_env ...
     816             : !> \param scf_env ...
     817             : !> \param para_env ...
     818             : !> \par History
     819             : !>      03.2006 created [Joost VandeVondele]
     820             : ! **************************************************************************************************
     821      450441 :    SUBROUTINE qs_scf_loop_print(qs_env, scf_env, para_env)
     822             :       TYPE(qs_environment_type), POINTER                 :: qs_env
     823             :       TYPE(qs_scf_env_type), POINTER                     :: scf_env
     824             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     825             : 
     826             :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'qs_scf_loop_print'
     827             : 
     828             :       INTEGER                                            :: after, handle, ic, ispin, iw
     829             :       LOGICAL                                            :: do_kpoints, omit_headers
     830             :       REAL(KIND=dp)                                      :: mo_mag_max, mo_mag_min, orthonormality
     831             :       TYPE(cp_logger_type), POINTER                      :: logger
     832      150147 :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: matrix_ks, matrix_p, matrix_s
     833             :       TYPE(dft_control_type), POINTER                    :: dft_control
     834      150147 :       TYPE(mo_set_type), DIMENSION(:), POINTER           :: mos
     835             :       TYPE(qs_rho_type), POINTER                         :: rho
     836             :       TYPE(section_vals_type), POINTER                   :: dft_section, input, scf_section
     837             : 
     838      300294 :       logger => cp_get_default_logger()
     839      150147 :       CALL timeset(routineN, handle)
     840             : 
     841             :       CALL get_qs_env(qs_env=qs_env, input=input, dft_control=dft_control, &
     842      150147 :                       do_kpoints=do_kpoints)
     843             : 
     844      150147 :       dft_section => section_vals_get_subs_vals(input, "DFT")
     845      150147 :       scf_section => section_vals_get_subs_vals(dft_section, "SCF")
     846             : 
     847      150147 :       CALL section_vals_val_get(input, "DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
     848      322352 :       DO ispin = 1, dft_control%nspins
     849             : 
     850      172205 :          IF (BTEST(cp_print_key_should_output(logger%iter_info, &
     851             :                                               dft_section, "PRINT%AO_MATRICES/DENSITY"), cp_p_file)) THEN
     852        5562 :             CALL get_qs_env(qs_env, rho=rho)
     853        5562 :             CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
     854             :             iw = cp_print_key_unit_nr(logger, dft_section, "PRINT%AO_MATRICES/DENSITY", &
     855        5562 :                                       extension=".Log")
     856        5562 :             CALL section_vals_val_get(dft_section, "PRINT%AO_MATRICES%NDIGITS", i_val=after)
     857        5562 :             after = MIN(MAX(after, 1), 16)
     858       11124 :             DO ic = 1, SIZE(matrix_p, 2)
     859             :                CALL cp_dbcsr_write_sparse_matrix(matrix_p(ispin, ic)%matrix, 4, after, qs_env, para_env, &
     860       11124 :                                                  output_unit=iw, omit_headers=omit_headers)
     861             :             END DO
     862             :             CALL cp_print_key_finished_output(iw, logger, dft_section, &
     863        5562 :                                               "PRINT%AO_MATRICES/DENSITY")
     864             :          END IF
     865             : 
     866      172205 :          IF (BTEST(cp_print_key_should_output(logger%iter_info, &
     867      150147 :                                               dft_section, "PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"), cp_p_file)) THEN
     868             :             iw = cp_print_key_unit_nr(logger, dft_section, "PRINT%AO_MATRICES/KOHN_SHAM_MATRIX", &
     869        4436 :                                       extension=".Log")
     870        4436 :             CALL section_vals_val_get(dft_section, "PRINT%AO_MATRICES%NDIGITS", i_val=after)
     871        4436 :             after = MIN(MAX(after, 1), 16)
     872        4436 :             CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=matrix_ks)
     873        8872 :             DO ic = 1, SIZE(matrix_ks, 2)
     874        8872 :                IF (dft_control%qs_control%semi_empirical) THEN
     875             :                   CALL cp_dbcsr_write_sparse_matrix(matrix_ks(ispin, ic)%matrix, 4, after, qs_env, para_env, &
     876        4432 :                                                     scale=evolt, output_unit=iw, omit_headers=omit_headers)
     877             :                ELSE
     878             :                   CALL cp_dbcsr_write_sparse_matrix(matrix_ks(ispin, ic)%matrix, 4, after, qs_env, para_env, &
     879           4 :                                                     output_unit=iw, omit_headers=omit_headers)
     880             :                END IF
     881             :             END DO
     882             :             CALL cp_print_key_finished_output(iw, logger, dft_section, &
     883        4436 :                                               "PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
     884             :          END IF
     885             : 
     886             :       END DO
     887             : 
     888      150147 :       IF (BTEST(cp_print_key_should_output(logger%iter_info, &
     889             :                                            scf_section, "PRINT%MO_ORTHONORMALITY"), cp_p_file)) THEN
     890         850 :          IF (do_kpoints) THEN
     891             :             iw = cp_print_key_unit_nr(logger, scf_section, "PRINT%MO_ORTHONORMALITY", &
     892           4 :                                       extension=".scfLog")
     893           4 :             IF (iw > 0) THEN
     894             :                WRITE (iw, '(T8,A)') &
     895           2 :                   " K-points: Maximum deviation from MO S-orthonormality not determined"
     896             :             END IF
     897             :             CALL cp_print_key_finished_output(iw, logger, scf_section, &
     898           4 :                                               "PRINT%MO_ORTHONORMALITY")
     899             :          ELSE
     900         846 :             CALL get_qs_env(qs_env, mos=mos)
     901         846 :             IF (scf_env%method == special_diag_method_nr) THEN
     902          58 :                CALL calculate_orthonormality(orthonormality, mos)
     903             :             ELSE
     904         788 :                CALL get_qs_env(qs_env=qs_env, matrix_s_kp=matrix_s)
     905         788 :                CALL calculate_orthonormality(orthonormality, mos, matrix_s(1, 1)%matrix)
     906             :             END IF
     907             :             iw = cp_print_key_unit_nr(logger, scf_section, "PRINT%MO_ORTHONORMALITY", &
     908         846 :                                       extension=".scfLog")
     909         846 :             IF (iw > 0) THEN
     910             :                WRITE (iw, '(T8,A,T61,E20.4)') &
     911         423 :                   " Maximum deviation from MO S-orthonormality", orthonormality
     912             :             END IF
     913             :             CALL cp_print_key_finished_output(iw, logger, scf_section, &
     914         846 :                                               "PRINT%MO_ORTHONORMALITY")
     915             :          END IF
     916             :       END IF
     917      150147 :       IF (BTEST(cp_print_key_should_output(logger%iter_info, &
     918             :                                            scf_section, "PRINT%MO_MAGNITUDE"), cp_p_file)) THEN
     919         850 :          IF (do_kpoints) THEN
     920             :             iw = cp_print_key_unit_nr(logger, scf_section, "PRINT%MO_MAGNITUDE", &
     921           4 :                                       extension=".scfLog")
     922           4 :             IF (iw > 0) THEN
     923             :                WRITE (iw, '(T8,A)') &
     924           2 :                   " K-points: Minimum/Maximum MO magnitude not determined"
     925             :             END IF
     926             :             CALL cp_print_key_finished_output(iw, logger, scf_section, &
     927           4 :                                               "PRINT%MO_MAGNITUDE")
     928             :          ELSE
     929         846 :             CALL get_qs_env(qs_env, mos=mos)
     930         846 :             CALL calculate_magnitude(mos, mo_mag_min, mo_mag_max)
     931             :             iw = cp_print_key_unit_nr(logger, scf_section, "PRINT%MO_MAGNITUDE", &
     932         846 :                                       extension=".scfLog")
     933         846 :             IF (iw > 0) THEN
     934             :                WRITE (iw, '(T8,A,T41,2E20.4)') &
     935         423 :                   " Minimum/Maximum MO magnitude ", mo_mag_min, mo_mag_max
     936             :             END IF
     937             :             CALL cp_print_key_finished_output(iw, logger, scf_section, &
     938         846 :                                               "PRINT%MO_MAGNITUDE")
     939             :          END IF
     940             :       END IF
     941             : 
     942      150147 :       CALL timestop(handle)
     943             : 
     944      150147 :    END SUBROUTINE qs_scf_loop_print
     945             : 
     946             : ! **************************************************************************************************
     947             : !> \brief writes CDFT constraint information and optionally CDFT scf loop info
     948             : !> \param output_unit where to write the information
     949             : !> \param scf_control settings of the SCF loop
     950             : !> \param scf_env the env which holds convergence data
     951             : !> \param cdft_control the env which holds information about the constraint
     952             : !> \param energy the total energy
     953             : !> \param total_steps the total number of performed SCF iterations
     954             : !> \param should_stop if the calculation should stop
     955             : !> \param outer_loop_converged logical which determines if the CDFT SCF loop converged
     956             : !> \param cdft_loop logical which determines a CDFT SCF loop is active
     957             : !> \par History
     958             : !>      12.2015 created [Nico Holmberg]
     959             : ! **************************************************************************************************
     960         626 :    SUBROUTINE qs_scf_cdft_info(output_unit, scf_control, scf_env, cdft_control, &
     961             :                                energy, total_steps, should_stop, outer_loop_converged, &
     962             :                                cdft_loop)
     963             :       INTEGER                                            :: output_unit
     964             :       TYPE(scf_control_type), POINTER                    :: scf_control
     965             :       TYPE(qs_scf_env_type), POINTER                     :: scf_env
     966             :       TYPE(cdft_control_type), POINTER                   :: cdft_control
     967             :       TYPE(qs_energy_type), POINTER                      :: energy
     968             :       INTEGER                                            :: total_steps
     969             :       LOGICAL, INTENT(IN)                                :: should_stop, outer_loop_converged, &
     970             :                                                             cdft_loop
     971             : 
     972             :       REAL(KIND=dp)                                      :: outer_loop_eps
     973             : 
     974         626 :       IF (cdft_loop) THEN
     975        1622 :          outer_loop_eps = SQRT(MAXVAL(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count)**2))
     976         512 :          IF (output_unit > 0) WRITE (output_unit, '(/,T3,A,I4,A,E10.2,A,F22.10)') &
     977         274 :             "CDFT SCF iter =  ", scf_env%outer_scf%iter_count, &
     978         548 :             " RMS gradient = ", outer_loop_eps, " energy =", energy%total
     979         512 :          IF (outer_loop_converged) THEN
     980         270 :             IF (output_unit > 0) WRITE (output_unit, '(T3,A,I4,A,I4,A,/)') &
     981         153 :                "CDFT SCF loop converged in", scf_env%outer_scf%iter_count, &
     982         306 :                " iterations or ", total_steps, " steps"
     983             :          END IF
     984             :          IF ((scf_env%outer_scf%iter_count > scf_control%outer_scf%max_scf .OR. should_stop) &
     985         512 :              .AND. .NOT. outer_loop_converged) THEN
     986          56 :             IF (output_unit > 0) WRITE (output_unit, '(T3,A,I4,A,I4,A,/)') &
     987          28 :                "CDFT SCF loop FAILED to converge after ", &
     988          56 :                scf_env%outer_scf%iter_count, " iterations or ", total_steps, " steps"
     989             :          END IF
     990             :       END IF
     991         626 :       CALL qs_scf_cdft_constraint_info(output_unit, cdft_control)
     992             : 
     993         626 :    END SUBROUTINE qs_scf_cdft_info
     994             : 
     995             : ! **************************************************************************************************
     996             : !> \brief writes information about the CDFT env
     997             : !> \param output_unit where to write the information
     998             : !> \param cdft_control the CDFT env that stores information about the constraint calculation
     999             : !> \par History
    1000             : !>      12.2015 created [Nico Holmberg]
    1001             : ! **************************************************************************************************
    1002         181 :    SUBROUTINE qs_scf_cdft_initial_info(output_unit, cdft_control)
    1003             :       INTEGER                                            :: output_unit
    1004             :       TYPE(cdft_control_type), POINTER                   :: cdft_control
    1005             : 
    1006         181 :       IF (output_unit > 0) THEN
    1007             :          WRITE (output_unit, '(/,A)') &
    1008         181 :             "  ---------------------------------- CDFT --------------------------------------"
    1009             :          WRITE (output_unit, '(A)') &
    1010         181 :             "  Optimizing a density constraint in an external SCF loop "
    1011         181 :          WRITE (output_unit, '(A)') "  "
    1012         196 :          SELECT CASE (cdft_control%type)
    1013             :          CASE (outer_scf_hirshfeld_constraint)
    1014          15 :             WRITE (output_unit, '(A)') "  Type of constraint:     Hirshfeld"
    1015             :          CASE (outer_scf_becke_constraint)
    1016         181 :             WRITE (output_unit, '(A)') "  Type of constraint:         Becke"
    1017             :          END SELECT
    1018         181 :          WRITE (output_unit, '(A,I8)') "  Number of constraints:   ", SIZE(cdft_control%group)
    1019         181 :          WRITE (output_unit, '(A,L8)') "  Using fragment densities:", cdft_control%fragment_density
    1020         181 :          WRITE (output_unit, '(A)') "  "
    1021         181 :          IF (cdft_control%atomic_charges) WRITE (output_unit, '(A,/)') "  Calculating atomic CDFT charges"
    1022         181 :          SELECT CASE (cdft_control%constraint_control%optimizer)
    1023             :          CASE (outer_scf_optimizer_sd)
    1024             :             WRITE (output_unit, '(A)') &
    1025           0 :                "  Minimizer               : SD                  : steepest descent"
    1026             :          CASE (outer_scf_optimizer_diis)
    1027             :             WRITE (output_unit, '(A)') &
    1028           5 :                "  Minimizer               : DIIS                : direct inversion"
    1029             :             WRITE (output_unit, '(A)') &
    1030           5 :                "                                                       in the iterative subspace"
    1031             :             WRITE (output_unit, '(A,I3,A)') &
    1032           5 :                "                                                  using ", &
    1033          10 :                cdft_control%constraint_control%diis_buffer_length, " DIIS vectors"
    1034             :          CASE (outer_scf_optimizer_bisect)
    1035             :             WRITE (output_unit, '(A)') &
    1036         115 :                "  Minimizer               : BISECT              : gradient bisection"
    1037             :             WRITE (output_unit, '(A,I3)') &
    1038         115 :                "                                                  using a trust count of", &
    1039         230 :                cdft_control%constraint_control%bisect_trust_count
    1040             :          CASE (outer_scf_optimizer_broyden, outer_scf_optimizer_newton, &
    1041             :                outer_scf_optimizer_newton_ls)
    1042             :             CALL cdft_opt_type_write(cdft_control%constraint_control%cdft_opt_control, &
    1043          60 :                                      cdft_control%constraint_control%optimizer, output_unit)
    1044             :          CASE (outer_scf_optimizer_secant)
    1045           1 :             WRITE (output_unit, '(A)') "  Minimizer               : Secant"
    1046             :          CASE DEFAULT
    1047         181 :             CPABORT("")
    1048             :          END SELECT
    1049             :          WRITE (output_unit, '(/,A,L7)') &
    1050         181 :             "  Reusing OT preconditioner: ", cdft_control%reuse_precond
    1051         181 :          IF (cdft_control%reuse_precond) THEN
    1052             :             WRITE (output_unit, '(A,I3,A,I3,A)') &
    1053           0 :                "       using old preconditioner for up to ", &
    1054           0 :                cdft_control%max_reuse, " subsequent CDFT SCF"
    1055             :             WRITE (output_unit, '(A,I3,A,I3,A)') &
    1056           0 :                "       iterations if the relevant loop converged in less than ", &
    1057           0 :                cdft_control%precond_freq, " steps"
    1058             :          END IF
    1059         196 :          SELECT CASE (cdft_control%type)
    1060             :          CASE (outer_scf_hirshfeld_constraint)
    1061          15 :             WRITE (output_unit, '(/,A)') "  Hirshfeld constraint settings"
    1062          15 :             WRITE (output_unit, '(A)') "  "
    1063          15 :             SELECT CASE (cdft_control%hirshfeld_control%shape_function)
    1064             :             CASE (shape_function_gaussian)
    1065             :                WRITE (output_unit, '(A, A8)') &
    1066          13 :                   "  Shape function type:     ", "Gaussian"
    1067             :                WRITE (output_unit, '(A)', ADVANCE='NO') &
    1068          13 :                   "  Type of Gaussian:   "
    1069          13 :                SELECT CASE (cdft_control%hirshfeld_control%gaussian_shape)
    1070             :                CASE (radius_default)
    1071           2 :                   WRITE (output_unit, '(A13)') "Default"
    1072             :                CASE (radius_covalent)
    1073          11 :                   WRITE (output_unit, '(A13)') "Covalent"
    1074             :                CASE (radius_single)
    1075           0 :                   WRITE (output_unit, '(A13)') "Fixed radius"
    1076             :                CASE (radius_vdw)
    1077           0 :                   WRITE (output_unit, '(A13)') "Van der Waals"
    1078             :                CASE (radius_user)
    1079           0 :                   WRITE (output_unit, '(A13)') "User-defined"
    1080             : 
    1081             :                END SELECT
    1082             :             CASE (shape_function_density)
    1083             :                WRITE (output_unit, '(A, A8)') &
    1084           2 :                   "  Shape function type:     ", "Density"
    1085             :             END SELECT
    1086             :          CASE (outer_scf_becke_constraint)
    1087         166 :             WRITE (output_unit, '(/, A)') "  Becke constraint settings"
    1088         166 :             WRITE (output_unit, '(A)') "  "
    1089         166 :             SELECT CASE (cdft_control%becke_control%cutoff_type)
    1090             :             CASE (becke_cutoff_global)
    1091             :                WRITE (output_unit, '(A,F8.3,A)') &
    1092          97 :                   "  Cutoff for partitioning :", cp_unit_from_cp2k(cdft_control%becke_control%rglobal, &
    1093         194 :                                                                    "angstrom"), " angstrom"
    1094             :             CASE (becke_cutoff_element)
    1095             :                WRITE (output_unit, '(A)') &
    1096          69 :                   "  Using element specific cutoffs for partitioning"
    1097             :             END SELECT
    1098             :             WRITE (output_unit, '(A,L7)') &
    1099         166 :                "  Skipping distant gpoints: ", cdft_control%becke_control%should_skip
    1100             :             WRITE (output_unit, '(A,L7)') &
    1101         166 :                "  Precompute gradients    : ", cdft_control%becke_control%in_memory
    1102         166 :             WRITE (output_unit, '(A)') "  "
    1103         166 :             IF (cdft_control%becke_control%adjust) &
    1104             :                WRITE (output_unit, '(A)') &
    1105         110 :                "  Using atomic radii to generate a heteronuclear charge partitioning"
    1106         166 :             WRITE (output_unit, '(A)') "  "
    1107         347 :             IF (.NOT. cdft_control%becke_control%cavity_confine) THEN
    1108             :                WRITE (output_unit, '(A)') &
    1109           9 :                   "  No confinement is active"
    1110             :             ELSE
    1111         157 :                WRITE (output_unit, '(A)') "  Confinement using a Gaussian shaped cavity is active"
    1112         157 :                SELECT CASE (cdft_control%becke_control%cavity_shape)
    1113             :                CASE (radius_single)
    1114             :                   WRITE (output_unit, '(A,F8.4, A)') &
    1115           1 :                      "  Type of Gaussian        : Fixed radius: ", &
    1116           2 :                      cp_unit_from_cp2k(cdft_control%becke_control%rcavity, "angstrom"), " angstrom"
    1117             :                CASE (radius_covalent)
    1118             :                   WRITE (output_unit, '(A)') &
    1119           1 :                      "  Type of Gaussian        : Covalent radius "
    1120             :                CASE (radius_vdw)
    1121             :                   WRITE (output_unit, '(A)') &
    1122         154 :                      "  Type of Gaussian        : vdW radius "
    1123             :                CASE (radius_user)
    1124             :                   WRITE (output_unit, '(A)') &
    1125           1 :                      "  Type of Gaussian        : User radius "
    1126             :                END SELECT
    1127             :                WRITE (output_unit, '(A,ES12.4)') &
    1128         157 :                   "  Cavity threshold        : ", cdft_control%becke_control%eps_cavity
    1129             :             END IF
    1130             :          END SELECT
    1131             :          WRITE (output_unit, '(/,A)') &
    1132         181 :             "  ---------------------------------- CDFT --------------------------------------"
    1133             :       END IF
    1134             : 
    1135         181 :    END SUBROUTINE qs_scf_cdft_initial_info
    1136             : 
    1137             : ! **************************************************************************************************
    1138             : !> \brief writes CDFT constraint information
    1139             : !> \param output_unit where to write the information
    1140             : !> \param cdft_control the env which holds information about the constraint
    1141             : !> \par History
    1142             : !>      08.2018 separated from qs_scf_cdft_info to make code callable elsewhere  [Nico Holmberg]
    1143             : ! **************************************************************************************************
    1144        3660 :    SUBROUTINE qs_scf_cdft_constraint_info(output_unit, cdft_control)
    1145             :       INTEGER                                            :: output_unit
    1146             :       TYPE(cdft_control_type), POINTER                   :: cdft_control
    1147             : 
    1148             :       INTEGER                                            :: igroup
    1149             : 
    1150        3660 :       IF (output_unit > 0) THEN
    1151        1955 :          SELECT CASE (cdft_control%type)
    1152             :          CASE (outer_scf_hirshfeld_constraint)
    1153             :             WRITE (output_unit, '(/,T3,A,T60)') &
    1154          61 :                '------------------- Hirshfeld constraint information -------------------'
    1155             :          CASE (outer_scf_becke_constraint)
    1156             :             WRITE (output_unit, '(/,T3,A,T60)') &
    1157        1833 :                '--------------------- Becke constraint information ---------------------'
    1158             :          CASE DEFAULT
    1159        1894 :             CPABORT("Unknown CDFT constraint.")
    1160             :          END SELECT
    1161        4343 :          DO igroup = 1, SIZE(cdft_control%target)
    1162        2449 :             IF (igroup > 1) WRITE (output_unit, '(T3,A)') ' '
    1163             :             WRITE (output_unit, '(T3,A,T54,(3X,I18))') &
    1164        2449 :                'Atomic group                :', igroup
    1165        3788 :             SELECT CASE (cdft_control%group(igroup)%constraint_type)
    1166             :             CASE (cdft_charge_constraint)
    1167        1339 :                IF (cdft_control%group(igroup)%is_fragment_constraint) THEN
    1168             :                   WRITE (output_unit, '(T3,A,T42,A)') &
    1169           6 :                      'Type of constraint          :', ADJUSTR('Charge density constraint (frag.)')
    1170             :                ELSE
    1171             :                   WRITE (output_unit, '(T3,A,T50,A)') &
    1172        1333 :                      'Type of constraint          :', ADJUSTR('Charge density constraint')
    1173             :                END IF
    1174             :             CASE (cdft_magnetization_constraint)
    1175           8 :                IF (cdft_control%group(igroup)%is_fragment_constraint) THEN
    1176             :                   WRITE (output_unit, '(T3,A,T35,A)') &
    1177           6 :                      'Type of constraint          :', ADJUSTR('Magnetization density constraint (frag.)')
    1178             :                ELSE
    1179             :                   WRITE (output_unit, '(T3,A,T43,A)') &
    1180           2 :                      'Type of constraint          :', ADJUSTR('Magnetization density constraint')
    1181             :                END IF
    1182             :             CASE (cdft_alpha_constraint)
    1183         551 :                IF (cdft_control%group(igroup)%is_fragment_constraint) THEN
    1184             :                   WRITE (output_unit, '(T3,A,T38,A)') &
    1185           0 :                      'Type of constraint          :', ADJUSTR('Alpha spin density constraint (frag.)')
    1186             :                ELSE
    1187             :                   WRITE (output_unit, '(T3,A,T46,A)') &
    1188         551 :                      'Type of constraint          :', ADJUSTR('Alpha spin density constraint')
    1189             :                END IF
    1190             :             CASE (cdft_beta_constraint)
    1191         551 :                IF (cdft_control%group(igroup)%is_fragment_constraint) THEN
    1192             :                   WRITE (output_unit, '(T3,A,T39,A)') &
    1193           0 :                      'Type of constraint          :', ADJUSTR('Beta spin density constraint (frag.)')
    1194             :                ELSE
    1195             :                   WRITE (output_unit, '(T3,A,T47,A)') &
    1196         551 :                      'Type of constraint          :', ADJUSTR('Beta spin density constraint')
    1197             :                END IF
    1198             :             CASE DEFAULT
    1199        2449 :                CPABORT("Unknown constraint type.")
    1200             :             END SELECT
    1201             :             WRITE (output_unit, '(T3,A,T54,(3X,F18.12))') &
    1202        2449 :                'Target value of constraint  :', cdft_control%target(igroup)
    1203             :             WRITE (output_unit, '(T3,A,T54,(3X,F18.12))') &
    1204        2449 :                'Current value of constraint :', cdft_control%value(igroup)
    1205             :             WRITE (output_unit, '(T3,A,T59,(3X,ES13.3))') &
    1206        2449 :                'Deviation from target       :', cdft_control%value(igroup) - cdft_control%target(igroup)
    1207             :             WRITE (output_unit, '(T3,A,T54,(3X,F18.12))') &
    1208        4343 :                'Strength of constraint      :', cdft_control%strength(igroup)
    1209             :          END DO
    1210             :          WRITE (output_unit, '(T3,A)') &
    1211        1894 :             '------------------------------------------------------------------------'
    1212             :       END IF
    1213             : 
    1214        3660 :    END SUBROUTINE qs_scf_cdft_constraint_info
    1215             : 
    1216             : END MODULE qs_scf_output

Generated by: LCOV version 1.15