cseri.f 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. *DECK CSERI
  2. SUBROUTINE CSERI (Z, FNU, KODE, N, Y, NZ, TOL, ELIM, ALIM)
  3. C***BEGIN PROLOGUE CSERI
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to CBESI and CBESK
  6. C***LIBRARY SLATEC
  7. C***TYPE ALL (CSERI-A, ZSERI-A)
  8. C***AUTHOR Amos, D. E., (SNL)
  9. C***DESCRIPTION
  10. C
  11. C CSERI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
  12. C MEANS OF THE POWER SERIES FOR LARGE ABS(Z) IN THE
  13. C REGION ABS(Z).LE.2*SQRT(FNU+1). NZ=0 IS A NORMAL RETURN.
  14. C NZ.GT.0 MEANS THAT THE LAST NZ COMPONENTS WERE SET TO ZERO
  15. C DUE TO UNDERFLOW. NZ.LT.0 MEANS UNDERFLOW OCCURRED, BUT THE
  16. C CONDITION ABS(Z).LE.2*SQRT(FNU+1) WAS VIOLATED AND THE
  17. C COMPUTATION MUST BE COMPLETED IN ANOTHER ROUTINE WITH N=N-ABS(NZ).
  18. C
  19. C***SEE ALSO CBESI, CBESK
  20. C***ROUTINES CALLED CUCHK, GAMLN, R1MACH
  21. C***REVISION HISTORY (YYMMDD)
  22. C 830501 DATE WRITTEN
  23. C 910415 Prologue converted to Version 4.0 format. (BAB)
  24. C***END PROLOGUE CSERI
  25. COMPLEX AK1, CK, COEF, CONE, CRSC, CZ, CZERO, HZ, RZ, S1, S2, W,
  26. * Y, Z
  27. REAL AA, ACZ, AK, ALIM, ARM, ASCLE, ATOL, AZ, DFNU, ELIM, FNU,
  28. * FNUP, RAK1, RS, RTR1, S, SS, TOL, X, GAMLN, R1MACH
  29. INTEGER I, IB, IDUM, IFLAG, IL, K, KODE, L, M, N, NN, NW, NZ
  30. DIMENSION Y(N), W(2)
  31. DATA CZERO, CONE / (0.0E0,0.0E0), (1.0E0,0.0E0) /
  32. C***FIRST EXECUTABLE STATEMENT CSERI
  33. NZ = 0
  34. AZ = ABS(Z)
  35. IF (AZ.EQ.0.0E0) GO TO 150
  36. X = REAL(Z)
  37. ARM = 1.0E+3*R1MACH(1)
  38. RTR1 = SQRT(ARM)
  39. CRSC = CMPLX(1.0E0,0.0E0)
  40. IFLAG = 0
  41. IF (AZ.LT.ARM) GO TO 140
  42. HZ = Z*CMPLX(0.5E0,0.0E0)
  43. CZ = CZERO
  44. IF (AZ.GT.RTR1) CZ = HZ*HZ
  45. ACZ = ABS(CZ)
  46. NN = N
  47. CK = CLOG(HZ)
  48. 10 CONTINUE
  49. DFNU = FNU + (NN-1)
  50. FNUP = DFNU + 1.0E0
  51. C-----------------------------------------------------------------------
  52. C UNDERFLOW TEST
  53. C-----------------------------------------------------------------------
  54. AK1 = CK*CMPLX(DFNU,0.0E0)
  55. AK = GAMLN(FNUP,IDUM)
  56. AK1 = AK1 - CMPLX(AK,0.0E0)
  57. IF (KODE.EQ.2) AK1 = AK1 - CMPLX(X,0.0E0)
  58. RAK1 = REAL(AK1)
  59. IF (RAK1.GT.(-ELIM)) GO TO 30
  60. 20 CONTINUE
  61. NZ = NZ + 1
  62. Y(NN) = CZERO
  63. IF (ACZ.GT.DFNU) GO TO 170
  64. NN = NN - 1
  65. IF (NN.EQ.0) RETURN
  66. GO TO 10
  67. 30 CONTINUE
  68. IF (RAK1.GT.(-ALIM)) GO TO 40
  69. IFLAG = 1
  70. SS = 1.0E0/TOL
  71. CRSC = CMPLX(TOL,0.0E0)
  72. ASCLE = ARM*SS
  73. 40 CONTINUE
  74. AK = AIMAG(AK1)
  75. AA = EXP(RAK1)
  76. IF (IFLAG.EQ.1) AA = AA*SS
  77. COEF = CMPLX(AA,0.0E0)*CMPLX(COS(AK),SIN(AK))
  78. ATOL = TOL*ACZ/FNUP
  79. IL = MIN(2,NN)
  80. DO 80 I=1,IL
  81. DFNU = FNU + (NN-I)
  82. FNUP = DFNU + 1.0E0
  83. S1 = CONE
  84. IF (ACZ.LT.TOL*FNUP) GO TO 60
  85. AK1 = CONE
  86. AK = FNUP + 2.0E0
  87. S = FNUP
  88. AA = 2.0E0
  89. 50 CONTINUE
  90. RS = 1.0E0/S
  91. AK1 = AK1*CZ*CMPLX(RS,0.0E0)
  92. S1 = S1 + AK1
  93. S = S + AK
  94. AK = AK + 2.0E0
  95. AA = AA*ACZ*RS
  96. IF (AA.GT.ATOL) GO TO 50
  97. 60 CONTINUE
  98. M = NN - I + 1
  99. S2 = S1*COEF
  100. W(I) = S2
  101. IF (IFLAG.EQ.0) GO TO 70
  102. CALL CUCHK(S2, NW, ASCLE, TOL)
  103. IF (NW.NE.0) GO TO 20
  104. 70 CONTINUE
  105. Y(M) = S2*CRSC
  106. IF (I.NE.IL) COEF = COEF*CMPLX(DFNU,0.0E0)/HZ
  107. 80 CONTINUE
  108. IF (NN.LE.2) RETURN
  109. K = NN - 2
  110. AK = K
  111. RZ = (CONE+CONE)/Z
  112. IF (IFLAG.EQ.1) GO TO 110
  113. IB = 3
  114. 90 CONTINUE
  115. DO 100 I=IB,NN
  116. Y(K) = CMPLX(AK+FNU,0.0E0)*RZ*Y(K+1) + Y(K+2)
  117. AK = AK - 1.0E0
  118. K = K - 1
  119. 100 CONTINUE
  120. RETURN
  121. C-----------------------------------------------------------------------
  122. C RECUR BACKWARD WITH SCALED VALUES
  123. C-----------------------------------------------------------------------
  124. 110 CONTINUE
  125. C-----------------------------------------------------------------------
  126. C EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION ABOVE THE
  127. C UNDERFLOW LIMIT = ASCLE = R1MACH(1)*CSCL*1.0E+3
  128. C-----------------------------------------------------------------------
  129. S1 = W(1)
  130. S2 = W(2)
  131. DO 120 L=3,NN
  132. CK = S2
  133. S2 = S1 + CMPLX(AK+FNU,0.0E0)*RZ*S2
  134. S1 = CK
  135. CK = S2*CRSC
  136. Y(K) = CK
  137. AK = AK - 1.0E0
  138. K = K - 1
  139. IF (ABS(CK).GT.ASCLE) GO TO 130
  140. 120 CONTINUE
  141. RETURN
  142. 130 CONTINUE
  143. IB = L + 1
  144. IF (IB.GT.NN) RETURN
  145. GO TO 90
  146. 140 CONTINUE
  147. NZ = N
  148. IF (FNU.EQ.0.0E0) NZ = NZ - 1
  149. 150 CONTINUE
  150. Y(1) = CZERO
  151. IF (FNU.EQ.0.0E0) Y(1) = CONE
  152. IF (N.EQ.1) RETURN
  153. DO 160 I=2,N
  154. Y(I) = CZERO
  155. 160 CONTINUE
  156. RETURN
  157. C-----------------------------------------------------------------------
  158. C RETURN WITH NZ.LT.0 IF ABS(Z*Z/4).GT.FNU+N-NZ-1 COMPLETE
  159. C THE CALCULATION IN CBINU WITH N=N-ABS(NZ)
  160. C-----------------------------------------------------------------------
  161. 170 CONTINUE
  162. NZ = -NZ
  163. RETURN
  164. END