SND@LHC Software
Loading...
Searching...
No Matches
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
39
40SUBROUTINE gbrshi(n,a)
41 USE mpdef
42
43 IMPLICIT NONE
44 INTEGER(mpi) :: i
45 INTEGER(mpi) :: ian
46 INTEGER(mpi) :: iboost
47 INTEGER(mpi) :: ic
48 INTEGER(mpi) :: idum
49 INTEGER(mpi) :: irotor
50 INTEGER(mpi) :: iseed
51 INTEGER(mpi) :: it
52 INTEGER(mpi) :: iwarm
53 INTEGER(mpi) :: j
54 INTEGER(mpi) :: jseed
55 INTEGER(mpi) :: jwarm
56 INTEGER(mpi) :: k
57 INTEGER(mpi) :: m
58 INTEGER(mpi) :: mbuff
59
60 INTEGER(mpi), INTENT(IN) :: n
61 REAL(mps), INTENT(OUT) :: a(*)
62 INTEGER(mpi), PARAMETER :: nb=511
63 INTEGER(mpi), PARAMETER :: ia=16807
64 INTEGER(mpi), PARAMETER :: im=2147483647
65 INTEGER(mpi), PARAMETER :: iq=127773
66 INTEGER(mpi), PARAMETER :: ir=2836
67 REAL(mps), PARAMETER :: aeps=1.0e-10
68 REAL(mps), PARAMETER :: scalin=4.6566125e-10
69 common/ranbuf/mbuff(0:nb),ian,ic,iboost
70
71 INTEGER(mpi) :: istart
72
73 irotor(m,n)=ieor(ior(ishft(m,17),ishft(m,-15)),n)
74 DATA istart/0/,iwarm/10/,iseed/4711/
75 IF(istart /= 0) GO TO 20
76 WRITE(*,*) ' Automatic GBRSHI initialization using:'
77 ! initialize buffer
7810 idum=iseed+9876543 ! prevent damage, if iseed=0
79 WRITE(*,*) ' ISEED=',iseed,' IWARM=',iwarm
80 DO j=0,nb+1 ! fill buffer
81 k=idum/iq ! minimal standard generator
82 idum=ia*(idum-k*iq)-ir*k ! with Schrages method
83 IF(idum < 0) idum=idum+im !
84 mbuff(j)=ishft(idum,1) ! fill in leading bit
85 END DO
86 ian=iand(ian,nb) ! mask angle
87 ic=1 ! set pointer
88 iboost=0
89 DO j=1,iwarm*nb ! warm up a few times
90 it=mbuff(ian) ! hit ball angle
91 mbuff(ian)=irotor(it,ic) ! new spin
92 ic=it ! replace red spin
93 ian=iand(it+iboost,nb) ! boost and mask angle
94 iboost=iboost+1 ! increment boost
95 END DO
96 IF(istart < 0) RETURN ! return for RBNVIN
97 istart=1 ! set done-flag
98 ! generate array of r.n.
99 20 DO i=1,n
100 it=mbuff(ian) ! hit ball angle
101 mbuff(ian)=irotor(it,ic) ! new spin
102 ic=it ! replace red spin
103 ian=iand(it+iboost,nb) ! boost and mask angle
104 a(i)=real(ishft(it,-1),mps)*scalin+aeps ! avoid zero output
105 iboost=iboost+1 ! increment boost
106 END DO
107 iboost=iand(iboost,nb)
108 RETURN
109
110 entry gbrvin(jseed,jwarm) ! initialize, but only once
111 IF(istart == 0) THEN
112 WRITE(*,*) ' Gbrshi initialization by GBRVIN-call using:'
113 iseed=jseed ! copy seed and
114 iwarm=jwarm ! warm-up parameter
115 istart=-1 ! start flag
116 GO TO 10
117 END IF
118END SUBROUTINE gbrshi
119
121SUBROUTINE gbrtim
122 USE mpdef
123
124 IMPLICIT NONE
125 INTEGER(mpi) :: jseed
126 REAL(mps) :: time
127
128 LOGICAL :: done
129 DATA done/.false./
130 IF(done) RETURN
131 jseed=time()
132 WRITE(*,*) ' Gbrshi initialialization using Time()'
133 CALL gbrvin(jseed,10)
134 done=.true.
135END SUBROUTINE gbrtim
136
140
141REAL(mps) FUNCTION uran() ! U(0,1)
142 USE mpdef
143
144 IMPLICIT NONE
145 INTEGER(mpi) :: indx
146 INTEGER(mpi) :: ndim
147
148 parameter(ndim=100)
149 REAL(mps) :: buffer(ndim)
150 DATA indx/ndim/
151 SAVE indx,buffer
152 indx=mod(indx,ndim)+1
153 IF(indx == 1) CALL gbrshi(ndim,buffer)
154 uran=buffer(indx)
155END FUNCTION uran
156
160
161REAL(mps) FUNCTION gran() ! N(0,1)
162 USE mpdef
163
164 IMPLICIT NONE
165 REAL(mps) :: al
166 REAL(mps) :: cs
167 INTEGER(mpi) :: indx
168 INTEGER(mpi) :: kn
169 INTEGER(mpi) :: ndim
170 REAL(mps) :: radsq
171 REAL(mps) :: rn1
172 REAL(mps) :: rn2
173 REAL(mps) :: sn
174
175 parameter(ndim=100)
176 REAL(mps) :: buffer(ndim)
177 DATA indx/ndim/,kn/1/
178 SAVE indx,buffer,kn,cs,al
179 ! ...
180 IF(kn <= 1) THEN
181 ! two U(-1,+1) random numbers
18210 indx=mod(indx,ndim)+2
183 IF(indx == 2) CALL gbrshi(ndim,buffer)
184 rn1=buffer(indx-1)-1.0+buffer(indx-1)
185 rn2=buffer(indx )-1.0+buffer(indx)
186 radsq=rn1*rn1+rn2*rn2
187 IF(radsq > 1.0) GO TO 10 ! test point inside circle?
188 ! sine and cosine for random phi
189 sn=rn1/sqrt(radsq)
190 cs=rn2/sqrt(radsq)
191 ! transform to gaussians
192 al=sqrt(-2.0*log(radsq))
193 kn =2
194 gran=sn*al
195 ELSE
196 kn =1
197 gran=cs*al
198 END IF
199END FUNCTION gran
Definition of constants.
Definition mpdef.f90:24
integer, parameter parameter
Definition mpdef.f90:34
integer, parameter mps
Definition mpdef.f90:37
real(mps) function uran()
Random number U(0,1) using RANSHI.
Definition randoms.f90:142
subroutine gbrshi(n, a)
F.Gutbrod random number generator.
Definition randoms.f90:41
real(mps) function gran()
Gauss random number.
Definition randoms.f90:162
subroutine gbrtim
GBRSHI initialization using TIME().
Definition randoms.f90:122