
c
c
c     ##################################################################
c     ##################################################################
c     ######                                                      ######
c     ######                SUBROUTINE RANARY                     ######
c     ######                                                      ######
c     ######                Copyright (c) 1992                    ######
c     ######  Center for the Analysis and Prediction of Storms    ######
c     ######    University of Oklahoma.  All rights reserved.     ######
c     ######                                                      ######
c     ##################################################################
c     ##################################################################
c
      SUBROUTINE RANARY(nx,ny,nx1,nx2,ny1,ny2,iseed,amplit, rantp)
c
c#######################################################################
c
c     PURPOSE:
c
c     Generates a 2-D array of machine-independent random numbers between
c     -amplit and +amplit with the average value equal to zero. The 
c     input parameter, iseed, must be a negative integer number which needs 
c     to be defined only once in the calling subroutine program.
c
c#######################################################################
c
c     AUTHOR: V.Wong and X.Song
c     7/20/1992.
c
c     Modification history:
c     7/25/1992. (MX)
c     Modified to allow assignment on a portion of the array.
c
c#######################################################################
c
c     INPUT:
c
c       nx         Number of random numbers in the x-direction 
c       ny         Number of random numbers in the y-direction
c       nx1,nx2    Begin and end 1st array indecies specifying a 
c                  subdomain in which the average is set to zero
c       ny1,ny2    Begin and end 2nd array indecies specifying a 
c                  subdomain in which the average is set to zero
c       iseed      an arbitrary negative integer as a seed for a 
c                  sequence of random numbers 
c       amplit     The generated numbers stay within the range
c                  [-amplit,amplit] 
c
c     OUTPUT:
c
c       rantp      The array for storing random numbers
c
c     WORK ARRAY:
c
c       rantp      Temporary working array
c
c
c#######################################################################
c
c
c
c#######################################################################
c
c
c     Variable Declarations:
c
c#######################################################################
c
      implicit none        ! Force explicit declarations
c
      integer i,j 
      integer nx,ny        ! Number of random numbers in each direction
      integer nx1,nx2      ! Begin and end 1st array indecies specifying 
                           ! a subdomain in which the average is set to zero
      integer ny1,ny2      ! Begin and end 2nd array indecies specifying 
                           ! a subdomain in which the average is set to zero
      integer iseed        ! The seed for random number generation
      real amplit          ! The generated numbers stay within 
                           ! [-amplit, amplit]
      real rantp (nx,ny)   ! Temporary working array for storing the numbers  
      real ran3            ! The function to generate random number.
c
c#######################################################################
c
c     Miscellaneous local variables:
c
c#######################################################################
c
      real wv,ranave,rantpmax
c
c#######################################################################
c
c     Functions called: 
c
c#######################################################################
c
      external ran3
c
C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
C
C     Beginning of executable code...
C
C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
c

c
c#######################################################################
c
c     Generate random numbers between 0 and 1, for a given iseed. 
c
c#######################################################################
c
      ranave=0.0
      DO 10 j=nx1,nx2
      DO 10 i=ny1,ny2
        rantp(i,j)=ran3(iseed)
        ranave=ranave+rantp(i,j)
10    CONTINUE
      ranave=ranave/(float( (nx2-nx1+1)*(ny2-ny1+1) ))
c
c#######################################################################
c
c     Adjust the random numbers so that the new plane average value 
c     equals zero and the random numbers stay within the range
c     [-amplit, amplit].
c
c#######################################################################
c
      rantpmax=0.0
      DO 20 j=ny1,ny2
      DO 20 i=nx1,nx2
        rantpmax=amax1(rantpmax,abs(ranave-rantp(i,j)))
20    CONTINUE
c
      wv=amplit/rantpmax
c
      DO 30 j=ny1,ny2
      DO 30 i=nx1,nx2
        rantp(i,j)=(rantp(i,j)-ranave)*wv
30    CONTINUE
c
      RETURN
      END
c
c
c     ##################################################################
c     ##################################################################
c     ######                                                      ######
c     ######                  FUNCTION RAN3                       ######
c     ######                                                      ######
c     ######  Center for the Analysis and Prediction of Storms    ######
c     ######    University of Oklahoma.                           ######
c     ######                                                      ######
c     ######       Reference: "Seminumerical Algorithms" by       ###### 
c     ######                   Donald Knuth                       ######
c     ######                                                      ######
c     ##################################################################
c     ##################################################################
c
      FUNCTION RAN3(iseed)
c
c#######################################################################
c
c     PURPOSE:
c
c     Generates a random number between 0 and 1 by feeding
c     a negative integer iseed.
c
c#######################################################################
c
c     INPUT :
c
c       iseed      an arbitrary negative integer as a seed for a 
c                  sequence of random numbers 
c
c     OUTPUT:
c
c       ran3       A random number between 0 and 1.
c
c#######################################################################
c
      
c
c#######################################################################
c
c     Variable Declarations:
c
c#######################################################################
c
      implicit none        ! Force explicit declarations
c
      integer iseed        ! The seed for random number generation
      real ran3            ! The function to generate random number.
c
c#######################################################################
c
c     Miscellaneous local variables:
c
c#######################################################################
c
      integer mbig,mseed,mz,k,ii,inext,inextp,i,iff,mk,mj
      real fac 

      parameter (mbig=1000000000,mseed=161803398,mz=0,fac=1.e-9)
      integer ma(55)
      data iff /0/
      save iff, inext, inextp, ma
c
C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
C
C     Beginning of executable code...
C
C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
c

c
c######################################################################
c
c     Initialize the sequence of random numbers between 0 and 1,
c     using iseed.
c
c######################################################################
c 
      IF (iseed.lt.0.or.iff.eq.0) THEN
        iff=1
        mj=mseed-iabs(iseed)
        mj=mod(mj,mbig)
        ma(55)=mj
        mk=1
        DO 11 i=1,54
          ii=mod(21*i,55)
          ma(ii)=mk
          mk=mj-mk
          IF (mk.lt.mz) mk=mk+mbig
          mj=ma(ii)
11      CONTINUE
c
        DO 13 k=1,4
          DO 12 i=1,55
            ma(i)=ma(i)-ma(1+mod(i+30,55))
            IF (ma(i).lt.mz) ma(i)=ma(i)+mbig
12        CONTINUE
13      CONTINUE
c
        inext=0
        inextp=31
        iseed=1
      ENDIF
c
c######################################################################
c
c     Start to generate a random number
c
c######################################################################
c
      inext=inext+1
      IF (inext.eq.56) inext=1
      inextp=inextp+1
      IF (inextp.eq.56) inextp=1
      mj=ma(inext)-ma(inextp)
      IF (mj.lt.mz) mj=mj+mbig
      ma(inext)=mj
      ran3=mj*fac
c
      RETURN
      END


