Blame test/mpi/f77/pt2pt/allpairf.f

Packit 0848f5
C -*- Mode: Fortran; -*- 
Packit 0848f5
C
Packit 0848f5
C  (C) 2012 by Argonne National Laboratory.
Packit 0848f5
C      See COPYRIGHT in top-level directory.
Packit 0848f5
C
Packit 0848f5
C This program is based on the allpair.f test from the MPICH-1 test
Packit 0848f5
C (test/pt2pt/allpair.f), which in turn was inspired by a bug report from
Packit 0848f5
C fsset@corelli.lerc.nasa.gov (Scott Townsend)
Packit 0848f5
Packit 0848f5
      program allpair
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer ierr, errs, comm
Packit 0848f5
      logical mtestGetIntraComm
Packit 0848f5
      logical verbose
Packit 0848f5
      common /flags/ verbose
Packit 0848f5
      
Packit 0848f5
      errs = 0
Packit 0848f5
      verbose = .false.
Packit 0848f5
C      verbose = .true.
Packit 0848f5
      call MTest_Init( ierr )
Packit 0848f5
Packit 0848f5
      do while ( mtestGetIntraComm( comm, 2, .false. ) )
Packit 0848f5
         call test_pair_send( comm, errs )
Packit 0848f5
         call test_pair_ssend( comm, errs )
Packit 0848f5
         call test_pair_rsend( comm, errs )
Packit 0848f5
         call test_pair_isend( comm, errs )
Packit 0848f5
         call test_pair_irsend( comm, errs )
Packit 0848f5
         call test_pair_issend( comm, errs )
Packit 0848f5
         call test_pair_psend( comm, errs )
Packit 0848f5
         call test_pair_prsend( comm, errs )
Packit 0848f5
         call test_pair_pssend( comm, errs )
Packit 0848f5
         call test_pair_sendrecv( comm, errs )
Packit 0848f5
         call test_pair_sendrecvrepl( comm, errs )
Packit 0848f5
         call mtestFreeComm( comm )
Packit 0848f5
      enddo
Packit 0848f5
C         
Packit 0848f5
      call MTest_Finalize( errs )
Packit 0848f5
      call MPI_Finalize(ierr)
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
      subroutine test_pair_send( comm, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer comm, errs
Packit 0848f5
      integer rank, size, ierr, next, prev, tag, count
Packit 0848f5
      integer TEST_SIZE
Packit 0848f5
      parameter (TEST_SIZE=2000)
Packit 0848f5
      integer status(MPI_STATUS_SIZE)
Packit 0848f5
      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
Packit 0848f5
      logical verbose
Packit 0848f5
      common /flags/ verbose
Packit 0848f5
C
Packit 0848f5
      if (verbose) then
Packit 0848f5
         print *, ' Send and recv'
Packit 0848f5
      endif
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      next = rank + 1
Packit 0848f5
      if (next .ge. size) next = 0
Packit 0848f5
C
Packit 0848f5
      prev = rank - 1
Packit 0848f5
      if (prev .lt. 0) prev = size - 1
Packit 0848f5
C
Packit 0848f5
      tag = 1123
Packit 0848f5
      count = TEST_SIZE / 5
Packit 0848f5
C
Packit 0848f5
      call clear_test_data(recv_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
      if (rank .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call init_test_data(send_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
         call MPI_Send(send_buf, count, MPI_REAL, next, tag,
Packit 0848f5
     .        comm, ierr) 
Packit 0848f5
C
Packit 0848f5
         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm, status, ierr)
Packit 0848f5
C
Packit 0848f5
         call msg_check( recv_buf, next, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'send and recv', errs )
Packit 0848f5
      else if (prev .eq. 0)  then
Packit 0848f5
         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm, status, ierr)
Packit 0848f5
Packit 0848f5
         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'send and recv', errs )
Packit 0848f5
C
Packit 0848f5
         call MPI_Send(recv_buf, count, MPI_REAL, prev, tag, comm, ierr) 
Packit 0848f5
      end if
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
      subroutine test_pair_rsend( comm, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer comm, errs
Packit 0848f5
      integer rank, size, ierr, next, prev, tag, count, i
Packit 0848f5
      integer TEST_SIZE
Packit 0848f5
      parameter (TEST_SIZE=2000)
Packit 0848f5
      integer status(MPI_STATUS_SIZE), requests(1)
Packit 0848f5
      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
Packit 0848f5
      logical verbose
Packit 0848f5
      common /flags/ verbose
Packit 0848f5
C
Packit 0848f5
      if (verbose) then
Packit 0848f5
         print *, ' Rsend and recv'
Packit 0848f5
      endif
Packit 0848f5
C
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      next = rank + 1
Packit 0848f5
      if (next .ge. size) next = 0
Packit 0848f5
C
Packit 0848f5
      prev = rank - 1
Packit 0848f5
      if (prev .lt. 0) prev = size - 1
Packit 0848f5
C
Packit 0848f5
      tag = 1456
Packit 0848f5
      count = TEST_SIZE / 3
Packit 0848f5
C
Packit 0848f5
      call clear_test_data(recv_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
      if (rank .eq. 0) then
Packit 0848f5
C        
Packit 0848f5
         call init_test_data(send_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
         call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, 
Packit 0848f5
     .                  comm, status, ierr )
Packit 0848f5
C
Packit 0848f5
         call MPI_Rsend(send_buf, count, MPI_REAL, next, tag,
Packit 0848f5
     .                  comm, ierr) 
Packit 0848f5
C
Packit 0848f5
         call MPI_Probe(MPI_ANY_SOURCE, tag, comm, status, ierr) 
Packit 0848f5
C
Packit 0848f5
         if (status(MPI_SOURCE) .ne. next) then
Packit 0848f5
            print *, 'Rsend: Incorrect source, expected', next,
Packit 0848f5
     .               ', got', status(MPI_SOURCE)
Packit 0848f5
            errs = errs + 1
Packit 0848f5
         end if
Packit 0848f5
C
Packit 0848f5
         if (status(MPI_TAG) .ne. tag) then
Packit 0848f5
            print *, 'Rsend: Incorrect tag, expected', tag,
Packit 0848f5
     .               ', got', status(MPI_TAG)
Packit 0848f5
            errs = errs + 1
Packit 0848f5
         end if
Packit 0848f5
C
Packit 0848f5
         call MPI_Get_count(status, MPI_REAL, i, ierr)
Packit 0848f5
C
Packit 0848f5
         if (i .ne. count) then
Packit 0848f5
            print *, 'Rsend: Incorrect count, expected', count,
Packit 0848f5
     .               ', got', i
Packit 0848f5
            errs = errs + 1
Packit 0848f5
         end if
Packit 0848f5
C
Packit 0848f5
         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm, 
Packit 0848f5
     .                 status, ierr)
Packit 0848f5
C
Packit 0848f5
         call msg_check( recv_buf, next, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'rsend and recv', errs )
Packit 0848f5
C
Packit 0848f5
      else if (prev .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                 requests(1), ierr)
Packit 0848f5
         call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, prev, tag, 
Packit 0848f5
     .                  comm, ierr )
Packit 0848f5
         call MPI_Wait( requests(1), status, ierr )
Packit 0848f5
         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'rsend and recv', errs )
Packit 0848f5
C
Packit 0848f5
         call MPI_Send(recv_buf, count, MPI_REAL, prev, tag,
Packit 0848f5
     .                  comm, ierr) 
Packit 0848f5
      end if
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
      subroutine test_pair_ssend( comm, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer comm, errs
Packit 0848f5
      integer rank, size, ierr, next, prev, tag, count, i
Packit 0848f5
      integer TEST_SIZE
Packit 0848f5
      parameter (TEST_SIZE=2000)
Packit 0848f5
      integer status(MPI_STATUS_SIZE)
Packit 0848f5
      logical flag
Packit 0848f5
      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
Packit 0848f5
      logical verbose
Packit 0848f5
      common /flags/ verbose
Packit 0848f5
C
Packit 0848f5
      if (verbose) then
Packit 0848f5
         print *, ' Ssend and recv'
Packit 0848f5
      endif
Packit 0848f5
C
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      next = rank + 1
Packit 0848f5
      if (next .ge. size) next = 0
Packit 0848f5
C
Packit 0848f5
      prev = rank - 1
Packit 0848f5
      if (prev .lt. 0) prev = size - 1
Packit 0848f5
C
Packit 0848f5
      tag = 1789
Packit 0848f5
      count = TEST_SIZE / 3
Packit 0848f5
C
Packit 0848f5
      call clear_test_data(recv_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
      if (rank .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call init_test_data(send_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
         call MPI_Iprobe(MPI_ANY_SOURCE, tag,
Packit 0848f5
     .                   comm, flag, status, ierr) 
Packit 0848f5
C
Packit 0848f5
         if (flag) then
Packit 0848f5
            print *, 'Ssend: Iprobe succeeded! source', 
Packit 0848f5
     .               status(MPI_SOURCE),
Packit 0848f5
     .               ', tag', status(MPI_TAG)
Packit 0848f5
            errs = errs + 1
Packit 0848f5
         end if
Packit 0848f5
C
Packit 0848f5
         call MPI_Ssend(send_buf, count, MPI_REAL, next, tag,
Packit 0848f5
     .                  comm, ierr) 
Packit 0848f5
C
Packit 0848f5
         do while (.not. flag)
Packit 0848f5
            call MPI_Iprobe(MPI_ANY_SOURCE, tag,
Packit 0848f5
     .                      comm, flag, status, ierr) 
Packit 0848f5
         end do
Packit 0848f5
C           
Packit 0848f5
         if (status(MPI_SOURCE) .ne. next) then
Packit 0848f5
            print *, 'Ssend: Incorrect source, expected', next,
Packit 0848f5
     .               ', got', status(MPI_SOURCE)
Packit 0848f5
            errs = errs + 1
Packit 0848f5
         end if
Packit 0848f5
C
Packit 0848f5
         if (status(MPI_TAG) .ne. tag) then
Packit 0848f5
            print *, 'Ssend: Incorrect tag, expected', tag,
Packit 0848f5
     .               ', got', status(MPI_TAG)
Packit 0848f5
            errs = errs + 1
Packit 0848f5
         end if
Packit 0848f5
C
Packit 0848f5
         call MPI_Get_count(status, MPI_REAL, i, ierr)
Packit 0848f5
C
Packit 0848f5
         if (i .ne. count) then
Packit 0848f5
            print *, 'Ssend: Incorrect count, expected', count,
Packit 0848f5
     .               ', got', i
Packit 0848f5
            errs = errs + 1
Packit 0848f5
         end if
Packit 0848f5
C
Packit 0848f5
         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                 status, ierr)
Packit 0848f5
C
Packit 0848f5
         call msg_check( recv_buf, next, tag, count, status,
Packit 0848f5
     .        TEST_SIZE, 'ssend and recv', errs ) 
Packit 0848f5
C
Packit 0848f5
      else if (prev .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                 status, ierr)
Packit 0848f5
C
Packit 0848f5
         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'ssend and recv', errs )
Packit 0848f5
C
Packit 0848f5
         call MPI_Ssend(recv_buf, count, MPI_REAL, prev, tag,
Packit 0848f5
     .                  comm, ierr) 
Packit 0848f5
      end if
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
      subroutine test_pair_isend( comm, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer comm, errs
Packit 0848f5
      integer rank, size, ierr, next, prev, tag, count
Packit 0848f5
      integer TEST_SIZE
Packit 0848f5
      parameter (TEST_SIZE=2000)
Packit 0848f5
      integer status(MPI_STATUS_SIZE), requests(2)
Packit 0848f5
      integer statuses(MPI_STATUS_SIZE,2)
Packit 0848f5
      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
Packit 0848f5
      logical verbose
Packit 0848f5
      common /flags/ verbose
Packit 0848f5
C
Packit 0848f5
      if (verbose) then
Packit 0848f5
         print *, ' isend and irecv'
Packit 0848f5
      endif
Packit 0848f5
C
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      next = rank + 1
Packit 0848f5
      if (next .ge. size) next = 0
Packit 0848f5
C
Packit 0848f5
      prev = rank - 1
Packit 0848f5
      if (prev .lt. 0) prev = size - 1
Packit 0848f5
C
Packit 0848f5
      tag = 2123
Packit 0848f5
      count = TEST_SIZE / 5
Packit 0848f5
C
Packit 0848f5
      call clear_test_data(recv_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
      if (rank .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                  MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                  requests(1), ierr)
Packit 0848f5
C
Packit 0848f5
         call init_test_data(send_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
         call MPI_Isend(send_buf, count, MPI_REAL, next, tag,
Packit 0848f5
     .                  comm, requests(2), ierr) 
Packit 0848f5
C
Packit 0848f5
         call MPI_Waitall(2, requests, statuses, ierr)
Packit 0848f5
C
Packit 0848f5
         call rq_check( requests, 2, 'isend and irecv' )
Packit 0848f5
C
Packit 0848f5
         call msg_check( recv_buf, next, tag, count, statuses(1,1),
Packit 0848f5
     .        TEST_SIZE, 'isend and irecv', errs )
Packit 0848f5
C
Packit 0848f5
      else if (prev .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                 status, ierr)
Packit 0848f5
C
Packit 0848f5
         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'isend and irecv', errs )
Packit 0848f5
C
Packit 0848f5
         call MPI_Isend(recv_buf, count, MPI_REAL, prev, tag,
Packit 0848f5
     .                  comm, requests(1), ierr) 
Packit 0848f5
C
Packit 0848f5
         call MPI_Wait(requests(1), status, ierr)
Packit 0848f5
C
Packit 0848f5
         call rq_check( requests(1), 1, 'isend and irecv' )
Packit 0848f5
C
Packit 0848f5
      end if
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
      subroutine test_pair_irsend( comm, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer comm, errs
Packit 0848f5
      integer rank, size, ierr, next, prev, tag, count, index, i
Packit 0848f5
      integer TEST_SIZE
Packit 0848f5
      integer dupcom
Packit 0848f5
      parameter (TEST_SIZE=2000)
Packit 0848f5
      integer status(MPI_STATUS_SIZE), requests(2)
Packit 0848f5
      integer statuses(MPI_STATUS_SIZE,2)
Packit 0848f5
      logical flag
Packit 0848f5
      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
Packit 0848f5
      logical verbose
Packit 0848f5
      common /flags/ verbose
Packit 0848f5
C
Packit 0848f5
      if (verbose) then
Packit 0848f5
         print *, ' Irsend and irecv'
Packit 0848f5
      endif
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      next = rank + 1
Packit 0848f5
      if (next .ge. size) next = 0
Packit 0848f5
C
Packit 0848f5
      prev = rank - 1
Packit 0848f5
      if (prev .lt. 0) prev = size - 1
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_dup( comm, dupcom, ierr )
Packit 0848f5
C
Packit 0848f5
      tag = 2456
Packit 0848f5
      count = TEST_SIZE / 3
Packit 0848f5
C
Packit 0848f5
      call clear_test_data(recv_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
      if (rank .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                  MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                  requests(1), ierr)
Packit 0848f5
C
Packit 0848f5
         call init_test_data(send_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
         call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, next, 0, 
Packit 0848f5
     .                      MPI_BOTTOM, 0, MPI_INTEGER, next, 0, 
Packit 0848f5
     .                      dupcom, status, ierr )
Packit 0848f5
C
Packit 0848f5
         call MPI_Irsend(send_buf, count, MPI_REAL, next, tag,
Packit 0848f5
     .                   comm, requests(2), ierr) 
Packit 0848f5
C
Packit 0848f5
         index = -1
Packit 0848f5
         do while (index .ne. 1)
Packit 0848f5
            call MPI_Waitany(2, requests, index, statuses, ierr)
Packit 0848f5
         end do
Packit 0848f5
C
Packit 0848f5
         call rq_check( requests(1), 1, 'irsend and irecv' )
Packit 0848f5
C
Packit 0848f5
         call msg_check( recv_buf, next, tag, count, statuses,
Packit 0848f5
     .           TEST_SIZE, 'irsend and irecv', errs )
Packit 0848f5
C
Packit 0848f5
      else if (prev .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                  MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                  requests(1), ierr)
Packit 0848f5
C
Packit 0848f5
         call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, prev, 0, 
Packit 0848f5
     .                      MPI_BOTTOM, 0, MPI_INTEGER, prev, 0, 
Packit 0848f5
     .                      dupcom, status, ierr )
Packit 0848f5
C
Packit 0848f5
         flag = .FALSE.
Packit 0848f5
         do while (.not. flag)
Packit 0848f5
            call MPI_Test(requests(1), flag, status, ierr)
Packit 0848f5
         end do
Packit 0848f5
C
Packit 0848f5
         call rq_check( requests, 1, 'irsend and irecv (test)' )
Packit 0848f5
C
Packit 0848f5
         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'irsend and irecv', errs )
Packit 0848f5
C
Packit 0848f5
         call MPI_Irsend(recv_buf, count, MPI_REAL, prev, tag,
Packit 0848f5
     .                   comm, requests(1), ierr) 
Packit 0848f5
C
Packit 0848f5
         call MPI_Waitall(1, requests, statuses, ierr)
Packit 0848f5
C
Packit 0848f5
         call rq_check( requests, 1, 'irsend and irecv' )
Packit 0848f5
C
Packit 0848f5
      end if
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_free( dupcom, ierr )
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
      subroutine test_pair_issend( comm, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer comm, errs
Packit 0848f5
      integer rank, size, ierr, next, prev, tag, count, index
Packit 0848f5
      integer TEST_SIZE
Packit 0848f5
      parameter (TEST_SIZE=2000)
Packit 0848f5
      integer status(MPI_STATUS_SIZE), requests(2)
Packit 0848f5
      integer statuses(MPI_STATUS_SIZE,2)
Packit 0848f5
      logical flag
Packit 0848f5
      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
Packit 0848f5
      logical verbose
Packit 0848f5
      common /flags/ verbose
Packit 0848f5
C
Packit 0848f5
      if (verbose) then
Packit 0848f5
         print *, ' issend and irecv (testall)'
Packit 0848f5
      endif
Packit 0848f5
C
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      next = rank + 1
Packit 0848f5
      if (next .ge. size) next = 0
Packit 0848f5
C
Packit 0848f5
      prev = rank - 1
Packit 0848f5
      if (prev .lt. 0) prev = size - 1
Packit 0848f5
C
Packit 0848f5
      tag = 2789
Packit 0848f5
      count = TEST_SIZE / 3
Packit 0848f5
C
Packit 0848f5
      call clear_test_data(recv_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
      if (rank .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                  MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                  requests(1), ierr)
Packit 0848f5
C
Packit 0848f5
         call init_test_data(send_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
         call MPI_Issend(send_buf, count, MPI_REAL, next, tag,
Packit 0848f5
     .                   comm, requests(2), ierr) 
Packit 0848f5
C
Packit 0848f5
         flag = .FALSE.
Packit 0848f5
         do while (.not. flag)
Packit 0848f5
            call MPI_Testall(2, requests, flag, statuses, ierr)
Packit 0848f5
         end do
Packit 0848f5
C
Packit 0848f5
         call rq_check( requests, 2, 'issend and irecv (testall)' )
Packit 0848f5
C
Packit 0848f5
         call msg_check( recv_buf, next, tag, count, statuses(1,1),
Packit 0848f5
     .           TEST_SIZE, 'issend and recv (testall)', errs )
Packit 0848f5
C
Packit 0848f5
      else if (prev .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                 status, ierr)
Packit 0848f5
Packit 0848f5
         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'issend and recv', errs )
Packit 0848f5
Packit 0848f5
         call MPI_Issend(recv_buf, count, MPI_REAL, prev, tag,
Packit 0848f5
     .                   comm, requests(1), ierr) 
Packit 0848f5
C
Packit 0848f5
         flag = .FALSE.
Packit 0848f5
         do while (.not. flag)
Packit 0848f5
            call MPI_Testany(1, requests(1), index, flag,
Packit 0848f5
     .                       statuses(1,1), ierr)
Packit 0848f5
         end do
Packit 0848f5
C
Packit 0848f5
         call rq_check( requests, 1, 'issend and recv (testany)' )
Packit 0848f5
C
Packit 0848f5
      end if
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
      subroutine test_pair_psend( comm, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer comm, errs
Packit 0848f5
      integer rank, size, ierr, next, prev, tag, count, i
Packit 0848f5
      integer TEST_SIZE
Packit 0848f5
      parameter (TEST_SIZE=2000)
Packit 0848f5
      integer status(MPI_STATUS_SIZE)
Packit 0848f5
      integer statuses(MPI_STATUS_SIZE,2), requests(2)
Packit 0848f5
      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
Packit 0848f5
      logical verbose
Packit 0848f5
      common /flags/ verbose
Packit 0848f5
C
Packit 0848f5
      if (verbose) then
Packit 0848f5
         print *, ' Persistent send and recv'
Packit 0848f5
      endif
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      next = rank + 1
Packit 0848f5
      if (next .ge. size) next = 0
Packit 0848f5
C
Packit 0848f5
      prev = rank - 1
Packit 0848f5
      if (prev .lt. 0) prev = size - 1
Packit 0848f5
C
Packit 0848f5
      tag = 3123
Packit 0848f5
      count = TEST_SIZE / 5
Packit 0848f5
C
Packit 0848f5
      call clear_test_data(recv_buf,TEST_SIZE)
Packit 0848f5
      call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                   MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                   requests(2), ierr)
Packit 0848f5
C
Packit 0848f5
      if (rank .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call init_test_data(send_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
         call MPI_Send_init(send_buf, count, MPI_REAL, next, tag,
Packit 0848f5
     .                      comm, requests(1), ierr) 
Packit 0848f5
C
Packit 0848f5
         call MPI_Startall(2, requests, ierr) 
Packit 0848f5
         call MPI_Waitall(2, requests, statuses, ierr)
Packit 0848f5
C
Packit 0848f5
         call msg_check( recv_buf, next, tag, count, statuses(1,2),
Packit 0848f5
     .        TEST_SIZE, 'persistent send/recv', errs )
Packit 0848f5
C
Packit 0848f5
         call MPI_Request_free(requests(1), ierr)
Packit 0848f5
C
Packit 0848f5
      else if (prev .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Send_init(send_buf, count, MPI_REAL, prev, tag,
Packit 0848f5
     .                      comm, requests(1), ierr) 
Packit 0848f5
         call MPI_Start(requests(2), ierr) 
Packit 0848f5
         call MPI_Wait(requests(2), status, ierr)
Packit 0848f5
C
Packit 0848f5
         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
Packit 0848f5
     *                   'persistent send/recv', errs )
Packit 0848f5
C
Packit 0848f5
         do i = 1,count
Packit 0848f5
            send_buf(i) = recv_buf(i)
Packit 0848f5
         end do
Packit 0848f5
C
Packit 0848f5
         call MPI_Start(requests(1), ierr) 
Packit 0848f5
         call MPI_Wait(requests(1), status, ierr)
Packit 0848f5
C
Packit 0848f5
         call MPI_Request_free(requests(1), ierr)
Packit 0848f5
      end if
Packit 0848f5
C
Packit 0848f5
      call dummyRef( send_buf, count, ierr )
Packit 0848f5
      call MPI_Request_free(requests(2), ierr)
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
      subroutine test_pair_prsend( comm, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer comm, errs
Packit 0848f5
      integer rank, size, ierr, next, prev, tag, count, index, i
Packit 0848f5
      integer outcount, indices(2)
Packit 0848f5
      integer TEST_SIZE
Packit 0848f5
      parameter (TEST_SIZE=2000)
Packit 0848f5
      integer statuses(MPI_STATUS_SIZE,2), requests(2)
Packit 0848f5
      integer status(MPI_STATUS_SIZE)
Packit 0848f5
      logical flag
Packit 0848f5
      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
Packit 0848f5
      logical verbose
Packit 0848f5
      common /flags/ verbose
Packit 0848f5
C
Packit 0848f5
      if (verbose) then
Packit 0848f5
         print *, ' Persistent Rsend and recv'
Packit 0848f5
      endif
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      next = rank + 1
Packit 0848f5
      if (next .ge. size) next = 0
Packit 0848f5
C
Packit 0848f5
      prev = rank - 1
Packit 0848f5
      if (prev .lt. 0) prev = size - 1
Packit 0848f5
C
Packit 0848f5
      tag = 3456
Packit 0848f5
      count = TEST_SIZE / 3
Packit 0848f5
C
Packit 0848f5
      call clear_test_data(recv_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
      call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                   MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                   requests(2), ierr)
Packit 0848f5
C
Packit 0848f5
      if (rank .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Rsend_init(send_buf, count, MPI_REAL, next, tag,
Packit 0848f5
     .                       comm, requests(1), ierr) 
Packit 0848f5
C
Packit 0848f5
         call init_test_data(send_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
         call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, 
Packit 0848f5
     .                  comm, status, ierr )
Packit 0848f5
C
Packit 0848f5
         call MPI_Startall(2, requests, ierr)
Packit 0848f5
C
Packit 0848f5
         index = -1
Packit 0848f5
C
Packit 0848f5
         do while (index .ne. 2)
Packit 0848f5
            call MPI_Waitsome(2, requests, outcount,
Packit 0848f5
     .                        indices, statuses, ierr)
Packit 0848f5
            do i = 1,outcount
Packit 0848f5
               if (indices(i) .eq. 2) then
Packit 0848f5
                  call msg_check( recv_buf, next, tag, count,
Packit 0848f5
     .                 statuses(1,i), TEST_SIZE, 'waitsome', errs )
Packit 0848f5
                  index = 2
Packit 0848f5
               end if
Packit 0848f5
            end do
Packit 0848f5
         end do
Packit 0848f5
C
Packit 0848f5
         call MPI_Request_free(requests(1), ierr)
Packit 0848f5
      else if (prev .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Rsend_init(send_buf, count, MPI_REAL, prev, tag,
Packit 0848f5
     .                       comm, requests(1), ierr) 
Packit 0848f5
C
Packit 0848f5
         call MPI_Start(requests(2), ierr)
Packit 0848f5
C
Packit 0848f5
         call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, prev, tag, 
Packit 0848f5
     .                  comm, ierr )
Packit 0848f5
C
Packit 0848f5
         flag = .FALSE.
Packit 0848f5
         do while (.not. flag)
Packit 0848f5
            call MPI_Test(requests(2), flag, status, ierr)
Packit 0848f5
         end do
Packit 0848f5
         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'test', errs )
Packit 0848f5
C
Packit 0848f5
         do i = 1,count
Packit 0848f5
            send_buf(i) = recv_buf(i)
Packit 0848f5
         end do
Packit 0848f5
C
Packit 0848f5
         call MPI_Start(requests(1), ierr)
Packit 0848f5
         call MPI_Wait(requests(1), status, ierr)
Packit 0848f5
C
Packit 0848f5
         call MPI_Request_free(requests(1), ierr)
Packit 0848f5
      end if
Packit 0848f5
C
Packit 0848f5
      call dummyRef( send_buf, count, ierr )
Packit 0848f5
      call MPI_Request_free(requests(2), ierr)
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
      subroutine test_pair_pssend( comm, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer comm, errs
Packit 0848f5
      integer rank, size, ierr, next, prev, tag, count, index, i
Packit 0848f5
      integer outcount, indices(2)
Packit 0848f5
      integer TEST_SIZE
Packit 0848f5
      parameter (TEST_SIZE=2000)
Packit 0848f5
      integer statuses(MPI_STATUS_SIZE,2), requests(2)
Packit 0848f5
      integer status(MPI_STATUS_SIZE)
Packit 0848f5
      logical flag
Packit 0848f5
      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
Packit 0848f5
      logical verbose
Packit 0848f5
      common /flags/ verbose
Packit 0848f5
C
Packit 0848f5
      if (verbose) then
Packit 0848f5
         print *, ' Persistent Ssend and recv'
Packit 0848f5
      endif
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      next = rank + 1
Packit 0848f5
      if (next .ge. size) next = 0
Packit 0848f5
C
Packit 0848f5
      prev = rank - 1
Packit 0848f5
      if (prev .lt. 0) prev = size - 1
Packit 0848f5
C
Packit 0848f5
      tag = 3789
Packit 0848f5
      count = TEST_SIZE / 3
Packit 0848f5
C
Packit 0848f5
      call clear_test_data(recv_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
      call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                   MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                   requests(1), ierr)
Packit 0848f5
C
Packit 0848f5
      if (rank .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Ssend_init(send_buf, count, MPI_REAL, next, tag,
Packit 0848f5
     .                       comm, requests(2), ierr) 
Packit 0848f5
C
Packit 0848f5
         call init_test_data(send_buf,TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
         call MPI_Startall(2, requests, ierr)
Packit 0848f5
C
Packit 0848f5
         index = -1
Packit 0848f5
         do while (index .ne. 1)
Packit 0848f5
            call MPI_Testsome(2, requests, outcount,
Packit 0848f5
     .                        indices, statuses, ierr)
Packit 0848f5
            do i = 1,outcount
Packit 0848f5
               if (indices(i) .eq. 1) then
Packit 0848f5
                  call msg_check( recv_buf, next, tag, count,
Packit 0848f5
     .                 statuses(1,i), TEST_SIZE, 'testsome', errs )
Packit 0848f5
                  index = 1
Packit 0848f5
               end if
Packit 0848f5
            end do
Packit 0848f5
         end do
Packit 0848f5
C
Packit 0848f5
         call MPI_Request_free(requests(2), ierr)
Packit 0848f5
C
Packit 0848f5
      else if (prev .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call MPI_Ssend_init(send_buf, count, MPI_REAL, prev, tag,
Packit 0848f5
     .                       comm, requests(2), ierr) 
Packit 0848f5
C
Packit 0848f5
         call MPI_Start(requests(1), ierr)
Packit 0848f5
C
Packit 0848f5
         flag = .FALSE.
Packit 0848f5
         do while (.not. flag)
Packit 0848f5
            call MPI_Testany(1, requests(1), index, flag,
Packit 0848f5
     .                       statuses(1,1), ierr)
Packit 0848f5
         end do
Packit 0848f5
         call msg_check( recv_buf, prev, tag, count, statuses(1,1),
Packit 0848f5
     .           TEST_SIZE, 'testany', errs )
Packit 0848f5
Packit 0848f5
         do i = 1,count
Packit 0848f5
            send_buf(i) = recv_buf(i)
Packit 0848f5
         end do
Packit 0848f5
C
Packit 0848f5
         call MPI_Start(requests(2), ierr)
Packit 0848f5
         call MPI_Wait(requests(2), status, ierr)
Packit 0848f5
C
Packit 0848f5
         call MPI_Request_free(requests(2), ierr)
Packit 0848f5
C
Packit 0848f5
      end if
Packit 0848f5
C
Packit 0848f5
      call dummyRef( send_buf, count, ierr )
Packit 0848f5
      call MPI_Request_free(requests(1), ierr)
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
      subroutine test_pair_sendrecv( comm, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer comm, errs
Packit 0848f5
      integer rank, size, ierr, next, prev, tag, count
Packit 0848f5
      integer TEST_SIZE
Packit 0848f5
      parameter (TEST_SIZE=2000)
Packit 0848f5
      integer status(MPI_STATUS_SIZE)
Packit 0848f5
      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
Packit 0848f5
      logical verbose
Packit 0848f5
      common /flags/ verbose
Packit 0848f5
C
Packit 0848f5
      if (verbose) then
Packit 0848f5
         print *, ' Sendrecv'
Packit 0848f5
      endif
Packit 0848f5
C
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      next = rank + 1
Packit 0848f5
      if (next .ge. size) next = 0
Packit 0848f5
C
Packit 0848f5
      prev = rank - 1
Packit 0848f5
      if (prev .lt. 0) prev = size - 1
Packit 0848f5
C
Packit 0848f5
      tag = 4123
Packit 0848f5
      count = TEST_SIZE / 5
Packit 0848f5
Packit 0848f5
      call clear_test_data(recv_buf,TEST_SIZE)
Packit 0848f5
Packit 0848f5
      if (rank .eq. 0) then
Packit 0848f5
Packit 0848f5
         call init_test_data(send_buf,TEST_SIZE)
Packit 0848f5
Packit 0848f5
         call MPI_Sendrecv(send_buf, count, MPI_REAL, next, tag,
Packit 0848f5
     .                     recv_buf, count, MPI_REAL, next, tag,
Packit 0848f5
     .                     comm, status, ierr) 
Packit 0848f5
Packit 0848f5
         call msg_check( recv_buf, next, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'sendrecv', errs )
Packit 0848f5
Packit 0848f5
      else if (prev .eq. 0) then
Packit 0848f5
Packit 0848f5
         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                 status, ierr)
Packit 0848f5
Packit 0848f5
         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'recv/send', errs )
Packit 0848f5
Packit 0848f5
         call MPI_Send(recv_buf, count, MPI_REAL, prev, tag,
Packit 0848f5
     .                 comm, ierr) 
Packit 0848f5
      end if
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
      subroutine test_pair_sendrecvrepl( comm, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer comm, errs
Packit 0848f5
      integer rank, size, ierr, next, prev, tag, count, i
Packit 0848f5
      integer TEST_SIZE
Packit 0848f5
      parameter (TEST_SIZE=2000)
Packit 0848f5
      integer status(MPI_STATUS_SIZE)
Packit 0848f5
      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
Packit 0848f5
      logical verbose
Packit 0848f5
      common /flags/ verbose
Packit 0848f5
C
Packit 0848f5
      if (verbose) then
Packit 0848f5
         print *, ' Sendrecv replace'
Packit 0848f5
      endif
Packit 0848f5
C
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      next = rank + 1
Packit 0848f5
      if (next .ge. size) next = 0
Packit 0848f5
C
Packit 0848f5
      prev = rank - 1
Packit 0848f5
      if (prev .lt. 0) prev = size - 1
Packit 0848f5
C
Packit 0848f5
      tag = 4456
Packit 0848f5
      count = TEST_SIZE / 3
Packit 0848f5
Packit 0848f5
      if (rank .eq. 0) then
Packit 0848f5
C
Packit 0848f5
         call init_test_data(recv_buf, TEST_SIZE)
Packit 0848f5
C
Packit 0848f5
         do 11 i = count+1,TEST_SIZE
Packit 0848f5
            recv_buf(i) = 0.0
Packit 0848f5
 11      continue
Packit 0848f5
C
Packit 0848f5
         call MPI_Sendrecv_replace(recv_buf, count, MPI_REAL,
Packit 0848f5
     .                             next, tag, next, tag,
Packit 0848f5
     .                             comm, status, ierr)  
Packit 0848f5
Packit 0848f5
         call msg_check( recv_buf, next, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'sendrecvreplace', errs )
Packit 0848f5
Packit 0848f5
      else if (prev .eq. 0) then
Packit 0848f5
Packit 0848f5
         call clear_test_data(recv_buf,TEST_SIZE)
Packit 0848f5
Packit 0848f5
         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
Packit 0848f5
     .                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
Packit 0848f5
     .                 status, ierr)
Packit 0848f5
Packit 0848f5
         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
Packit 0848f5
     .                   'recv/send for replace', errs )
Packit 0848f5
Packit 0848f5
         call MPI_Send(recv_buf, count, MPI_REAL, prev, tag,
Packit 0848f5
     .                 comm, ierr) 
Packit 0848f5
      end if
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
c------------------------------------------------------------------------------
Packit 0848f5
c
Packit 0848f5
c  Check for correct source, tag, count, and data in test message.
Packit 0848f5
c
Packit 0848f5
c------------------------------------------------------------------------------
Packit 0848f5
      subroutine msg_check( recv_buf, source, tag, count, status, n, 
Packit 0848f5
     *                      name, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer n, errs
Packit 0848f5
      real    recv_buf(n)
Packit 0848f5
      integer source, tag, count, rank, status(MPI_STATUS_SIZE)
Packit 0848f5
      character*(*) name
Packit 0848f5
      logical foundError
Packit 0848f5
Packit 0848f5
      integer ierr, recv_src, recv_tag, recv_count
Packit 0848f5
Packit 0848f5
      foundError = .false.
Packit 0848f5
      recv_src = status(MPI_SOURCE)
Packit 0848f5
      recv_tag = status(MPI_TAG)
Packit 0848f5
      call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr )
Packit 0848f5
      call MPI_Get_count(status, MPI_REAL, recv_count, ierr)
Packit 0848f5
Packit 0848f5
      if (recv_src .ne. source) then
Packit 0848f5
         print *, '[', rank, '] Unexpected source:', recv_src, 
Packit 0848f5
     *            ' in ', name
Packit 0848f5
         errs       = errs + 1
Packit 0848f5
         foundError = .true.
Packit 0848f5
      end if
Packit 0848f5
Packit 0848f5
      if (recv_tag .ne. tag) then
Packit 0848f5
         print *, '[', rank, '] Unexpected tag:', recv_tag, ' in ', name
Packit 0848f5
         errs       = errs + 1
Packit 0848f5
         foundError = .true.
Packit 0848f5
      end if
Packit 0848f5
Packit 0848f5
      if (recv_count .ne. count) then
Packit 0848f5
         print *, '[', rank, '] Unexpected count:', recv_count,
Packit 0848f5
     *            ' in ', name
Packit 0848f5
         errs       = errs + 1
Packit 0848f5
         foundError = .true.
Packit 0848f5
      end if
Packit 0848f5
         
Packit 0848f5
      call verify_test_data(recv_buf, count, n, name, errs )
Packit 0848f5
Packit 0848f5
      end
Packit 0848f5
c------------------------------------------------------------------------------
Packit 0848f5
c
Packit 0848f5
c  Check that requests have been set to null
Packit 0848f5
c
Packit 0848f5
c------------------------------------------------------------------------------
Packit 0848f5
      subroutine rq_check( requests, n, msg )
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer n, requests(n)
Packit 0848f5
      character*(*) msg
Packit 0848f5
      integer i
Packit 0848f5
c
Packit 0848f5
      do 10 i=1, n
Packit 0848f5
         if (requests(i) .ne. MPI_REQUEST_NULL) then
Packit 0848f5
            print *, 'Nonnull request in ', msg
Packit 0848f5
         endif
Packit 0848f5
 10   continue
Packit 0848f5
c      
Packit 0848f5
      end
Packit 0848f5
c------------------------------------------------------------------------------
Packit 0848f5
c
Packit 0848f5
c  Initialize test data buffer with integral sequence.
Packit 0848f5
c
Packit 0848f5
c------------------------------------------------------------------------------
Packit 0848f5
      subroutine init_test_data(buf,n)
Packit 0848f5
      integer n
Packit 0848f5
      real buf(n)
Packit 0848f5
      integer i
Packit 0848f5
Packit 0848f5
      do 10 i = 1, n
Packit 0848f5
         buf(i) = REAL(i)
Packit 0848f5
 10    continue
Packit 0848f5
      end
Packit 0848f5
Packit 0848f5
c------------------------------------------------------------------------------
Packit 0848f5
c
Packit 0848f5
c  Clear test data buffer
Packit 0848f5
c
Packit 0848f5
c------------------------------------------------------------------------------
Packit 0848f5
      subroutine clear_test_data(buf, n)
Packit 0848f5
      integer n
Packit 0848f5
      real buf(n)
Packit 0848f5
      integer i
Packit 0848f5
Packit 0848f5
      do 10 i = 1, n
Packit 0848f5
         buf(i) = 0.
Packit 0848f5
 10   continue
Packit 0848f5
Packit 0848f5
      end
Packit 0848f5
Packit 0848f5
c------------------------------------------------------------------------------
Packit 0848f5
c
Packit 0848f5
c  Verify test data buffer
Packit 0848f5
c
Packit 0848f5
c------------------------------------------------------------------------------
Packit 0848f5
      subroutine verify_test_data( buf, count, n, name, errs )
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer n, errs
Packit 0848f5
      real buf(n)
Packit 0848f5
      character *(*) name
Packit 0848f5
      integer count, ierr, i
Packit 0848f5
C
Packit 0848f5
      do 10 i = 1, count
Packit 0848f5
         if (buf(i) .ne. REAL(i)) then
Packit 0848f5
            print 100, buf(i), i, count, name
Packit 0848f5
            errs = errs + 1
Packit 0848f5
         endif
Packit 0848f5
 10   continue
Packit 0848f5
C
Packit 0848f5
      do 20 i = count + 1, n
Packit 0848f5
         if (buf(i) .ne. 0.) then
Packit 0848f5
            print 100, buf(i), i, n, name
Packit 0848f5
            errs = errs + 1
Packit 0848f5
         endif
Packit 0848f5
 20   continue
Packit 0848f5
C      
Packit 0848f5
100   format('Invalid data', f6.1, ' at ', i4, ' of ', i4, ' in ', a)
Packit 0848f5
C
Packit 0848f5
      end
Packit 0848f5
C
Packit 0848f5
C    This routine is used to prevent the compiler from deallocating the 
Packit 0848f5
C    array "a", which may happen in some of the tests (see the text in 
Packit 0848f5
C    the MPI standard about why this may be a problem in valid Fortran 
Packit 0848f5
C    codes).  Without this, for example, tests fail with the Cray ftn
Packit 0848f5
C    compiler.
Packit 0848f5
C
Packit 0848f5
      subroutine dummyRef( a, n, ie )
Packit 0848f5
      integer n, ie
Packit 0848f5
      real    a(n)
Packit 0848f5
C This condition will never be true, but the compile won't know that
Packit 0848f5
      if (ie .eq. -1) then
Packit 0848f5
          print *, a(n)
Packit 0848f5
      endif
Packit 0848f5
      return
Packit 0848f5
      end