root / synthbench / euroben-shm / mod2as / ranmod.f
History | View | Annotate | Download (2.7 kB)
1 | 0:839f52ef7657 | louridas | Module ran_module |
---|---|---|---|
2 | 0:839f52ef7657 | louridas | ! ---------------------------------------------------------------------- |
3 | 0:839f52ef7657 | louridas | Use numerics |
4 | 0:839f52ef7657 | louridas | |
5 | 0:839f52ef7657 | louridas | Integer, Parameter :: m1 = 259200, a1 = 7141, c1 = 54773, |
6 | 0:839f52ef7657 | louridas | & m2 = 134456, a2 = 8121, c2 = 28411 |
7 | 0:839f52ef7657 | louridas | Real(l_), Parameter :: one = 1.0_l_, rm1 = one/m1, |
8 | 0:839f52ef7657 | louridas | & rm2 = one/m2 |
9 | 0:839f52ef7657 | louridas | Integer :: x1, x2 |
10 | 0:839f52ef7657 | louridas | ! ---------------------------------------------------------------------- |
11 | 0:839f52ef7657 | louridas | Contains |
12 | 0:839f52ef7657 | louridas | |
13 | 0:839f52ef7657 | louridas | Function dran0() Result( ran ) |
14 | 0:839f52ef7657 | louridas | ! ----------------------------------------------------------------- |
15 | 0:839f52ef7657 | louridas | Implicit None |
16 | 0:839f52ef7657 | louridas | |
17 | 0:839f52ef7657 | louridas | ! ----------------------------------------------------------------- |
18 | 0:839f52ef7657 | louridas | ! --- dran0 returns a uniform deviate in [0,1). |
19 | 0:839f52ef7657 | louridas | ! |
20 | 0:839f52ef7657 | louridas | ! --- The algorithm is loosely based on an algorithm from |
21 | 0:839f52ef7657 | louridas | ! Press & Teukolsky et.al. and based on the linear congruential |
22 | 0:839f52ef7657 | louridas | ! method with choices for M, A, and C that are given by |
23 | 0:839f52ef7657 | louridas | ! D. Knuth in "Semi-numerical algorithms". |
24 | 0:839f52ef7657 | louridas | ! --- Input parameters: |
25 | 0:839f52ef7657 | louridas | ! Integer - a1, c1, m1, a2, c2, m2. The parameters of the two |
26 | 0:839f52ef7657 | louridas | ! linear congruent relations used. They are passed |
27 | 0:839f52ef7657 | louridas | ! via module 'ran_module'. |
28 | 0:839f52ef7657 | louridas | ! Integer - x1, x2. Seeds for the two linear congruences. |
29 | 0:839f52ef7657 | louridas | ! Passed via module 'ran_module'. |
30 | 0:839f52ef7657 | louridas | ! |
31 | 0:839f52ef7657 | louridas | ! --- Output-parameters: |
32 | 0:839f52ef7657 | louridas | ! Real(l_) - ran. Uniform deviate in [0,1) |
33 | 0:839f52ef7657 | louridas | ! ------------------------------------------------------------------ |
34 | 0:839f52ef7657 | louridas | ! |
35 | 0:839f52ef7657 | louridas | Real(l_) :: ran |
36 | 0:839f52ef7657 | louridas | ! ------------------------------------------------------------------ |
37 | 0:839f52ef7657 | louridas | x1 = Mod( a1*x1 + c1, m1 ) |
38 | 0:839f52ef7657 | louridas | x2 = Mod( a2*x2 + c2, m2 ) |
39 | 0:839f52ef7657 | louridas | ran = ( Real( x1, l_ ) + Real( x2, l_ )*rm2 )*rm1 |
40 | 0:839f52ef7657 | louridas | ! ----------------------------------------------------------------- |
41 | 0:839f52ef7657 | louridas | End Function dran0 |
42 | 0:839f52ef7657 | louridas | |
43 | 0:839f52ef7657 | louridas | Subroutine ranfil( a, n ) |
44 | 0:839f52ef7657 | louridas | ! ---------------------------------------------------------------------- |
45 | 0:839f52ef7657 | louridas | Implicit None |
46 | 0:839f52ef7657 | louridas | |
47 | 0:839f52ef7657 | louridas | Integer :: n |
48 | 0:839f52ef7657 | louridas | Real(l_) :: a(n) |
49 | 0:839f52ef7657 | louridas | |
50 | 0:839f52ef7657 | louridas | Integer :: i |
51 | 0:839f52ef7657 | louridas | ! ---------------------------------------------------------------------- |
52 | 0:839f52ef7657 | louridas | Do i = 1, n |
53 | 0:839f52ef7657 | louridas | a(i) = dran0() |
54 | 0:839f52ef7657 | louridas | End Do |
55 | 0:839f52ef7657 | louridas | ! ---------------------------------------------------------------------- |
56 | 0:839f52ef7657 | louridas | End Subroutine ranfil |
57 | 0:839f52ef7657 | louridas | |
58 | 0:839f52ef7657 | louridas | Subroutine rinit |
59 | 0:839f52ef7657 | louridas | ! ---------------------------------------------------------------------- |
60 | 0:839f52ef7657 | louridas | Implicit None |
61 | 0:839f52ef7657 | louridas | |
62 | 0:839f52ef7657 | louridas | Integer :: i |
63 | 0:839f52ef7657 | louridas | ! ---------------------------------------------------------------------- |
64 | 0:839f52ef7657 | louridas | Do i = 1, 97 ! --- Warming up phase. |
65 | 0:839f52ef7657 | louridas | x1 = Mod( a1*x1 + c1, m1 ) |
66 | 0:839f52ef7657 | louridas | x2 = Mod( a2*x2 + c2, m2 ) |
67 | 0:839f52ef7657 | louridas | End Do |
68 | 0:839f52ef7657 | louridas | ! ---------------------------------------------------------------------- |
69 | 0:839f52ef7657 | louridas | End Subroutine rinit |
70 | 0:839f52ef7657 | louridas | |
71 | 0:839f52ef7657 | louridas | ! ----------------------------------------------------------------- |
72 | 0:839f52ef7657 | louridas | End Module ran_module |