FUNCTION ran1(iseed) C Returns a uniform random deviate between 0.0 and 1.0. Set iseed C to any negative value to initialize or reinitialize the sequence. C References: (1) Donald Knuth, The Art of Computer Programming, C Vol 2., "Seminumerical Algorithms", Second Edition, Addison- C Wesley, 1981. (Section 3.2.1.) (2) William H. Press et al, C Numerical Recipes, Cambridge Univ. Press, 1986. (Section 7.1.) C Programmer: B. G. Knapp, LASP, 86/04/24. C C RCS DATA C C $Header$ C C $Log$ C C IMPLICIT NONE INTEGER*4 m1,m2,m3,ia1,ia2,ia3,ic1,ic2,ic3 REAL*4 rm1,rm2 PARAMETER (m1=259200,ia1=7141,ic1=54773,rm1=1./m1) PARAMETER (m2=134456,ia2=8121,ic2=28411,rm2=1./m2) PARAMETER (m3=243000,ia3=4561,ic3=51349) LOGICAL init /.TRUE./ INTEGER*4 iseed,ix1,ix2,ix3,j REAL*4 r(97),ran1 IF (iseed .LT. 0 .OR. init) THEN C {Initialize} init = .FALSE. iseed = ABS(iseed) ix1 = MOD(ic1+iseed,m1) ix1 = MOD(ia1*ix1+ic1,m1) ix2 = MOD(ix1,m2) ix1 = MOD(ia1*ix1+ic1,m1) ix3 = MOD(ix1,m3) DO j=1,97 ix1 = MOD(ia1*ix1+ic1,m1) ix2 = MOD(ia2*ix2+ic2,m2) r(j) = (FLOAT(ix1)+FLOAT(ix2)*rm2)*rm1 ENDDO ENDIF C {Normal entry point, except when initializing} ix1 = MOD(ia1*ix1+ic1,m1) ix2 = MOD(ia2*ix2+ic2,m2) ix3 = MOD(ia3*ix3+ic3,m3) j = 1+(97*ix3)/m3 IF (j .LT. 1 .OR. j .GT. 97) PAUSE ran1 = r(j) r(j) = (FLOAT(ix1)+FLOAT(ix2)*rm2)*rm1 RETURN END