LCOV - code coverage report
Current view: top level - src - qs_ot_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:32ddf85) Lines: 443 479 92.5 %
Date: 2025-05-17 08:08:58 Functions: 5 7 71.4 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \brief orbital transformations
      10             : !> \par History
      11             : !>      Added Taylor expansion based computation of the matrix functions (01.2004)
      12             : !>      added additional rotation variables for non-equivalent occupied orbs (08.2004)
      13             : !> \author Joost VandeVondele (06.2002)
      14             : ! **************************************************************************************************
      15             : MODULE qs_ot_types
      16             :    USE bibliography,                    ONLY: VandeVondele2003,&
      17             :                                               Weber2008,&
      18             :                                               cite_reference
      19             :    USE cp_blacs_env,                    ONLY: cp_blacs_env_release,&
      20             :                                               cp_blacs_env_type
      21             :    USE cp_dbcsr_api,                    ONLY: dbcsr_init_p,&
      22             :                                               dbcsr_p_type,&
      23             :                                               dbcsr_release_p,&
      24             :                                               dbcsr_set,&
      25             :                                               dbcsr_type,&
      26             :                                               dbcsr_type_no_symmetry
      27             :    USE cp_dbcsr_operations,             ONLY: cp_dbcsr_m_by_n_from_row_template,&
      28             :                                               cp_dbcsr_m_by_n_from_template,&
      29             :                                               dbcsr_allocate_matrix_set,&
      30             :                                               dbcsr_deallocate_matrix_set
      31             :    USE cp_fm_struct,                    ONLY: cp_fm_struct_get,&
      32             :                                               cp_fm_struct_type
      33             :    USE input_constants,                 ONLY: &
      34             :         cholesky_reduce, ls_2pnt, ls_3pnt, ls_adapt, ls_gold, ls_none, ot_algo_irac, &
      35             :         ot_algo_taylor_or_diag, ot_chol_irac, ot_lwdn_irac, ot_mini_broyden, ot_mini_cg, &
      36             :         ot_mini_diis, ot_mini_sd, ot_poly_irac, ot_precond_full_all, ot_precond_full_kinetic, &
      37             :         ot_precond_full_single, ot_precond_full_single_inverse, ot_precond_none, &
      38             :         ot_precond_s_inverse, ot_precond_solver_default, ot_precond_solver_direct, &
      39             :         ot_precond_solver_inv_chol, ot_precond_solver_update
      40             :    USE input_section_types,             ONLY: section_vals_type,&
      41             :                                               section_vals_val_get
      42             :    USE kinds,                           ONLY: dp
      43             :    USE message_passing,                 ONLY: mp_para_env_release,&
      44             :                                               mp_para_env_type
      45             :    USE preconditioner_types,            ONLY: preconditioner_type
      46             : #include "./base/base_uses.f90"
      47             : 
      48             :    IMPLICIT NONE
      49             : 
      50             :    PRIVATE
      51             : 
      52             :    PUBLIC  :: qs_ot_type
      53             :    PUBLIC  :: qs_ot_settings_type
      54             :    PUBLIC  :: qs_ot_destroy
      55             :    PUBLIC  :: qs_ot_allocate
      56             :    PUBLIC  :: qs_ot_init
      57             :    PUBLIC  :: qs_ot_settings_init
      58             :    PUBLIC  :: ot_readwrite_input
      59             : 
      60             : ! **************************************************************************************************
      61             : !> \brief notice, this variable needs to be copyable, needed for spins as e.g. in qs_ot_scf
      62             : ! **************************************************************************************************
      63             :    TYPE qs_ot_settings_type
      64             :       LOGICAL           :: do_rotation = .FALSE., do_ener = .FALSE.
      65             :       LOGICAL           :: ks = .FALSE.
      66             :       CHARACTER(LEN=4)  :: ot_method = ""
      67             :       CHARACTER(LEN=3)  :: ot_algorithm = ""
      68             :       CHARACTER(LEN=4)  :: line_search_method = ""
      69             :       CHARACTER(LEN=20) :: preconditioner_name = ""
      70             :       INTEGER           :: preconditioner_type = -1
      71             :       INTEGER           :: cholesky_type = -1
      72             :       INTEGER           :: ot_state = 0
      73             :       CHARACTER(LEN=20) :: precond_solver_name = ""
      74             :       INTEGER           :: precond_solver_type = -1
      75             :       LOGICAL           :: safer_diis = .FALSE.
      76             :       REAL(KIND=dp)     :: ds_min = -1.0_dp
      77             :       REAL(KIND=dp)     :: energy_gap = -1.0_dp
      78             :       INTEGER           :: diis_m = -1
      79             :       INTEGER           :: max_scf_diis = 0
      80             :       REAL(KIND=dp)     :: gold_target = -1.0_dp
      81             :       REAL(KIND=dp)     :: eps_taylor = -1.0_dp ! minimum accuracy of Taylor expansion
      82             :       INTEGER           :: max_taylor = -1 ! maximum order of Taylor expansion before switching to diagonalization
      83             :       INTEGER           :: irac_degree = -1 ! used to control the refinement polynomial degree
      84             :       INTEGER           :: max_irac = -1 ! maximum number of iteration for refinement
      85             :       REAL(KIND=dp)     :: eps_irac = -1.0_dp ! target accuracy for refinement
      86             :       REAL(KIND=dp)     :: eps_irac_quick_exit = -1.0_dp
      87             :       REAL(KIND=dp)     :: eps_irac_filter_matrix = -1.0_dp
      88             :       REAL(KIND=dp)     :: eps_irac_switch = -1.0_dp
      89             :       LOGICAL           :: on_the_fly_loc = .FALSE.
      90             :       CHARACTER(LEN=4)  :: ortho_irac = ""
      91             :       LOGICAL           :: occupation_preconditioner = .FALSE., add_nondiag_energy = .FALSE.
      92             :       REAL(KIND=dp)     :: nondiag_energy_strength = -1.0_dp
      93             :       REAL(KIND=dp)     :: broyden_beta = -1.0_dp, broyden_gamma = -1.0_dp, broyden_sigma = -1.0_dp
      94             :       REAL(KIND=dp)     :: broyden_eta = -1.0_dp, broyden_omega = -1.0_dp, broyden_sigma_decrease = -1.0_dp
      95             :       REAL(KIND=dp)     :: broyden_sigma_min = -1.0_dp
      96             :       LOGICAL           :: broyden_forget_history = .FALSE., broyden_adaptive_sigma = .FALSE.
      97             :       LOGICAL           :: broyden_enable_flip = .FALSE.
      98             :    END TYPE qs_ot_settings_type
      99             : 
     100             : ! **************************************************************************************************
     101             :    TYPE qs_ot_type
     102             :       ! this sets the method to be used
     103             :       TYPE(qs_ot_settings_type) :: settings = qs_ot_settings_type()
     104             :       LOGICAL                   :: restricted = .FALSE.
     105             : 
     106             :       ! first part of the variables, for occupied subspace invariant optimisation
     107             : 
     108             :       ! add a preconditioner matrix. should be symmetric and positive definite
     109             :       ! the type of this matrix might change in the future
     110             :       TYPE(preconditioner_type), POINTER :: preconditioner => NULL()
     111             : 
     112             :       ! these will/might change during iterations
     113             : 
     114             :       ! OT / TOD
     115             :       TYPE(dbcsr_type), POINTER :: matrix_p => NULL()
     116             :       TYPE(dbcsr_type), POINTER :: matrix_r => NULL()
     117             :       TYPE(dbcsr_type), POINTER :: matrix_sinp => NULL()
     118             :       TYPE(dbcsr_type), POINTER :: matrix_cosp => NULL()
     119             :       TYPE(dbcsr_type), POINTER :: matrix_sinp_b => NULL()
     120             :       TYPE(dbcsr_type), POINTER :: matrix_cosp_b => NULL()
     121             :       TYPE(dbcsr_type), POINTER :: matrix_buf1 => NULL()
     122             :       TYPE(dbcsr_type), POINTER :: matrix_buf2 => NULL()
     123             :       TYPE(dbcsr_type), POINTER :: matrix_buf3 => NULL()
     124             :       TYPE(dbcsr_type), POINTER :: matrix_buf4 => NULL()
     125             :       TYPE(dbcsr_type), POINTER :: matrix_os => NULL()
     126             :       TYPE(dbcsr_type), POINTER :: matrix_buf1_ortho => NULL()
     127             :       TYPE(dbcsr_type), POINTER :: matrix_buf2_ortho => NULL()
     128             : 
     129             :       REAL(KIND=dp), DIMENSION(:), POINTER :: evals => NULL()
     130             :       REAL(KIND=dp), DIMENSION(:), POINTER :: dum => NULL()
     131             : 
     132             :       ! matrix os valid
     133             :       LOGICAL :: os_valid = .FALSE.
     134             : 
     135             :       ! for efficient/parallel writing to the blacs_matrix
     136             :       TYPE(mp_para_env_type), POINTER :: para_env => NULL()
     137             :       TYPE(cp_blacs_env_type), POINTER :: blacs_env => NULL()
     138             : 
     139             :       ! mo-like vectors
     140             :       TYPE(dbcsr_type), POINTER :: matrix_c0 => NULL(), matrix_sc0 => NULL(), matrix_psc0 => NULL()
     141             : 
     142             :       ! OT / IR
     143             :       TYPE(dbcsr_type), POINTER :: buf1_k_k_nosym => NULL(), buf2_k_k_nosym => NULL(), &
     144             :                                    buf3_k_k_nosym => NULL(), buf4_k_k_nosym => NULL(), &
     145             :                                    buf1_k_k_sym => NULL(), buf2_k_k_sym => NULL(), &
     146             :                                    buf3_k_k_sym => NULL(), buf4_k_k_sym => NULL(), &
     147             :                                    p_k_k_sym => NULL(), buf1_n_k => NULL(), buf1_n_k_dp => NULL()
     148             : 
     149             :       ! only here for the ease of programming. These will have to be supplied
     150             :       ! explicitly at all times
     151             :       TYPE(dbcsr_type), POINTER :: matrix_x => NULL(), matrix_sx => NULL(), matrix_gx => NULL()
     152             :       TYPE(dbcsr_type), POINTER :: matrix_dx => NULL(), matrix_gx_old => NULL()
     153             : 
     154             :       LOGICAL :: use_gx_old = .FALSE., use_dx = .FALSE.
     155             : 
     156             :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_h_e => NULL(), matrix_h_x => NULL()
     157             : 
     158             :       REAL(KIND=dp), DIMENSION(:, :), POINTER  :: ls_diis => NULL()
     159             :       REAL(KIND=dp), DIMENSION(:, :), POINTER  :: lss_diis => NULL()
     160             :       REAL(KIND=dp), DIMENSION(:), POINTER  :: c_diis => NULL()
     161             :       REAL(KIND=dp), DIMENSION(:), POINTER  :: c_broy => NULL()
     162             :       REAL(KIND=dp), DIMENSION(:), POINTER  :: energy_h => NULL()
     163             :       INTEGER, DIMENSION(:), POINTER         :: ipivot => NULL()
     164             : 
     165             :       REAL(KIND=dp)    :: ot_pos(53) = -1.0_dp, ot_energy(53) = -1.0_dp, ot_grad(53) = -1.0_dp ! HARD LIMIT FOR THE LS
     166             :       INTEGER          :: line_search_left = -1, line_search_right = -1, line_search_mid = -1
     167             :       INTEGER          :: line_search_count = -1
     168             :       LOGICAL          :: line_search_might_be_done = .FALSE.
     169             :       REAL(KIND=dp)    :: delta = -1.0_dp, gnorm = -1.0_dp, gnorm_old = -1.0_dp, etotal = -1.0_dp, gradient = -1.0_dp
     170             :       LOGICAL          :: energy_only = .FALSE.
     171             :       INTEGER          :: diis_iter = -1
     172             :       CHARACTER(LEN=8) :: OT_METHOD_FULL = ""
     173             :       INTEGER          :: OT_count = -1
     174             :       REAL(KIND=dp)    :: ds_min = -1.0_dp
     175             :       REAL(KIND=dp)    :: broyden_adaptive_sigma = -1.0_dp
     176             : 
     177             :       LOGICAL          :: do_taylor = .FALSE.
     178             :       INTEGER          :: taylor_order = -1
     179             :       REAL(KIND=dp)    :: largest_eval_upper_bound = -1.0_dp
     180             : 
     181             :       ! second part of the variables, if an explicit rotation is required as well
     182             :       TYPE(dbcsr_type), POINTER :: rot_mat_u => NULL() ! rotation matrix
     183             :       TYPE(dbcsr_type), POINTER :: rot_mat_x => NULL() ! antisymmetric matrix that parametrises rot_matrix_u
     184             :       TYPE(dbcsr_type), POINTER :: rot_mat_dedu => NULL() ! derivative of the total energy wrt to u
     185             :       TYPE(dbcsr_type), POINTER :: rot_mat_chc => NULL() ! for convencience, the matrix c^T H c
     186             : 
     187             :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rot_mat_h_e => NULL()
     188             :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rot_mat_h_x => NULL()
     189             :       TYPE(dbcsr_type), POINTER :: rot_mat_gx => NULL()
     190             :       TYPE(dbcsr_type), POINTER :: rot_mat_gx_old => NULL()
     191             :       TYPE(dbcsr_type), POINTER :: rot_mat_dx => NULL()
     192             : 
     193             :       REAL(KIND=dp), DIMENSION(:), POINTER :: rot_mat_evals => NULL()
     194             :       TYPE(dbcsr_type), POINTER :: rot_mat_evec_re => NULL()
     195             :       TYPE(dbcsr_type), POINTER :: rot_mat_evec_im => NULL()
     196             : 
     197             :       ! third part of the variables, if we need to optimize orbital energies
     198             :       REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_x => NULL()
     199             :       REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_dx => NULL()
     200             :       REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_gx => NULL()
     201             :       REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_gx_old => NULL()
     202             :       REAL(KIND=dp), POINTER, DIMENSION(:, :) :: ener_h_e => NULL()
     203             :       REAL(KIND=dp), POINTER, DIMENSION(:, :) :: ener_h_x => NULL()
     204             :    END TYPE qs_ot_type
     205             : 
     206             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_ot_types'
     207             : 
     208             : CONTAINS
     209             : 
     210             : ! **************************************************************************************************
     211             : !> \brief sets default values for the settings type
     212             : !> \param settings ...
     213             : !> \par History
     214             : !>      10.2004 created [Joost VandeVondele]
     215             : ! **************************************************************************************************
     216       14459 :    SUBROUTINE qs_ot_settings_init(settings)
     217             :       TYPE(qs_ot_settings_type)                          :: settings
     218             : 
     219       14459 :       settings%ot_method = "CG"
     220       14459 :       settings%ot_algorithm = "TOD"
     221       14459 :       settings%diis_m = 7
     222       14459 :       settings%preconditioner_name = "FULL_KINETIC"
     223       14459 :       settings%preconditioner_type = ot_precond_full_kinetic
     224       14459 :       settings%cholesky_type = cholesky_reduce
     225       14459 :       settings%precond_solver_name = "CHOLESKY_INVERSE"
     226       14459 :       settings%precond_solver_type = ot_precond_solver_inv_chol
     227       14459 :       settings%line_search_method = "2PNT"
     228       14459 :       settings%ds_min = 0.15_dp
     229       14459 :       settings%safer_diis = .TRUE.
     230       14459 :       settings%energy_gap = 0.2_dp
     231       14459 :       settings%eps_taylor = 1.0E-16_dp
     232       14459 :       settings%max_taylor = 4
     233       14459 :       settings%gold_target = 0.01_dp
     234       14459 :       settings%do_rotation = .FALSE.
     235       14459 :       settings%do_ener = .FALSE.
     236       14459 :       settings%irac_degree = 4
     237       14459 :       settings%max_irac = 50
     238       14459 :       settings%max_scf_diis = 0
     239       14459 :       settings%eps_irac = 1.0E-10_dp
     240       14459 :       settings%eps_irac_quick_exit = 1.0E-5_dp
     241       14459 :       settings%eps_irac_switch = 1.0E-2
     242       14459 :       settings%eps_irac_filter_matrix = 0.0_dp
     243       14459 :       settings%on_the_fly_loc = .FALSE.
     244       14459 :       settings%ortho_irac = "CHOL"
     245       14459 :       settings%ks = .TRUE.
     246       14459 :       settings%occupation_preconditioner = .FALSE.
     247       14459 :       settings%add_nondiag_energy = .FALSE.
     248       14459 :       settings%nondiag_energy_strength = 0.0_dp
     249             : 
     250       14459 :    END SUBROUTINE qs_ot_settings_init
     251             : 
     252             : ! **************************************************************************************************
     253             : !> \brief init matrices, needs c0 and sc0 so that c0*sc0=1
     254             : !> \param qs_ot_env ...
     255             : ! **************************************************************************************************
     256        8368 :    SUBROUTINE qs_ot_init(qs_ot_env)
     257             :       TYPE(qs_ot_type)                                   :: qs_ot_env
     258             : 
     259      451872 :       qs_ot_env%OT_energy(:) = 0.0_dp
     260      451872 :       qs_ot_env%OT_pos(:) = 0.0_dp
     261      451872 :       qs_ot_env%OT_grad(:) = 0.0_dp
     262        8368 :       qs_ot_env%line_search_count = 0
     263             : 
     264        8368 :       qs_ot_env%energy_only = .FALSE.
     265        8368 :       qs_ot_env%gnorm_old = 1.0_dp
     266        8368 :       qs_ot_env%diis_iter = 0
     267        8368 :       qs_ot_env%ds_min = qs_ot_env%settings%ds_min
     268        8368 :       qs_ot_env%os_valid = .FALSE.
     269             : 
     270        8368 :       CALL dbcsr_set(qs_ot_env%matrix_gx, 0.0_dp)
     271             : 
     272        8368 :       IF (qs_ot_env%use_dx) &
     273        3799 :          CALL dbcsr_set(qs_ot_env%matrix_dx, 0.0_dp)
     274             : 
     275        8368 :       IF (qs_ot_env%use_gx_old) &
     276        3799 :          CALL dbcsr_set(qs_ot_env%matrix_gx_old, 0.0_dp)
     277             : 
     278        8368 :       IF (qs_ot_env%settings%do_rotation) THEN
     279         212 :          CALL dbcsr_set(qs_ot_env%rot_mat_gx, 0.0_dp)
     280         212 :          IF (qs_ot_env%use_dx) &
     281         182 :             CALL dbcsr_set(qs_ot_env%rot_mat_dx, 0.0_dp)
     282         212 :          IF (qs_ot_env%use_gx_old) &
     283         182 :             CALL dbcsr_set(qs_ot_env%rot_mat_gx_old, 0.0_dp)
     284             :       END IF
     285        8368 :       IF (qs_ot_env%settings%do_ener) THEN
     286           0 :          qs_ot_env%ener_gx(:) = 0.0_dp
     287           0 :          IF (qs_ot_env%use_dx) &
     288           0 :             qs_ot_env%ener_dx(:) = 0.0_dp
     289           0 :          IF (qs_ot_env%use_gx_old) &
     290           0 :             qs_ot_env%ener_gx_old(:) = 0.0_dp
     291             :       END IF
     292             : 
     293        8368 :    END SUBROUTINE qs_ot_init
     294             : 
     295             : ! **************************************************************************************************
     296             : !> \brief allocates the data in qs_ot_env, for a calculation with fm_struct_ref
     297             : !>        ortho_k allows for specifying an additional orthogonal subspace (i.e. c will
     298             : !>        be kept orthogonal provided c0 was, used in qs_ot_eigensolver)
     299             : !> \param qs_ot_env ...
     300             : !> \param matrix_s ...
     301             : !> \param fm_struct_ref ...
     302             : !> \param ortho_k ...
     303             : ! **************************************************************************************************
     304        8368 :    SUBROUTINE qs_ot_allocate(qs_ot_env, matrix_s, fm_struct_ref, ortho_k)
     305             :       TYPE(qs_ot_type)                                   :: qs_ot_env
     306             :       TYPE(dbcsr_type), POINTER                          :: matrix_s
     307             :       TYPE(cp_fm_struct_type), POINTER                   :: fm_struct_ref
     308             :       INTEGER, OPTIONAL                                  :: ortho_k
     309             : 
     310             :       INTEGER                                            :: i, k, m_diis, my_ortho_k, n, ncoef
     311             :       TYPE(cp_blacs_env_type), POINTER                   :: context
     312             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     313             : 
     314        8368 :       CALL cite_reference(VandeVondele2003)
     315             : 
     316        8368 :       NULLIFY (qs_ot_env%preconditioner)
     317        8368 :       NULLIFY (qs_ot_env%matrix_psc0)
     318        8368 :       NULLIFY (qs_ot_env%para_env)
     319        8368 :       NULLIFY (qs_ot_env%blacs_env)
     320             : 
     321             :       CALL cp_fm_struct_get(fm_struct_ref, nrow_global=n, ncol_global=k, &
     322        8368 :                             para_env=para_env, context=context)
     323             : 
     324        8368 :       qs_ot_env%para_env => para_env
     325        8368 :       qs_ot_env%blacs_env => context
     326        8368 :       CALL para_env%retain()
     327        8368 :       CALL context%retain()
     328             : 
     329        8368 :       IF (PRESENT(ortho_k)) THEN
     330         534 :          my_ortho_k = ortho_k
     331             :       ELSE
     332        7834 :          my_ortho_k = k
     333             :       END IF
     334             : 
     335        8368 :       m_diis = qs_ot_env%settings%diis_m
     336             : 
     337        8368 :       qs_ot_env%use_gx_old = .FALSE.
     338        8368 :       qs_ot_env%use_dx = .FALSE.
     339             : 
     340        3799 :       SELECT CASE (qs_ot_env%settings%ot_method)
     341             :       CASE ("SD")
     342             :          ! nothing
     343             :       CASE ("CG")
     344        3799 :          qs_ot_env%use_gx_old = .TRUE.
     345        3799 :          qs_ot_env%use_dx = .TRUE.
     346             :       CASE ("DIIS", "BROY")
     347        4559 :          IF (m_diis .LT. 1) CPABORT("m_diis less than one")
     348             :       CASE DEFAULT
     349        8368 :          CPABORT("Unknown option")
     350             :       END SELECT
     351             : 
     352        8368 :       IF (qs_ot_env%settings%ot_method .EQ. "DIIS" .OR. &
     353             :           qs_ot_env%settings%ot_method .EQ. "BROY") THEN
     354       18236 :          ALLOCATE (qs_ot_env%ls_diis(m_diis + 1, m_diis + 1))
     355      344017 :          qs_ot_env%ls_diis = 0.0_dp
     356       13677 :          ALLOCATE (qs_ot_env%lss_diis(m_diis + 1, m_diis + 1))
     357       13677 :          ALLOCATE (qs_ot_env%c_diis(m_diis + 1))
     358       13677 :          ALLOCATE (qs_ot_env%c_broy(m_diis))
     359        9118 :          ALLOCATE (qs_ot_env%energy_h(m_diis))
     360       13677 :          ALLOCATE (qs_ot_env%ipivot(m_diis + 1))
     361             :       END IF
     362             : 
     363       24898 :       ALLOCATE (qs_ot_env%evals(k))
     364       16530 :       ALLOCATE (qs_ot_env%dum(k))
     365             : 
     366        8368 :       NULLIFY (qs_ot_env%matrix_os)
     367        8368 :       NULLIFY (qs_ot_env%matrix_buf1_ortho)
     368        8368 :       NULLIFY (qs_ot_env%matrix_buf2_ortho)
     369        8368 :       NULLIFY (qs_ot_env%matrix_p)
     370        8368 :       NULLIFY (qs_ot_env%matrix_r)
     371        8368 :       NULLIFY (qs_ot_env%matrix_sinp)
     372        8368 :       NULLIFY (qs_ot_env%matrix_cosp)
     373        8368 :       NULLIFY (qs_ot_env%matrix_sinp_b)
     374        8368 :       NULLIFY (qs_ot_env%matrix_cosp_b)
     375        8368 :       NULLIFY (qs_ot_env%matrix_buf1)
     376        8368 :       NULLIFY (qs_ot_env%matrix_buf2)
     377        8368 :       NULLIFY (qs_ot_env%matrix_buf3)
     378        8368 :       NULLIFY (qs_ot_env%matrix_buf4)
     379        8368 :       NULLIFY (qs_ot_env%matrix_c0)
     380        8368 :       NULLIFY (qs_ot_env%matrix_sc0)
     381        8368 :       NULLIFY (qs_ot_env%matrix_x)
     382        8368 :       NULLIFY (qs_ot_env%matrix_sx)
     383        8368 :       NULLIFY (qs_ot_env%matrix_gx)
     384        8368 :       NULLIFY (qs_ot_env%matrix_gx_old)
     385        8368 :       NULLIFY (qs_ot_env%matrix_dx)
     386        8368 :       NULLIFY (qs_ot_env%buf1_k_k_nosym)
     387        8368 :       NULLIFY (qs_ot_env%buf2_k_k_nosym)
     388        8368 :       NULLIFY (qs_ot_env%buf3_k_k_nosym)
     389        8368 :       NULLIFY (qs_ot_env%buf4_k_k_nosym)
     390        8368 :       NULLIFY (qs_ot_env%buf1_k_k_sym)
     391        8368 :       NULLIFY (qs_ot_env%buf2_k_k_sym)
     392        8368 :       NULLIFY (qs_ot_env%buf3_k_k_sym)
     393        8368 :       NULLIFY (qs_ot_env%buf4_k_k_sym)
     394        8368 :       NULLIFY (qs_ot_env%buf1_n_k)
     395        8368 :       NULLIFY (qs_ot_env%buf1_n_k_dp)
     396        8368 :       NULLIFY (qs_ot_env%p_k_k_sym)
     397             : 
     398             :       ! COMMON MATRICES
     399        8368 :       CALL dbcsr_init_p(qs_ot_env%matrix_c0)
     400             :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_c0, template=matrix_s, n=k, &
     401        8368 :                                              sym=dbcsr_type_no_symmetry)
     402             : 
     403        8368 :       CALL dbcsr_init_p(qs_ot_env%matrix_sc0)
     404             :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_sc0, template=matrix_s, n=my_ortho_k, &
     405        8368 :                                              sym=dbcsr_type_no_symmetry)
     406             : 
     407        8368 :       CALL dbcsr_init_p(qs_ot_env%matrix_x)
     408             :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_x, template=matrix_s, n=k, &
     409        8368 :                                              sym=dbcsr_type_no_symmetry)
     410             : 
     411        8368 :       CALL dbcsr_init_p(qs_ot_env%matrix_sx)
     412             :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_sx, template=matrix_s, n=k, &
     413        8368 :                                              sym=dbcsr_type_no_symmetry)
     414             : 
     415        8368 :       CALL dbcsr_init_p(qs_ot_env%matrix_gx)
     416             :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_gx, template=matrix_s, n=k, &
     417        8368 :                                              sym=dbcsr_type_no_symmetry)
     418             : 
     419        8368 :       IF (qs_ot_env%use_dx) THEN
     420        3799 :          CALL dbcsr_init_p(qs_ot_env%matrix_dx)
     421             :          CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_dx, template=matrix_s, n=k, &
     422        3799 :                                                 sym=dbcsr_type_no_symmetry)
     423             :       END IF
     424             : 
     425        8368 :       IF (qs_ot_env%use_gx_old) THEN
     426        3799 :          CALL dbcsr_init_p(qs_ot_env%matrix_gx_old)
     427             :          CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_gx_old, template=matrix_s, n=k, &
     428        3799 :                                                 sym=dbcsr_type_no_symmetry)
     429             :       END IF
     430             : 
     431        7292 :       SELECT CASE (qs_ot_env%settings%ot_algorithm)
     432             :       CASE ("TOD")
     433        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_p)
     434             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_p, template=matrix_s, m=k, n=k, &
     435        7292 :                                             sym=dbcsr_type_no_symmetry)
     436             : 
     437        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_r)
     438             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_r, template=matrix_s, m=k, n=k, &
     439        7292 :                                             sym=dbcsr_type_no_symmetry)
     440             : 
     441        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_sinp)
     442             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_sinp, template=matrix_s, m=k, n=k, &
     443        7292 :                                             sym=dbcsr_type_no_symmetry)
     444             : 
     445        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_cosp)
     446             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_cosp, template=matrix_s, m=k, n=k, &
     447        7292 :                                             sym=dbcsr_type_no_symmetry)
     448             : 
     449        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_sinp_b)
     450             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_sinp_b, template=matrix_s, m=k, n=k, &
     451        7292 :                                             sym=dbcsr_type_no_symmetry)
     452             : 
     453        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_cosp_b)
     454             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_cosp_b, template=matrix_s, m=k, n=k, &
     455        7292 :                                             sym=dbcsr_type_no_symmetry)
     456             : 
     457        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf1)
     458             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf1, template=matrix_s, m=k, n=k, &
     459        7292 :                                             sym=dbcsr_type_no_symmetry)
     460             : 
     461        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf2)
     462             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf2, template=matrix_s, m=k, n=k, &
     463        7292 :                                             sym=dbcsr_type_no_symmetry)
     464             : 
     465        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf3)
     466             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf3, template=matrix_s, m=k, n=k, &
     467        7292 :                                             sym=dbcsr_type_no_symmetry)
     468             : 
     469        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf4)
     470             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf4, template=matrix_s, m=k, n=k, &
     471        7292 :                                             sym=dbcsr_type_no_symmetry)
     472             : 
     473        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_os)
     474             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_os, template=matrix_s, m=my_ortho_k, n=my_ortho_k, &
     475        7292 :                                             sym=dbcsr_type_no_symmetry)
     476             : 
     477        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf1_ortho)
     478             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf1_ortho, template=matrix_s, m=my_ortho_k, n=k, &
     479        7292 :                                             sym=dbcsr_type_no_symmetry)
     480             : 
     481        7292 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf2_ortho)
     482             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf2_ortho, template=matrix_s, m=my_ortho_k, n=k, &
     483        7292 :                                             sym=dbcsr_type_no_symmetry)
     484             : 
     485             :       CASE ("REF")
     486        1076 :          CALL dbcsr_init_p(qs_ot_env%buf1_k_k_nosym)
     487             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf1_k_k_nosym, template=matrix_s, m=k, n=k, &
     488        1076 :                                             sym=dbcsr_type_no_symmetry)
     489             : 
     490        1076 :          CALL dbcsr_init_p(qs_ot_env%buf2_k_k_nosym)
     491             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf2_k_k_nosym, template=matrix_s, m=k, n=k, &
     492        1076 :                                             sym=dbcsr_type_no_symmetry)
     493             : 
     494        1076 :          CALL dbcsr_init_p(qs_ot_env%buf3_k_k_nosym)
     495             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf3_k_k_nosym, template=matrix_s, m=k, n=k, &
     496        1076 :                                             sym=dbcsr_type_no_symmetry)
     497             : 
     498        1076 :          CALL dbcsr_init_p(qs_ot_env%buf4_k_k_nosym)
     499             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf4_k_k_nosym, template=matrix_s, m=k, n=k, &
     500        1076 :                                             sym=dbcsr_type_no_symmetry)
     501             : 
     502             :          ! It claims to be symmetric but to avoid dbcsr confusion nonsymmetric is kept
     503        1076 :          CALL dbcsr_init_p(qs_ot_env%buf1_k_k_sym)
     504             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf1_k_k_sym, template=matrix_s, m=k, n=k, &
     505        1076 :                                             sym=dbcsr_type_no_symmetry)
     506             : 
     507        1076 :          CALL dbcsr_init_p(qs_ot_env%buf2_k_k_sym)
     508             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf2_k_k_sym, template=matrix_s, m=k, n=k, &
     509        1076 :                                             sym=dbcsr_type_no_symmetry)
     510             : 
     511        1076 :          CALL dbcsr_init_p(qs_ot_env%buf3_k_k_sym)
     512             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf3_k_k_sym, template=matrix_s, m=k, n=k, &
     513        1076 :                                             sym=dbcsr_type_no_symmetry)
     514             :          !
     515        1076 :          CALL dbcsr_init_p(qs_ot_env%buf4_k_k_sym)
     516             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf4_k_k_sym, template=matrix_s, m=k, n=k, &
     517        1076 :                                             sym=dbcsr_type_no_symmetry)
     518             :          !
     519        1076 :          CALL dbcsr_init_p(qs_ot_env%p_k_k_sym)
     520             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%p_k_k_sym, template=matrix_s, m=k, n=k, &
     521        1076 :                                             sym=dbcsr_type_no_symmetry)
     522             :          !
     523        1076 :          CALL dbcsr_init_p(qs_ot_env%buf1_n_k)
     524             :          CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%buf1_n_k, template=matrix_s, n=k, &
     525        1076 :                                                 sym=dbcsr_type_no_symmetry)
     526             :          !
     527        1076 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf1)
     528             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf1, template=matrix_s, m=k, n=k, &
     529        9444 :                                             sym=dbcsr_type_no_symmetry)
     530             : 
     531             :       END SELECT
     532             : 
     533        8368 :       IF (qs_ot_env%settings%ot_method .EQ. "DIIS" .OR. &
     534             :           qs_ot_env%settings%ot_method .EQ. "BROY") THEN
     535        4559 :          NULLIFY (qs_ot_env%matrix_h_e)
     536        4559 :          NULLIFY (qs_ot_env%matrix_h_x)
     537        4559 :          CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_e, m_diis)
     538        4559 :          CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_x, m_diis)
     539       37062 :          DO i = 1, m_diis
     540       32503 :             CALL dbcsr_init_p(qs_ot_env%matrix_h_x(i)%matrix)
     541             :             CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_h_x(i)%matrix, template=matrix_s, n=k, &
     542       32503 :                                                    sym=dbcsr_type_no_symmetry)
     543             : 
     544       32503 :             CALL dbcsr_init_p(qs_ot_env%matrix_h_e(i)%matrix)
     545             :             CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_h_e(i)%matrix, template=matrix_s, n=k, &
     546       40871 :                                                    sym=dbcsr_type_no_symmetry)
     547             :          END DO
     548             :       END IF
     549             : 
     550        8368 :       NULLIFY (qs_ot_env%rot_mat_u, qs_ot_env%rot_mat_x, qs_ot_env%rot_mat_h_e, qs_ot_env%rot_mat_h_x, &
     551        8368 :                qs_ot_env%rot_mat_gx, qs_ot_env%rot_mat_gx_old, qs_ot_env%rot_mat_dx, &
     552        8368 :                qs_ot_env%rot_mat_evals, qs_ot_env%rot_mat_dedu, qs_ot_env%rot_mat_chc, &
     553        8368 :                qs_ot_env%rot_mat_evec_re, qs_ot_env%rot_mat_evec_im)
     554             : 
     555        8368 :       IF (qs_ot_env%settings%do_rotation) THEN
     556         212 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_u)
     557             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_u, template=matrix_s, m=k, n=k, &
     558         212 :                                             sym=dbcsr_type_no_symmetry)
     559             : 
     560         212 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_x)
     561             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_x, template=matrix_s, m=k, n=k, &
     562         212 :                                             sym=dbcsr_type_no_symmetry)
     563             : 
     564         212 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_dedu)
     565             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_dedu, template=matrix_s, m=k, n=k, &
     566         212 :                                             sym=dbcsr_type_no_symmetry)
     567             : 
     568         212 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_chc)
     569             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_chc, template=matrix_s, m=k, n=k, &
     570         212 :                                             sym=dbcsr_type_no_symmetry)
     571             : 
     572         212 :          IF (qs_ot_env%settings%ot_method .EQ. "DIIS") THEN
     573          30 :             CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_e, m_diis)
     574          30 :             CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_x, m_diis)
     575         240 :             DO i = 1, m_diis
     576         210 :                CALL dbcsr_init_p(qs_ot_env%rot_mat_h_e(i)%matrix)
     577             :                CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_h_e(i)%matrix, template=matrix_s, m=k, n=k, &
     578         210 :                                                   sym=dbcsr_type_no_symmetry)
     579             : 
     580         210 :                CALL dbcsr_init_p(qs_ot_env%rot_mat_h_x(i)%matrix)
     581             :                CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_h_x(i)%matrix, template=matrix_s, m=k, n=k, &
     582         240 :                                                   sym=dbcsr_type_no_symmetry)
     583             :             END DO
     584             :          END IF
     585             : 
     586         632 :          ALLOCATE (qs_ot_env%rot_mat_evals(k))
     587         212 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_evec_re)
     588             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_evec_re, template=matrix_s, m=k, n=k, &
     589         212 :                                             sym=dbcsr_type_no_symmetry)
     590         212 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_evec_im)
     591             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_evec_im, template=matrix_s, m=k, n=k, &
     592         212 :                                             sym=dbcsr_type_no_symmetry)
     593             : 
     594         212 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_gx)
     595             :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_gx, template=matrix_s, m=k, n=k, &
     596         212 :                                             sym=dbcsr_type_no_symmetry)
     597             : 
     598         212 :          IF (qs_ot_env%use_gx_old) THEN
     599         182 :             CALL dbcsr_init_p(qs_ot_env%rot_mat_gx_old)
     600             :             CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_gx_old, template=matrix_s, m=k, n=k, &
     601         182 :                                                sym=dbcsr_type_no_symmetry)
     602             :          END IF
     603             : 
     604         212 :          IF (qs_ot_env%use_dx) THEN
     605         182 :             CALL dbcsr_init_p(qs_ot_env%rot_mat_dx)
     606             :             CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_dx, template=matrix_s, m=k, n=k, &
     607         182 :                                                sym=dbcsr_type_no_symmetry)
     608             :          END IF
     609             : 
     610             :       END IF
     611             : 
     612        8368 :       IF (qs_ot_env%settings%do_ener) THEN
     613           0 :          ncoef = k
     614           0 :          ALLOCATE (qs_ot_env%ener_x(ncoef))
     615             : 
     616           0 :          IF (qs_ot_env%settings%ot_method .EQ. "DIIS") THEN
     617           0 :             ALLOCATE (qs_ot_env%ener_h_e(m_diis, ncoef))
     618           0 :             ALLOCATE (qs_ot_env%ener_h_x(m_diis, ncoef))
     619             :          END IF
     620             : 
     621           0 :          ALLOCATE (qs_ot_env%ener_gx(ncoef))
     622             : 
     623           0 :          IF (qs_ot_env%use_gx_old) THEN
     624           0 :             ALLOCATE (qs_ot_env%ener_gx_old(ncoef))
     625             :          END IF
     626             : 
     627           0 :          IF (qs_ot_env%use_dx) THEN
     628           0 :             ALLOCATE (qs_ot_env%ener_dx(ncoef))
     629           0 :             qs_ot_env%ener_dx = 0.0_dp
     630             :          END IF
     631             :       END IF
     632             : 
     633        8368 :    END SUBROUTINE qs_ot_allocate
     634             : 
     635             : ! **************************************************************************************************
     636             : !> \brief deallocates data
     637             : !> \param qs_ot_env ...
     638             : ! **************************************************************************************************
     639        8368 :    SUBROUTINE qs_ot_destroy(qs_ot_env)
     640             :       TYPE(qs_ot_type)                                   :: qs_ot_env
     641             : 
     642        8368 :       CALL mp_para_env_release(qs_ot_env%para_env)
     643        8368 :       CALL cp_blacs_env_release(qs_ot_env%blacs_env)
     644             : 
     645        8368 :       DEALLOCATE (qs_ot_env%evals)
     646        8368 :       DEALLOCATE (qs_ot_env%dum)
     647             : 
     648        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_os)) CALL dbcsr_release_p(qs_ot_env%matrix_os)
     649        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_p)) CALL dbcsr_release_p(qs_ot_env%matrix_p)
     650        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_cosp)) CALL dbcsr_release_p(qs_ot_env%matrix_cosp)
     651        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_sinp)) CALL dbcsr_release_p(qs_ot_env%matrix_sinp)
     652        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_r)) CALL dbcsr_release_p(qs_ot_env%matrix_r)
     653        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_cosp_b)) CALL dbcsr_release_p(qs_ot_env%matrix_cosp_b)
     654        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_sinp_b)) CALL dbcsr_release_p(qs_ot_env%matrix_sinp_b)
     655        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_buf1)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1)
     656        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_buf2)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2)
     657        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_buf3)) CALL dbcsr_release_p(qs_ot_env%matrix_buf3)
     658        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_buf4)) CALL dbcsr_release_p(qs_ot_env%matrix_buf4)
     659        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_buf1_ortho)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1_ortho)
     660        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_buf2_ortho)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2_ortho)
     661        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_c0)) CALL dbcsr_release_p(qs_ot_env%matrix_c0)
     662        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_sc0)) CALL dbcsr_release_p(qs_ot_env%matrix_sc0)
     663        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_psc0)) CALL dbcsr_release_p(qs_ot_env%matrix_psc0)
     664        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_x)) CALL dbcsr_release_p(qs_ot_env%matrix_x)
     665        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_sx)) CALL dbcsr_release_p(qs_ot_env%matrix_sx)
     666        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_gx)) CALL dbcsr_release_p(qs_ot_env%matrix_gx)
     667        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_dx)) CALL dbcsr_release_p(qs_ot_env%matrix_dx)
     668        8368 :       IF (ASSOCIATED(qs_ot_env%matrix_gx_old)) CALL dbcsr_release_p(qs_ot_env%matrix_gx_old)
     669        8368 :       IF (ASSOCIATED(qs_ot_env%buf1_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf1_k_k_nosym)
     670        8368 :       IF (ASSOCIATED(qs_ot_env%buf2_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf2_k_k_nosym)
     671        8368 :       IF (ASSOCIATED(qs_ot_env%buf3_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf3_k_k_nosym)
     672        8368 :       IF (ASSOCIATED(qs_ot_env%buf4_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf4_k_k_nosym)
     673        8368 :       IF (ASSOCIATED(qs_ot_env%p_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%p_k_k_sym)
     674        8368 :       IF (ASSOCIATED(qs_ot_env%buf1_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf1_k_k_sym)
     675        8368 :       IF (ASSOCIATED(qs_ot_env%buf2_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf2_k_k_sym)
     676        8368 :       IF (ASSOCIATED(qs_ot_env%buf3_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf3_k_k_sym)
     677        8368 :       IF (ASSOCIATED(qs_ot_env%buf4_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf4_k_k_sym)
     678        8368 :       IF (ASSOCIATED(qs_ot_env%buf1_n_k)) CALL dbcsr_release_p(qs_ot_env%buf1_n_k)
     679        8368 :       IF (ASSOCIATED(qs_ot_env%buf1_n_k_dp)) CALL dbcsr_release_p(qs_ot_env%buf1_n_k_dp)
     680             : 
     681        8368 :       IF (qs_ot_env%settings%ot_method .EQ. "DIIS" .OR. &
     682             :           qs_ot_env%settings%ot_method .EQ. "BROY") THEN
     683        4559 :          CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_x)
     684        4559 :          CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_e)
     685        4559 :          DEALLOCATE (qs_ot_env%ls_diis)
     686        4559 :          DEALLOCATE (qs_ot_env%lss_diis)
     687        4559 :          DEALLOCATE (qs_ot_env%c_diis)
     688        4559 :          DEALLOCATE (qs_ot_env%c_broy)
     689        4559 :          DEALLOCATE (qs_ot_env%energy_h)
     690        4559 :          DEALLOCATE (qs_ot_env%ipivot)
     691             :       END IF
     692             : 
     693        8368 :       IF (qs_ot_env%settings%do_rotation) THEN
     694             : 
     695         212 :          IF (ASSOCIATED(qs_ot_env%rot_mat_u)) CALL dbcsr_release_p(qs_ot_env%rot_mat_u)
     696         212 :          IF (ASSOCIATED(qs_ot_env%rot_mat_x)) CALL dbcsr_release_p(qs_ot_env%rot_mat_x)
     697         212 :          IF (ASSOCIATED(qs_ot_env%rot_mat_dedu)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dedu)
     698         212 :          IF (ASSOCIATED(qs_ot_env%rot_mat_chc)) CALL dbcsr_release_p(qs_ot_env%rot_mat_chc)
     699             : 
     700         212 :          IF (qs_ot_env%settings%ot_method .EQ. "DIIS") THEN
     701          30 :             CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_x)
     702          30 :             CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_e)
     703             :          END IF
     704             : 
     705         212 :          DEALLOCATE (qs_ot_env%rot_mat_evals)
     706         212 :          IF (ASSOCIATED(qs_ot_env%rot_mat_evec_re)) CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_re)
     707         212 :          IF (ASSOCIATED(qs_ot_env%rot_mat_evec_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_im)
     708         212 :          IF (ASSOCIATED(qs_ot_env%rot_mat_gx)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx)
     709         212 :          IF (ASSOCIATED(qs_ot_env%rot_mat_gx_old)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_old)
     710         212 :          IF (ASSOCIATED(qs_ot_env%rot_mat_dx)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dx)
     711             :       END IF
     712             : 
     713        8368 :       IF (qs_ot_env%settings%do_ener) THEN
     714           0 :          DEALLOCATE (qs_ot_env%ener_x)
     715           0 :          DEALLOCATE (qs_ot_env%ener_gx)
     716           0 :          IF (qs_ot_env%settings%ot_method .EQ. "DIIS") THEN
     717           0 :             DEALLOCATE (qs_ot_env%ener_h_x)
     718           0 :             DEALLOCATE (qs_ot_env%ener_h_e)
     719             :          END IF
     720           0 :          IF (qs_ot_env%use_dx) THEN
     721           0 :             DEALLOCATE (qs_ot_env%ener_dx)
     722             :          END IF
     723           0 :          IF (qs_ot_env%use_gx_old) THEN
     724           0 :             DEALLOCATE (qs_ot_env%ener_gx_old)
     725             :          END IF
     726             :       END IF
     727             : 
     728        8368 :    END SUBROUTINE qs_ot_destroy
     729             : 
     730             : ! **************************************************************************************************
     731             : !> \brief ...
     732             : !> \param settings ...
     733             : !> \param ot_section ...
     734             : !> \param output_unit ...
     735             : ! **************************************************************************************************
     736       33045 :    SUBROUTINE ot_readwrite_input(settings, ot_section, output_unit)
     737             :       TYPE(qs_ot_settings_type)                          :: settings
     738             :       TYPE(section_vals_type), POINTER                   :: ot_section
     739             :       INTEGER, INTENT(IN)                                :: output_unit
     740             : 
     741             :       CHARACTER(len=*), PARAMETER :: routineN = 'ot_readwrite_input'
     742             : 
     743             :       INTEGER                                            :: handle, ls_method, ot_algorithm, &
     744             :                                                             ot_method, ot_ortho_irac
     745             : 
     746        6609 :       CALL timeset(routineN, handle)
     747             : 
     748             :       ! choose algorithm
     749        6609 :       CALL section_vals_val_get(ot_section, "ALGORITHM", i_val=ot_algorithm)
     750        6039 :       SELECT CASE (ot_algorithm)
     751             :       CASE (ot_algo_taylor_or_diag)
     752        6039 :          settings%ot_algorithm = "TOD"
     753             :       CASE (ot_algo_irac)
     754         570 :          CALL cite_reference(Weber2008)
     755         570 :          settings%ot_algorithm = "REF"
     756             :       CASE DEFAULT
     757        6609 :          CPABORT("Value unknown")
     758             :       END SELECT
     759             : 
     760             :       ! irac input
     761        6609 :       CALL section_vals_val_get(ot_section, "IRAC_DEGREE", i_val=settings%irac_degree)
     762        6609 :       IF (settings%irac_degree < 2 .OR. settings%irac_degree > 4) THEN
     763           0 :          CPABORT("READ OT IRAC_DEGREE: Value unknown")
     764             :       END IF
     765        6609 :       CALL section_vals_val_get(ot_section, "MAX_IRAC", i_val=settings%max_irac)
     766        6609 :       IF (settings%max_irac < 1) THEN
     767           0 :          CPABORT("READ OT MAX_IRAC: VALUE MUST BE GREATER THAN ZERO")
     768             :       END IF
     769        6609 :       CALL section_vals_val_get(ot_section, "EPS_IRAC_FILTER_MATRIX", r_val=settings%eps_irac_filter_matrix)
     770        6609 :       CALL section_vals_val_get(ot_section, "EPS_IRAC", r_val=settings%eps_irac)
     771        6609 :       IF (settings%eps_irac < 0.0_dp) THEN
     772           0 :          CPABORT("READ OT EPS_IRAC: VALUE MUST BE GREATER THAN ZERO")
     773             :       END IF
     774        6609 :       CALL section_vals_val_get(ot_section, "EPS_IRAC_QUICK_EXIT", r_val=settings%eps_irac_quick_exit)
     775        6609 :       IF (settings%eps_irac_quick_exit < 0.0_dp) THEN
     776           0 :          CPABORT("READ OT EPS_IRAC_QUICK_EXIT: VALUE MUST BE GREATER THAN ZERO")
     777             :       END IF
     778             : 
     779        6609 :       CALL section_vals_val_get(ot_section, "EPS_IRAC_SWITCH", r_val=settings%eps_irac_switch)
     780        6609 :       IF (settings%eps_irac_switch < 0.0_dp) THEN
     781           0 :          CPABORT("READ OT EPS_IRAC_SWITCH: VALUE MUST BE GREATER THAN ZERO")
     782             :       END IF
     783             : 
     784        6609 :       CALL section_vals_val_get(ot_section, "ORTHO_IRAC", i_val=ot_ortho_irac)
     785        6525 :       SELECT CASE (ot_ortho_irac)
     786             :       CASE (ot_chol_irac)
     787        6525 :          settings%ortho_irac = "CHOL"
     788             :       CASE (ot_poly_irac)
     789          34 :          settings%ortho_irac = "POLY"
     790             :       CASE (ot_lwdn_irac)
     791          50 :          settings%ortho_irac = "LWDN"
     792             :       CASE DEFAULT
     793        6609 :          CPABORT("READ OT ORTHO_IRAC: Value unknown")
     794             :       END SELECT
     795             : 
     796        6609 :       CALL section_vals_val_get(ot_section, "ON_THE_FLY_LOC", l_val=settings%on_the_fly_loc)
     797             : 
     798        6609 :       CALL section_vals_val_get(ot_section, "MINIMIZER", i_val=ot_method)
     799             :       ! overwrite input if ot_state is set
     800        6609 :       IF (settings%ot_state == 1) THEN
     801           4 :          ot_method = ot_mini_diis
     802             :       END IF
     803             :       ! compatibility
     804          10 :       SELECT CASE (ot_method)
     805             :       CASE (ot_mini_sd)
     806          10 :          settings%ot_method = "SD"
     807             :       CASE (ot_mini_cg)
     808        2318 :          settings%ot_method = "CG"
     809             :       CASE (ot_mini_diis)
     810        4267 :          settings%ot_method = "DIIS"
     811        4267 :          CALL section_vals_val_get(ot_section, "N_HISTORY_VEC", i_val=settings%diis_m)
     812             :       CASE (ot_mini_broyden)
     813          14 :          CALL section_vals_val_get(ot_section, "N_HISTORY_VEC", i_val=settings%diis_m)
     814          14 :          CALL section_vals_val_get(ot_section, "BROYDEN_BETA", r_val=settings%broyden_beta)
     815          14 :          CALL section_vals_val_get(ot_section, "BROYDEN_GAMMA", r_val=settings%broyden_gamma)
     816          14 :          CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA", r_val=settings%broyden_sigma)
     817          14 :          CALL section_vals_val_get(ot_section, "BROYDEN_ETA", r_val=settings%broyden_eta)
     818          14 :          CALL section_vals_val_get(ot_section, "BROYDEN_OMEGA", r_val=settings%broyden_omega)
     819          14 :          CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA_DECREASE", r_val=settings%broyden_sigma_decrease)
     820          14 :          CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA_MIN", r_val=settings%broyden_sigma_min)
     821          14 :          CALL section_vals_val_get(ot_section, "BROYDEN_FORGET_HISTORY", l_val=settings%broyden_forget_history)
     822          14 :          CALL section_vals_val_get(ot_section, "BROYDEN_ADAPTIVE_SIGMA", l_val=settings%broyden_adaptive_sigma)
     823          14 :          CALL section_vals_val_get(ot_section, "BROYDEN_ENABLE_FLIP", l_val=settings%broyden_enable_flip)
     824          14 :          settings%ot_method = "BROY"
     825             :       CASE DEFAULT
     826        6609 :          CPABORT("READ OTSCF MINIMIZER: Value unknown")
     827             :       END SELECT
     828        6609 :       CALL section_vals_val_get(ot_section, "SAFER_DIIS", l_val=settings%safer_diis)
     829        6609 :       CALL section_vals_val_get(ot_section, "LINESEARCH", i_val=ls_method)
     830           2 :       SELECT CASE (ls_method)
     831             :       CASE (ls_none)
     832           2 :          settings%line_search_method = "NONE"
     833             :       CASE (ls_2pnt)
     834        6541 :          settings%line_search_method = "2PNT"
     835             :       CASE (ls_3pnt)
     836          42 :          settings%line_search_method = "3PNT"
     837             :       CASE (ls_adapt)
     838          12 :          settings%line_search_method = "ADPT"
     839             :       CASE (ls_gold)
     840          12 :          settings%line_search_method = "GOLD"
     841          12 :          CALL section_vals_val_get(ot_section, "GOLD_TARGET", r_val=settings%gold_target)
     842             :       CASE DEFAULT
     843        6609 :          CPABORT("READ OTSCF LS: Value unknown")
     844             :       END SELECT
     845             : 
     846        6609 :       CALL section_vals_val_get(ot_section, "PRECOND_SOLVER", i_val=settings%precond_solver_type)
     847       13196 :       SELECT CASE (settings%precond_solver_type)
     848             :       CASE (ot_precond_solver_default)
     849        6587 :          settings%precond_solver_name = "DEFAULT"
     850             :       CASE (ot_precond_solver_inv_chol)
     851          16 :          settings%precond_solver_name = "INVERSE_CHOLESKY"
     852             :       CASE (ot_precond_solver_direct)
     853           0 :          settings%precond_solver_name = "DIRECT"
     854             :       CASE (ot_precond_solver_update)
     855           6 :          settings%precond_solver_name = "INVERSE_UPDATE"
     856             :       CASE DEFAULT
     857        6609 :          CPABORT("READ OTSCF SOLVER: Value unknown")
     858             :       END SELECT
     859             : 
     860        6609 :       CALL section_vals_val_get(ot_section, "MAX_SCF_DIIS", i_val=settings%max_scf_diis)
     861             : 
     862             :       !If these values are negative we will set them "optimal" for a given precondtioner below
     863        6609 :       CALL section_vals_val_get(ot_section, "STEPSIZE", r_val=settings%ds_min)
     864        6609 :       CALL section_vals_val_get(ot_section, "ENERGY_GAP", r_val=settings%energy_gap)
     865             : 
     866        6609 :       CALL section_vals_val_get(ot_section, "PRECONDITIONER", i_val=settings%preconditioner_type)
     867        7311 :       SELECT CASE (settings%preconditioner_type)
     868             :       CASE (ot_precond_none)
     869         702 :          settings%preconditioner_name = "NONE"
     870         702 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
     871         702 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
     872             :       CASE (ot_precond_full_single)
     873          30 :          settings%preconditioner_name = "FULL_SINGLE"
     874          30 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
     875          30 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
     876             :       CASE (ot_precond_full_single_inverse)
     877        2756 :          settings%preconditioner_name = "FULL_SINGLE_INVERSE"
     878        2756 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.08_dp
     879        2756 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
     880             :       CASE (ot_precond_full_all)
     881        1864 :          settings%preconditioner_name = "FULL_ALL"
     882        1864 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
     883        1864 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
     884             :       CASE (ot_precond_full_kinetic)
     885        1221 :          settings%preconditioner_name = "FULL_KINETIC"
     886        1221 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
     887        1221 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
     888             :       CASE (ot_precond_s_inverse)
     889          36 :          settings%preconditioner_name = "FULL_S_INVERSE"
     890          36 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
     891          36 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
     892             :       CASE DEFAULT
     893        6609 :          CPABORT("READ OTSCF PRECONDITIONER: Value unknown")
     894             :       END SELECT
     895        6609 :       CALL section_vals_val_get(ot_section, "CHOLESKY", i_val=settings%cholesky_type)
     896        6609 :       CALL section_vals_val_get(ot_section, "EPS_TAYLOR", r_val=settings%eps_taylor)
     897        6609 :       CALL section_vals_val_get(ot_section, "MAX_TAYLOR", i_val=settings%max_taylor)
     898        6609 :       CALL section_vals_val_get(ot_section, "ROTATION", l_val=settings%do_rotation)
     899        6609 :       CALL section_vals_val_get(ot_section, "ENERGIES", l_val=settings%do_ener)
     900             :       CALL section_vals_val_get(ot_section, "OCCUPATION_PRECONDITIONER", &
     901        6609 :                                 l_val=settings%occupation_preconditioner)
     902        6609 :       CALL section_vals_val_get(ot_section, "NONDIAG_ENERGY", l_val=settings%add_nondiag_energy)
     903             :       CALL section_vals_val_get(ot_section, "NONDIAG_ENERGY_STRENGTH", &
     904        6609 :                                 r_val=settings%nondiag_energy_strength)
     905             :       ! not yet fully implemented
     906        6609 :       CPASSERT(.NOT. settings%do_ener)
     907             : 
     908             :       ! write OT output
     909             : 
     910        6609 :       IF (output_unit > 0) THEN
     911        3421 :          WRITE (output_unit, '(/,A)') "  ----------------------------------- OT ---------------------------------------"
     912        3421 :          IF (settings%do_rotation) THEN
     913         100 :             WRITE (output_unit, '(A)') "  Allowing for rotations "
     914             :          END IF
     915        3421 :          IF (settings%do_ener) THEN
     916           0 :             WRITE (output_unit, '(A,L2)') "  Optimizing orbital energies "
     917             :          END IF
     918           5 :          SELECT CASE (settings%OT_METHOD)
     919             :          CASE ("SD")
     920           5 :             WRITE (output_unit, '(A)') "  Minimizer      : SD                  : steepest descent"
     921             :          CASE ("CG")
     922        1188 :             WRITE (output_unit, '(A)') "  Minimizer      : CG                  : conjugate gradient"
     923             :          CASE ("DIIS")
     924        2221 :             WRITE (output_unit, '(A)') "  Minimizer      : DIIS                : direct inversion"
     925        2221 :             WRITE (output_unit, '(A)') "                                         in the iterative subspace"
     926        2221 :             WRITE (output_unit, '(A,I3,A)') "                                         using ", settings%diis_m, " DIIS vectors"
     927        2221 :             IF (settings%safer_diis) THEN
     928        2221 :                WRITE (output_unit, '(A,I3,A)') "                                         safer DIIS on"
     929             :             ELSE
     930           0 :                WRITE (output_unit, '(A,I3,A)') "                                         safer DIIS off"
     931             :             END IF
     932             :          CASE ("BROY")
     933           7 :             WRITE (output_unit, '(A)') "  Minimizer      : BROYDEN             : Broyden "
     934           7 :             WRITE (output_unit, '(A,F16.8)') "                   BETA                : ", settings%broyden_beta
     935           7 :             WRITE (output_unit, '(A,F16.8)') "                   GAMMA               : ", settings%broyden_gamma
     936           7 :             WRITE (output_unit, '(A,F16.8)') "                   SIGMA               : ", settings%broyden_sigma
     937           7 :             WRITE (output_unit, '(A,I3,A)') "                            using      : - ", &
     938          14 :                settings%diis_m, " BROYDEN vectors"
     939             :          CASE DEFAULT
     940        3421 :             WRITE (output_unit, '(3A)') "  Minimizer      :      ", settings%OT_METHOD, " : UNKNOWN"
     941             :          END SELECT
     942          15 :          SELECT CASE (settings%preconditioner_name)
     943             :          CASE ("FULL_SINGLE")
     944          15 :             WRITE (output_unit, '(A)') "  Preconditioner : FULL_SINGLE         : diagonalization based"
     945             :          CASE ("FULL_SINGLE_INVERSE")
     946        1445 :             WRITE (output_unit, '(A,/,A)') "  Preconditioner : FULL_SINGLE_INVERSE : inversion of ", &
     947        2890 :                "                                         H + eS - 2*(Sc)(c^T*H*c+const)(Sc)^T"
     948             :          CASE ("FULL_ALL")
     949         962 :             WRITE (output_unit, '(A)') "  Preconditioner : FULL_ALL            : diagonalization, state selective"
     950             :          CASE ("FULL_KINETIC")
     951         630 :             WRITE (output_unit, '(A)') "  Preconditioner : FULL_KINETIC        : inversion of T + eS"
     952             :          CASE ("FULL_S_INVERSE")
     953          18 :             WRITE (output_unit, '(A)') "  Preconditioner : FULL_S_INVERSE      : cholesky inversion of S"
     954             :          CASE ("SPARSE_DIAG")
     955             :             WRITE (output_unit, '(A)') &
     956           0 :                "  Preconditioner : SPARSE_DIAG    : diagonal atomic block diagonalization"
     957             :          CASE ("SPARSE_KINETIC")
     958           0 :             WRITE (output_unit, '(A)') "  Preconditioner : SPARSE_KINETIC      : sparse linear solver for T + eS"
     959             :          CASE ("NONE")
     960         351 :             WRITE (output_unit, '(A)') "  Preconditioner : NONE"
     961             :          CASE DEFAULT
     962        3421 :             WRITE (output_unit, '(3A)') "  Preconditioner : ", settings%preconditioner_name, " : UNKNOWN"
     963             :          END SELECT
     964             : 
     965        3421 :          WRITE (output_unit, '(A)') "  Precond_solver : "//TRIM(settings%precond_solver_name)
     966             : 
     967        3421 :          IF (settings%OT_METHOD .EQ. "SD" .OR. settings%OT_METHOD .EQ. "CG") THEN
     968        1162 :             SELECT CASE (settings%line_search_method)
     969             :             CASE ("2PNT")
     970        1162 :                WRITE (output_unit, '(A)') "  Line search    : 2PNT                : 2 energies, one gradient"
     971             :             CASE ("3PNT")
     972          19 :                WRITE (output_unit, '(A)') "  Line search    : 3PNT                : 3 energies"
     973             :             CASE ("GOLD")
     974           6 :                WRITE (output_unit, '(A)') "  Line search    : GOLD                : bracketing and golden section search"
     975           6 :                WRITE (output_unit, '(A,F14.8)') "                   target rel accuracy : ", settings%gold_target
     976             :             CASE ("NONE")
     977           1 :                WRITE (output_unit, '(A)') "  Line search    : NONE"
     978             :             CASE DEFAULT
     979        3421 :                WRITE (output_unit, '(3A)') "  Line search : ", settings%line_search_method, " : UNKNOWN"
     980             :             END SELECT
     981             :          END IF
     982        3421 :          WRITE (output_unit, '(A,F14.8,T49,A,F14.8)') "  stepsize       :", settings%ds_min, &
     983        6842 :             "  energy_gap     :", settings%energy_gap
     984        3421 :          IF (settings%ot_algorithm .EQ. 'TOD') THEN
     985        3118 :             WRITE (output_unit, '(A,E14.5,T49,A,I14)') "  eps_taylor     :", settings%eps_taylor, &
     986        6236 :                "  max_taylor     :", settings%max_taylor
     987             :          END IF
     988        3421 :          IF (settings%ot_algorithm .EQ. 'REF') THEN
     989         303 :             WRITE (output_unit, '(A,1X,A,T49,A,I14)') "  ortho_irac     :", settings%ortho_irac, &
     990         606 :                "  irac_degree    :", settings%irac_degree
     991         303 :             WRITE (output_unit, '(A,I14,T49,A,E14.5)') "  max_irac       :", settings%max_irac, &
     992         606 :                "  eps_irac       :", settings%eps_irac
     993         303 :             WRITE (output_unit, '(A,E14.5,T49,A,E10.3)') "  eps_irac_switch:", settings%eps_irac_switch, &
     994         606 :                "  eps_irac_quick_exit:", settings%eps_irac_quick_exit
     995         303 :             WRITE (output_unit, '(A,L2)') "  on_the_fly_loc :", settings%on_the_fly_loc
     996             :          END IF
     997        3421 :          WRITE (output_unit, '(A)') "  ----------------------------------- OT ---------------------------------------"
     998             :          WRITE (UNIT=output_unit, &
     999             :                 FMT="(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
    1000        3421 :             "Step", "Update method", "Time", "Convergence", "Total energy", "Change", &
    1001        6842 :             REPEAT("-", 78)
    1002             :       END IF
    1003             : 
    1004        6609 :       CALL timestop(handle)
    1005             : 
    1006        6609 :    END SUBROUTINE ot_readwrite_input
    1007             : 
    1008           0 : END MODULE qs_ot_types

Generated by: LCOV version 1.15