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 :: handle, index_checksum, mynode, & numnodes INTEGER, ALLOCATABLE, DIMENSION(:) :: all_checksums TYPE(dbcsr_mp_obj) :: mp TYPE(mp_comm_type) :: comm ! --------------------------------------------------------------------------- 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