mirror of https://gitlab.com/QEF/q-e.git
82 lines
2.1 KiB
Fortran
82 lines
2.1 KiB
Fortran
INTEGER FUNCTION NUMROC( 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
|
|
! =======
|
|
!
|
|
! NUMROC computes the NUMber of Rows Or Columns of a distributed
|
|
! matrix owned by the process indicated by IPROC.
|
|
!
|
|
! Arguments
|
|
! =========
|
|
!
|
|
! N (global input) INTEGER
|
|
! The number of rows/columns in distributed matrix.
|
|
!
|
|
! NB (global input) INTEGER
|
|
! Block size, size of the blocks the distributed matrix is
|
|
! split into.
|
|
!
|
|
! IPROC (local input) INTEGER
|
|
! The coordinate of the process whose local array row or
|
|
! column is 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 a process can have
|
|
!
|
|
NUMROC = (NBLOCKS/NPROCS) * NB
|
|
!
|
|
! See if there are any extra blocks
|
|
!
|
|
EXTRABLKS = MOD( NBLOCKS, NPROCS )
|
|
!
|
|
! If I have an extra block
|
|
!
|
|
IF( MYDIST.LT.EXTRABLKS ) THEN
|
|
NUMROC = NUMROC + NB
|
|
!
|
|
! If I have last block, it may be a partial block
|
|
!
|
|
ELSE IF( MYDIST.EQ.EXTRABLKS ) THEN
|
|
NUMROC = NUMROC + MOD( N, NB )
|
|
END IF
|
|
!
|
|
RETURN
|
|
!
|
|
! End of NUMROC
|
|
!
|
|
END
|