program parallel
parameter(nmu=20,nsig=20,nd=11,ng=10,nc=16)
parameter (nsim=2000)
integer k1,k2,k3,k4,k5,i,j,m,n
real xmu,sigma,d,g,c
data xmu1/.02/,xmu2/.4/
data sig1/.2/,sig2/4./
data d1/1./,d2/2./
data g1/.1/,g2/1./
data c1/1./,c2/4./
data iseed/-9/
open(unit=10,file='p10')
open(unit=20,file='S1T0p.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,ng
g=g1+(g2-g1)*(k4-1)/float(ng-1)
do k5=1,nc
c=c1+(c2-c1)*(k5-1)/float(nc-1)
call varpar(nsim,n,m,d,g,c,sigma,xmu)
enddo
enddo
enddo
enddo
enddo
end
subroutine varpar(nsim,n,m,d,g,c,sigma,xmu)
integer nsim,n,m,it,icorr,ntime
real d,g,c,sigma,xmu,totcor,totstp,stepsq,pcorr
real perr,avst,errvar,stvar
totcor=0
totstp=0
totsq=0
stepsq=0
do it=1,nsim
call trpar(g,c,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 trpar(g,c,sigma,xmu,d,n,m,icorr,ntime)
parameter(tb=20)
integer typetr
integer n,m,icorr,ntime,ndist
real g,c,sigma,xmu,d,distb0,db,tbr
typetr=0
ntime=0
ndist=n-m
distb0=-d*tb
db=rlxb(n,c,distb0)
tbr=rlxt(n,c,tb)
call walker(n,m,xmu,sigma,db,tb,tbr,g,ntime,typetr)
if(m .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 rlxb(nel,c,distb0)
integer nel
real c,distb0
if(nel .eq. 4) rlxb=distb0/(c*c)
if(nel .eq. 2) rlxb=distb0/c
if(nel .eq. 1) rlxb=distb0
return
end
function rlxt(nel,c,targb)
integer nel
real c,targb
if(nel .eq. 4) rlxt=targb/(c*c)
if(nel .eq. 2) rlxt=targb/c
if(nel .eq. 1) rlxt=targb
return
end
subroutine walker (nel,ntarg,xmu,sig,dbrlx,tb,tbr,g,n,idec)
parameter(nelmax=4)
integer dstvec(nelmax),tv(nelmax),markd,markt
integer nel,ntarg,n,idec,ndist,i,k
real wvec(nelmax)
real xmu,sig,dbrlx,tb,tbr,g,typeel
dimension xmean(nelmax)
n=0
ndist=nel-ntarg
do i=1,nel
dstvec(i)=3
tv(i)=3
wvec(i)=0.
enddo
do i=1,ntarg
xmean(i)=xmu
enddo
do i=1,ndist
xmean(i+ntarg)=-xmu
enddo
10 continue
do i=1,nel
dstvec(i)=3
tv(i)=3
enddo
n=n+1
do i=1,nel
call subwlk(xmean(i),sig,dbrlx,tb,tbr,g,wvec(i),nel,typeel)
if (typeel .eq. 1) then
idec=1
return
endif
if (typeel .eq. 2) then
tv(i)=0
markt=0
do k=1,nel
markt=markt+tv(k)
enddo
if (markt .eq. 0) then
idec=1
return
endif
endif
if (typeel .eq. 0) then
dstvec(i)=0
markd=0
do k=1,nel
markd=markd+dstvec(k)
enddo
if (markd .eq. 0) then
idec=0
return
endif
endif
enddo
go to 10
end
subroutine subwlk(xm,sig,dbrlx,tb,tbr,g,w,nel,typeel)
integer nel
real xgam
real xm,sig,dbrlx,tb,tbr,g,w,typeel,step
iran=1
xgam=0
step=gasdev(iran)*sig+xm
xgam=(-1.)*g
step=step*(float(nel) ** xgam)
w=w+step
if(w .ge. tb) then
typeel=1
return
endif
if(w .ge. tbr) then
typeel=2
return
endif
if(w .le. dbrlx) then
typeel=0
return
endif
typeel=3
return
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

