cuoik.f 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. *DECK CUOIK
  2. SUBROUTINE CUOIK (Z, FNU, KODE, IKFLG, N, Y, NUF, TOL, ELIM, ALIM)
  3. C***BEGIN PROLOGUE CUOIK
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to CBESH, CBESI and CBESK
  6. C***LIBRARY SLATEC
  7. C***TYPE ALL (CUOIK-A, ZUOIK-A)
  8. C***AUTHOR Amos, D. E., (SNL)
  9. C***DESCRIPTION
  10. C
  11. C CUOIK COMPUTES THE LEADING TERMS OF THE UNIFORM ASYMPTOTIC
  12. C EXPANSIONS FOR THE I AND K FUNCTIONS AND COMPARES THEM
  13. C (IN LOGARITHMIC FORM) TO ALIM AND ELIM FOR OVER AND UNDERFLOW
  14. C WHERE ALIM.LT.ELIM. IF THE MAGNITUDE, BASED ON THE LEADING
  15. C EXPONENTIAL, IS LESS THAN ALIM OR GREATER THAN -ALIM, THEN
  16. C THE RESULT IS ON SCALE. IF NOT, THEN A REFINED TEST USING OTHER
  17. C MULTIPLIERS (IN LOGARITHMIC FORM) IS MADE BASED ON ELIM. HERE
  18. C EXP(-ELIM)=SMALLEST MACHINE NUMBER*1.0E+3 AND EXP(-ALIM)=
  19. C EXP(-ELIM)/TOL
  20. C
  21. C IKFLG=1 MEANS THE I SEQUENCE IS TESTED
  22. C =2 MEANS THE K SEQUENCE IS TESTED
  23. C NUF = 0 MEANS THE LAST MEMBER OF THE SEQUENCE IS ON SCALE
  24. C =-1 MEANS AN OVERFLOW WOULD OCCUR
  25. C IKFLG=1 AND NUF.GT.0 MEANS THE LAST NUF Y VALUES WERE SET TO ZERO
  26. C THE FIRST N-NUF VALUES MUST BE SET BY ANOTHER ROUTINE
  27. C IKFLG=2 AND NUF.EQ.N MEANS ALL Y VALUES WERE SET TO ZERO
  28. C IKFLG=2 AND 0.LT.NUF.LT.N NOT CONSIDERED. Y MUST BE SET BY
  29. C ANOTHER ROUTINE
  30. C
  31. C***SEE ALSO CBESH, CBESI, CBESK
  32. C***ROUTINES CALLED CUCHK, CUNHJ, CUNIK, R1MACH
  33. C***REVISION HISTORY (YYMMDD)
  34. C 830501 DATE WRITTEN
  35. C 910415 Prologue converted to Version 4.0 format. (BAB)
  36. C***END PROLOGUE CUOIK
  37. COMPLEX ARG, ASUM, BSUM, CWRK, CZ, CZERO, PHI, SUM, Y, Z, ZB,
  38. * ZETA1, ZETA2, ZN, ZR
  39. REAL AARG, AIC, ALIM, APHI, ASCLE, AX, AY, ELIM, FNN, FNU, GNN,
  40. * GNU, RCZ, TOL, X, YY, R1MACH
  41. INTEGER I, IFORM, IKFLG, INIT, KODE, N, NN, NUF, NW
  42. DIMENSION Y(N), CWRK(16)
  43. DATA CZERO / (0.0E0,0.0E0) /
  44. DATA AIC / 1.265512123484645396E+00 /
  45. C***FIRST EXECUTABLE STATEMENT CUOIK
  46. NUF = 0
  47. NN = N
  48. X = REAL(Z)
  49. ZR = Z
  50. IF (X.LT.0.0E0) ZR = -Z
  51. ZB = ZR
  52. YY = AIMAG(ZR)
  53. AX = ABS(X)*1.7321E0
  54. AY = ABS(YY)
  55. IFORM = 1
  56. IF (AY.GT.AX) IFORM = 2
  57. GNU = MAX(FNU,1.0E0)
  58. IF (IKFLG.EQ.1) GO TO 10
  59. FNN = NN
  60. GNN = FNU + FNN - 1.0E0
  61. GNU = MAX(GNN,FNN)
  62. 10 CONTINUE
  63. C-----------------------------------------------------------------------
  64. C ONLY THE MAGNITUDE OF ARG AND PHI ARE NEEDED ALONG WITH THE
  65. C REAL PARTS OF ZETA1, ZETA2 AND ZB. NO ATTEMPT IS MADE TO GET
  66. C THE SIGN OF THE IMAGINARY PART CORRECT.
  67. C-----------------------------------------------------------------------
  68. IF (IFORM.EQ.2) GO TO 20
  69. INIT = 0
  70. CALL CUNIK(ZR, GNU, IKFLG, 1, TOL, INIT, PHI, ZETA1, ZETA2, SUM,
  71. * CWRK)
  72. CZ = -ZETA1 + ZETA2
  73. GO TO 40
  74. 20 CONTINUE
  75. ZN = -ZR*CMPLX(0.0E0,1.0E0)
  76. IF (YY.GT.0.0E0) GO TO 30
  77. ZN = CONJG(-ZN)
  78. 30 CONTINUE
  79. CALL CUNHJ(ZN, GNU, 1, TOL, PHI, ARG, ZETA1, ZETA2, ASUM, BSUM)
  80. CZ = -ZETA1 + ZETA2
  81. AARG = ABS(ARG)
  82. 40 CONTINUE
  83. IF (KODE.EQ.2) CZ = CZ - ZB
  84. IF (IKFLG.EQ.2) CZ = -CZ
  85. APHI = ABS(PHI)
  86. RCZ = REAL(CZ)
  87. C-----------------------------------------------------------------------
  88. C OVERFLOW TEST
  89. C-----------------------------------------------------------------------
  90. IF (RCZ.GT.ELIM) GO TO 170
  91. IF (RCZ.LT.ALIM) GO TO 50
  92. RCZ = RCZ + ALOG(APHI)
  93. IF (IFORM.EQ.2) RCZ = RCZ - 0.25E0*ALOG(AARG) - AIC
  94. IF (RCZ.GT.ELIM) GO TO 170
  95. GO TO 100
  96. 50 CONTINUE
  97. C-----------------------------------------------------------------------
  98. C UNDERFLOW TEST
  99. C-----------------------------------------------------------------------
  100. IF (RCZ.LT.(-ELIM)) GO TO 60
  101. IF (RCZ.GT.(-ALIM)) GO TO 100
  102. RCZ = RCZ + ALOG(APHI)
  103. IF (IFORM.EQ.2) RCZ = RCZ - 0.25E0*ALOG(AARG) - AIC
  104. IF (RCZ.GT.(-ELIM)) GO TO 80
  105. 60 CONTINUE
  106. DO 70 I=1,NN
  107. Y(I) = CZERO
  108. 70 CONTINUE
  109. NUF = NN
  110. RETURN
  111. 80 CONTINUE
  112. ASCLE = 1.0E+3*R1MACH(1)/TOL
  113. CZ = CZ + CLOG(PHI)
  114. IF (IFORM.EQ.1) GO TO 90
  115. CZ = CZ - CMPLX(0.25E0,0.0E0)*CLOG(ARG) - CMPLX(AIC,0.0E0)
  116. 90 CONTINUE
  117. AX = EXP(RCZ)/TOL
  118. AY = AIMAG(CZ)
  119. CZ = CMPLX(AX,0.0E0)*CMPLX(COS(AY),SIN(AY))
  120. CALL CUCHK(CZ, NW, ASCLE, TOL)
  121. IF (NW.EQ.1) GO TO 60
  122. 100 CONTINUE
  123. IF (IKFLG.EQ.2) RETURN
  124. IF (N.EQ.1) RETURN
  125. C-----------------------------------------------------------------------
  126. C SET UNDERFLOWS ON I SEQUENCE
  127. C-----------------------------------------------------------------------
  128. 110 CONTINUE
  129. GNU = FNU + (NN-1)
  130. IF (IFORM.EQ.2) GO TO 120
  131. INIT = 0
  132. CALL CUNIK(ZR, GNU, IKFLG, 1, TOL, INIT, PHI, ZETA1, ZETA2, SUM,
  133. * CWRK)
  134. CZ = -ZETA1 + ZETA2
  135. GO TO 130
  136. 120 CONTINUE
  137. CALL CUNHJ(ZN, GNU, 1, TOL, PHI, ARG, ZETA1, ZETA2, ASUM, BSUM)
  138. CZ = -ZETA1 + ZETA2
  139. AARG = ABS(ARG)
  140. 130 CONTINUE
  141. IF (KODE.EQ.2) CZ = CZ - ZB
  142. APHI = ABS(PHI)
  143. RCZ = REAL(CZ)
  144. IF (RCZ.LT.(-ELIM)) GO TO 140
  145. IF (RCZ.GT.(-ALIM)) RETURN
  146. RCZ = RCZ + ALOG(APHI)
  147. IF (IFORM.EQ.2) RCZ = RCZ - 0.25E0*ALOG(AARG) - AIC
  148. IF (RCZ.GT.(-ELIM)) GO TO 150
  149. 140 CONTINUE
  150. Y(NN) = CZERO
  151. NN = NN - 1
  152. NUF = NUF + 1
  153. IF (NN.EQ.0) RETURN
  154. GO TO 110
  155. 150 CONTINUE
  156. ASCLE = 1.0E+3*R1MACH(1)/TOL
  157. CZ = CZ + CLOG(PHI)
  158. IF (IFORM.EQ.1) GO TO 160
  159. CZ = CZ - CMPLX(0.25E0,0.0E0)*CLOG(ARG) - CMPLX(AIC,0.0E0)
  160. 160 CONTINUE
  161. AX = EXP(RCZ)/TOL
  162. AY = AIMAG(CZ)
  163. CZ = CMPLX(AX,0.0E0)*CMPLX(COS(AY),SIN(AY))
  164. CALL CUCHK(CZ, NW, ASCLE, TOL)
  165. IF (NW.EQ.1) GO TO 140
  166. RETURN
  167. 170 CONTINUE
  168. NUF = -1
  169. RETURN
  170. END