2
SUBROUTINE BESKNU (X, FNU, KODE, N, Y, NZ)
3
C***BEGIN PROLOGUE BESKNU
5
C***PURPOSE Subsidiary to BESK
7
C***TYPE SINGLE PRECISION (BESKNU-S, DBSKNU-D)
8
C***AUTHOR Amos, D. E., (SNLA)
12
C BESKNU computes N member sequences of K Bessel functions
13
C K/SUB(FNU+I-1)/(X), I=1,N for non-negative orders FNU and
14
C positive X. Equations of the references are implemented on
15
C small orders DNU for K/SUB(DNU)/(X) and K/SUB(DNU+1)/(X).
16
C Forward recursion with the three term recursion relation
17
C generates higher orders FNU+I-1, I=1,...,N. The parameter
18
C KODE permits K/SUB(FNU+I-1)/(X) values or scaled values
19
C EXP(X)*K/SUB(FNU+I-1)/(X), I=1,N to be returned.
21
C To start the recursion FNU is normalized to the interval
22
C -0.5.LE.DNU.LT.0.5. A special form of the power series is
23
C implemented on 0.LT.X.LE.X1 while the Miller algorithm for the
24
C K Bessel function in terms of the confluent hypergeometric
25
C function U(FNU+0.5,2*FNU+1,X) is implemented on X1.LT.X.LE.X2.
26
C For X.GT.X2, the asymptotic expansion for large X is used.
27
C When FNU is a half odd integer, a special formula for
28
C DNU=-0.5 and DNU+1.0=0.5 is used to start the recursion.
30
C BESKNU assumes that a significant digit SINH(X) function is
33
C Description of Arguments
37
C FNU - Order of initial K function, FNU.GE.0.0E0
38
C N - Number of members of the sequence, N.GE.1
39
C KODE - A parameter to indicate the scaling option
41
C Y(I)= K/SUB(FNU+I-1)/(X)
44
C Y(I)=EXP(X)*K/SUB(FNU+I-1)/(X)
48
C Y - A vector whose first N components contain values
50
C Y(I)= K/SUB(FNU+I-1)/(X), I=1,...,N or
51
C Y(I)=EXP(X)*K/SUB(FNU+I-1)/(X), I=1,...,N
53
C NZ - Number of components set to zero due to
55
C NZ= 0 , Normal return
56
C NZ.NE.0 , First NZ components of Y set to zero
57
C due to underflow, Y(I)=0.0E0,I=1,...,NZ
60
C Improper input arguments - a fatal error
61
C Overflow - a fatal error
62
C Underflow with KODE=1 - a non-fatal error (NZ.NE.0)
65
C***REFERENCES N. M. Temme, On the numerical evaluation of the modified
66
C Bessel function of the third kind, Journal of
67
C Computational Physics 19, (1975), pp. 324-337.
68
C***ROUTINES CALLED GAMMA, I1MACH, R1MACH, XERMSG
69
C***REVISION HISTORY (YYMMDD)
71
C 890531 Changed all specific intrinsics to generic. (WRB)
72
C 891214 Prologue converted to Version 4.0 format. (BAB)
73
C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
74
C 900326 Removed duplicate information from DESCRIPTION section.
76
C 900328 Added TYPE section. (WRB)
77
C 900727 Added EXTERNAL statement. (WRB)
78
C 910408 Updated the AUTHOR and REFERENCES sections. (WRB)
79
C 920501 Reformatted the REFERENCES section. (WRB)
80
C***END PROLOGUE BESKNU
82
INTEGER I, IFLAG, INU, J, K, KK, KODE, KODED, N, NN, NZ
84
REAL A, AK, A1, A2, B, BK, CC, CK, COEF, CX, DK, DNU, DNU2, ELIM,
85
1 ETEST, EX, F, FC, FHS, FK, FKS, FLRX, FMU, FNU, G1, G2, P, PI,
86
2 PT, P1, P2, Q, RTHPI, RX, S, SMU, SQK, ST, S1, S2, TM, TOL, T1,
89
DIMENSION A(160), B(160), Y(*), CC(8)
91
SAVE X1, X2, PI, RTHPI, CC
92
DATA X1, X2 / 2.0E0, 17.0E0 /
93
DATA PI,RTHPI / 3.14159265358979E+00, 1.25331413731550E+00/
94
DATA CC(1), CC(2), CC(3), CC(4), CC(5), CC(6), CC(7), CC(8)
95
1 / 5.77215664901533E-01,-4.20026350340952E-02,
96
2-4.21977345555443E-02, 7.21894324666300E-03,-2.15241674114900E-04,
97
3-2.01348547807000E-05, 1.13302723200000E-06, 6.11609500000000E-09/
98
C***FIRST EXECUTABLE STATEMENT BESKNU
100
ELIM = 2.303E0*(KK*R1MACH(5)-3.0E0)
102
TOL = MAX(AK,1.0E-15)
103
IF (X.LE.0.0E0) GO TO 350
104
IF (FNU.LT.0.0E0) GO TO 360
105
IF (KODE.LT.1 .OR. KODE.GT.2) GO TO 370
106
IF (N.LT.1) GO TO 380
113
IF (ABS(DNU).EQ.0.5E0) GO TO 120
115
IF (ABS(DNU).LT.TOL) GO TO 10
118
IF (X.GT.X1) GO TO 120
126
IF (ABS(DNU).GT.0.1E0) GO TO 40
127
C SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
134
IF (ABS(TM).LT.TOL) GO TO 30
139
G1 = (T1-T2)/(DNU+DNU)
146
IF (DNU.EQ.0.0E0) GO TO 60
149
IF (FMU.NE.0.0E0) SMU = SINH(FMU)/FMU
151
F = FC*(G1*COSH(FMU)+G2*FLRX*SMU)
160
IF (INU.GT.0 .OR. N.GT.1) GO TO 90
161
IF (X.LT.TOL) GO TO 80
164
F = (AK*F+P+Q)/(BK-DNU2)
170
BK = BK + AK + AK + 1.0E0
172
S = ABS(T1)/(1.0E0+ABS(S1))
173
IF (S.GT.TOL) GO TO 70
176
IF (KODED.EQ.1) RETURN
180
IF (X.LT.TOL) GO TO 110
183
F = (AK*F+P+Q)/(BK-DNU2)
191
BK = BK + AK + AK + 1.0E0
193
S = ABS(T1)/(1.0E0+ABS(S1)) + ABS(T2)/(1.0E0+ABS(S2))
194
IF (S.GT.TOL) GO TO 100
197
IF (KODED.EQ.1) GO TO 170
204
IF (KODED.EQ.2) GO TO 130
205
IF (X.GT.ELIM) GO TO 330
208
IF (ABS(DNU).EQ.0.5E0) GO TO 340
209
IF (X.GT.X2) GO TO 280
211
C MILLER ALGORITHM FOR X1.LT.X.LE.X2
213
ETEST = COS(PI*DNU)/(PI*X*TOL)
224
AK = (FHS-DNU2)/(FKS+FK)
232
FKS = FKS + FK + FK + 1.0E0
234
IF (ETEST.GT.FK*P1) GO TO 140
241
P2 = (B(KK)*P2-P1)/A(KK)
247
IF (INU.GT.0 .OR. N.GT.1) GO TO 160
250
S2 = S1*(X+DNU+0.5E0-P1/P2)/X
252
C FORWARD RECURSION ON THE THREE TERM RECURSION RELATION
255
CK = (DNU+DNU+2.0E0)/X
256
IF (N.EQ.1) INU = INU - 1
257
IF (INU.GT.0) GO TO 180
258
IF (N.GT.1) GO TO 200
270
IF (IFLAG.EQ.1) GO TO 220
276
Y(I) = CK*Y(I-1) + Y(I-2)
285
IF (S.LT.-ELIM) GO TO 230
293
IF (S.LT.-ELIM) GO TO 240
299
IF (NZ.LT.2) GO TO 260
309
IF (S.LT.-ELIM) GO TO 250
320
Y(KK) = EXP(-X+LOG(S2))
324
Y(I) = CK*Y(I-1) + Y(I-2)
329
C ASYMPTOTIC EXPANSION FOR LARGE X, X.GT.X2
331
C IFLAG=0 MEANS NO UNDERFLOW OCCURRED
332
C IFLAG=1 MEANS AN UNDERFLOW OCCURRED- COMPUTATION PROCEEDS WITH
333
C KODED=2 AND A TEST FOR ON SCALE VALUES IS MADE DURING FORWARD
337
IF (INU.EQ.0 .AND. N.EQ.1) NN = 1
340
IF (ABS(DNU2).LT.TOL) GO TO 290
358
IF (ABS(CK).LT.TOL) GO TO 310
361
FMU = FMU + 8.0E0*DNU + 4.0E0
363
IF (NN.GT.1) GO TO 170
371
C FNU=HALF ODD INTEGER CASE
379
350 CALL XERMSG ('SLATEC', 'BESKNU', 'X NOT GREATER THAN ZERO', 2, 1)
381
360 CALL XERMSG ('SLATEC', 'BESKNU', 'FNU NOT ZERO OR POSITIVE', 2,
384
370 CALL XERMSG ('SLATEC', 'BESKNU', 'KODE NOT 1 OR 2', 2, 1)
386
380 CALL XERMSG ('SLATEC', 'BESKNU', 'N NOT GREATER THAN 0', 2, 1)