00001 SUBROUTINE PHORIN
00002 C.----------------------------------------------------------------------
00003 C.
00004 C. PHOTOS: PHOton radiation in decays RANdom number generator init
00005 C.
00006 C. Purpose: Initialse PHORAN with the user specified seeds in the
00007 C. array ISEED. For details see also: F. James CERN DD-
00008 C. Report November 1988.
00009 C.
00010 C. Input Parameters: ISEED(*)
00011 C.
00012 C. Output Parameters: URAN, CRAN, CDRAN, CMRAN, I97, J97
00013 C.
00014 C. Author(s): B. van Eijk and F. James Created at: 27/09/89
00015 C. Last Update: 22/02/90
00016 C.
00017 C.----------------------------------------------------------------------
00018 IMPLICIT NONE
00019 DOUBLE PRECISION DATA
00020 REAL*8 S,T
00021 INTEGER I,IS1,IS2,IS3,IS4,IS5,J
00022 INTEGER ISEED,I97,J97
00023 REAL*8 URAN,CRAN,CDRAN,CMRAN
00024 COMMON/PHSEED/ISEED(2),I97,J97,URAN(97),CRAN,CDRAN,CMRAN
00025 C--
00026 C-- Check value range of seeds
00027 IF ((ISEED(1).LT.0).OR.(ISEED(1).GE.31328)) THEN
00028 DATA=ISEED(1)
00029 CALL PHOERR(8,'PHORIN',DATA)
00030 ENDIF
00031 IF ((ISEED(2).LT.0).OR.(ISEED(2).GE.30081)) THEN
00032 DATA=ISEED(2)
00033 CALL PHOERR(9,'PHORIN',DATA)
00034 ENDIF
00035 C--
00036 C-- Calculate Marsaglia and Zaman seeds (by F. James)
00037 IS1=MOD(ISEED(1)/177,177)+2
00038 IS2=MOD(ISEED(1),177)+2
00039 IS3=MOD(ISEED(2)/169,178)+1
00040 IS4=MOD(ISEED(2),169)
00041 DO 20 I=1,97
00042 S=0.D0
00043 T=0.5D0
00044 DO 10 J=1,24
00045 IS5=MOD (MOD(IS1*IS2,179)*IS3,179)
00046 IS1=IS2
00047 IS2=IS3
00048 IS3=IS5
00049 IS4=MOD(53*IS4+1,169)
00050 IF (MOD(IS4*IS5,64).GE.32) S=S+T
00051 10 T=0.5D0*T
00052 20 URAN(I)=S
00053 CRAN=362436.D0/16777216.D0
00054 CDRAN=7654321.D0/16777216.D0
00055 CMRAN=16777213.D0/16777216.D0
00056 I97=97
00057 J97=33
00058 RETURN
00059 END
00060 FUNCTION PHORAN(IDUM)
00061 C.----------------------------------------------------------------------
00062 C.
00063 C. PHOTOS: PHOton radiation in decays RANdom number generator based
00064 C. on Marsaglia Algorithm
00065 C.
00066 C. Purpose: Generate uniformly distributed random numbers between
00067 C. 0 and 1. Super long period: 2**144. See also:
00068 C. G. Marsaglia and A. Zaman, FSU-SCR-87-50, for seed mo-
00069 C. difications to this version see: F. James DD-Report,
00070 C. November 1988. The generator has to be initialized by
00071 C. a call to PHORIN.
00072 C.
00073 C. Input Parameters: IDUM (integer dummy)
00074 C.
00075 C. Output Parameters: Function value
00076 C.
00077 C. Author(s): B. van Eijk, G. Marsaglia and Created at: 27/09/89
00078 C. A. Zaman Last Update: 27/09/89
00079 C.
00080 C.----------------------------------------------------------------------
00081 IMPLICIT NONE
00082 REAL*8 PHORAN
00083 INTEGER IDUM
00084 INTEGER ISEED,I97,J97
00085 REAL*8 URAN,CRAN,CDRAN,CMRAN
00086 COMMON/PHSEED/ISEED(2),I97,J97,URAN(97),CRAN,CDRAN,CMRAN
00087 10 PHORAN=URAN(I97)-URAN(J97)
00088 IF (PHORAN.LT.0.D0) PHORAN=PHORAN+1.D0
00089 URAN(I97)=PHORAN
00090 I97=I97-1
00091 IF (I97.EQ.0) I97=97
00092 J97=J97-1
00093 IF (J97.EQ.0) J97=97
00094 CRAN=CRAN-CDRAN
00095 IF (CRAN.LT.0.D0) CRAN=CRAN+CMRAN
00096 PHORAN=PHORAN-CRAN
00097 IF (PHORAN.LT.0.D0) PHORAN=PHORAN+1.D0
00098 IF (PHORAN.LE.0.D0) GOTO 10
00099 RETURN
00100 END