50 lines
1.2 KiB
Fortran
50 lines
1.2 KiB
Fortran
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
|