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