Suganthi Selvaraj
Suganthi Selvaraj

Reputation: 41

MPI Status FORTRAN

I have this code but I get this error.

I tried declaring status as

INTEGER :: status

but that changes the value of my rank after the MPI_SENDRECV (i.e. the rank=0 for all processors)

PROGRAM testsendrecv
  IMPLICIT NONE

  INTEGER :: i, k, nx, nz
  INTEGER :: ierror, comm, p, rank, npr, prev
  INTEGER :: status(MPI_STATUS_SIZE)
  REAL(KIND = 8), ALLOCATABLE :: A(:,:), B(:), C(:)

  include 'mpif.h'

  nx = 5
  nz = 5

  ALLOCATE(A(nx,nz), B(nx))

  CALL MPI_INIT(ierror)
  comm = MPI_COMM_WORLD
  !Get rank
  CALL MPI_COMM_RANK(comm, rank, ierror)
  !Get number of processors
  CALL MPI_COMM_SIZE(comm, p, ierror)

  A(:,:) = rank

  IF(rank==0) THEN
     prev = p-1
  ELSE
     prev = rank-1
  END IF


  CALL MPI_SENDRECV(A(:,1), nx, MPI_DOUBLE_PRECISION, MOD(rank+1,p), 1,  &
       B(:), nx, MPI_DOUBLE_PRECISION, prev, 1, comm, status, ierror)

  WRITE(*,*) rank
  WRITE(*,*) B(1)

  CALL MPI_FINALIZE(ierror)

END PROGRAM testsendrecv

The above code gives me the following error

bash-4.1$ mpif90 testsendr.f90
mpif.h:79.35:
    Included at testsendr.f90:9:

       PARAMETER (MPI_STATUS_SIZE=5)
                                   1
Error: VARIABLE attribute of 'mpi_status_size' conflicts with PARAMETER attribute at (1)
mpif.h:80.33:
    Included at testsendr.f90:9:

       INTEGER MPI_STATUS_IGNORE(MPI_STATUS_SIZE)
                                 1
Error: Variable 'mpi_status_size' cannot appear in the expression at (1)
mpif.h:80.49:
    Included at testsendr.f90:9:

       INTEGER MPI_STATUS_IGNORE(MPI_STATUS_SIZE)
                                                 1
Error: The module or main program array 'mpi_status_ignore' at (1) must have constant shape
mpif.h:81.35:
    Included at testsendr.f90:9:

       INTEGER MPI_STATUSES_IGNORE(MPI_STATUS_SIZE,1)
                                   1
Error: Variable 'mpi_status_size' cannot appear in the expression at (1)
mpif.h:81.53:
    Included at testsendr.f90:9:

       INTEGER MPI_STATUSES_IGNORE(MPI_STATUS_SIZE,1)
                                                     1
Error: The module or main program array 'mpi_statuses_ignore' at (1) must have constant shape
testsendr.f90:6.20:

  INTEGER :: status(MPI_STATUS_SIZE)
                    1
Error: Variable 'mpi_status_size' cannot appear in the expression at (1)
testsendr.f90:6.36:

  INTEGER :: status(MPI_STATUS_SIZE)
                                    1
Error: The module or main program array 'status' at (1) must have constant shape

Any thoughts. It is a really simple program.

Thanks

Upvotes: 3

Views: 4242

Answers (1)

High Performance Mark
High Performance Mark

Reputation: 78354

I think that your problems arise from a mis-ordering of statements in your program. Before the line

include mpif.h

you have declared a variable which makes use of one of the constants defined in that file, in the line

INTEGER :: status(MPI_STATUS_SIZE)

Either move the include statement to immediately after the IMPLICIT NONE or, better, drop the include altogether and insert USE MPI prior to the implicit statement and sort out the linking of the revised code.

Upvotes: 4

Related Questions