2
SUBROUTINE CASYI (Z, FNU, KODE, N, Y, NZ, RL, TOL, ELIM, ALIM)
3
C***BEGIN PROLOGUE CASYI
5
C***PURPOSE Subsidiary to CBESI and CBESK
7
C***TYPE ALL (CASYI-A, ZASYI-A)
8
C***AUTHOR Amos, D. E., (SNL)
11
C CASYI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
12
C MEANS OF THE ASYMPTOTIC EXPANSION FOR LARGE ABS(Z) IN THE
13
C REGION ABS(Z).GT.MAX(RL,FNU*FNU/2). NZ=0 IS A NORMAL RETURN.
14
C NZ.LT.0 INDICATES AN OVERFLOW ON KODE=1.
16
C***SEE ALSO CBESI, CBESK
17
C***ROUTINES CALLED R1MACH
18
C***REVISION HISTORY (YYMMDD)
20
C 910415 Prologue converted to Version 4.0 format. (BAB)
21
C***END PROLOGUE CASYI
22
COMPLEX AK1, CK, CONE, CS1, CS2, CZ, CZERO, DK, EZ, P1, RZ, S2,
24
REAL AA, ACZ, AEZ, AK, ALIM, ARG, ARM, ATOL, AZ, BB, BK, DFNU,
25
* DNU2, ELIM, FDN, FNU, PI, RL, RTPI, RTR1, S, SGN, SQK, TOL, X,
27
INTEGER I, IB, IL, INU, J, JL, K, KODE, KODED, M, N, NN, NZ
29
DATA PI, RTPI /3.14159265358979324E0 , 0.159154943091895336E0 /
30
DATA CZERO, CONE / (0.0E0,0.0E0), (1.0E0,0.0E0) /
31
C***FIRST EXECUTABLE STATEMENT CASYI
35
ARM = 1.0E+3*R1MACH(1)
39
C-----------------------------------------------------------------------
41
C-----------------------------------------------------------------------
42
AK1 = CMPLX(RTPI,0.0E0)/Z
45
IF (KODE.EQ.2) CZ = Z - CMPLX(X,0.0E0)
47
IF (ABS(ACZ).GT.ELIM) GO TO 80
50
IF ((ABS(ACZ).GT.ALIM) .AND. (N.GT.2)) GO TO 10
55
IF (DNU2.GT.RTR1) FDN = DNU2*DNU2
56
EZ = Z*CMPLX(8.0E0,0.0E0)
57
C-----------------------------------------------------------------------
58
C WHEN Z IS IMAGINARY, THE ERROR TEST MUST BE MADE RELATIVE TO THE
59
C FIRST RECIPROCAL POWER SINCE THIS IS THE LEADING TERM OF THE
60
C EXPANSION FOR THE IMAGINARY PART.
61
C-----------------------------------------------------------------------
67
IF (YY.EQ.0.0E0) GO TO 20
68
C-----------------------------------------------------------------------
69
C CALCULATE EXP(PI*(0.5+FNU+N-IL)*I) TO MINIMIZE LOSSES OF
70
C SIGNIFICANCE WHEN FNU OR N IS LARGE
71
C-----------------------------------------------------------------------
77
IF (YY.LT.0.0E0) BK = -BK
79
IF (MOD(INU,2).EQ.1) P1 = -P1
93
CK = CK*CMPLX(SQK,0.0E0)/DK
96
CS1 = CS1 + CK*CMPLX(SGN,0.0E0)
102
IF (AA.LE.ATOL) GO TO 40
107
IF (X+X.LT.ELIM) S2 = S2 + P1*CS2*CEXP(-Z-Z)
108
FDN = FDN + 8.0E0*DFNU + 4.0E0
120
Y(K) = CMPLX(AK+FNU,0.0E0)*RZ*Y(K+1) + Y(K+2)
124
IF (KODED.EQ.0) RETURN