cmlri.f 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. *DECK CMLRI
  2. SUBROUTINE CMLRI (Z, FNU, KODE, N, Y, NZ, TOL)
  3. C***BEGIN PROLOGUE CMLRI
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to CBESI and CBESK
  6. C***LIBRARY SLATEC
  7. C***TYPE ALL (CMLRI-A, ZMLRI-A)
  8. C***AUTHOR Amos, D. E., (SNL)
  9. C***DESCRIPTION
  10. C
  11. C CMLRI COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY THE
  12. C MILLER ALGORITHM NORMALIZED BY A NEUMANN SERIES.
  13. C
  14. C***SEE ALSO CBESI, CBESK
  15. C***ROUTINES CALLED GAMLN, R1MACH
  16. C***REVISION HISTORY (YYMMDD)
  17. C 830501 DATE WRITTEN
  18. C 910415 Prologue converted to Version 4.0 format. (BAB)
  19. C***END PROLOGUE CMLRI
  20. COMPLEX CK, CNORM, CONE, CTWO, CZERO, PT, P1, P2, RZ, SUM, Y, Z
  21. REAL ACK, AK, AP, AT, AZ, BK, FKAP, FKK, FLAM, FNF, FNU, RHO,
  22. * RHO2, SCLE, TFNF, TOL, TST, X, GAMLN, R1MACH
  23. INTEGER I, IAZ, IDUM, IFNU, INU, ITIME, K, KK, KM, KODE, M, N, NZ
  24. DIMENSION Y(N)
  25. DATA CZERO,CONE,CTWO /(0.0E0,0.0E0),(1.0E0,0.0E0),(2.0E0,0.0E0)/
  26. SCLE = 1.0E+3*R1MACH(1)/TOL
  27. C***FIRST EXECUTABLE STATEMENT CMLRI
  28. NZ=0
  29. AZ = ABS(Z)
  30. X = REAL(Z)
  31. IAZ = AZ
  32. IFNU = FNU
  33. INU = IFNU + N - 1
  34. AT = IAZ + 1.0E0
  35. CK = CMPLX(AT,0.0E0)/Z
  36. RZ = CTWO/Z
  37. P1 = CZERO
  38. P2 = CONE
  39. ACK = (AT+1.0E0)/AZ
  40. RHO = ACK + SQRT(ACK*ACK-1.0E0)
  41. RHO2 = RHO*RHO
  42. TST = (RHO2+RHO2)/((RHO2-1.0E0)*(RHO-1.0E0))
  43. TST = TST/TOL
  44. C-----------------------------------------------------------------------
  45. C COMPUTE RELATIVE TRUNCATION ERROR INDEX FOR SERIES
  46. C-----------------------------------------------------------------------
  47. AK = AT
  48. DO 10 I=1,80
  49. PT = P2
  50. P2 = P1 - CK*P2
  51. P1 = PT
  52. CK = CK + RZ
  53. AP = ABS(P2)
  54. IF (AP.GT.TST*AK*AK) GO TO 20
  55. AK = AK + 1.0E0
  56. 10 CONTINUE
  57. GO TO 110
  58. 20 CONTINUE
  59. I = I + 1
  60. K = 0
  61. IF (INU.LT.IAZ) GO TO 40
  62. C-----------------------------------------------------------------------
  63. C COMPUTE RELATIVE TRUNCATION ERROR FOR RATIOS
  64. C-----------------------------------------------------------------------
  65. P1 = CZERO
  66. P2 = CONE
  67. AT = INU + 1.0E0
  68. CK = CMPLX(AT,0.0E0)/Z
  69. ACK = AT/AZ
  70. TST = SQRT(ACK/TOL)
  71. ITIME = 1
  72. DO 30 K=1,80
  73. PT = P2
  74. P2 = P1 - CK*P2
  75. P1 = PT
  76. CK = CK + RZ
  77. AP = ABS(P2)
  78. IF (AP.LT.TST) GO TO 30
  79. IF (ITIME.EQ.2) GO TO 40
  80. ACK = ABS(CK)
  81. FLAM = ACK + SQRT(ACK*ACK-1.0E0)
  82. FKAP = AP/ABS(P1)
  83. RHO = MIN(FLAM,FKAP)
  84. TST = TST*SQRT(RHO/(RHO*RHO-1.0E0))
  85. ITIME = 2
  86. 30 CONTINUE
  87. GO TO 110
  88. 40 CONTINUE
  89. C-----------------------------------------------------------------------
  90. C BACKWARD RECURRENCE AND SUM NORMALIZING RELATION
  91. C-----------------------------------------------------------------------
  92. K = K + 1
  93. KK = MAX(I+IAZ,K+INU)
  94. FKK = KK
  95. P1 = CZERO
  96. C-----------------------------------------------------------------------
  97. C SCALE P2 AND SUM BY SCLE
  98. C-----------------------------------------------------------------------
  99. P2 = CMPLX(SCLE,0.0E0)
  100. FNF = FNU - IFNU
  101. TFNF = FNF + FNF
  102. BK = GAMLN(FKK+TFNF+1.0E0,IDUM) - GAMLN(FKK+1.0E0,IDUM)
  103. * -GAMLN(TFNF+1.0E0,IDUM)
  104. BK = EXP(BK)
  105. SUM = CZERO
  106. KM = KK - INU
  107. DO 50 I=1,KM
  108. PT = P2
  109. P2 = P1 + CMPLX(FKK+FNF,0.0E0)*RZ*P2
  110. P1 = PT
  111. AK = 1.0E0 - TFNF/(FKK+TFNF)
  112. ACK = BK*AK
  113. SUM = SUM + CMPLX(ACK+BK,0.0E0)*P1
  114. BK = ACK
  115. FKK = FKK - 1.0E0
  116. 50 CONTINUE
  117. Y(N) = P2
  118. IF (N.EQ.1) GO TO 70
  119. DO 60 I=2,N
  120. PT = P2
  121. P2 = P1 + CMPLX(FKK+FNF,0.0E0)*RZ*P2
  122. P1 = PT
  123. AK = 1.0E0 - TFNF/(FKK+TFNF)
  124. ACK = BK*AK
  125. SUM = SUM + CMPLX(ACK+BK,0.0E0)*P1
  126. BK = ACK
  127. FKK = FKK - 1.0E0
  128. M = N - I + 1
  129. Y(M) = P2
  130. 60 CONTINUE
  131. 70 CONTINUE
  132. IF (IFNU.LE.0) GO TO 90
  133. DO 80 I=1,IFNU
  134. PT = P2
  135. P2 = P1 + CMPLX(FKK+FNF,0.0E0)*RZ*P2
  136. P1 = PT
  137. AK = 1.0E0 - TFNF/(FKK+TFNF)
  138. ACK = BK*AK
  139. SUM = SUM + CMPLX(ACK+BK,0.0E0)*P1
  140. BK = ACK
  141. FKK = FKK - 1.0E0
  142. 80 CONTINUE
  143. 90 CONTINUE
  144. PT = Z
  145. IF (KODE.EQ.2) PT = PT - CMPLX(X,0.0E0)
  146. P1 = -CMPLX(FNF,0.0E0)*CLOG(RZ) + PT
  147. AP = GAMLN(1.0E0+FNF,IDUM)
  148. PT = P1 - CMPLX(AP,0.0E0)
  149. C-----------------------------------------------------------------------
  150. C THE DIVISION CEXP(PT)/(SUM+P2) IS ALTERED TO AVOID OVERFLOW
  151. C IN THE DENOMINATOR BY SQUARING LARGE QUANTITIES
  152. C-----------------------------------------------------------------------
  153. P2 = P2 + SUM
  154. AP = ABS(P2)
  155. P1 = CMPLX(1.0E0/AP,0.0E0)
  156. CK = CEXP(PT)*P1
  157. PT = CONJG(P2)*P1
  158. CNORM = CK*PT
  159. DO 100 I=1,N
  160. Y(I) = Y(I)*CNORM
  161. 100 CONTINUE
  162. RETURN
  163. 110 CONTINUE
  164. NZ=-2
  165. RETURN
  166. END