📄 bessik.for
字号:
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -