LCOV - code coverage report
Current view: top level - src/arnoldi - arnoldi_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 94.7 % 19 18
Test Date: 2025-12-04 06:27:48 Functions: 60.0 % 10 6

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief collection of types used in arnoldi
      10              : !> \par History
      11              : !>       2014.09 created [Florian Schiffmann]
      12              : !>       2023.12 Removed support for single-precision [Ole Schuett]
      13              : !>       2024.12 Removed support for complex input matrices [Ole Schuett]
      14              : !> \author Florian Schiffmann
      15              : ! **************************************************************************************************
      16              : MODULE arnoldi_types
      17              :    USE cp_dbcsr_api,                    ONLY: dbcsr_type
      18              :    USE kinds,                           ONLY: dp
      19              :    USE message_passing,                 ONLY: mp_comm_type
      20              : 
      21              :    IMPLICIT NONE
      22              : 
      23              : ! Type that gets created during the arnoldi procedure and contains basically everything
      24              : ! As it is not quite clear what the user will request, this is the most general way to satisfy all needs:
      25              : ! Give him everything we have and create some easy to use routines to post process externally
      26              :    TYPE arnoldi_control_type
      27              :       LOGICAL                                 :: local_comp = .FALSE., converged = .FALSE.
      28              :       INTEGER                                 :: myproc = -1
      29              :       TYPE(mp_comm_type)                      :: mp_group = mp_comm_type(), pcol_group = mp_comm_type()
      30              :       INTEGER                                 :: max_iter = -1 ! Maximum number of iterations
      31              :       INTEGER                                 :: current_step = -1 ! In case subspace converged early contains last iteration
      32              :       INTEGER                                 :: nval_req = -1
      33              :       INTEGER                                 :: selection_crit = -1
      34              :       INTEGER                                 :: nval_out = -1
      35              :       INTEGER                                 :: nrestart = -1
      36              :       REAL(dp)                            :: threshold = 0.0_dp
      37              :       LOGICAL                                 :: symmetric = .FALSE.
      38              :       LOGICAL                                 :: generalized_ev = .FALSE.
      39              :       LOGICAL                                 :: iram = .FALSE.
      40              :       LOGICAL                                 :: has_initial_vector = .FALSE.
      41              :       INTEGER, DIMENSION(:), POINTER          :: selected_ind => NULL() ! list of indices matching the selection criterion
      42              :    END TYPE arnoldi_control_type
      43              : 
      44              :    TYPE arnoldi_data_type
      45              :       REAL(kind=dp), POINTER, DIMENSION(:)         :: f_vec => NULL() ! the local parts of the residual vector
      46              :       REAL(kind=dp), POINTER, DIMENSION(:, :)      :: Hessenberg => NULL() ! the Hessenberg matrix
      47              :       REAL(kind=dp), POINTER, DIMENSION(:, :)      :: local_history => NULL() ! the complete set of orthonormal vectors (local part)
      48              :       COMPLEX(dp), POINTER, DIMENSION(:)           :: evals => NULL() ! the real part of the eigenvalues (if complex both)
      49              :       COMPLEX(dp), POINTER, DIMENSION(:, :)        :: revec => NULL() ! the right eigenvectors
      50              :       REAL(kind=dp)                                :: rho_scale = 0.0_dp ! scling factor for general eig arnoldi
      51              :       REAL(kind=dp), POINTER, DIMENSION(:)         :: x_vec => NULL() ! eigenvector for genreal eig arnoldi
      52              :    END TYPE arnoldi_data_type
      53              : 
      54              :    TYPE arnoldi_env_type
      55              :       TYPE(arnoldi_data_type), POINTER, PRIVATE              :: data => NULL()
      56              :       TYPE(arnoldi_control_type), POINTER, PRIVATE           :: control => NULL()
      57              :    END TYPE arnoldi_env_type
      58              : 
      59              :    TYPE m_x_v_vectors_type
      60              :       TYPE(dbcsr_type)                          :: input_vec
      61              :       TYPE(dbcsr_type)                          :: result_vec
      62              :       TYPE(dbcsr_type)                          :: rep_col_vec
      63              :       TYPE(dbcsr_type)                          :: rep_row_vec
      64              :    END TYPE m_x_v_vectors_type
      65              : 
      66              :    PRIVATE
      67              : 
      68              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'arnoldi_types'
      69              : 
      70              :    PUBLIC :: arnoldi_env_type, m_x_v_vectors_type, get_data, get_sel_ind, &
      71              :              get_control, arnoldi_control_type, &
      72              :              arnoldi_data_type, get_evals, set_control, set_data
      73              : CONTAINS
      74              : 
      75              : ! **************************************************************************************************
      76              : !> \brief ...
      77              : !> \param arnoldi_env ...
      78              : !> \param control ...
      79              : ! **************************************************************************************************
      80       137255 :    SUBROUTINE set_control(arnoldi_env, control)
      81              :       TYPE(arnoldi_env_type), INTENT(INOUT)              :: arnoldi_env
      82              :       TYPE(arnoldi_control_type), INTENT(IN), POINTER    :: control
      83              : 
      84       137255 :       arnoldi_env%control => control
      85       137255 :    END SUBROUTINE set_control
      86              : 
      87              : ! **************************************************************************************************
      88              : !> \brief ...
      89              : !> \param arnoldi_env ...
      90              : !> \return ...
      91              : ! **************************************************************************************************
      92       407758 :    FUNCTION get_sel_ind(arnoldi_env) RESULT(selected_ind)
      93              :       TYPE(arnoldi_env_type), INTENT(IN)                 :: arnoldi_env
      94              :       INTEGER, DIMENSION(:), POINTER                     :: selected_ind
      95              : 
      96       407758 :       selected_ind => arnoldi_env%control%selected_ind
      97              : 
      98       407758 :    END FUNCTION get_sel_ind
      99              : 
     100              : ! **************************************************************************************************
     101              : !> \brief ...
     102              : !> \param arnoldi_env ...
     103              : !> \return ...
     104              : ! **************************************************************************************************
     105       840716 :    FUNCTION get_data(arnoldi_env) RESULT(ar_data)
     106              :       TYPE(arnoldi_env_type), INTENT(IN)                 :: arnoldi_env
     107              :       TYPE(arnoldi_data_type), POINTER                   :: ar_data
     108              : 
     109       840716 :       ar_data => arnoldi_env%data
     110              : 
     111       840716 :    END FUNCTION get_data
     112              : 
     113              : ! **************************************************************************************************
     114              : !> \brief ...
     115              : !> \param arnoldi_env ...
     116              : !> \param ar_data ...
     117              : ! **************************************************************************************************
     118       137255 :    SUBROUTINE set_data(arnoldi_env, ar_data)
     119              :       TYPE(arnoldi_env_type), INTENT(INOUT)              :: arnoldi_env
     120              :       TYPE(arnoldi_data_type), INTENT(IN), POINTER       :: ar_data
     121              : 
     122       137255 :       arnoldi_env%data => ar_data
     123              : 
     124       137255 :    END SUBROUTINE set_data
     125              : 
     126              : ! **************************************************************************************************
     127              : !> \brief ...
     128              : !> \param arnoldi_env ...
     129              : !> \return ...
     130              : ! **************************************************************************************************
     131      1789024 :    FUNCTION get_control(arnoldi_env) RESULT(control)
     132              :       TYPE(arnoldi_env_type), INTENT(INOUT)              :: arnoldi_env
     133              :       TYPE(arnoldi_control_type), POINTER                :: control
     134              : 
     135      1789024 :       control => arnoldi_env%control
     136              : 
     137      1789024 :    END FUNCTION get_control
     138              : 
     139              : ! **************************************************************************************************
     140              : !> \brief ...
     141              : !> \param arnoldi_env ...
     142              : !> \return ...
     143              : ! **************************************************************************************************
     144       265844 :    FUNCTION get_evals(arnoldi_env) RESULT(evals)
     145              :       TYPE(arnoldi_env_type), INTENT(IN)                 :: arnoldi_env
     146              :       COMPLEX(dp), DIMENSION(:), POINTER                 :: evals
     147              : 
     148       265844 :       evals => arnoldi_env%data%evals
     149              : 
     150       265844 :    END FUNCTION get_evals
     151              : 
     152            0 : END MODULE arnoldi_types
        

Generated by: LCOV version 2.0-1