tauola-random.h

00001       SUBROUTINE RANMAR(RVEC,LENV)
00002 C ----------------------------------------------------------------------
00003 C<<<<<FUNCTION RANMAR(IDUMM)
00004 C CERNLIB V113, VERSION WITH AUTOMATIC DEFAULT INITIALIZATION
00005 C     Transformed to SUBROUTINE to be as in CERNLIB
00006 C     AM.Lutz   November 1988, Feb. 1989
00007 C
00008 C!Universal random number generator proposed by Marsaglia and Zaman
00009 C in report FSU-SCRI-87-50
00010 C        modified by F. James, 1988 and 1989, to generate a vector
00011 C        of pseudorandom numbers RVEC of length LENV, and to put in
00012 C        the COMMON block everything needed to specify currrent state,
00013 C        and to add input and output entry points RMARIN, RMARUT.
00014 C
00015 C     Unique random number used in the program
00016 C ----------------------------------------------------------------------
00017       COMMON / INOUT / INUT,IOUT
00018       DIMENSION RVEC(*)
00019       COMMON/RASET1/U(97),C,I97,J97
00020       PARAMETER (MODCNS=1000000000)
00021       DATA NTOT,NTOT2,IJKL/-1,0,0/
00022 C
00023       IF (NTOT .GE. 0)  GO TO 50
00024 C
00025 C        Default initialization. User has called RANMAR without RMARIN.
00026       IJKL = 54217137
00027       NTOT = 0
00028       NTOT2 = 0
00029       KALLED = 0
00030       GO TO 1
00031 C
00032       ENTRY      RMARIN(IJKLIN, NTOTIN,NTOT2N)
00033 C         Initializing routine for RANMAR, may be called before
00034 C         generating pseudorandom numbers with RANMAR. The input
00035 C         values should be in the ranges:  0<=IJKLIN<=900 OOO OOO
00036 C                                          0<=NTOTIN<=999 999 999
00037 C                                          0<=NTOT2N<<999 999 999!
00038 C To get the standard values in Marsaglia-s paper, IJKLIN=54217137
00039 C                                            NTOTIN,NTOT2N=0
00040       IJKL = IJKLIN
00041       NTOT = MAX(NTOTIN,0)
00042       NTOT2= MAX(NTOT2N,0)
00043       KALLED = 1
00044 C          always come here to initialize
00045     1 CONTINUE
00046       IJ = IJKL/30082
00047       KL = IJKL - 30082*IJ
00048       I = MOD(IJ/177, 177) + 2
00049       J = MOD(IJ, 177)     + 2
00050       K = MOD(KL/169, 178) + 1
00051       L = MOD(KL, 169)
00052       WRITE(IOUT,201) IJKL,NTOT,NTOT2
00053  201  FORMAT(1X,' RANMAR INITIALIZED: ',I10,2X,2I10)
00054       DO 2 II= 1, 97
00055       S = 0.
00056       T = .5
00057       DO 3 JJ= 1, 24
00058          M = MOD(MOD(I*J,179)*K, 179)
00059          I = J
00060          J = K
00061          K = M
00062          L = MOD(53*L+1, 169)
00063          IF (MOD(L*M,64) .GE. 32)  S = S+T
00064     3    T = 0.5*T
00065     2 U(II) = S
00066       TWOM24 = 1.0
00067       DO 4 I24= 1, 24
00068     4 TWOM24 = 0.5*TWOM24
00069       C  =   362436.*TWOM24
00070       CD =  7654321.*TWOM24
00071       CM = 16777213.*TWOM24
00072       I97 = 97
00073       J97 = 33
00074 C       Complete initialization by skipping
00075 C            (NTOT2*MODCNS + NTOT) random numbers
00076       DO 45 LOOP2= 1, NTOT2+1
00077       NOW = MODCNS
00078       IF (LOOP2 .EQ. NTOT2+1)  NOW=NTOT
00079       IF (NOW .GT. 0)  THEN
00080        WRITE (IOUT,'(A,I15)') ' RMARIN SKIPPING OVER ',NOW
00081        DO 40 IDUM = 1, NTOT
00082        UNI = U(I97)-U(J97)
00083        IF (UNI .LT. 0.)  UNI=UNI+1.
00084        U(I97) = UNI
00085        I97 = I97-1
00086        IF (I97 .EQ. 0)  I97=97
00087        J97 = J97-1
00088        IF (J97 .EQ. 0)  J97=97
00089        C = C - CD
00090        IF (C .LT. 0.)  C=C+CM
00091    40  CONTINUE
00092       ENDIF
00093    45 CONTINUE
00094       IF (KALLED .EQ. 1)  RETURN
00095 C
00096 C          Normal entry to generate LENV random numbers
00097    50 CONTINUE
00098       DO 100 IVEC= 1, LENV
00099       UNI = U(I97)-U(J97)
00100       IF (UNI .LT. 0.)  UNI=UNI+1.
00101       U(I97) = UNI
00102       I97 = I97-1
00103       IF (I97 .EQ. 0)  I97=97
00104       J97 = J97-1
00105       IF (J97 .EQ. 0)  J97=97
00106       C = C - CD
00107       IF (C .LT. 0.)  C=C+CM
00108       UNI = UNI-C
00109       IF (UNI .LT. 0.) UNI=UNI+1.
00110 C        Replace exact zeroes by uniform distr. *2**-24
00111          IF (UNI .EQ. 0.)  THEN
00112          UNI = TWOM24*U(2)
00113 C             An exact zero here is very unlikely, but lets be safe.
00114          IF (UNI .EQ. 0.) UNI= TWOM24*TWOM24
00115          ENDIF
00116       RVEC(IVEC) = UNI
00117   100 CONTINUE
00118       NTOT = NTOT + LENV
00119          IF (NTOT .GE. MODCNS)  THEN
00120          NTOT2 = NTOT2 + 1
00121          NTOT = NTOT - MODCNS
00122          ENDIF
00123       RETURN
00124 C           Entry to output current status
00125       ENTRY RMARUT(IJKLUT,NTOTUT,NTOT2T)
00126       IJKLUT = IJKL
00127       NTOTUT = NTOT
00128       NTOT2T = NTOT2
00129       RETURN
00130       END
Generated on Sun Oct 20 20:24:10 2013 for C++InterfacetoTauola by  doxygen 1.6.3