LCOV - code coverage report
Current view: top level - src - preconditioner_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:24d69ee) Lines: 93.3 % 60 56
Test Date: 2026-09-03 07:32:15 Functions: 60.0 % 5 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_precond_solver_default
      27              :    USE kinds,                           ONLY: dp
      28              :    USE message_passing,                 ONLY: mp_para_env_release,&
      29              :                                               mp_para_env_type
      30              : #include "./base/base_uses.f90"
      31              : 
      32              :    IMPLICIT NONE
      33              : 
      34              :    PRIVATE
      35              : 
      36              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'preconditioner_types'
      37              : 
      38              :    PUBLIC  :: preconditioner_type, preconditioner_p_type
      39              :    PUBLIC  :: init_preconditioner
      40              :    PUBLIC  :: preconditioner_in_use
      41              :    PUBLIC  :: destroy_preconditioner
      42              : 
      43              : ! **************************************************************************************************
      44              :    TYPE preconditioner_type
      45              : !    PRIVATE
      46              :       TYPE(dbcsr_type), POINTER :: sparse_matrix => NULL()
      47              :       TYPE(cp_fm_type), POINTER :: fm => NULL()
      48              :       TYPE(cp_cfm_type), POINTER :: complex_fm => NULL()
      49              :       LOGICAL :: owns_complex_fm = .TRUE.
      50              :       TYPE(dbcsr_type), POINTER           :: dbcsr_matrix => NULL()
      51              :       TYPE(dbcsr_type), POINTER           :: max_ev_vector => NULL()
      52              :       TYPE(dbcsr_type), POINTER           :: min_ev_vector => NULL()
      53              :       TYPE(dbcsr_p_type), POINTER, DIMENSION(:) :: inverse_history => NULL()
      54              :       TYPE(mp_para_env_type), POINTER   :: para_env => NULL()
      55              :       TYPE(cp_blacs_env_type), POINTER   :: ctxt => NULL()
      56              :       INTEGER :: in_use = -1, solver = -1, ihistory = -1, cholesky_use = -1
      57              :       REAL(KIND=dp), DIMENSION(:), POINTER :: occ_evals => NULL(), full_evals => NULL()
      58              :       REAL(KIND=dp) :: energy_gap = -1.0_dp
      59              :       REAL(KIND=dp) :: condition_num = -1.0_dp
      60              :       INTEGER :: polynomial_degree = 8
      61              :       REAL(KIND=dp) :: polynomial_min = -1.0_dp, polynomial_max = -1.0_dp
      62              :    END TYPE preconditioner_type
      63              : 
      64              : ! **************************************************************************************************
      65              :    TYPE preconditioner_p_type
      66              :       TYPE(preconditioner_type), POINTER :: preconditioner => NULL()
      67              :    END TYPE preconditioner_p_type
      68              : 
      69              : CONTAINS
      70              : 
      71              : ! **************************************************************************************************
      72              : 
      73              : ! **************************************************************************************************
      74              : !> \brief ...
      75              : !> \param preconditioner ...
      76              : !> \return ...
      77              : ! **************************************************************************************************
      78          446 :    FUNCTION preconditioner_in_use(preconditioner)
      79              :       TYPE(preconditioner_type)                          :: preconditioner
      80              :       LOGICAL                                            :: preconditioner_in_use
      81              : 
      82          446 :       preconditioner_in_use = .NOT. (preconditioner%in_use == 0)
      83          446 :    END FUNCTION preconditioner_in_use
      84              : 
      85              : ! **************************************************************************************************
      86              : !> \brief ...
      87              : !> \param preconditioner_env ...
      88              : !> \param para_env ...
      89              : !> \param blacs_env ...
      90              : ! **************************************************************************************************
      91         7444 :    SUBROUTINE init_preconditioner(preconditioner_env, para_env, blacs_env)
      92              : 
      93              :       TYPE(preconditioner_type)                          :: preconditioner_env
      94              :       TYPE(mp_para_env_type), POINTER                    :: para_env
      95              :       TYPE(cp_blacs_env_type), POINTER                   :: blacs_env
      96              : 
      97         7444 :       NULLIFY (preconditioner_env%sparse_matrix)
      98         7444 :       NULLIFY (preconditioner_env%fm)
      99         7444 :       NULLIFY (preconditioner_env%complex_fm)
     100         7444 :       preconditioner_env%owns_complex_fm = .TRUE.
     101         7444 :       NULLIFY (preconditioner_env%dbcsr_matrix)
     102         7444 :       NULLIFY (preconditioner_env%occ_evals)
     103         7444 :       NULLIFY (preconditioner_env%full_evals)
     104         7444 :       NULLIFY (preconditioner_env%inverse_history)
     105         7444 :       NULLIFY (preconditioner_env%max_ev_vector)
     106         7444 :       NULLIFY (preconditioner_env%min_ev_vector)
     107         7444 :       preconditioner_env%solver = ot_precond_solver_default
     108         7444 :       preconditioner_env%para_env => para_env
     109         7444 :       preconditioner_env%ctxt => blacs_env
     110              :       !inverse is used for filtering in update set it to something huge to
     111              :       ! avoid filtering if the information is not available
     112         7444 :       preconditioner_env%condition_num = -1.0_dp
     113         7444 :       preconditioner_env%polynomial_degree = 8
     114         7444 :       preconditioner_env%polynomial_min = -1.0_dp
     115         7444 :       preconditioner_env%polynomial_max = -1.0_dp
     116         7444 :       preconditioner_env%ihistory = 0
     117              : 
     118         7444 :       CALL preconditioner_env%para_env%retain()
     119         7444 :       CALL preconditioner_env%ctxt%retain()
     120              : 
     121         7444 :    END SUBROUTINE init_preconditioner
     122              : 
     123              : ! **************************************************************************************************
     124              : !> \brief ...
     125              : !> \param preconditioner_env ...
     126              : ! **************************************************************************************************
     127         7444 :    SUBROUTINE destroy_preconditioner(preconditioner_env)
     128              : 
     129              :       TYPE(preconditioner_type)                          :: preconditioner_env
     130              : 
     131              :       CHARACTER(len=*), PARAMETER :: routineN = 'destroy_preconditioner'
     132              : 
     133              :       INTEGER                                            :: handle, i
     134              : 
     135         7444 :       CALL timeset(routineN, handle)
     136              : 
     137         7444 :       IF (ASSOCIATED(preconditioner_env%sparse_matrix)) THEN
     138            2 :          CALL dbcsr_deallocate_matrix(preconditioner_env%sparse_matrix)
     139            2 :          NULLIFY (preconditioner_env%sparse_matrix)
     140              :       END IF
     141              : 
     142         7444 :       IF (ASSOCIATED(preconditioner_env%fm)) THEN
     143         1676 :          CALL cp_fm_release(preconditioner_env%fm)
     144         1676 :          DEALLOCATE (preconditioner_env%fm)
     145              :          NULLIFY (preconditioner_env%fm)
     146              :       END IF
     147         7444 :       IF (preconditioner_env%owns_complex_fm) THEN
     148         7434 :          IF (ASSOCIATED(preconditioner_env%complex_fm)) THEN
     149          458 :             CALL cp_cfm_release(preconditioner_env%complex_fm)
     150          458 :             DEALLOCATE (preconditioner_env%complex_fm)
     151              :          END IF
     152              :       END IF
     153         7444 :       NULLIFY (preconditioner_env%complex_fm)
     154         7444 :       preconditioner_env%owns_complex_fm = .TRUE.
     155         7444 :       IF (ASSOCIATED(preconditioner_env%dbcsr_matrix)) THEN
     156         4732 :          CALL dbcsr_release_p(preconditioner_env%dbcsr_matrix)
     157              :       END IF
     158         7444 :       IF (ASSOCIATED(preconditioner_env%max_ev_vector)) THEN
     159         2001 :          CALL dbcsr_release_p(preconditioner_env%max_ev_vector)
     160              :       END IF
     161         7444 :       IF (ASSOCIATED(preconditioner_env%min_ev_vector)) THEN
     162         2001 :          CALL dbcsr_release_p(preconditioner_env%min_ev_vector)
     163              :       END IF
     164         7444 :       IF (ASSOCIATED(preconditioner_env%occ_evals)) THEN
     165         3866 :          DEALLOCATE (preconditioner_env%occ_evals)
     166              :       END IF
     167         7444 :       IF (ASSOCIATED(preconditioner_env%full_evals)) THEN
     168         3866 :          DEALLOCATE (preconditioner_env%full_evals)
     169              :       END IF
     170         7444 :       IF (ASSOCIATED(preconditioner_env%inverse_history)) THEN
     171            0 :          DO i = 1, SIZE(preconditioner_env%inverse_history)
     172            0 :             CALL dbcsr_release_p(preconditioner_env%inverse_history(i)%matrix)
     173              :          END DO
     174            0 :          DEALLOCATE (preconditioner_env%inverse_history)
     175              :       END IF
     176         7444 :       CALL mp_para_env_release(preconditioner_env%para_env)
     177         7444 :       CALL cp_blacs_env_release(preconditioner_env%ctxt)
     178              : 
     179         7444 :       preconditioner_env%in_use = 0
     180         7444 :       preconditioner_env%cholesky_use = cholesky_reduce
     181              : 
     182         7444 :       CALL timestop(handle)
     183              : 
     184         7444 :    END SUBROUTINE destroy_preconditioner
     185              : 
     186            0 : END MODULE preconditioner_types
        

Generated by: LCOV version 2.0-1