Sums blocks in a replicated dbcsr matrix, which has the same structure on all ranks.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_type), | intent(inout) | :: | matrix |
dbcsr matrix to operate on |
SUBROUTINE dbcsr_sum_replicated(matrix)
!! Sums blocks in a replicated dbcsr matrix, which has the same structure on all ranks.
TYPE(dbcsr_type), INTENT(inout) :: matrix
!! dbcsr matrix to operate on
CHARACTER(len=*), PARAMETER :: routineN = 'dbcsr_sum_replicated'
INTEGER :: comm, handle, index_checksum, mynode, &
numnodes
INTEGER, ALLOCATABLE, DIMENSION(:) :: all_checksums
TYPE(dbcsr_mp_obj) :: mp
! ---------------------------------------------------------------------------
CALL timeset(routineN, handle)
mp = dbcsr_distribution_mp(dbcsr_distribution(matrix))
comm = dbcsr_mp_group(mp)
numnodes = dbcsr_mp_numnodes(mp)
mynode = dbcsr_mp_mynode(mp)
!
ALLOCATE (all_checksums(numnodes))
CALL dbcsr_index_checksum(matrix, index_checksum)
CALL mp_allgather(index_checksum, all_checksums, comm)
!
IF (.NOT. ALL(all_checksums .EQ. index_checksum)) &
DBCSR_ABORT("Replicated matrices do not all have the same index structure.")
!
SELECT CASE (dbcsr_data_get_type(matrix%data_area))
CASE (dbcsr_type_real_4)
CALL mp_sum(matrix%data_area%d%r_sp, comm)
CASE (dbcsr_type_real_8)
CALL mp_sum(matrix%data_area%d%r_dp, comm)
CASE (dbcsr_type_complex_4)
CALL mp_sum(matrix%data_area%d%c_sp, comm)
CASE (dbcsr_type_complex_8)
CALL mp_sum(matrix%data_area%d%c_dp, comm)
CASE default
DBCSR_ABORT("Incorrect data type")
END SELECT
!
CALL timestop(handle)
END SUBROUTINE dbcsr_sum_replicated