LCOV - code coverage report
Current view: top level - src - preconditioner_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 91.8 % 49 45
Test Date: 2025-07-25 12:55:17 Functions: 60.0 % 5 3

            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 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_dbcsr_api,                    ONLY: dbcsr_deallocate_matrix,&
      18              :                                               dbcsr_p_type,&
      19              :                                               dbcsr_release_p,&
      20              :                                               dbcsr_type
      21              :    USE cp_fm_types,                     ONLY: cp_fm_release,&
      22              :                                               cp_fm_type
      23              :    USE input_constants,                 ONLY: cholesky_reduce,&
      24              :                                               ot_precond_solver_default
      25              :    USE kinds,                           ONLY: dp
      26              :    USE message_passing,                 ONLY: mp_para_env_release,&
      27              :                                               mp_para_env_type
      28              : #include "./base/base_uses.f90"
      29              : 
      30              :    IMPLICIT NONE
      31              : 
      32              :    PRIVATE
      33              : 
      34              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'preconditioner_types'
      35              : 
      36              :    PUBLIC  :: preconditioner_type, preconditioner_p_type
      37              :    PUBLIC  :: init_preconditioner
      38              :    PUBLIC  :: preconditioner_in_use
      39              :    PUBLIC  :: destroy_preconditioner
      40              : 
      41              : ! **************************************************************************************************
      42              :    TYPE preconditioner_type
      43              : !    PRIVATE
      44              :       TYPE(dbcsr_type), POINTER :: sparse_matrix => NULL()
      45              :       TYPE(cp_fm_type), POINTER :: fm => NULL()
      46              :       TYPE(dbcsr_type), POINTER           :: dbcsr_matrix => NULL()
      47              :       TYPE(dbcsr_type), POINTER           :: max_ev_vector => NULL()
      48              :       TYPE(dbcsr_type), POINTER           :: min_ev_vector => NULL()
      49              :       TYPE(dbcsr_p_type), POINTER, DIMENSION(:) :: inverse_history => NULL()
      50              :       TYPE(mp_para_env_type), POINTER   :: para_env => NULL()
      51              :       TYPE(cp_blacs_env_type), POINTER   :: ctxt => NULL()
      52              :       INTEGER :: in_use = -1, solver = -1, ihistory = -1, cholesky_use = -1
      53              :       REAL(KIND=dp), DIMENSION(:), POINTER :: occ_evals => NULL(), full_evals => NULL()
      54              :       REAL(KIND=dp) :: energy_gap = -1.0_dp
      55              :       REAL(KIND=dp) :: condition_num = -1.0_dp
      56              :    END TYPE preconditioner_type
      57              : 
      58              : ! **************************************************************************************************
      59              :    TYPE preconditioner_p_type
      60              :       TYPE(preconditioner_type), POINTER :: preconditioner => NULL()
      61              :    END TYPE preconditioner_p_type
      62              : 
      63              : CONTAINS
      64              : 
      65              : ! **************************************************************************************************
      66              : 
      67              : ! **************************************************************************************************
      68              : !> \brief ...
      69              : !> \param preconditioner ...
      70              : !> \return ...
      71              : ! **************************************************************************************************
      72          296 :    FUNCTION preconditioner_in_use(preconditioner)
      73              :       TYPE(preconditioner_type)                          :: preconditioner
      74              :       LOGICAL                                            :: preconditioner_in_use
      75              : 
      76          296 :       preconditioner_in_use = .NOT. (preconditioner%in_use .EQ. 0)
      77          296 :    END FUNCTION
      78              : 
      79              : ! **************************************************************************************************
      80              : !> \brief ...
      81              : !> \param preconditioner_env ...
      82              : !> \param para_env ...
      83              : !> \param blacs_env ...
      84              : ! **************************************************************************************************
      85         6010 :    SUBROUTINE init_preconditioner(preconditioner_env, para_env, blacs_env)
      86              : 
      87              :       TYPE(preconditioner_type)                          :: preconditioner_env
      88              :       TYPE(mp_para_env_type), POINTER                    :: para_env
      89              :       TYPE(cp_blacs_env_type), POINTER                   :: blacs_env
      90              : 
      91         6010 :       NULLIFY (preconditioner_env%sparse_matrix)
      92         6010 :       NULLIFY (preconditioner_env%fm)
      93         6010 :       NULLIFY (preconditioner_env%dbcsr_matrix)
      94         6010 :       NULLIFY (preconditioner_env%occ_evals)
      95         6010 :       NULLIFY (preconditioner_env%full_evals)
      96         6010 :       NULLIFY (preconditioner_env%inverse_history)
      97         6010 :       NULLIFY (preconditioner_env%max_ev_vector)
      98         6010 :       NULLIFY (preconditioner_env%min_ev_vector)
      99         6010 :       preconditioner_env%solver = ot_precond_solver_default
     100         6010 :       preconditioner_env%para_env => para_env
     101         6010 :       preconditioner_env%ctxt => blacs_env
     102              :       !inverse is used for filtering in update set it to something huge to
     103              :       ! avoid filtering if the information is not available
     104         6010 :       preconditioner_env%condition_num = -1.0_dp
     105         6010 :       preconditioner_env%ihistory = 0
     106              : 
     107         6010 :       CALL preconditioner_env%para_env%retain()
     108         6010 :       CALL preconditioner_env%ctxt%retain()
     109              : 
     110         6010 :    END SUBROUTINE init_preconditioner
     111              : 
     112              : ! **************************************************************************************************
     113              : !> \brief ...
     114              : !> \param preconditioner_env ...
     115              : ! **************************************************************************************************
     116         6010 :    SUBROUTINE destroy_preconditioner(preconditioner_env)
     117              : 
     118              :       TYPE(preconditioner_type)                          :: preconditioner_env
     119              : 
     120              :       CHARACTER(len=*), PARAMETER :: routineN = 'destroy_preconditioner'
     121              : 
     122              :       INTEGER                                            :: handle, i
     123              : 
     124         6010 :       CALL timeset(routineN, handle)
     125              : 
     126         6010 :       IF (ASSOCIATED(preconditioner_env%sparse_matrix)) THEN
     127            2 :          CALL dbcsr_deallocate_matrix(preconditioner_env%sparse_matrix)
     128            2 :          NULLIFY (preconditioner_env%sparse_matrix)
     129              :       END IF
     130              : 
     131         6010 :       IF (ASSOCIATED(preconditioner_env%fm)) THEN
     132         1440 :          CALL cp_fm_release(preconditioner_env%fm)
     133         1440 :          DEALLOCATE (preconditioner_env%fm)
     134              :          NULLIFY (preconditioner_env%fm)
     135              :       END IF
     136         6010 :       IF (ASSOCIATED(preconditioner_env%dbcsr_matrix)) THEN
     137         4004 :          CALL dbcsr_release_p(preconditioner_env%dbcsr_matrix)
     138              :       END IF
     139         6010 :       IF (ASSOCIATED(preconditioner_env%max_ev_vector)) THEN
     140         1735 :          CALL dbcsr_release_p(preconditioner_env%max_ev_vector)
     141              :       END IF
     142         6010 :       IF (ASSOCIATED(preconditioner_env%min_ev_vector)) THEN
     143         1735 :          CALL dbcsr_release_p(preconditioner_env%min_ev_vector)
     144              :       END IF
     145         6010 :       IF (ASSOCIATED(preconditioner_env%occ_evals)) THEN
     146         3040 :          DEALLOCATE (preconditioner_env%occ_evals)
     147              :       END IF
     148         6010 :       IF (ASSOCIATED(preconditioner_env%full_evals)) THEN
     149         3040 :          DEALLOCATE (preconditioner_env%full_evals)
     150              :       END IF
     151         6010 :       IF (ASSOCIATED(preconditioner_env%inverse_history)) THEN
     152            0 :          DO i = 1, SIZE(preconditioner_env%inverse_history)
     153            0 :             CALL dbcsr_release_p(preconditioner_env%inverse_history(i)%matrix)
     154              :          END DO
     155            0 :          DEALLOCATE (preconditioner_env%inverse_history)
     156              :       END IF
     157         6010 :       CALL mp_para_env_release(preconditioner_env%para_env)
     158         6010 :       CALL cp_blacs_env_release(preconditioner_env%ctxt)
     159              : 
     160         6010 :       preconditioner_env%in_use = 0
     161         6010 :       preconditioner_env%cholesky_use = cholesky_reduce
     162              : 
     163         6010 :       CALL timestop(handle)
     164              : 
     165         6010 :    END SUBROUTINE destroy_preconditioner
     166              : 
     167            0 : END MODULE preconditioner_types
     168              : 
        

Generated by: LCOV version 2.0-1