C
C	Hewlett-Packard Co., Convex Division
C
C	Function:	- example: send/receive
C
      program main

      include 'mpif.h'

      integer rank, size, to, from, tag, count, i, ierr
      integer src, dest
      integer st_source, st_tag, st_count
      integer status(MPI_STATUS_SIZE)
      double precision data(100)

      call MPI_Init(ierr)
      call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
      call MPI_Comm_size(MPI_COMM_WORLD, size, ierr)

      if (size .eq. 1) then
              print *, 'must have at least 2 processes'
              call MPI_Finalize(ierr)
              stop
      endif

      print *, 'Process ', rank, ' of ', size, ' is alive'
      dest = size - 1
      src = 0

      if (rank .eq. src) then
              to = dest
              count = 10
              tag = 2001

              do i=1, 10
                      data(i) = 1
              enddo

              call MPI_Send(data, count, MPI_DOUBLE_PRECISION,
     +                      to, tag, MPI_COMM_WORLD, ierr)
      endif

      if (rank .eq. dest) then
              tag = MPI_ANY_TAG
              count = 10
              from = MPI_ANY_SOURCE
              call MPI_Recv(data, count, MPI_DOUBLE_PRECISION,
     +                      from, tag, MPI_COMM_WORLD, status, ierr)
              call MPI_Get_Count(status, MPI_DOUBLE_PRECISION, 
     +                           st_count, ierr)
              st_source = status(MPI_SOURCE)
              st_tag = status(MPI_TAG)

              print *, 'Status info: source = ', st_source,
     +                 ' tag = ', st_tag, ' count = ', st_count
              print *, rank, ' received', (data(i),i=1,10)
      endif

      call MPI_Finalize(ierr)

      stop
      end	
