Reputation: 41
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
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