quantum-espresso/flib/npreroc.f

86 lines
2.4 KiB
Fortran

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
* =======
*
* NPREROC computes the Number of PREceeding Rows Or Columns of a
* distributed matrix that are possessed by processes closer to
* ISRCPROC than IPROC. Therefore, if ISRCPROC=0 and IPROC=4, then
* NPREROC returns the number of distributed matrix rows or columns
* owned by processes 0, 1, 2, and 3.
*
* Arguments
* =========
*
* 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