Initial commit

This commit is contained in:
2016-02-03 18:52:05 +00:00
commit d40505e161
507 changed files with 91383 additions and 0 deletions
Binary file not shown.
@@ -0,0 +1,13 @@
SUBROUTINE addint(uf,uc,res,nf)
INTEGER nf
DOUBLE PRECISION res(nf,nf),uc(nf/2+1,nf/2+1),uf(nf,nf)
CU USES interp
INTEGER i,j
call interp(res,uc,nf)
do 12 j=1,nf
do 11 i=1,nf
uf(i,j)=uf(i,j)+res(i,j)
11 continue
12 continue
return
END
@@ -0,0 +1,32 @@
SUBROUTINE airy(x,ai,bi,aip,bip)
REAL ai,aip,bi,bip,x
CU USES bessik,bessjy
REAL absx,ri,rip,rj,rjp,rk,rkp,rootx,ry,ryp,z,PI,THIRD,TWOTHR,
*ONOVRT
PARAMETER (PI=3.1415927,THIRD=1./3.,TWOTHR=2.*THIRD,
*ONOVRT=.57735027)
absx=abs(x)
rootx=sqrt(absx)
z=TWOTHR*absx*rootx
if(x.gt.0.)then
call bessik(z,THIRD,ri,rk,rip,rkp)
ai=rootx*ONOVRT*rk/PI
bi=rootx*(rk/PI+2.*ONOVRT*ri)
call bessik(z,TWOTHR,ri,rk,rip,rkp)
aip=-x*ONOVRT*rk/PI
bip=x*(rk/PI+2.*ONOVRT*ri)
else if(x.lt.0.)then
call bessjy(z,THIRD,rj,ry,rjp,ryp)
ai=.5*rootx*(rj-ONOVRT*ry)
bi=-.5*rootx*(ry+ONOVRT*rj)
call bessjy(z,TWOTHR,rj,ry,rjp,ryp)
aip=.5*absx*(ONOVRT*ry+rj)
bip=.5*absx*(ONOVRT*rj-ry)
else
ai=.35502805
bi=ai/ONOVRT
aip=-.25881940
bip=-aip/ONOVRT
endif
return
END
@@ -0,0 +1,85 @@
SUBROUTINE amebsa(p,y,mp,np,ndim,pb,yb,ftol,funk,iter,temptr)
INTEGER iter,mp,ndim,np,NMAX
REAL ftol,temptr,yb,p(mp,np),pb(np),y(mp),funk
PARAMETER (NMAX=200)
EXTERNAL funk
CU USES amotsa,funk,ran1
INTEGER i,idum,ihi,ilo,inhi,j,m,n
REAL rtol,sum,swap,tt,yhi,ylo,ynhi,ysave,yt,ytry,psum(NMAX),
*amotsa,ran1
COMMON /ambsa/ tt,idum
tt=-temptr
1 do 12 n=1,ndim
sum=0.
do 11 m=1,ndim+1
sum=sum+p(m,n)
11 continue
psum(n)=sum
12 continue
2 ilo=1
inhi=1
ihi=2
ylo=y(1)+tt*log(ran1(idum))
ynhi=ylo
yhi=y(2)+tt*log(ran1(idum))
if (ylo.gt.yhi) then
ihi=1
inhi=2
ilo=2
ynhi=yhi
yhi=ylo
ylo=ynhi
endif
do 13 i=3,ndim+1
yt=y(i)+tt*log(ran1(idum))
if(yt.le.ylo) then
ilo=i
ylo=yt
endif
if(yt.gt.yhi) then
inhi=ihi
ynhi=yhi
ihi=i
yhi=yt
else if(yt.gt.ynhi) then
inhi=i
ynhi=yt
endif
13 continue
rtol=2.*abs(yhi-ylo)/(abs(yhi)+abs(ylo))
if (rtol.lt.ftol.or.iter.lt.0) then
swap=y(1)
y(1)=y(ilo)
y(ilo)=swap
do 14 n=1,ndim
swap=p(1,n)
p(1,n)=p(ilo,n)
p(ilo,n)=swap
14 continue
return
endif
iter=iter-2
ytry=amotsa(p,y,psum,mp,np,ndim,pb,yb,funk,ihi,yhi,-1.0)
if (ytry.le.ylo) then
ytry=amotsa(p,y,psum,mp,np,ndim,pb,yb,funk,ihi,yhi,2.0)
else if (ytry.ge.ynhi) then
ysave=yhi
ytry=amotsa(p,y,psum,mp,np,ndim,pb,yb,funk,ihi,yhi,0.5)
if (ytry.ge.ysave) then
do 16 i=1,ndim+1
if(i.ne.ilo)then
do 15 j=1,ndim
psum(j)=0.5*(p(i,j)+p(ilo,j))
p(i,j)=psum(j)
15 continue
y(i)=funk(psum)
endif
16 continue
iter=iter-ndim
goto 1
endif
else
iter=iter+1
endif
goto 2
END
@@ -0,0 +1,71 @@
SUBROUTINE amoeba(p,y,mp,np,ndim,ftol,funk,iter)
INTEGER iter,mp,ndim,np,NMAX,ITMAX
REAL ftol,p(mp,np),y(mp),funk
PARAMETER (NMAX=20,ITMAX=5000)
EXTERNAL funk
CU USES amotry,funk
INTEGER i,ihi,ilo,inhi,j,m,n
REAL rtol,sum,swap,ysave,ytry,psum(NMAX),amotry
iter=0
1 do 12 n=1,ndim
sum=0.
do 11 m=1,ndim+1
sum=sum+p(m,n)
11 continue
psum(n)=sum
12 continue
2 ilo=1
if (y(1).gt.y(2)) then
ihi=1
inhi=2
else
ihi=2
inhi=1
endif
do 13 i=1,ndim+1
if(y(i).le.y(ilo)) ilo=i
if(y(i).gt.y(ihi)) then
inhi=ihi
ihi=i
else if(y(i).gt.y(inhi)) then
if(i.ne.ihi) inhi=i
endif
13 continue
rtol=2.*abs(y(ihi)-y(ilo))/(abs(y(ihi))+abs(y(ilo)))
if (rtol.lt.ftol) then
swap=y(1)
y(1)=y(ilo)
y(ilo)=swap
do 14 n=1,ndim
swap=p(1,n)
p(1,n)=p(ilo,n)
p(ilo,n)=swap
14 continue
return
endif
if (iter.ge.ITMAX) pause 'ITMAX exceeded in amoeba'
iter=iter+2
ytry=amotry(p,y,psum,mp,np,ndim,funk,ihi,-1.0)
if (ytry.le.y(ilo)) then
ytry=amotry(p,y,psum,mp,np,ndim,funk,ihi,2.0)
else if (ytry.ge.y(inhi)) then
ysave=y(ihi)
ytry=amotry(p,y,psum,mp,np,ndim,funk,ihi,0.5)
if (ytry.ge.ysave) then
do 16 i=1,ndim+1
if(i.ne.ilo)then
do 15 j=1,ndim
psum(j)=0.5*(p(i,j)+p(ilo,j))
p(i,j)=psum(j)
15 continue
y(i)=funk(psum)
endif
16 continue
iter=iter+ndim
goto 1
endif
else
iter=iter-1
endif
goto 2
END
@@ -0,0 +1,24 @@
FUNCTION amotry(p,y,psum,mp,np,ndim,funk,ihi,fac)
INTEGER ihi,mp,ndim,np,NMAX
REAL amotry,fac,p(mp,np),psum(np),y(mp),funk
PARAMETER (NMAX=20)
EXTERNAL funk
CU USES funk
INTEGER j
REAL fac1,fac2,ytry,ptry(NMAX)
fac1=(1.-fac)/ndim
fac2=fac1-fac
do 11 j=1,ndim
ptry(j)=psum(j)*fac1-p(ihi,j)*fac2
11 continue
ytry=funk(ptry)
if (ytry.lt.y(ihi)) then
y(ihi)=ytry
do 12 j=1,ndim
psum(j)=psum(j)-p(ihi,j)+ptry(j)
p(ihi,j)=ptry(j)
12 continue
endif
amotry=ytry
return
END
@@ -0,0 +1,33 @@
FUNCTION amotsa(p,y,psum,mp,np,ndim,pb,yb,funk,ihi,yhi,fac)
INTEGER ihi,mp,ndim,np,NMAX
REAL amotsa,fac,yb,yhi,p(mp,np),pb(np),psum(np),y(mp),funk
PARAMETER (NMAX=200)
EXTERNAL funk
CU USES funk,ran1
INTEGER idum,j
REAL fac1,fac2,tt,yflu,ytry,ptry(NMAX),ran1
COMMON /ambsa/ tt,idum
fac1=(1.-fac)/ndim
fac2=fac1-fac
do 11 j=1,ndim
ptry(j)=psum(j)*fac1-p(ihi,j)*fac2
11 continue
ytry=funk(ptry)
if (ytry.le.yb) then
do 12 j=1,ndim
pb(j)=ptry(j)
12 continue
yb=ytry
endif
yflu=ytry-tt*log(ran1(idum))
if (yflu.lt.yhi) then
y(ihi)=ytry
yhi=yflu
do 13 j=1,ndim
psum(j)=psum(j)-p(ihi,j)+ptry(j)
p(ihi,j)=ptry(j)
13 continue
endif
amotsa=yflu
return
END
@@ -0,0 +1,62 @@
SUBROUTINE anneal(x,y,iorder,ncity)
INTEGER ncity,iorder(ncity)
REAL x(ncity),y(ncity)
CU USES irbit1,metrop,ran3,revcst,revers,trncst,trnspt
INTEGER i,i1,i2,idec,idum,iseed,j,k,nlimit,nn,nover,nsucc,n(6),
*irbit1
REAL de,path,t,tfactr,ran3,alen,x1,x2,y1,y2
LOGICAL ans
alen(x1,x2,y1,y2)=sqrt((x2-x1)**2+(y2-y1)**2)
nover=100*ncity
nlimit=10*ncity
tfactr=0.9
path=0.0
t=0.5
do 11 i=1,ncity-1
i1=iorder(i)
i2=iorder(i+1)
path=path+alen(x(i1),x(i2),y(i1),y(i2))
11 continue
i1=iorder(ncity)
i2=iorder(1)
path=path+alen(x(i1),x(i2),y(i1),y(i2))
idum=-1
iseed=111
do 13 j=1,100
nsucc=0
do 12 k=1,nover
1 n(1)=1+int(ncity*ran3(idum))
n(2)=1+int((ncity-1)*ran3(idum))
if (n(2).ge.n(1)) n(2)=n(2)+1
nn=1+mod((n(1)-n(2)+ncity-1),ncity)
if (nn.lt.3) goto 1
idec=irbit1(iseed)
if (idec.eq.0) then
n(3)=n(2)+int(abs(nn-2)*ran3(idum))+1
n(3)=1+mod(n(3)-1,ncity)
call trncst(x,y,iorder,ncity,n,de)
call metrop(de,t,ans)
if (ans) then
nsucc=nsucc+1
path=path+de
call trnspt(iorder,ncity,n)
endif
else
call revcst(x,y,iorder,ncity,n,de)
call metrop(de,t,ans)
if (ans) then
nsucc=nsucc+1
path=path+de
call revers(iorder,ncity,n)
endif
endif
if (nsucc.ge.nlimit) goto 2
12 continue
2 write(*,*)
write(*,*) 'T =',t,' Path Length =',path
write(*,*) 'Successful Moves: ',nsucc
t=t*tfactr
if (nsucc.eq.0) return
13 continue
return
END
@@ -0,0 +1,14 @@
DOUBLE PRECISION FUNCTION anorm2(a,n)
INTEGER n
DOUBLE PRECISION a(n,n)
INTEGER i,j
DOUBLE PRECISION sum
sum=0.d0
do 12 j=1,n
do 11 i=1,n
sum=sum+a(i,j)**2
11 continue
12 continue
anorm2=sqrt(sum)/n
return
END
@@ -0,0 +1,20 @@
SUBROUTINE arcmak(nfreq,nchh,nradd)
INTEGER nchh,nradd,nfreq(nchh),MC,NWK,MAXINT
PARAMETER (MC=512,NWK=20,MAXINT=2147483647)
INTEGER j,jdif,minint,nc,nch,nrad,ncum,ncumfq(MC+2),ilob(NWK),
*iupb(NWK)
COMMON /arccom/ ncumfq,iupb,ilob,nch,nrad,minint,jdif,nc,ncum
SAVE /arccom/
if(nchh.gt.MC)pause 'MC too small in arcmak'
if(nradd.gt.256)pause 'nradd may not exceed 256 in arcmak'
minint=MAXINT/nradd
nch=nchh
nrad=nradd
ncumfq(1)=0
do 11 j=2,nch+1
ncumfq(j)=ncumfq(j-1)+max(nfreq(j-1),1)
11 continue
ncumfq(nch+2)=ncumfq(nch+1)+1
ncum=ncumfq(nch+2)
return
END
@@ -0,0 +1,75 @@
SUBROUTINE arcode(ich,code,lcode,lcd,isign)
INTEGER ich,isign,lcd,lcode,MC,NWK
CHARACTER*1 code(lcode)
PARAMETER (MC=512,NWK=20)
CU USES arcsum
INTEGER ihi,j,ja,jdif,jh,jl,k,m,minint,nc,nch,nrad,ilob(NWK),
*iupb(NWK),ncumfq(MC+2),ncum,JTRY
COMMON /arccom/ ncumfq,iupb,ilob,nch,nrad,minint,jdif,nc,ncum
SAVE /arccom/
JTRY(j,k,m)=int((dble(k)*dble(j))/dble(m))
if (isign.eq.0) then
jdif=nrad-1
do 11 j=NWK,1,-1
iupb(j)=nrad-1
ilob(j)=0
nc=j
if(jdif.gt.minint)return
jdif=(jdif+1)*nrad-1
11 continue
pause 'NWK too small in arcode'
else
if (isign.gt.0) then
if(ich.gt.nch.or.ich.lt.0)pause 'bad ich in arcode'
else
ja=ichar(code(lcd))-ilob(nc)
do 12 j=nc+1,NWK
ja=ja*nrad+(ichar(code(j+lcd-nc))-ilob(j))
12 continue
ich=0
ihi=nch+1
1 if(ihi-ich.gt.1) then
m=(ich+ihi)/2
if (ja.ge.JTRY(jdif,ncumfq(m+1),ncum)) then
ich=m
else
ihi=m
endif
goto 1
endif
if(ich.eq.nch)return
endif
jh=JTRY(jdif,ncumfq(ich+2),ncum)
jl=JTRY(jdif,ncumfq(ich+1),ncum)
jdif=jh-jl
call arcsum(ilob,iupb,jh,NWK,nrad,nc)
call arcsum(ilob,ilob,jl,NWK,nrad,nc)
do 13 j=nc,NWK
if(ich.ne.nch.and.iupb(j).ne.ilob(j))goto 2
if(lcd.gt.lcode)pause 'lcode too small in arcode'
if(isign.gt.0) code(lcd)=char(ilob(j))
lcd=lcd+1
13 continue
return
2 nc=j
j=0
3 if (jdif.lt.minint) then
j=j+1
jdif=jdif*nrad
goto 3
endif
if (nc-j.lt.1) pause 'NWK too small in arcode'
if(j.ne.0)then
do 14 k=nc,NWK
iupb(k-j)=iupb(k)
ilob(k-j)=ilob(k)
14 continue
endif
nc=nc-j
do 15 k=NWK-j+1,NWK
iupb(k)=0
ilob(k)=0
15 continue
endif
return
END
@@ -0,0 +1,18 @@
SUBROUTINE arcsum(iin,iout,ja,nwk,nrad,nc)
INTEGER ja,nc,nrad,nwk,iin(*),iout(*)
INTEGER j,jtmp,karry
karry=0
do 11 j=nwk,nc+1,-1
jtmp=ja
ja=ja/nrad
iout(j)=iin(j)+(jtmp-ja*nrad)+karry
if (iout(j).ge.nrad) then
iout(j)=iout(j)-nrad
karry=1
else
karry=0
endif
11 continue
iout(nc)=iin(nc)+ja+karry
return
END
@@ -0,0 +1,10 @@
SUBROUTINE asolve(n,b,x,itrnsp)
INTEGER n,itrnsp,ija,NMAX,i
DOUBLE PRECISION x(n),b(n),sa
PARAMETER (NMAX=1000)
COMMON /mat/ sa(NMAX),ija(NMAX)
do 11 i=1,n
x(i)=b(i)/sa(i)
11 continue
return
END
@@ -0,0 +1,13 @@
SUBROUTINE atimes(n,x,r,itrnsp)
INTEGER n,itrnsp,ija,NMAX
DOUBLE PRECISION x(n),r(n),sa
PARAMETER (NMAX=1000)
COMMON /mat/ sa(NMAX),ija(NMAX)
CU USES dsprsax,dsprstx
if (itrnsp.eq.0) then
call dsprsax(sa,ija,x,r,n)
else
call dsprstx(sa,ija,x,r,n)
endif
return
END
@@ -0,0 +1,20 @@
SUBROUTINE avevar(data,n,ave,var)
INTEGER n
REAL ave,var,data(n)
INTEGER j
REAL s,ep
ave=0.0
do 11 j=1,n
ave=ave+data(j)
11 continue
ave=ave/n
var=0.0
ep=0.0
do 12 j=1,n
s=data(j)-ave
ep=ep+s
var=var+s*s
12 continue
var=(var-ep**2/n)/(n-1)
return
END
@@ -0,0 +1,44 @@
PROGRAM badluk
INTEGER ic,icon,idwk,ifrac,im,iybeg,iyend,iyyy,jd,jday,n,julday
REAL TIMZON,frac
PARAMETER (TIMZON=-5./24.)
DATA iybeg,iyend /1900,2000/
CU USES flmoon,julday
write (*,'(1x,a,i5,a,i5)') 'Full moons on Friday the 13th from',
*iybeg,' to',iyend
do 12 iyyy=iybeg,iyend
do 11 im=1,12
jday=julday(im,13,iyyy)
idwk=mod(jday+1,7)
if(idwk.eq.5) then
n=12.37*(iyyy-1900+(im-0.5)/12.)
icon=0
1 call flmoon(n,2,jd,frac)
ifrac=nint(24.*(frac+TIMZON))
if(ifrac.lt.0)then
jd=jd-1
ifrac=ifrac+24
endif
if(ifrac.gt.12)then
jd=jd+1
ifrac=ifrac-12
else
ifrac=ifrac+12
endif
if(jd.eq.jday)then
write (*,'(/1x,i2,a,i2,a,i4)') im,'/',13,'/',iyyy
write (*,'(1x,a,i2,a)') 'Full moon ',ifrac,
*' hrs after midnight (EST).'
goto 2
else
ic=isign(1,jday-jd)
if(ic.eq.-icon) goto 2
icon=ic
n=n+ic
endif
goto 1
2 continue
endif
11 continue
12 continue
END
@@ -0,0 +1,47 @@
SUBROUTINE balanc(a,n,np)
INTEGER n,np
REAL a(np,np),RADIX,SQRDX
PARAMETER (RADIX=2.,SQRDX=RADIX**2)
INTEGER i,j,last
REAL c,f,g,r,s
1 continue
last=1
do 14 i=1,n
c=0.
r=0.
do 11 j=1,n
if(j.ne.i)then
c=c+abs(a(j,i))
r=r+abs(a(i,j))
endif
11 continue
if(c.ne.0..and.r.ne.0.)then
g=r/RADIX
f=1.
s=c+r
2 if(c.lt.g)then
f=f*RADIX
c=c*SQRDX
goto 2
endif
g=r*RADIX
3 if(c.gt.g)then
f=f/RADIX
c=c/SQRDX
goto 3
endif
if((c+r)/f.lt.0.95*s)then
last=0
g=1./f
do 12 j=1,n
a(i,j)=a(i,j)*g
12 continue
do 13 j=1,n
a(j,i)=a(j,i)*f
13 continue
endif
endif
14 continue
if(last.eq.0)goto 1
return
END
@@ -0,0 +1,31 @@
SUBROUTINE banbks(a,n,m1,m2,np,mp,al,mpl,indx,b)
INTEGER m1,m2,mp,mpl,n,np,indx(n)
REAL a(np,mp),al(np,mpl),b(n)
INTEGER i,k,l,mm
REAL dum
mm=m1+m2+1
if(mm.gt.mp.or.m1.gt.mpl.or.n.gt.np) pause 'bad args in banbks'
l=m1
do 12 k=1,n
i=indx(k)
if(i.ne.k)then
dum=b(k)
b(k)=b(i)
b(i)=dum
endif
if(l.lt.n)l=l+1
do 11 i=k+1,l
b(i)=b(i)-al(k,i-k)*b(k)
11 continue
12 continue
l=1
do 14 i=n,1,-1
dum=b(i)
do 13 k=2,l
dum=dum-a(i,k)*b(k+i-1)
13 continue
b(i)=dum/a(i,1)
if(l.lt.mm) l=l+1
14 continue
return
END
@@ -0,0 +1,51 @@
SUBROUTINE bandec(a,n,m1,m2,np,mp,al,mpl,indx,d)
INTEGER m1,m2,mp,mpl,n,np,indx(n)
REAL d,a(np,mp),al(np,mpl),TINY
PARAMETER (TINY=1.e-20)
INTEGER i,j,k,l,mm
REAL dum
mm=m1+m2+1
if(mm.gt.mp.or.m1.gt.mpl.or.n.gt.np) pause 'bad args in bandec'
l=m1
do 13 i=1,m1
do 11 j=m1+2-i,mm
a(i,j-l)=a(i,j)
11 continue
l=l-1
do 12 j=mm-l,mm
a(i,j)=0.
12 continue
13 continue
d=1.
l=m1
do 18 k=1,n
dum=a(k,1)
i=k
if(l.lt.n)l=l+1
do 14 j=k+1,l
if(abs(a(j,1)).gt.abs(dum))then
dum=a(j,1)
i=j
endif
14 continue
indx(k)=i
if(dum.eq.0.) a(k,1)=TINY
if(i.ne.k)then
d=-d
do 15 j=1,mm
dum=a(k,j)
a(k,j)=a(i,j)
a(i,j)=dum
15 continue
endif
do 17 i=k+1,l
dum=a(i,1)/a(k,1)
al(k,i-k)=dum
do 16 j=2,mm
a(i,j-1)=a(i,j)-dum*a(k,j)
16 continue
a(i,mm)=0.
17 continue
18 continue
return
END
@@ -0,0 +1,13 @@
SUBROUTINE banmul(a,n,m1,m2,np,mp,x,b)
INTEGER m1,m2,mp,n,np
REAL a(np,mp),b(n),x(n)
INTEGER i,j,k
do 12 i=1,n
b(i)=0.
k=i-m1-1
do 11 j=max(1,1-k),min(m1+m2+1,n-k)
b(i)=b(i)+a(i,j)*x(j+k)
11 continue
12 continue
return
END
@@ -0,0 +1,35 @@
SUBROUTINE bcucof(y,y1,y2,y12,d1,d2,c)
REAL d1,d2,c(4,4),y(4),y1(4),y12(4),y2(4)
INTEGER i,j,k,l
REAL d1d2,xx,cl(16),wt(16,16),x(16)
SAVE wt
DATA wt/1,0,-3,2,4*0,-3,0,9,-6,2,0,-6,4,8*0,3,0,-9,6,-2,0,6,-4,10*
*0,9,-6,2*0,-6,4,2*0,3,-2,6*0,-9,6,2*0,6,-4,4*0,1,0,-3,2,-2,0,6,-4,
*1,0,-3,2,8*0,-1,0,3,-2,1,0,-3,2,10*0,-3,2,2*0,3,-2,6*0,3,-2,2*0,
*-6,4,2*0,3,-2,0,1,-2,1,5*0,-3,6,-3,0,2,-4,2,9*0,3,-6,3,0,-2,4,-2,
*10*0,-3,3,2*0,2,-2,2*0,-1,1,6*0,3,-3,2*0,-2,2,5*0,1,-2,1,0,-2,4,
*-2,0,1,-2,1,9*0,-1,2,-1,0,1,-2,1,10*0,1,-1,2*0,-1,1,6*0,-1,1,2*0,
*2,-2,2*0,-1,1/
d1d2=d1*d2
do 11 i=1,4
x(i)=y(i)
x(i+4)=y1(i)*d1
x(i+8)=y2(i)*d2
x(i+12)=y12(i)*d1d2
11 continue
do 13 i=1,16
xx=0.
do 12 k=1,16
xx=xx+wt(i,k)*x(k)
12 continue
cl(i)=xx
13 continue
l=0
do 15 i=1,4
do 14 j=1,4
l=l+1
c(i,j)=cl(l)
14 continue
15 continue
return
END
@@ -0,0 +1,23 @@
SUBROUTINE bcuint(y,y1,y2,y12,x1l,x1u,x2l,x2u,x1,x2,ansy,ansy1,
*ansy2)
REAL ansy,ansy1,ansy2,x1,x1l,x1u,x2,x2l,x2u,y(4),y1(4),y12(4),
*y2(4)
CU USES bcucof
INTEGER i
REAL t,u,c(4,4)
call bcucof(y,y1,y2,y12,x1u-x1l,x2u-x2l,c)
if(x1u.eq.x1l.or.x2u.eq.x2l)pause 'bad input in bcuint'
t=(x1-x1l)/(x1u-x1l)
u=(x2-x2l)/(x2u-x2l)
ansy=0.
ansy2=0.
ansy1=0.
do 11 i=4,1,-1
ansy=t*ansy+((c(i,4)*u+c(i,3))*u+c(i,2))*u+c(i,1)
ansy2=t*ansy2+(3.*c(i,4)*u+2.*c(i,3))*u+c(i,2)
ansy1=u*ansy1+(3.*c(4,i)*t+2.*c(3,i))*t+c(2,i)
11 continue
ansy1=ansy1/(x1u-x1l)
ansy2=ansy2/(x2u-x2l)
return
END
@@ -0,0 +1,19 @@
SUBROUTINE beschb(x,gam1,gam2,gampl,gammi)
INTEGER NUSE1,NUSE2
DOUBLE PRECISION gam1,gam2,gammi,gampl,x
PARAMETER (NUSE1=5,NUSE2=5)
CU USES chebev
REAL xx,c1(7),c2(8),chebev
SAVE c1,c2
DATA c1/-1.142022680371168d0,6.5165112670737d-3,3.087090173086d-4,
*-3.4706269649d-6,6.9437664d-9,3.67795d-11,-1.356d-13/
DATA c2/1.843740587300905d0,-7.68528408447867d-2,
*1.2719271366546d-3,-4.9717367042d-6,-3.31261198d-8,2.423096d-10,
*-1.702d-13,-1.49d-15/
xx=8.d0*x*x-1.d0
gam1=chebev(-1.,1.,c1,NUSE1,xx)
gam2=chebev(-1.,1.,c2,NUSE2,xx)
gampl=gam2-x*gam1
gammi=gam2+x*gam1
return
END
@@ -0,0 +1,32 @@
FUNCTION bessi(n,x)
INTEGER n,IACC
REAL bessi,x,BIGNO,BIGNI
PARAMETER (IACC=40,BIGNO=1.0e10,BIGNI=1.0e-10)
CU USES bessi0
INTEGER j,m
REAL bi,bim,bip,tox,bessi0
if (n.lt.2) pause 'bad argument n in bessi'
if (x.eq.0.) then
bessi=0.
else
tox=2.0/abs(x)
bip=0.0
bi=1.0
bessi=0.
m=2*((n+int(sqrt(float(IACC*n)))))
do 11 j=m,1,-1
bim=bip+float(j)*tox*bi
bip=bi
bi=bim
if (abs(bi).gt.BIGNO) then
bessi=bessi*BIGNI
bi=bi*BIGNI
bip=bip*BIGNI
endif
if (j.eq.n) bessi=bip
11 continue
bessi=bessi*bessi0(x)/bi
if (x.lt.0..and.mod(n,2).eq.1) bessi=-bessi
endif
return
END
@@ -0,0 +1,21 @@
FUNCTION bessi0(x)
REAL bessi0,x
REAL ax
DOUBLE PRECISION p1,p2,p3,p4,p5,p6,p7,q1,q2,q3,q4,q5,q6,q7,q8,q9,y
SAVE p1,p2,p3,p4,p5,p6,p7,q1,q2,q3,q4,q5,q6,q7,q8,q9
DATA p1,p2,p3,p4,p5,p6,p7/1.0d0,3.5156229d0,3.0899424d0,
*1.2067492d0,0.2659732d0,0.360768d-1,0.45813d-2/
DATA q1,q2,q3,q4,q5,q6,q7,q8,q9/0.39894228d0,0.1328592d-1,
*0.225319d-2,-0.157565d-2,0.916281d-2,-0.2057706d-1,0.2635537d-1,
*-0.1647633d-1,0.392377d-2/
if (abs(x).lt.3.75) then
y=(x/3.75)**2
bessi0=p1+y*(p2+y*(p3+y*(p4+y*(p5+y*(p6+y*p7)))))
else
ax=abs(x)
y=3.75/ax
bessi0=(exp(ax)/sqrt(ax))*(q1+y*(q2+y*(q3+y*(q4+y*(q5+y*(q6+y*
*(q7+y*(q8+y*q9))))))))
endif
return
END
@@ -0,0 +1,22 @@
FUNCTION bessi1(x)
REAL bessi1,x
REAL ax
DOUBLE PRECISION p1,p2,p3,p4,p5,p6,p7,q1,q2,q3,q4,q5,q6,q7,q8,q9,y
SAVE p1,p2,p3,p4,p5,p6,p7,q1,q2,q3,q4,q5,q6,q7,q8,q9
DATA p1,p2,p3,p4,p5,p6,p7/0.5d0,0.87890594d0,0.51498869d0,
*0.15084934d0,0.2658733d-1,0.301532d-2,0.32411d-3/
DATA q1,q2,q3,q4,q5,q6,q7,q8,q9/0.39894228d0,-0.3988024d-1,
*-0.362018d-2,0.163801d-2,-0.1031555d-1,0.2282967d-1,-0.2895312d-1,
*0.1787654d-1,-0.420059d-2/
if (abs(x).lt.3.75) then
y=(x/3.75)**2
bessi1=x*(p1+y*(p2+y*(p3+y*(p4+y*(p5+y*(p6+y*p7))))))
else
ax=abs(x)
y=3.75/ax
bessi1=(exp(ax)/sqrt(ax))*(q1+y*(q2+y*(q3+y*(q4+y*(q5+y*(q6+y*
*(q7+y*(q8+y*q9))))))))
if(x.lt.0.)bessi1=-bessi1
endif
return
END
@@ -0,0 +1,129 @@
SUBROUTINE bessik(x,xnu,ri,rk,rip,rkp)
INTEGER MAXIT
REAL ri,rip,rk,rkp,x,xnu,XMIN
DOUBLE PRECISION EPS,FPMIN,PI
PARAMETER (EPS=1.e-10,FPMIN=1.e-30,MAXIT=10000,XMIN=2.,
*PI=3.141592653589793d0)
CU USES beschb
INTEGER i,l,nl
DOUBLE PRECISION a,a1,b,c,d,del,del1,delh,dels,e,f,fact,fact2,ff,
*gam1,gam2,gammi,gampl,h,p,pimu,q,q1,q2,qnew,ril,ril1,rimu,rip1,
*ripl,ritemp,rk1,rkmu,rkmup,rktemp,s,sum,sum1,x2,xi,xi2,xmu,xmu2
if(x.le.0..or.xnu.lt.0.) pause 'bad arguments in bessik'
nl=int(xnu+.5d0)
xmu=xnu-nl
xmu2=xmu*xmu
xi=1.d0/x
xi2=2.d0*xi
h=xnu*xi
if(h.lt.FPMIN)h=FPMIN
b=xi2*xnu
d=0.d0
c=h
do 11 i=1,MAXIT
b=b+xi2
d=1.d0/(b+d)
c=b+1.d0/c
del=c*d
h=del*h
if(abs(del-1.d0).lt.EPS)goto 1
11 continue
pause 'x too large in bessik; try asymptotic expansion'
1 continue
ril=FPMIN
ripl=h*ril
ril1=ril
rip1=ripl
fact=xnu*xi
do 12 l=nl,1,-1
ritemp=fact*ril+ripl
fact=fact-xi
ripl=fact*ritemp+ril
ril=ritemp
12 continue
f=ripl/ril
if(x.lt.XMIN) then
x2=.5d0*x
pimu=PI*xmu
if(abs(pimu).lt.EPS)then
fact=1.d0
else
fact=pimu/sin(pimu)
endif
d=-log(x2)
e=xmu*d
if(abs(e).lt.EPS)then
fact2=1.d0
else
fact2=sinh(e)/e
endif
call beschb(xmu,gam1,gam2,gampl,gammi)
ff=fact*(gam1*cosh(e)+gam2*fact2*d)
sum=ff
e=exp(e)
p=0.5d0*e/gampl
q=0.5d0/(e*gammi)
c=1.d0
d=x2*x2
sum1=p
do 13 i=1,MAXIT
ff=(i*ff+p+q)/(i*i-xmu2)
c=c*d/i
p=p/(i-xmu)
q=q/(i+xmu)
del=c*ff
sum=sum+del
del1=c*(p-i*ff)
sum1=sum1+del1
if(abs(del).lt.abs(sum)*EPS)goto 2
13 continue
pause 'bessk series failed to converge'
2 continue
rkmu=sum
rk1=sum1*xi2
else
b=2.d0*(1.d0+x)
d=1.d0/b
delh=d
h=delh
q1=0.d0
q2=1.d0
a1=.25d0-xmu2
c=a1
q=c
a=-a1
s=1.d0+q*delh
do 14 i=2,MAXIT
a=a-2*(i-1)
c=-a*c/i
qnew=(q1-b*q2)/a
q1=q2
q2=qnew
q=q+c*qnew
b=b+2.d0
d=1.d0/(b+a*d)
delh=(b*d-1.d0)*delh
h=h+delh
dels=q*delh
s=s+dels
if(abs(dels/s).lt.EPS)goto 3
14 continue
pause 'bessik: failure to converge in cf2'
3 continue
h=a1*h
rkmu=sqrt(PI/(2.d0*x))*exp(-x)/s
rk1=rkmu*(xmu+x+.5d0-h)*xi
endif
rkmup=xmu*xi*rkmu-rk1
rimu=xi/(f*rkmu-rkmup)
ri=(rimu*ril1)/ril
rip=(rimu*rip1)/ril
do 15 i=1,nl
rktemp=(xmu+i)*xi2*rk1+rkmu
rkmu=rk1
rk1=rktemp
15 continue
rk=rkmu
rkp=xnu*xi*rkmu-rk1
return
END
@@ -0,0 +1,49 @@
FUNCTION bessj(n,x)
INTEGER n,IACC
REAL bessj,x,BIGNO,BIGNI
PARAMETER (IACC=40,BIGNO=1.e10,BIGNI=1.e-10)
CU USES bessj0,bessj1
INTEGER j,jsum,m
REAL ax,bj,bjm,bjp,sum,tox,bessj0,bessj1
if(n.lt.2)pause 'bad argument n in bessj'
ax=abs(x)
if(ax.eq.0.)then
bessj=0.
else if(ax.gt.float(n))then
tox=2./ax
bjm=bessj0(ax)
bj=bessj1(ax)
do 11 j=1,n-1
bjp=j*tox*bj-bjm
bjm=bj
bj=bjp
11 continue
bessj=bj
else
tox=2./ax
m=2*((n+int(sqrt(float(IACC*n))))/2)
bessj=0.
jsum=0
sum=0.
bjp=0.
bj=1.
do 12 j=m,1,-1
bjm=j*tox*bj-bjp
bjp=bj
bj=bjm
if(abs(bj).gt.BIGNO)then
bj=bj*BIGNI
bjp=bjp*BIGNI
bessj=bessj*BIGNI
sum=sum*BIGNI
endif
if(jsum.ne.0)sum=sum+bj
jsum=1-jsum
if(j.eq.n)bessj=bjp
12 continue
sum=2.*sum-bj
bessj=bessj/sum
endif
if(x.lt.0..and.mod(n,2).eq.1)bessj=-bessj
return
END
@@ -0,0 +1,28 @@
FUNCTION bessj0(x)
REAL bessj0,x
REAL ax,xx,z
DOUBLE PRECISION p1,p2,p3,p4,p5,q1,q2,q3,q4,q5,r1,r2,r3,r4,r5,r6,
*s1,s2,s3,s4,s5,s6,y
SAVE p1,p2,p3,p4,p5,q1,q2,q3,q4,q5,r1,r2,r3,r4,r5,r6,s1,s2,s3,s4,
*s5,s6
DATA p1,p2,p3,p4,p5/1.d0,-.1098628627d-2,.2734510407d-4,
*-.2073370639d-5,.2093887211d-6/, q1,q2,q3,q4,q5/-.1562499995d-1,
*.1430488765d-3,-.6911147651d-5,.7621095161d-6,-.934945152d-7/
DATA r1,r2,r3,r4,r5,r6/57568490574.d0,-13362590354.d0,
*651619640.7d0,-11214424.18d0,77392.33017d0,-184.9052456d0/,s1,s2,
*s3,s4,s5,s6/57568490411.d0,1029532985.d0,9494680.718d0,
*59272.64853d0,267.8532712d0,1.d0/
if(abs(x).lt.8.)then
y=x**2
bessj0=(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6)))))/(s1+y*(s2+y*(s3+y*
*(s4+y*(s5+y*s6)))))
else
ax=abs(x)
z=8./ax
y=z**2
xx=ax-.785398164
bessj0=sqrt(.636619772/ax)*(cos(xx)*(p1+y*(p2+y*(p3+y*(p4+y*
*p5))))-z*sin(xx)*(q1+y*(q2+y*(q3+y*(q4+y*q5)))))
endif
return
END
@@ -0,0 +1,28 @@
FUNCTION bessj1(x)
REAL bessj1,x
REAL ax,xx,z
DOUBLE PRECISION p1,p2,p3,p4,p5,q1,q2,q3,q4,q5,r1,r2,r3,r4,r5,r6,
*s1,s2,s3,s4,s5,s6,y
SAVE p1,p2,p3,p4,p5,q1,q2,q3,q4,q5,r1,r2,r3,r4,r5,r6,s1,s2,s3,s4,
*s5,s6
DATA r1,r2,r3,r4,r5,r6/72362614232.d0,-7895059235.d0,
*242396853.1d0,-2972611.439d0,15704.48260d0,-30.16036606d0/,s1,s2,
*s3,s4,s5,s6/144725228442.d0,2300535178.d0,18583304.74d0,
*99447.43394d0,376.9991397d0,1.d0/
DATA p1,p2,p3,p4,p5/1.d0,.183105d-2,-.3516396496d-4,
*.2457520174d-5,-.240337019d-6/, q1,q2,q3,q4,q5/.04687499995d0,
*-.2002690873d-3,.8449199096d-5,-.88228987d-6,.105787412d-6/
if(abs(x).lt.8.)then
y=x**2
bessj1=x*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6)))))/(s1+y*(s2+y*(s3+
*y*(s4+y*(s5+y*s6)))))
else
ax=abs(x)
z=8./ax
y=z**2
xx=ax-2.356194491
bessj1=sqrt(.636619772/ax)*(cos(xx)*(p1+y*(p2+y*(p3+y*(p4+y*
*p5))))-z*sin(xx)*(q1+y*(q2+y*(q3+y*(q4+y*q5)))))*sign(1.,x)
endif
return
END
@@ -0,0 +1,162 @@
SUBROUTINE bessjy(x,xnu,rj,ry,rjp,ryp)
INTEGER MAXIT
REAL rj,rjp,ry,ryp,x,xnu,XMIN
DOUBLE PRECISION EPS,FPMIN,PI
PARAMETER (EPS=1.e-10,FPMIN=1.e-30,MAXIT=10000,XMIN=2.,
*PI=3.141592653589793d0)
CU USES beschb
INTEGER i,isign,l,nl
DOUBLE PRECISION a,b,br,bi,c,cr,ci,d,del,del1,den,di,dlr,dli,dr,e,
*f,fact,fact2,fact3,ff,gam,gam1,gam2,gammi,gampl,h,p,pimu,pimu2,q,
*r,rjl,rjl1,rjmu,rjp1,rjpl,rjtemp,ry1,rymu,rymup,rytemp,sum,sum1,
*temp,w,x2,xi,xi2,xmu,xmu2
if(x.le.0..or.xnu.lt.0.) pause 'bad arguments in bessjy'
if(x.lt.XMIN)then
nl=int(xnu+.5d0)
else
nl=max(0,int(xnu-x+1.5d0))
endif
xmu=xnu-nl
xmu2=xmu*xmu
xi=1.d0/x
xi2=2.d0*xi
w=xi2/PI
isign=1
h=xnu*xi
if(h.lt.FPMIN)h=FPMIN
b=xi2*xnu
d=0.d0
c=h
do 11 i=1,MAXIT
b=b+xi2
d=b-d
if(abs(d).lt.FPMIN)d=FPMIN
c=b-1.d0/c
if(abs(c).lt.FPMIN)c=FPMIN
d=1.d0/d
del=c*d
h=del*h
if(d.lt.0.d0)isign=-isign
if(abs(del-1.d0).lt.EPS)goto 1
11 continue
pause 'x too large in bessjy; try asymptotic expansion'
1 continue
rjl=isign*FPMIN
rjpl=h*rjl
rjl1=rjl
rjp1=rjpl
fact=xnu*xi
do 12 l=nl,1,-1
rjtemp=fact*rjl+rjpl
fact=fact-xi
rjpl=fact*rjtemp-rjl
rjl=rjtemp
12 continue
if(rjl.eq.0.d0)rjl=EPS
f=rjpl/rjl
if(x.lt.XMIN) then
x2=.5d0*x
pimu=PI*xmu
if(abs(pimu).lt.EPS)then
fact=1.d0
else
fact=pimu/sin(pimu)
endif
d=-log(x2)
e=xmu*d
if(abs(e).lt.EPS)then
fact2=1.d0
else
fact2=sinh(e)/e
endif
call beschb(xmu,gam1,gam2,gampl,gammi)
ff=2.d0/PI*fact*(gam1*cosh(e)+gam2*fact2*d)
e=exp(e)
p=e/(gampl*PI)
q=1.d0/(e*PI*gammi)
pimu2=0.5d0*pimu
if(abs(pimu2).lt.EPS)then
fact3=1.d0
else
fact3=sin(pimu2)/pimu2
endif
r=PI*pimu2*fact3*fact3
c=1.d0
d=-x2*x2
sum=ff+r*q
sum1=p
do 13 i=1,MAXIT
ff=(i*ff+p+q)/(i*i-xmu2)
c=c*d/i
p=p/(i-xmu)
q=q/(i+xmu)
del=c*(ff+r*q)
sum=sum+del
del1=c*p-i*del
sum1=sum1+del1
if(abs(del).lt.(1.d0+abs(sum))*EPS)goto 2
13 continue
pause 'bessy series failed to converge'
2 continue
rymu=-sum
ry1=-sum1*xi2
rymup=xmu*xi*rymu-ry1
rjmu=w/(rymup-f*rymu)
else
a=.25d0-xmu2
p=-.5d0*xi
q=1.d0
br=2.d0*x
bi=2.d0
fact=a*xi/(p*p+q*q)
cr=br+q*fact
ci=bi+p*fact
den=br*br+bi*bi
dr=br/den
di=-bi/den
dlr=cr*dr-ci*di
dli=cr*di+ci*dr
temp=p*dlr-q*dli
q=p*dli+q*dlr
p=temp
do 14 i=2,MAXIT
a=a+2*(i-1)
bi=bi+2.d0
dr=a*dr+br
di=a*di+bi
if(abs(dr)+abs(di).lt.FPMIN)dr=FPMIN
fact=a/(cr*cr+ci*ci)
cr=br+cr*fact
ci=bi-ci*fact
if(abs(cr)+abs(ci).lt.FPMIN)cr=FPMIN
den=dr*dr+di*di
dr=dr/den
di=-di/den
dlr=cr*dr-ci*di
dli=cr*di+ci*dr
temp=p*dlr-q*dli
q=p*dli+q*dlr
p=temp
if(abs(dlr-1.d0)+abs(dli).lt.EPS)goto 3
14 continue
pause 'cf2 failed in bessjy'
3 continue
gam=(p-f)/q
rjmu=sqrt(w/((p-f)*gam+q))
rjmu=sign(rjmu,rjl)
rymu=rjmu*gam
rymup=rymu*(p+q/gam)
ry1=xmu*xi*rymu-rymup
endif
fact=rjmu/rjl
rj=rjl1*fact
rjp=rjp1*fact
do 15 i=1,nl
rytemp=(xmu+i)*xi2*ry1-rymu
rymu=ry1
ry1=rytemp
15 continue
ry=rymu
ryp=xnu*xi*rymu-ry1
return
END
@@ -0,0 +1,18 @@
FUNCTION bessk(n,x)
INTEGER n
REAL bessk,x
CU USES bessk0,bessk1
INTEGER j
REAL bk,bkm,bkp,tox,bessk0,bessk1
if (n.lt.2) pause 'bad argument n in bessk'
tox=2.0/x
bkm=bessk0(x)
bk=bessk1(x)
do 11 j=1,n-1
bkp=bkm+j*tox*bk
bkm=bk
bk=bkp
11 continue
bessk=bk
return
END
@@ -0,0 +1,21 @@
FUNCTION bessk0(x)
REAL bessk0,x
CU USES bessi0
REAL bessi0
DOUBLE PRECISION p1,p2,p3,p4,p5,p6,p7,q1,q2,q3,q4,q5,q6,q7,y
SAVE p1,p2,p3,p4,p5,p6,p7,q1,q2,q3,q4,q5,q6,q7
DATA p1,p2,p3,p4,p5,p6,p7/-0.57721566d0,0.42278420d0,0.23069756d0,
*0.3488590d-1,0.262698d-2,0.10750d-3,0.74d-5/
DATA q1,q2,q3,q4,q5,q6,q7/1.25331414d0,-0.7832358d-1,0.2189568d-1,
*-0.1062446d-1,0.587872d-2,-0.251540d-2,0.53208d-3/
if (x.le.2.0) then
y=x*x/4.0
bessk0=(-log(x/2.0)*bessi0(x))+(p1+y*(p2+y*(p3+y*(p4+y*(p5+y*
*(p6+y*p7))))))
else
y=(2.0/x)
bessk0=(exp(-x)/sqrt(x))*(q1+y*(q2+y*(q3+y*(q4+y*(q5+y*(q6+y*
*q7))))))
endif
return
END
@@ -0,0 +1,21 @@
FUNCTION bessk1(x)
REAL bessk1,x
CU USES bessi1
REAL bessi1
DOUBLE PRECISION p1,p2,p3,p4,p5,p6,p7,q1,q2,q3,q4,q5,q6,q7,y
SAVE p1,p2,p3,p4,p5,p6,p7,q1,q2,q3,q4,q5,q6,q7
DATA p1,p2,p3,p4,p5,p6,p7/1.0d0,0.15443144d0,-0.67278579d0,
*-0.18156897d0,-0.1919402d-1,-0.110404d-2,-0.4686d-4/
DATA q1,q2,q3,q4,q5,q6,q7/1.25331414d0,0.23498619d0,-0.3655620d-1,
*0.1504268d-1,-0.780353d-2,0.325614d-2,-0.68245d-3/
if (x.le.2.0) then
y=x*x/4.0
bessk1=(log(x/2.0)*bessi1(x))+(1.0/x)*(p1+y*(p2+y*(p3+y*(p4+y*
*(p5+y*(p6+y*p7))))))
else
y=2.0/x
bessk1=(exp(-x)/sqrt(x))*(q1+y*(q2+y*(q3+y*(q4+y*(q5+y*(q6+y*
*q7))))))
endif
return
END
@@ -0,0 +1,18 @@
FUNCTION bessy(n,x)
INTEGER n
REAL bessy,x
CU USES bessy0,bessy1
INTEGER j
REAL by,bym,byp,tox,bessy0,bessy1
if(n.lt.2)pause 'bad argument n in bessy'
tox=2./x
by=bessy1(x)
bym=bessy0(x)
do 11 j=1,n-1
byp=j*tox*by-bym
bym=by
by=byp
11 continue
bessy=by
return
END
@@ -0,0 +1,28 @@
FUNCTION bessy0(x)
REAL bessy0,x
CU USES bessj0
REAL xx,z,bessj0
DOUBLE PRECISION p1,p2,p3,p4,p5,q1,q2,q3,q4,q5,r1,r2,r3,r4,r5,r6,
*s1,s2,s3,s4,s5,s6,y
SAVE p1,p2,p3,p4,p5,q1,q2,q3,q4,q5,r1,r2,r3,r4,r5,r6,s1,s2,s3,s4,
*s5,s6
DATA p1,p2,p3,p4,p5/1.d0,-.1098628627d-2,.2734510407d-4,
*-.2073370639d-5,.2093887211d-6/, q1,q2,q3,q4,q5/-.1562499995d-1,
*.1430488765d-3,-.6911147651d-5,.7621095161d-6,-.934945152d-7/
DATA r1,r2,r3,r4,r5,r6/-2957821389.d0,7062834065.d0,
*-512359803.6d0,10879881.29d0,-86327.92757d0,228.4622733d0/,s1,s2,
*s3,s4,s5,s6/40076544269.d0,745249964.8d0,7189466.438d0,
*47447.26470d0,226.1030244d0,1.d0/
if(x.lt.8.)then
y=x**2
bessy0=(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6)))))/(s1+y*(s2+y*(s3+y*
*(s4+y*(s5+y*s6)))))+.636619772*bessj0(x)*log(x)
else
z=8./x
y=z**2
xx=x-.785398164
bessy0=sqrt(.636619772/x)*(sin(xx)*(p1+y*(p2+y*(p3+y*(p4+y*
*p5))))+z*cos(xx)*(q1+y*(q2+y*(q3+y*(q4+y*q5)))))
endif
return
END
@@ -0,0 +1,28 @@
FUNCTION bessy1(x)
REAL bessy1,x
CU USES bessj1
REAL xx,z,bessj1
DOUBLE PRECISION p1,p2,p3,p4,p5,q1,q2,q3,q4,q5,r1,r2,r3,r4,r5,r6,
*s1,s2,s3,s4,s5,s6,s7,y
SAVE p1,p2,p3,p4,p5,q1,q2,q3,q4,q5,r1,r2,r3,r4,r5,r6,s1,s2,s3,s4,
*s5,s6,s7
DATA p1,p2,p3,p4,p5/1.d0,.183105d-2,-.3516396496d-4,
*.2457520174d-5,-.240337019d-6/, q1,q2,q3,q4,q5/.04687499995d0,
*-.2002690873d-3,.8449199096d-5,-.88228987d-6,.105787412d-6/
DATA r1,r2,r3,r4,r5,r6/-.4900604943d13,.1275274390d13,
*-.5153438139d11,.7349264551d9,-.4237922726d7,.8511937935d4/,s1,s2,
*s3,s4,s5,s6,s7/.2499580570d14,.4244419664d12,.3733650367d10,
*.2245904002d8,.1020426050d6,.3549632885d3,1.d0/
if(x.lt.8.)then
y=x**2
bessy1=x*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6)))))/(s1+y*(s2+y*(s3+
*y*(s4+y*(s5+y*(s6+y*s7))))))+.636619772*(bessj1(x)*log(x)-1./x)
else
z=8./x
y=z**2
xx=x-2.356194491
bessy1=sqrt(.636619772/x)*(sin(xx)*(p1+y*(p2+y*(p3+y*(p4+y*
*p5))))+z*cos(xx)*(q1+y*(q2+y*(q3+y*(q4+y*q5)))))
endif
return
END
@@ -0,0 +1,7 @@
FUNCTION beta(z,w)
REAL beta,w,z
CU USES gammln
REAL gammln
beta=exp(gammln(z)+gammln(w)-gammln(z+w))
return
END
@@ -0,0 +1,37 @@
FUNCTION betacf(a,b,x)
INTEGER MAXIT
REAL betacf,a,b,x,EPS,FPMIN
PARAMETER (MAXIT=100,EPS=3.e-7,FPMIN=1.e-30)
INTEGER m,m2
REAL aa,c,d,del,h,qab,qam,qap
qab=a+b
qap=a+1.
qam=a-1.
c=1.
d=1.-qab*x/qap
if(abs(d).lt.FPMIN)d=FPMIN
d=1./d
h=d
do 11 m=1,MAXIT
m2=2*m
aa=m*(b-m)*x/((qam+m2)*(a+m2))
d=1.+aa*d
if(abs(d).lt.FPMIN)d=FPMIN
c=1.+aa/c
if(abs(c).lt.FPMIN)c=FPMIN
d=1./d
h=h*d*c
aa=-(a+m)*(qab+m)*x/((a+m2)*(qap+m2))
d=1.+aa*d
if(abs(d).lt.FPMIN)d=FPMIN
c=1.+aa/c
if(abs(c).lt.FPMIN)c=FPMIN
d=1./d
del=d*c
h=h*del
if(abs(del-1.).lt.EPS)goto 1
11 continue
pause 'a or b too big, or MAXIT too small in betacf'
1 betacf=h
return
END
@@ -0,0 +1,18 @@
FUNCTION betai(a,b,x)
REAL betai,a,b,x
CU USES betacf,gammln
REAL bt,betacf,gammln
if(x.lt.0..or.x.gt.1.)pause 'bad argument x in betai'
if(x.eq.0..or.x.eq.1.)then
bt=0.
else
bt=exp(gammln(a+b)-gammln(a)-gammln(b)+a*log(x)+b*log(1.-x))
endif
if(x.lt.(a+1.)/(a+b+2.))then
betai=bt*betacf(a,b,x)/a
return
else
betai=1.-bt*betacf(b,a,1.-x)/b
return
endif
END
@@ -0,0 +1,8 @@
FUNCTION bico(n,k)
INTEGER k,n
REAL bico
CU USES factln
REAL factln
bico=nint(exp(factln(n)-factln(k)-factln(n-k)))
return
END
@@ -0,0 +1,28 @@
SUBROUTINE bksub(ne,nb,jf,k1,k2,c,nci,ncj,nck)
INTEGER jf,k1,k2,nb,nci,ncj,nck,ne
REAL c(nci,ncj,nck)
INTEGER i,im,j,k,kp,nbf
REAL xx
nbf=ne-nb
im=1
do 13 k=k2,k1,-1
if (k.eq.k1) im=nbf+1
kp=k+1
do 12 j=1,nbf
xx=c(j,jf,kp)
do 11 i=im,ne
c(i,jf,k)=c(i,jf,k)-c(i,j,k)*xx
11 continue
12 continue
13 continue
do 16 k=k1,k2
kp=k+1
do 14 i=1,nb
c(i,1,k)=c(i+nbf,jf,k)
14 continue
do 15 i=1,nbf
c(i+nb,1,k)=c(i,jf,kp)
15 continue
16 continue
return
END
@@ -0,0 +1,54 @@
FUNCTION bnldev(pp,n,idum)
INTEGER idum,n
REAL bnldev,pp,PI
CU USES gammln,ran1
PARAMETER (PI=3.141592654)
INTEGER j,nold
REAL am,em,en,g,oldg,p,pc,pclog,plog,pold,sq,t,y,gammln,ran1
SAVE nold,pold,pc,plog,pclog,en,oldg
DATA nold /-1/, pold /-1./
if(pp.le.0.5)then
p=pp
else
p=1.-pp
endif
am=n*p
if (n.lt.25)then
bnldev=0.
do 11 j=1,n
if(ran1(idum).lt.p)bnldev=bnldev+1.
11 continue
else if (am.lt.1.) then
g=exp(-am)
t=1.
do 12 j=0,n
t=t*ran1(idum)
if (t.lt.g) goto 1
12 continue
j=n
1 bnldev=j
else
if (n.ne.nold) then
en=n
oldg=gammln(en+1.)
nold=n
endif
if (p.ne.pold) then
pc=1.-p
plog=log(p)
pclog=log(pc)
pold=p
endif
sq=sqrt(2.*am*pc)
2 y=tan(PI*ran1(idum))
em=sq*y+am
if (em.lt.0..or.em.ge.en+1.) goto 2
em=int(em)
t=1.2*sq*(1.+y**2)*exp(oldg-gammln(em+1.)-gammln(en-em+1.)+em*
*plog+(en-em)*pclog)
if (ran1(idum).gt.t) goto 2
bnldev=em
endif
if (p.ne.pp) bnldev=n-bnldev
return
END
@@ -0,0 +1,83 @@
FUNCTION brent(ax,bx,cx,f,tol,xmin)
INTEGER ITMAX
REAL brent,ax,bx,cx,tol,xmin,f,CGOLD,ZEPS
EXTERNAL f
PARAMETER (ITMAX=100,CGOLD=.3819660,ZEPS=1.0e-10)
INTEGER iter
REAL a,b,d,e,etemp,fu,fv,fw,fx,p,q,r,tol1,tol2,u,v,w,x,xm
a=min(ax,cx)
b=max(ax,cx)
v=bx
w=v
x=v
e=0.
fx=f(x)
fv=fx
fw=fx
do 11 iter=1,ITMAX
xm=0.5*(a+b)
tol1=tol*abs(x)+ZEPS
tol2=2.*tol1
if(abs(x-xm).le.(tol2-.5*(b-a))) goto 3
if(abs(e).gt.tol1) then
r=(x-w)*(fx-fv)
q=(x-v)*(fx-fw)
p=(x-v)*q-(x-w)*r
q=2.*(q-r)
if(q.gt.0.) p=-p
q=abs(q)
etemp=e
e=d
if(abs(p).ge.abs(.5*q*etemp).or.p.le.q*(a-x).or.p.ge.q*(b-x))
*goto 1
d=p/q
u=x+d
if(u-a.lt.tol2 .or. b-u.lt.tol2) d=sign(tol1,xm-x)
goto 2
endif
1 if(x.ge.xm) then
e=a-x
else
e=b-x
endif
d=CGOLD*e
2 if(abs(d).ge.tol1) then
u=x+d
else
u=x+sign(tol1,d)
endif
fu=f(u)
if(fu.le.fx) then
if(u.ge.x) then
a=x
else
b=x
endif
v=w
fv=fw
w=x
fw=fx
x=u
fx=fu
else
if(u.lt.x) then
a=u
else
b=u
endif
if(fu.le.fw .or. w.eq.x) then
v=w
fv=fw
w=u
fw=fu
else if(fu.le.fv .or. v.eq.x .or. v.eq.w) then
v=u
fv=fu
endif
endif
11 continue
pause 'brent exceed maximum iterations'
3 xmin=x
brent=fx
return
END
@@ -0,0 +1,170 @@
SUBROUTINE broydn(x,n,check)
INTEGER n,nn,NP,MAXITS
REAL x(n),fvec,EPS,TOLF,TOLMIN,TOLX,STPMX
LOGICAL check
PARAMETER (NP=40,MAXITS=200,EPS=1.e-7,TOLF=1.e-4,TOLMIN=1.e-6,
*TOLX=EPS,STPMX=100.)
COMMON /newtv/ fvec(NP),nn
CU USES fdjac,fmin,lnsrch,qrdcmp,qrupdt,rsolv
INTEGER i,its,j,k
REAL den,f,fold,stpmax,sum,temp,test,c(NP),d(NP),fvcold(NP),g(NP),
*p(NP),qt(NP,NP),r(NP,NP),s(NP),t(NP),w(NP),xold(NP),fmin
LOGICAL restrt,sing,skip
EXTERNAL fmin
nn=n
f=fmin(x)
test=0.
do 11 i=1,n
if(abs(fvec(i)).gt.test)test=abs(fvec(i))
11 continue
if(test.lt..01*TOLF)then
check=.false.
return
endif
sum=0.
do 12 i=1,n
sum=sum+x(i)**2
12 continue
stpmax=STPMX*max(sqrt(sum),float(n))
restrt=.true.
do 44 its=1,MAXITS
if(restrt)then
call fdjac(n,x,fvec,NP,r)
call qrdcmp(r,n,NP,c,d,sing)
if(sing) pause 'singular Jacobian in broydn'
do 14 i=1,n
do 13 j=1,n
qt(i,j)=0.
13 continue
qt(i,i)=1.
14 continue
do 18 k=1,n-1
if(c(k).ne.0.)then
do 17 j=1,n
sum=0.
do 15 i=k,n
sum=sum+r(i,k)*qt(i,j)
15 continue
sum=sum/c(k)
do 16 i=k,n
qt(i,j)=qt(i,j)-sum*r(i,k)
16 continue
17 continue
endif
18 continue
do 21 i=1,n
r(i,i)=d(i)
do 19 j=1,i-1
r(i,j)=0.
19 continue
21 continue
else
do 22 i=1,n
s(i)=x(i)-xold(i)
22 continue
do 24 i=1,n
sum=0.
do 23 j=i,n
sum=sum+r(i,j)*s(j)
23 continue
t(i)=sum
24 continue
skip=.true.
do 26 i=1,n
sum=0.
do 25 j=1,n
sum=sum+qt(j,i)*t(j)
25 continue
w(i)=fvec(i)-fvcold(i)-sum
if(abs(w(i)).ge.EPS*(abs(fvec(i))+abs(fvcold(i))))then
skip=.false.
else
w(i)=0.
endif
26 continue
if(.not.skip)then
do 28 i=1,n
sum=0.
do 27 j=1,n
sum=sum+qt(i,j)*w(j)
27 continue
t(i)=sum
28 continue
den=0.
do 29 i=1,n
den=den+s(i)**2
29 continue
do 31 i=1,n
s(i)=s(i)/den
31 continue
call qrupdt(r,qt,n,NP,t,s)
do 32 i=1,n
if(r(i,i).eq.0.) pause 'r singular in broydn'
d(i)=r(i,i)
32 continue
endif
endif
do 34 i=1,n
sum=0.
do 33 j=1,n
sum=sum+qt(i,j)*fvec(j)
33 continue
g(i)=sum
34 continue
do 36 i=n,1,-1
sum=0.
do 35 j=1,i
sum=sum+r(j,i)*g(j)
35 continue
g(i)=sum
36 continue
do 37 i=1,n
xold(i)=x(i)
fvcold(i)=fvec(i)
37 continue
fold=f
do 39 i=1,n
sum=0.
do 38 j=1,n
sum=sum+qt(i,j)*fvec(j)
38 continue
p(i)=-sum
39 continue
call rsolv(r,n,NP,d,p)
call lnsrch(n,xold,fold,g,p,x,f,stpmax,check,fmin)
test=0.
do 41 i=1,n
if(abs(fvec(i)).gt.test)test=abs(fvec(i))
41 continue
if(test.lt.TOLF)then
check=.false.
return
endif
if(check)then
if(restrt)then
return
else
test=0.
den=max(f,.5*n)
do 42 i=1,n
temp=abs(g(i))*max(abs(x(i)),1.)/den
if(temp.gt.test)test=temp
42 continue
if(test.lt.TOLMIN)then
return
else
restrt=.true.
endif
endif
else
restrt=.false.
test=0.
do 43 i=1,n
temp=(abs(x(i)-xold(i)))/max(abs(x(i)),1.)
if(temp.gt.test)test=temp
43 continue
if(test.lt.TOLX)return
endif
44 continue
pause 'MAXITS exceeded in broydn'
END
@@ -0,0 +1,109 @@
SUBROUTINE bsstep(y,dydx,nv,x,htry,eps,yscal,hdid,hnext,derivs)
INTEGER nv,NMAX,KMAXX,IMAX
REAL eps,hdid,hnext,htry,x,dydx(nv),y(nv),yscal(nv),SAFE1,SAFE2,
*REDMAX,REDMIN,TINY,SCALMX
PARAMETER (NMAX=50,KMAXX=8,IMAX=KMAXX+1,SAFE1=.25,SAFE2=.7,
*REDMAX=1.e-5,REDMIN=.7,TINY=1.e-30,SCALMX=.1)
CU USES derivs,mmid,pzextr
INTEGER i,iq,k,kk,km,kmax,kopt,nseq(IMAX)
REAL eps1,epsold,errmax,fact,h,red,scale,work,wrkmin,xest,xnew,
*a(IMAX),alf(KMAXX,KMAXX),err(KMAXX),yerr(NMAX),ysav(NMAX),
*yseq(NMAX)
LOGICAL first,reduct
SAVE a,alf,epsold,first,kmax,kopt,nseq,xnew
EXTERNAL derivs
DATA first/.true./,epsold/-1./
DATA nseq /2,4,6,8,10,12,14,16,18/
if(eps.ne.epsold)then
hnext=-1.e29
xnew=-1.e29
eps1=SAFE1*eps
a(1)=nseq(1)+1
do 11 k=1,KMAXX
a(k+1)=a(k)+nseq(k+1)
11 continue
do 13 iq=2,KMAXX
do 12 k=1,iq-1
alf(k,iq)=eps1**((a(k+1)-a(iq+1))/((a(iq+1)-a(1)+1.)*(2*k+
*1)))
12 continue
13 continue
epsold=eps
do 14 kopt=2,KMAXX-1
if(a(kopt+1).gt.a(kopt)*alf(kopt-1,kopt))goto 1
14 continue
1 kmax=kopt
endif
h=htry
do 15 i=1,nv
ysav(i)=y(i)
15 continue
if(h.ne.hnext.or.x.ne.xnew)then
first=.true.
kopt=kmax
endif
reduct=.false.
2 do 17 k=1,kmax
xnew=x+h
if(xnew.eq.x)pause 'step size underflow in bsstep'
call mmid(ysav,dydx,nv,x,h,nseq(k),yseq,derivs)
xest=(h/nseq(k))**2
call pzextr(k,xest,yseq,y,yerr,nv)
if(k.ne.1)then
errmax=TINY
do 16 i=1,nv
errmax=max(errmax,abs(yerr(i)/yscal(i)))
16 continue
errmax=errmax/eps
km=k-1
err(km)=(errmax/SAFE1)**(1./(2*km+1))
endif
if(k.ne.1.and.(k.ge.kopt-1.or.first))then
if(errmax.lt.1.)goto 4
if(k.eq.kmax.or.k.eq.kopt+1)then
red=SAFE2/err(km)
goto 3
else if(k.eq.kopt)then
if(alf(kopt-1,kopt).lt.err(km))then
red=1./err(km)
goto 3
endif
else if(kopt.eq.kmax)then
if(alf(km,kmax-1).lt.err(km))then
red=alf(km,kmax-1)*SAFE2/err(km)
goto 3
endif
else if(alf(km,kopt).lt.err(km))then
red=alf(km,kopt-1)/err(km)
goto 3
endif
endif
17 continue
3 red=min(red,REDMIN)
red=max(red,REDMAX)
h=h*red
reduct=.true.
goto 2
4 x=xnew
hdid=h
first=.false.
wrkmin=1.e35
do 18 kk=1,km
fact=max(err(kk),SCALMX)
work=fact*a(kk+1)
if(work.lt.wrkmin)then
scale=fact
wrkmin=work
kopt=kk+1
endif
18 continue
hnext=h/scale
if(kopt.ge.k.and.kopt.ne.kmax.and..not.reduct)then
fact=max(scale/alf(kopt-1,kopt),SCALMX)
if(a(kopt+1)*fact.le.wrkmin)then
hnext=h/fact
kopt=kopt+1
endif
endif
return
END
@@ -0,0 +1,22 @@
SUBROUTINE caldat(julian,mm,id,iyyy)
INTEGER id,iyyy,julian,mm,IGREG
PARAMETER (IGREG=2299161)
INTEGER ja,jalpha,jb,jc,jd,je
if(julian.ge.IGREG)then
jalpha=int(((julian-1867216)-0.25)/36524.25)
ja=julian+1+jalpha-int(0.25*jalpha)
else
ja=julian
endif
jb=ja+1524
jc=int(6680.+((jb-2439870)-122.1)/365.25)
jd=365*jc+int(0.25*jc)
je=int((jb-jd)/30.6001)
id=jb-jd-int(30.6001*je)
mm=je-1
if(mm.gt.12)mm=mm-12
iyyy=jc-4715
if(mm.gt.2)iyyy=iyyy-1
if(iyyy.le.0)iyyy=iyyy-1
return
END
@@ -0,0 +1,16 @@
SUBROUTINE chder(a,b,c,cder,n)
INTEGER n
REAL a,b,c(n),cder(n)
INTEGER j
REAL con
cder(n)=0.
cder(n-1)=2*(n-1)*c(n)
do 11 j=n-2,1,-1
cder(j)=cder(j+2)+2*j*c(j+1)
11 continue
con=2./(b-a)
do 12 j=1,n
cder(j)=cder(j)*con
12 continue
return
END
@@ -0,0 +1,18 @@
FUNCTION chebev(a,b,c,m,x)
INTEGER m
REAL chebev,a,b,x,c(m)
INTEGER j
REAL d,dd,sv,y,y2
if ((x-a)*(x-b).gt.0.) pause 'x not in range in chebev'
d=0.
dd=0.
y=(2.*x-a-b)/(b-a)
y2=2.*y
do 11 j=m,2,-1
sv=d
d=y2*d-dd+c(j)
dd=sv
11 continue
chebev=y*d-dd+0.5*c(1)
return
END
@@ -0,0 +1,24 @@
SUBROUTINE chebft(a,b,c,n,func)
INTEGER n,NMAX
REAL a,b,c(n),func,PI
EXTERNAL func
PARAMETER (NMAX=50, PI=3.141592653589793d0)
INTEGER j,k
REAL bma,bpa,fac,y,f(NMAX)
DOUBLE PRECISION sum
bma=0.5*(b-a)
bpa=0.5*(b+a)
do 11 k=1,n
y=cos(PI*(k-0.5)/n)
f(k)=func(y*bma+bpa)
11 continue
fac=2./n
do 13 j=1,n
sum=0.d0
do 12 k=1,n
sum=sum+f(k)*cos((PI*(j-1))*((k-0.5d0)/n))
12 continue
c(j)=fac*sum
13 continue
return
END
@@ -0,0 +1,27 @@
SUBROUTINE chebpc(c,d,n)
INTEGER n,NMAX
REAL c(n),d(n)
PARAMETER (NMAX=50)
INTEGER j,k
REAL sv,dd(NMAX)
do 11 j=1,n
d(j)=0.
dd(j)=0.
11 continue
d(1)=c(n)
do 13 j=n-1,2,-1
do 12 k=n-j+1,2,-1
sv=d(k)
d(k)=2.*d(k-1)-dd(k)
dd(k)=sv
12 continue
sv=d(1)
d(1)=-dd(1)+c(j)
dd(1)=sv
13 continue
do 14 j=n,2,-1
d(j)=d(j-1)-dd(j)
14 continue
d(1)=-dd(1)+0.5*c(1)
return
END
@@ -0,0 +1,18 @@
SUBROUTINE chint(a,b,c,cint,n)
INTEGER n
REAL a,b,c(n),cint(n)
INTEGER j
REAL con,fac,sum
con=0.25*(b-a)
sum=0.
fac=1.
do 11 j=2,n-1
cint(j)=con*(c(j-1)-c(j+1))/(j-1)
sum=sum+fac*cint(j)
fac=-fac
11 continue
cint(n)=con*c(n-1)/(n-1)
sum=sum+fac*cint(n)
cint(1)=2.*sum
return
END
@@ -0,0 +1,32 @@
FUNCTION chixy(bang)
REAL chixy,bang,BIG
INTEGER NMAX
PARAMETER (NMAX=1000,BIG=1.E30)
INTEGER nn,j
REAL xx(NMAX),yy(NMAX),sx(NMAX),sy(NMAX),ww(NMAX),aa,offs,avex,
*avey,sumw,b
COMMON /fitxyc/ xx,yy,sx,sy,ww,aa,offs,nn
b=tan(bang)
avex=0.
avey=0.
sumw=0.
do 11 j=1,nn
ww(j)=(b*sx(j))**2+sy(j)**2
if(ww(j).lt.1./BIG) then
ww(j)=BIG
else
ww(j)=1./ww(j)
endif
sumw=sumw+ww(j)
avex=avex+ww(j)*xx(j)
avey=avey+ww(j)*yy(j)
11 continue
avex=avex/sumw
avey=avey/sumw
aa=avey-b*avex
chixy=-offs
do 12 j=1,nn
chixy=chixy+ww(j)*(yy(j)-aa-b*xx(j))**2
12 continue
return
END
@@ -0,0 +1,21 @@
SUBROUTINE choldc(a,n,np,p)
INTEGER n,np
REAL a(np,np),p(n)
INTEGER i,j,k
REAL sum
do 13 i=1,n
do 12 j=i,n
sum=a(i,j)
do 11 k=i-1,1,-1
sum=sum-a(i,k)*a(j,k)
11 continue
if(i.eq.j)then
if(sum.le.0.)pause 'choldc failed'
p(i)=sqrt(sum)
else
a(j,i)=sum/p(i)
endif
12 continue
13 continue
return
END
@@ -0,0 +1,21 @@
SUBROUTINE cholsl(a,n,np,p,b,x)
INTEGER n,np
REAL a(np,np),b(n),p(n),x(n)
INTEGER i,k
REAL sum
do 12 i=1,n
sum=b(i)
do 11 k=i-1,1,-1
sum=sum-a(i,k)*x(k)
11 continue
x(i)=sum/p(i)
12 continue
do 14 i=n,1,-1
sum=x(i)
do 13 k=i+1,n
sum=sum-a(k,i)*x(k)
13 continue
x(i)=sum/p(i)
14 continue
return
END
@@ -0,0 +1,15 @@
SUBROUTINE chsone(bins,ebins,nbins,knstrn,df,chsq,prob)
INTEGER knstrn,nbins
REAL chsq,df,prob,bins(nbins),ebins(nbins)
CU USES gammq
INTEGER j
REAL gammq
df=nbins-knstrn
chsq=0.
do 11 j=1,nbins
if(ebins(j).le.0.)pause 'bad expected number in chsone'
chsq=chsq+(bins(j)-ebins(j))**2/ebins(j)
11 continue
prob=gammq(0.5*df,0.5*chsq)
return
END
@@ -0,0 +1,18 @@
SUBROUTINE chstwo(bins1,bins2,nbins,knstrn,df,chsq,prob)
INTEGER knstrn,nbins
REAL chsq,df,prob,bins1(nbins),bins2(nbins)
CU USES gammq
INTEGER j
REAL gammq
df=nbins-knstrn
chsq=0.
do 11 j=1,nbins
if(bins1(j).eq.0..and.bins2(j).eq.0.)then
df=df-1.
else
chsq=chsq+(bins1(j)-bins2(j))**2/(bins1(j)+bins2(j))
endif
11 continue
prob=gammq(0.5*df,0.5*chsq)
return
END
@@ -0,0 +1,70 @@
SUBROUTINE cisi(x,ci,si)
INTEGER MAXIT
REAL ci,si,x,EPS,EULER,PIBY2,FPMIN,TMIN
PARAMETER (EPS=6.e-8,EULER=.57721566,MAXIT=100,PIBY2=1.5707963,
*FPMIN=1.e-30,TMIN=2.)
INTEGER i,k
REAL a,err,fact,sign,sum,sumc,sums,t,term,absc
COMPLEX h,b,c,d,del
LOGICAL odd
absc(h)=abs(real(h))+abs(aimag(h))
t=abs(x)
if(t.eq.0.)then
si=0.
ci=-1./FPMIN
return
endif
if(t.gt.TMIN)then
b=cmplx(1.,t)
c=1./FPMIN
d=1./b
h=d
do 11 i=2,MAXIT
a=-(i-1)**2
b=b+2.
d=1./(a*d+b)
c=b+a/c
del=c*d
h=h*del
if(absc(del-1.).lt.EPS)goto 1
11 continue
pause 'cf failed in cisi'
1 continue
h=cmplx(cos(t),-sin(t))*h
ci=-real(h)
si=PIBY2+aimag(h)
else
if(t.lt.sqrt(FPMIN))then
sumc=0.
sums=t
else
sum=0.
sums=0.
sumc=0.
sign=1.
fact=1.
odd=.true.
do 12 k=1,MAXIT
fact=fact*t/k
term=fact/k
sum=sum+sign*term
err=term/abs(sum)
if(odd)then
sign=-sign
sums=sum
sum=sumc
else
sumc=sum
sum=sums
endif
if(err.lt.EPS)goto 2
odd=.not.odd
12 continue
pause 'maxits exceeded in cisi'
endif
2 si=sums
ci=sumc+log(t)+EULER
endif
if(x.lt.0.)si=-si
return
END
@@ -0,0 +1,38 @@
SUBROUTINE cntab1(nn,ni,nj,chisq,df,prob,cramrv,ccc)
INTEGER ni,nj,nn(ni,nj),MAXI,MAXJ
REAL ccc,chisq,cramrv,df,prob,TINY
PARAMETER (MAXI=100,MAXJ=100,TINY=1.e-30)
CU USES gammq
INTEGER i,j,nni,nnj
REAL expctd,sum,sumi(MAXI),sumj(MAXJ),gammq
sum=0
nni=ni
nnj=nj
do 12 i=1,ni
sumi(i)=0.
do 11 j=1,nj
sumi(i)=sumi(i)+nn(i,j)
sum=sum+nn(i,j)
11 continue
if(sumi(i).eq.0.)nni=nni-1
12 continue
do 14 j=1,nj
sumj(j)=0.
do 13 i=1,ni
sumj(j)=sumj(j)+nn(i,j)
13 continue
if(sumj(j).eq.0.)nnj=nnj-1
14 continue
df=nni*nnj-nni-nnj+1
chisq=0.
do 16 i=1,ni
do 15 j=1,nj
expctd=sumj(j)*sumi(i)/sum
chisq=chisq+(nn(i,j)-expctd)**2/(expctd+TINY)
15 continue
16 continue
prob=gammq(0.5*df,0.5*chisq)
cramrv=sqrt(chisq/(sum*min(nni-1,nnj-1)))
ccc=sqrt(chisq/(chisq+sum))
return
END
@@ -0,0 +1,50 @@
SUBROUTINE cntab2(nn,ni,nj,h,hx,hy,hygx,hxgy,uygx,uxgy,uxy)
INTEGER ni,nj,nn(ni,nj),MAXI,MAXJ
REAL h,hx,hxgy,hy,hygx,uxgy,uxy,uygx,TINY
PARAMETER (MAXI=100,MAXJ=100,TINY=1.e-30)
INTEGER i,j
REAL p,sum,sumi(MAXI),sumj(MAXJ)
sum=0
do 12 i=1,ni
sumi(i)=0.0
do 11 j=1,nj
sumi(i)=sumi(i)+nn(i,j)
sum=sum+nn(i,j)
11 continue
12 continue
do 14 j=1,nj
sumj(j)=0.
do 13 i=1,ni
sumj(j)=sumj(j)+nn(i,j)
13 continue
14 continue
hx=0.
do 15 i=1,ni
if(sumi(i).ne.0.)then
p=sumi(i)/sum
hx=hx-p*log(p)
endif
15 continue
hy=0.
do 16 j=1,nj
if(sumj(j).ne.0.)then
p=sumj(j)/sum
hy=hy-p*log(p)
endif
16 continue
h=0.
do 18 i=1,ni
do 17 j=1,nj
if(nn(i,j).ne.0)then
p=nn(i,j)/sum
h=h-p*log(p)
endif
17 continue
18 continue
hygx=h-hx
hxgy=h-hy
uygx=(hy-hygx)/(hy+TINY)
uxgy=(hx-hxgy)/(hx+TINY)
uxy=2.*(hx+hy-h)/(hx+hy+TINY)
return
END
@@ -0,0 +1,31 @@
SUBROUTINE convlv(data,n,respns,m,isign,ans)
INTEGER isign,m,n,NMAX
REAL data(n),respns(n)
COMPLEX ans(n)
PARAMETER (NMAX=4096)
CU USES realft,twofft
INTEGER i,no2
COMPLEX fft(NMAX)
do 11 i=1,(m-1)/2
respns(n+1-i)=respns(m+1-i)
11 continue
do 12 i=(m+3)/2,n-(m-1)/2
respns(i)=0.0
12 continue
call twofft(data,respns,fft,ans,n)
no2=n/2
do 13 i=1,no2+1
if (isign.eq.1) then
ans(i)=fft(i)*ans(i)/no2
else if (isign.eq.-1) then
if (abs(ans(i)).eq.0.0) pause
*'deconvolving at response zero in convlv'
ans(i)=fft(i)/ans(i)/no2
else
pause 'no meaning for isign in convlv'
endif
13 continue
ans(1)=cmplx(real(ans(1)),real(ans(no2+1)))
call realft(ans,n,-1)
return
END
@@ -0,0 +1,11 @@
SUBROUTINE copy(aout,ain,n)
INTEGER n
DOUBLE PRECISION ain(n,n),aout(n,n)
INTEGER i,j
do 12 i=1,n
do 11 j=1,n
aout(j,i)=ain(j,i)
11 continue
12 continue
return
END
@@ -0,0 +1,17 @@
SUBROUTINE correl(data1,data2,n,ans)
INTEGER n,NMAX
REAL data1(n),data2(n)
COMPLEX ans(n)
PARAMETER (NMAX=4096)
CU USES realft,twofft
INTEGER i,no2
COMPLEX fft(NMAX)
call twofft(data1,data2,fft,ans,n)
no2=n/2
do 11 i=1,no2+1
ans(i)=fft(i)*conjg(ans(i))/float(no2)
11 continue
ans(1)=cmplx(real(ans(1)),real(ans(no2+1)))
call realft(ans,n,-1)
return
END
@@ -0,0 +1,33 @@
SUBROUTINE cosft1(y,n)
INTEGER n
REAL y(n+1)
CU USES realft
INTEGER j
REAL sum,y1,y2
DOUBLE PRECISION theta,wi,wpi,wpr,wr,wtemp
theta=3.141592653589793d0/n
wr=1.0d0
wi=0.0d0
wpr=-2.0d0*sin(0.5d0*theta)**2
wpi=sin(theta)
sum=0.5*(y(1)-y(n+1))
y(1)=0.5*(y(1)+y(n+1))
do 11 j=1,n/2-1
wtemp=wr
wr=wr*wpr-wi*wpi+wr
wi=wi*wpr+wtemp*wpi+wi
y1=0.5*(y(j+1)+y(n-j+1))
y2=(y(j+1)-y(n-j+1))
y(j+1)=y1-wi*y2
y(n-j+1)=y1+wi*y2
sum=sum+wr*y2
11 continue
call realft(y,n,+1)
y(n+1)=y(2)
y(2)=sum
do 12 j=4,n,2
sum=sum+y(j)
y(j)=sum
12 continue
return
END
@@ -0,0 +1,69 @@
SUBROUTINE cosft2(y,n,isign)
INTEGER isign,n
REAL y(n)
CU USES realft
INTEGER i
REAL sum,sum1,y1,y2,ytemp
DOUBLE PRECISION theta,wi,wi1,wpi,wpr,wr,wr1,wtemp,PI
PARAMETER (PI=3.141592653589793d0)
theta=0.5d0*PI/n
wr=1.0d0
wi=0.0d0
wr1=cos(theta)
wi1=sin(theta)
wpr=-2.0d0*wi1**2
wpi=sin(2.d0*theta)
if(isign.eq.1)then
do 11 i=1,n/2
y1=0.5*(y(i)+y(n-i+1))
y2=wi1*(y(i)-y(n-i+1))
y(i)=y1+y2
y(n-i+1)=y1-y2
wtemp=wr1
wr1=wr1*wpr-wi1*wpi+wr1
wi1=wi1*wpr+wtemp*wpi+wi1
11 continue
call realft(y,n,1)
do 12 i=3,n,2
wtemp=wr
wr=wr*wpr-wi*wpi+wr
wi=wi*wpr+wtemp*wpi+wi
y1=y(i)*wr-y(i+1)*wi
y2=y(i+1)*wr+y(i)*wi
y(i)=y1
y(i+1)=y2
12 continue
sum=0.5*y(2)
do 13 i=n,2,-2
sum1=sum
sum=sum+y(i)
y(i)=sum1
13 continue
else if(isign.eq.-1)then
ytemp=y(n)
do 14 i=n,4,-2
y(i)=y(i-2)-y(i)
14 continue
y(2)=2.0*ytemp
do 15 i=3,n,2
wtemp=wr
wr=wr*wpr-wi*wpi+wr
wi=wi*wpr+wtemp*wpi+wi
y1=y(i)*wr+y(i+1)*wi
y2=y(i+1)*wr-y(i)*wi
y(i)=y1
y(i+1)=y2
15 continue
call realft(y,n,-1)
do 16 i=1,n/2
y1=y(i)+y(n-i+1)
y2=(0.5/wi1)*(y(i)-y(n-i+1))
y(i)=0.5*(y1+y2)
y(n-i+1)=0.5*(y1-y2)
wtemp=wr1
wr1=wr1*wpr-wi1*wpi+wr1
wi1=wi1*wpr+wtemp*wpi+wi1
16 continue
endif
return
END
@@ -0,0 +1,29 @@
SUBROUTINE covsrt(covar,npc,ma,ia,mfit)
INTEGER ma,mfit,npc,ia(ma)
REAL covar(npc,npc)
INTEGER i,j,k
REAL swap
do 12 i=mfit+1,ma
do 11 j=1,i
covar(i,j)=0.
covar(j,i)=0.
11 continue
12 continue
k=mfit
do 15 j=ma,1,-1
if(ia(j).ne.0)then
do 13 i=1,ma
swap=covar(i,k)
covar(i,k)=covar(i,j)
covar(i,j)=swap
13 continue
do 14 i=1,ma
swap=covar(k,i)
covar(k,i)=covar(j,i)
covar(j,i)=swap
14 continue
k=k-1
endif
15 continue
return
END
@@ -0,0 +1,29 @@
SUBROUTINE crank(n,w,s)
INTEGER n
REAL s,w(n)
INTEGER j,ji,jt
REAL rank,t
s=0.
j=1
1 if(j.lt.n)then
if(w(j+1).ne.w(j))then
w(j)=j
j=j+1
else
do 11 jt=j+1,n
if(w(jt).ne.w(j))goto 2
11 continue
jt=n+1
2 rank=0.5*(j+jt-1)
do 12 ji=j,jt-1
w(ji)=rank
12 continue
t=jt-j
s=s+t**3-t
j=jt
endif
goto 1
endif
if(j.eq.n)w(n)=n
return
END
@@ -0,0 +1,28 @@
SUBROUTINE cyclic(a,b,c,alpha,beta,r,x,n)
INTEGER n,NMAX
REAL alpha,beta,a(n),b(n),c(n),r(n),x(n)
PARAMETER (NMAX=500)
CU USES tridag
INTEGER i
REAL fact,gamma,bb(NMAX),u(NMAX),z(NMAX)
if(n.le.2)pause 'n too small in cyclic'
if(n.gt.NMAX)pause 'NMAX too small in cyclic'
gamma=-b(1)
bb(1)=b(1)-gamma
bb(n)=b(n)-alpha*beta/gamma
do 11 i=2,n-1
bb(i)=b(i)
11 continue
call tridag(a,bb,c,r,x,n)
u(1)=gamma
u(n)=alpha
do 12 i=2,n-1
u(i)=0.
12 continue
call tridag(a,bb,c,u,z,n)
fact=(x(1)+beta*x(n)/gamma)/(1.+z(1)+beta*z(n)/gamma)
do 13 i=1,n
x(i)=x(i)-fact*z(i)
13 continue
return
END
@@ -0,0 +1,35 @@
SUBROUTINE daub4(a,n,isign)
INTEGER n,isign,NMAX
REAL a(n),C3,C2,C1,C0
PARAMETER (C0=0.4829629131445341,C1=0.8365163037378079,
*C2=0.2241438680420134,C3=-0.1294095225512604,NMAX=1024)
REAL wksp(NMAX)
INTEGER nh,nh1,i,j
if(n.lt.4)return
if(n.gt.NMAX) pause 'wksp too small in daub4'
nh=n/2
nh1=nh+1
if (isign.ge.0) then
i=1
do 11 j=1,n-3,2
wksp(i)=C0*a(j)+C1*a(j+1)+C2*a(j+2)+C3*a(j+3)
wksp(i+nh)=C3*a(j)-C2*a(j+1)+C1*a(j+2)-C0*a(j+3)
i=i+1
11 continue
wksp(i)=C0*a(n-1)+C1*a(n)+C2*a(1)+C3*a(2)
wksp(i+nh)=C3*a(n-1)-C2*a(n)+C1*a(1)-C0*a(2)
else
wksp(1)=C2*a(nh)+C1*a(n)+C0*a(1)+C3*a(nh1)
wksp(2)=C3*a(nh)-C0*a(n)+C1*a(1)-C2*a(nh1)
j=3
do 12 i=1,nh-1
wksp(j)=C2*a(i)+C1*a(i+nh)+C0*a(i+1)+C3*a(i+nh1)
wksp(j+1)=C3*a(i)-C0*a(i+nh)+C1*a(i+1)-C2*a(i+nh1)
j=j+2
12 continue
endif
do 13 i=1,n
a(i)=wksp(i)
13 continue
return
END
@@ -0,0 +1,36 @@
FUNCTION dawson(x)
INTEGER NMAX
REAL dawson,x,H,A1,A2,A3
PARAMETER (NMAX=6,H=0.4,A1=2./3.,A2=0.4,A3=2./7.)
INTEGER i,init,n0
REAL d1,d2,e1,e2,sum,x2,xp,xx,c(NMAX)
SAVE init,c
DATA init/0/
if(init.eq.0)then
init=1
do 11 i=1,NMAX
c(i)=exp(-((2.*float(i)-1.)*H)**2)
11 continue
endif
if(abs(x).lt.0.2)then
x2=x**2
dawson=x*(1.-A1*x2*(1.-A2*x2*(1.-A3*x2)))
else
xx=abs(x)
n0=2*nint(0.5*xx/H)
xp=xx-float(n0)*H
e1=exp(2.*xp*H)
e2=e1**2
d1=float(n0+1)
d2=d1-2.
sum=0.
do 12 i=1,NMAX
sum=sum+c(i)*(e1/d1+1./(d2*e1))
d1=d1+2.
d2=d2-2.
e1=e2*e1
12 continue
dawson=0.5641895835*sign(exp(-xp**2),x)*sum
endif
return
END
@@ -0,0 +1,110 @@
FUNCTION dbrent(ax,bx,cx,f,df,tol,xmin)
INTEGER ITMAX
REAL dbrent,ax,bx,cx,tol,xmin,df,f,ZEPS
EXTERNAL df,f
PARAMETER (ITMAX=100,ZEPS=1.0e-10)
INTEGER iter
REAL a,b,d,d1,d2,du,dv,dw,dx,e,fu,fv,fw,fx,olde,tol1,tol2,u,u1,u2,
*v,w,x,xm
LOGICAL ok1,ok2
a=min(ax,cx)
b=max(ax,cx)
v=bx
w=v
x=v
e=0.
fx=f(x)
fv=fx
fw=fx
dx=df(x)
dv=dx
dw=dx
do 11 iter=1,ITMAX
xm=0.5*(a+b)
tol1=tol*abs(x)+ZEPS
tol2=2.*tol1
if(abs(x-xm).le.(tol2-.5*(b-a))) goto 3
if(abs(e).gt.tol1) then
d1=2.*(b-a)
d2=d1
if(dw.ne.dx) d1=(w-x)*dx/(dx-dw)
if(dv.ne.dx) d2=(v-x)*dx/(dx-dv)
u1=x+d1
u2=x+d2
ok1=((a-u1)*(u1-b).gt.0.).and.(dx*d1.le.0.)
ok2=((a-u2)*(u2-b).gt.0.).and.(dx*d2.le.0.)
olde=e
e=d
if(.not.(ok1.or.ok2))then
goto 1
else if (ok1.and.ok2)then
if(abs(d1).lt.abs(d2))then
d=d1
else
d=d2
endif
else if (ok1)then
d=d1
else
d=d2
endif
if(abs(d).gt.abs(0.5*olde))goto 1
u=x+d
if(u-a.lt.tol2 .or. b-u.lt.tol2) d=sign(tol1,xm-x)
goto 2
endif
1 if(dx.ge.0.) then
e=a-x
else
e=b-x
endif
d=0.5*e
2 if(abs(d).ge.tol1) then
u=x+d
fu=f(u)
else
u=x+sign(tol1,d)
fu=f(u)
if(fu.gt.fx)goto 3
endif
du=df(u)
if(fu.le.fx) then
if(u.ge.x) then
a=x
else
b=x
endif
v=w
fv=fw
dv=dw
w=x
fw=fx
dw=dx
x=u
fx=fu
dx=du
else
if(u.lt.x) then
a=u
else
b=u
endif
if(fu.le.fw .or. w.eq.x) then
v=w
fv=fw
dv=dw
w=u
fw=fu
dw=du
else if(fu.le.fv .or. v.eq.x .or. v.eq.w) then
v=u
fv=fu
dv=du
endif
endif
11 continue
pause 'dbrent exceeded maximum iterations'
3 xmin=x
dbrent=fx
return
END
@@ -0,0 +1,23 @@
SUBROUTINE ddpoly(c,nc,x,pd,nd)
INTEGER nc,nd
REAL x,c(nc),pd(nd)
INTEGER i,j,nnd
REAL const
pd(1)=c(nc)
do 11 j=2,nd
pd(j)=0.
11 continue
do 13 i=nc-1,1,-1
nnd=min(nd,nc+1-i)
do 12 j=nnd,2,-1
pd(j)=pd(j)*x+pd(j-1)
12 continue
pd(1)=pd(1)*x+c(i)
13 continue
const=2.
do 14 i=3,nd
pd(i)=const*pd(i)
const=const*i
14 continue
return
END
@@ -0,0 +1,27 @@
LOGICAL FUNCTION decchk(string,n,ch)
INTEGER n
CHARACTER string*(*),ch*1
INTEGER ij(10,10),ip(10,8),i,j,k,m
SAVE ij,ip
DATA ip/0,1,2,3,4,5,6,7,8,9,1,5,7,6,2,8,3,0,9,4,5,8,0,3,7,9,6,1,4,
*2,8,9,1,6,0,4,3,5,2,7,9,4,5,3,1,2,6,8,7,0,4,2,8,6,5,7,3,9,0,1,2,7,
*9,3,8,0,6,4,1,5,7,0,4,6,9,1,3,2,5,8/,ij/0,1,2,3,4,5,6,7,8,9,1,2,3,
*4,0,9,5,6,7,8,2,3,4,0,1,8,9,5,6,7,3,4,0,1,2,7,8,9,5,6,4,0,1,2,3,6,
*7,8,9,5,5,6,7,8,9,0,1,2,3,4,6,7,8,9,5,4,0,1,2,3,7,8,9,5,6,3,4,0,1,
*2,8,9,5,6,7,2,3,4,0,1,9,5,6,7,8,1,2,3,4,0/
k=0
m=0
do 11 j=1,n
i=ichar(string(j:j))
if (i.ge.48.and.i.le.57)then
k=ij(k+1,ip(mod(i+2,10)+1,mod(m,8)+1)+1)
m=m+1
endif
11 continue
decchk=(k.eq.0)
do 12 i=0,9
if (ij(k+1,ip(i+1,mod(m,8)+1)+1).eq.0) goto 1
12 continue
1 ch=char(i+48)
return
end
@@ -0,0 +1,18 @@
FUNCTION df1dim(x)
INTEGER NMAX
REAL df1dim,x
PARAMETER (NMAX=50)
CU USES dfunc
INTEGER j,ncom
REAL df(NMAX),pcom(NMAX),xicom(NMAX),xt(NMAX)
COMMON /f1com/ pcom,xicom,ncom
do 11 j=1,ncom
xt(j)=pcom(j)+x*xicom(j)
11 continue
call dfunc(xt,df)
df1dim=0.
do 12 j=1,ncom
df1dim=df1dim+df(j)*xicom(j)
12 continue
return
END
@@ -0,0 +1,52 @@
SUBROUTINE dfour1(data,nn,isign)
INTEGER isign,nn
DOUBLE PRECISION data(2*nn)
INTEGER i,istep,j,m,mmax,n
DOUBLE PRECISION tempi,tempr
DOUBLE PRECISION theta,wi,wpi,wpr,wr,wtemp
n=2*nn
j=1
do 11 i=1,n,2
if(j.gt.i)then
tempr=data(j)
tempi=data(j+1)
data(j)=data(i)
data(j+1)=data(i+1)
data(i)=tempr
data(i+1)=tempi
endif
m=n/2
1 if ((m.ge.2).and.(j.gt.m)) then
j=j-m
m=m/2
goto 1
endif
j=j+m
11 continue
mmax=2
2 if (n.gt.mmax) then
istep=2*mmax
theta=6.28318530717959d0/(isign*mmax)
wpr=-2.d0*sin(0.5d0*theta)**2
wpi=sin(theta)
wr=1.d0
wi=0.d0
do 13 m=1,mmax,2
do 12 i=m,n,istep
j=i+mmax
tempr=wr*data(j)-wi*data(j+1)
tempi=wr*data(j+1)+wi*data(j)
data(j)=data(i)-tempr
data(j+1)=data(i+1)-tempi
data(i)=data(i)+tempr
data(i+1)=data(i+1)+tempi
12 continue
wtemp=wr
wr=wr*wpr-wi*wpi+wr
wi=wi*wpr+wtemp*wpi+wi
13 continue
mmax=istep
goto 2
endif
return
END
@@ -0,0 +1,89 @@
SUBROUTINE dfpmin(p,n,gtol,iter,fret,func,dfunc)
INTEGER iter,n,NMAX,ITMAX
REAL fret,gtol,p(n),func,EPS,STPMX,TOLX
PARAMETER (NMAX=50,ITMAX=200,STPMX=100.,EPS=3.e-8,TOLX=4.*EPS)
EXTERNAL dfunc,func
CU USES dfunc,func,lnsrch
INTEGER i,its,j
LOGICAL check
REAL den,fac,fad,fae,fp,stpmax,sum,sumdg,sumxi,temp,test,dg(NMAX),
*g(NMAX),hdg(NMAX),hessin(NMAX,NMAX),pnew(NMAX),xi(NMAX)
fp=func(p)
call dfunc(p,g)
sum=0.
do 12 i=1,n
do 11 j=1,n
hessin(i,j)=0.
11 continue
hessin(i,i)=1.
xi(i)=-g(i)
sum=sum+p(i)**2
12 continue
stpmax=STPMX*max(sqrt(sum),float(n))
do 27 its=1,ITMAX
iter=its
call lnsrch(n,p,fp,g,xi,pnew,fret,stpmax,check,func)
fp=fret
do 13 i=1,n
xi(i)=pnew(i)-p(i)
p(i)=pnew(i)
13 continue
test=0.
do 14 i=1,n
temp=abs(xi(i))/max(abs(p(i)),1.)
if(temp.gt.test)test=temp
14 continue
if(test.lt.TOLX)return
do 15 i=1,n
dg(i)=g(i)
15 continue
call dfunc(p,g)
test=0.
den=max(fret,1.)
do 16 i=1,n
temp=abs(g(i))*max(abs(p(i)),1.)/den
if(temp.gt.test)test=temp
16 continue
if(test.lt.gtol)return
do 17 i=1,n
dg(i)=g(i)-dg(i)
17 continue
do 19 i=1,n
hdg(i)=0.
do 18 j=1,n
hdg(i)=hdg(i)+hessin(i,j)*dg(j)
18 continue
19 continue
fac=0.
fae=0.
sumdg=0.
sumxi=0.
do 21 i=1,n
fac=fac+dg(i)*xi(i)
fae=fae+dg(i)*hdg(i)
sumdg=sumdg+dg(i)**2
sumxi=sumxi+xi(i)**2
21 continue
if(fac**2.gt.EPS*sumdg*sumxi)then
fac=1./fac
fad=1./fae
do 22 i=1,n
dg(i)=fac*xi(i)-fad*hdg(i)
22 continue
do 24 i=1,n
do 23 j=1,n
hessin(i,j)=hessin(i,j)+fac*xi(i)*xi(j)-fad*hdg(i)*hdg(j)+
*fae*dg(i)*dg(j)
23 continue
24 continue
endif
do 26 i=1,n
xi(i)=0.
do 25 j=1,n
xi(i)=xi(i)-hessin(i,j)*g(j)
25 continue
26 continue
27 continue
pause 'too many iterations in dfpmin'
return
END
@@ -0,0 +1,29 @@
FUNCTION dfridr(func,x,h,err)
INTEGER NTAB
REAL dfridr,err,h,x,func,CON,CON2,BIG,SAFE
PARAMETER (CON=1.4,CON2=CON*CON,BIG=1.E30,NTAB=10,SAFE=2.)
EXTERNAL func
CU USES func
INTEGER i,j
REAL errt,fac,hh,a(NTAB,NTAB)
if(h.eq.0.) pause 'h must be nonzero in dfridr'
hh=h
a(1,1)=(func(x+hh)-func(x-hh))/(2.0*hh)
err=BIG
do 12 i=2,NTAB
hh=hh/CON
a(1,i)=(func(x+hh)-func(x-hh))/(2.0*hh)
fac=CON2
do 11 j=2,i
a(j,i)=(a(j-1,i)*fac-a(j-1,i-1))/(fac-1.)
fac=CON2*fac
errt=max(abs(a(j,i)-a(j-1,i)),abs(a(j,i)-a(j-1,i-1)))
if (errt.le.err) then
err=errt
dfridr=a(j,i)
endif
11 continue
if(abs(a(i,i)-a(i-1,i-1)).ge.SAFE*err)return
12 continue
return
END
@@ -0,0 +1,55 @@
SUBROUTINE dftcor(w,delta,a,b,endpts,corre,corim,corfac)
REAL a,b,corfac,corim,corre,delta,w,endpts(8)
REAL a0i,a0r,a1i,a1r,a2i,a2r,a3i,a3r,arg,c,cl,cr,s,sl,sr,t,t2,t4,
*t6
DOUBLE PRECISION cth,ctth,spth2,sth,sth4i,stth,th,th2,th4,tmth2,
*tth4i
th=w*delta
if (a.ge.b.or.th.lt.0.d0.or.th.gt.3.1416d0)pause
*'bad arguments to dftcor'
if(abs(th).lt.5.d-2)then
t=th
t2=t*t
t4=t2*t2
t6=t4*t2
corfac=1.-(11./720.)*t4+(23./15120.)*t6
a0r=(-2./3.)+t2/45.+(103./15120.)*t4-(169./226800.)*t6
a1r=(7./24.)-(7./180.)*t2+(5./3456.)*t4-(7./259200.)*t6
a2r=(-1./6.)+t2/45.-(5./6048.)*t4+t6/64800.
a3r=(1./24.)-t2/180.+(5./24192.)*t4-t6/259200.
a0i=t*(2./45.+(2./105.)*t2-(8./2835.)*t4+(86./467775.)*t6)
a1i=t*(7./72.-t2/168.+(11./72576.)*t4-(13./5987520.)*t6)
a2i=t*(-7./90.+t2/210.-(11./90720.)*t4+(13./7484400.)*t6)
a3i=t*(7./360.-t2/840.+(11./362880.)*t4-(13./29937600.)*t6)
else
cth=cos(th)
sth=sin(th)
ctth=cth**2-sth**2
stth=2.d0*sth*cth
th2=th*th
th4=th2*th2
tmth2=3.d0-th2
spth2=6.d0+th2
sth4i=1./(6.d0*th4)
tth4i=2.d0*sth4i
corfac=tth4i*spth2*(3.d0-4.d0*cth+ctth)
a0r=sth4i*(-42.d0+5.d0*th2+spth2*(8.d0*cth-ctth))
a0i=sth4i*(th*(-12.d0+6.d0*th2)+spth2*stth)
a1r=sth4i*(14.d0*tmth2-7.d0*spth2*cth)
a1i=sth4i*(30.d0*th-5.d0*spth2*sth)
a2r=tth4i*(-4.d0*tmth2+2.d0*spth2*cth)
a2i=tth4i*(-12.d0*th+2.d0*spth2*sth)
a3r=sth4i*(2.d0*tmth2-spth2*cth)
a3i=sth4i*(6.d0*th-spth2*sth)
endif
cl=a0r*endpts(1)+a1r*endpts(2)+a2r*endpts(3)+a3r*endpts(4)
sl=a0i*endpts(1)+a1i*endpts(2)+a2i*endpts(3)+a3i*endpts(4)
cr=a0r*endpts(8)+a1r*endpts(7)+a2r*endpts(6)+a3r*endpts(5)
sr=-a0i*endpts(8)-a1i*endpts(7)-a2i*endpts(6)-a3i*endpts(5)
arg=w*(b-a)
c=cos(arg)
s=sin(arg)
corre=cl+c*cr-s*sr
corim=sl+s*cr+c*sr
return
END
@@ -0,0 +1,48 @@
SUBROUTINE dftint(func,a,b,w,cosint,sinint)
INTEGER M,NDFT,MPOL
REAL a,b,cosint,sinint,w,func,TWOPI
PARAMETER (M=64,NDFT=1024,MPOL=6,TWOPI=2.*3.14159265)
EXTERNAL func
CU USES dftcor,func,polint,realft
INTEGER init,j,nn
REAL aold,bold,c,cdft,cerr,corfac,corim,corre,delta,en,s,sdft,
*serr,cpol(MPOL),data(NDFT),endpts(8),spol(MPOL),xpol(MPOL)
SAVE init,aold,bold,delta,data,endpts
DATA init/0/,aold/-1.e30/,bold/-1.e30/
if (init.ne.1.or.a.ne.aold.or.b.ne.bold) then
init=1
aold=a
bold=b
delta=(b-a)/M
do 11 j=1,M+1
data(j)=func(a+(j-1)*delta)
11 continue
do 12 j=M+2,NDFT
data(j)=0.
12 continue
do 13 j=1,4
endpts(j)=data(j)
endpts(j+4)=data(M-3+j)
13 continue
call realft(data,NDFT,1)
data(2)=0.
endif
en=w*delta*NDFT/TWOPI+1.
nn=min(max(int(en-0.5*MPOL+1.),1),NDFT/2-MPOL+1)
do 14 j=1,MPOL
cpol(j)=data(2*nn-1)
spol(j)=data(2*nn)
xpol(j)=nn
nn=nn+1
14 continue
call polint(xpol,cpol,MPOL,en,cdft,cerr)
call polint(xpol,spol,MPOL,en,sdft,serr)
call dftcor(w,delta,a,b,endpts,corre,corim,corfac)
cdft=cdft*corfac+corre
sdft=sdft*corfac+corim
c=delta*cos(w*a)
s=delta*sin(w*a)
cosint=c*cdft-s*sdft
sinint=s*cdft+c*sdft
return
END
@@ -0,0 +1,57 @@
SUBROUTINE difeq(k,k1,k2,jsf,is1,isf,indexv,ne,s,nsi,nsj,y,nyj,
*nyk)
INTEGER is1,isf,jsf,k,k1,k2,ne,nsi,nsj,nyj,nyk,indexv(nyj),M
REAL s(nsi,nsj),y(nyj,nyk)
COMMON /sfrcom/ x,h,mm,n,c2,anorm
PARAMETER (M=41)
INTEGER mm,n
REAL anorm,c2,h,temp,temp2,x(M)
if(k.eq.k1) then
if(mod(n+mm,2).eq.1)then
s(3,3+indexv(1))=1.
s(3,3+indexv(2))=0.
s(3,3+indexv(3))=0.
s(3,jsf)=y(1,1)
else
s(3,3+indexv(1))=0.
s(3,3+indexv(2))=1.
s(3,3+indexv(3))=0.
s(3,jsf)=y(2,1)
endif
else if(k.gt.k2) then
s(1,3+indexv(1))=-(y(3,M)-c2)/(2.*(mm+1.))
s(1,3+indexv(2))=1.
s(1,3+indexv(3))=-y(1,M)/(2.*(mm+1.))
s(1,jsf)=y(2,M)-(y(3,M)-c2)*y(1,M)/(2.*(mm+1.))
s(2,3+indexv(1))=1.
s(2,3+indexv(2))=0.
s(2,3+indexv(3))=0.
s(2,jsf)=y(1,M)-anorm
else
s(1,indexv(1))=-1.
s(1,indexv(2))=-.5*h
s(1,indexv(3))=0.
s(1,3+indexv(1))=1.
s(1,3+indexv(2))=-.5*h
s(1,3+indexv(3))=0.
temp=h/(1.-(x(k)+x(k-1))**2*.25)
temp2=.5*(y(3,k)+y(3,k-1))-c2*.25*(x(k)+x(k-1))**2
s(2,indexv(1))=temp*temp2*.5
s(2,indexv(2))=-1.-.5*temp*(mm+1.)*(x(k)+x(k-1))
s(2,indexv(3))=.25*temp*(y(1,k)+y(1,k-1))
s(2,3+indexv(1))=s(2,indexv(1))
s(2,3+indexv(2))=2.+s(2,indexv(2))
s(2,3+indexv(3))=s(2,indexv(3))
s(3,indexv(1))=0.
s(3,indexv(2))=0.
s(3,indexv(3))=-1.
s(3,3+indexv(1))=0.
s(3,3+indexv(2))=0.
s(3,3+indexv(3))=1.
s(1,jsf)=y(1,k)-y(1,k-1)-.5*h*(y(2,k)+y(2,k-1))
s(2,jsf)=y(2,k)-y(2,k-1)-temp*((x(k)+x(k-1))*.5*(mm+1.)*(y(2,k)+
*y(2,k-1))-temp2*.5*(y(1,k)+y(1,k-1)))
s(3,jsf)=y(3,k)-y(3,k-1)
endif
return
END
@@ -0,0 +1,16 @@
FUNCTION dpythag(a,b)
DOUBLE PRECISION a,b,dpythag
DOUBLE PRECISION absa,absb
absa=abs(a)
absb=abs(b)
if(absa.gt.absb)then
dpythag=absa*sqrt(1.0d0+(absb/absa)**2)
else
if(absb.eq.0.0d0)then
dpythag=0.0d0
else
dpythag=absb*sqrt(1.0d0+(absa/absb)**2)
endif
endif
return
END
@@ -0,0 +1,52 @@
SUBROUTINE drealft(data,n,isign)
INTEGER isign,n
DOUBLE PRECISION data(n)
CU USES dfour1
INTEGER i,i1,i2,i3,i4,n2p3
DOUBLE PRECISION c1,c2,h1i,h1r,h2i,h2r,wis,wrs
DOUBLE PRECISION theta,wi,wpi,wpr,wr,wtemp
theta=3.141592653589793d0/dble(n/2)
c1=0.5d0
if (isign.eq.1) then
c2=-0.5d0
call dfour1(data,n/2,+1)
else
c2=0.5d0
theta=-theta
endif
wpr=-2.0d0*sin(0.5d0*theta)**2
wpi=sin(theta)
wr=1.0d0+wpr
wi=wpi
n2p3=n+3
do 11 i=2,n/4
i1=2*i-1
i2=i1+1
i3=n2p3-i2
i4=i3+1
wrs=wr
wis=wi
h1r=c1*(data(i1)+data(i3))
h1i=c1*(data(i2)-data(i4))
h2r=-c2*(data(i2)+data(i4))
h2i=c2*(data(i1)-data(i3))
data(i1)=h1r+wrs*h2r-wis*h2i
data(i2)=h1i+wrs*h2i+wis*h2r
data(i3)=h1r-wrs*h2r+wis*h2i
data(i4)=-h1i+wrs*h2i+wis*h2r
wtemp=wr
wr=wr*wpr-wi*wpi+wr
wi=wi*wpr+wtemp*wpi+wi
11 continue
if (isign.eq.1) then
h1r=data(1)
data(1)=h1r+data(2)
data(2)=h1r-data(2)
else
h1r=data(1)
data(1)=c1*(h1r+data(2))
data(2)=c1*(h1r-data(2))
call dfour1(data,n/2,-1)
endif
return
END
@@ -0,0 +1,13 @@
SUBROUTINE dsprsax(sa,ija,x,b,n)
INTEGER n,ija(*)
DOUBLE PRECISION b(n),sa(*),x(n)
INTEGER i,k
if (ija(1).ne.n+2) pause 'mismatched vector and matrix in sprsax'
do 12 i=1,n
b(i)=sa(i)*x(i)
do 11 k=ija(i),ija(i+1)-1
b(i)=b(i)+sa(k)*x(ija(k))
11 continue
12 continue
return
END
@@ -0,0 +1,16 @@
SUBROUTINE dsprstx(sa,ija,x,b,n)
INTEGER n,ija(*)
DOUBLE PRECISION b(n),sa(*),x(n)
INTEGER i,j,k
if (ija(1).ne.n+2) pause 'mismatched vector and matrix in sprstx'
do 11 i=1,n
b(i)=sa(i)*x(i)
11 continue
do 13 i=1,n
do 12 k=ija(i),ija(i+1)-1
j=ija(k)
b(j)=b(j)+sa(k)*x(i)
12 continue
13 continue
return
END
@@ -0,0 +1,25 @@
SUBROUTINE dsvbksb(u,w,v,m,n,mp,np,b,x)
INTEGER m,mp,n,np,NMAX
DOUBLE PRECISION b(mp),u(mp,np),v(np,np),w(np),x(np)
PARAMETER (NMAX=500)
INTEGER i,j,jj
DOUBLE PRECISION s,tmp(NMAX)
do 12 j=1,n
s=0.0d0
if(w(j).ne.0.0d0)then
do 11 i=1,m
s=s+u(i,j)*b(i)
11 continue
s=s/w(j)
endif
tmp(j)=s
12 continue
do 14 j=1,n
s=0.0d0
do 13 jj=1,n
s=s+v(j,jj)*tmp(jj)
13 continue
x(j)=s
14 continue
return
END
@@ -0,0 +1,224 @@
SUBROUTINE dsvdcmp(a,m,n,mp,np,w,v)
INTEGER m,mp,n,np,NMAX
DOUBLE PRECISION a(mp,np),v(np,np),w(np)
PARAMETER (NMAX=500)
CU USES dpythag
INTEGER i,its,j,jj,k,l,nm
DOUBLE PRECISION anorm,c,f,g,h,s,scale,x,y,z,rv1(NMAX),dpythag
g=0.0d0
scale=0.0d0
anorm=0.0d0
do 25 i=1,n
l=i+1
rv1(i)=scale*g
g=0.0d0
s=0.0d0
scale=0.0d0
if(i.le.m)then
do 11 k=i,m
scale=scale+abs(a(k,i))
11 continue
if(scale.ne.0.0d0)then
do 12 k=i,m
a(k,i)=a(k,i)/scale
s=s+a(k,i)*a(k,i)
12 continue
f=a(i,i)
g=-sign(sqrt(s),f)
h=f*g-s
a(i,i)=f-g
do 15 j=l,n
s=0.0d0
do 13 k=i,m
s=s+a(k,i)*a(k,j)
13 continue
f=s/h
do 14 k=i,m
a(k,j)=a(k,j)+f*a(k,i)
14 continue
15 continue
do 16 k=i,m
a(k,i)=scale*a(k,i)
16 continue
endif
endif
w(i)=scale *g
g=0.0d0
s=0.0d0
scale=0.0d0
if((i.le.m).and.(i.ne.n))then
do 17 k=l,n
scale=scale+abs(a(i,k))
17 continue
if(scale.ne.0.0d0)then
do 18 k=l,n
a(i,k)=a(i,k)/scale
s=s+a(i,k)*a(i,k)
18 continue
f=a(i,l)
g=-sign(sqrt(s),f)
h=f*g-s
a(i,l)=f-g
do 19 k=l,n
rv1(k)=a(i,k)/h
19 continue
do 23 j=l,m
s=0.0d0
do 21 k=l,n
s=s+a(j,k)*a(i,k)
21 continue
do 22 k=l,n
a(j,k)=a(j,k)+s*rv1(k)
22 continue
23 continue
do 24 k=l,n
a(i,k)=scale*a(i,k)
24 continue
endif
endif
anorm=max(anorm,(abs(w(i))+abs(rv1(i))))
25 continue
do 32 i=n,1,-1
if(i.lt.n)then
if(g.ne.0.0d0)then
do 26 j=l,n
v(j,i)=(a(i,j)/a(i,l))/g
26 continue
do 29 j=l,n
s=0.0d0
do 27 k=l,n
s=s+a(i,k)*v(k,j)
27 continue
do 28 k=l,n
v(k,j)=v(k,j)+s*v(k,i)
28 continue
29 continue
endif
do 31 j=l,n
v(i,j)=0.0d0
v(j,i)=0.0d0
31 continue
endif
v(i,i)=1.0d0
g=rv1(i)
l=i
32 continue
do 39 i=min(m,n),1,-1
l=i+1
g=w(i)
do 33 j=l,n
a(i,j)=0.0d0
33 continue
if(g.ne.0.0d0)then
g=1.0d0/g
do 36 j=l,n
s=0.0d0
do 34 k=l,m
s=s+a(k,i)*a(k,j)
34 continue
f=(s/a(i,i))*g
do 35 k=i,m
a(k,j)=a(k,j)+f*a(k,i)
35 continue
36 continue
do 37 j=i,m
a(j,i)=a(j,i)*g
37 continue
else
do 38 j= i,m
a(j,i)=0.0d0
38 continue
endif
a(i,i)=a(i,i)+1.0d0
39 continue
do 49 k=n,1,-1
do 48 its=1,30
do 41 l=k,1,-1
nm=l-1
if((abs(rv1(l))+anorm).eq.anorm) goto 2
if((abs(w(nm))+anorm).eq.anorm) goto 1
41 continue
1 c=0.0d0
s=1.0d0
do 43 i=l,k
f=s*rv1(i)
rv1(i)=c*rv1(i)
if((abs(f)+anorm).eq.anorm) goto 2
g=w(i)
h=dpythag(f,g)
w(i)=h
h=1.0d0/h
c= (g*h)
s=-(f*h)
do 42 j=1,m
y=a(j,nm)
z=a(j,i)
a(j,nm)=(y*c)+(z*s)
a(j,i)=-(y*s)+(z*c)
42 continue
43 continue
2 z=w(k)
if(l.eq.k)then
if(z.lt.0.0d0)then
w(k)=-z
do 44 j=1,n
v(j,k)=-v(j,k)
44 continue
endif
goto 3
endif
if(its.eq.30) pause 'no convergence in svdcmp'
x=w(l)
nm=k-1
y=w(nm)
g=rv1(nm)
h=rv1(k)
f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0d0*h*y)
g=dpythag(f,1.0d0)
f=((x-z)*(x+z)+h*((y/(f+sign(g,f)))-h))/x
c=1.0d0
s=1.0d0
do 47 j=l,nm
i=j+1
g=rv1(i)
y=w(i)
h=s*g
g=c*g
z=dpythag(f,h)
rv1(j)=z
c=f/z
s=h/z
f= (x*c)+(g*s)
g=-(x*s)+(g*c)
h=y*s
y=y*c
do 45 jj=1,n
x=v(jj,j)
z=v(jj,i)
v(jj,j)= (x*c)+(z*s)
v(jj,i)=-(x*s)+(z*c)
45 continue
z=dpythag(f,h)
w(j)=z
if(z.ne.0.0d0)then
z=1.0d0/z
c=f*z
s=h*z
endif
f= (c*g)+(s*y)
x=-(s*g)+(c*y)
do 46 jj=1,m
y=a(jj,j)
z=a(jj,i)
a(jj,j)= (y*c)+(z*s)
a(jj,i)=-(y*s)+(z*c)
46 continue
47 continue
rv1(l)=0.0d0
rv1(k)=f
w(k)=x
48 continue
3 continue
49 continue
return
END
@@ -0,0 +1,27 @@
SUBROUTINE eclass(nf,n,lista,listb,m)
INTEGER m,n,lista(m),listb(m),nf(n)
INTEGER j,k,l
do 11 k=1,n
nf(k)=k
11 continue
do 12 l=1,m
j=lista(l)
1 if(nf(j).ne.j)then
j=nf(j)
goto 1
endif
k=listb(l)
2 if(nf(k).ne.k)then
k=nf(k)
goto 2
endif
if(j.ne.k)nf(j)=k
12 continue
do 13 j=1,n
3 if(nf(j).ne.nf(nf(j)))then
nf(j)=nf(nf(j))
goto 3
endif
13 continue
return
END
@@ -0,0 +1,18 @@
SUBROUTINE eclazz(nf,n,equiv)
INTEGER n,nf(n)
LOGICAL equiv
EXTERNAL equiv
INTEGER jj,kk
nf(1)=1
do 12 jj=2,n
nf(jj)=jj
do 11 kk=1,jj-1
nf(kk)=nf(nf(kk))
if (equiv(jj,kk)) nf(nf(nf(kk)))=jj
11 continue
12 continue
do 13 jj=1,n
nf(jj)=nf(nf(jj))
13 continue
return
END
+38
View File
@@ -0,0 +1,38 @@
FUNCTION ei(x)
INTEGER MAXIT
REAL ei,x,EPS,EULER,FPMIN
PARAMETER (EPS=6.e-8,EULER=.57721566,MAXIT=100,FPMIN=1.e-30)
INTEGER k
REAL fact,prev,sum,term
if(x.le.0.) pause 'bad argument in ei'
if(x.lt.FPMIN)then
ei=log(x)+EULER
else if(x.le.-log(EPS))then
sum=0.
fact=1.
do 11 k=1,MAXIT
fact=fact*x/k
term=fact/k
sum=sum+term
if(term.lt.EPS*sum)goto 1
11 continue
pause 'series failed in ei'
1 ei=sum+log(x)+EULER
else
sum=0.
term=1.
do 12 k=1,MAXIT
prev=term
term=term*k/x
if(term.lt.EPS)goto 2
if(term.lt.prev)then
sum=sum+term
else
sum=sum-prev
goto 2
endif
12 continue
2 ei=exp(x)*(1.+sum)/x
endif
return
END
@@ -0,0 +1,26 @@
SUBROUTINE eigsrt(d,v,n,np)
INTEGER n,np
REAL d(np),v(np,np)
INTEGER i,j,k
REAL p
do 13 i=1,n-1
k=i
p=d(i)
do 11 j=i+1,n
if(d(j).ge.p)then
k=j
p=d(j)
endif
11 continue
if(k.ne.i)then
d(k)=d(i)
d(i)=p
do 12 j=1,n
p=v(j,i)
v(j,i)=v(j,k)
v(j,k)=p
12 continue
endif
13 continue
return
END
@@ -0,0 +1,10 @@
FUNCTION elle(phi,ak)
REAL elle,ak,phi
CU USES rd,rf
REAL cc,q,s,rd,rf
s=sin(phi)
cc=cos(phi)**2
q=(1.-s*ak)*(1.+s*ak)
elle=s*(rf(cc,q,1.)-((s*ak)**2)*rd(cc,q,1.)/3.)
return
END
@@ -0,0 +1,8 @@
FUNCTION ellf(phi,ak)
REAL ellf,ak,phi
CU USES rf
REAL s,rf
s=sin(phi)
ellf=s*rf(cos(phi)**2,(1.-s*ak)*(1.+s*ak),1.)
return
END
@@ -0,0 +1,11 @@
FUNCTION ellpi(phi,en,ak)
REAL ellpi,ak,en,phi
CU USES rf,rj
REAL cc,enss,q,s,rf,rj
s=sin(phi)
enss=en*s*s
cc=cos(phi)**2
q=(1.-s*ak)*(1.+s*ak)
ellpi=s*(rf(cc,q,1.)-enss*rj(cc,q,1.,1.+enss)/3.)
return
END
@@ -0,0 +1,44 @@
SUBROUTINE elmhes(a,n,np)
INTEGER n,np
REAL a(np,np)
INTEGER i,j,m
REAL x,y
do 17 m=2,n-1
x=0.
i=m
do 11 j=m,n
if(abs(a(j,m-1)).gt.abs(x))then
x=a(j,m-1)
i=j
endif
11 continue
if(i.ne.m)then
do 12 j=m-1,n
y=a(i,j)
a(i,j)=a(m,j)
a(m,j)=y
12 continue
do 13 j=1,n
y=a(j,i)
a(j,i)=a(j,m)
a(j,m)=y
13 continue
endif
if(x.ne.0.)then
do 16 i=m+1,n
y=a(i,m-1)
if(y.ne.0.)then
y=y/x
a(i,m-1)=y
do 14 j=m,n
a(i,j)=a(i,j)-y*a(m,j)
14 continue
do 15 j=1,n
a(j,m)=a(j,m)+y*a(j,i)
15 continue
endif
16 continue
endif
17 continue
return
END
+11
View File
@@ -0,0 +1,11 @@
FUNCTION erf(x)
REAL erf,x
CU USES gammp
REAL gammp
if(x.lt.0.)then
erf=-gammp(.5,x**2)
else
erf=gammp(.5,x**2)
endif
return
END
@@ -0,0 +1,11 @@
FUNCTION erfc(x)
REAL erfc,x
CU USES gammp,gammq
REAL gammp,gammq
if(x.lt.0.)then
erfc=1.+gammp(.5,x**2)
else
erfc=gammq(.5,x**2)
endif
return
END
@@ -0,0 +1,11 @@
FUNCTION erfcc(x)
REAL erfcc,x
REAL t,z
z=abs(x)
t=1./(1.+0.5*z)
erfcc=t*exp(-z*z-1.26551223+t*(1.00002368+t*(.37409196+t*
*(.09678418+t*(-.18628806+t*(.27886807+t*(-1.13520398+t*
*(1.48851587+t*(-.82215223+t*.17087277)))))))))
if (x.lt.0.) erfcc=2.-erfcc
return
END
@@ -0,0 +1,28 @@
SUBROUTINE eulsum(sum,term,jterm,wksp)
INTEGER jterm
REAL sum,term,wksp(jterm)
INTEGER j,nterm
REAL dum,tmp
SAVE nterm
if(jterm.eq.1)then
nterm=1
wksp(1)=term
sum=0.5*term
else
tmp=wksp(1)
wksp(1)=term
do 11 j=1,nterm-1
dum=wksp(j+1)
wksp(j+1)=0.5*(wksp(j)+tmp)
tmp=dum
11 continue
wksp(nterm+1)=0.5*(wksp(nterm)+tmp)
if(abs(wksp(nterm+1)).le.abs(wksp(nterm)))then
sum=sum+0.5*wksp(nterm+1)
nterm=nterm+1
else
sum=sum+wksp(nterm+1)
endif
endif
return
END
@@ -0,0 +1,23 @@
FUNCTION evlmem(fdt,d,m,xms)
INTEGER m
REAL evlmem,fdt,xms,d(m)
INTEGER i
REAL sumi,sumr
DOUBLE PRECISION theta,wi,wpi,wpr,wr,wtemp
theta=6.28318530717959d0*fdt
wpr=cos(theta)
wpi=sin(theta)
wr=1.d0
wi=0.d0
sumr=1.
sumi=0.
do 11 i=1,m
wtemp=wr
wr=wr*wpr-wi*wpi
wi=wi*wpr+wtemp*wpi
sumr=sumr-d(i)*sngl(wr)
sumi=sumi-d(i)*sngl(wi)
11 continue
evlmem=xms/(sumr**2+sumi**2)
return
END
@@ -0,0 +1,10 @@
FUNCTION expdev(idum)
INTEGER idum
REAL expdev
CU USES ran1
REAL dum,ran1
1 dum=ran1(idum)
if(dum.eq.0.)goto 1
expdev=-log(dum)
return
END

Some files were not shown because too many files have changed in this diff Show More