      program maxfind
c....................................................................
      include "/usr/include/mpif.h"
      integer rank,nprocs,chunk_size,i
      integer maximum,mymax,ierr
      integer array(800) 
      integer istatus(MPI_STATUS_SIZE) 
C....................................................................
c..
c.. Turn on and initialize MPI:
c..
      call MPI_INIT(ierr)
      call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierr)
      call MPI_COMM_SIZE(MPI_COMM_WORLD,nprocs,ierr)

      chunk_size = 800/nprocs
      if(rank.eq.0) then
c.. Initialize array 
      do 100 i=1,800
      array(i) = i
 100  continue

      do 200 i=1,nprocs-1
      call MPI_Send(array(i*chunk_size+1),chunk_size,MPI_INTEGER,i,1,
     & MPI_COMM_WORLD,ierr)
 200  continue

      else
      call MPI_Recv(array,chunk_size,MPI_INTEGER,0,1,MPI_COMM_WORLD,
     & istatus,ierr)

      endif

c..
c Find Local Maximum
c..

      mymax = array(1)
      do 300 i=2,chunk_size
      if(mymax.lt.array(i)) mymax = array(i)
 300  continue
      write(*,*)
      write(*,*) 'For rank',rank
      write(*,*) 'the max is',mymax
      write(*,*)
c..
c..
      if(rank.eq.0) then
      maximum = mymax
      do 400 i=1,nprocs-1
      call MPI_Recv(mymax,1,MPI_INTEGER,MPI_ANY_SOURCE,1,MPI_COMM_WORLD,
     & istatus,ierr)
      if(maximum.lt.mymax) maximum=mymax
 400  continue
      write(*,*) 
      write(*,*) ' Maximum is : ',maximum
      write(*,*)
      else
      call MPI_Send(mymax,1,MPI_INTEGER,0,1,MPI_COMM_WORLD,ierr)
      endif

      call MPI_FINALIZE(ierr)
      stop
      end

