1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
***********************************************************************
*
* Auxiliary subroutine for eigenpair assignments
*
***********************************************************************
SUBROUTINE PMPIM2( IL, IU, NPROCS, PMYILS, PMYIUS )
IMPLICIT NONE
*
* -- ScaLAPACK auxiliary routine (version 2.0.2) --
* Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver
* May 1 2012
*
* .. Scalar Arguments ..
INTEGER PMYILS( * ), PMYIUS( * )
* ..
* .. Array Arguments ..
INTEGER IL, IU, M, NPROCS, PRCCTR
* ..
*
* Purpose
* =======
*
* PMPIM2 is the scheduling subroutine.
* It computes for all processors the eigenpair range assignments.
*
* Arguments
* =========
*
* IL, IU (input) INTEGER
* The range of eigenpairs to be computed
*
* NPROCS (input) INTEGER
* The total number of processors available
*
* PMYILS (output) INTEGER array
* For each processor p, PMYILS(p) is the index
* of the first eigenvalue in W to be computed
* PMYILS(p) equals zero if p stays idle
*
* PMYIUS (output) INTEGER array
* For each processor p, PMYIUS(p) is the index
* of the last eigenvalue in W to be computed
* PMYIUS(p) equals zero if p stays idle
*
* .. Executable Statements ..
M = IU - IL + 1
IF ( NPROCS.GT.M ) THEN
DO 10 PRCCTR = 0, NPROCS-1
IF ( PRCCTR.LT.M ) THEN
PMYILS(PRCCTR+1) = PRCCTR + IL
PMYIUS(PRCCTR+1) = PRCCTR + IL
ELSE
PMYILS(PRCCTR+1) = 0
PMYIUS(PRCCTR+1) = 0
END IF
10 CONTINUE
ELSE
DO 20 PRCCTR = 0, NPROCS-1
PMYILS(PRCCTR+1) = (PRCCTR * (M / NPROCS)) + IL
IF (PRCCTR.LT.MOD(M, NPROCS)) THEN
PMYILS(PRCCTR+1) = PMYILS(PRCCTR+1) + PRCCTR
PMYIUS(PRCCTR+1) = PMYILS(PRCCTR+1) + M / NPROCS
ELSE
PMYILS(PRCCTR+1) = PMYILS(PRCCTR+1) + MOD(M, NPROCS)
PMYIUS(PRCCTR+1) = PMYILS(PRCCTR+1) + M / NPROCS - 1
END IF
20 CONTINUE
END IF
RETURN
END
|