zmlri.f 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. *DECK ZMLRI
  2. SUBROUTINE ZMLRI (ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL)
  3. C***BEGIN PROLOGUE ZMLRI
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to ZBESI and ZBESK
  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 ZMLRI 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 ZBESI, ZBESK
  15. C***ROUTINES CALLED D1MACH, DGAMLN, ZABS, ZEXP, ZLOG, ZMLT
  16. C***REVISION HISTORY (YYMMDD)
  17. C 830501 DATE WRITTEN
  18. C 910415 Prologue converted to Version 4.0 format. (BAB)
  19. C 930122 Added ZEXP and ZLOG to EXTERNAL statement. (RWC)
  20. C***END PROLOGUE ZMLRI
  21. C COMPLEX CK,CNORM,CONE,CTWO,CZERO,PT,P1,P2,RZ,SUM,Y,Z
  22. DOUBLE PRECISION ACK, AK, AP, AT, AZ, BK, CKI, CKR, CNORMI,
  23. * CNORMR, CONEI, CONER, FKAP, FKK, FLAM, FNF, FNU, PTI, PTR, P1I,
  24. * P1R, P2I, P2R, RAZ, RHO, RHO2, RZI, RZR, SCLE, STI, STR, SUMI,
  25. * SUMR, TFNF, TOL, TST, YI, YR, ZEROI, ZEROR, ZI, ZR, DGAMLN,
  26. * D1MACH, ZABS
  27. INTEGER I, IAZ, IDUM, IFNU, INU, ITIME, K, KK, KM, KODE, M, N, NZ
  28. DIMENSION YR(N), YI(N)
  29. EXTERNAL ZABS, ZEXP, ZLOG
  30. DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
  31. C***FIRST EXECUTABLE STATEMENT ZMLRI
  32. SCLE = D1MACH(1)/TOL
  33. NZ=0
  34. AZ = ZABS(ZR,ZI)
  35. IAZ = AZ
  36. IFNU = FNU
  37. INU = IFNU + N - 1
  38. AT = IAZ + 1.0D0
  39. RAZ = 1.0D0/AZ
  40. STR = ZR*RAZ
  41. STI = -ZI*RAZ
  42. CKR = STR*AT*RAZ
  43. CKI = STI*AT*RAZ
  44. RZR = (STR+STR)*RAZ
  45. RZI = (STI+STI)*RAZ
  46. P1R = ZEROR
  47. P1I = ZEROI
  48. P2R = CONER
  49. P2I = CONEI
  50. ACK = (AT+1.0D0)*RAZ
  51. RHO = ACK + SQRT(ACK*ACK-1.0D0)
  52. RHO2 = RHO*RHO
  53. TST = (RHO2+RHO2)/((RHO2-1.0D0)*(RHO-1.0D0))
  54. TST = TST/TOL
  55. C-----------------------------------------------------------------------
  56. C COMPUTE RELATIVE TRUNCATION ERROR INDEX FOR SERIES
  57. C-----------------------------------------------------------------------
  58. AK = AT
  59. DO 10 I=1,80
  60. PTR = P2R
  61. PTI = P2I
  62. P2R = P1R - (CKR*PTR-CKI*PTI)
  63. P2I = P1I - (CKI*PTR+CKR*PTI)
  64. P1R = PTR
  65. P1I = PTI
  66. CKR = CKR + RZR
  67. CKI = CKI + RZI
  68. AP = ZABS(P2R,P2I)
  69. IF (AP.GT.TST*AK*AK) GO TO 20
  70. AK = AK + 1.0D0
  71. 10 CONTINUE
  72. GO TO 110
  73. 20 CONTINUE
  74. I = I + 1
  75. K = 0
  76. IF (INU.LT.IAZ) GO TO 40
  77. C-----------------------------------------------------------------------
  78. C COMPUTE RELATIVE TRUNCATION ERROR FOR RATIOS
  79. C-----------------------------------------------------------------------
  80. P1R = ZEROR
  81. P1I = ZEROI
  82. P2R = CONER
  83. P2I = CONEI
  84. AT = INU + 1.0D0
  85. STR = ZR*RAZ
  86. STI = -ZI*RAZ
  87. CKR = STR*AT*RAZ
  88. CKI = STI*AT*RAZ
  89. ACK = AT*RAZ
  90. TST = SQRT(ACK/TOL)
  91. ITIME = 1
  92. DO 30 K=1,80
  93. PTR = P2R
  94. PTI = P2I
  95. P2R = P1R - (CKR*PTR-CKI*PTI)
  96. P2I = P1I - (CKR*PTI+CKI*PTR)
  97. P1R = PTR
  98. P1I = PTI
  99. CKR = CKR + RZR
  100. CKI = CKI + RZI
  101. AP = ZABS(P2R,P2I)
  102. IF (AP.LT.TST) GO TO 30
  103. IF (ITIME.EQ.2) GO TO 40
  104. ACK = ZABS(CKR,CKI)
  105. FLAM = ACK + SQRT(ACK*ACK-1.0D0)
  106. FKAP = AP/ZABS(P1R,P1I)
  107. RHO = MIN(FLAM,FKAP)
  108. TST = TST*SQRT(RHO/(RHO*RHO-1.0D0))
  109. ITIME = 2
  110. 30 CONTINUE
  111. GO TO 110
  112. 40 CONTINUE
  113. C-----------------------------------------------------------------------
  114. C BACKWARD RECURRENCE AND SUM NORMALIZING RELATION
  115. C-----------------------------------------------------------------------
  116. K = K + 1
  117. KK = MAX(I+IAZ,K+INU)
  118. FKK = KK
  119. P1R = ZEROR
  120. P1I = ZEROI
  121. C-----------------------------------------------------------------------
  122. C SCALE P2 AND SUM BY SCLE
  123. C-----------------------------------------------------------------------
  124. P2R = SCLE
  125. P2I = ZEROI
  126. FNF = FNU - IFNU
  127. TFNF = FNF + FNF
  128. BK = DGAMLN(FKK+TFNF+1.0D0,IDUM) - DGAMLN(FKK+1.0D0,IDUM) -
  129. * DGAMLN(TFNF+1.0D0,IDUM)
  130. BK = EXP(BK)
  131. SUMR = ZEROR
  132. SUMI = ZEROI
  133. KM = KK - INU
  134. DO 50 I=1,KM
  135. PTR = P2R
  136. PTI = P2I
  137. P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
  138. P2I = P1I + (FKK+FNF)*(RZI*PTR+RZR*PTI)
  139. P1R = PTR
  140. P1I = PTI
  141. AK = 1.0D0 - TFNF/(FKK+TFNF)
  142. ACK = BK*AK
  143. SUMR = SUMR + (ACK+BK)*P1R
  144. SUMI = SUMI + (ACK+BK)*P1I
  145. BK = ACK
  146. FKK = FKK - 1.0D0
  147. 50 CONTINUE
  148. YR(N) = P2R
  149. YI(N) = P2I
  150. IF (N.EQ.1) GO TO 70
  151. DO 60 I=2,N
  152. PTR = P2R
  153. PTI = P2I
  154. P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
  155. P2I = P1I + (FKK+FNF)*(RZI*PTR+RZR*PTI)
  156. P1R = PTR
  157. P1I = PTI
  158. AK = 1.0D0 - TFNF/(FKK+TFNF)
  159. ACK = BK*AK
  160. SUMR = SUMR + (ACK+BK)*P1R
  161. SUMI = SUMI + (ACK+BK)*P1I
  162. BK = ACK
  163. FKK = FKK - 1.0D0
  164. M = N - I + 1
  165. YR(M) = P2R
  166. YI(M) = P2I
  167. 60 CONTINUE
  168. 70 CONTINUE
  169. IF (IFNU.LE.0) GO TO 90
  170. DO 80 I=1,IFNU
  171. PTR = P2R
  172. PTI = P2I
  173. P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
  174. P2I = P1I + (FKK+FNF)*(RZR*PTI+RZI*PTR)
  175. P1R = PTR
  176. P1I = PTI
  177. AK = 1.0D0 - TFNF/(FKK+TFNF)
  178. ACK = BK*AK
  179. SUMR = SUMR + (ACK+BK)*P1R
  180. SUMI = SUMI + (ACK+BK)*P1I
  181. BK = ACK
  182. FKK = FKK - 1.0D0
  183. 80 CONTINUE
  184. 90 CONTINUE
  185. PTR = ZR
  186. PTI = ZI
  187. IF (KODE.EQ.2) PTR = ZEROR
  188. CALL ZLOG(RZR, RZI, STR, STI, IDUM)
  189. P1R = -FNF*STR + PTR
  190. P1I = -FNF*STI + PTI
  191. AP = DGAMLN(1.0D0+FNF,IDUM)
  192. PTR = P1R - AP
  193. PTI = P1I
  194. C-----------------------------------------------------------------------
  195. C THE DIVISION CEXP(PT)/(SUM+P2) IS ALTERED TO AVOID OVERFLOW
  196. C IN THE DENOMINATOR BY SQUARING LARGE QUANTITIES
  197. C-----------------------------------------------------------------------
  198. P2R = P2R + SUMR
  199. P2I = P2I + SUMI
  200. AP = ZABS(P2R,P2I)
  201. P1R = 1.0D0/AP
  202. CALL ZEXP(PTR, PTI, STR, STI)
  203. CKR = STR*P1R
  204. CKI = STI*P1R
  205. PTR = P2R*P1R
  206. PTI = -P2I*P1R
  207. CALL ZMLT(CKR, CKI, PTR, PTI, CNORMR, CNORMI)
  208. DO 100 I=1,N
  209. STR = YR(I)*CNORMR - YI(I)*CNORMI
  210. YI(I) = YR(I)*CNORMI + YI(I)*CNORMR
  211. YR(I) = STR
  212. 100 CONTINUE
  213. RETURN
  214. 110 CONTINUE
  215. NZ=-2
  216. RETURN
  217. END