]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MINICERN/mathlib/gen/v/rndm2.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / MINICERN / mathlib / gen / v / rndm2.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1996/04/01 15:02:54 mclareni
6* Mathlib gen
7*
8*
9#include "gen/pilot.h"
10#if defined(CERNLIB_VAX)
11 OPTIONS /CHECK=NOOVERFLOW
12 FUNCTION RNDM2 ()
13C-----------------------------------------------------------------------
14C
15C... FUNCTION RNDM2 () Ch.Walck 870401
16C. slight mod. 940122
17C.
18C. Fortran version of RNDM2/IRNDM2/RD2IN/RD2OUT (CERN LIBRARY entry
19C. V107 on GENLIB) for VAX/VMS or AXP/OpenVMS written after the
20C. assembler routine.
21C.
22C. Calling sequences:
23C. R = RNDM2(DUMMY) Generate continuous uniform r.n.
24C. IR = IRNDM2(DUMMY) Generate discrete uniform r.n.
25C. CALL RD2IN ( ISEED1, ISEED2 ) Initialize seeds
26C. CALL RD2OUT ( ISEED1, ISEED2 ) Access seeds
27C.
28C. This generator has a sequence of 4.609.432.020.664.188.928 =
29C. 4.6*10**18 random numbers. The minimum value returned is 2**-25 =
30C. 0.000000030 and the maximum value is 1 - 2**24 = 0.999999940.
31C.
32C. The arithmetics involved causes integer overflows which is handled
33C. on VAX/VMS by calling ERRSET once from the main program as follows:
34C. CALL ERRSET(70,.TRUE.,.FALSE.,.FALSE.,.FALSE.,100)
35C. or by compiling this routine with /CHECK=NOOVERFLOW
36C. or, as here, by the VAX FORTRAN OPTIONS statement before and after
37C. the routine.
38C.
39C.----------------------------------------------------------------------
40 PARAMETER (MEXPO='FFFF807F'X,NEXPO=7)
41 SAVE MCGN, SRGN
42 INTEGER R0, R1, SRGN
43 EQUIVALENCE ( MAN, XMAN ), ( IR, R )
44 DATA MCGN/12345/, SRGN/1073/
45 R0 = IEOR ( ISHFT(SRGN,-15), SRGN )
46 R1 = ISHFT ( R0 , 17 )
47 SRGN = IEOR ( R0 ,R1 )
48 MCGN = 69069 * MCGN
49 MAN = ISHFT ( IEOR ( SRGN, MCGN ) , -8 )
50 XMAN = MAN
51 NSHFT = IAND ( ISHFT ( MAN, -NEXPO ), 31 )
52 NSHFT = NSHFT + 104
53 IR = IOR ( IAND ( MAN, MEXPO ), ISHFT ( NSHFT, NEXPO ) )
54 RNDM2 = R
55 RETURN
56C
57 ENTRY IRNDM2 ()
58 R0 = IEOR ( ISHFT(SRGN,-15), SRGN )
59 R1 = ISHFT ( R0 , 17 )
60 SRGN = IEOR ( R0, R1 )
61 MCGN = 69069 * MCGN
62 IRNDM2 = ISHFT ( IEOR ( MCGN, SRGN ) , -1 )
63 RETURN
64C
65 ENTRY RD2IN ( ISEED1, ISEED2 )
66 MCGN = ISEED1
67 SRGN = ISEED2
68 RETURN
69C
70 ENTRY RD2OUT ( ISEED1, ISEED2 )
71 ISEED1 = MCGN
72 ISEED2 = SRGN
73 RETURN
74 END
75#endif
76#if (defined(CERNLIB_VAX))&&(defined(CERNLIB_FORTRAN))&&(!defined(CERNLIB_F4))&&(defined(CERNLIB_OLD))
77 FUNCTION RNDM2 (DUMMY)
78C
79C VERY USEFULL FORTRAN VERSION OF RNDM2
80C
81 INTEGER*4 M(6)
82C
83 INTEGER*4 MCGN,SRGN,REGB,REGC,REGD
84 DATA MCGN,SRGN /12345,1073/
85C
86 DATA M /'00F00000'X,'000F0000'X,'0000F000'X,
87 1 '00000F00'X,'000000F0'X,'0000000F'X/
88C
89 DATA ICALL /0/
90 ICALL= ICALL+1
91* WRITE(6,100)ICALL
92C
93 REGB= SRGN
94 REGC= REGB
95 REGC= ISHFT (REGC,-15)
96 REGB= IEOR (REGB,REGC)
97 REGC= REGB
98 REGC= ISHFT (REGC,17)
99 REGB= IEOR (REGB,REGC)
100 SRGN= REGB
101 REGD= MCGN
102 REGD= REGD*69069
103 MCGN= REGD
104* WRITE(6,110)MCGN,SRGN
105 REGD= IEOR (REGB,REGD)
106 REGD= ISHFT (REGD,-8)
107 REGD= IAND(REGD,'40000000'X)
108 R=0.
109 DO II=1,6
110 IP=(II-6)*4
111 J=IAND(M(II),REGD)
112 JJ=ISHFT(J,IP)
113 R= R+JJ*(16.**-II)
114 ENDDO
115 RNDM2= R
116 RETURN
117 100 FORMAT(5X,I3,'-TH CALL TO RNDM2.FOR ')
118 110 FORMAT(5X,'MCGN,SRGN = ',2Z9.8)
119 END
120#endif
121#if defined(CERNLIB_UNIX)
122 FUNCTION RNDM2 (DUMMY)
123C
124C CERN PROGLIB# V107 RNDM2 .VERSION KERNALT 1.02 880323
125C ORIG. 7-APR-88, Ch. Walck, Stockholm
126C
127C Mods Date Comments
128C MARQUINA 90/05/06 Generalize code for UNIX machines
129C
130C- Uniform Random Number Generator
131
132C- Calling sequences:
133C- R = RNDM2 () Continuous uniform r.n. 0 to 1
134C- IR = IRNDM2 () Discrete uniform r.n. 0 to 2**31-1
135C- CALL RD2IN (ISEED1,ISEED2) Set seeds
136C- CALL RD2OUT (ISEED1,ISEED2) Get seeds
137
138 EQUIVALENCE (ZERO,IZERO)
139 SAVE MCGN, MCGX
140 DATA MCGN/12345/, MCGX/1073/
141#include "v107z0.inc"
142
143C---- Floating random number
144
145#include "v107rn.inc"
146 IF (MANT.EQ.0) GO TO 14
147 AMAN = MANT
148 RNDM2 = AMAN * 2.**(-24)
149 RETURN
150
151C-- for zero set RNDM2 = 2.**(-25)
152 14 IZERO = IZ0
153 RNDM2 = ZERO
154 RETURN
155
156C--- Integer random number
157
158 ENTRY IRNDM2 (DUMMY)
159#include "v107ri.inc"
160 RETURN
161
162C---- Set seeds
163
164 ENTRY RD2IN (ISEED1, ISEED2)
165 MCGN = ISEED1
166 MCGX = ISEED2
167 RETURN
168
169C---- Get seeds
170
171 ENTRY RD2OUT (ISEED1, ISEED2)
172 ISEED1 = MCGN
173 ISEED2 = MCGX
174 RETURN
175 END
176#endif