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