C 0<= IJ <= 31328 C 0<= KL <= 30081 real function ggran(iran) ! gran for "good random" integer iran INTEGER MYTRUE PARAMETER (MYTRUE = 42) INTEGER RNOTIN,ij,kl real r save RNOTIN if(RNOTIN .ne. MYTRUE) then ij = iran/30082 kl = iran - ij*30082 if(kl.gt.31328) kl = 31328 call rmarin(ij,kl) RNOTIN = MYTRUE endif call ranmar(r,1) ggran = r return end C C C********************************************************************** C Universal random number generator proposed by Marsaglia and Zaman C in report FSU-SCRI-87-50 C slightly modified by F. James, 1988, to genverate a vector C of pseudorandom numbers RVEC of length LEN C and making the COMMON block include everything needed to C specify completely the state of the generator. C slightly modified by G.A. Kohring to ensure that the C the generator has been initialized at least once. C********************************************************************** C C SUBROUTINE RANMAR(RVEC,LEN) IMPLICIT NONE INTEGER MYTRUE PARAMETER (MYTRUE = 42) INTEGER I97,J97,IVEC,LEN,RNOTIN REAL RVEC(*),C,CD,CM,U(97),UNI COMMON /RASET1/U,C,CD,CM,I97,J97,RNOTIN C IF (RNOTIN .NE. MYTRUE) THEN PRINT *,' ERROR: RANMAR not initialized. Exiting' STOP END IF C DO 100 IVEC=1,LEN UNI=U(I97)-U(J97) IF (UNI .LT. 0.0) UNI=UNI+1.0 U(I97)=UNI I97=I97-1 IF (I97 .EQ. 0) I97=97 J97=J97-1 IF (J97 .EQ. 0) J97=97 C=C-CD IF (C .LT. 0.0) C=C+CM UNI=UNI-C IF (UNI .LT. 0.0) UNI=UNI+1.0 RVEC(IVEC)=UNI 100 CONTINUE C RETURN END C C C********************************************************************** C Initializing routine for RANMAR, must be called before generating any C pseudorandom numbers with RANMAR. The input values should be in the C ranges: C 0<= IJ <= 31328 C 0<= KL <= 30081 C C To get the standard values in the Marsaglia-Zaman paper, C put IJ=1802, KL= 9373. C********************************************************************** C C SUBROUTINE RMARIN(IJ,KL) IMPLICIT NONE INTEGER MYTRUE PARAMETER (MYTRUE = 42) INTEGER I,J,K,L,I97,J97,II,JJ,IJ,KL,M,RNOTIN REAL C,CD,CM,U(97),S,T LOGICAL NDONE COMMON /RASET1/U,C,CD,CM,I97,J97,RNOTIN DATA NDONE/.TRUE./ SAVE NDONE C IF (NDONE) THEN NDONE = .FALSE. RNOTIN = MYTRUE ELSE PRINT *,' WARNING: RANMAR has already been initialized' END IF C IF ( ( (IJ .LT. 0) .OR. (IJ .GT. 31328) ) .OR. & ( (KL .LT. 0) .OR. (KL .GT. 30081) ) ) THEN print *, 'ERROR: RANMAR initializers are out of range.' print *, ' Usage is RMARIN(IJ,KL) where: ' print *, ' 0<= IJ <= 31328 and 0<= KL <= 30081 ' STOP END IF C I=MOD(IJ/177,177)+2 J=MOD(IJ,177)+2 K=MOD(KL/169,178)+1 L=MOD(KL,169) C PRINT '(A,2I7,4I4)',' RANMAR INITIALIZED: ',IJ,KL,I,J,K,L C DO 2 II=1,97 S=0.0 T=0.5 DO 3 JJ=1,24 M=MOD(MOD(I*J,179)*K,179) I=J J=K K=M L=MOD(53*L+1,169) IF (MOD(L*M,64) .GE. 32) S=S+T T=0.5*T 3 CONTINUE U(II)=S 2 CONTINUE C C = 362436.0/16777216.0 CD= 7654321.0/16777216.0 CM=16777213.0/16777216.0 I97=97 J97=33 C RETURN END