program serial
parameter(nmu=20,nsig=20,nb=10,ntz=16,nd=11)
parameter (nsim=2000)
integer k1,k2,k3,k4,k5,i,j,m,n
real xmu,sigma,d,b,tz,beta
data xmu1/.02/,xmu2/.4/
data sig1/.2/,sig2/4./
data b1/0./
data t1/200/,t2/1000/
data d1/1./,d2/2./
data iseed/-9/
open(unit=10,file='s10')
open(unit=20,file='S1T0s.txt')
r=ran2(iseed)
read(20,*) n
read(20,*) m
do k1=1,nmu
xmu=xmu1+(xmu2-xmu1)*(k1-1)/float(nmu-1)
do k2=1,nsig
sigma=sig1+(sig2-sig1)*(k2-1)/float(nsig-1)
do k3=1,nd
d=d1+(d2-d1)*(k3-1)/float(nd-1)
do k4=1,nb
b2=10*d
beta=b1+(b2-b1)*(k4-1)/float(nb-1)
do k5=1,ntz
tz=t1+(t2-t1)*(k5-1)/float(ntz-1)
call varser(nsim,n,m,d,beta,tz,sigma,xmu)
enddo
enddo
enddo
enddo
enddo
end
subroutine varser(nsim,n,m,d,beta,tz,sigma,xmu)
integer nsim,n,m,it,icorr,ntime
real d,beta,tz,sigma,xmu,totcor,totstp,stepsq,pcorr
real perr,avst,errvar,stvar
totcor=0
totstp=0
totsq=0
stepsq=0
do it=1,nsim
call trser(beta,tz,sigma,xmu,d,n,m,icorr,ntime)
totcor=totcor+icorr
totstp=totstp+ntime
stepsq=stepsq+ntime**2
enddo
pcorr=totcor/nsim
perr=1.-pcorr
avst=totstp/nsim
errvar=pcorr*perr/nsim
stvar=(stepsq-avst**2/nsim)/float(nsim-1)
write(10,*) perr,avst,stvar
return
end
subroutine trser(beta,tz,sigma,xmu,d,nel,ntarg,icorr,ntime)
parameter(targb=20)
parameter(nelmax=4)
integer typetr
integer nel,ntarg,icorr,ntime,ndist,iran
real beta,tz,sigma,xmu,d
dimension xmean(nelmax),xran(nelmax)
iran=1
typetr=0
ntime=0
ndist=nel-ntarg
distb0=-d*targb
do i=1,ntarg
xmean(i)=xmu
enddo
do i=1,ndist
xmean(i+ntarg)=-xmu
enddo
do i=1,nel
xran(i)=ran2(iran)
enddo
call sort2(nel,xran,xmean)
do iw=1,nel
distb1=bcalc(nel,tz,beta,ntime,distb0)
call walker(xmean(iw),sigma,distb1,targb,nstep,typetr)
ntime=ntime+nstep
if(typetr .eq. 1 .or. ntime .gt. tz) go to 99
enddo
99 continue
if(ntarg .gt. 0) then
if(typetr .eq. 1) then
icorr=1
else
icorr=0
endif
else
if(typetr .eq. 0) then
icorr=1
else
icorr=0
endif
endif
return
end
function bcalc(nel,tz,beta,ntime,distb0)
if(nel .eq. 4) b1=distb0+2*beta
if(nel .eq. 2) b1=distb0+beta
if(nel .eq. 1) b1=distb0
timfrc=float(ntime)/tz
rem=1-timfrc
bcalc=b1*rem
return
end
subroutine walker(xm,sig,db,tb,n,idec)
iran=1
w=0
n=0
10 continue
step=gasdev(iran)*sig+xm
n=n+1
w=w+step
if(w .ge. tb) then
idec=1
return
endif
if(w .le. db) then
idec=0
return
endif
go to 10
end
FUNCTION gasdev(idum)
INTEGER idum
REAL gasdev
CU USES ran1
INTEGER iset
REAL fac,gset,rsq,v1,v2,ran1
SAVE iset,gset
DATA iset/0/
if (iset.eq.0) then
1 v1=2.*ran2(idum)-1.
v2=2.*ran2(idum)-1.
rsq=v1**2+v2**2
if(rsq.ge.1..or.rsq.eq.0.)goto 1
fac=sqrt(-2.*alog(rsq)/rsq)
gset=v1*fac
gasdev=v2*fac
iset=1
else
gasdev=gset
iset=0
endif
return
END
FUNCTION ran2(idum)
INTEGER idum,IM1,IM2,IMM1,IA1,IA2,IQ1,IQ2,IR1,IR2,NTAB,NDIV
REAL ran2,AM,EPS,RNMX
PARAMETER (IM1=2147483563,IM2=2147483399,AM=1./IM1,IMM1=IM1-1)
PARAMETER (IA1=40014,IA2=40692,IQ1=53668,IQ2=52774,IR1=12211)
PARAMETER (IR2=3791,NTAB=32,NDIV=1+IMM1/NTAB,EPS=1.2e-7)
PARAMETER (RNMX=1.-EPS)
INTEGER idum2,j,k,iv(NTAB),iy
SAVE iv,iy,idum2
DATA idum2/123456789/, iv/NTAB*0/, iy/0/
if (idum.le.0) then
idum=max(-idum,1)
idum2=idum
do 11 j=NTAB+8,1,-1
k=idum/IQ1
idum=IA1*(idum-k*IQ1)-k*IR1
if (idum.lt.0) idum=idum+IM1
if (j.le.NTAB) iv(j)=idum
11 continue
iy=iv(1)
endif
k=idum/IQ1
idum=IA1*(idum-k*IQ1)-k*IR1
if (idum.lt.0) idum=idum+IM1
k=idum2/IQ2
idum2=IA2*(idum2-k*IQ2)-k*IR2
if (idum2.lt.0) idum2=idum2+IM2
j=1+iy/NDIV
iy=iv(j)-idum2
iv(j)=idum
if(iy.lt.1)iy=iy+IMM1
ran2=min(AM*iy,RNMX)
return
END
SUBROUTINE sort2(n,arr,brr)
INTEGER n,M,NSTACK
REAL arr(n),brr(n),b
PARAMETER (M=7,NSTACK=50)
INTEGER i,ir,j,jstack,k,l,istack(NSTACK)
REAL a,temp
jstack=0
l=1
ir=n
1 if(ir-l.lt.M)then
do 12 j=l+1,ir
a=arr(j)
b=brr(j)
do 11 i=j-1,1,-1
if(arr(i).le.a)goto 2
arr(i+1)=arr(i)
brr(i+1)=brr(i)
11 continue
i=0
2 arr(i+1)=a
brr(i+1)=b
12 continue
if(jstack.eq.0)return
ir=istack(jstack)
l=istack(jstack-1)
jstack=jstack-2
else
k=(l+ir)/2
temp=arr(k)
arr(k)=arr(l+1)
arr(l+1)=temp
temp=brr(k)
brr(k)=brr(l+1)
brr(l+1)=temp
if(arr(l+1).gt.arr(ir))then
temp=arr(l+1)
arr(l+1)=arr(ir)
arr(ir)=temp
temp=brr(l+1)
brr(l+1)=brr(ir)
brr(ir)=temp
endif
if(arr(l).gt.arr(ir))then
temp=arr(l)
arr(l)=arr(ir)
arr(ir)=temp
temp=brr(l)
brr(l)=brr(ir)
brr(ir)=temp
endif
if(arr(l+1).gt.arr(l))then
temp=arr(l+1)
arr(l+1)=arr(l)
arr(l)=temp
temp=brr(l+1)
brr(l+1)=brr(l)
brr(l)=temp
endif
i=l+1
j=ir
a=arr(l)
b=brr(l)
3 continue
i=i+1
if(arr(i).lt.a)goto 3
4 continue
j=j-1
if(arr(j).gt.a)goto 4
if(j.lt.i)goto 5
temp=arr(i)
arr(i)=arr(j)
arr(j)=temp
temp=brr(i)
brr(i)=brr(j)
brr(j)=temp
goto 3
5 arr(l)=arr(j)
arr(j)=a
brr(l)=brr(j)
brr(j)=b
jstack=jstack+2
if(jstack.gt.NSTACK)pause 'NSTACK too small in sort2'
if(ir-i+1.ge.j-l)then
istack(jstack)=ir
istack(jstack-1)=i
ir=j-1
else
istack(jstack)=j-1
istack(jstack-1)=l
l=i
endif
endif
goto 1
END

