2
3
4
5
6
7
8 INTEGER ISEED( 4 )
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 INTEGER M1, M2, M3, M4
43 parameter( m1 = 494, m2 = 322, m3 = 2508, m4 = 2549 )
44 DOUBLE PRECISION ONE
45 parameter( one = 1.0d+0 )
46 INTEGER IPW2
47 DOUBLE PRECISION R
48 parameter( ipw2 = 4096, r = one / ipw2 )
49
50
51 INTEGER IT1, IT2, IT3, IT4
52 DOUBLE PRECISION RNDOUT
53
54
55 INTRINSIC dble, mod
56
57
58 10 CONTINUE
59
60
61
62 it4 = iseed( 4 )*m4
63 it3 = it4 / ipw2
64 it4 = it4 - ipw2*it3
65 it3 = it3 + iseed( 3 )*m4 + iseed( 4 )*m3
66 it2 = it3 / ipw2
67 it3 = it3 - ipw2*it2
68 it2 = it2 + iseed( 2 )*m4 + iseed( 3 )*m3 + iseed( 4 )*m2
69 it1 = it2 / ipw2
70 it2 = it2 - ipw2*it1
71 it1 = it1 + iseed( 1 )*m4 + iseed( 2 )*m3 + iseed( 3 )*m2 +
72 $ iseed( 4 )*m1
73 it1 = mod( it1, ipw2 )
74
75
76
77 iseed( 1 ) = it1
78 iseed( 2 ) = it2
79 iseed( 3 ) = it3
80 iseed( 4 ) = it4
81
82
83
84 rndout = r*( dble( it1 )+r*( dble( it2 )+r*( dble( it3 )+r*
85 $ ( dble( it4 ) ) ) ) )
86
87 IF (rndout.EQ.1.0d+0) THEN
88
89
90
91
92
93
94
95
96
97
98 GOTO 10
99 END IF
100
102 RETURN
103
104
105