LCOV - code coverage report
Current view: top level - src/dbt - dbt_matrix_redistribution.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:9ccafda) Lines: 100.0 % 32 32
Test Date: 2026-10-15 00:55:44 Functions: 100.0 % 3 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 Redistribute matrices between full-matrix and tensor process layouts.
      10              : ! **************************************************************************************************
      11              : MODULE dbt_matrix_redistribution
      12              :    USE cp_dbcsr_api,                    ONLY: dbcsr_filter,&
      13              :                                               dbcsr_p_type,&
      14              :                                               dbcsr_set,&
      15              :                                               dbcsr_type
      16              :    USE cp_dbcsr_operations,             ONLY: copy_dbcsr_to_fm,&
      17              :                                               copy_fm_to_dbcsr
      18              :    USE cp_dbcsr_redistribution,         ONLY: cp_dbcsr_from_subgroups,&
      19              :                                               cp_dbcsr_to_subgroups
      20              :    USE cp_fm_types,                     ONLY: cp_fm_type
      21              :    USE dbt_api,                         ONLY: dbt_clear,&
      22              :                                               dbt_copy,&
      23              :                                               dbt_copy_matrix_to_tensor,&
      24              :                                               dbt_copy_tensor_to_matrix,&
      25              :                                               dbt_create,&
      26              :                                               dbt_destroy,&
      27              :                                               dbt_type
      28              :    USE kinds,                           ONLY: dp
      29              :    USE message_passing,                 ONLY: mp_para_env_type
      30              : #include "../base/base_uses.f90"
      31              : 
      32              :    IMPLICIT NONE
      33              :    PRIVATE
      34              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'dbt_matrix_redistribution'
      35              :    PUBLIC :: cp_fm_to_dbt, cp_dbt_to_dbcsr, cp_dbt_to_fm
      36              : 
      37              : CONTAINS
      38              : 
      39              : ! **************************************************************************************************
      40              : !> \brief ...
      41              : !> \param fm_global ...
      42              : !> \param mat_global ...
      43              : !> \param mat_local ...
      44              : !> \param tensor ...
      45              : !> \param para_env communicator covering the full matrix and all subgroups
      46              : !> \param num_pe_sub number of ranks per subgroup
      47              : !> \param eps_filter DBCSR filtering threshold before subgroup distribution
      48              : !> \param block_row_ranges ...
      49              : ! **************************************************************************************************
      50        12744 :    SUBROUTINE cp_fm_to_dbt(fm_global, mat_global, mat_local, tensor, para_env, num_pe_sub, eps_filter, block_row_ranges)
      51              : 
      52              :       TYPE(cp_fm_type)                                   :: fm_global
      53              :       TYPE(dbcsr_type)                                   :: mat_global, mat_local
      54              :       TYPE(dbt_type)                                     :: tensor
      55              :       TYPE(mp_para_env_type), INTENT(IN), POINTER        :: para_env
      56              :       INTEGER, INTENT(IN)                                :: num_pe_sub
      57              :       REAL(KIND=dp), INTENT(IN)                          :: eps_filter
      58              :       INTEGER, DIMENSION(:, :), OPTIONAL                 :: block_row_ranges
      59              : 
      60              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'cp_fm_to_dbt'
      61              : 
      62              :       INTEGER                                            :: handle
      63       114696 :       TYPE(dbt_type)                                     :: tensor_tmp
      64              : 
      65        12744 :       CALL timeset(routineN, handle)
      66              : 
      67        12744 :       CALL dbt_clear(tensor)
      68        12744 :       CALL copy_fm_to_dbcsr(fm_global, mat_global, keep_sparsity=.FALSE.)
      69        12744 :       CALL dbcsr_filter(mat_global, eps_filter)
      70        17728 :       CALL cp_dbcsr_to_subgroups(mat_global, mat_local, para_env, num_pe_sub, block_row_ranges)
      71        12744 :       CALL dbt_create(mat_local, tensor_tmp)
      72        12744 :       CALL dbt_copy_matrix_to_tensor(mat_local, tensor_tmp)
      73        12744 :       CALL dbt_copy(tensor_tmp, tensor, move_data=.TRUE.)
      74        12744 :       CALL dbt_destroy(tensor_tmp)
      75        12744 :       CALL dbcsr_set(mat_local, 0.0_dp)
      76        12744 :       CALL dbcsr_filter(mat_local, 1.0_dp)
      77              : 
      78        12744 :       CALL timestop(handle)
      79              : 
      80        12744 :    END SUBROUTINE cp_fm_to_dbt
      81              : 
      82              : ! **************************************************************************************************
      83              : !> \brief ...
      84              : !> \param tensor ...
      85              : !> \param mat_tensor ...
      86              : !> \param mat_global ...
      87              : !> \param para_env ...
      88              : ! **************************************************************************************************
      89         7358 :    SUBROUTINE cp_dbt_to_dbcsr(tensor, mat_tensor, mat_global, para_env)
      90              : 
      91              :       TYPE(dbt_type)                                     :: tensor
      92              :       TYPE(dbcsr_type)                                   :: mat_tensor, mat_global
      93              :       TYPE(mp_para_env_type), POINTER                    :: para_env
      94              : 
      95              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'cp_dbt_to_dbcsr'
      96              : 
      97              :       INTEGER                                            :: handle
      98              : 
      99         7358 :       CALL timeset(routineN, handle)
     100              : 
     101         7358 :       CALL dbt_copy_tensor_to_matrix(tensor, mat_tensor)
     102         7358 :       CALL dbt_clear(tensor)
     103              :       ! the next para_env%sync is not mandatory, but it makes the timing output
     104              :       ! of cp_dbcsr_from_subgroups correct
     105         7358 :       CALL para_env%sync()
     106         7358 :       CALL cp_dbcsr_from_subgroups(mat_tensor, mat_global, para_env)
     107              : 
     108         7358 :       CALL timestop(handle)
     109              : 
     110         7358 :    END SUBROUTINE cp_dbt_to_dbcsr
     111              : 
     112              : ! **************************************************************************************************
     113              : !> \brief ...
     114              : !> \param t_R ...
     115              : !> \param fm_R ...
     116              : !> \param mat_global ...
     117              : !> \param mat_local ...
     118              : !> \param para_env ...
     119              : ! **************************************************************************************************
     120          328 :    SUBROUTINE cp_dbt_to_fm(t_R, fm_R, mat_global, mat_local, para_env)
     121              :       TYPE(dbt_type), DIMENSION(:)                       :: t_R
     122              :       TYPE(cp_fm_type), DIMENSION(:)                     :: fm_R
     123              :       TYPE(dbcsr_p_type)                                 :: mat_global, mat_local
     124              :       TYPE(mp_para_env_type), INTENT(IN), POINTER        :: para_env
     125              : 
     126              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'cp_dbt_to_fm'
     127              : 
     128              :       INTEGER                                            :: handle, i_cell, n_images
     129              : 
     130          328 :       CALL timeset(routineN, handle)
     131              : 
     132          328 :       n_images = SIZE(t_R)
     133              : 
     134          328 :       CPASSERT(n_images == SIZE(fm_R))
     135              : 
     136         3280 :       DO i_cell = 1, n_images
     137              :          CALL cp_dbt_to_dbcsr(t_R(i_cell), mat_local%matrix, mat_global%matrix, &
     138         2952 :                               para_env)
     139         3280 :          CALL copy_dbcsr_to_fm(mat_global%matrix, fm_R(i_cell))
     140              :       END DO
     141              : 
     142          328 :       CALL timestop(handle)
     143              : 
     144          328 :    END SUBROUTINE cp_dbt_to_fm
     145              : 
     146              : END MODULE dbt_matrix_redistribution
        

Generated by: LCOV version 2.0-1