| 1 | c second version of vegas with double precision
|
|---|
| 2 | c...............
|
|---|
| 3 |
|
|---|
| 4 | SUBROUTINE vegas(region,ndim,fxn,init,ncall,itmx,nprn,
|
|---|
| 5 | > tgral,sd,chi2a)
|
|---|
| 6 | INTEGER init,itmx,ncall,ndim,nprn,NDMX,MXDIM
|
|---|
| 7 | REAL*8 tgral,chi2a,sd,region(2*ndim),fxn,ALPH,TINY
|
|---|
| 8 | PARAMETER (ALPH=1.5,NDMX=50,MXDIM=10,TINY=1.d-30)
|
|---|
| 9 | EXTERNAL fxn
|
|---|
| 10 | C USES fxn,ran2,rebin
|
|---|
| 11 | C
|
|---|
| 12 | INTEGER i,idum,it,j,k,mds,nd,ndo,ng,npg,ia(MXDIM),kg(MXDIM)
|
|---|
| 13 | REAL*8 calls,dv2g,dxg,f,f2,f2b,fb,rc,ti,tsi,wgt,xjac,xn,xnd,xo,
|
|---|
| 14 | > d(NDMX,MXDIM),di(NDMX,MXDIM),dt(MXDIM),dx(MXDIM),
|
|---|
| 15 | > r(NDMX),x(MXDIM),xi(NDMX,MXDIM),xin(NDMX),ran2
|
|---|
| 16 | DOUBLE PRECISION schi,si,swgt
|
|---|
| 17 | COMMON /ranno/ idum
|
|---|
| 18 | SAVE
|
|---|
| 19 | if(init.le.0)then
|
|---|
| 20 | mds=1
|
|---|
| 21 | ndo=1
|
|---|
| 22 | do 11 j=1,ndim
|
|---|
| 23 | xi(1,j)=1
|
|---|
| 24 | 11 enddo
|
|---|
| 25 | endif
|
|---|
| 26 | if (init.le.1) then
|
|---|
| 27 | si=0
|
|---|
| 28 | swgt=0
|
|---|
| 29 | schi=0
|
|---|
| 30 | endif
|
|---|
| 31 | if (init.le.2)then
|
|---|
| 32 | nd=NDMX
|
|---|
| 33 | ng=1
|
|---|
| 34 | if(mds.ne.0)then
|
|---|
| 35 | ng=(ncall/2.d0+0.25d0)**(1.d0/ndim)
|
|---|
| 36 | mds=1
|
|---|
| 37 | if((2*ng-NDMX).ge.0)then
|
|---|
| 38 | mds=-1
|
|---|
| 39 | npg=ng/NDMX+1
|
|---|
| 40 | nd=ng/npg
|
|---|
| 41 | ng=npg*nd
|
|---|
| 42 | endif
|
|---|
| 43 | endif
|
|---|
| 44 | k=ng**ndim
|
|---|
| 45 | npg=max(ncall/k,2)
|
|---|
| 46 | calls=npg*k
|
|---|
| 47 | dxg=1.d0/ng
|
|---|
| 48 | dv2g=(calls*dxg**ndim)**2/npg/npg/(npg-1.d0)
|
|---|
| 49 | xnd=nd
|
|---|
| 50 | dxg=dxg*xnd
|
|---|
| 51 | xjac=1.d0/calls
|
|---|
| 52 | do 12 j=1, ndim
|
|---|
| 53 | dx(j)=region(j+ndim)-region(j)
|
|---|
| 54 | xjac=xjac*dx(j)
|
|---|
| 55 | 12 enddo
|
|---|
| 56 | if(nd.ne.ndo)then
|
|---|
| 57 | do 13 i=1,nd
|
|---|
| 58 | r(i)=1.d0
|
|---|
| 59 | 13 enddo
|
|---|
| 60 | do 14 j=1,ndim
|
|---|
| 61 | call rebin(ndo/xnd,nd,r,xin,xi(1,j))
|
|---|
| 62 | 14 enddo
|
|---|
| 63 | ndo=nd
|
|---|
| 64 | endif
|
|---|
| 65 | if(nprn.ge.0) write(*,200) ndim,calls,it,itmx,nprn,
|
|---|
| 66 | * ALPH,mds,nd,(j,region(j),j,region(j+ndim),j=1,ndim)
|
|---|
| 67 | endif
|
|---|
| 68 | do 28 it=1,itmx
|
|---|
| 69 | ti=0.d0
|
|---|
| 70 | tsi=0.d0
|
|---|
| 71 | do 16 j=1,ndim
|
|---|
| 72 | kg(j)=1
|
|---|
| 73 | do 15 i=1,nd
|
|---|
| 74 | d(i,j)=0.d0
|
|---|
| 75 | di(i,j)=0.d0
|
|---|
| 76 | 15 enddo
|
|---|
| 77 | 16 enddo
|
|---|
| 78 | 10 continue
|
|---|
| 79 | fb=0.d0
|
|---|
| 80 | f2b=0.d0
|
|---|
| 81 | do 19 k=1,npg
|
|---|
| 82 | wgt=xjac
|
|---|
| 83 | do 17 j=1,ndim
|
|---|
| 84 | xn=(kg(j)-ran2(idum))*dxg+1.d0
|
|---|
| 85 | ia(j)=max(min(int(xn),NDMX),1)
|
|---|
| 86 | if(ia(j).gt.1)then
|
|---|
| 87 | xo=xi(ia(j),j)-xi(ia(j)-1,j)
|
|---|
| 88 | rc=xi(ia(j)-1,j)+(xn-ia(j))*xo
|
|---|
| 89 | else
|
|---|
| 90 | xo=xi(ia(j),j)
|
|---|
| 91 | rc=(xn-ia(j))*xo
|
|---|
| 92 | endif
|
|---|
| 93 | x(j)=region(j)+rc*dx(j)
|
|---|
| 94 | wgt=wgt*xo*xnd
|
|---|
| 95 | 17 enddo
|
|---|
| 96 | f=wgt*fxn(x,wgt)
|
|---|
| 97 | f2=f*f
|
|---|
| 98 | fb=fb+f
|
|---|
| 99 | f2b=f2b+f2
|
|---|
| 100 | do 18 j=1,ndim
|
|---|
| 101 | di(ia(j),j)=di(ia(j),j)+f
|
|---|
| 102 | if(mds.ge.0) d(ia(j),j)=d(ia(j),j)+f2
|
|---|
| 103 | 18 enddo
|
|---|
| 104 | 19 enddo
|
|---|
| 105 | f2b=sqrt(f2b*npg)
|
|---|
| 106 | f2b=(f2b-fb)*(f2b+fb)
|
|---|
| 107 | if (f2b.le.0) f2b=TINY
|
|---|
| 108 | ti=ti+fb
|
|---|
| 109 | tsi=tsi+f2b
|
|---|
| 110 | if(mds.lt.0)then
|
|---|
| 111 | do 21 j=1,ndim
|
|---|
| 112 | d(ia(j),j)=d(ia(j),j)+f2b
|
|---|
| 113 | 21 enddo
|
|---|
| 114 | endif
|
|---|
| 115 | do 22 k=ndim,1,-1
|
|---|
| 116 | kg(k)=mod(kg(k),ng)+1
|
|---|
| 117 | if(kg(k).ne.1) goto 10
|
|---|
| 118 | 22 enddo
|
|---|
| 119 | tsi=tsi*dv2g
|
|---|
| 120 | wgt=1.d0/tsi
|
|---|
| 121 | si=si+dble(wgt)*dble(ti)
|
|---|
| 122 | schi=schi+dble(wgt)*dble(ti)**2
|
|---|
| 123 | swgt=swgt+dble(wgt)
|
|---|
| 124 | tgral=si/swgt
|
|---|
| 125 | chi2a=max((schi-si*tgral)/(it-.99d0),0.d0)
|
|---|
| 126 | sd=sqrt(1./swgt)
|
|---|
| 127 | tsi=sqrt(tsi)
|
|---|
| 128 | if(nprn.ge.0)then
|
|---|
| 129 | write(*,201) it,ti,tsi,tgral,sd,chi2a
|
|---|
| 130 | if(nprn.ne.0)then
|
|---|
| 131 | do 23 j=1,ndim
|
|---|
| 132 | write(*,202) j,(xi(i,j),di(i,j),
|
|---|
| 133 | * i=1+nprn/2,nd,nprn)
|
|---|
| 134 | 23 enddo
|
|---|
| 135 | endif
|
|---|
| 136 | endif
|
|---|
| 137 | do 25 j=1,ndim
|
|---|
| 138 | xo=d(1,j)
|
|---|
| 139 | xn=d(2,j)
|
|---|
| 140 | d(1,j)=(xo+xn)/2.d0
|
|---|
| 141 | dt(j)=d(1,j)
|
|---|
| 142 | do 24 i=2,nd-1
|
|---|
| 143 | rc=xo+xn
|
|---|
| 144 | xo=xn
|
|---|
| 145 | xn=d(i+1,j)
|
|---|
| 146 | d(i,j)=(rc+xn)/3.d0
|
|---|
| 147 | dt(j)=dt(j)+d(i,j)
|
|---|
| 148 | 24 enddo
|
|---|
| 149 | d(nd,j)=(xo+xn)/2.d0
|
|---|
| 150 | dt(j)=dt(j)+d(nd,j)
|
|---|
| 151 | 25 enddo
|
|---|
| 152 | do 27 j=1,ndim
|
|---|
| 153 | rc=0.d0
|
|---|
| 154 | do 26 i=1,nd
|
|---|
| 155 | if(d(i,j).lt.TINY) d(i,j)=TINY
|
|---|
| 156 | r(i)=((1.d0-d(i,j)/dt(j))/(log(dt(j))-log(d(i,j))))**ALPH
|
|---|
| 157 | rc=rc+r(i)
|
|---|
| 158 | 26 enddo
|
|---|
| 159 | call rebin(rc/xnd,nd,r,xin,xi(1,j))
|
|---|
| 160 | 27 enddo
|
|---|
| 161 | 28 enddo
|
|---|
| 162 | return
|
|---|
| 163 | 200 FORMAT(/' input parameters for vegas: ndim=',i3,' ncall=',f8.0
|
|---|
| 164 | * /28x,' it=',i5,' itmx=',i5
|
|---|
| 165 | * /28x,' nprn=',i3,' alph=',f5.2/28x,' mds=',i3,' nd=',i4
|
|---|
| 166 | * /(30x,'xl(',i2,')= ',g11.4,' xu(',i2,')= ',g11.4))
|
|---|
| 167 | 201 FORMAT(/' iteration no.',I3,': ','integral =',g14.7,'+/- ',g9.2
|
|---|
| 168 | * /' all iterations: integral =',g14.7,'+/- ',g9.2,
|
|---|
| 169 | * ' chi**2/it''n =',g9.2)
|
|---|
| 170 | 202 FORMAT(/' data for axis ',I2/' X delta i',
|
|---|
| 171 | * ' x delta i ',' xdelta i ',
|
|---|
| 172 | * /(1x,f7.5,1x,g11.4,5x,f7.5,1x,g11.4,5x,f7.5,1x,g11.4))
|
|---|
| 173 | END
|
|---|
| 174 |
|
|---|
| 175 | c...............................................................
|
|---|
| 176 | SUBROUTINE rebin(rc,nd,r,xin,xi)
|
|---|
| 177 | INTEGER nd
|
|---|
| 178 | REAL*8 rc,r(*),xi(*),xin(*)
|
|---|
| 179 | INTEGER i,k
|
|---|
| 180 | REAL*8 dr,xn,xo
|
|---|
| 181 | k=0
|
|---|
| 182 | xn=0.d0
|
|---|
| 183 | dr=0.d0
|
|---|
| 184 | do 11 i=1,nd-1
|
|---|
| 185 | 1 if(rc.gt.dr)then
|
|---|
| 186 | k=k+1
|
|---|
| 187 | dr=dr+r(k)
|
|---|
| 188 | xo=xn
|
|---|
| 189 | xn=xi(k)
|
|---|
| 190 | goto 1
|
|---|
| 191 | endif
|
|---|
| 192 | dr=dr-rc
|
|---|
| 193 | xin(i)=xn-(xn-xo)*dr/r(k)
|
|---|
| 194 | 11 enddo
|
|---|
| 195 | do 12 i=1,nd-1
|
|---|
| 196 | xi(i)=xin(i)
|
|---|
| 197 | 12 enddo
|
|---|
| 198 | xi(nd)=1.d0
|
|---|
| 199 | return
|
|---|
| 200 | END
|
|---|
| 201 | c...............................................................
|
|---|
| 202 | FUNCTION ran2(idum)
|
|---|
| 203 | INTEGER idum,IM1,IM2,IMM1,IA1,IA2,IQ1,IQ2,IR1,IR2,NTAB,NDIV
|
|---|
| 204 | REAL*8 ran2,AM,EPS,RNMX
|
|---|
| 205 | PARAMETER (IM1=2147483563,IM2=2147483399,AM=1./IM1,IMM1=IM1-1,
|
|---|
| 206 | * IA1=40014,IA2=40692,IQ1=53668,IQ2=52774,IR1=12211,
|
|---|
| 207 | * IR2=3791,NTAB=32,NDIV=1+IMM1/NTAB,EPS=1.2d-7,RNMX=1.d0-EPS)
|
|---|
| 208 | INTEGER idum2,j,k,iv(NTAB),iy
|
|---|
| 209 | SAVE iv,iy,idum2
|
|---|
| 210 | DATA idum2/123456789/, iv/NTAB*0/, iy/0/
|
|---|
| 211 | if (idum.le.0) then
|
|---|
| 212 | idum=max(-idum,1)
|
|---|
| 213 | idum2=idum
|
|---|
| 214 | do 11 j=NTAB+8,1,-1
|
|---|
| 215 | k=idum/IQ1
|
|---|
| 216 | idum=IA1*(idum-k*IQ1)-k*IR1
|
|---|
| 217 | if (idum.lt.0) idum=idum+IM1
|
|---|
| 218 | if (j.le.NTAB) iv(j)=idum
|
|---|
| 219 | 11 enddo
|
|---|
| 220 | iy=iv(1)
|
|---|
| 221 | endif
|
|---|
| 222 | k=idum/IQ1
|
|---|
| 223 | idum=IA1*(idum-k*IQ1)-k*IR1
|
|---|
| 224 | if (idum.lt.0) idum=idum+IM1
|
|---|
| 225 | k=idum2/IQ2
|
|---|
| 226 | idum2=IA2*(idum2-k*IQ2)-k*IR2
|
|---|
| 227 | if (idum2.lt.0) idum2=idum2+IM2
|
|---|
| 228 | j=1+iy/NDIV
|
|---|
| 229 | iy=iv(j)-idum2
|
|---|
| 230 | iv(j)=idum
|
|---|
| 231 | if(iy.lt.1) iy=iy+IMM1
|
|---|
| 232 | ran2=min(AM*iy,RNMX)
|
|---|
| 233 | return
|
|---|
| 234 | END
|
|---|
| 235 | c....................................................................
|
|---|
| 236 |
|
|---|