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