LCOV - code coverage report
Current view: top level - src - qs_ot_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:123285f) Lines: 96.4 % 1024 987
Test Date: 2026-11-04 00:58:17 Functions: 75.0 % 20 15

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2026 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       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_copy,&
      22              :                                               dbcsr_get_info,&
      23              :                                               dbcsr_init_p,&
      24              :                                               dbcsr_p_type,&
      25              :                                               dbcsr_release_p,&
      26              :                                               dbcsr_set,&
      27              :                                               dbcsr_type,&
      28              :                                               dbcsr_type_no_symmetry
      29              :    USE cp_dbcsr_contrib,                ONLY: dbcsr_add_on_diag
      30              :    USE cp_dbcsr_operations,             ONLY: cp_dbcsr_m_by_n_from_row_template,&
      31              :                                               cp_dbcsr_m_by_n_from_template,&
      32              :                                               dbcsr_allocate_matrix_set,&
      33              :                                               dbcsr_deallocate_matrix_set
      34              :    USE cp_fm_struct,                    ONLY: cp_fm_struct_get,&
      35              :                                               cp_fm_struct_type
      36              :    USE cp_fm_types,                     ONLY: cp_fm_release,&
      37              :                                               cp_fm_type
      38              :    USE input_constants,                 ONLY: &
      39              :         cholesky_reduce, ls_2pnt, ls_3pnt, ls_adapt, ls_gold, ls_none, ot_algo_irac, &
      40              :         ot_algo_taylor_or_diag, ot_chol_irac, ot_lattice_fft_auto, ot_lattice_fft_off, &
      41              :         ot_lattice_fft_on, ot_low_rank_base_lattice_fft, ot_low_rank_base_overlap, ot_lwdn_irac, &
      42              :         ot_mini_broyden, ot_mini_cg, ot_mini_diis, ot_mini_lbfgs, ot_mini_sd, ot_poly_irac, &
      43              :         ot_precond_fermi_low_rank, ot_precond_full_all, ot_precond_full_all_covariant, &
      44              :         ot_precond_full_kinetic, ot_precond_full_single, ot_precond_full_single_inverse, &
      45              :         ot_precond_none, ot_precond_s_inverse, ot_precond_solver_chebyshev, &
      46              :         ot_precond_solver_default, ot_precond_solver_direct, ot_precond_solver_inv_chol, &
      47              :         ot_precond_solver_update
      48              :    USE input_section_types,             ONLY: section_vals_type,&
      49              :                                               section_vals_val_get
      50              :    USE kinds,                           ONLY: dp
      51              :    USE message_passing,                 ONLY: mp_para_env_release,&
      52              :                                               mp_para_env_type
      53              :    USE preconditioner_types,            ONLY: preconditioner_type
      54              : #include "./base/base_uses.f90"
      55              : 
      56              :    IMPLICIT NONE
      57              : 
      58              :    PRIVATE
      59              : 
      60              :    PUBLIC  :: qs_ot_type
      61              :    PUBLIC  :: qs_ot_physical_secant_type
      62              :    PUBLIC  :: qs_ot_settings_type
      63              :    PUBLIC  :: qs_ot_destroy
      64              :    PUBLIC  :: qs_ot_allocate
      65              :    PUBLIC  :: qs_ot_allocate_complex_state
      66              :    PUBLIC  :: qs_ot_channel_index
      67              :    PUBLIC  :: qs_ot_check_channel_context
      68              :    PUBLIC  :: qs_ot_init
      69              :    PUBLIC  :: qs_ot_reset_history
      70              :    PUBLIC  :: qs_ot_kpoint_preconditioner_solver_supported
      71              :    PUBLIC  :: qs_ot_kpoint_preconditioner_scale
      72              :    PUBLIC  :: qs_ot_kpoint_preconditioner_supported
      73              :    PUBLIC  :: qs_ot_number_of_channels
      74              :    PUBLIC  :: qs_ot_settings_init
      75              :    PUBLIC  :: qs_ot_set_context
      76              :    PUBLIC  :: ot_readwrite_input
      77              : 
      78              : ! **************************************************************************************************
      79              : !> \brief notice, this variable needs to be copyable, needed for spins as e.g. in qs_ot_scf
      80              : ! **************************************************************************************************
      81              :    TYPE qs_ot_settings_type
      82              :       LOGICAL           :: do_rotation = .FALSE., do_ener = .FALSE.
      83              :       LOGICAL           :: ks = .FALSE.
      84              :       CHARACTER(LEN=4)  :: ot_method = ""
      85              :       CHARACTER(LEN=3)  :: ot_algorithm = ""
      86              :       CHARACTER(LEN=4)  :: line_search_method = ""
      87              :       CHARACTER(LEN=20) :: preconditioner_name = ""
      88              :       INTEGER           :: preconditioner_type = -1
      89              :       CHARACTER(LEN=20) :: low_rank_base_name = ""
      90              :       INTEGER           :: low_rank_base = ot_low_rank_base_overlap
      91              :       CHARACTER(LEN=20) :: lattice_fft_name = ""
      92              :       INTEGER           :: lattice_fft = ot_lattice_fft_off
      93              :       INTEGER           :: lattice_fft_local_cells = 0
      94              :       INTEGER           :: cholesky_type = -1
      95              :       INTEGER           :: ot_state = 0
      96              :       CHARACTER(LEN=20) :: precond_solver_name = ""
      97              :       INTEGER           :: precond_solver_type = -1
      98              :       INTEGER           :: chebyshev_degree = 8
      99              :       INTEGER           :: fermi_low_rank_max_rank = 48
     100              :       LOGICAL           :: safer_diis = .FALSE.
     101              :       REAL(KIND=dp)     :: ds_min = -1.0_dp
     102              :       REAL(KIND=dp)     :: energy_gap = -1.0_dp
     103              :       INTEGER           :: diis_m = -1
     104              :       REAL(KIND=dp)     :: lbfgs_curvature_tol = 1.0E-4_dp
     105              :       LOGICAL           :: lbfgs_damping = .TRUE.
     106              :       INTEGER           :: max_scf_diis = 0
     107              :       REAL(KIND=dp)     :: gold_target = -1.0_dp
     108              :       REAL(KIND=dp)     :: eps_taylor = -1.0_dp ! minimum accuracy of Taylor expansion
     109              :       INTEGER           :: max_taylor = -1 ! maximum order of Taylor expansion before switching to diagonalization
     110              :       INTEGER           :: irac_degree = -1 ! used to control the refinement polynomial degree
     111              :       INTEGER           :: max_irac = -1 ! maximum number of iteration for refinement
     112              :       REAL(KIND=dp)     :: eps_irac = -1.0_dp ! target accuracy for refinement
     113              :       REAL(KIND=dp)     :: eps_irac_quick_exit = -1.0_dp
     114              :       REAL(KIND=dp)     :: eps_irac_filter_matrix = -1.0_dp
     115              :       REAL(KIND=dp)     :: eps_irac_switch = -1.0_dp
     116              :       LOGICAL           :: on_the_fly_loc = .FALSE.
     117              :       CHARACTER(LEN=4)  :: ortho_irac = ""
     118              :       LOGICAL           :: occupation_preconditioner = .FALSE., add_nondiag_energy = .FALSE.
     119              :       REAL(KIND=dp)     :: nondiag_energy_strength = -1.0_dp
     120              :       REAL(KIND=dp)     :: broyden_beta = -1.0_dp, broyden_gamma = -1.0_dp, broyden_sigma = -1.0_dp
     121              :       REAL(KIND=dp)     :: broyden_eta = -1.0_dp, broyden_omega = -1.0_dp, broyden_sigma_decrease = -1.0_dp
     122              :       REAL(KIND=dp)     :: broyden_sigma_min = -1.0_dp
     123              :       LOGICAL           :: broyden_forget_history = .FALSE., broyden_adaptive_sigma = .FALSE.
     124              :       LOGICAL           :: broyden_enable_flip = .FALSE.
     125              :    END TYPE qs_ot_settings_type
     126              : 
     127              : ! **************************************************************************************************
     128              : !> \brief bounded physical endpoint history for one spin density at one K point
     129              : ! **************************************************************************************************
     130              :    TYPE qs_ot_physical_secant_type
     131              :       TYPE(cp_fm_type), POINTER :: c0 => NULL(), c0_im => NULL()
     132              :       TYPE(cp_fm_type), POINTER :: h0 => NULL(), h0_im => NULL()
     133              :       TYPE(cp_fm_type), POINTER :: c_previous => NULL(), c_previous_im => NULL()
     134              :       TYPE(cp_fm_type), POINTER :: y_previous => NULL(), y_previous_im => NULL()
     135              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: occupation0, occupation_previous
     136              :       LOGICAL :: reference_valid = .FALSE., secant_valid = .FALSE.
     137              :    END TYPE qs_ot_physical_secant_type
     138              : 
     139              : ! **************************************************************************************************
     140              :    TYPE qs_ot_type
     141              :       ! this sets the method to be used
     142              :       TYPE(qs_ot_settings_type) :: settings = qs_ot_settings_type()
     143              :       LOGICAL                   :: restricted = .FALSE.
     144              :       INTEGER                   :: spin_index = 0, kpoint_index = 0, local_kpoint_index = 0
     145              :       REAL(KIND=dp)             :: kpoint_weight = 1.0_dp
     146              :       LOGICAL                   :: has_kpoint_context = .FALSE.
     147              :       LOGICAL                   :: state_allocated = .FALSE.
     148              :       LOGICAL                   :: has_complex_kpoint_state = .FALSE.
     149              : 
     150              :       ! first part of the variables, for occupied subspace invariant optimisation
     151              : 
     152              :       ! add a preconditioner matrix. should be symmetric and positive definite
     153              :       ! the type of this matrix might change in the future
     154              :       TYPE(preconditioner_type), POINTER :: preconditioner => NULL()
     155              : 
     156              :       ! these will/might change during iterations
     157              : 
     158              :       ! OT / TOD
     159              :       TYPE(dbcsr_type), POINTER :: matrix_p => NULL(), matrix_p_im => NULL()
     160              :       TYPE(dbcsr_type), POINTER :: matrix_r => NULL(), matrix_r_im => NULL()
     161              :       TYPE(dbcsr_type), POINTER :: matrix_sinp => NULL(), matrix_sinp_im => NULL()
     162              :       TYPE(dbcsr_type), POINTER :: matrix_cosp => NULL(), matrix_cosp_im => NULL()
     163              :       TYPE(dbcsr_type), POINTER :: matrix_sinp_b => NULL()
     164              :       TYPE(dbcsr_type), POINTER :: matrix_cosp_b => NULL()
     165              :       TYPE(dbcsr_type), POINTER :: matrix_buf1 => NULL(), matrix_buf1_im => NULL()
     166              :       TYPE(dbcsr_type), POINTER :: matrix_buf2 => NULL(), matrix_buf2_im => NULL()
     167              :       TYPE(dbcsr_type), POINTER :: matrix_buf3 => NULL(), matrix_buf3_im => NULL()
     168              :       TYPE(dbcsr_type), POINTER :: matrix_buf4 => NULL(), matrix_buf4_im => NULL()
     169              :       TYPE(dbcsr_type), POINTER :: matrix_os => NULL(), matrix_os_im => NULL()
     170              :       TYPE(dbcsr_type), POINTER :: matrix_buf1_ortho => NULL(), matrix_buf1_ortho_im => NULL()
     171              :       TYPE(dbcsr_type), POINTER :: matrix_buf2_ortho => NULL(), matrix_buf2_ortho_im => NULL()
     172              :       TYPE(dbcsr_type), POINTER :: matrix_tmp_ortho => NULL()
     173              :       TYPE(dbcsr_type), POINTER :: matrix_buf_nk => NULL(), matrix_buf_nk_im => NULL(), &
     174              :                                    matrix_tmp_nk => NULL()
     175              : 
     176              :       REAL(KIND=dp), DIMENSION(:), POINTER :: evals => NULL()
     177              :       REAL(KIND=dp), DIMENSION(:), POINTER :: dum => NULL()
     178              : 
     179              :       ! matrix os valid
     180              :       LOGICAL :: os_valid = .FALSE.
     181              :       ! Consumed by ot_mini after synchronizing the restart across k-point groups.
     182              :       LOGICAL :: preconditioner_changed = .FALSE.
     183              : 
     184              :       ! for efficient/parallel writing to the blacs_matrix
     185              :       TYPE(mp_para_env_type), POINTER :: para_env => NULL()
     186              :       TYPE(cp_blacs_env_type), POINTER :: blacs_env => NULL()
     187              : 
     188              :       ! mo-like vectors
     189              :       TYPE(dbcsr_type), POINTER :: matrix_c0 => NULL(), matrix_sc0 => NULL(), matrix_psc0 => NULL()
     190              :       TYPE(dbcsr_type), POINTER :: matrix_c0_im => NULL(), matrix_sc0_im => NULL(), matrix_psc0_im => NULL()
     191              : 
     192              :       ! OT / IR
     193              :       TYPE(dbcsr_type), POINTER :: buf1_k_k_nosym => NULL(), buf2_k_k_nosym => NULL(), &
     194              :                                    buf3_k_k_nosym => NULL(), buf4_k_k_nosym => NULL(), &
     195              :                                    buf1_k_k_sym => NULL(), buf2_k_k_sym => NULL(), &
     196              :                                    buf3_k_k_sym => NULL(), buf4_k_k_sym => NULL(), &
     197              :                                    p_k_k_sym => NULL(), buf1_n_k => NULL(), buf1_n_k_dp => NULL()
     198              : 
     199              :       ! only here for the ease of programming. These will have to be supplied
     200              :       ! explicitly at all times
     201              :       TYPE(dbcsr_type), POINTER :: matrix_x => NULL(), matrix_sx => NULL(), matrix_gx => NULL()
     202              :       TYPE(dbcsr_type), POINTER :: matrix_x_im => NULL(), matrix_sx_im => NULL(), matrix_gx_im => NULL()
     203              :       TYPE(dbcsr_type), POINTER :: matrix_preconditioned_gx => NULL(), &
     204              :                                    matrix_preconditioned_gx_im => NULL()
     205              :       TYPE(dbcsr_type), POINTER :: matrix_response_gx => NULL(), matrix_response_gx_im => NULL()
     206              :       TYPE(dbcsr_type), POINTER :: matrix_mermin_g0 => NULL(), matrix_mermin_g0_im => NULL()
     207              :       TYPE(dbcsr_type), POINTER :: matrix_ref_inv_sqrt => NULL(), matrix_ref_inv_sqrt_im => NULL()
     208              :       ! ROKS shares one orbital channel between two physical spin-density histories.
     209              :       TYPE(qs_ot_physical_secant_type), DIMENSION(2) :: mermin_physical
     210              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: ener_mermin_g0
     211              :       LOGICAL :: mermin_gradient_ref_valid = .FALSE.
     212              :       TYPE(dbcsr_type), POINTER :: matrix_dx => NULL(), matrix_gx_old => NULL()
     213              :       TYPE(dbcsr_type), POINTER :: matrix_dx_im => NULL(), matrix_gx_old_im => NULL()
     214              : 
     215              :       LOGICAL :: use_gx_old = .FALSE., use_dx = .FALSE.
     216              : 
     217              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_h_e => NULL(), matrix_h_x => NULL()
     218              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_h_e_im => NULL(), matrix_h_x_im => NULL()
     219              :       REAL(KIND=dp), DIMENSION(:), POINTER      :: lbfgs_rho => NULL(), lbfgs_yy => NULL()
     220              :       REAL(KIND=dp), DIMENSION(:), POINTER      :: lbfgs_sy_rotation => NULL(), &
     221              :                                                    lbfgs_yy_rotation => NULL()
     222              : 
     223              :       REAL(KIND=dp), DIMENSION(:, :), POINTER  :: ls_diis => NULL()
     224              :       REAL(KIND=dp), DIMENSION(:, :), POINTER  :: lss_diis => NULL()
     225              :       REAL(KIND=dp), DIMENSION(:), POINTER  :: c_diis => NULL()
     226              :       REAL(KIND=dp), DIMENSION(:), POINTER  :: c_broy => NULL()
     227              :       REAL(KIND=dp), DIMENSION(:), POINTER  :: energy_h => NULL()
     228              :       INTEGER, DIMENSION(:), POINTER         :: ipivot => NULL()
     229              : 
     230              :       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
     231              :       INTEGER          :: line_search_left = -1, line_search_right = -1, line_search_mid = -1
     232              :       INTEGER          :: line_search_count = -1
     233              :       LOGICAL          :: line_search_might_be_done = .FALSE.
     234              :       REAL(KIND=dp)    :: delta = -1.0_dp, gnorm = -1.0_dp, gnorm_old = -1.0_dp, etotal = -1.0_dp, gradient = -1.0_dp
     235              :       LOGICAL          :: energy_only = .FALSE.
     236              :       INTEGER          :: diis_iter = -1
     237              :       CHARACTER(LEN=8) :: OT_METHOD_FULL = ""
     238              :       INTEGER          :: OT_count = -1
     239              :       REAL(KIND=dp)    :: ds_min = -1.0_dp
     240              :       REAL(KIND=dp)    :: broyden_adaptive_sigma = -1.0_dp
     241              : 
     242              :       LOGICAL          :: do_taylor = .FALSE.
     243              :       INTEGER          :: taylor_order = -1
     244              :       REAL(KIND=dp)    :: largest_eval_upper_bound = -1.0_dp
     245              : 
     246              :       ! second part of the variables, if an explicit rotation is required as well
     247              :       TYPE(dbcsr_type), POINTER :: rot_mat_u => NULL() ! rotation matrix
     248              :       TYPE(dbcsr_type), POINTER :: rot_mat_u_im => NULL() ! imaginary part at complex k points
     249              :       TYPE(dbcsr_type), POINTER :: rot_mat_x => NULL() ! antisymmetric matrix that parametrises rot_matrix_u
     250              :       TYPE(dbcsr_type), POINTER :: rot_mat_x_im => NULL() ! symmetric imaginary generator component
     251              :       TYPE(dbcsr_type), POINTER :: rot_mat_dedu => NULL() ! derivative of the total energy wrt to u
     252              :       TYPE(dbcsr_type), POINTER :: rot_mat_dedu_im => NULL()
     253              :       TYPE(dbcsr_type), POINTER :: rot_mat_chc => NULL() ! for convencience, the matrix c^T H c
     254              :       TYPE(dbcsr_type), POINTER :: rot_mat_chc_im => NULL()
     255              : 
     256              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rot_mat_h_e => NULL()
     257              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rot_mat_h_x => NULL()
     258              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rot_mat_h_e_im => NULL()
     259              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rot_mat_h_x_im => NULL()
     260              :       TYPE(dbcsr_type), POINTER :: rot_mat_gx => NULL()
     261              :       TYPE(dbcsr_type), POINTER :: rot_mat_gx_im => NULL()
     262              :       TYPE(dbcsr_type), POINTER :: rot_mat_response_gx => NULL()
     263              :       TYPE(dbcsr_type), POINTER :: rot_mat_response_gx_im => NULL()
     264              :       TYPE(dbcsr_type), POINTER :: rot_mat_mermin_g0 => NULL()
     265              :       TYPE(dbcsr_type), POINTER :: rot_mat_mermin_g0_im => NULL()
     266              :       TYPE(dbcsr_type), POINTER :: rot_mat_gx_old => NULL()
     267              :       TYPE(dbcsr_type), POINTER :: rot_mat_gx_old_im => NULL()
     268              :       TYPE(dbcsr_type), POINTER :: rot_mat_dx => NULL()
     269              :       TYPE(dbcsr_type), POINTER :: rot_mat_dx_im => NULL()
     270              : 
     271              :       REAL(KIND=dp), DIMENSION(:), POINTER :: rot_mat_evals => NULL()
     272              :       TYPE(dbcsr_type), POINTER :: rot_mat_evec_re => NULL()
     273              :       TYPE(dbcsr_type), POINTER :: rot_mat_evec_im => NULL()
     274              :       LOGICAL                   :: rotation_response_valid = .FALSE.
     275              :       LOGICAL                   :: response_candidate_pending = .FALSE.
     276              :       LOGICAL                   :: response_shadow_pending = .FALSE.
     277              :       INTEGER                   :: response_candidate_directions = 0
     278              :       INTEGER                   :: response_candidate_good_samples = 0
     279              :       INTEGER                   :: response_candidate_cooldown = 0
     280              :       INTEGER                   :: response_shadow_good_samples = 0
     281              :       REAL(KIND=dp)             :: response_model_curvature = 0.0_dp
     282              :       REAL(KIND=dp)             :: response_shadow_curvature = 0.0_dp
     283              :       LOGICAL                   :: response_hxc_direction_valid = .FALSE.
     284              :       REAL(KIND=dp)             :: response_reference_energy = 0.0_dp
     285              :       REAL(KIND=dp)             :: response_reference_residual = 0.0_dp
     286              :       REAL(KIND=dp)             :: response_predicted_slope = 0.0_dp
     287              :       REAL(KIND=dp)             :: response_predicted_curvature = 0.0_dp
     288              : 
     289              :       ! third part of the variables, if we need to optimize orbital energies
     290              :       REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_x => NULL()
     291              :       REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_rayleigh => NULL()
     292              :       REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_dx => NULL()
     293              :       REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_gx => NULL()
     294              :       REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_preconditioned_gx => NULL()
     295              :       REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_response_gx => NULL()
     296              :       REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_gx_old => NULL()
     297              :       REAL(KIND=dp), POINTER, DIMENSION(:, :) :: ener_h_e => NULL()
     298              :       REAL(KIND=dp), POINTER, DIMENSION(:, :) :: ener_h_x => NULL()
     299              :    END TYPE qs_ot_type
     300              : 
     301              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_ot_types'
     302              : 
     303              : CONTAINS
     304              : 
     305              : ! **************************************************************************************************
     306              : !> \brief sets default values for the settings type
     307              : !> \param settings ...
     308              : !> \par History
     309              : !>      10.2004 created [Joost VandeVondele]
     310              : ! **************************************************************************************************
     311        17745 :    SUBROUTINE qs_ot_settings_init(settings)
     312              :       TYPE(qs_ot_settings_type)                          :: settings
     313              : 
     314        17745 :       settings%ot_method = "CG"
     315        17745 :       settings%ot_algorithm = "TOD"
     316        17745 :       settings%diis_m = 7
     317        17745 :       settings%lbfgs_curvature_tol = 1.0E-4_dp
     318        17745 :       settings%lbfgs_damping = .TRUE.
     319        17745 :       settings%preconditioner_name = "FULL_KINETIC"
     320        17745 :       settings%preconditioner_type = ot_precond_full_kinetic
     321        17745 :       settings%low_rank_base_name = "OVERLAP_INVERSE"
     322        17745 :       settings%low_rank_base = ot_low_rank_base_overlap
     323        17745 :       settings%lattice_fft_name = "OFF"
     324        17745 :       settings%lattice_fft = ot_lattice_fft_off
     325        17745 :       settings%lattice_fft_local_cells = 0
     326        17745 :       settings%cholesky_type = cholesky_reduce
     327        17745 :       settings%precond_solver_name = "CHOLESKY_INVERSE"
     328        17745 :       settings%precond_solver_type = ot_precond_solver_inv_chol
     329        17745 :       settings%chebyshev_degree = 8
     330        17745 :       settings%fermi_low_rank_max_rank = 48
     331        17745 :       settings%line_search_method = "2PNT"
     332        17745 :       settings%ds_min = 0.15_dp
     333        17745 :       settings%safer_diis = .TRUE.
     334        17745 :       settings%energy_gap = 0.2_dp
     335        17745 :       settings%eps_taylor = 1.0E-16_dp
     336        17745 :       settings%max_taylor = 4
     337        17745 :       settings%gold_target = 0.01_dp
     338        17745 :       settings%do_rotation = .FALSE.
     339        17745 :       settings%do_ener = .FALSE.
     340        17745 :       settings%irac_degree = 4
     341        17745 :       settings%max_irac = 50
     342        17745 :       settings%max_scf_diis = 0
     343        17745 :       settings%eps_irac = 1.0E-10_dp
     344        17745 :       settings%eps_irac_quick_exit = 1.0E-5_dp
     345        17745 :       settings%eps_irac_switch = 1.0E-2_dp
     346        17745 :       settings%eps_irac_filter_matrix = 0.0_dp
     347        17745 :       settings%on_the_fly_loc = .FALSE.
     348        17745 :       settings%ortho_irac = "CHOL"
     349        17745 :       settings%ks = .TRUE.
     350        17745 :       settings%occupation_preconditioner = .FALSE.
     351        17745 :       settings%add_nondiag_energy = .FALSE.
     352        17745 :       settings%nondiag_energy_strength = 0.0_dp
     353              : 
     354        17745 :    END SUBROUTINE qs_ot_settings_init
     355              : 
     356              : ! **************************************************************************************************
     357              : !> \brief label an OT environment by spin and optional irreducible k-point context
     358              : !> \param qs_ot_env ...
     359              : !> \param spin_index ...
     360              : !> \param kpoint_index ...
     361              : !> \param local_kpoint_index ...
     362              : !> \param kpoint_weight ...
     363              : ! **************************************************************************************************
     364        19092 :    SUBROUTINE qs_ot_set_context(qs_ot_env, spin_index, kpoint_index, local_kpoint_index, kpoint_weight)
     365              :       TYPE(qs_ot_type)                                   :: qs_ot_env
     366              :       INTEGER, INTENT(IN), OPTIONAL                      :: spin_index, kpoint_index, &
     367              :                                                             local_kpoint_index
     368              :       REAL(KIND=dp), INTENT(IN), OPTIONAL                :: kpoint_weight
     369              : 
     370        19092 :       IF (PRESENT(spin_index)) qs_ot_env%spin_index = spin_index
     371        19092 :       IF (PRESENT(kpoint_index)) qs_ot_env%kpoint_index = kpoint_index
     372        19092 :       IF (PRESENT(local_kpoint_index)) qs_ot_env%local_kpoint_index = local_kpoint_index
     373        19092 :       IF (PRESENT(kpoint_weight)) qs_ot_env%kpoint_weight = kpoint_weight
     374        19092 :       qs_ot_env%has_kpoint_context = PRESENT(kpoint_index) .OR. PRESENT(local_kpoint_index)
     375              : 
     376        19092 :    END SUBROUTINE qs_ot_set_context
     377              : 
     378              : ! **************************************************************************************************
     379              : !> \brief number of OT optimization channels for spin and k-point resolved state
     380              : !> \param nspin ...
     381              : !> \param nkpoint ...
     382              : !> \param restricted ...
     383              : !> \return ...
     384              : ! **************************************************************************************************
     385        18938 :    INTEGER FUNCTION qs_ot_number_of_channels(nspin, nkpoint, restricted)
     386              :       INTEGER, INTENT(IN)                                :: nspin
     387              :       INTEGER, INTENT(IN), OPTIONAL                      :: nkpoint
     388              :       LOGICAL, INTENT(IN), OPTIONAL                      :: restricted
     389              : 
     390              :       INTEGER                                            :: nkpoint_eff, nspin_eff
     391              : 
     392        18938 :       nspin_eff = nspin
     393        18938 :       IF (PRESENT(restricted)) THEN
     394        18938 :          IF (restricted) nspin_eff = 1
     395              :       END IF
     396        18938 :       nkpoint_eff = 1
     397        18938 :       IF (PRESENT(nkpoint)) nkpoint_eff = nkpoint
     398              : 
     399        18938 :       CPASSERT(nspin_eff >= 1)
     400        18938 :       CPASSERT(nkpoint_eff >= 1)
     401        18938 :       qs_ot_number_of_channels = nspin_eff*nkpoint_eff
     402              : 
     403        18938 :    END FUNCTION qs_ot_number_of_channels
     404              : 
     405              : ! **************************************************************************************************
     406              : !> \brief Return whether a preconditioner is implemented for complex k-point OT.
     407              : !> \param preconditioner_type selected OT preconditioner
     408              : !> \param use_real_wfn whether the k-point channel stores a real wavefunction
     409              : !> \return ...
     410              : ! **************************************************************************************************
     411          548 :    PURE ELEMENTAL FUNCTION qs_ot_kpoint_preconditioner_supported(preconditioner_type, use_real_wfn) &
     412              :       RESULT(supported)
     413              :       INTEGER, INTENT(IN)                                :: preconditioner_type
     414              :       LOGICAL, INTENT(IN)                                :: use_real_wfn
     415              :       LOGICAL                                            :: supported
     416              : 
     417          548 :       supported = .FALSE.
     418          548 :       IF (.NOT. use_real_wfn) THEN
     419              :          supported = preconditioner_type == ot_precond_none .OR. &
     420              :                      preconditioner_type == ot_precond_fermi_low_rank .OR. &
     421              :                      preconditioner_type == ot_precond_full_all .OR. &
     422              :                      preconditioner_type == ot_precond_full_single .OR. &
     423              :                      preconditioner_type == ot_precond_full_all_covariant .OR. &
     424              :                      preconditioner_type == ot_precond_full_single_inverse .OR. &
     425              :                      preconditioner_type == ot_precond_full_kinetic .OR. &
     426          548 :                      preconditioner_type == ot_precond_s_inverse
     427              :       END IF
     428              : 
     429          548 :    END FUNCTION qs_ot_kpoint_preconditioner_supported
     430              : 
     431              : ! **************************************************************************************************
     432              : !> \brief Return whether a solver is implemented for a complex k-point OT preconditioner.
     433              : !> \param preconditioner_type selected OT preconditioner
     434              : !> \param solver_type selected preconditioner solver
     435              : !> \param use_real_wfn whether the k-point channel stores a real wavefunction
     436              : !> \return ...
     437              : ! **************************************************************************************************
     438          274 :    PURE ELEMENTAL FUNCTION qs_ot_kpoint_preconditioner_solver_supported( &
     439              :       preconditioner_type, solver_type, use_real_wfn) RESULT(supported)
     440              :       INTEGER, INTENT(IN)                                :: preconditioner_type, solver_type
     441              :       LOGICAL, INTENT(IN)                                :: use_real_wfn
     442              :       LOGICAL                                            :: supported
     443              : 
     444          274 :       supported = qs_ot_kpoint_preconditioner_supported(preconditioner_type, use_real_wfn)
     445          274 :       IF (.NOT. supported) RETURN
     446              :       IF (preconditioner_type == ot_precond_fermi_low_rank .OR. &
     447              :           preconditioner_type == ot_precond_full_all .OR. &
     448          274 :           preconditioner_type == ot_precond_full_all_covariant .OR. &
     449              :           preconditioner_type == ot_precond_full_single) THEN
     450           68 :          supported = solver_type == ot_precond_solver_default
     451              :       ELSE IF (preconditioner_type == ot_precond_full_single_inverse .OR. &
     452              :                preconditioner_type == ot_precond_full_kinetic .OR. &
     453              :                preconditioner_type == ot_precond_s_inverse) THEN
     454              :          supported = solver_type == ot_precond_solver_default .OR. &
     455          198 :                      solver_type == ot_precond_solver_inv_chol
     456              :       END IF
     457              : 
     458              :    END FUNCTION qs_ot_kpoint_preconditioner_solver_supported
     459              : 
     460              : ! **************************************************************************************************
     461              : !> \brief Scale an inverse k-point Hessian block consistently with its irreducible weight.
     462              : !> \param kpoint_weight positive irreducible k-point weight
     463              : !> \return ...
     464              : ! **************************************************************************************************
     465         7614 :    PURE ELEMENTAL REAL(KIND=dp) FUNCTION qs_ot_kpoint_preconditioner_scale(kpoint_weight)
     466              :       REAL(KIND=dp), INTENT(IN)                          :: kpoint_weight
     467              : 
     468         7614 :       qs_ot_kpoint_preconditioner_scale = 1.0_dp/kpoint_weight
     469              : 
     470         7614 :    END FUNCTION qs_ot_kpoint_preconditioner_scale
     471              : 
     472              : ! **************************************************************************************************
     473              : !> \brief flat OT channel index for a spin/k-point pair
     474              : !> \param ispin ...
     475              : !> \param ikpoint ...
     476              : !> \param nspin ...
     477              : !> \return ...
     478              : ! **************************************************************************************************
     479        64805 :    INTEGER FUNCTION qs_ot_channel_index(ispin, ikpoint, nspin)
     480              :       INTEGER, INTENT(IN)                                :: ispin, ikpoint, nspin
     481              : 
     482        64805 :       CPASSERT(ispin >= 1)
     483        64805 :       CPASSERT(ikpoint >= 1)
     484        64805 :       CPASSERT(nspin >= 1)
     485        64805 :       CPASSERT(ispin <= nspin)
     486        64805 :       qs_ot_channel_index = (ikpoint - 1)*nspin + ispin
     487              : 
     488        64805 :    END FUNCTION qs_ot_channel_index
     489              : 
     490              : ! **************************************************************************************************
     491              : !> \brief validate the flat OT channel identity for spin and optional irreducible k-points
     492              : !> \param qs_ot_env ...
     493              : !> \param nspin ...
     494              : !> \param nkpoint ...
     495              : !> \param restricted ...
     496              : !> \param require_kpoint ...
     497              : !> \param kp_range ...
     498              : !> \param wkp ...
     499              : !> \param require_local_state ...
     500              : !> \param require_complex_state ...
     501              : ! **************************************************************************************************
     502        11131 :    SUBROUTINE qs_ot_check_channel_context(qs_ot_env, nspin, nkpoint, restricted, require_kpoint, &
     503              :                                           kp_range, wkp, require_local_state, require_complex_state)
     504              :       TYPE(qs_ot_type), DIMENSION(:), INTENT(IN)         :: qs_ot_env
     505              :       INTEGER, INTENT(IN)                                :: nspin
     506              :       INTEGER, INTENT(IN), OPTIONAL                      :: nkpoint
     507              :       LOGICAL, INTENT(IN), OPTIONAL                      :: restricted, require_kpoint
     508              :       INTEGER, DIMENSION(2), INTENT(IN), OPTIONAL        :: kp_range
     509              :       REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER     :: wkp
     510              :       LOGICAL, INTENT(IN), OPTIONAL                      :: require_local_state, &
     511              :                                                             require_complex_state
     512              : 
     513              :       INTEGER                                            :: expected_local_kpoint, ikpoint, ispin, &
     514              :                                                             nkpoint_eff, nspin_eff, ot_channel
     515              :       LOGICAL                                            :: check_complex_state, &
     516              :                                                             check_kpoint_context, &
     517              :                                                             check_local_state, check_weights, &
     518              :                                                             context_ok, restricted_eff
     519              :       REAL(KIND=dp)                                      :: weight_tol
     520              : 
     521        11131 :       nkpoint_eff = 1
     522        11131 :       IF (PRESENT(nkpoint)) nkpoint_eff = nkpoint
     523        11131 :       nspin_eff = nspin
     524        11131 :       restricted_eff = .FALSE.
     525        11131 :       IF (PRESENT(restricted)) THEN
     526        11131 :          restricted_eff = restricted
     527        11131 :          IF (restricted_eff) nspin_eff = 1
     528              :       END IF
     529              : 
     530        11131 :       check_kpoint_context = (nkpoint_eff > 1)
     531        11131 :       IF (PRESENT(require_kpoint)) check_kpoint_context = require_kpoint
     532        11131 :       check_weights = .FALSE.
     533        11131 :       IF (PRESENT(wkp)) check_weights = ASSOCIATED(wkp)
     534        11131 :       check_local_state = .FALSE.
     535        11131 :       IF (PRESENT(require_local_state)) check_local_state = require_local_state
     536        11131 :       check_complex_state = .FALSE.
     537        11131 :       IF (PRESENT(require_complex_state)) check_complex_state = require_complex_state
     538              : 
     539              :       context_ok = (SIZE(qs_ot_env) == qs_ot_number_of_channels(nspin, &
     540              :                                                                 nkpoint=nkpoint_eff, &
     541        11131 :                                                                 restricted=restricted_eff))
     542        11131 :       CPASSERT(context_ok)
     543        28018 :       DO ikpoint = 1, nkpoint_eff
     544        16887 :          expected_local_kpoint = 0
     545        16887 :          IF (PRESENT(kp_range)) THEN
     546        16887 :             IF (ikpoint >= kp_range(1) .AND. ikpoint <= kp_range(2)) THEN
     547         5991 :                expected_local_kpoint = ikpoint - kp_range(1) + 1
     548              :             END IF
     549              :          END IF
     550        48060 :          DO ispin = 1, nspin_eff
     551        20042 :             ot_channel = qs_ot_channel_index(ispin, ikpoint, nspin_eff)
     552        20042 :             CPASSERT(qs_ot_env(ot_channel)%spin_index == ispin)
     553        20042 :             IF (check_kpoint_context) THEN
     554        10990 :                CPASSERT(qs_ot_env(ot_channel)%has_kpoint_context)
     555        10990 :                CPASSERT(qs_ot_env(ot_channel)%kpoint_index == ikpoint)
     556        10990 :                IF (PRESENT(kp_range)) THEN
     557        10990 :                   context_ok = (qs_ot_env(ot_channel)%local_kpoint_index == expected_local_kpoint)
     558        10990 :                   CPASSERT(context_ok)
     559              :                END IF
     560        10990 :                IF (check_weights) THEN
     561        10002 :                   weight_tol = 1000.0_dp*EPSILON(1.0_dp)*MAX(1.0_dp, ABS(wkp(ikpoint)))
     562        10002 :                   context_ok = (ABS(qs_ot_env(ot_channel)%kpoint_weight - wkp(ikpoint)) <= weight_tol)
     563        10002 :                   CPASSERT(context_ok)
     564              :                END IF
     565              :             END IF
     566        36929 :             IF (check_local_state) THEN
     567        10002 :                IF (expected_local_kpoint > 0 .OR. .NOT. PRESENT(kp_range)) THEN
     568         6372 :                   CPASSERT(qs_ot_env(ot_channel)%state_allocated)
     569         6372 :                   IF (check_complex_state) THEN
     570         6372 :                      CPASSERT(qs_ot_env(ot_channel)%has_complex_kpoint_state)
     571              :                   END IF
     572              :                ELSE
     573         3630 :                   CPASSERT(.NOT. qs_ot_env(ot_channel)%state_allocated)
     574              :                END IF
     575              :             END IF
     576              :          END DO
     577              :       END DO
     578              : 
     579        11131 :    END SUBROUTINE qs_ot_check_channel_context
     580              : 
     581              : ! **************************************************************************************************
     582              : !> \brief Restart the minimizer at the current point without changing its coordinates or gradient.
     583              : !> \param qs_ot_env OT channel state
     584              : ! **************************************************************************************************
     585        20044 :    SUBROUTINE qs_ot_reset_history(qs_ot_env)
     586              :       TYPE(qs_ot_type)                                   :: qs_ot_env
     587              : 
     588      1082376 :       qs_ot_env%OT_energy(:) = 0.0_dp
     589      1082376 :       qs_ot_env%OT_pos(:) = 0.0_dp
     590      1082376 :       qs_ot_env%OT_grad(:) = 0.0_dp
     591        20044 :       qs_ot_env%line_search_count = 0
     592              : 
     593        20044 :       qs_ot_env%energy_only = .FALSE.
     594        20044 :       qs_ot_env%gnorm_old = 1.0_dp
     595        20044 :       qs_ot_env%diis_iter = 0
     596        20044 :       qs_ot_env%ds_min = qs_ot_env%settings%ds_min
     597        20044 :       qs_ot_env%line_search_might_be_done = .FALSE.
     598        20044 :       qs_ot_env%mermin_gradient_ref_valid = .FALSE.
     599        20044 :       qs_ot_env%preconditioner_changed = .FALSE.
     600              : 
     601        20044 :       IF (qs_ot_env%use_dx) THEN
     602        13827 :          CALL dbcsr_set(qs_ot_env%matrix_dx, 0.0_dp)
     603              :       END IF
     604        20044 :       IF (qs_ot_env%use_dx .AND. ASSOCIATED(qs_ot_env%matrix_dx_im)) THEN
     605         1058 :          CALL dbcsr_set(qs_ot_env%matrix_dx_im, 0.0_dp)
     606              :       END IF
     607              : 
     608        20044 :       IF (qs_ot_env%use_gx_old) THEN
     609         8052 :          CALL dbcsr_set(qs_ot_env%matrix_gx_old, 0.0_dp)
     610              :       END IF
     611        20044 :       IF (qs_ot_env%use_gx_old .AND. ASSOCIATED(qs_ot_env%matrix_gx_old_im)) THEN
     612          614 :          CALL dbcsr_set(qs_ot_env%matrix_gx_old_im, 0.0_dp)
     613              :       END IF
     614              : 
     615        20044 :       IF (qs_ot_env%settings%ot_method == "LBFG") THEN
     616         2176 :          qs_ot_env%lbfgs_rho = 0.0_dp
     617         2176 :          qs_ot_env%lbfgs_yy = 0.0_dp
     618         2176 :          qs_ot_env%lbfgs_sy_rotation = 0.0_dp
     619         2176 :          qs_ot_env%lbfgs_yy_rotation = 0.0_dp
     620              :       END IF
     621              : 
     622        20044 :       IF (qs_ot_env%settings%do_rotation) THEN
     623          738 :          qs_ot_env%rotation_response_valid = .FALSE.
     624          738 :          qs_ot_env%response_candidate_pending = .FALSE.
     625          738 :          qs_ot_env%response_shadow_pending = .FALSE.
     626          738 :          qs_ot_env%response_candidate_directions = 0
     627          738 :          qs_ot_env%response_candidate_good_samples = 0
     628          738 :          qs_ot_env%response_candidate_cooldown = 0
     629          738 :          qs_ot_env%response_shadow_good_samples = 0
     630          738 :          qs_ot_env%response_model_curvature = 0.0_dp
     631          738 :          qs_ot_env%response_shadow_curvature = 0.0_dp
     632          738 :          qs_ot_env%response_hxc_direction_valid = .FALSE.
     633          738 :          qs_ot_env%response_reference_energy = 0.0_dp
     634          738 :          qs_ot_env%response_reference_residual = 0.0_dp
     635          738 :          qs_ot_env%response_predicted_slope = 0.0_dp
     636          738 :          qs_ot_env%response_predicted_curvature = 0.0_dp
     637          738 :          IF (qs_ot_env%use_dx) THEN
     638          664 :             CALL dbcsr_set(qs_ot_env%rot_mat_dx, 0.0_dp)
     639          664 :             IF (ASSOCIATED(qs_ot_env%rot_mat_dx_im)) CALL dbcsr_set(qs_ot_env%rot_mat_dx_im, 0.0_dp)
     640              :          END IF
     641          738 :          IF (qs_ot_env%use_gx_old) THEN
     642          590 :             CALL dbcsr_set(qs_ot_env%rot_mat_gx_old, 0.0_dp)
     643          590 :             IF (ASSOCIATED(qs_ot_env%rot_mat_gx_old_im)) CALL dbcsr_set(qs_ot_env%rot_mat_gx_old_im, 0.0_dp)
     644              :          END IF
     645              :       END IF
     646        20044 :       IF (qs_ot_env%settings%do_ener) THEN
     647          232 :          IF (qs_ot_env%use_dx) THEN
     648         1696 :             qs_ot_env%ener_dx(:) = 0.0_dp
     649              :          END IF
     650          232 :          IF (qs_ot_env%use_gx_old) THEN
     651         1372 :             qs_ot_env%ener_gx_old(:) = 0.0_dp
     652              :          END IF
     653              :       END IF
     654              : 
     655        20044 :    END SUBROUTINE qs_ot_reset_history
     656              : 
     657              : ! **************************************************************************************************
     658              : !> \brief init matrices, needs c0 and sc0 so that c0*sc0=1
     659              : !> \param qs_ot_env ...
     660              : ! **************************************************************************************************
     661        10529 :    SUBROUTINE qs_ot_init(qs_ot_env)
     662              :       TYPE(qs_ot_type)                                   :: qs_ot_env
     663              : 
     664        10529 :       CALL qs_ot_reset_history(qs_ot_env)
     665        10529 :       qs_ot_env%os_valid = .FALSE.
     666              : 
     667        10529 :       CALL dbcsr_set(qs_ot_env%matrix_gx, 0.0_dp)
     668        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_gx_im)) THEN
     669          765 :          CALL dbcsr_set(qs_ot_env%matrix_gx_im, 0.0_dp)
     670              :       END IF
     671        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_preconditioned_gx)) THEN
     672           92 :          CALL dbcsr_set(qs_ot_env%matrix_preconditioned_gx, 0.0_dp)
     673              :       END IF
     674        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_preconditioned_gx_im)) THEN
     675           92 :          CALL dbcsr_set(qs_ot_env%matrix_preconditioned_gx_im, 0.0_dp)
     676              :       END IF
     677        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_response_gx)) CALL dbcsr_set(qs_ot_env%matrix_response_gx, 0.0_dp)
     678        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_response_gx_im)) THEN
     679           68 :          CALL dbcsr_set(qs_ot_env%matrix_response_gx_im, 0.0_dp)
     680              :       END IF
     681        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_mermin_g0)) CALL dbcsr_set(qs_ot_env%matrix_mermin_g0, 0.0_dp)
     682        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_mermin_g0_im)) THEN
     683           68 :          CALL dbcsr_set(qs_ot_env%matrix_mermin_g0_im, 0.0_dp)
     684              :       END IF
     685              : 
     686        10529 :       IF (qs_ot_env%settings%do_rotation) THEN
     687          369 :          CALL dbcsr_set(qs_ot_env%rot_mat_u, 0.0_dp)
     688          369 :          CALL dbcsr_add_on_diag(qs_ot_env%rot_mat_u, 1.0_dp)
     689          369 :          CALL dbcsr_set(qs_ot_env%rot_mat_x, 0.0_dp)
     690          369 :          CALL dbcsr_set(qs_ot_env%rot_mat_dedu, 0.0_dp)
     691          369 :          CALL dbcsr_set(qs_ot_env%rot_mat_chc, 0.0_dp)
     692          369 :          CALL dbcsr_set(qs_ot_env%rot_mat_gx, 0.0_dp)
     693          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_response_gx)) THEN
     694           92 :             CALL dbcsr_set(qs_ot_env%rot_mat_response_gx, 0.0_dp)
     695              :          END IF
     696          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_u_im)) CALL dbcsr_set(qs_ot_env%rot_mat_u_im, 0.0_dp)
     697          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_x_im)) CALL dbcsr_set(qs_ot_env%rot_mat_x_im, 0.0_dp)
     698          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_dedu_im)) CALL dbcsr_set(qs_ot_env%rot_mat_dedu_im, 0.0_dp)
     699          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_chc_im)) CALL dbcsr_set(qs_ot_env%rot_mat_chc_im, 0.0_dp)
     700          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_gx_im)) CALL dbcsr_set(qs_ot_env%rot_mat_gx_im, 0.0_dp)
     701          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_response_gx_im)) THEN
     702           92 :             CALL dbcsr_set(qs_ot_env%rot_mat_response_gx_im, 0.0_dp)
     703              :          END IF
     704          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_mermin_g0)) THEN
     705           68 :             CALL dbcsr_set(qs_ot_env%rot_mat_mermin_g0, 0.0_dp)
     706              :          END IF
     707          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_mermin_g0_im)) THEN
     708           68 :             CALL dbcsr_set(qs_ot_env%rot_mat_mermin_g0_im, 0.0_dp)
     709              :          END IF
     710              :       END IF
     711        10529 :       IF (qs_ot_env%settings%do_ener) THEN
     712         1010 :          qs_ot_env%ener_rayleigh(:) = 0.0_dp
     713         1010 :          qs_ot_env%ener_gx(:) = 0.0_dp
     714          116 :          IF (ASSOCIATED(qs_ot_env%ener_preconditioned_gx)) THEN
     715          698 :             qs_ot_env%ener_preconditioned_gx(:) = 0.0_dp
     716              :          END IF
     717          722 :          IF (ASSOCIATED(qs_ot_env%ener_response_gx)) qs_ot_env%ener_response_gx(:) = 0.0_dp
     718          550 :          IF (ALLOCATED(qs_ot_env%ener_mermin_g0)) qs_ot_env%ener_mermin_g0(:) = 0.0_dp
     719              :       END IF
     720              : 
     721        10529 :    END SUBROUTINE qs_ot_init
     722              : 
     723              : ! **************************************************************************************************
     724              : !> \brief allocates the data in qs_ot_env, for a calculation with fm_struct_ref
     725              : !>        ortho_k allows for specifying an additional orthogonal subspace (i.e. c will
     726              : !>        be kept orthogonal provided c0 was, used in qs_ot_eigensolver)
     727              : !> \param qs_ot_env ...
     728              : !> \param matrix_s ...
     729              : !> \param fm_struct_ref ...
     730              : !> \param ortho_k ...
     731              : !> \param energy_dimension number of auxiliary energy variables, defaults to the orbital count
     732              : ! **************************************************************************************************
     733        10529 :    SUBROUTINE qs_ot_allocate(qs_ot_env, matrix_s, fm_struct_ref, ortho_k, energy_dimension)
     734              :       TYPE(qs_ot_type)                                   :: qs_ot_env
     735              :       TYPE(dbcsr_type), POINTER                          :: matrix_s
     736              :       TYPE(cp_fm_struct_type), POINTER                   :: fm_struct_ref
     737              :       INTEGER, OPTIONAL                                  :: ortho_k, energy_dimension
     738              : 
     739              :       INTEGER                                            :: i, k, m_diis, my_energy_dimension, &
     740              :                                                             my_ortho_k, n, ncoef, nhistory
     741              :       TYPE(cp_blacs_env_type), POINTER                   :: context
     742              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     743              : 
     744        10529 :       CALL cite_reference(VandeVondele2003)
     745              : 
     746        10529 :       CPASSERT(.NOT. qs_ot_env%state_allocated)
     747        10529 :       qs_ot_env%has_complex_kpoint_state = .FALSE.
     748        10529 :       NULLIFY (qs_ot_env%preconditioner)
     749        10529 :       NULLIFY (qs_ot_env%matrix_psc0)
     750        10529 :       NULLIFY (qs_ot_env%matrix_psc0_im)
     751        10529 :       NULLIFY (qs_ot_env%para_env)
     752        10529 :       NULLIFY (qs_ot_env%blacs_env)
     753              : 
     754              :       CALL cp_fm_struct_get(fm_struct_ref, nrow_global=n, ncol_global=k, &
     755        10529 :                             para_env=para_env, context=context)
     756              : 
     757        10529 :       qs_ot_env%para_env => para_env
     758        10529 :       qs_ot_env%blacs_env => context
     759        10529 :       CALL para_env%retain()
     760        10529 :       CALL context%retain()
     761              : 
     762        10529 :       IF (PRESENT(ortho_k)) THEN
     763          712 :          my_ortho_k = ortho_k
     764              :       ELSE
     765         9817 :          my_ortho_k = k
     766              :       END IF
     767        10529 :       my_energy_dimension = k
     768        10529 :       IF (PRESENT(energy_dimension)) my_energy_dimension = energy_dimension
     769        10529 :       IF (qs_ot_env%settings%do_ener) THEN
     770          116 :          CPASSERT(my_energy_dimension > 0)
     771              :       END IF
     772              : 
     773        10529 :       m_diis = qs_ot_env%settings%diis_m
     774              : 
     775        10529 :       qs_ot_env%use_gx_old = .FALSE.
     776        10529 :       qs_ot_env%use_dx = .FALSE.
     777              : 
     778         4312 :       SELECT CASE (qs_ot_env%settings%ot_method)
     779              :       CASE ("SD")
     780              :          ! nothing
     781              :       CASE ("CG", "LBFG")
     782         4312 :          qs_ot_env%use_gx_old = .TRUE.
     783         4312 :          qs_ot_env%use_dx = .TRUE.
     784         4312 :          IF (qs_ot_env%settings%ot_method == "LBFG" .AND. m_diis < 1) CPABORT("m_diis less than one")
     785              :       CASE ("DIIS", "BROY")
     786         6203 :          IF (m_diis < 1) CPABORT("m_diis less than one")
     787              :       CASE DEFAULT
     788        10529 :          CPABORT("Unknown option")
     789              :       END SELECT
     790              : 
     791        10529 :       IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
     792              :           qs_ot_env%settings%ot_method == "BROY") THEN
     793        24812 :          ALLOCATE (qs_ot_env%ls_diis(m_diis + 1, m_diis + 1))
     794       442413 :          qs_ot_env%ls_diis = 0.0_dp
     795        18609 :          ALLOCATE (qs_ot_env%lss_diis(m_diis + 1, m_diis + 1))
     796        18609 :          ALLOCATE (qs_ot_env%c_diis(m_diis + 1))
     797        18609 :          ALLOCATE (qs_ot_env%c_broy(m_diis))
     798        12406 :          ALLOCATE (qs_ot_env%energy_h(m_diis))
     799        18609 :          ALLOCATE (qs_ot_env%ipivot(m_diis + 1))
     800              :       END IF
     801        10529 :       IF (qs_ot_env%settings%ot_method == "LBFG") THEN
     802              :          ALLOCATE (qs_ot_env%lbfgs_rho(m_diis), qs_ot_env%lbfgs_yy(m_diis), &
     803          900 :                    qs_ot_env%lbfgs_sy_rotation(m_diis), qs_ot_env%lbfgs_yy_rotation(m_diis))
     804         1088 :          qs_ot_env%lbfgs_rho = 0.0_dp
     805         1088 :          qs_ot_env%lbfgs_yy = 0.0_dp
     806         1088 :          qs_ot_env%lbfgs_sy_rotation = 0.0_dp
     807         1088 :          qs_ot_env%lbfgs_yy_rotation = 0.0_dp
     808              :       END IF
     809              : 
     810        31157 :       ALLOCATE (qs_ot_env%evals(k))
     811        20628 :       ALLOCATE (qs_ot_env%dum(k))
     812              : 
     813        10529 :       NULLIFY (qs_ot_env%matrix_os)
     814        10529 :       NULLIFY (qs_ot_env%matrix_os_im)
     815        10529 :       NULLIFY (qs_ot_env%matrix_buf1_ortho)
     816        10529 :       NULLIFY (qs_ot_env%matrix_buf1_ortho_im)
     817        10529 :       NULLIFY (qs_ot_env%matrix_buf2_ortho)
     818        10529 :       NULLIFY (qs_ot_env%matrix_buf2_ortho_im)
     819        10529 :       NULLIFY (qs_ot_env%matrix_tmp_ortho)
     820        10529 :       NULLIFY (qs_ot_env%matrix_buf_nk)
     821        10529 :       NULLIFY (qs_ot_env%matrix_buf_nk_im)
     822        10529 :       NULLIFY (qs_ot_env%matrix_tmp_nk)
     823        10529 :       NULLIFY (qs_ot_env%matrix_p)
     824        10529 :       NULLIFY (qs_ot_env%matrix_p_im)
     825        10529 :       NULLIFY (qs_ot_env%matrix_r)
     826        10529 :       NULLIFY (qs_ot_env%matrix_r_im)
     827        10529 :       NULLIFY (qs_ot_env%matrix_sinp)
     828        10529 :       NULLIFY (qs_ot_env%matrix_sinp_im)
     829        10529 :       NULLIFY (qs_ot_env%matrix_cosp)
     830        10529 :       NULLIFY (qs_ot_env%matrix_cosp_im)
     831        10529 :       NULLIFY (qs_ot_env%matrix_sinp_b)
     832        10529 :       NULLIFY (qs_ot_env%matrix_cosp_b)
     833        10529 :       NULLIFY (qs_ot_env%matrix_buf1)
     834        10529 :       NULLIFY (qs_ot_env%matrix_buf1_im)
     835        10529 :       NULLIFY (qs_ot_env%matrix_buf2)
     836        10529 :       NULLIFY (qs_ot_env%matrix_buf2_im)
     837        10529 :       NULLIFY (qs_ot_env%matrix_buf3)
     838        10529 :       NULLIFY (qs_ot_env%matrix_buf3_im)
     839        10529 :       NULLIFY (qs_ot_env%matrix_buf4)
     840        10529 :       NULLIFY (qs_ot_env%matrix_buf4_im)
     841        10529 :       NULLIFY (qs_ot_env%matrix_c0)
     842        10529 :       NULLIFY (qs_ot_env%matrix_sc0)
     843        10529 :       NULLIFY (qs_ot_env%matrix_c0_im)
     844        10529 :       NULLIFY (qs_ot_env%matrix_sc0_im)
     845        10529 :       NULLIFY (qs_ot_env%matrix_x)
     846        10529 :       NULLIFY (qs_ot_env%matrix_sx)
     847        10529 :       NULLIFY (qs_ot_env%matrix_x_im)
     848        10529 :       NULLIFY (qs_ot_env%matrix_sx_im)
     849        10529 :       NULLIFY (qs_ot_env%matrix_gx)
     850        10529 :       NULLIFY (qs_ot_env%matrix_gx_im)
     851        10529 :       NULLIFY (qs_ot_env%matrix_preconditioned_gx)
     852        10529 :       NULLIFY (qs_ot_env%matrix_preconditioned_gx_im)
     853        10529 :       NULLIFY (qs_ot_env%matrix_response_gx)
     854        10529 :       NULLIFY (qs_ot_env%matrix_response_gx_im)
     855        10529 :       NULLIFY (qs_ot_env%matrix_mermin_g0)
     856        10529 :       NULLIFY (qs_ot_env%matrix_mermin_g0_im)
     857        10529 :       NULLIFY (qs_ot_env%matrix_ref_inv_sqrt)
     858        10529 :       NULLIFY (qs_ot_env%matrix_ref_inv_sqrt_im)
     859        31587 :       DO i = 1, SIZE(qs_ot_env%mermin_physical)
     860        21058 :          NULLIFY (qs_ot_env%mermin_physical(i)%c0)
     861        21058 :          NULLIFY (qs_ot_env%mermin_physical(i)%c0_im)
     862        21058 :          NULLIFY (qs_ot_env%mermin_physical(i)%h0)
     863        21058 :          NULLIFY (qs_ot_env%mermin_physical(i)%h0_im)
     864        21058 :          NULLIFY (qs_ot_env%mermin_physical(i)%c_previous)
     865        21058 :          NULLIFY (qs_ot_env%mermin_physical(i)%c_previous_im)
     866        21058 :          NULLIFY (qs_ot_env%mermin_physical(i)%y_previous)
     867        21058 :          NULLIFY (qs_ot_env%mermin_physical(i)%y_previous_im)
     868        21058 :          qs_ot_env%mermin_physical(i)%reference_valid = .FALSE.
     869        31587 :          qs_ot_env%mermin_physical(i)%secant_valid = .FALSE.
     870              :       END DO
     871        10529 :       qs_ot_env%mermin_gradient_ref_valid = .FALSE.
     872        10529 :       NULLIFY (qs_ot_env%matrix_gx_old)
     873        10529 :       NULLIFY (qs_ot_env%matrix_gx_old_im)
     874        10529 :       NULLIFY (qs_ot_env%matrix_dx)
     875        10529 :       NULLIFY (qs_ot_env%matrix_dx_im)
     876        10529 :       NULLIFY (qs_ot_env%buf1_k_k_nosym)
     877        10529 :       NULLIFY (qs_ot_env%buf2_k_k_nosym)
     878        10529 :       NULLIFY (qs_ot_env%buf3_k_k_nosym)
     879        10529 :       NULLIFY (qs_ot_env%buf4_k_k_nosym)
     880        10529 :       NULLIFY (qs_ot_env%buf1_k_k_sym)
     881        10529 :       NULLIFY (qs_ot_env%buf2_k_k_sym)
     882        10529 :       NULLIFY (qs_ot_env%buf3_k_k_sym)
     883        10529 :       NULLIFY (qs_ot_env%buf4_k_k_sym)
     884        10529 :       NULLIFY (qs_ot_env%buf1_n_k)
     885        10529 :       NULLIFY (qs_ot_env%buf1_n_k_dp)
     886        10529 :       NULLIFY (qs_ot_env%p_k_k_sym)
     887              : 
     888              :       ! COMMON MATRICES
     889        10529 :       CALL dbcsr_init_p(qs_ot_env%matrix_c0)
     890              :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_c0, template=matrix_s, n=k, &
     891        10529 :                                              sym=dbcsr_type_no_symmetry)
     892              : 
     893        10529 :       CALL dbcsr_init_p(qs_ot_env%matrix_sc0)
     894              :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_sc0, template=matrix_s, n=my_ortho_k, &
     895        10529 :                                              sym=dbcsr_type_no_symmetry)
     896              : 
     897        10529 :       CALL dbcsr_init_p(qs_ot_env%matrix_x)
     898              :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_x, template=matrix_s, n=k, &
     899        10529 :                                              sym=dbcsr_type_no_symmetry)
     900              : 
     901        10529 :       CALL dbcsr_init_p(qs_ot_env%matrix_sx)
     902              :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_sx, template=matrix_s, n=k, &
     903        10529 :                                              sym=dbcsr_type_no_symmetry)
     904              : 
     905        10529 :       CALL dbcsr_init_p(qs_ot_env%matrix_gx)
     906              :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_gx, template=matrix_s, n=k, &
     907        10529 :                                              sym=dbcsr_type_no_symmetry)
     908              : 
     909        10529 :       IF (qs_ot_env%settings%occupation_preconditioner) THEN
     910           92 :          CALL dbcsr_init_p(qs_ot_env%matrix_preconditioned_gx)
     911              :          CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_preconditioned_gx, &
     912              :                                                 template=matrix_s, n=k, &
     913           92 :                                                 sym=dbcsr_type_no_symmetry)
     914              :       END IF
     915              : 
     916        10529 :       IF (qs_ot_env%use_dx) THEN
     917         4312 :          CALL dbcsr_init_p(qs_ot_env%matrix_dx)
     918              :          CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_dx, template=matrix_s, n=k, &
     919         4312 :                                                 sym=dbcsr_type_no_symmetry)
     920              :       END IF
     921              : 
     922        10529 :       IF (qs_ot_env%use_gx_old) THEN
     923         4312 :          CALL dbcsr_init_p(qs_ot_env%matrix_gx_old)
     924              :          CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_gx_old, template=matrix_s, n=k, &
     925         4312 :                                                 sym=dbcsr_type_no_symmetry)
     926              :       END IF
     927              : 
     928         9138 :       SELECT CASE (qs_ot_env%settings%ot_algorithm)
     929              :       CASE ("TOD")
     930         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_p)
     931              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_p, template=matrix_s, m=k, n=k, &
     932         9138 :                                             sym=dbcsr_type_no_symmetry)
     933              : 
     934         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_r)
     935              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_r, template=matrix_s, m=k, n=k, &
     936         9138 :                                             sym=dbcsr_type_no_symmetry)
     937              : 
     938         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_sinp)
     939              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_sinp, template=matrix_s, m=k, n=k, &
     940         9138 :                                             sym=dbcsr_type_no_symmetry)
     941              : 
     942         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_cosp)
     943              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_cosp, template=matrix_s, m=k, n=k, &
     944         9138 :                                             sym=dbcsr_type_no_symmetry)
     945              : 
     946         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_sinp_b)
     947              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_sinp_b, template=matrix_s, m=k, n=k, &
     948         9138 :                                             sym=dbcsr_type_no_symmetry)
     949              : 
     950         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_cosp_b)
     951              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_cosp_b, template=matrix_s, m=k, n=k, &
     952         9138 :                                             sym=dbcsr_type_no_symmetry)
     953              : 
     954         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf1)
     955              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf1, template=matrix_s, m=k, n=k, &
     956         9138 :                                             sym=dbcsr_type_no_symmetry)
     957              : 
     958         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf2)
     959              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf2, template=matrix_s, m=k, n=k, &
     960         9138 :                                             sym=dbcsr_type_no_symmetry)
     961              : 
     962         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf3)
     963              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf3, template=matrix_s, m=k, n=k, &
     964         9138 :                                             sym=dbcsr_type_no_symmetry)
     965              : 
     966         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf4)
     967              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf4, template=matrix_s, m=k, n=k, &
     968         9138 :                                             sym=dbcsr_type_no_symmetry)
     969              : 
     970         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_os)
     971              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_os, template=matrix_s, m=my_ortho_k, n=my_ortho_k, &
     972         9138 :                                             sym=dbcsr_type_no_symmetry)
     973              : 
     974         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf1_ortho)
     975              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf1_ortho, template=matrix_s, m=my_ortho_k, n=k, &
     976         9138 :                                             sym=dbcsr_type_no_symmetry)
     977              : 
     978         9138 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf2_ortho)
     979              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf2_ortho, template=matrix_s, m=my_ortho_k, n=k, &
     980         9138 :                                             sym=dbcsr_type_no_symmetry)
     981              : 
     982              :       CASE ("REF")
     983         1391 :          CALL dbcsr_init_p(qs_ot_env%buf1_k_k_nosym)
     984              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf1_k_k_nosym, template=matrix_s, m=k, n=k, &
     985         1391 :                                             sym=dbcsr_type_no_symmetry)
     986              : 
     987         1391 :          CALL dbcsr_init_p(qs_ot_env%buf2_k_k_nosym)
     988              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf2_k_k_nosym, template=matrix_s, m=k, n=k, &
     989         1391 :                                             sym=dbcsr_type_no_symmetry)
     990              : 
     991         1391 :          CALL dbcsr_init_p(qs_ot_env%buf3_k_k_nosym)
     992              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf3_k_k_nosym, template=matrix_s, m=k, n=k, &
     993         1391 :                                             sym=dbcsr_type_no_symmetry)
     994              : 
     995         1391 :          CALL dbcsr_init_p(qs_ot_env%buf4_k_k_nosym)
     996              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf4_k_k_nosym, template=matrix_s, m=k, n=k, &
     997         1391 :                                             sym=dbcsr_type_no_symmetry)
     998              : 
     999              :          ! It claims to be symmetric but to avoid dbcsr confusion nonsymmetric is kept
    1000         1391 :          CALL dbcsr_init_p(qs_ot_env%buf1_k_k_sym)
    1001              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf1_k_k_sym, template=matrix_s, m=k, n=k, &
    1002         1391 :                                             sym=dbcsr_type_no_symmetry)
    1003              : 
    1004         1391 :          CALL dbcsr_init_p(qs_ot_env%buf2_k_k_sym)
    1005              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf2_k_k_sym, template=matrix_s, m=k, n=k, &
    1006         1391 :                                             sym=dbcsr_type_no_symmetry)
    1007              : 
    1008         1391 :          CALL dbcsr_init_p(qs_ot_env%buf3_k_k_sym)
    1009              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf3_k_k_sym, template=matrix_s, m=k, n=k, &
    1010         1391 :                                             sym=dbcsr_type_no_symmetry)
    1011              :          !
    1012         1391 :          CALL dbcsr_init_p(qs_ot_env%buf4_k_k_sym)
    1013              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf4_k_k_sym, template=matrix_s, m=k, n=k, &
    1014         1391 :                                             sym=dbcsr_type_no_symmetry)
    1015              :          !
    1016         1391 :          CALL dbcsr_init_p(qs_ot_env%p_k_k_sym)
    1017              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%p_k_k_sym, template=matrix_s, m=k, n=k, &
    1018         1391 :                                             sym=dbcsr_type_no_symmetry)
    1019              :          !
    1020         1391 :          CALL dbcsr_init_p(qs_ot_env%buf1_n_k)
    1021              :          CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%buf1_n_k, template=matrix_s, n=k, &
    1022         1391 :                                                 sym=dbcsr_type_no_symmetry)
    1023              :          !
    1024         1391 :          CALL dbcsr_init_p(qs_ot_env%matrix_buf1)
    1025              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf1, template=matrix_s, m=k, n=k, &
    1026        11920 :                                             sym=dbcsr_type_no_symmetry)
    1027              : 
    1028              :       END SELECT
    1029              : 
    1030              :       IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
    1031        10529 :           qs_ot_env%settings%ot_method == "BROY" .OR. &
    1032              :           qs_ot_env%settings%ot_method == "LBFG") THEN
    1033         6353 :          NULLIFY (qs_ot_env%matrix_h_e)
    1034         6353 :          NULLIFY (qs_ot_env%matrix_h_x)
    1035         6353 :          NULLIFY (qs_ot_env%matrix_h_e_im)
    1036         6353 :          NULLIFY (qs_ot_env%matrix_h_x_im)
    1037         6353 :          ncoef = m_diis
    1038         6353 :          IF (qs_ot_env%settings%ot_method == "LBFG") ncoef = m_diis + 1
    1039         6353 :          CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_e, ncoef)
    1040         6353 :          CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_x, ncoef)
    1041        49660 :          DO i = 1, ncoef
    1042        43307 :             CALL dbcsr_init_p(qs_ot_env%matrix_h_x(i)%matrix)
    1043              :             CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_h_x(i)%matrix, template=matrix_s, n=k, &
    1044        43307 :                                                    sym=dbcsr_type_no_symmetry)
    1045              : 
    1046        43307 :             CALL dbcsr_init_p(qs_ot_env%matrix_h_e(i)%matrix)
    1047              :             CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_h_e(i)%matrix, template=matrix_s, n=k, &
    1048        53836 :                                                    sym=dbcsr_type_no_symmetry)
    1049              :          END DO
    1050              :       END IF
    1051              : 
    1052        10529 :       NULLIFY (qs_ot_env%rot_mat_u, qs_ot_env%rot_mat_u_im, &
    1053        10529 :                qs_ot_env%rot_mat_x, qs_ot_env%rot_mat_x_im, &
    1054        10529 :                qs_ot_env%rot_mat_h_e, qs_ot_env%rot_mat_h_x, &
    1055        10529 :                qs_ot_env%rot_mat_h_e_im, qs_ot_env%rot_mat_h_x_im, qs_ot_env%rot_mat_gx, &
    1056        10529 :                qs_ot_env%rot_mat_gx_im, qs_ot_env%rot_mat_response_gx, &
    1057        10529 :                qs_ot_env%rot_mat_response_gx_im, qs_ot_env%rot_mat_mermin_g0, &
    1058        10529 :                qs_ot_env%rot_mat_mermin_g0_im, qs_ot_env%rot_mat_gx_old, &
    1059        10529 :                qs_ot_env%rot_mat_gx_old_im, qs_ot_env%rot_mat_dx, qs_ot_env%rot_mat_dx_im, &
    1060        10529 :                qs_ot_env%rot_mat_evals, qs_ot_env%rot_mat_dedu, qs_ot_env%rot_mat_dedu_im, &
    1061        10529 :                qs_ot_env%rot_mat_chc, qs_ot_env%rot_mat_chc_im, &
    1062        10529 :                qs_ot_env%rot_mat_evec_re, qs_ot_env%rot_mat_evec_im)
    1063              : 
    1064        10529 :       IF (qs_ot_env%settings%do_rotation) THEN
    1065          369 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_u)
    1066              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_u, template=matrix_s, m=k, n=k, &
    1067          369 :                                             sym=dbcsr_type_no_symmetry)
    1068              : 
    1069          369 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_x)
    1070              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_x, template=matrix_s, m=k, n=k, &
    1071          369 :                                             sym=dbcsr_type_no_symmetry)
    1072              : 
    1073          369 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_dedu)
    1074              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_dedu, template=matrix_s, m=k, n=k, &
    1075          369 :                                             sym=dbcsr_type_no_symmetry)
    1076              : 
    1077          369 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_chc)
    1078              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_chc, template=matrix_s, m=k, n=k, &
    1079          369 :                                             sym=dbcsr_type_no_symmetry)
    1080              : 
    1081              :          IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
    1082          369 :              qs_ot_env%settings%ot_method == "BROY" .OR. &
    1083              :              qs_ot_env%settings%ot_method == "LBFG") THEN
    1084          132 :             ncoef = m_diis
    1085          132 :             IF (qs_ot_env%settings%ot_method == "LBFG") ncoef = m_diis + 1
    1086          132 :             CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_e, ncoef)
    1087          132 :             CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_x, ncoef)
    1088         1006 :             DO i = 1, ncoef
    1089          874 :                CALL dbcsr_init_p(qs_ot_env%rot_mat_h_e(i)%matrix)
    1090              :                CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_h_e(i)%matrix, template=matrix_s, m=k, n=k, &
    1091          874 :                                                   sym=dbcsr_type_no_symmetry)
    1092              : 
    1093          874 :                CALL dbcsr_init_p(qs_ot_env%rot_mat_h_x(i)%matrix)
    1094              :                CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_h_x(i)%matrix, template=matrix_s, m=k, n=k, &
    1095         1243 :                                                   sym=dbcsr_type_no_symmetry)
    1096              :             END DO
    1097              :          END IF
    1098              : 
    1099         1103 :          ALLOCATE (qs_ot_env%rot_mat_evals(k))
    1100          369 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_evec_re)
    1101              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_evec_re, template=matrix_s, m=k, n=k, &
    1102          369 :                                             sym=dbcsr_type_no_symmetry)
    1103          369 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_evec_im)
    1104              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_evec_im, template=matrix_s, m=k, n=k, &
    1105          369 :                                             sym=dbcsr_type_no_symmetry)
    1106              : 
    1107          369 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_gx)
    1108              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_gx, template=matrix_s, m=k, n=k, &
    1109          369 :                                             sym=dbcsr_type_no_symmetry)
    1110              : 
    1111          369 :          IF (qs_ot_env%settings%occupation_preconditioner) THEN
    1112           92 :             CALL dbcsr_init_p(qs_ot_env%rot_mat_response_gx)
    1113              :             CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_response_gx, &
    1114              :                                                template=matrix_s, m=k, n=k, &
    1115           92 :                                                sym=dbcsr_type_no_symmetry)
    1116              :          END IF
    1117              : 
    1118          369 :          IF (qs_ot_env%use_gx_old) THEN
    1119          295 :             CALL dbcsr_init_p(qs_ot_env%rot_mat_gx_old)
    1120              :             CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_gx_old, template=matrix_s, m=k, n=k, &
    1121          295 :                                                sym=dbcsr_type_no_symmetry)
    1122              :          END IF
    1123              : 
    1124          369 :          IF (qs_ot_env%use_dx) THEN
    1125          295 :             CALL dbcsr_init_p(qs_ot_env%rot_mat_dx)
    1126              :             CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_dx, template=matrix_s, m=k, n=k, &
    1127          295 :                                                sym=dbcsr_type_no_symmetry)
    1128              :          END IF
    1129              : 
    1130              :       END IF
    1131              : 
    1132        10529 :       IF (qs_ot_env%settings%do_ener) THEN
    1133              :          ncoef = my_energy_dimension
    1134          348 :          ALLOCATE (qs_ot_env%ener_x(ncoef))
    1135          232 :          ALLOCATE (qs_ot_env%ener_rayleigh(ncoef))
    1136              : 
    1137              :          IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
    1138          116 :              qs_ot_env%settings%ot_method == "BROY" .OR. &
    1139              :              qs_ot_env%settings%ot_method == "LBFG") THEN
    1140           62 :             nhistory = m_diis
    1141           62 :             IF (qs_ot_env%settings%ot_method == "LBFG") nhistory = m_diis + 1
    1142          248 :             ALLOCATE (qs_ot_env%ener_h_e(nhistory, ncoef))
    1143          186 :             ALLOCATE (qs_ot_env%ener_h_x(nhistory, ncoef))
    1144         4574 :             qs_ot_env%ener_h_e = 0.0_dp
    1145         4574 :             qs_ot_env%ener_h_x = 0.0_dp
    1146              :          END IF
    1147              : 
    1148          232 :          ALLOCATE (qs_ot_env%ener_gx(ncoef))
    1149          116 :          IF (qs_ot_env%settings%occupation_preconditioner) THEN
    1150          184 :             ALLOCATE (qs_ot_env%ener_preconditioned_gx(ncoef))
    1151          184 :             ALLOCATE (qs_ot_env%ener_response_gx(ncoef))
    1152              :          END IF
    1153              : 
    1154          116 :          IF (qs_ot_env%use_gx_old) THEN
    1155          152 :             ALLOCATE (qs_ot_env%ener_gx_old(ncoef))
    1156              :          END IF
    1157              : 
    1158          116 :          IF (qs_ot_env%use_dx) THEN
    1159          152 :             ALLOCATE (qs_ot_env%ener_dx(ncoef))
    1160          686 :             qs_ot_env%ener_dx = 0.0_dp
    1161              :          END IF
    1162              :       END IF
    1163              : 
    1164        10529 :       qs_ot_env%state_allocated = .TRUE.
    1165              : 
    1166        10529 :    END SUBROUTINE qs_ot_allocate
    1167              : 
    1168              : ! **************************************************************************************************
    1169              : !> \brief ...
    1170              : !> \param qs_ot_env ...
    1171              : !> \param matrix_s ...
    1172              : ! **************************************************************************************************
    1173         2295 :    SUBROUTINE qs_ot_allocate_complex_state(qs_ot_env, matrix_s)
    1174              :       TYPE(qs_ot_type)                                   :: qs_ot_env
    1175              :       TYPE(dbcsr_type), POINTER                          :: matrix_s
    1176              : 
    1177              :       INTEGER                                            :: i, ncoef, nmo, nmo_ortho
    1178              : 
    1179          765 :       CPASSERT(qs_ot_env%state_allocated)
    1180          765 :       CPASSERT(.NOT. qs_ot_env%has_complex_kpoint_state)
    1181          765 :       CPASSERT(ASSOCIATED(matrix_s))
    1182              : 
    1183          765 :       CALL dbcsr_get_info(qs_ot_env%matrix_c0, nfullcols_total=nmo)
    1184          765 :       CALL dbcsr_get_info(qs_ot_env%matrix_sc0, nfullcols_total=nmo_ortho)
    1185              : 
    1186          765 :       CALL dbcsr_init_p(qs_ot_env%matrix_c0_im)
    1187              :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_c0_im, template=matrix_s, n=nmo, &
    1188          765 :                                              sym=dbcsr_type_no_symmetry)
    1189          765 :       CALL dbcsr_init_p(qs_ot_env%matrix_sc0_im)
    1190              :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_sc0_im, template=matrix_s, n=nmo_ortho, &
    1191          765 :                                              sym=dbcsr_type_no_symmetry)
    1192          765 :       CALL dbcsr_init_p(qs_ot_env%matrix_x_im)
    1193              :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_x_im, template=matrix_s, n=nmo, &
    1194          765 :                                              sym=dbcsr_type_no_symmetry)
    1195          765 :       CALL dbcsr_init_p(qs_ot_env%matrix_sx_im)
    1196              :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_sx_im, template=matrix_s, n=nmo, &
    1197          765 :                                              sym=dbcsr_type_no_symmetry)
    1198          765 :       CALL dbcsr_init_p(qs_ot_env%matrix_gx_im)
    1199              :       CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_gx_im, template=matrix_s, n=nmo, &
    1200          765 :                                              sym=dbcsr_type_no_symmetry)
    1201          765 :       IF (qs_ot_env%settings%occupation_preconditioner) THEN
    1202           92 :          CALL dbcsr_init_p(qs_ot_env%matrix_preconditioned_gx_im)
    1203              :          CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_preconditioned_gx_im, &
    1204              :                                                 template=matrix_s, n=nmo, &
    1205           92 :                                                 sym=dbcsr_type_no_symmetry)
    1206           92 :          IF (qs_ot_env%use_dx) THEN
    1207           68 :             CALL dbcsr_init_p(qs_ot_env%matrix_response_gx)
    1208              :             CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_response_gx, &
    1209              :                                                    template=matrix_s, n=nmo, &
    1210           68 :                                                    sym=dbcsr_type_no_symmetry)
    1211           68 :             CALL dbcsr_init_p(qs_ot_env%matrix_response_gx_im)
    1212              :             CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_response_gx_im, &
    1213              :                                                    template=matrix_s, n=nmo, &
    1214           68 :                                                    sym=dbcsr_type_no_symmetry)
    1215           68 :             CALL dbcsr_init_p(qs_ot_env%matrix_mermin_g0)
    1216              :             CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_mermin_g0, &
    1217              :                                                    template=matrix_s, n=nmo, &
    1218           68 :                                                    sym=dbcsr_type_no_symmetry)
    1219           68 :             CALL dbcsr_init_p(qs_ot_env%matrix_mermin_g0_im)
    1220              :             CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_mermin_g0_im, &
    1221              :                                                    template=matrix_s, n=nmo, &
    1222           68 :                                                    sym=dbcsr_type_no_symmetry)
    1223           68 :             IF (qs_ot_env%settings%do_ener) THEN
    1224           68 :                CPASSERT(ASSOCIATED(qs_ot_env%ener_x))
    1225          204 :                ALLOCATE (qs_ot_env%ener_mermin_g0(SIZE(qs_ot_env%ener_x)))
    1226              :             END IF
    1227              :          END IF
    1228              :       END IF
    1229          508 :       SELECT CASE (qs_ot_env%settings%ot_algorithm)
    1230              :       CASE ("TOD")
    1231          508 :          CPASSERT(nmo_ortho == nmo)
    1232          508 :          CALL allocate_complex_copy(qs_ot_env%matrix_p_im, qs_ot_env%matrix_p, "matrix_p_im")
    1233          508 :          CALL allocate_complex_copy(qs_ot_env%matrix_r_im, qs_ot_env%matrix_r, "matrix_r_im")
    1234          508 :          CALL allocate_complex_copy(qs_ot_env%matrix_sinp_im, qs_ot_env%matrix_sinp, "matrix_sinp_im")
    1235          508 :          CALL allocate_complex_copy(qs_ot_env%matrix_cosp_im, qs_ot_env%matrix_cosp, "matrix_cosp_im")
    1236          508 :          CALL allocate_complex_copy(qs_ot_env%matrix_buf1_im, qs_ot_env%matrix_buf1, "matrix_buf1_im")
    1237          508 :          CALL allocate_complex_copy(qs_ot_env%matrix_buf2_im, qs_ot_env%matrix_buf2, "matrix_buf2_im")
    1238          508 :          CALL allocate_complex_copy(qs_ot_env%matrix_buf3_im, qs_ot_env%matrix_buf3, "matrix_buf3_im")
    1239          508 :          CALL allocate_complex_copy(qs_ot_env%matrix_buf4_im, qs_ot_env%matrix_buf4, "matrix_buf4_im")
    1240          508 :          CALL allocate_complex_copy(qs_ot_env%matrix_os_im, qs_ot_env%matrix_os, "matrix_os_im")
    1241              :          CALL allocate_complex_copy(qs_ot_env%matrix_buf1_ortho_im, qs_ot_env%matrix_buf1_ortho, &
    1242          508 :                                     "matrix_buf1_ortho_im")
    1243              :          CALL allocate_complex_copy(qs_ot_env%matrix_buf2_ortho_im, qs_ot_env%matrix_buf2_ortho, &
    1244          508 :                                     "matrix_buf2_ortho_im")
    1245              :          CALL allocate_complex_copy(qs_ot_env%matrix_tmp_ortho, qs_ot_env%matrix_buf1_ortho, &
    1246          508 :                                     "matrix_tmp_ortho")
    1247          508 :          CALL allocate_complex_copy(qs_ot_env%matrix_buf_nk, qs_ot_env%matrix_x, "matrix_buf_nk")
    1248          508 :          CALL allocate_complex_copy(qs_ot_env%matrix_buf_nk_im, qs_ot_env%matrix_x, "matrix_buf_nk_im")
    1249          508 :          CALL allocate_complex_copy(qs_ot_env%matrix_tmp_nk, qs_ot_env%matrix_x, "matrix_tmp_nk")
    1250              :       CASE ("REF")
    1251          257 :          CALL dbcsr_init_p(qs_ot_env%matrix_ref_inv_sqrt)
    1252              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_ref_inv_sqrt, template=matrix_s, m=nmo, n=nmo, &
    1253          257 :                                             sym=dbcsr_type_no_symmetry)
    1254          257 :          CALL dbcsr_init_p(qs_ot_env%matrix_ref_inv_sqrt_im)
    1255              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_ref_inv_sqrt_im, template=matrix_s, m=nmo, n=nmo, &
    1256          257 :                                             sym=dbcsr_type_no_symmetry)
    1257          257 :          CALL dbcsr_init_p(qs_ot_env%buf1_n_k_dp)
    1258              :          CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%buf1_n_k_dp, template=matrix_s, n=nmo, &
    1259          257 :                                                 sym=dbcsr_type_no_symmetry)
    1260              :       CASE DEFAULT
    1261          765 :          CPABORT("Complex K-point OT state requires ALGORITHM STRICT or IRAC")
    1262              :       END SELECT
    1263          765 :       IF (qs_ot_env%use_dx) THEN
    1264          309 :          CALL dbcsr_init_p(qs_ot_env%matrix_dx_im)
    1265              :          CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_dx_im, template=matrix_s, n=nmo, &
    1266          309 :                                                 sym=dbcsr_type_no_symmetry)
    1267              :       END IF
    1268          765 :       IF (qs_ot_env%use_gx_old) THEN
    1269          309 :          CALL dbcsr_init_p(qs_ot_env%matrix_gx_old_im)
    1270              :          CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_gx_old_im, template=matrix_s, n=nmo, &
    1271          309 :                                                 sym=dbcsr_type_no_symmetry)
    1272              :       END IF
    1273              :       IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
    1274          765 :           qs_ot_env%settings%ot_method == "BROY" .OR. &
    1275              :           qs_ot_env%settings%ot_method == "LBFG") THEN
    1276          602 :          ncoef = qs_ot_env%settings%diis_m
    1277          602 :          IF (qs_ot_env%settings%ot_method == "LBFG") ncoef = ncoef + 1
    1278          602 :          CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_e_im, ncoef)
    1279          602 :          CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_x_im, ncoef)
    1280         4742 :          DO i = 1, ncoef
    1281         4140 :             CALL dbcsr_init_p(qs_ot_env%matrix_h_e_im(i)%matrix)
    1282              :             CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_h_e_im(i)%matrix, &
    1283              :                                                    template=matrix_s, n=nmo, &
    1284         4140 :                                                    sym=dbcsr_type_no_symmetry)
    1285         4140 :             CALL dbcsr_init_p(qs_ot_env%matrix_h_x_im(i)%matrix)
    1286              :             CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_h_x_im(i)%matrix, &
    1287              :                                                    template=matrix_s, n=nmo, &
    1288         4905 :                                                    sym=dbcsr_type_no_symmetry)
    1289              :          END DO
    1290              :       END IF
    1291              : 
    1292          765 :       IF (qs_ot_env%settings%do_rotation) THEN
    1293          163 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_u_im)
    1294              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_u_im, template=matrix_s, m=nmo, n=nmo, &
    1295          163 :                                             sym=dbcsr_type_no_symmetry)
    1296          163 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_x_im)
    1297              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_x_im, template=matrix_s, m=nmo, n=nmo, &
    1298          163 :                                             sym=dbcsr_type_no_symmetry)
    1299          163 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_dedu_im)
    1300              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_dedu_im, template=matrix_s, m=nmo, n=nmo, &
    1301          163 :                                             sym=dbcsr_type_no_symmetry)
    1302          163 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_chc_im)
    1303              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_chc_im, template=matrix_s, m=nmo, n=nmo, &
    1304          163 :                                             sym=dbcsr_type_no_symmetry)
    1305          163 :          CALL dbcsr_init_p(qs_ot_env%rot_mat_gx_im)
    1306              :          CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_gx_im, template=matrix_s, m=nmo, n=nmo, &
    1307          163 :                                             sym=dbcsr_type_no_symmetry)
    1308          163 :          IF (qs_ot_env%settings%occupation_preconditioner) THEN
    1309           92 :             CALL dbcsr_init_p(qs_ot_env%rot_mat_response_gx_im)
    1310              :             CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_response_gx_im, &
    1311              :                                                template=matrix_s, m=nmo, n=nmo, &
    1312           92 :                                                sym=dbcsr_type_no_symmetry)
    1313           92 :             IF (qs_ot_env%use_dx) THEN
    1314           68 :                CALL dbcsr_init_p(qs_ot_env%rot_mat_mermin_g0)
    1315              :                CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_mermin_g0, &
    1316              :                                                   template=matrix_s, m=nmo, n=nmo, &
    1317           68 :                                                   sym=dbcsr_type_no_symmetry)
    1318           68 :                CALL dbcsr_init_p(qs_ot_env%rot_mat_mermin_g0_im)
    1319              :                CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_mermin_g0_im, &
    1320              :                                                   template=matrix_s, m=nmo, n=nmo, &
    1321           68 :                                                   sym=dbcsr_type_no_symmetry)
    1322              :             END IF
    1323              :          END IF
    1324          163 :          IF (qs_ot_env%use_dx) THEN
    1325          115 :             CALL dbcsr_init_p(qs_ot_env%rot_mat_dx_im)
    1326              :             CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_dx_im, template=matrix_s, m=nmo, n=nmo, &
    1327          115 :                                                sym=dbcsr_type_no_symmetry)
    1328              :          END IF
    1329          163 :          IF (qs_ot_env%use_gx_old) THEN
    1330          115 :             CALL dbcsr_init_p(qs_ot_env%rot_mat_gx_old_im)
    1331              :             CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_gx_old_im, template=matrix_s, m=nmo, n=nmo, &
    1332          115 :                                                sym=dbcsr_type_no_symmetry)
    1333              :          END IF
    1334              :          IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
    1335          163 :              qs_ot_env%settings%ot_method == "BROY" .OR. &
    1336              :              qs_ot_env%settings%ot_method == "LBFG") THEN
    1337          106 :             ncoef = qs_ot_env%settings%diis_m
    1338          106 :             IF (qs_ot_env%settings%ot_method == "LBFG") ncoef = ncoef + 1
    1339          106 :             CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_e_im, ncoef)
    1340          106 :             CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_x_im, ncoef)
    1341          798 :             DO i = 1, ncoef
    1342          692 :                CALL dbcsr_init_p(qs_ot_env%rot_mat_h_e_im(i)%matrix)
    1343              :                CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_h_e_im(i)%matrix, &
    1344              :                                                   template=matrix_s, m=nmo, n=nmo, &
    1345          692 :                                                   sym=dbcsr_type_no_symmetry)
    1346          692 :                CALL dbcsr_init_p(qs_ot_env%rot_mat_h_x_im(i)%matrix)
    1347              :                CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_h_x_im(i)%matrix, &
    1348              :                                                   template=matrix_s, m=nmo, n=nmo, &
    1349          855 :                                                   sym=dbcsr_type_no_symmetry)
    1350              :             END DO
    1351              :          END IF
    1352              :       END IF
    1353              : 
    1354          765 :       qs_ot_env%has_complex_kpoint_state = .TRUE.
    1355              : 
    1356              :    CONTAINS
    1357              : 
    1358              : ! **************************************************************************************************
    1359              : !> \brief allocate a zeroed matrix with the distribution and sparsity of a real companion
    1360              : !> \param matrix output matrix
    1361              : !> \param template real companion matrix
    1362              : !> \param name DBCSR matrix name
    1363              : ! **************************************************************************************************
    1364         7620 :       SUBROUTINE allocate_complex_copy(matrix, template, name)
    1365              :       TYPE(dbcsr_type), POINTER                          :: matrix, template
    1366              :       CHARACTER(LEN=*), INTENT(IN)                       :: name
    1367              : 
    1368         7620 :          CALL dbcsr_init_p(matrix)
    1369         7620 :          CALL dbcsr_copy(matrix, template, name=name)
    1370         7620 :          CALL dbcsr_set(matrix, 0.0_dp)
    1371         7620 :       END SUBROUTINE allocate_complex_copy
    1372              : 
    1373              :    END SUBROUTINE qs_ot_allocate_complex_state
    1374              : 
    1375              : ! **************************************************************************************************
    1376              : !> \brief deallocates data
    1377              : !> \param qs_ot_env ...
    1378              : ! **************************************************************************************************
    1379        10928 :    SUBROUTINE qs_ot_destroy(qs_ot_env)
    1380              :       TYPE(qs_ot_type)                                   :: qs_ot_env
    1381              : 
    1382              :       INTEGER                                            :: physical_spin
    1383              : 
    1384        10928 :       IF (.NOT. qs_ot_env%state_allocated) RETURN
    1385              : 
    1386        10529 :       CALL mp_para_env_release(qs_ot_env%para_env)
    1387        10529 :       CALL cp_blacs_env_release(qs_ot_env%blacs_env)
    1388              : 
    1389        10529 :       IF (ASSOCIATED(qs_ot_env%evals)) DEALLOCATE (qs_ot_env%evals)
    1390        10529 :       IF (ASSOCIATED(qs_ot_env%dum)) DEALLOCATE (qs_ot_env%dum)
    1391              : 
    1392        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_os)) CALL dbcsr_release_p(qs_ot_env%matrix_os)
    1393        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_os_im)) CALL dbcsr_release_p(qs_ot_env%matrix_os_im)
    1394        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_p)) CALL dbcsr_release_p(qs_ot_env%matrix_p)
    1395        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_p_im)) CALL dbcsr_release_p(qs_ot_env%matrix_p_im)
    1396        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_cosp)) CALL dbcsr_release_p(qs_ot_env%matrix_cosp)
    1397        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_cosp_im)) CALL dbcsr_release_p(qs_ot_env%matrix_cosp_im)
    1398        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_sinp)) CALL dbcsr_release_p(qs_ot_env%matrix_sinp)
    1399        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_sinp_im)) CALL dbcsr_release_p(qs_ot_env%matrix_sinp_im)
    1400        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_r)) CALL dbcsr_release_p(qs_ot_env%matrix_r)
    1401        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_r_im)) CALL dbcsr_release_p(qs_ot_env%matrix_r_im)
    1402        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_cosp_b)) CALL dbcsr_release_p(qs_ot_env%matrix_cosp_b)
    1403        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_sinp_b)) CALL dbcsr_release_p(qs_ot_env%matrix_sinp_b)
    1404        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf1)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1)
    1405        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf1_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1_im)
    1406        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf2)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2)
    1407        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf2_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2_im)
    1408        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf3)) CALL dbcsr_release_p(qs_ot_env%matrix_buf3)
    1409        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf3_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf3_im)
    1410        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf4)) CALL dbcsr_release_p(qs_ot_env%matrix_buf4)
    1411        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf4_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf4_im)
    1412        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf1_ortho)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1_ortho)
    1413        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf1_ortho_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1_ortho_im)
    1414        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf2_ortho)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2_ortho)
    1415        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf2_ortho_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2_ortho_im)
    1416        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_tmp_ortho)) CALL dbcsr_release_p(qs_ot_env%matrix_tmp_ortho)
    1417        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf_nk)) CALL dbcsr_release_p(qs_ot_env%matrix_buf_nk)
    1418        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_buf_nk_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf_nk_im)
    1419        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_tmp_nk)) CALL dbcsr_release_p(qs_ot_env%matrix_tmp_nk)
    1420        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_c0)) CALL dbcsr_release_p(qs_ot_env%matrix_c0)
    1421        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_sc0)) CALL dbcsr_release_p(qs_ot_env%matrix_sc0)
    1422        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_psc0)) CALL dbcsr_release_p(qs_ot_env%matrix_psc0)
    1423        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_psc0_im)) CALL dbcsr_release_p(qs_ot_env%matrix_psc0_im)
    1424        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_c0_im)) CALL dbcsr_release_p(qs_ot_env%matrix_c0_im)
    1425        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_sc0_im)) CALL dbcsr_release_p(qs_ot_env%matrix_sc0_im)
    1426        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_x)) CALL dbcsr_release_p(qs_ot_env%matrix_x)
    1427        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_sx)) CALL dbcsr_release_p(qs_ot_env%matrix_sx)
    1428        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_x_im)) CALL dbcsr_release_p(qs_ot_env%matrix_x_im)
    1429        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_sx_im)) CALL dbcsr_release_p(qs_ot_env%matrix_sx_im)
    1430        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_gx)) CALL dbcsr_release_p(qs_ot_env%matrix_gx)
    1431        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_gx_im)) CALL dbcsr_release_p(qs_ot_env%matrix_gx_im)
    1432        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_preconditioned_gx)) THEN
    1433           92 :          CALL dbcsr_release_p(qs_ot_env%matrix_preconditioned_gx)
    1434              :       END IF
    1435        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_preconditioned_gx_im)) THEN
    1436           92 :          CALL dbcsr_release_p(qs_ot_env%matrix_preconditioned_gx_im)
    1437              :       END IF
    1438        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_response_gx)) CALL dbcsr_release_p(qs_ot_env%matrix_response_gx)
    1439        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_response_gx_im)) THEN
    1440           68 :          CALL dbcsr_release_p(qs_ot_env%matrix_response_gx_im)
    1441              :       END IF
    1442        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_mermin_g0)) CALL dbcsr_release_p(qs_ot_env%matrix_mermin_g0)
    1443        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_mermin_g0_im)) THEN
    1444           68 :          CALL dbcsr_release_p(qs_ot_env%matrix_mermin_g0_im)
    1445              :       END IF
    1446        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_ref_inv_sqrt)) CALL dbcsr_release_p(qs_ot_env%matrix_ref_inv_sqrt)
    1447        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_ref_inv_sqrt_im)) CALL dbcsr_release_p(qs_ot_env%matrix_ref_inv_sqrt_im)
    1448        31587 :       DO physical_spin = 1, SIZE(qs_ot_env%mermin_physical)
    1449        21058 :          IF (ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%c0)) THEN
    1450          100 :             CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%c0)
    1451          100 :             DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%c0)
    1452              :          END IF
    1453        21058 :          IF (ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%c0_im)) THEN
    1454          100 :             CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%c0_im)
    1455          100 :             DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%c0_im)
    1456              :          END IF
    1457        21058 :          IF (ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%h0)) THEN
    1458          100 :             CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%h0)
    1459          100 :             DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%h0)
    1460              :          END IF
    1461        21058 :          IF (ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%h0_im)) THEN
    1462          100 :             CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%h0_im)
    1463          100 :             DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%h0_im)
    1464              :          END IF
    1465        21058 :          IF (ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%c_previous)) THEN
    1466           80 :             CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%c_previous)
    1467           80 :             DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%c_previous)
    1468              :          END IF
    1469        21058 :          IF (ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%c_previous_im)) THEN
    1470           80 :             CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%c_previous_im)
    1471           80 :             DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%c_previous_im)
    1472              :          END IF
    1473        21058 :          IF (ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%y_previous)) THEN
    1474           80 :             CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%y_previous)
    1475           80 :             DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%y_previous)
    1476              :          END IF
    1477        21058 :          IF (ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%y_previous_im)) THEN
    1478           80 :             CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%y_previous_im)
    1479           80 :             DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%y_previous_im)
    1480              :          END IF
    1481        21058 :          IF (ALLOCATED(qs_ot_env%mermin_physical(physical_spin)%occupation0)) THEN
    1482          100 :             DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%occupation0)
    1483              :          END IF
    1484        21058 :          IF (ALLOCATED(qs_ot_env%mermin_physical(physical_spin)%occupation_previous)) THEN
    1485           80 :             DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%occupation_previous)
    1486              :          END IF
    1487        21058 :          qs_ot_env%mermin_physical(physical_spin)%reference_valid = .FALSE.
    1488        31587 :          qs_ot_env%mermin_physical(physical_spin)%secant_valid = .FALSE.
    1489              :       END DO
    1490        10529 :       IF (ALLOCATED(qs_ot_env%ener_mermin_g0)) DEALLOCATE (qs_ot_env%ener_mermin_g0)
    1491        10529 :       qs_ot_env%mermin_gradient_ref_valid = .FALSE.
    1492        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_dx)) CALL dbcsr_release_p(qs_ot_env%matrix_dx)
    1493        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_dx_im)) CALL dbcsr_release_p(qs_ot_env%matrix_dx_im)
    1494        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_gx_old)) CALL dbcsr_release_p(qs_ot_env%matrix_gx_old)
    1495        10529 :       IF (ASSOCIATED(qs_ot_env%matrix_gx_old_im)) CALL dbcsr_release_p(qs_ot_env%matrix_gx_old_im)
    1496        10529 :       IF (ASSOCIATED(qs_ot_env%buf1_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf1_k_k_nosym)
    1497        10529 :       IF (ASSOCIATED(qs_ot_env%buf2_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf2_k_k_nosym)
    1498        10529 :       IF (ASSOCIATED(qs_ot_env%buf3_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf3_k_k_nosym)
    1499        10529 :       IF (ASSOCIATED(qs_ot_env%buf4_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf4_k_k_nosym)
    1500        10529 :       IF (ASSOCIATED(qs_ot_env%p_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%p_k_k_sym)
    1501        10529 :       IF (ASSOCIATED(qs_ot_env%buf1_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf1_k_k_sym)
    1502        10529 :       IF (ASSOCIATED(qs_ot_env%buf2_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf2_k_k_sym)
    1503        10529 :       IF (ASSOCIATED(qs_ot_env%buf3_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf3_k_k_sym)
    1504        10529 :       IF (ASSOCIATED(qs_ot_env%buf4_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf4_k_k_sym)
    1505        10529 :       IF (ASSOCIATED(qs_ot_env%buf1_n_k)) CALL dbcsr_release_p(qs_ot_env%buf1_n_k)
    1506        10529 :       IF (ASSOCIATED(qs_ot_env%buf1_n_k_dp)) CALL dbcsr_release_p(qs_ot_env%buf1_n_k_dp)
    1507              : 
    1508              :       IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
    1509        10529 :           qs_ot_env%settings%ot_method == "BROY" .OR. &
    1510              :           qs_ot_env%settings%ot_method == "LBFG") THEN
    1511         6353 :          CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_x)
    1512         6353 :          CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_e)
    1513         6353 :          IF (ASSOCIATED(qs_ot_env%matrix_h_x_im)) THEN
    1514          602 :             CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_x_im)
    1515              :          END IF
    1516         6353 :          IF (ASSOCIATED(qs_ot_env%matrix_h_e_im)) THEN
    1517          602 :             CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_e_im)
    1518              :          END IF
    1519              :       END IF
    1520        10529 :       IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
    1521              :           qs_ot_env%settings%ot_method == "BROY") THEN
    1522         6203 :          DEALLOCATE (qs_ot_env%ls_diis)
    1523         6203 :          DEALLOCATE (qs_ot_env%lss_diis)
    1524         6203 :          DEALLOCATE (qs_ot_env%c_diis)
    1525         6203 :          DEALLOCATE (qs_ot_env%c_broy)
    1526         6203 :          DEALLOCATE (qs_ot_env%energy_h)
    1527         6203 :          DEALLOCATE (qs_ot_env%ipivot)
    1528              :       END IF
    1529        10529 :       IF (qs_ot_env%settings%ot_method == "LBFG") THEN
    1530            0 :          DEALLOCATE (qs_ot_env%lbfgs_rho, qs_ot_env%lbfgs_yy, &
    1531          150 :                      qs_ot_env%lbfgs_sy_rotation, qs_ot_env%lbfgs_yy_rotation)
    1532              :       END IF
    1533              : 
    1534        10529 :       IF (qs_ot_env%settings%do_rotation) THEN
    1535              : 
    1536          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_u)) CALL dbcsr_release_p(qs_ot_env%rot_mat_u)
    1537          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_u_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_u_im)
    1538          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_x)) CALL dbcsr_release_p(qs_ot_env%rot_mat_x)
    1539          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_x_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_x_im)
    1540          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_dedu)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dedu)
    1541          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_dedu_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dedu_im)
    1542          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_chc)) CALL dbcsr_release_p(qs_ot_env%rot_mat_chc)
    1543          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_chc_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_chc_im)
    1544              : 
    1545              :          IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
    1546          369 :              qs_ot_env%settings%ot_method == "BROY" .OR. &
    1547              :              qs_ot_env%settings%ot_method == "LBFG") THEN
    1548          132 :             CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_x)
    1549          132 :             CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_e)
    1550          132 :             IF (ASSOCIATED(qs_ot_env%rot_mat_h_x_im)) THEN
    1551          106 :                CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_x_im)
    1552              :             END IF
    1553          132 :             IF (ASSOCIATED(qs_ot_env%rot_mat_h_e_im)) THEN
    1554          106 :                CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_e_im)
    1555              :             END IF
    1556              :          END IF
    1557              : 
    1558          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_evals)) DEALLOCATE (qs_ot_env%rot_mat_evals)
    1559          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_evec_re)) CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_re)
    1560          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_evec_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_im)
    1561          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_gx)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx)
    1562          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_gx_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_im)
    1563          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_response_gx)) THEN
    1564           92 :             CALL dbcsr_release_p(qs_ot_env%rot_mat_response_gx)
    1565              :          END IF
    1566          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_response_gx_im)) THEN
    1567           92 :             CALL dbcsr_release_p(qs_ot_env%rot_mat_response_gx_im)
    1568              :          END IF
    1569          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_mermin_g0)) THEN
    1570           68 :             CALL dbcsr_release_p(qs_ot_env%rot_mat_mermin_g0)
    1571              :          END IF
    1572          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_mermin_g0_im)) THEN
    1573           68 :             CALL dbcsr_release_p(qs_ot_env%rot_mat_mermin_g0_im)
    1574              :          END IF
    1575          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_gx_old)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_old)
    1576          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_gx_old_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_old_im)
    1577          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_dx)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dx)
    1578          369 :          IF (ASSOCIATED(qs_ot_env%rot_mat_dx_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dx_im)
    1579              :       END IF
    1580              : 
    1581        10529 :       IF (qs_ot_env%settings%do_ener) THEN
    1582          116 :          IF (ASSOCIATED(qs_ot_env%ener_x)) DEALLOCATE (qs_ot_env%ener_x)
    1583          116 :          IF (ASSOCIATED(qs_ot_env%ener_rayleigh)) DEALLOCATE (qs_ot_env%ener_rayleigh)
    1584          116 :          IF (ASSOCIATED(qs_ot_env%ener_gx)) DEALLOCATE (qs_ot_env%ener_gx)
    1585          116 :          IF (ASSOCIATED(qs_ot_env%ener_preconditioned_gx)) THEN
    1586           92 :             DEALLOCATE (qs_ot_env%ener_preconditioned_gx)
    1587              :          END IF
    1588          116 :          IF (ASSOCIATED(qs_ot_env%ener_response_gx)) DEALLOCATE (qs_ot_env%ener_response_gx)
    1589              :          IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
    1590          116 :              qs_ot_env%settings%ot_method == "BROY" .OR. &
    1591              :              qs_ot_env%settings%ot_method == "LBFG") THEN
    1592           62 :             IF (ASSOCIATED(qs_ot_env%ener_h_x)) DEALLOCATE (qs_ot_env%ener_h_x)
    1593           62 :             IF (ASSOCIATED(qs_ot_env%ener_h_e)) DEALLOCATE (qs_ot_env%ener_h_e)
    1594              :          END IF
    1595          116 :          IF (qs_ot_env%use_dx) THEN
    1596          116 :             IF (ASSOCIATED(qs_ot_env%ener_dx)) DEALLOCATE (qs_ot_env%ener_dx)
    1597              :          END IF
    1598          116 :          IF (qs_ot_env%use_gx_old) THEN
    1599           76 :             IF (ASSOCIATED(qs_ot_env%ener_gx_old)) DEALLOCATE (qs_ot_env%ener_gx_old)
    1600              :          END IF
    1601              :       END IF
    1602              : 
    1603        10529 :       qs_ot_env%state_allocated = .FALSE.
    1604        10529 :       qs_ot_env%has_complex_kpoint_state = .FALSE.
    1605              : 
    1606              :    END SUBROUTINE qs_ot_destroy
    1607              : 
    1608              : ! **************************************************************************************************
    1609              : !> \brief ...
    1610              : !> \param settings ...
    1611              : !> \param ot_section ...
    1612              : !> \param output_unit ...
    1613              : !> \param complex_kpoints whether defaults are for complex k-point OT
    1614              : !> \param eigensolver whether OT minimizes a fixed-H orbital subspace for DIAGONALIZATION
    1615              : ! **************************************************************************************************
    1616        62648 :    SUBROUTINE ot_readwrite_input(settings, ot_section, output_unit, complex_kpoints, eigensolver)
    1617              :       TYPE(qs_ot_settings_type)                          :: settings
    1618              :       TYPE(section_vals_type), POINTER                   :: ot_section
    1619              :       INTEGER, INTENT(IN)                                :: output_unit
    1620              :       LOGICAL, INTENT(IN), OPTIONAL                      :: complex_kpoints, eigensolver
    1621              : 
    1622              :       CHARACTER(len=*), PARAMETER :: routineN = 'ot_readwrite_input'
    1623              : 
    1624              :       INTEGER                                            :: handle, ls_method, ot_algorithm, &
    1625              :                                                             ot_method, ot_ortho_irac
    1626              :       LOGICAL                                            :: energy_gap_explicit, &
    1627              :                                                             lattice_fft_explicit, &
    1628              :                                                             low_rank_base_explicit, &
    1629              :                                                             use_complex_kpoints, use_eigensolver
    1630              : 
    1631         7831 :       CALL timeset(routineN, handle)
    1632              : 
    1633         7831 :       use_complex_kpoints = .FALSE.
    1634         7831 :       IF (PRESENT(complex_kpoints)) use_complex_kpoints = complex_kpoints
    1635         7831 :       use_eigensolver = .FALSE.
    1636         7831 :       IF (PRESENT(eigensolver)) use_eigensolver = eigensolver
    1637              : 
    1638              :       ! choose algorithm
    1639         7831 :       CALL section_vals_val_get(ot_section, "ALGORITHM", i_val=ot_algorithm)
    1640         7147 :       SELECT CASE (ot_algorithm)
    1641              :       CASE (ot_algo_taylor_or_diag)
    1642         7147 :          settings%ot_algorithm = "TOD"
    1643              :       CASE (ot_algo_irac)
    1644          684 :          CALL cite_reference(Weber2008)
    1645          684 :          settings%ot_algorithm = "REF"
    1646              :       CASE DEFAULT
    1647         7831 :          CPABORT("Value unknown")
    1648              :       END SELECT
    1649              : 
    1650              :       ! irac input
    1651         7831 :       CALL section_vals_val_get(ot_section, "IRAC_DEGREE", i_val=settings%irac_degree)
    1652         7831 :       IF (settings%irac_degree < 2 .OR. settings%irac_degree > 4) THEN
    1653            0 :          CPABORT("READ OT IRAC_DEGREE: Value unknown")
    1654              :       END IF
    1655         7831 :       CALL section_vals_val_get(ot_section, "MAX_IRAC", i_val=settings%max_irac)
    1656         7831 :       IF (settings%max_irac < 1) THEN
    1657            0 :          CPABORT("READ OT MAX_IRAC: VALUE MUST BE GREATER THAN ZERO")
    1658              :       END IF
    1659         7831 :       CALL section_vals_val_get(ot_section, "EPS_IRAC_FILTER_MATRIX", r_val=settings%eps_irac_filter_matrix)
    1660         7831 :       CALL section_vals_val_get(ot_section, "EPS_IRAC", r_val=settings%eps_irac)
    1661         7831 :       IF (settings%eps_irac < 0.0_dp) THEN
    1662            0 :          CPABORT("READ OT EPS_IRAC: VALUE MUST BE GREATER THAN ZERO")
    1663              :       END IF
    1664         7831 :       CALL section_vals_val_get(ot_section, "EPS_IRAC_QUICK_EXIT", r_val=settings%eps_irac_quick_exit)
    1665         7831 :       IF (settings%eps_irac_quick_exit < 0.0_dp) THEN
    1666            0 :          CPABORT("READ OT EPS_IRAC_QUICK_EXIT: VALUE MUST BE GREATER THAN ZERO")
    1667              :       END IF
    1668              : 
    1669         7831 :       CALL section_vals_val_get(ot_section, "EPS_IRAC_SWITCH", r_val=settings%eps_irac_switch)
    1670         7831 :       IF (settings%eps_irac_switch < 0.0_dp) THEN
    1671            0 :          CPABORT("READ OT EPS_IRAC_SWITCH: VALUE MUST BE GREATER THAN ZERO")
    1672              :       END IF
    1673              : 
    1674         7831 :       CALL section_vals_val_get(ot_section, "ORTHO_IRAC", i_val=ot_ortho_irac)
    1675         7745 :       SELECT CASE (ot_ortho_irac)
    1676              :       CASE (ot_chol_irac)
    1677         7745 :          settings%ortho_irac = "CHOL"
    1678              :       CASE (ot_poly_irac)
    1679           34 :          settings%ortho_irac = "POLY"
    1680              :       CASE (ot_lwdn_irac)
    1681           52 :          settings%ortho_irac = "LWDN"
    1682              :       CASE DEFAULT
    1683         7831 :          CPABORT("READ OT ORTHO_IRAC: Value unknown")
    1684              :       END SELECT
    1685              : 
    1686         7831 :       CALL section_vals_val_get(ot_section, "ON_THE_FLY_LOC", l_val=settings%on_the_fly_loc)
    1687              : 
    1688         7831 :       CALL section_vals_val_get(ot_section, "MINIMIZER", i_val=ot_method)
    1689              :       ! overwrite input if ot_state is set
    1690         7831 :       IF (settings%ot_state == 1) THEN
    1691            0 :          ot_method = ot_mini_diis
    1692              :       END IF
    1693              :       ! compatibility
    1694           12 :       SELECT CASE (ot_method)
    1695              :       CASE (ot_mini_sd)
    1696           12 :          settings%ot_method = "SD"
    1697              :       CASE (ot_mini_cg)
    1698         2474 :          settings%ot_method = "CG"
    1699              :       CASE (ot_mini_diis)
    1700         5287 :          settings%ot_method = "DIIS"
    1701         5287 :          CALL section_vals_val_get(ot_section, "N_HISTORY_VEC", i_val=settings%diis_m)
    1702              :       CASE (ot_mini_broyden)
    1703           16 :          CALL section_vals_val_get(ot_section, "N_HISTORY_VEC", i_val=settings%diis_m)
    1704           16 :          CALL section_vals_val_get(ot_section, "BROYDEN_BETA", r_val=settings%broyden_beta)
    1705           16 :          CALL section_vals_val_get(ot_section, "BROYDEN_GAMMA", r_val=settings%broyden_gamma)
    1706           16 :          CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA", r_val=settings%broyden_sigma)
    1707           16 :          CALL section_vals_val_get(ot_section, "BROYDEN_ETA", r_val=settings%broyden_eta)
    1708           16 :          CALL section_vals_val_get(ot_section, "BROYDEN_OMEGA", r_val=settings%broyden_omega)
    1709           16 :          CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA_DECREASE", r_val=settings%broyden_sigma_decrease)
    1710           16 :          CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA_MIN", r_val=settings%broyden_sigma_min)
    1711           16 :          CALL section_vals_val_get(ot_section, "BROYDEN_FORGET_HISTORY", l_val=settings%broyden_forget_history)
    1712           16 :          CALL section_vals_val_get(ot_section, "BROYDEN_ADAPTIVE_SIGMA", l_val=settings%broyden_adaptive_sigma)
    1713           16 :          CALL section_vals_val_get(ot_section, "BROYDEN_ENABLE_FLIP", l_val=settings%broyden_enable_flip)
    1714           16 :          settings%ot_method = "BROY"
    1715              :       CASE (ot_mini_lbfgs)
    1716           42 :          CALL section_vals_val_get(ot_section, "N_HISTORY_VEC", i_val=settings%diis_m)
    1717              :          CALL section_vals_val_get(ot_section, "LBFGS_CURVATURE_TOL", &
    1718           42 :                                    r_val=settings%lbfgs_curvature_tol)
    1719              :          CALL section_vals_val_get(ot_section, "LBFGS_DAMPING", &
    1720           42 :                                    l_val=settings%lbfgs_damping)
    1721           42 :          IF (settings%lbfgs_curvature_tol < 0.0_dp .OR. &
    1722              :              settings%lbfgs_curvature_tol >= 1.0_dp) THEN
    1723            0 :             CPABORT("READ OT LBFGS_CURVATURE_TOL: Value must be in [0, 1)")
    1724              :          END IF
    1725           42 :          settings%ot_method = "LBFG"
    1726              :       CASE DEFAULT
    1727         7831 :          CPABORT("READ OTSCF MINIMIZER: Value unknown")
    1728              :       END SELECT
    1729         7831 :       CALL section_vals_val_get(ot_section, "SAFER_DIIS", l_val=settings%safer_diis)
    1730         7831 :       CALL section_vals_val_get(ot_section, "LINESEARCH", i_val=ls_method)
    1731            2 :       SELECT CASE (ls_method)
    1732              :       CASE (ls_none)
    1733            2 :          settings%line_search_method = "NONE"
    1734              :       CASE (ls_2pnt)
    1735         7701 :          settings%line_search_method = "2PNT"
    1736              :       CASE (ls_3pnt)
    1737           40 :          settings%line_search_method = "3PNT"
    1738              :       CASE (ls_adapt)
    1739           76 :          settings%line_search_method = "ADPT"
    1740              :       CASE (ls_gold)
    1741           12 :          settings%line_search_method = "GOLD"
    1742           12 :          CALL section_vals_val_get(ot_section, "GOLD_TARGET", r_val=settings%gold_target)
    1743              :       CASE DEFAULT
    1744         7831 :          CPABORT("READ OTSCF LS: Value unknown")
    1745              :       END SELECT
    1746              : 
    1747         7831 :       CALL section_vals_val_get(ot_section, "PRECOND_SOLVER", i_val=settings%precond_solver_type)
    1748        15640 :       SELECT CASE (settings%precond_solver_type)
    1749              :       CASE (ot_precond_solver_default)
    1750         7809 :          settings%precond_solver_name = "DEFAULT"
    1751              :       CASE (ot_precond_solver_inv_chol)
    1752           16 :          settings%precond_solver_name = "INVERSE_CHOLESKY"
    1753              :       CASE (ot_precond_solver_direct)
    1754            0 :          settings%precond_solver_name = "DIRECT"
    1755              :       CASE (ot_precond_solver_update)
    1756            6 :          settings%precond_solver_name = "INVERSE_UPDATE"
    1757              :       CASE (ot_precond_solver_chebyshev)
    1758            0 :          settings%precond_solver_name = "CHEBYSHEV"
    1759              :       CASE DEFAULT
    1760         7831 :          CPABORT("READ OTSCF SOLVER: Value unknown")
    1761              :       END SELECT
    1762         7831 :       CALL section_vals_val_get(ot_section, "CHEBYSHEV_DEGREE", i_val=settings%chebyshev_degree)
    1763         7831 :       IF (settings%chebyshev_degree < 1 .OR. settings%chebyshev_degree > 100) THEN
    1764            0 :          CPABORT("READ OT CHEBYSHEV_DEGREE: Value must be between 1 and 100")
    1765              :       END IF
    1766              :       CALL section_vals_val_get(ot_section, "FERMI_LOW_RANK_MAX_RANK", &
    1767         7831 :                                 i_val=settings%fermi_low_rank_max_rank)
    1768         7831 :       IF (settings%fermi_low_rank_max_rank == 0 .OR. &
    1769              :           settings%fermi_low_rank_max_rank < -1) THEN
    1770            0 :          CPABORT("READ OT FERMI_LOW_RANK_MAX_RANK: Value must be -1 or a positive integer")
    1771              :       END IF
    1772              : 
    1773         7831 :       CALL section_vals_val_get(ot_section, "MAX_SCF_DIIS", i_val=settings%max_scf_diis)
    1774              : 
    1775              :       !If these values are negative we will set them "optimal" for a given precondtioner below
    1776         7831 :       CALL section_vals_val_get(ot_section, "STEPSIZE", r_val=settings%ds_min)
    1777              :       CALL section_vals_val_get(ot_section, "ENERGY_GAP", r_val=settings%energy_gap, &
    1778         7831 :                                 explicit=energy_gap_explicit)
    1779              : 
    1780         7831 :       CALL section_vals_val_get(ot_section, "PRECONDITIONER", i_val=settings%preconditioner_type)
    1781         8557 :       SELECT CASE (settings%preconditioner_type)
    1782              :       CASE (ot_precond_none)
    1783          726 :          settings%preconditioner_name = "NONE"
    1784          726 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
    1785          726 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
    1786              :       CASE (ot_precond_full_single)
    1787           34 :          settings%preconditioner_name = "FULL_SINGLE"
    1788           34 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
    1789           34 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
    1790              :       CASE (ot_precond_full_single_inverse)
    1791         3014 :          settings%preconditioner_name = "FULL_SINGLE_INVERSE"
    1792         3014 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.08_dp
    1793         3014 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
    1794              :       CASE (ot_precond_full_all)
    1795         2612 :          settings%preconditioner_name = "FULL_ALL"
    1796         2612 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
    1797         2612 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
    1798              :       CASE (ot_precond_fermi_low_rank)
    1799            6 :          settings%preconditioner_name = "FERMI_LOW_RANK"
    1800            6 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.12_dp
    1801            6 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
    1802              :       CASE (ot_precond_full_all_covariant)
    1803           12 :          settings%preconditioner_name = "FULL_ALL_COVARIANT"
    1804           12 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
    1805           12 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
    1806              :       CASE (ot_precond_full_kinetic)
    1807         1373 :          settings%preconditioner_name = "FULL_KINETIC"
    1808         1373 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
    1809         1373 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
    1810              :       CASE (ot_precond_s_inverse)
    1811           54 :          settings%preconditioner_name = "FULL_S_INVERSE"
    1812           54 :          IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
    1813           54 :          IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
    1814              :       CASE DEFAULT
    1815         7831 :          CPABORT("READ OTSCF PRECONDITIONER: Value unknown")
    1816              :       END SELECT
    1817              :       IF (use_complex_kpoints .AND. &
    1818         7831 :           settings%preconditioner_type == ot_precond_full_single_inverse .AND. &
    1819            2 :           .NOT. energy_gap_explicit) settings%energy_gap = 0.20_dp
    1820              :       CALL section_vals_val_get(ot_section, "FERMI_LOW_RANK_BASE", &
    1821         7831 :                                 i_val=settings%low_rank_base, explicit=low_rank_base_explicit)
    1822        15662 :       SELECT CASE (settings%low_rank_base)
    1823              :       CASE (ot_low_rank_base_overlap)
    1824         7831 :          settings%low_rank_base_name = "OVERLAP_INVERSE"
    1825              :       CASE (ot_low_rank_base_lattice_fft)
    1826            0 :          settings%low_rank_base_name = "LATTICE_FFT"
    1827              :       CASE DEFAULT
    1828         7831 :          CPABORT("READ OT FERMI_LOW_RANK_BASE: Value unknown")
    1829              :       END SELECT
    1830              :       CALL section_vals_val_get(ot_section, "LATTICE_FFT", &
    1831         7831 :                                 i_val=settings%lattice_fft, explicit=lattice_fft_explicit)
    1832        15658 :       SELECT CASE (settings%lattice_fft)
    1833              :       CASE (ot_lattice_fft_off)
    1834         7827 :          settings%lattice_fft_name = "OFF"
    1835              :       CASE (ot_lattice_fft_on)
    1836            4 :          settings%lattice_fft_name = "ON"
    1837              :       CASE (ot_lattice_fft_auto)
    1838            0 :          settings%lattice_fft_name = "AUTO"
    1839              :       CASE DEFAULT
    1840         7831 :          CPABORT("READ OT LATTICE_FFT: Value unknown")
    1841              :       END SELECT
    1842              :       CALL section_vals_val_get(ot_section, "LATTICE_FFT_LOCAL_CELLS", &
    1843         7831 :                                 i_val=settings%lattice_fft_local_cells)
    1844         7831 :       IF (settings%lattice_fft_local_cells < 0) THEN
    1845            0 :          CPABORT("READ OT LATTICE_FFT_LOCAL_CELLS: Value must not be negative")
    1846              :       END IF
    1847         7831 :       IF (settings%low_rank_base == ot_low_rank_base_lattice_fft) THEN
    1848            0 :          IF (settings%preconditioner_type /= ot_precond_fermi_low_rank) THEN
    1849            0 :             CPABORT("FERMI_LOW_RANK_BASE LATTICE_FFT requires PRECONDITIONER FERMI_LOW_RANK")
    1850              :          END IF
    1851            0 :          IF (lattice_fft_explicit .AND. settings%lattice_fft /= ot_lattice_fft_on) THEN
    1852            0 :             CPABORT("FERMI_LOW_RANK_BASE LATTICE_FFT conflicts with LATTICE_FFT OFF or AUTO")
    1853              :          END IF
    1854            0 :          settings%lattice_fft = ot_lattice_fft_on
    1855            0 :          settings%lattice_fft_name = "ON"
    1856         7831 :       ELSE IF (low_rank_base_explicit) THEN
    1857            0 :          IF (settings%preconditioner_type /= ot_precond_fermi_low_rank) THEN
    1858            0 :             CPWARN("FERMI_LOW_RANK_BASE is ignored unless PRECONDITIONER FERMI_LOW_RANK is selected")
    1859            0 :          ELSE IF (lattice_fft_explicit .AND. settings%lattice_fft /= ot_lattice_fft_off) THEN
    1860            0 :             CPABORT("FERMI_LOW_RANK_BASE OVERLAP_INVERSE conflicts with LATTICE_FFT ON or AUTO")
    1861              :          END IF
    1862              :       END IF
    1863         7831 :       IF (settings%lattice_fft_local_cells > 0 .AND. &
    1864              :           settings%lattice_fft /= ot_lattice_fft_on) THEN
    1865            0 :          CPABORT("LATTICE_FFT_LOCAL_CELLS requires LATTICE_FFT ON")
    1866              :       END IF
    1867         7831 :       IF (use_complex_kpoints .AND. settings%lattice_fft_local_cells > 0) THEN
    1868              :          CALL cp_abort(__LOCATION__, &
    1869              :                        "LATTICE_FFT_LOCAL_CELLS is a Gamma-point supercell approximation; "// &
    1870            0 :                        "explicit K points already use native Bloch blocks")
    1871              :       END IF
    1872         7831 :       CALL section_vals_val_get(ot_section, "CHOLESKY", i_val=settings%cholesky_type)
    1873         7831 :       CALL section_vals_val_get(ot_section, "EPS_TAYLOR", r_val=settings%eps_taylor)
    1874         7831 :       CALL section_vals_val_get(ot_section, "MAX_TAYLOR", i_val=settings%max_taylor)
    1875         7831 :       CALL section_vals_val_get(ot_section, "ROTATION", l_val=settings%do_rotation)
    1876         7831 :       CALL section_vals_val_get(ot_section, "ENERGIES", l_val=settings%do_ener)
    1877              :       CALL section_vals_val_get(ot_section, "OCCUPATION_PRECONDITIONER", &
    1878         7831 :                                 l_val=settings%occupation_preconditioner)
    1879         7831 :       CALL section_vals_val_get(ot_section, "NONDIAG_ENERGY", l_val=settings%add_nondiag_energy)
    1880              :       CALL section_vals_val_get(ot_section, "NONDIAG_ENERGY_STRENGTH", &
    1881         7831 :                                 r_val=settings%nondiag_energy_strength)
    1882         7831 :       IF (settings%ot_method == "LBFG") THEN
    1883           42 :          IF (settings%ot_algorithm /= "TOD" .AND. settings%ot_algorithm /= "REF") THEN
    1884            0 :             CPABORT("MINIMIZER LBFGS requires ALGORITHM STRICT or IRAC")
    1885              :          END IF
    1886              :       END IF
    1887         7831 :       IF (settings%do_ener .AND. .NOT. use_complex_kpoints .AND. .NOT. use_eigensolver) THEN
    1888            0 :          CPABORT("OT%ENERGIES is currently supported only by the complex K-point Mermin path.")
    1889              :       END IF
    1890         7831 :       IF (use_eigensolver .AND. &
    1891              :           (settings%do_rotation .OR. settings%do_ener .OR. &
    1892              :            settings%occupation_preconditioner .OR. settings%add_nondiag_energy)) THEN
    1893              :          CALL cp_warn(__LOCATION__, &
    1894              :                       "DIAGONALIZATION%OT ignores ROTATION, ENERGIES, "// &
    1895              :                       "OCCUPATION_PRECONDITIONER, and NONDIAG_ENERGY because occupations "// &
    1896            2 :                       "are assigned after eigenspace minimization.")
    1897            2 :          settings%do_rotation = .FALSE.
    1898            2 :          settings%do_ener = .FALSE.
    1899            2 :          settings%occupation_preconditioner = .FALSE.
    1900            2 :          settings%add_nondiag_energy = .FALSE.
    1901              :       END IF
    1902              : 
    1903              :       ! write OT output
    1904              : 
    1905         7831 :       IF (output_unit > 0) THEN
    1906         4032 :          WRITE (output_unit, '(/,A)') "  ----------------------------------- OT ---------------------------------------"
    1907         4032 :          IF (settings%do_rotation) THEN
    1908          145 :             WRITE (output_unit, '(A)') "  Allowing for rotations "
    1909              :          END IF
    1910         4032 :          IF (settings%do_ener) THEN
    1911           38 :             WRITE (output_unit, '(A,L2)') "  Optimizing orbital energies "
    1912              :          END IF
    1913            6 :          SELECT CASE (settings%OT_METHOD)
    1914              :          CASE ("SD")
    1915            6 :             WRITE (output_unit, '(A)') "  Minimizer      : SD                  : steepest descent"
    1916              :          CASE ("CG")
    1917         1266 :             WRITE (output_unit, '(A)') "  Minimizer      : CG                  : conjugate gradient"
    1918              :          CASE ("DIIS")
    1919         2731 :             WRITE (output_unit, '(A)') "  Minimizer      : DIIS                : direct inversion"
    1920         2731 :             WRITE (output_unit, '(A)') "                                         in the iterative subspace"
    1921         2731 :             WRITE (output_unit, '(A,I3,A)') "                                         using ", settings%diis_m, " DIIS vectors"
    1922         2731 :             IF (settings%safer_diis) THEN
    1923         2731 :                WRITE (output_unit, '(A,I3,A)') "                                         safer DIIS on"
    1924              :             ELSE
    1925            0 :                WRITE (output_unit, '(A,I3,A)') "                                         safer DIIS off"
    1926              :             END IF
    1927              :          CASE ("BROY")
    1928            8 :             WRITE (output_unit, '(A)') "  Minimizer      : BROYDEN             : Broyden "
    1929            8 :             WRITE (output_unit, '(A,F16.8)') "                   BETA                : ", settings%broyden_beta
    1930            8 :             WRITE (output_unit, '(A,F16.8)') "                   GAMMA               : ", settings%broyden_gamma
    1931            8 :             WRITE (output_unit, '(A,F16.8)') "                   SIGMA               : ", settings%broyden_sigma
    1932            8 :             WRITE (output_unit, '(A,I3,A)') "                            using      : - ", &
    1933           16 :                settings%diis_m, " BROYDEN vectors"
    1934              :          CASE ("LBFG")
    1935           21 :             WRITE (output_unit, '(A)') "  Minimizer      : LBFGS               : limited-memory BFGS"
    1936           21 :             WRITE (output_unit, '(A,I3,A)') "                            using      :   ", &
    1937           42 :                settings%diis_m, " secant pairs"
    1938           21 :             WRITE (output_unit, '(A,ES12.4)') "                   curvature tolerance : ", &
    1939           42 :                settings%lbfgs_curvature_tol
    1940           21 :             WRITE (output_unit, '(A,L7)') "                   damp weak curvature : ", &
    1941           42 :                settings%lbfgs_damping
    1942              :          CASE DEFAULT
    1943         4032 :             WRITE (output_unit, '(3A)') "  Minimizer      :      ", settings%OT_METHOD, " : UNKNOWN"
    1944              :          END SELECT
    1945           17 :          SELECT CASE (settings%preconditioner_name)
    1946              :          CASE ("FULL_SINGLE")
    1947           17 :             WRITE (output_unit, '(A)') "  Preconditioner : FULL_SINGLE         : diagonalization based"
    1948              :          CASE ("FULL_SINGLE_INVERSE")
    1949         1574 :             WRITE (output_unit, '(A,/,A)') "  Preconditioner : FULL_SINGLE_INVERSE : inversion of ", &
    1950         3148 :                "                                         H + eS - 2*(Sc)(c^T*H*c+const)(Sc)^T"
    1951              :          CASE ("FULL_ALL")
    1952         1336 :             WRITE (output_unit, '(A)') "  Preconditioner : FULL_ALL            : diagonalization, state selective"
    1953              :          CASE ("FERMI_LOW_RANK")
    1954              :             WRITE (output_unit, '(A)') &
    1955            3 :                "  Preconditioner : FERMI_LOW_RANK       : rotationally covariant low-rank correction"
    1956              :          CASE ("FULL_ALL_COVARIANT")
    1957              :             WRITE (output_unit, '(A)') &
    1958            6 :                "  Preconditioner : FULL_ALL_COVARIANT  : rotation-covariant Sylvester inverse"
    1959              :          CASE ("FULL_KINETIC")
    1960          706 :             WRITE (output_unit, '(A)') "  Preconditioner : FULL_KINETIC        : inversion of T + eS"
    1961              :          CASE ("FULL_S_INVERSE")
    1962           27 :             WRITE (output_unit, '(A)') "  Preconditioner : FULL_S_INVERSE      : cholesky inversion of S"
    1963              :          CASE ("SPARSE_DIAG")
    1964              :             WRITE (output_unit, '(A)') &
    1965            0 :                "  Preconditioner : SPARSE_DIAG    : diagonal atomic block diagonalization"
    1966              :          CASE ("SPARSE_KINETIC")
    1967            0 :             WRITE (output_unit, '(A)') "  Preconditioner : SPARSE_KINETIC      : sparse linear solver for T + eS"
    1968              :          CASE ("NONE")
    1969          363 :             WRITE (output_unit, '(A)') "  Preconditioner : NONE"
    1970              :          CASE DEFAULT
    1971         4032 :             WRITE (output_unit, '(3A)') "  Preconditioner : ", settings%preconditioner_name, " : UNKNOWN"
    1972              :          END SELECT
    1973              : 
    1974         4032 :          IF (settings%preconditioner_type == ot_precond_fermi_low_rank) THEN
    1975            3 :             IF (use_complex_kpoints .AND. settings%lattice_fft /= ot_lattice_fft_off) THEN
    1976            1 :                WRITE (output_unit, '(A)') "  Low-rank base : native K-point inverse of S(k)"
    1977            2 :             ELSE IF (settings%lattice_fft == ot_lattice_fft_auto) THEN
    1978            0 :                WRITE (output_unit, '(A)') "  Low-rank base : LATTICE_FFT (AUTO)"
    1979            2 :             ELSE IF (settings%lattice_fft == ot_lattice_fft_on) THEN
    1980            0 :                WRITE (output_unit, '(A)') "  Low-rank base : LATTICE_FFT"
    1981              :             ELSE
    1982            2 :                WRITE (output_unit, '(A,A)') "  Low-rank base : ", TRIM(settings%low_rank_base_name)
    1983              :             END IF
    1984              :          END IF
    1985         4032 :          IF (use_complex_kpoints .AND. settings%lattice_fft /= ot_lattice_fft_off) THEN
    1986            1 :             WRITE (output_unit, '(A)') "  Lattice FFT   : native Bloch blocks (no additional FFT)"
    1987              :          ELSE
    1988         4031 :             WRITE (output_unit, '(A,A)') "  Lattice FFT   : ", TRIM(settings%lattice_fft_name)
    1989              :          END IF
    1990         4032 :          IF (settings%lattice_fft_local_cells > 0) THEN
    1991            0 :             WRITE (output_unit, '(A,I0)') "  Local FFT cells: ", settings%lattice_fft_local_cells
    1992              :          END IF
    1993              : 
    1994         4032 :          WRITE (output_unit, '(A)') "  Precond_solver : "//TRIM(settings%precond_solver_name)
    1995         4032 :          IF (settings%precond_solver_type == ot_precond_solver_chebyshev) THEN
    1996            0 :             WRITE (output_unit, '(A,I14)') "  Chebyshev degree:", settings%chebyshev_degree
    1997              :          END IF
    1998         4032 :          IF (settings%preconditioner_type == ot_precond_fermi_low_rank) THEN
    1999            3 :             WRITE (output_unit, '(A,I14)') "  Low-rank cap    :", settings%fermi_low_rank_max_rank
    2000              :          END IF
    2001              : 
    2002         4032 :          IF (settings%OT_METHOD == "SD" .OR. settings%OT_METHOD == "CG" .OR. &
    2003              :              settings%OT_METHOD == "LBFG") THEN
    2004         1266 :             SELECT CASE (settings%line_search_method)
    2005              :             CASE ("2PNT")
    2006         1266 :                WRITE (output_unit, '(A)') "  Line search    : 2PNT                : 2 energies, one gradient"
    2007              :             CASE ("3PNT")
    2008           18 :                WRITE (output_unit, '(A)') "  Line search    : 3PNT                : 3 energies"
    2009              :             CASE ("GOLD")
    2010            6 :                WRITE (output_unit, '(A)') "  Line search    : GOLD                : bracketing and golden section search"
    2011            6 :                WRITE (output_unit, '(A,F14.8)') "                   target rel accuracy : ", settings%gold_target
    2012              :             CASE ("NONE")
    2013            1 :                WRITE (output_unit, '(A)') "  Line search    : NONE"
    2014              :             CASE DEFAULT
    2015         4032 :                WRITE (output_unit, '(3A)') "  Line search : ", settings%line_search_method, " : UNKNOWN"
    2016              :             END SELECT
    2017              :          END IF
    2018         4032 :          WRITE (output_unit, '(A,F14.8,T49,A,F14.8)') "  stepsize       :", settings%ds_min, &
    2019         8064 :             "  energy_gap     :", settings%energy_gap
    2020         4032 :          IF (settings%ot_algorithm == 'TOD') THEN
    2021         3672 :             WRITE (output_unit, '(A,E14.5,T49,A,I14)') "  eps_taylor     :", settings%eps_taylor, &
    2022         7344 :                "  max_taylor     :", settings%max_taylor
    2023              :          END IF
    2024         4032 :          IF (settings%ot_algorithm == 'REF') THEN
    2025          360 :             WRITE (output_unit, '(A,1X,A,T49,A,I14)') "  ortho_irac     :", settings%ortho_irac, &
    2026          720 :                "  irac_degree    :", settings%irac_degree
    2027          360 :             WRITE (output_unit, '(A,I14,T49,A,E14.5)') "  max_irac       :", settings%max_irac, &
    2028          720 :                "  eps_irac       :", settings%eps_irac
    2029          360 :             WRITE (output_unit, '(A,E14.5,T49,A,E10.3)') "  eps_irac_switch:", settings%eps_irac_switch, &
    2030          720 :                "  eps_irac_quick_exit:", settings%eps_irac_quick_exit
    2031          360 :             WRITE (output_unit, '(A,L2)') "  on_the_fly_loc :", settings%on_the_fly_loc
    2032              :          END IF
    2033         4032 :          WRITE (output_unit, '(A)') "  ----------------------------------- OT ---------------------------------------"
    2034              :          WRITE (UNIT=output_unit, &
    2035              :                 FMT="(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
    2036         4032 :             "Step", "Update method", "Time", "Convergence", "Total energy", "Change", &
    2037         8064 :             REPEAT("-", 78)
    2038              :       END IF
    2039              : 
    2040         7831 :       CALL timestop(handle)
    2041              : 
    2042         7831 :    END SUBROUTINE ot_readwrite_input
    2043              : 
    2044            0 : END MODULE qs_ot_types
        

Generated by: LCOV version 2.0-1