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