LCOV - code coverage report
Current view: top level - src - preconditioner_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:6d276e9) Lines: 92.2 % 77 71
Test Date: 2026-09-10 07:29:18 Functions: 50.0 % 6 3

            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 types of  preconditioners
      10              : !> \par History
      11              : !>      Separate types from construction and application
      12              : !> \author Joost VandeVondele (09.2002)
      13              : ! **************************************************************************************************
      14              : MODULE preconditioner_types
      15              :    USE cp_blacs_env,                    ONLY: cp_blacs_env_release,&
      16              :                                               cp_blacs_env_type
      17              :    USE cp_cfm_types,                    ONLY: cp_cfm_release,&
      18              :                                               cp_cfm_type
      19              :    USE cp_dbcsr_api,                    ONLY: dbcsr_deallocate_matrix,&
      20              :                                               dbcsr_p_type,&
      21              :                                               dbcsr_release_p,&
      22              :                                               dbcsr_type
      23              :    USE cp_fm_types,                     ONLY: cp_fm_release,&
      24              :                                               cp_fm_type
      25              :    USE input_constants,                 ONLY: cholesky_reduce,&
      26              :                                               ot_low_rank_base_overlap,&
      27              :                                               ot_precond_solver_default
      28              :    USE kinds,                           ONLY: dp
      29              :    USE message_passing,                 ONLY: mp_para_env_release,&
      30              :                                               mp_para_env_type
      31              : #include "./base/base_uses.f90"
      32              : 
      33              :    IMPLICIT NONE
      34              : 
      35              :    PRIVATE
      36              : 
      37              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'preconditioner_types'
      38              : 
      39              :    PUBLIC  :: preconditioner_type, preconditioner_p_type
      40              :    PUBLIC  :: init_preconditioner
      41              :    PUBLIC  :: preconditioner_in_use
      42              :    PUBLIC  :: destroy_preconditioner
      43              : 
      44              : ! **************************************************************************************************
      45              :    TYPE preconditioner_type
      46              : !    PRIVATE
      47              :       TYPE(dbcsr_type), POINTER :: sparse_matrix => NULL()
      48              :       TYPE(cp_fm_type), POINTER :: fm => NULL()
      49              :       TYPE(cp_cfm_type), POINTER :: complex_fm => NULL()
      50              :       LOGICAL :: owns_complex_fm = .TRUE.
      51              :       TYPE(cp_fm_type), POINTER :: base_fm => NULL()
      52              :       TYPE(dbcsr_type), POINTER           :: dbcsr_matrix => NULL()
      53              :       TYPE(dbcsr_type), POINTER           :: base_dbcsr_matrix => NULL()
      54              :       TYPE(dbcsr_type), POINTER           :: max_ev_vector => NULL()
      55              :       TYPE(dbcsr_type), POINTER           :: min_ev_vector => NULL()
      56              :       TYPE(dbcsr_p_type), POINTER, DIMENSION(:) :: inverse_history => NULL()
      57              :       TYPE(mp_para_env_type), POINTER   :: para_env => NULL()
      58              :       TYPE(cp_blacs_env_type), POINTER   :: ctxt => NULL()
      59              :       INTEGER :: in_use = -1, solver = -1, ihistory = -1, cholesky_use = -1
      60              :       REAL(KIND=dp), DIMENSION(:), POINTER :: occ_evals => NULL(), full_evals => NULL()
      61              :       REAL(KIND=dp) :: energy_gap = -1.0_dp
      62              :       REAL(KIND=dp) :: condition_num = -1.0_dp
      63              :       INTEGER :: polynomial_degree = 8
      64              :       REAL(KIND=dp) :: polynomial_min = -1.0_dp, polynomial_max = -1.0_dp
      65              :       INTEGER :: spectral_rank = 0
      66              :       REAL(KIND=dp) :: spectral_reference = 0.0_dp, spectral_window = 1.0_dp, &
      67              :                        spectral_base_scale = 1.0_dp
      68              :       INTEGER :: low_rank_base = ot_low_rank_base_overlap
      69              :       INTEGER, DIMENSION(3) :: lattice_dims = [1, 1, 1]
      70              :       INTEGER :: lattice_block_size = 0
      71              :       REAL(KIND=dp) :: lattice_projection_error = 0.0_dp
      72              :       COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: lattice_inverse_k
      73              :    END TYPE preconditioner_type
      74              : 
      75              : ! **************************************************************************************************
      76              :    TYPE preconditioner_p_type
      77              :       TYPE(preconditioner_type), POINTER :: preconditioner => NULL()
      78              :    END TYPE preconditioner_p_type
      79              : 
      80              : CONTAINS
      81              : 
      82              : ! **************************************************************************************************
      83              : 
      84              : ! **************************************************************************************************
      85              : !> \brief ...
      86              : !> \param preconditioner ...
      87              : !> \return ...
      88              : ! **************************************************************************************************
      89          446 :    FUNCTION preconditioner_in_use(preconditioner)
      90              :       TYPE(preconditioner_type)                          :: preconditioner
      91              :       LOGICAL                                            :: preconditioner_in_use
      92              : 
      93          446 :       preconditioner_in_use = .NOT. (preconditioner%in_use == 0)
      94          446 :    END FUNCTION preconditioner_in_use
      95              : 
      96              : ! **************************************************************************************************
      97              : !> \brief ...
      98              : !> \param preconditioner_env ...
      99              : !> \param para_env ...
     100              : !> \param blacs_env ...
     101              : ! **************************************************************************************************
     102         7554 :    SUBROUTINE init_preconditioner(preconditioner_env, para_env, blacs_env)
     103              : 
     104              :       TYPE(preconditioner_type)                          :: preconditioner_env
     105              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     106              :       TYPE(cp_blacs_env_type), POINTER                   :: blacs_env
     107              : 
     108         7554 :       NULLIFY (preconditioner_env%sparse_matrix)
     109         7554 :       NULLIFY (preconditioner_env%fm)
     110         7554 :       NULLIFY (preconditioner_env%complex_fm)
     111         7554 :       preconditioner_env%owns_complex_fm = .TRUE.
     112         7554 :       NULLIFY (preconditioner_env%base_fm)
     113         7554 :       NULLIFY (preconditioner_env%dbcsr_matrix)
     114         7554 :       NULLIFY (preconditioner_env%base_dbcsr_matrix)
     115         7554 :       NULLIFY (preconditioner_env%occ_evals)
     116         7554 :       NULLIFY (preconditioner_env%full_evals)
     117         7554 :       NULLIFY (preconditioner_env%inverse_history)
     118         7554 :       NULLIFY (preconditioner_env%max_ev_vector)
     119         7554 :       NULLIFY (preconditioner_env%min_ev_vector)
     120         7554 :       preconditioner_env%solver = ot_precond_solver_default
     121         7554 :       preconditioner_env%para_env => para_env
     122         7554 :       preconditioner_env%ctxt => blacs_env
     123              :       !inverse is used for filtering in update set it to something huge to
     124              :       ! avoid filtering if the information is not available
     125         7554 :       preconditioner_env%condition_num = -1.0_dp
     126         7554 :       preconditioner_env%polynomial_degree = 8
     127         7554 :       preconditioner_env%polynomial_min = -1.0_dp
     128         7554 :       preconditioner_env%polynomial_max = -1.0_dp
     129         7554 :       preconditioner_env%spectral_rank = 0
     130         7554 :       preconditioner_env%spectral_reference = 0.0_dp
     131         7554 :       preconditioner_env%spectral_window = 1.0_dp
     132         7554 :       preconditioner_env%spectral_base_scale = 1.0_dp
     133         7554 :       preconditioner_env%low_rank_base = ot_low_rank_base_overlap
     134        30216 :       preconditioner_env%lattice_dims = [1, 1, 1]
     135         7554 :       preconditioner_env%lattice_block_size = 0
     136         7554 :       preconditioner_env%lattice_projection_error = 0.0_dp
     137         7554 :       preconditioner_env%ihistory = 0
     138              : 
     139         7554 :       CALL preconditioner_env%para_env%retain()
     140         7554 :       CALL preconditioner_env%ctxt%retain()
     141              : 
     142         7554 :    END SUBROUTINE init_preconditioner
     143              : 
     144              : ! **************************************************************************************************
     145              : !> \brief ...
     146              : !> \param preconditioner_env ...
     147              : ! **************************************************************************************************
     148         7554 :    SUBROUTINE destroy_preconditioner(preconditioner_env)
     149              : 
     150              :       TYPE(preconditioner_type)                          :: preconditioner_env
     151              : 
     152              :       CHARACTER(len=*), PARAMETER :: routineN = 'destroy_preconditioner'
     153              : 
     154              :       INTEGER                                            :: handle, i
     155              : 
     156         7554 :       CALL timeset(routineN, handle)
     157              : 
     158         7554 :       IF (ASSOCIATED(preconditioner_env%sparse_matrix)) THEN
     159            2 :          CALL dbcsr_deallocate_matrix(preconditioner_env%sparse_matrix)
     160            2 :          NULLIFY (preconditioner_env%sparse_matrix)
     161              :       END IF
     162              : 
     163         7554 :       IF (ASSOCIATED(preconditioner_env%fm)) THEN
     164         1732 :          CALL cp_fm_release(preconditioner_env%fm)
     165         1732 :          DEALLOCATE (preconditioner_env%fm)
     166              :          NULLIFY (preconditioner_env%fm)
     167              :       END IF
     168         7554 :       IF (preconditioner_env%owns_complex_fm) THEN
     169         7544 :          IF (ASSOCIATED(preconditioner_env%complex_fm)) THEN
     170          460 :             CALL cp_cfm_release(preconditioner_env%complex_fm)
     171          460 :             DEALLOCATE (preconditioner_env%complex_fm)
     172              :          END IF
     173              :       END IF
     174         7554 :       NULLIFY (preconditioner_env%complex_fm)
     175         7554 :       preconditioner_env%owns_complex_fm = .TRUE.
     176         7554 :       IF (ASSOCIATED(preconditioner_env%base_fm)) THEN
     177            0 :          CALL cp_fm_release(preconditioner_env%base_fm)
     178            0 :          DEALLOCATE (preconditioner_env%base_fm)
     179              :          NULLIFY (preconditioner_env%base_fm)
     180              :       END IF
     181         7554 :       IF (ASSOCIATED(preconditioner_env%dbcsr_matrix)) THEN
     182         4784 :          CALL dbcsr_release_p(preconditioner_env%dbcsr_matrix)
     183              :       END IF
     184         7554 :       IF (ASSOCIATED(preconditioner_env%base_dbcsr_matrix)) THEN
     185            2 :          CALL dbcsr_release_p(preconditioner_env%base_dbcsr_matrix)
     186              :       END IF
     187         7554 :       IF (ASSOCIATED(preconditioner_env%max_ev_vector)) THEN
     188         2057 :          CALL dbcsr_release_p(preconditioner_env%max_ev_vector)
     189              :       END IF
     190         7554 :       IF (ASSOCIATED(preconditioner_env%min_ev_vector)) THEN
     191         2057 :          CALL dbcsr_release_p(preconditioner_env%min_ev_vector)
     192              :       END IF
     193         7554 :       IF (ASSOCIATED(preconditioner_env%occ_evals)) THEN
     194         3918 :          DEALLOCATE (preconditioner_env%occ_evals)
     195              :       END IF
     196         7554 :       IF (ASSOCIATED(preconditioner_env%full_evals)) THEN
     197         3918 :          DEALLOCATE (preconditioner_env%full_evals)
     198              :       END IF
     199         7554 :       IF (ALLOCATED(preconditioner_env%lattice_inverse_k)) THEN
     200            2 :          DEALLOCATE (preconditioner_env%lattice_inverse_k)
     201              :       END IF
     202         7554 :       IF (ASSOCIATED(preconditioner_env%inverse_history)) THEN
     203            0 :          DO i = 1, SIZE(preconditioner_env%inverse_history)
     204            0 :             CALL dbcsr_release_p(preconditioner_env%inverse_history(i)%matrix)
     205              :          END DO
     206            0 :          DEALLOCATE (preconditioner_env%inverse_history)
     207              :       END IF
     208         7554 :       CALL mp_para_env_release(preconditioner_env%para_env)
     209         7554 :       CALL cp_blacs_env_release(preconditioner_env%ctxt)
     210              : 
     211         7554 :       preconditioner_env%in_use = 0
     212         7554 :       preconditioner_env%cholesky_use = cholesky_reduce
     213              : 
     214         7554 :       CALL timestop(handle)
     215              : 
     216         7554 :    END SUBROUTINE destroy_preconditioner
     217              : 
     218            0 : END MODULE preconditioner_types
        

Generated by: LCOV version 2.0-1