SND@LHC Software
Loading...
Searching...
No Matches
randoms.f90 File Reference

Random numbers. More...

Go to the source code of this file.

Functions/Subroutines

subroutine gbrshi (n, a)
 F.Gutbrod random number generator.
 
subroutine gbrtim
 GBRSHI initialization using TIME().
 
real(mps) function uran ()
 Random number U(0,1) using RANSHI.
 
real(mps) function gran ()
 Gauss random number.
 

Detailed Description

Random numbers.

Author
Volker Blobel, University Hamburg, 2005-2009 (initial Fortran77 version)
Claus Kleinwort, DESY (maintenance and developement)

Random number generators for Uniform and Normal distribution:

URAN() for U(0,1)
GRAN() for N(0,1)

Definition in file randoms.f90.

Function/Subroutine Documentation

◆ gbrshi()

subroutine gbrshi ( integer(mpi), intent(in)  n,
real(mps), dimension(*), intent(out)  a 
)

F.Gutbrod random number generator.

Return N random numbers U(0,1) in array A(N). Initialization by entry GBRVIN.

Parameters
[in]nnumber of requested random number
[out]aarray of requested random number

Definition at line 40 of file randoms.f90.

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
Definition of constants.
Definition mpdef.f90:24
integer, parameter mps
Definition mpdef.f90:37

◆ gbrtim()

subroutine gbrtim

GBRSHI initialization using TIME().

Definition at line 121 of file randoms.f90.

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.

◆ gran()

real(mps) function gran

Gauss random number.

Returns
random number N(0,1)

Definition at line 161 of file randoms.f90.

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
integer, parameter parameter
Definition mpdef.f90:34
subroutine gbrshi(n, a)
F.Gutbrod random number generator.
Definition randoms.f90:41
real(mps) function gran()
Gauss random number.
Definition randoms.f90:162

◆ uran()

real(mps) function uran

Random number U(0,1) using RANSHI.

Returns
random number U(0,1)

Definition at line 141 of file randoms.f90.

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)
real(mps) function uran()
Random number U(0,1) using RANSHI.
Definition randoms.f90:142