Determines mapping from local to global rows
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_distribution_obj), | intent(inout) | :: | dist |
mapping for this distribution |
||
type(array_i1d_obj), | intent(out) | :: | local_rows |
local elements for specified row |
||
integer, | intent(in) | :: | local_prow |
find local elements for this local row |
SUBROUTINE dbcsr_get_local_rows(dist, local_rows, local_prow) !! Determines mapping from local to global rows TYPE(dbcsr_distribution_obj), INTENT(INOUT) :: dist !! mapping for this distribution TYPE(array_i1d_obj), INTENT(OUT) :: local_rows !! local elements for specified row INTEGER, INTENT(IN) :: local_prow !! find local elements for this local row CHARACTER(len=*), PARAMETER :: routineN = 'dbcsr_get_local_rows' INTEGER :: el, error_handle, nprows, prow INTEGER, ALLOCATABLE, DIMENSION(:) :: nle INTEGER, DIMENSION(:), POINTER :: itmp, row_dist CALL timeset(routineN, error_handle) ! If the current local row mappings do not exist, create them. IF (.NOT. dist%d%has_other_l_rows) THEN dist%d%has_other_l_rows = .TRUE. nprows = dbcsr_mp_nprows(dbcsr_distribution_mp(dist)) ALLOCATE (dist%d%other_l_rows(0:dbcsr_mp_nprows(dist%d%mp_env) - 1)) ALLOCATE (nle(0:nprows - 1)) row_dist => dbcsr_distribution_row_dist(dist) ! Count the number of local elements per row. nle(:) = 0 DO el = 1, SIZE(row_dist) prow = row_dist(el) nle(prow) = nle(prow) + 1 END DO DO prow = 0, nprows - 1 ALLOCATE (itmp(nle(prow))) itmp = 0 CALL array_new(dist%d%other_l_rows(prow), & itmp, lb=1) DEALLOCATE (itmp) END DO DEALLOCATE (nle) CALL find_all_local_elements(dist%d%other_l_rows, row_dist, nprows) ELSE IF (careful_mod .AND. .NOT. ASSOCIATED(dist%d%other_l_rows)) & DBCSR_ABORT("Local rows mapping does not exist.") END IF local_rows = dist%d%other_l_rows(local_prow) CALL timestop(error_handle) END SUBROUTINE dbcsr_get_local_rows