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