NUMROC returns value of 0:
The following code, numroc returns 0 for the value of the number of columns for the local matrix Aloc(Mloc,Nloc) of a global matrix Aglb(M,N) for M=N=12,MB=NB=3 when run on 15 processes: (no error for other values on no processes 1<= np<=16)
> mpif77 -I/usr/lib/openmpi/lib/ bug.f90 -lscalapack-openmpi -lblacs-openmpi -lblacsF77init-openmpi
> mpirun -np 15 ./a.out | sort -n -k 5 | awk '$NF==0'
gives:
myrank MYPROW MYPCOL Mloc Nloc
4 0 4 ::: 6 0
9 1 4 ::: 3 0
14 2 4 ::: 3 0
The mpi/ScaLapack-2.0.2 are on Ubuntu 14.04 installed via
apt-get install libscalapack-mpi-dev scalapack-doc scalapack-mpi-test blacs-mpi-test
gcc/gfortran (Ubuntu 4.8.2-19ubuntu1) 4.8.2
!=========================================================================================
!bug.f90:
!======================================================================================
program testme
use mpi
implicit none
integer :: M,N,MB,NB
integer :: NPROCS,NPROW,NPCOL,MYPROW,MYPCOL,IPROW,IPCOL
integer :: myrank,CONTXT,IAM,info
integer,external :: blacs_pnum,numroc
integer :: Mloc,Nloc
!------------------------------------------
M =12;N =12; MB= 3;NB= 3
!------------------------------------------
call blacs_pinfo(myrank,NPROCS)
NPROW = INT(SQRT(REAL(NPROCS)))
NPCOL = NPROCS/NPROW
call blacs_get(0,0 ,CONTXT)
call blacs_gridinit(CONTXT,'Row',NPROW,NPCOL)
call blacs_gridinfo(CONTXT,NPROW,NPCOL,MYPROW,MYPCOL)
if((MYPROW>=NPROW).or.(MYPCOL>=NPCOL)) goto 10
if((MYPROW< 0 ).or.(MYPCOL< 0 )) goto 10
!local matrix size
Mloc= numroc(M,MB,MYPROW,0,NPROW)
Nloc= numroc(N,NB,MYPCOL,0,NPCOL)
print *,'#loc',NPROCS,NPROW,NPCOL,myrank,MYPROW,MYPCOL,' ::: ',Mloc,Nloc
10 continue
call blacs_exit(0)
end program testme

