      PROGRAM rnd_omp
!
      implicit none
!
      INTEGER,  PARAMETER  ::  rp = 4
      INTEGER,  PARAMETER  ::  ns = 2
      REAL(rp),  DIMENSION(1:4)  ::  X
      INTEGER  ::  K
      INTEGER,  DIMENSION (1:ns)  ::  iseed
      INTEGER   ::  nbthreads, my_rank
!
!$    EXTERNAL       OMP_GET_NUM_THREADS
!$    INTEGER    ::  OMP_GET_NUM_THREADS
!
!$    EXTERNAL       OMP_GET_THREAD_NUM
!$    INTEGER    ::  OMP_GET_THREAD_NUM
!
 1000 FORMAT (3(A,I3,1x) )
 1010 FORMAT (2(A,I3,1x),A,5I10)
 1020 FORMAT (A,I3,1x,A,5E11.4)
!
! Debut de la region parallele
!
!$OMP PARALLEL PRIVATE (K,iseed,my_rank,nbthreads,X) DEFAULT(NONE)
!
! Nombre de threads
      nbthreads = 1
!$    nbthreads = OMP_GET_NUM_THREADS ()
!
! Rang des threads
      my_rank = 0
!$    my_rank = OMP_GET_THREAD_NUM ()
!      
! 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
         STOP
      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)
!$OMP BARRIER
!
      iseed (1:K) = (modulo(iseed(1:K),nbthreads)+my_rank)*(iseed(1:K)/(nbthreads+my_rank) )
      write (6,1010) 'my_rank = ', my_rank, 'K = ', K, ' APRES iseed (1:K) = ', iseed (1:K)
      CALL FLUSH (6)
!$OMP BARRIER
!
! 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
!
!$OMP END PARALLEL
!
      STOP
      END PROGRAM rnd_omp
