]>
Commit | Line | Data |
---|---|---|
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 () | |
13 | C----------------------------------------------------------------------- | |
14 | C | |
15 | C... FUNCTION RNDM2 () Ch.Walck 870401 | |
16 | C. slight mod. 940122 | |
17 | C. | |
18 | C. Fortran version of RNDM2/IRNDM2/RD2IN/RD2OUT (CERN LIBRARY entry | |
19 | C. V107 on GENLIB) for VAX/VMS or AXP/OpenVMS written after the | |
20 | C. assembler routine. | |
21 | C. | |
22 | C. Calling sequences: | |
23 | C. R = RNDM2(DUMMY) Generate continuous uniform r.n. | |
24 | C. IR = IRNDM2(DUMMY) Generate discrete uniform r.n. | |
25 | C. CALL RD2IN ( ISEED1, ISEED2 ) Initialize seeds | |
26 | C. CALL RD2OUT ( ISEED1, ISEED2 ) Access seeds | |
27 | C. | |
28 | C. This generator has a sequence of 4.609.432.020.664.188.928 = | |
29 | C. 4.6*10**18 random numbers. The minimum value returned is 2**-25 = | |
30 | C. 0.000000030 and the maximum value is 1 - 2**24 = 0.999999940. | |
31 | C. | |
32 | C. The arithmetics involved causes integer overflows which is handled | |
33 | C. on VAX/VMS by calling ERRSET once from the main program as follows: | |
34 | C. CALL ERRSET(70,.TRUE.,.FALSE.,.FALSE.,.FALSE.,100) | |
35 | C. or by compiling this routine with /CHECK=NOOVERFLOW | |
36 | C. or, as here, by the VAX FORTRAN OPTIONS statement before and after | |
37 | C. the routine. | |
38 | C. | |
39 | C.---------------------------------------------------------------------- | |
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 | |
56 | C | |
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 | |
64 | C | |
65 | ENTRY RD2IN ( ISEED1, ISEED2 ) | |
66 | MCGN = ISEED1 | |
67 | SRGN = ISEED2 | |
68 | RETURN | |
69 | C | |
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) | |
78 | C | |
79 | C VERY USEFULL FORTRAN VERSION OF RNDM2 | |
80 | C | |
81 | INTEGER*4 M(6) | |
82 | C | |
83 | INTEGER*4 MCGN,SRGN,REGB,REGC,REGD | |
84 | DATA MCGN,SRGN /12345,1073/ | |
85 | C | |
86 | DATA M /'00F00000'X,'000F0000'X,'0000F000'X, | |
87 | 1 '00000F00'X,'000000F0'X,'0000000F'X/ | |
88 | C | |
89 | DATA ICALL /0/ | |
90 | ICALL= ICALL+1 | |
91 | * WRITE(6,100)ICALL | |
92 | C | |
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) | |
123 | C | |
124 | C CERN PROGLIB# V107 RNDM2 .VERSION KERNALT 1.02 880323 | |
125 | C ORIG. 7-APR-88, Ch. Walck, Stockholm | |
126 | C | |
127 | C Mods Date Comments | |
128 | C MARQUINA 90/05/06 Generalize code for UNIX machines | |
129 | C | |
130 | C- Uniform Random Number Generator | |
131 | ||
132 | C- Calling sequences: | |
133 | C- R = RNDM2 () Continuous uniform r.n. 0 to 1 | |
134 | C- IR = IRNDM2 () Discrete uniform r.n. 0 to 2**31-1 | |
135 | C- CALL RD2IN (ISEED1,ISEED2) Set seeds | |
136 | C- 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 | ||
143 | C---- 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 | ||
151 | C-- for zero set RNDM2 = 2.**(-25) | |
152 | 14 IZERO = IZ0 | |
153 | RNDM2 = ZERO | |
154 | RETURN | |
155 | ||
156 | C--- Integer random number | |
157 | ||
158 | ENTRY IRNDM2 (DUMMY) | |
159 | #include "v107ri.inc" | |
160 | RETURN | |
161 | ||
162 | C---- Set seeds | |
163 | ||
164 | ENTRY RD2IN (ISEED1, ISEED2) | |
165 | MCGN = ISEED1 | |
166 | MCGX = ISEED2 | |
167 | RETURN | |
168 | ||
169 | C---- Get seeds | |
170 | ||
171 | ENTRY RD2OUT (ISEED1, ISEED2) | |
172 | ISEED1 = MCGN | |
173 | ISEED2 = MCGX | |
174 | RETURN | |
175 | END | |
176 | #endif |