christophe petit wrote:

i'm studying the parallelized version of a solving 2D heat equation code in order to understand cartesian topology and the famous "MPI_CART_SHIFT".
Here's my problem at this part of the code :


-------------------------------------------------------------------------------------------------------------------------------------------
call MPI_INIT(infompi)
      comm = MPI_COMM_WORLD
      call MPI_COMM_SIZE(comm,nproc,infompi)
      call MPI_COMM_RANK(comm,me,infompi)
!

......


! Create 2D cartesian grid
      periods(:) = .false.

      ndims = 2
      dims(1)=x_domains
      dims(2)=y_domains
      CALL MPI_CART_CREATE(MPI_COMM_WORLD, ndims, dims, periods, &
        reorganisation,comm2d,infompi)
!
! Identify neighbors
!
      NeighBor(:) = MPI_PROC_NULL
! Left/West and right/Est neigbors
      CALL MPI_CART_SHIFT(comm2d,0,1,NeighBor(W),NeighBor(E),infompi)
print *,'rank=', me
      print *, 'here first mpi_cart_shift : neighbor(w)=',NeighBor(W)
      print *, 'here first mpi_cart_shift : neighbor(e)=',NeighBor(E)

...

-------------------------------------------------------------------------------------------------------------------------------------------

with x_domains=y_domains=2

and i get at the execution :" mpirun -np 4 ./explicitPar"

 rank=           0
here first mpi_cart_shift : neighbor(w)=          -1
 here first  mpi_cart_shift : neighbor(e)=           2
rank=           3
 here first mpi_cart_shift : neighbor(w)=           1
 here first mpi_cart_shift : neighbor(e)=          -1
 rank=           2
 here first mpi_cart_shift : neighbor(w)=           0
 here first mpi_cart_shift : neighbor(e)=          -1
 rank=           1
 here first mpi_cart_shift : neighbor(w)=          -1
 here first mpi_cart_shift : neighbor(e)=           3

I saw that if the rank is out of the topology and wihtout periodicity, the rank should be equal to MPI_UNDEFINED whis is assigned to -32766 in "mpif.h" . So, why have i got the value "-1" ?
On my Macbook pro, i get the value "-2".

It seems to me the man page says MPI_PROC_NULL may be returned, and in OMPI that looks like -2. Can you try the following:

% cat x.f90
 include "mpif.h"

 integer comm, dims(2)
 logical periods(2)

 call MPI_INIT(ier)
 ndims = 2
 dims(1)=2;  periods(1) = .false.
 dims(2)=2;  periods(2) = .false.
CALL MPI_CART_CREATE(MPI_COMM_WORLD, ndims, dims, periods, .false., comm, ier)
 CALL MPI_CART_SHIFT(comm, 0, 1, iwest, ieast, ier)
 write(6,*) iwest, ieast, MPI_PROC_NULL
 call MPI_Finalize(ier)
end
% mpif90 x.f90
% mpirun -n 4 ./a.out
1 -2 -2
-2 2 -2
-2 3 -2
0 -2 -2

Reply via email to