File: BESI.FT of Tape: Various/ETH/eth11-1
(Source file text)
C C .................................................................. C C SUBROUTINE BESI C C PURPOSE C COMPUTE THE I BESSEL FUNCTION FOR A GIVEN ARGUMENT AND ORDER C C USAGE C CALL BESI(X,N,BI,IER) C C DESCRIPTION OF PARAMETERS C X -THE ARGUMENT OF THE I BESSEL FUNCTION DESIRED C N -THE ORDER OF THE I BESSEL FUNCTION DESIRED C BI -THE RESULTANT I BESSEL FUNCTION C IER-RESULTANT ERROR CODE WHERE C IER=0 NO ERROR C IER=1 N IS NEGATIVE C IER=2 X IS NEGATIVE C IER=3 UNDERFLOW, BI .LT. 1.E-38, BI SET TO 0.0 C IER=4 OVERFLOW, X .GT. 60 WHERE X .GT. N C C REMARKS C N AND X MUST BE .GE. ZERO C C SUBROUTINES AND FUNCTION SUBPROGRAMS REQUIRED C NONE C C METHOD C COMPUTES I BESSEL FUNCTION USING SERIES OR ASYMPTOTIC C APPROXIMATION DEPENDING ON RANGE OF ARGUMENTS. C C .................................................................. C SUBROUTINE BESI(X,N, BI,IER) C C CHECK FOR ERRORS IN N AND X AND EXIT IF ANY ARE PRESENT C IER=0 BI=1.0 IF(N)150,15,10 10 IF(X)160,20,20 15 IF(X)160,17,20 17 RETURN C C DEFINE TOLERANCE C 20 TOL=1.E-6 C C IF ARGUMENT GT 12 AND GT N, USE ASYMPTOTIC FORM C IF(X-12.)40,40,30 30 IF(X-FLOAT(N))40,40,110 C C COMPUTE FIRST TERM OF SERIES AND SET INITIAL VALUE OF THE SUM C 40 XX=X/2. 50 TERM=1.0 IF(N) 70,70,55 55 DO 60 I=1,N FI=I IF(ABS(TERM)-1.E-36)56,60,60 56 IER=3 BI=0.0 RETURN 60 TERM=TERM*XX/FI 70 BI=TERM XX=XX*XX C C COMPUTE TERMS, STOPPING WHEN ABS(TERM) LE ABS(SUM OF TERMS) C TIMES TOLERANCE C DO 90 K=1,1000 IF(ABS(TERM)-ABS(BI*TOL))100,100,80 80 FK=K*(N+K) TERM=TERM*(XX/FK) 90 BI=BI+TERM C C RETURN BI AS ANSWER C 100 RETURN C C X GT 12 AND X GT N, SO USE ASYMPTOTIC APPROXIMATION C 110 FN=4*N*N C THE LIMIT OF 60. MAY BE ABLE TO BE REVISED UPWARD IF(X-60.0)115,111,111 111 IER=4 RETURN 115 XX=1./(8.*X) TERM=1. BI=1. DO 130 K=1,30 IF(ABS(TERM)-ABS(TOL*BI))140,140,120 120 FK=(2*K-1)**2 TERM=TERM*XX*(FK-FN)/FLOAT(K) 130 BI=BI+TERM C C SIGNIFICANCE LOST AFTER 30 TERMS, TRY SERIES C GO TO 40 140 PI=3.141592653 BI=BI*EXP(X)/SQRT(2.*PI*X) GO TO 100 150 IER=1 GO TO 100 160 IER=2 GO TO 100 END