INTEGER FUNCTION NPREROC( N, NB, IPROC, ISRCPROC, NPROCS )
*
* -- ScaLAPACK tools routine (version 1.5) --
* University of Tennessee, Knoxville, Oak Ridge National Laboratory, * and University of California, Berkeley. * May 1, 1997 * * .. Scalar Arguments .. INTEGER IPROC, ISRCPROC, N, NB, NPROCS * ..
*
* Purpose
* N (global input) INTEGER * The number of rows or columns in the distributed matrix. * * NB (global input) INTEGER * Block size, size of the blocks the distributed matrix is * split into. * * IPROC (local intput) INTEGER * The coordinate of the process whose preceeding distributed * matrix rows or columns are to be determined.
*
* ISRCPROC (global input) INTEGER
* The coordinate of the process that possesses the first * row or column of the distributed matrix.
*
* NPROCS (global input) INTEGER
* The total number processes over which the matrix is * distributed.
*
* .. Local Scalars .. INTEGER EXTRABLKS, MYDIST, NBLOCKS * .. * .. Intrinsic Functions .. INTRINSIC MOD * .. * .. Executable Statements .. * * Figure PROC's distance from source process * MYDIST = MOD( NPROCS+IPROC-ISRCPROC, NPROCS ) * * Figure the total number of whole NB blocks N is split up into * NBLOCKS = N / NB * * Figure the minimum number of rows/cols previous processes could have * NPREROC = (NBLOCKS/NPROCS) * NB * MYDIST * * See if there are any extra blocks * EXTRABLKS = MOD( NBLOCKS, NPROCS ) * * If I have an extra block, all processes in front of me got one too * IF( MYDIST.LE.EXTRABLKS ) THEN NPREROC = NPREROC + NB*MYDIST * * If I have don't have an extra block, add in extra blocks of * preceeding processes and the partial block, if it exists * ELSE NPREROC = NPREROC + EXTRABLKS*NB + MOD( N, NB ) END IF * RETURN * * End of NPREROC * END