      PROGRAM rnd_mpi
!
      implicit none
!
      include 'mpif.h'
!
      INTEGER,  PARAMETER  ::  rp = 4
      INTEGER,  PARAMETER  ::  ns = 2
      REAL(rp), DIMENSION(1:4)  ::  X
      INTEGER   ::  K
      INTEGER,  DIMENSION(1:ns)  ::  iseed
      INTEGER   ::  ierr = 0
      INTEGER   ::  nbproc, my_rank
!
 1000 FORMAT (3(A,I3,1x) )
 1010 FORMAT (2(A,I3,1x),A,5I10)
 1020 FORMAT (A,I3,1x,A,5E11.4)
!
      CALL MPI_INIT (ierr)
      CALL MPI_COMM_SIZE (MPI_COMM_WORLD, nbproc,  ierr)
      CALL MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr)
!
! taille du stockage pour le germe du generateur pseudo-aleatoire
      CALL random_seed (size=K)
      IF (ns < K) THEN
         write (6,1000) 'my_rank = ', my_rank, 'K = ', K, 'ns = ', ns
         CALL MPI_ABORT (MPI_COMM_WORLD, 1, ierr)
      END IF
!
! on recupere la valeur courante du germe
      CALL random_seed (get=iseed(1:K) )
!
! on initialise le germe, de maniere processus dependante
      write (6,1010) 'my_rank = ', my_rank, 'K = ', K, ' AVANT iseed (1:K) = ', iseed (1:K)
      CALL FLUSH (6)
      CALL MPI_BARRIER (MPI_COMM_WORLD, ierr)
!
      iseed (1:K) = (modulo(iseed(1:K),nbproc) + my_rank) * (iseed(1:K) / (nbproc+my_rank) )
      write (6,1010) 'my_rank = ', my_rank, 'K = ', K, ' APRES iseed (1:K) = ', iseed (1:K)
      CALL FLUSH (6)
      CALL MPI_BARRIER (MPI_COMM_WORLD, ierr)
!
! on initialise le generateur avec le germe, chaque processus le sien
      CALL random_seed (put=iseed(1:k) )
!
! on initialise X avec des nombres pseudo-aleatoires 0 <= X < 1
      CALL random_number (harvest=X)
      write (6,1020) 'my_rank = ', my_rank, 'X = ', X
!
      CALL MPI_FINALIZE (ierr)
!
      STOP
!
      END PROGRAM rnd_mpi
