cuni2.f 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. *DECK CUNI2
  2. SUBROUTINE CUNI2 (Z, FNU, KODE, N, Y, NZ, NLAST, FNUL, TOL, ELIM,
  3. + ALIM)
  4. C***BEGIN PROLOGUE CUNI2
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to CBESI and CBESK
  7. C***LIBRARY SLATEC
  8. C***TYPE ALL (CUNI2-A, ZUNI2-A)
  9. C***AUTHOR Amos, D. E., (SNL)
  10. C***DESCRIPTION
  11. C
  12. C CUNI2 COMPUTES I(FNU,Z) IN THE RIGHT HALF PLANE BY MEANS OF
  13. C UNIFORM ASYMPTOTIC EXPANSION FOR J(FNU,ZN) WHERE ZN IS Z*I
  14. C OR -Z*I AND ZN IS IN THE RIGHT HALF PLANE ALSO.
  15. C
  16. C FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
  17. C EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
  18. C NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
  19. C FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
  20. C Y(I)=CZERO FOR I=NLAST+1,N
  21. C
  22. C***SEE ALSO CBESI, CBESK
  23. C***ROUTINES CALLED CAIRY, CUCHK, CUNHJ, CUOIK, R1MACH
  24. C***REVISION HISTORY (YYMMDD)
  25. C 830501 DATE WRITTEN
  26. C 910415 Prologue converted to Version 4.0 format. (BAB)
  27. C***END PROLOGUE CUNI2
  28. COMPLEX AI, ARG, ASUM, BSUM, CFN, CI, CID, CIP, CONE, CRSC, CSCL,
  29. * CSR, CSS, CY, CZERO, C1, C2, DAI, PHI, RZ, S1, S2, Y, Z, ZB,
  30. * ZETA1, ZETA2, ZN, ZAR
  31. REAL AARG, AIC, ALIM, ANG, APHI, ASCLE, AY, BRY, CAR, C2I, C2M,
  32. * C2R, ELIM, FN, FNU, FNUL, HPI, RS1, SAR, TOL, YY, R1MACH
  33. INTEGER I, IFLAG, IN, INU, J, K, KODE, N, NAI, ND, NDAI, NLAST,
  34. * NN, NUF, NW, NZ, IDUM
  35. DIMENSION BRY(3), Y(N), CIP(4), CSS(3), CSR(3), CY(2)
  36. DATA CZERO,CONE,CI/(0.0E0,0.0E0),(1.0E0,0.0E0),(0.0E0,1.0E0)/
  37. DATA CIP(1),CIP(2),CIP(3),CIP(4)/
  38. 1 (1.0E0,0.0E0), (0.0E0,1.0E0), (-1.0E0,0.0E0), (0.0E0,-1.0E0)/
  39. DATA HPI, AIC /
  40. 1 1.57079632679489662E+00, 1.265512123484645396E+00/
  41. C***FIRST EXECUTABLE STATEMENT CUNI2
  42. NZ = 0
  43. ND = N
  44. NLAST = 0
  45. C-----------------------------------------------------------------------
  46. C COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
  47. C NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
  48. C EXP(ALIM)=EXP(ELIM)*TOL
  49. C-----------------------------------------------------------------------
  50. CSCL = CMPLX(1.0E0/TOL,0.0E0)
  51. CRSC = CMPLX(TOL,0.0E0)
  52. CSS(1) = CSCL
  53. CSS(2) = CONE
  54. CSS(3) = CRSC
  55. CSR(1) = CRSC
  56. CSR(2) = CONE
  57. CSR(3) = CSCL
  58. BRY(1) = 1.0E+3*R1MACH(1)/TOL
  59. YY = AIMAG(Z)
  60. C-----------------------------------------------------------------------
  61. C ZN IS IN THE RIGHT HALF PLANE AFTER ROTATION BY CI OR -CI
  62. C-----------------------------------------------------------------------
  63. ZN = -Z*CI
  64. ZB = Z
  65. CID = -CI
  66. INU = FNU
  67. ANG = HPI*(FNU-INU)
  68. CAR = COS(ANG)
  69. SAR = SIN(ANG)
  70. C2 = CMPLX(CAR,SAR)
  71. ZAR = C2
  72. IN = INU + N - 1
  73. IN = MOD(IN,4)
  74. C2 = C2*CIP(IN+1)
  75. IF (YY.GT.0.0E0) GO TO 10
  76. ZN = CONJG(-ZN)
  77. ZB = CONJG(ZB)
  78. CID = -CID
  79. C2 = CONJG(C2)
  80. 10 CONTINUE
  81. C-----------------------------------------------------------------------
  82. C CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
  83. C-----------------------------------------------------------------------
  84. FN = MAX(FNU,1.0E0)
  85. CALL CUNHJ(ZN, FN, 1, TOL, PHI, ARG, ZETA1, ZETA2, ASUM, BSUM)
  86. IF (KODE.EQ.1) GO TO 20
  87. CFN = CMPLX(FNU,0.0E0)
  88. S1 = -ZETA1 + CFN*(CFN/(ZB+ZETA2))
  89. GO TO 30
  90. 20 CONTINUE
  91. S1 = -ZETA1 + ZETA2
  92. 30 CONTINUE
  93. RS1 = REAL(S1)
  94. IF (ABS(RS1).GT.ELIM) GO TO 150
  95. 40 CONTINUE
  96. NN = MIN(2,ND)
  97. DO 90 I=1,NN
  98. FN = FNU + (ND-I)
  99. CALL CUNHJ(ZN, FN, 0, TOL, PHI, ARG, ZETA1, ZETA2, ASUM, BSUM)
  100. IF (KODE.EQ.1) GO TO 50
  101. CFN = CMPLX(FN,0.0E0)
  102. AY = ABS(YY)
  103. S1 = -ZETA1 + CFN*(CFN/(ZB+ZETA2)) + CMPLX(0.0E0,AY)
  104. GO TO 60
  105. 50 CONTINUE
  106. S1 = -ZETA1 + ZETA2
  107. 60 CONTINUE
  108. C-----------------------------------------------------------------------
  109. C TEST FOR UNDERFLOW AND OVERFLOW
  110. C-----------------------------------------------------------------------
  111. RS1 = REAL(S1)
  112. IF (ABS(RS1).GT.ELIM) GO TO 120
  113. IF (I.EQ.1) IFLAG = 2
  114. IF (ABS(RS1).LT.ALIM) GO TO 70
  115. C-----------------------------------------------------------------------
  116. C REFINE TEST AND SCALE
  117. C-----------------------------------------------------------------------
  118. C-----------------------------------------------------------------------
  119. APHI = ABS(PHI)
  120. AARG = ABS(ARG)
  121. RS1 = RS1 + ALOG(APHI) - 0.25E0*ALOG(AARG) - AIC
  122. IF (ABS(RS1).GT.ELIM) GO TO 120
  123. IF (I.EQ.1) IFLAG = 1
  124. IF (RS1.LT.0.0E0) GO TO 70
  125. IF (I.EQ.1) IFLAG = 3
  126. 70 CONTINUE
  127. C-----------------------------------------------------------------------
  128. C SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
  129. C EXPONENT EXTREMES
  130. C-----------------------------------------------------------------------
  131. CALL CAIRY(ARG, 0, 2, AI, NAI, IDUM)
  132. CALL CAIRY(ARG, 1, 2, DAI, NDAI, IDUM)
  133. S2 = PHI*(AI*ASUM+DAI*BSUM)
  134. C2R = REAL(S1)
  135. C2I = AIMAG(S1)
  136. C2M = EXP(C2R)*REAL(CSS(IFLAG))
  137. S1 = CMPLX(C2M,0.0E0)*CMPLX(COS(C2I),SIN(C2I))
  138. S2 = S2*S1
  139. IF (IFLAG.NE.1) GO TO 80
  140. CALL CUCHK(S2, NW, BRY(1), TOL)
  141. IF (NW.NE.0) GO TO 120
  142. 80 CONTINUE
  143. IF (YY.LE.0.0E0) S2 = CONJG(S2)
  144. J = ND - I + 1
  145. S2 = S2*C2
  146. CY(I) = S2
  147. Y(J) = S2*CSR(IFLAG)
  148. C2 = C2*CID
  149. 90 CONTINUE
  150. IF (ND.LE.2) GO TO 110
  151. RZ = CMPLX(2.0E0,0.0E0)/Z
  152. BRY(2) = 1.0E0/BRY(1)
  153. BRY(3) = R1MACH(2)
  154. S1 = CY(1)
  155. S2 = CY(2)
  156. C1 = CSR(IFLAG)
  157. ASCLE = BRY(IFLAG)
  158. K = ND - 2
  159. FN = K
  160. DO 100 I=3,ND
  161. C2 = S2
  162. S2 = S1 + CMPLX(FNU+FN,0.0E0)*RZ*S2
  163. S1 = C2
  164. C2 = S2*C1
  165. Y(K) = C2
  166. K = K - 1
  167. FN = FN - 1.0E0
  168. IF (IFLAG.GE.3) GO TO 100
  169. C2R = REAL(C2)
  170. C2I = AIMAG(C2)
  171. C2R = ABS(C2R)
  172. C2I = ABS(C2I)
  173. C2M = MAX(C2R,C2I)
  174. IF (C2M.LE.ASCLE) GO TO 100
  175. IFLAG = IFLAG + 1
  176. ASCLE = BRY(IFLAG)
  177. S1 = S1*C1
  178. S2 = C2
  179. S1 = S1*CSS(IFLAG)
  180. S2 = S2*CSS(IFLAG)
  181. C1 = CSR(IFLAG)
  182. 100 CONTINUE
  183. 110 CONTINUE
  184. RETURN
  185. 120 CONTINUE
  186. IF (RS1.GT.0.0E0) GO TO 140
  187. C-----------------------------------------------------------------------
  188. C SET UNDERFLOW AND UPDATE PARAMETERS
  189. C-----------------------------------------------------------------------
  190. Y(ND) = CZERO
  191. NZ = NZ + 1
  192. ND = ND - 1
  193. IF (ND.EQ.0) GO TO 110
  194. CALL CUOIK(Z, FNU, KODE, 1, ND, Y, NUF, TOL, ELIM, ALIM)
  195. IF (NUF.LT.0) GO TO 140
  196. ND = ND - NUF
  197. NZ = NZ + NUF
  198. IF (ND.EQ.0) GO TO 110
  199. FN = FNU + (ND-1)
  200. IF (FN.LT.FNUL) GO TO 130
  201. C FN = AIMAG(CID)
  202. C J = NUF + 1
  203. C K = MOD(J,4) + 1
  204. C S1 = CIP(K)
  205. C IF (FN.LT.0.0E0) S1 = CONJG(S1)
  206. C C2 = C2*S1
  207. IN = INU + ND - 1
  208. IN = MOD(IN,4) + 1
  209. C2 = ZAR*CIP(IN)
  210. IF (YY.LE.0.0E0)C2=CONJG(C2)
  211. GO TO 40
  212. 130 CONTINUE
  213. NLAST = ND
  214. RETURN
  215. 140 CONTINUE
  216. NZ = -1
  217. RETURN
  218. 150 CONTINUE
  219. IF (RS1.GT.0.0E0) GO TO 140
  220. NZ = N
  221. DO 160 I=1,N
  222. Y(I) = CZERO
  223. 160 CONTINUE
  224. RETURN
  225. END