LCOV - code coverage report
Current view: top level - src - task_list_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:50c68ef) Lines: 98.9 % 88 87
Test Date: 2026-10-22 00:56:13 Functions: 55.6 % 9 5

            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 for task lists
      10              : !> \par History
      11              : !>      01.2008 [Joost VandeVondele] refactered out of qs_collocate / qs_integrate
      12              : !> \author Joost VandeVondele
      13              : ! **************************************************************************************************
      14              : MODULE task_list_types
      15              :    USE grid_api,                        ONLY: grid_basis_set_type,&
      16              :                                               grid_free_basis_set,&
      17              :                                               grid_free_task_list,&
      18              :                                               grid_task_list_type
      19              :    USE kinds,                           ONLY: dp,&
      20              :                                               int_8
      21              :    USE offload_api,                     ONLY: offload_buffer_type,&
      22              :                                               offload_free_buffer
      23              : #include "./base/base_uses.f90"
      24              : 
      25              :    IMPLICIT NONE
      26              : 
      27              :    PRIVATE
      28              : 
      29              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'task_list_types'
      30              : 
      31              :    TYPE task_type
      32              :       INTEGER                                       :: destination = 0
      33              :       INTEGER                                       :: source = 0
      34              :       INTEGER                                       :: dist_type = 0
      35              :       INTEGER                                       :: cost = 0
      36              :       INTEGER                                       :: subpatch_pattern = 0
      37              :       INTEGER                                       :: grid_level = 0
      38              :       INTEGER                                       :: image = 0
      39              :       INTEGER                                       :: iatom = 0
      40              :       INTEGER                                       :: jatom = 0
      41              :       INTEGER                                       :: iset = 0
      42              :       INTEGER                                       :: jset = 0
      43              :       INTEGER                                       :: ipgf = 0
      44              :       INTEGER                                       :: jpgf = 0
      45              :       INTEGER                                       :: pair_index = 0
      46              : 
      47              :       REAL(KIND=dp), DIMENSION(3)                   :: rab = 0.0_dp
      48              :       REAL(KIND=dp)                                 :: radius = 0.0_dp
      49              :    END TYPE task_type
      50              : 
      51              :    TYPE atom_pair_type
      52              :       INTEGER                                       :: rank = 0
      53              :       INTEGER                                       :: row = 0
      54              :       INTEGER                                       :: col = 0
      55              :       INTEGER                                       :: image = 0
      56              :    END TYPE atom_pair_type
      57              : 
      58              :    TYPE task_list_type
      59              :       TYPE(task_type), DIMENSION(:), POINTER        :: tasks => Null()
      60              :       INTEGER                                       :: ntasks = 0
      61              :       INTEGER, DIMENSION(:, :), POINTER             :: taskstart => Null(), taskstop => Null()
      62              :       INTEGER, DIMENSION(:), POINTER                :: npairs => Null()
      63              : 
      64              :       TYPE(atom_pair_type), DIMENSION(:), POINTER   :: atom_pair_send => Null()
      65              :       INTEGER, DIMENSION(:), POINTER                :: pair_offsets_send => Null()
      66              :       INTEGER, DIMENSION(:), POINTER                :: rank_offsets_send => Null()
      67              :       INTEGER, DIMENSION(:), POINTER                :: rank_sizes_send => Null()
      68              :       INTEGER                                       :: buffer_size_send = 0
      69              : 
      70              :       TYPE(atom_pair_type), DIMENSION(:), POINTER   :: atom_pair_recv => Null()
      71              :       INTEGER, DIMENSION(:), POINTER                :: pair_offsets_recv => Null()
      72              :       INTEGER, DIMENSION(:), POINTER                :: rank_offsets_recv => Null()
      73              :       INTEGER, DIMENSION(:), POINTER                :: rank_sizes_recv => Null()
      74              :       INTEGER                                       :: buffer_size_recv = 0
      75              : 
      76              :       ! Owner-side contributions grouped by destination block for matrix unpacking.
      77              :       INTEGER, ALLOCATABLE                          :: unpack_block_starts(:), unpack_pair_indices(:)
      78              : 
      79              :       TYPE(grid_basis_set_type), DIMENSION(:), POINTER :: grid_basis_sets => Null()
      80              :       TYPE(grid_task_list_type)                     :: grid_task_list = grid_task_list_type()
      81              :       TYPE(offload_buffer_type)                     :: pab_buffer = offload_buffer_type()
      82              :       TYPE(offload_buffer_type)                     :: hab_buffer = offload_buffer_type()
      83              :    END TYPE task_list_type
      84              : 
      85              :    INTEGER, PARAMETER                               :: task_size_in_int8 = 17
      86              : 
      87              :    PUBLIC :: task_type, atom_pair_type, task_list_type
      88              :    PUBLIC :: task_size_in_int8, serialize_task, deserialize_task
      89              :    PUBLIC :: allocate_task_list, deallocate_task_list, reallocate_tasks
      90              : 
      91              : CONTAINS
      92              : 
      93              : ! **************************************************************************************************
      94              : !> \brief allocates and initialised the components of the task_list_type
      95              : !> \param task_list ...
      96              : !> \par History
      97              : !>      01.2008 created [Joost VandeVondele]
      98              : ! **************************************************************************************************
      99        10457 :    SUBROUTINE allocate_task_list(task_list)
     100              :       TYPE(task_list_type), POINTER                      :: task_list
     101              : 
     102        10457 :       ALLOCATE (task_list)
     103              : 
     104              :       NULLIFY (task_list%tasks)
     105              :       NULLIFY (task_list%atom_pair_send)
     106              :       NULLIFY (task_list%atom_pair_recv)
     107              :       NULLIFY (task_list%taskstart)
     108              :       NULLIFY (task_list%taskstop)
     109              :       NULLIFY (task_list%npairs)
     110              :       task_list%ntasks = 0
     111        10457 :    END SUBROUTINE allocate_task_list
     112              : 
     113              : ! **************************************************************************************************
     114              : !> \brief Grow an array of tasks while preserving the existing entries.
     115              : !> \param tasks ...
     116              : !> \param new_size ...
     117              : !> \author Ole Schuett
     118              : ! **************************************************************************************************
     119        14089 :    SUBROUTINE reallocate_tasks(tasks, new_size)
     120              :       TYPE(task_type), DIMENSION(:), INTENT(inout), &
     121              :          POINTER                                         :: tasks
     122              :       INTEGER, INTENT(in)                                :: new_size
     123              : 
     124        14089 :       TYPE(task_type), DIMENSION(:), POINTER             :: old_tasks
     125              : 
     126        14089 :       IF (.NOT. ASSOCIATED(tasks)) THEN
     127     25562458 :          ALLOCATE (tasks(new_size))
     128        12743 :          RETURN
     129              :       END IF
     130              : 
     131         1346 :       IF (new_size <= SIZE(tasks)) RETURN
     132              : 
     133         1346 :       old_tasks => tasks
     134         1346 :       NULLIFY (tasks)
     135              : 
     136     13158020 :       ALLOCATE (tasks(new_size))
     137     10459290 :       tasks(1:SIZE(old_tasks)) = old_tasks(:)
     138         1346 :       DEALLOCATE (old_tasks)
     139        14089 :    END SUBROUTINE reallocate_tasks
     140              : 
     141              : ! **************************************************************************************************
     142              : !> \brief deallocates the components and the object itself
     143              : !> \param task_list ...
     144              : !> \par History
     145              : !>      01.2008 created [Joost VandeVondele]
     146              : ! **************************************************************************************************
     147        10456 :    SUBROUTINE deallocate_task_list(task_list)
     148              :       TYPE(task_list_type), POINTER                      :: task_list
     149              : 
     150              :       INTEGER                                            :: i
     151              : 
     152        10456 :       IF (ASSOCIATED(task_list%tasks)) THEN
     153        10456 :          DEALLOCATE (task_list%tasks)
     154              :       END IF
     155        10456 :       IF (ASSOCIATED(task_list%taskstart)) THEN
     156        10456 :          DEALLOCATE (task_list%taskstart)
     157              :       END IF
     158        10456 :       IF (ASSOCIATED(task_list%taskstop)) THEN
     159        10456 :          DEALLOCATE (task_list%taskstop)
     160              :       END IF
     161        10456 :       IF (ASSOCIATED(task_list%npairs)) THEN
     162        10456 :          DEALLOCATE (task_list%npairs)
     163              :       END IF
     164              : 
     165        10456 :       IF (ASSOCIATED(task_list%atom_pair_send)) THEN
     166           22 :          DEALLOCATE (task_list%atom_pair_send)
     167              :       END IF
     168        10456 :       IF (ASSOCIATED(task_list%pair_offsets_send)) THEN
     169           22 :          DEALLOCATE (task_list%pair_offsets_send)
     170              :       END IF
     171        10456 :       IF (ASSOCIATED(task_list%rank_offsets_send)) THEN
     172           22 :          DEALLOCATE (task_list%rank_offsets_send)
     173              :       END IF
     174        10456 :       IF (ASSOCIATED(task_list%rank_sizes_send)) THEN
     175           22 :          DEALLOCATE (task_list%rank_sizes_send)
     176              :       END IF
     177              : 
     178        10456 :       IF (ASSOCIATED(task_list%atom_pair_recv)) THEN
     179        10456 :          DEALLOCATE (task_list%atom_pair_recv)
     180              :       END IF
     181        10456 :       IF (ASSOCIATED(task_list%pair_offsets_recv)) THEN
     182        10456 :          DEALLOCATE (task_list%pair_offsets_recv)
     183              :       END IF
     184        10456 :       IF (ASSOCIATED(task_list%rank_offsets_recv)) THEN
     185        10456 :          DEALLOCATE (task_list%rank_offsets_recv)
     186              :       END IF
     187        10456 :       IF (ASSOCIATED(task_list%rank_sizes_recv)) THEN
     188        10456 :          DEALLOCATE (task_list%rank_sizes_recv)
     189              :       END IF
     190        10456 :       CALL grid_free_task_list(task_list%grid_task_list)
     191        10456 :       CALL offload_free_buffer(task_list%pab_buffer)
     192        10456 :       CALL offload_free_buffer(task_list%hab_buffer)
     193        10456 :       IF (ASSOCIATED(task_list%grid_basis_sets)) THEN
     194        28615 :          DO i = 1, SIZE(task_list%grid_basis_sets)
     195        28615 :             CALL grid_free_basis_set(task_list%grid_basis_sets(i))
     196              :          END DO
     197        10456 :          DEALLOCATE (task_list%grid_basis_sets)
     198              :       END IF
     199              : 
     200        10456 :       DEALLOCATE (task_list)
     201        10456 :    END SUBROUTINE deallocate_task_list
     202              : 
     203              : ! **************************************************************************************************
     204              : !> \brief Serialize a task into an integer array. Used for MPI communication.
     205              : !> \param task ...
     206              : !> \param serialized_task ...
     207              : !> \author Ole Schuett
     208              : ! **************************************************************************************************
     209         3846 :    SUBROUTINE serialize_task(task, serialized_task)
     210              :       TYPE(task_type), INTENT(IN)                        :: task
     211              :       INTEGER(KIND=int_8), &
     212              :          DIMENSION(task_size_in_int8), INTENT(OUT)       :: serialized_task
     213              : 
     214         3846 :       serialized_task(1) = task%destination
     215         3846 :       serialized_task(2) = task%source
     216         3846 :       serialized_task(3) = task%dist_type
     217         3846 :       serialized_task(4) = task%cost
     218         3846 :       serialized_task(5) = task%subpatch_pattern
     219              : 
     220         3846 :       serialized_task(6) = task%grid_level
     221         3846 :       serialized_task(7) = task%image
     222         3846 :       serialized_task(8) = task%iatom
     223         3846 :       serialized_task(9) = task%jatom
     224         3846 :       serialized_task(10) = task%iset
     225         3846 :       serialized_task(11) = task%jset
     226         3846 :       serialized_task(12) = task%ipgf
     227         3846 :       serialized_task(13) = task%jpgf
     228              : 
     229         3846 :       serialized_task(14) = TRANSFER(task%rab(1), mold=1_int_8)
     230         3846 :       serialized_task(15) = TRANSFER(task%rab(2), mold=1_int_8)
     231         3846 :       serialized_task(16) = TRANSFER(task%rab(3), mold=1_int_8)
     232         3846 :       serialized_task(17) = TRANSFER(task%radius, mold=1_int_8)
     233         3846 :    END SUBROUTINE serialize_task
     234              : 
     235              : ! **************************************************************************************************
     236              : !> \brief De-serialize a task from an integer array. Used for MPI communication.
     237              : !> \param task ...
     238              : !> \param serialized_task ...
     239              : !> \author Ole Schuett
     240              : ! **************************************************************************************************
     241        15384 :    SUBROUTINE deserialize_task(task, serialized_task)
     242              :       TYPE(task_type), INTENT(OUT)                       :: task
     243              :       INTEGER(KIND=int_8), &
     244              :          DIMENSION(task_size_in_int8), INTENT(IN)        :: serialized_task
     245              : 
     246         3846 :       task%destination = INT(serialized_task(1))
     247         3846 :       task%source = INT(serialized_task(2))
     248         3846 :       task%dist_type = INT(serialized_task(3))
     249         3846 :       task%cost = INT(serialized_task(4))
     250         3846 :       task%subpatch_pattern = INT(serialized_task(5))
     251              : 
     252         3846 :       task%grid_level = INT(serialized_task(6))
     253         3846 :       task%image = INT(serialized_task(7))
     254         3846 :       task%iatom = INT(serialized_task(8))
     255         3846 :       task%jatom = INT(serialized_task(9))
     256         3846 :       task%iset = INT(serialized_task(10))
     257         3846 :       task%jset = INT(serialized_task(11))
     258         3846 :       task%ipgf = INT(serialized_task(12))
     259         3846 :       task%jpgf = INT(serialized_task(13))
     260              : 
     261         3846 :       task%rab(1) = TRANSFER(serialized_task(14), mold=1.0_dp)
     262         3846 :       task%rab(2) = TRANSFER(serialized_task(15), mold=1.0_dp)
     263         3846 :       task%rab(3) = TRANSFER(serialized_task(16), mold=1.0_dp)
     264         3846 :       task%radius = TRANSFER(serialized_task(17), mold=1.0_dp)
     265         3846 :    END SUBROUTINE deserialize_task
     266              : 
     267            0 : END MODULE task_list_types
        

Generated by: LCOV version 2.0-1