cuni1.f 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. *DECK CUNI1
  2. SUBROUTINE CUNI1 (Z, FNU, KODE, N, Y, NZ, NLAST, FNUL, TOL, ELIM,
  3. + ALIM)
  4. C***BEGIN PROLOGUE CUNI1
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to CBESI and CBESK
  7. C***LIBRARY SLATEC
  8. C***TYPE ALL (CUNI1-A, ZUNI1-A)
  9. C***AUTHOR Amos, D. E., (SNL)
  10. C***DESCRIPTION
  11. C
  12. C CUNI1 COMPUTES I(FNU,Z) BY MEANS OF THE UNIFORM ASYMPTOTIC
  13. C EXPANSION FOR I(FNU,Z) IN -PI/3.LE.ARG Z.LE.PI/3.
  14. C
  15. C FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
  16. C EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
  17. C NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
  18. C FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
  19. C Y(I)=CZERO FOR I=NLAST+1,N
  20. C
  21. C***SEE ALSO CBESI, CBESK
  22. C***ROUTINES CALLED CUCHK, CUNIK, CUOIK, R1MACH
  23. C***REVISION HISTORY (YYMMDD)
  24. C 830501 DATE WRITTEN
  25. C 910415 Prologue converted to Version 4.0 format. (BAB)
  26. C***END PROLOGUE CUNI1
  27. COMPLEX CFN, CONE, CRSC, CSCL, CSR, CSS, CWRK, CZERO, C1, C2,
  28. * PHI, RZ, SUM, S1, S2, Y, Z, ZETA1, ZETA2, CY
  29. REAL ALIM, APHI, ASCLE, BRY, C2I, C2M, C2R, ELIM, FN, FNU, FNUL,
  30. * RS1, TOL, YY, R1MACH
  31. INTEGER I, IFLAG, INIT, K, KODE, M, N, ND, NLAST, NN, NUF, NW, NZ
  32. DIMENSION BRY(3), Y(N), CWRK(16), CSS(3), CSR(3), CY(2)
  33. DATA CZERO, CONE / (0.0E0,0.0E0), (1.0E0,0.0E0) /
  34. C***FIRST EXECUTABLE STATEMENT CUNI1
  35. NZ = 0
  36. ND = N
  37. NLAST = 0
  38. C-----------------------------------------------------------------------
  39. C COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
  40. C NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
  41. C EXP(ALIM)=EXP(ELIM)*TOL
  42. C-----------------------------------------------------------------------
  43. CSCL = CMPLX(1.0E0/TOL,0.0E0)
  44. CRSC = CMPLX(TOL,0.0E0)
  45. CSS(1) = CSCL
  46. CSS(2) = CONE
  47. CSS(3) = CRSC
  48. CSR(1) = CRSC
  49. CSR(2) = CONE
  50. CSR(3) = CSCL
  51. BRY(1) = 1.0E+3*R1MACH(1)/TOL
  52. C-----------------------------------------------------------------------
  53. C CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
  54. C-----------------------------------------------------------------------
  55. FN = MAX(FNU,1.0E0)
  56. INIT = 0
  57. CALL CUNIK(Z, FN, 1, 1, TOL, INIT, PHI, ZETA1, ZETA2, SUM, CWRK)
  58. IF (KODE.EQ.1) GO TO 10
  59. CFN = CMPLX(FN,0.0E0)
  60. S1 = -ZETA1 + CFN*(CFN/(Z+ZETA2))
  61. GO TO 20
  62. 10 CONTINUE
  63. S1 = -ZETA1 + ZETA2
  64. 20 CONTINUE
  65. RS1 = REAL(S1)
  66. IF (ABS(RS1).GT.ELIM) GO TO 130
  67. 30 CONTINUE
  68. NN = MIN(2,ND)
  69. DO 80 I=1,NN
  70. FN = FNU + (ND-I)
  71. INIT = 0
  72. CALL CUNIK(Z, FN, 1, 0, TOL, INIT, PHI, ZETA1, ZETA2, SUM, CWRK)
  73. IF (KODE.EQ.1) GO TO 40
  74. CFN = CMPLX(FN,0.0E0)
  75. YY = AIMAG(Z)
  76. S1 = -ZETA1 + CFN*(CFN/(Z+ZETA2)) + CMPLX(0.0E0,YY)
  77. GO TO 50
  78. 40 CONTINUE
  79. S1 = -ZETA1 + ZETA2
  80. 50 CONTINUE
  81. C-----------------------------------------------------------------------
  82. C TEST FOR UNDERFLOW AND OVERFLOW
  83. C-----------------------------------------------------------------------
  84. RS1 = REAL(S1)
  85. IF (ABS(RS1).GT.ELIM) GO TO 110
  86. IF (I.EQ.1) IFLAG = 2
  87. IF (ABS(RS1).LT.ALIM) GO TO 60
  88. C-----------------------------------------------------------------------
  89. C REFINE TEST AND SCALE
  90. C-----------------------------------------------------------------------
  91. APHI = ABS(PHI)
  92. RS1 = RS1 + ALOG(APHI)
  93. IF (ABS(RS1).GT.ELIM) GO TO 110
  94. IF (I.EQ.1) IFLAG = 1
  95. IF (RS1.LT.0.0E0) GO TO 60
  96. IF (I.EQ.1) IFLAG = 3
  97. 60 CONTINUE
  98. C-----------------------------------------------------------------------
  99. C SCALE S1 IF ABS(S1).LT.ASCLE
  100. C-----------------------------------------------------------------------
  101. S2 = PHI*SUM
  102. C2R = REAL(S1)
  103. C2I = AIMAG(S1)
  104. C2M = EXP(C2R)*REAL(CSS(IFLAG))
  105. S1 = CMPLX(C2M,0.0E0)*CMPLX(COS(C2I),SIN(C2I))
  106. S2 = S2*S1
  107. IF (IFLAG.NE.1) GO TO 70
  108. CALL CUCHK(S2, NW, BRY(1), TOL)
  109. IF (NW.NE.0) GO TO 110
  110. 70 CONTINUE
  111. M = ND - I + 1
  112. CY(I) = S2
  113. Y(M) = S2*CSR(IFLAG)
  114. 80 CONTINUE
  115. IF (ND.LE.2) GO TO 100
  116. RZ = CMPLX(2.0E0,0.0E0)/Z
  117. BRY(2) = 1.0E0/BRY(1)
  118. BRY(3) = R1MACH(2)
  119. S1 = CY(1)
  120. S2 = CY(2)
  121. C1 = CSR(IFLAG)
  122. ASCLE = BRY(IFLAG)
  123. K = ND - 2
  124. FN = K
  125. DO 90 I=3,ND
  126. C2 = S2
  127. S2 = S1 + CMPLX(FNU+FN,0.0E0)*RZ*S2
  128. S1 = C2
  129. C2 = S2*C1
  130. Y(K) = C2
  131. K = K - 1
  132. FN = FN - 1.0E0
  133. IF (IFLAG.GE.3) GO TO 90
  134. C2R = REAL(C2)
  135. C2I = AIMAG(C2)
  136. C2R = ABS(C2R)
  137. C2I = ABS(C2I)
  138. C2M = MAX(C2R,C2I)
  139. IF (C2M.LE.ASCLE) GO TO 90
  140. IFLAG = IFLAG + 1
  141. ASCLE = BRY(IFLAG)
  142. S1 = S1*C1
  143. S2 = C2
  144. S1 = S1*CSS(IFLAG)
  145. S2 = S2*CSS(IFLAG)
  146. C1 = CSR(IFLAG)
  147. 90 CONTINUE
  148. 100 CONTINUE
  149. RETURN
  150. C-----------------------------------------------------------------------
  151. C SET UNDERFLOW AND UPDATE PARAMETERS
  152. C-----------------------------------------------------------------------
  153. 110 CONTINUE
  154. IF (RS1.GT.0.0E0) GO TO 120
  155. Y(ND) = CZERO
  156. NZ = NZ + 1
  157. ND = ND - 1
  158. IF (ND.EQ.0) GO TO 100
  159. CALL CUOIK(Z, FNU, KODE, 1, ND, Y, NUF, TOL, ELIM, ALIM)
  160. IF (NUF.LT.0) GO TO 120
  161. ND = ND - NUF
  162. NZ = NZ + NUF
  163. IF (ND.EQ.0) GO TO 100
  164. FN = FNU + (ND-1)
  165. IF (FN.GE.FNUL) GO TO 30
  166. NLAST = ND
  167. RETURN
  168. 120 CONTINUE
  169. NZ = -1
  170. RETURN
  171. 130 CONTINUE
  172. IF (RS1.GT.0.0E0) GO TO 120
  173. NZ = N
  174. DO 140 I=1,N
  175. Y(I) = CZERO
  176. 140 CONTINUE
  177. RETURN
  178. END