cbuni.f 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. *DECK CBUNI
  2. SUBROUTINE CBUNI (Z, FNU, KODE, N, Y, NZ, NUI, NLAST, FNUL, TOL,
  3. + ELIM, ALIM)
  4. C***BEGIN PROLOGUE CBUNI
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to CBESI and CBESK
  7. C***LIBRARY SLATEC
  8. C***TYPE ALL (CBUNI-A, ZBUNI-A)
  9. C***AUTHOR Amos, D. E., (SNL)
  10. C***DESCRIPTION
  11. C
  12. C CBUNI COMPUTES THE I BESSEL FUNCTION FOR LARGE ABS(Z).GT.
  13. C FNUL AND FNU+N-1.LT.FNUL. THE ORDER IS INCREASED FROM
  14. C FNU+N-1 GREATER THAN FNUL BY ADDING NUI AND COMPUTING
  15. C ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR I(FNU,Z)
  16. C ON IFORM=1 AND THE EXPANSION FOR J(FNU,Z) ON IFORM=2
  17. C
  18. C***SEE ALSO CBESI, CBESK
  19. C***ROUTINES CALLED CUNI1, CUNI2, R1MACH
  20. C***REVISION HISTORY (YYMMDD)
  21. C 830501 DATE WRITTEN
  22. C 910415 Prologue converted to Version 4.0 format. (BAB)
  23. C***END PROLOGUE CBUNI
  24. COMPLEX CSCL, CSCR, CY, RZ, ST, S1, S2, Y, Z
  25. REAL ALIM, AX, AY, DFNU, ELIM, FNU, FNUI, FNUL, GNU, TOL, XX, YY,
  26. * ASCLE, BRY, STR, STI, STM, R1MACH
  27. INTEGER I, IFLAG, IFORM, K, KODE, N, NL, NLAST, NUI, NW, NZ
  28. DIMENSION Y(N), CY(2), BRY(3)
  29. C***FIRST EXECUTABLE STATEMENT CBUNI
  30. NZ = 0
  31. XX = REAL(Z)
  32. YY = AIMAG(Z)
  33. AX = ABS(XX)*1.7321E0
  34. AY = ABS(YY)
  35. IFORM = 1
  36. IF (AY.GT.AX) IFORM = 2
  37. IF (NUI.EQ.0) GO TO 60
  38. FNUI = NUI
  39. DFNU = FNU + (N-1)
  40. GNU = DFNU + FNUI
  41. IF (IFORM.EQ.2) GO TO 10
  42. C-----------------------------------------------------------------------
  43. C ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
  44. C -PI/3.LE.ARG(Z).LE.PI/3
  45. C-----------------------------------------------------------------------
  46. CALL CUNI1(Z, GNU, KODE, 2, CY, NW, NLAST, FNUL, TOL, ELIM, ALIM)
  47. GO TO 20
  48. 10 CONTINUE
  49. C-----------------------------------------------------------------------
  50. C ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
  51. C APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
  52. C AND HPI=PI/2
  53. C-----------------------------------------------------------------------
  54. CALL CUNI2(Z, GNU, KODE, 2, CY, NW, NLAST, FNUL, TOL, ELIM, ALIM)
  55. 20 CONTINUE
  56. IF (NW.LT.0) GO TO 50
  57. IF (NW.NE.0) GO TO 90
  58. AY = ABS(CY(1))
  59. C----------------------------------------------------------------------
  60. C SCALE BACKWARD RECURRENCE, BRY(3) IS DEFINED BUT NEVER USED
  61. C----------------------------------------------------------------------
  62. BRY(1) = 1.0E+3*R1MACH(1)/TOL
  63. BRY(2) = 1.0E0/BRY(1)
  64. BRY(3) = BRY(2)
  65. IFLAG = 2
  66. ASCLE = BRY(2)
  67. AX = 1.0E0
  68. CSCL = CMPLX(AX,0.0E0)
  69. IF (AY.GT.BRY(1)) GO TO 21
  70. IFLAG = 1
  71. ASCLE = BRY(1)
  72. AX = 1.0E0/TOL
  73. CSCL = CMPLX(AX,0.0E0)
  74. GO TO 25
  75. 21 CONTINUE
  76. IF (AY.LT.BRY(2)) GO TO 25
  77. IFLAG = 3
  78. ASCLE = BRY(3)
  79. AX = TOL
  80. CSCL = CMPLX(AX,0.0E0)
  81. 25 CONTINUE
  82. AY = 1.0E0/AX
  83. CSCR = CMPLX(AY,0.0E0)
  84. S1 = CY(2)*CSCL
  85. S2 = CY(1)*CSCL
  86. RZ = CMPLX(2.0E0,0.0E0)/Z
  87. DO 30 I=1,NUI
  88. ST = S2
  89. S2 = CMPLX(DFNU+FNUI,0.0E0)*RZ*S2 + S1
  90. S1 = ST
  91. FNUI = FNUI - 1.0E0
  92. IF (IFLAG.GE.3) GO TO 30
  93. ST = S2*CSCR
  94. STR = REAL(ST)
  95. STI = AIMAG(ST)
  96. STR = ABS(STR)
  97. STI = ABS(STI)
  98. STM = MAX(STR,STI)
  99. IF (STM.LE.ASCLE) GO TO 30
  100. IFLAG = IFLAG+1
  101. ASCLE = BRY(IFLAG)
  102. S1 = S1*CSCR
  103. S2 = ST
  104. AX = AX*TOL
  105. AY = 1.0E0/AX
  106. CSCL = CMPLX(AX,0.0E0)
  107. CSCR = CMPLX(AY,0.0E0)
  108. S1 = S1*CSCL
  109. S2 = S2*CSCL
  110. 30 CONTINUE
  111. Y(N) = S2*CSCR
  112. IF (N.EQ.1) RETURN
  113. NL = N - 1
  114. FNUI = NL
  115. K = NL
  116. DO 40 I=1,NL
  117. ST = S2
  118. S2 = CMPLX(FNU+FNUI,0.0E0)*RZ*S2 + S1
  119. S1 = ST
  120. ST = S2*CSCR
  121. Y(K) = ST
  122. FNUI = FNUI - 1.0E0
  123. K = K - 1
  124. IF (IFLAG.GE.3) GO TO 40
  125. STR = REAL(ST)
  126. STI = AIMAG(ST)
  127. STR = ABS(STR)
  128. STI = ABS(STI)
  129. STM = MAX(STR,STI)
  130. IF (STM.LE.ASCLE) GO TO 40
  131. IFLAG = IFLAG+1
  132. ASCLE = BRY(IFLAG)
  133. S1 = S1*CSCR
  134. S2 = ST
  135. AX = AX*TOL
  136. AY = 1.0E0/AX
  137. CSCL = CMPLX(AX,0.0E0)
  138. CSCR = CMPLX(AY,0.0E0)
  139. S1 = S1*CSCL
  140. S2 = S2*CSCL
  141. 40 CONTINUE
  142. RETURN
  143. 50 CONTINUE
  144. NZ = -1
  145. IF(NW.EQ.(-2)) NZ=-2
  146. RETURN
  147. 60 CONTINUE
  148. IF (IFORM.EQ.2) GO TO 70
  149. C-----------------------------------------------------------------------
  150. C ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
  151. C -PI/3.LE.ARG(Z).LE.PI/3
  152. C-----------------------------------------------------------------------
  153. CALL CUNI1(Z, FNU, KODE, N, Y, NW, NLAST, FNUL, TOL, ELIM, ALIM)
  154. GO TO 80
  155. 70 CONTINUE
  156. C-----------------------------------------------------------------------
  157. C ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
  158. C APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
  159. C AND HPI=PI/2
  160. C-----------------------------------------------------------------------
  161. CALL CUNI2(Z, FNU, KODE, N, Y, NW, NLAST, FNUL, TOL, ELIM, ALIM)
  162. 80 CONTINUE
  163. IF (NW.LT.0) GO TO 50
  164. NZ = NW
  165. RETURN
  166. 90 CONTINUE
  167. NLAST = N
  168. RETURN
  169. END