Determines mapping from local to global virtual process columns
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_imagedistribution_obj), | intent(inout) | :: | imgdist |
image distribution |
||
type(array_i1d_obj), | intent(out) | :: | local_vcols |
local columns |
||
integer, | intent(in) | :: | local_vpcol |
the local virtual process column |
SUBROUTINE dbcsr_get_local_vcols(imgdist, local_vcols, local_vpcol)
!! Determines mapping from local to global virtual process columns
TYPE(dbcsr_imagedistribution_obj), INTENT(INOUT) :: imgdist
!! image distribution
TYPE(array_i1d_obj), INTENT(OUT) :: local_vcols
!! local columns
INTEGER, INTENT(IN) :: local_vpcol
!! the local virtual process column
CHARACTER(len=*), PARAMETER :: routineN = 'dbcsr_get_local_vcols'
INTEGER :: el, error_handle, nvpcols, vpcol
INTEGER, ALLOCATABLE, DIMENSION(:) :: nle
INTEGER, DIMENSION(:), POINTER :: itmp, vcol_dist
IF (careful_mod) CALL timeset(routineN, error_handle)
! If the current local col mappings do not exist, create them.
IF (.NOT. imgdist%i%has_other_vl_cols) THEN
imgdist%i%has_other_vl_cols = .TRUE.
nvpcols = dbcsr_mp_npcols(dbcsr_distribution_mp(imgdist%i%main)) &
*imgdist%i%col_decimation
ALLOCATE (imgdist%i%other_vl_cols(0:nvpcols - 1))
ALLOCATE (nle(0:nvpcols - 1))
vcol_dist => array_data(imgdist%i%vcol_dist)
! Count the number of local elements per col.
nle(:) = 0
DO el = 1, SIZE(vcol_dist)
vpcol = vcol_dist(el)
nle(vpcol) = nle(vpcol) + 1
END DO
DO vpcol = 0, nvpcols - 1
ALLOCATE (itmp(nle(vpcol)))
itmp = 0
CALL array_new(imgdist%i%other_vl_cols(vpcol), &
itmp, lb=1)
DEALLOCATE (itmp)
END DO
DEALLOCATE (nle)
CALL find_all_local_elements(imgdist%i%other_vl_cols, vcol_dist, nvpcols)
ELSE
IF (careful_mod .AND. .NOT. ASSOCIATED(imgdist%i%other_vl_cols)) &
DBCSR_ABORT("Local cols mapping does not exist.")
END IF
local_vcols = imgdist%i%other_vl_cols(local_vpcol)
IF (careful_mod) CALL timestop(error_handle)
END SUBROUTINE dbcsr_get_local_vcols