1
subroutine ntuple(x,a,b,ii,jconfig)
2
c-------------------------------------------------------
3
c Front to ranmar which allows user to easily
5
c------------------------------------------------------
10
double precision x,a,b
15
integer init, ioffset, joffset
16
integer ij, kl, iseed1,iseed2
22
c 18/6/2012 tjs promoted to integer*8 to avoid overflow for iseed > 60K
36
call get_offset(ioffset)
37
if (iseed .eq. 0) call get_base(iseed)
40
c Modified to allow for more sequences
41
c iseed can be between 0 and 30081*30081
42
c before pattern repeats
46
c multipied iseed to give larger values more likely to make change
47
c get offset for multiple runs of single process
51
c Updated to better divide iseed among ij and kl seeds
52
c Note it may still be possible to get identical ij,kl for
53
c different iseed, if have exactly compensating joffset, ioffset, jconfig
55
call get_moffset(joffset)
56
joffset = joffset * 3157
58
ij=1802+jconfig + mod(iseed,30081)
59
kl=9373+(iseed/30081)+ioffset + joffset !Switched to 30081 20/6/12 to avoid dupes in range 30082-31328
60
write(*,'(a,i6,a3,i6)') 'Using random seed offsets',jconfig," : ",ioffset
61
write(*,*) ' with seed', iseed/31300
62
do while (ij .gt. 31328)
65
do while (kl .gt. 30081)
71
do while (x .lt. 1d-16)
77
subroutine get_base(iseed)
78
c-------------------------------------------------------
79
c Looks for file iproc.dat to offset random number gen
80
c------------------------------------------------------
104
do while(.not. done .and. level .lt. 5)
105
open(unit=lun,file=fname,status='old',err=15)
108
fname = '../' // fname
110
if (i .gt. 0) fname=fname(1:i-1)
113
read(lun,'(a)',end=24,err=24) fname
115
if (i .gt. 0) fname=fname(i+1:)
116
read(fname,*,err=26,end=26) iseed
118
c write(*,*) 'Read iseed from randinit ',iseed
123
c write(*,*) 'No base found using iseed=0'
126
subroutine get_offset(iseed)
127
c-------------------------------------------------------
128
c Looks for file iproc.dat to offset random number gen
129
c------------------------------------------------------
147
open(unit=lun,file='./iproc.dat',status='old',err=15)
148
read(lun,*,err=14) iseed
152
15 open(unit=lun,file='../iproc.dat',status='old',err=25)
153
read(lun,*,err=24) iseed
160
subroutine get_moffset(iseed)
161
c-------------------------------------------------------
162
c Looks for file moffset.dat to offset random number gen
163
c------------------------------------------------------
181
open(unit=lun,file='./moffset.dat',status='old',err=25)
182
read(lun,*,err=14) iseed
183
write(*,*) "Got moffset",iseed
190
subroutine ranmar(rvec)
192
* universal random number generator proposed by marsaglia and zaman
193
* in report fsu-scri-87-50
194
* in this version rvec is a double precision variable.
195
implicit real*8(a-h,o-z)
196
common/ raset1 / ranu(97),ranc,rancd,rancm
197
common/ raset2 / iranmr,jranmr
198
save /raset1/,/raset2/
199
uni = ranu(iranmr) - ranu(jranmr)
200
if(uni .lt. 0d0) uni = uni + 1d0
204
if(iranmr .eq. 0) iranmr = 97
205
if(jranmr .eq. 0) jranmr = 97
207
if(ranc .lt. 0d0) ranc = ranc + rancm
209
if(uni .lt. 0d0) uni = uni + 1d0
213
subroutine rmarin(ij,kl)
215
* initializing routine for ranmar, must be called before generating
216
* any pseudorandom numbers with ranmar. the input values should be in
217
* the ranges 0<=ij<=31328 ; 0<=kl<=30081
218
implicit real*8(a-h,o-z)
219
character*30 filename
221
common/ raset1 / ranu(97),ranc,rancd,rancm
222
common/ raset2 / iranmr,jranmr
223
save /raset1/,/raset2/
224
* this shows correspondence between the simplified input seeds ij, kl
225
* and the original marsaglia-zaman seeds i,j,k,l.
226
* to get the standard values in the marsaglia-zaman paper (i=12,j=34
227
* k=56,l=78) put ij=1802, kl=9373
228
write(*,*) "Ranmar initialization seeds",ij,kl
230
c 18/6/2012 TJS Added check to ensure ij and kl are in range
232
if (ij .lt. 0 .or. ij .gt. 31328 .or.
233
$ kl .lt. 0 .or. kl .gt. 30081) then
234
filename='../../error'
235
INQUIRE(FILE="../../RunWeb", EXIST=file_exists)
236
if(.not.file_exists) filename = '../' // filename
237
open(unit=26,file=filename,status='unknown')
238
if (ij .lt. 0 .or. ij .gt. 31328) then
239
write(26,*) 'Bad initialization value of ij in rmarin ', ij
240
write(*,*) 'Bad initialization value of ij in rmarin ', ij
241
elseif (kl .lt. 0 .or. kl .gt. 30081) then
242
write(26,*) 'Bad initialization value of kl in rmarin ', kl
243
write(*,*) 'Bad initialization value of kl in rmarin ', kl
248
i = mod( ij/177 , 177 ) + 2
249
j = mod( ij , 177 ) + 2
250
k = mod( kl/169 , 178 ) + 1
256
m = mod( mod(i*j,179)*k , 179 )
260
l = mod( 53*l+1 , 169 )
261
if(mod(l*m,64) .ge. 32) s = s + t
266
ranc = 362436d0 / 16777216d0
267
rancd = 7654321d0 / 16777216d0
268
rancm = 16777213d0 / 16777216d0
283
c-------------------------------------------------------
284
c Front to ranmar which allows user to easily
286
c------------------------------------------------------
297
integer ij,kl,iseed1,iseed2
303
common /to_seed/iseed
306
common/to_configs/iconfig
315
if (init .eq. 1) then
317
call get_offset(ioffset)
318
if (iseed .eq. 0) call get_base(iseed)
321
c Modified to allow for more sequences
322
c iseed can be between 0 and 31328*30081
323
c before pattern repeats
325
ij=1802+iconfig + mod(iseed,30081)
326
kl=9373+(iseed/31328)+ioffset
327
write(*,'(a,i6,a3,i6)') 'Using random seed offsets',iconfig,
329
write(*,*) ' with seed', iseed
330
do while (ij .gt. 31328)
333
do while (kl .gt. 30081)
339
do while (x .lt. 1d-16)