crati.f 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. *DECK CRATI
  2. SUBROUTINE CRATI (Z, FNU, N, CY, TOL)
  3. C***BEGIN PROLOGUE CRATI
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to CBESH, CBESI and CBESK
  6. C***LIBRARY SLATEC
  7. C***TYPE ALL (CRATI-A, ZRATI-A)
  8. C***AUTHOR Amos, D. E., (SNL)
  9. C***DESCRIPTION
  10. C
  11. C CRATI COMPUTES RATIOS OF I BESSEL FUNCTIONS BY BACKWARD
  12. C RECURRENCE. THE STARTING INDEX IS DETERMINED BY FORWARD
  13. C RECURRENCE AS DESCRIBED IN J. RES. OF NAT. BUR. OF STANDARDS-B,
  14. C MATHEMATICAL SCIENCES, VOL 77B, P111-114, SEPTEMBER, 1973,
  15. C BESSEL FUNCTIONS I AND J OF COMPLEX ARGUMENT AND INTEGER ORDER,
  16. C BY D. J. SOOKNE.
  17. C
  18. C***SEE ALSO CBESH, CBESI, CBESK
  19. C***ROUTINES CALLED (NONE)
  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 CRATI
  24. COMPLEX CDFNU, CONE, CY, CZERO, PT, P1, P2, RZ, T1, Z
  25. REAL AK, AMAGZ, AP1, AP2, ARG, AZ, DFNU, FDNU, FLAM, FNU, FNUP,
  26. * RAP1, RHO, TEST, TEST1, TOL
  27. INTEGER I, ID, IDNU, INU, ITIME, K, KK, MAGZ, N
  28. DIMENSION CY(N)
  29. DATA CZERO, CONE / (0.0E0,0.0E0), (1.0E0,0.0E0) /
  30. C***FIRST EXECUTABLE STATEMENT CRATI
  31. AZ = ABS(Z)
  32. INU = FNU
  33. IDNU = INU + N - 1
  34. FDNU = IDNU
  35. MAGZ = AZ
  36. AMAGZ = MAGZ+1
  37. FNUP = MAX(AMAGZ,FDNU)
  38. ID = IDNU - MAGZ - 1
  39. ITIME = 1
  40. K = 1
  41. RZ = (CONE+CONE)/Z
  42. T1 = CMPLX(FNUP,0.0E0)*RZ
  43. P2 = -T1
  44. P1 = CONE
  45. T1 = T1 + RZ
  46. IF (ID.GT.0) ID = 0
  47. AP2 = ABS(P2)
  48. AP1 = ABS(P1)
  49. C-----------------------------------------------------------------------
  50. C THE OVERFLOW TEST ON K(FNU+I-1,Z) BEFORE THE CALL TO CBKNX
  51. C GUARANTEES THAT P2 IS ON SCALE. SCALE TEST1 AND ALL SUBSEQUENT
  52. C P2 VALUES BY AP1 TO ENSURE THAT AN OVERFLOW DOES NOT OCCUR
  53. C PREMATURELY.
  54. C-----------------------------------------------------------------------
  55. ARG = (AP2+AP2)/(AP1*TOL)
  56. TEST1 = SQRT(ARG)
  57. TEST = TEST1
  58. RAP1 = 1.0E0/AP1
  59. P1 = P1*CMPLX(RAP1,0.0E0)
  60. P2 = P2*CMPLX(RAP1,0.0E0)
  61. AP2 = AP2*RAP1
  62. 10 CONTINUE
  63. K = K + 1
  64. AP1 = AP2
  65. PT = P2
  66. P2 = P1 - T1*P2
  67. P1 = PT
  68. T1 = T1 + RZ
  69. AP2 = ABS(P2)
  70. IF (AP1.LE.TEST) GO TO 10
  71. IF (ITIME.EQ.2) GO TO 20
  72. AK = ABS(T1)*0.5E0
  73. FLAM = AK + SQRT(AK*AK-1.0E0)
  74. RHO = MIN(AP2/AP1,FLAM)
  75. TEST = TEST1*SQRT(RHO/(RHO*RHO-1.0E0))
  76. ITIME = 2
  77. GO TO 10
  78. 20 CONTINUE
  79. KK = K + 1 - ID
  80. AK = KK
  81. DFNU = FNU + (N-1)
  82. CDFNU = CMPLX(DFNU,0.0E0)
  83. T1 = CMPLX(AK,0.0E0)
  84. P1 = CMPLX(1.0E0/AP2,0.0E0)
  85. P2 = CZERO
  86. DO 30 I=1,KK
  87. PT = P1
  88. P1 = RZ*(CDFNU+T1)*P1 + P2
  89. P2 = PT
  90. T1 = T1 - CONE
  91. 30 CONTINUE
  92. IF (REAL(P1).NE.0.0E0 .OR. AIMAG(P1).NE.0.0E0) GO TO 40
  93. P1 = CMPLX(TOL,TOL)
  94. 40 CONTINUE
  95. CY(N) = P2/P1
  96. IF (N.EQ.1) RETURN
  97. K = N - 1
  98. AK = K
  99. T1 = CMPLX(AK,0.0E0)
  100. CDFNU = CMPLX(FNU,0.0E0)*RZ
  101. DO 60 I=2,N
  102. PT = CDFNU + T1*RZ + CY(K+1)
  103. IF (REAL(PT).NE.0.0E0 .OR. AIMAG(PT).NE.0.0E0) GO TO 50
  104. PT = CMPLX(TOL,TOL)
  105. 50 CONTINUE
  106. CY(K) = CONE/PT
  107. T1 = T1 - CONE
  108. K = K - 1
  109. 60 CONTINUE
  110. RETURN
  111. END