Statistics
| Branch: | Revision:

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