Millepede-II V04-17-04
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
31
33MODULE mprand
34 USE mpdef
35 IMPLICIT NONE
36
37 INTEGER(mpi), PARAMETER :: nb=511
38 INTEGER(mpi), PARAMETER :: ia=16807
39 INTEGER(mpi), PARAMETER :: im=2147483647
40 INTEGER(mpi), PARAMETER :: iq=127773
41 INTEGER(mpi), PARAMETER :: ir=2836
42 REAL(mps), PARAMETER :: aeps=1.0e-10
43 REAL(mps), PARAMETER :: scalin=4.6566125e-10
44 INTEGER(mpi) :: mbuff(0:nb+1),ian,ic,iboost
45 INTEGER(mpi) :: iseed = 4711
46 INTEGER(mpi) :: istart = 0
47 INTEGER(mpi) :: iwarm = 10
48
49END MODULE mprand
50
58
59SUBROUTINE gbrshi(n,a)
60 USE mprand
61
62 IMPLICIT NONE
63 INTEGER(mpi) :: i
64 INTEGER(mpi) :: idum
65 INTEGER(mpi) :: it
66 INTEGER(mpi) :: j
67 INTEGER(mpi) :: k
68
69 INTEGER(mpi), INTENT(IN) :: n
70 REAL(mps), INTENT(OUT) :: a(*)
71
72 IF(istart /= 0) GO TO 20
73 WRITE(*,*) ' Automatic GBRSHI initialization using:'
74 ! initialize buffer
75 idum=iseed+9876543 ! prevent damage, if iseed=0
76 WRITE(*,*) ' ISEED=',iseed,' IWARM=',iwarm
77 DO j=0,nb+1 ! fill buffer
78 k=idum/iq ! minimal standard generator
79 idum=ia*(idum-k*iq)-ir*k ! with Schrages method
80 IF(idum < 0) idum=idum+im !
81 mbuff(j)=ishft(idum,1) ! fill in leading bit
82 END DO
83 ian=iand(ian,nb) ! mask angle
84 ic=1 ! set pointer
85 iboost=0
86 DO j=1,iwarm*nb ! warm up a few times
87 it=mbuff(ian) ! hit ball angle
88 mbuff(ian)=ieor(ior(ishft(it,17),ishft(it,-15)),ic) ! new spin
89 ic=it ! replace red spin
90 ian=iand(it+iboost,nb) ! boost and mask angle
91 iboost=iboost+1 ! increment boost
92 END DO
93 istart=1 ! set done-flag
94 ! generate array of r.n.
95 20 CONTINUE
96 DO i=1,n
97 it=mbuff(ian) ! hit ball angle
98 mbuff(ian)=ieor(ior(ishft(it,17),ishft(it,-15)),ic) ! new spin
99 ic=it ! replace red spin
100 ian=iand(it+iboost,nb) ! boost and mask angle
101 a(i)=real(ishft(it,-1),mps)*scalin+aeps ! avoid zero output
102 iboost=iboost+1 ! increment boost
103 END DO
104 iboost=iand(iboost,nb)
105 RETURN
106END SUBROUTINE gbrshi
107
111SUBROUTINE gbrvin(jseed,jwarm)
112 USE mprand
113
114 IMPLICIT NONE
115 INTEGER(mpi) :: idum
116 INTEGER(mpi) :: it
117 INTEGER(mpi) :: j
118 INTEGER(mpi) :: k
119
120
121 INTEGER(mpi), INTENT(IN) :: jseed
122 INTEGER(mpi), INTENT(IN) :: jwarm
123
124 IF(istart == 0) THEN
125 WRITE(*,*) ' Gbrshi initialization by GBRVIN-call using:'
126 iseed=jseed ! copy seed and
127 iwarm=jwarm ! warm-up parameter
128 istart=-1 ! start flag
129 idum=iseed+9876543 ! prevent damage, if iseed=0
130 WRITE(*,*) ' ISEED=',iseed,' IWARM=',iwarm
131 DO j=0,nb+1 ! fill buffer
132 k=idum/iq ! minimal standard generator
133 idum=ia*(idum-k*iq)-ir*k ! with Schrages method
134 IF(idum < 0) idum=idum+im !
135 mbuff(j)=ishft(idum,1) ! fill in leading bit
136 END DO
137 ian=iand(ian,nb) ! mask angle
138 ic=1 ! set pointer
139 iboost=0
140 DO j=1,iwarm*nb ! warm up a few times
141 it=mbuff(ian) ! hit ball angle
142 mbuff(ian)=ieor(ior(ishft(it,17),ishft(it,-15)),ic) ! new spin
143 ic=it ! replace red spin
144 ian=iand(it+iboost,nb) ! boost and mask angle
145 iboost=iboost+1 ! increment boost
146 END DO
147 END IF
148END SUBROUTINE gbrvin
149
151SUBROUTINE gbrtim
152 USE mpdef
153
154 IMPLICIT NONE
155 INTEGER(mpi) :: jseed
156 REAL(mps) :: time
157
158 LOGICAL :: done
159 DATA done/.false./
160 IF(done) RETURN
161 jseed=time()
162 WRITE(*,*) ' Gbrshi initialialization using Time()'
163 CALL gbrvin(jseed,10)
164 done=.true.
165END SUBROUTINE gbrtim
166
170
171REAL(mps) FUNCTION uran() ! U(0,1)
172 USE mpdef
173
174 IMPLICIT NONE
175 INTEGER(mpi) :: indx
176 INTEGER(mpi) :: ndim
177
178 parameter(ndim=100)
179 REAL(mps) :: buffer(ndim)
180 DATA indx/ndim/
181 SAVE indx,buffer
182 indx=mod(indx,ndim)+1
183 IF(indx == 1) CALL gbrshi(ndim,buffer)
184 uran=buffer(indx)
185END FUNCTION uran
186
190
191REAL(mps) FUNCTION gran() ! N(0,1)
192 USE mpdef
193
194 IMPLICIT NONE
195 REAL(mps) :: al
196 REAL(mps) :: cs
197 INTEGER(mpi) :: indx
198 INTEGER(mpi) :: kn
199 INTEGER(mpi) :: ndim
200 REAL(mps) :: radsq
201 REAL(mps) :: rn1
202 REAL(mps) :: rn2
203 REAL(mps) :: sn
204
205 parameter(ndim=100)
206 REAL(mps) :: buffer(ndim)
207 DATA indx/ndim/,kn/1/
208 SAVE indx,buffer,kn,cs,al
209 ! ...
210 IF(kn <= 1) THEN
211 ! two U(-1,+1) random numbers
21210 indx=mod(indx,ndim)+2
213 IF(indx == 2) CALL gbrshi(ndim,buffer)
214 rn1=buffer(indx-1)-1.0+buffer(indx-1)
215 rn2=buffer(indx )-1.0+buffer(indx)
216 radsq=rn1*rn1+rn2*rn2
217 IF(radsq > 1.0) GO TO 10 ! test point inside circle?
218 ! sine and cosine for random phi
219 sn=rn1/sqrt(radsq)
220 cs=rn2/sqrt(radsq)
221 ! transform to gaussians
222 al=sqrt(-2.0*log(radsq))
223 kn =2
224 gran=sn*al
225 ELSE
226 kn =1
227 gran=cs*al
228 END IF
229END FUNCTION gran
Definition of constants.
Definition: mpdef.f90:24
integer, parameter mps
single precision
Definition: mpdef.f90:37
data for random generator
Definition: randoms.f90:33
integer(mpi) iseed
Definition: randoms.f90:45
integer(mpi), parameter ir
Definition: randoms.f90:41
integer(mpi), dimension(0:nb+1) mbuff
Definition: randoms.f90:44
integer(mpi), parameter ia
Definition: randoms.f90:38
integer(mpi), parameter iq
Definition: randoms.f90:40
integer(mpi), parameter nb
Definition: randoms.f90:37
real(mps), parameter aeps
Definition: randoms.f90:42
integer(mpi) ic
Definition: randoms.f90:44
integer(mpi), parameter im
Definition: randoms.f90:39
integer(mpi) iwarm
Definition: randoms.f90:47
real(mps), parameter scalin
Definition: randoms.f90:43
integer(mpi) ian
Definition: randoms.f90:44
integer(mpi) istart
Definition: randoms.f90:46
integer(mpi) iboost
Definition: randoms.f90:44
real(mps) function uran()
Random number U(0,1) using RANSHI.
Definition: randoms.f90:172
subroutine gbrshi(n, a)
F.Gutbrod random number generator.
Definition: randoms.f90:60
real(mps) function gran()
Gauss random number.
Definition: randoms.f90:192
subroutine gbrtim
GBRSHI initialization using TIME().
Definition: randoms.f90:152
subroutine gbrvin(jseed, jwarm)
initialize, but only once
Definition: randoms.f90:112