Millepede-II  V04-00-00_preview
 All Classes Files Functions Variables Enumerator Pages
randoms.f90
Go to the documentation of this file.
1 
2 ! Code converted using TO_F90 by Alan Miller
3 ! Date: 2012-03-16 Time: 11:09:33
4 
12 
20 
21 SUBROUTINE gbrshi(n,a)
22  IMPLICIT NONE
23  INTEGER :: i
24  INTEGER :: ian
25  INTEGER :: iboost
26  INTEGER :: ic
27  INTEGER :: idum
28  INTEGER :: irotor
29  INTEGER :: iseed
30  INTEGER :: it
31  INTEGER :: iwarm
32  INTEGER :: j
33  INTEGER :: jseed
34  INTEGER :: jwarm
35  INTEGER :: k
36  INTEGER :: m
37  INTEGER :: mbuff
38 
39  INTEGER, INTENT(IN) :: n
40  REAL, INTENT(OUT) :: a(*)
41  INTEGER, PARAMETER :: nb=511
42  INTEGER, PARAMETER :: ia=16807
43  INTEGER, PARAMETER :: im=2147483647
44  INTEGER, PARAMETER :: iq=127773
45  INTEGER, PARAMETER :: ir=2836
46  REAL, PARAMETER :: aeps=1.0e-10
47  REAL, PARAMETER :: scalin=4.6566125e-10
48  common/ranbuf/mbuff(0:nb),ian,ic,iboost
49 
50  INTEGER :: istart
51 
52  irotor(m,n)=ieor(ior(ishft(m,17),ishft(m,-15)),n)
53  DATA istart/0/,iwarm/10/,iseed/4711/
54  IF(istart /= 0) go to 20
55  WRITE(*,*) ' Automatic GBRSHI initialization using:'
56  ! initialize buffer
57 10 idum=iseed+9876543 ! prevent damage, if iseed=0
58  WRITE(*,*) ' ISEED=',iseed,' IWARM=',iwarm
59  DO j=0,nb+1 ! fill buffer
60  k=idum/iq ! minimal standard generator
61  idum=ia*(idum-k*iq)-ir*k ! with Schrages method
62  IF(idum < 0) idum=idum+im !
63  mbuff(j)=ishft(idum,1) ! fill in leading bit
64  END DO
65  ian=iand(ian,nb) ! mask angle
66  ic=1 ! set pointer
67  iboost=0
68  DO j=1,iwarm*nb ! warm up a few times
69  it=mbuff(ian) ! hit ball angle
70  mbuff(ian)=irotor(it,ic) ! new spin
71  ic=it ! replace red spin
72  ian=iand(it+iboost,nb) ! boost and mask angle
73  iboost=iboost+1 ! increment boost
74  END DO
75  IF(istart < 0) return ! return for RBNVIN
76  istart=1 ! set done-flag
77  ! generate array of r.n.
78  20 DO i=1,n
79  it=mbuff(ian) ! hit ball angle
80  mbuff(ian)=irotor(it,ic) ! new spin
81  ic=it ! replace red spin
82  ian=iand(it+iboost,nb) ! boost and mask angle
83  a(i)=float(ishft(it,-1))*scalin+aeps ! avoid zero output
84  iboost=iboost+1 ! increment boost
85  END DO
86  iboost=iand(iboost,nb)
87  return
88 
89  entry gbrvin(jseed,jwarm) ! initialize, but only once
90  IF(istart == 0) THEN
91  WRITE(*,*) ' Gbrshi initialization by GBRVIN-call using:'
92  iseed=jseed ! copy seed and
93  iwarm=jwarm ! warm-up parameter
94  istart=-1 ! start flag
95  go to 10
96  END IF
97 END SUBROUTINE gbrshi
98 
100 SUBROUTINE gbrtim
101  IMPLICIT NONE
102  INTEGER :: jseed
103  REAL :: time
104 
105  LOGICAL :: done
106  DATA done/.false./
107  IF(done) return
108  jseed=time()
109  WRITE(*,*) ' Gbrshi initialialization using Time()'
110  CALL gbrvin(jseed,10)
111  done=.true.
112 END SUBROUTINE gbrtim
113 
117 
118 REAL FUNCTION uran() ! U(0,1)
119  IMPLICIT NONE
120  INTEGER :: indx
121  INTEGER :: ndim
122 
123  parameter(ndim=100)
124  REAL :: buffer(ndim)
125  DATA indx/ndim/
126  SAVE indx,buffer
127  indx=mod(indx,ndim)+1
128  IF(indx == 1) CALL gbrshi(ndim,buffer)
129  uran=buffer(indx)
130 END FUNCTION uran
131 
135 
136 REAL FUNCTION gran() ! N(0,1)
137  IMPLICIT NONE
138  REAL :: al
139  REAL :: cs
140  INTEGER :: indx
141  INTEGER :: kn
142  INTEGER :: ndim
143  REAL :: radsq
144  REAL :: rn1
145  REAL :: rn2
146  REAL :: sn
147 
148  parameter(ndim=100)
149  REAL:: buffer(ndim)
150  DATA indx/ndim/,kn/1/
151  SAVE indx,buffer,kn,cs,al
152  ! ...
153  IF(kn <= 1) THEN
154  ! two U(-1,+1) random numbers
155 10 indx=mod(indx,ndim)+2
156  IF(indx == 2) CALL gbrshi(ndim,buffer)
157  rn1=buffer(indx-1)-1.0+buffer(indx-1)
158  rn2=buffer(indx )-1.0+buffer(indx)
159  radsq=rn1*rn1+rn2*rn2
160  IF(radsq > 1.0) go to 10 ! test point inside circle?
161  ! sine and cosine for random phi
162  sn=rn1/sqrt(radsq)
163  cs=rn2/sqrt(radsq)
164  ! transform to gaussians
165  al=sqrt(-2.0*alog(radsq))
166  kn =2
167  gran=sn*al
168  ELSE
169  kn =1
170  gran=cs*al
171  END IF
172 END FUNCTION gran