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