cunk2.f 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. *DECK CUNK2
  2. SUBROUTINE CUNK2 (Z, FNU, KODE, MR, N, Y, NZ, TOL, ELIM, ALIM)
  3. C***BEGIN PROLOGUE CUNK2
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to CBESK
  6. C***LIBRARY SLATEC
  7. C***TYPE ALL (CUNK2-A, ZUNK2-A)
  8. C***AUTHOR Amos, D. E., (SNL)
  9. C***DESCRIPTION
  10. C
  11. C CUNK2 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE
  12. C RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE
  13. C UNIFORM ASYMPTOTIC EXPANSIONS FOR H(KIND,FNU,ZN) AND J(FNU,ZN)
  14. C WHERE ZN IS IN THE RIGHT HALF PLANE, KIND=(3-MR)/2, MR=+1 OR
  15. C -1. HERE ZN=ZR*I OR -ZR*I WHERE ZR=Z IF Z IS IN THE RIGHT
  16. C HALF PLANE OR ZR=-Z IF Z IS IN THE LEFT HALF PLANE. MR INDIC-
  17. C ATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION.
  18. C NZ=-1 MEANS AN OVERFLOW WILL OCCUR
  19. C
  20. C***SEE ALSO CBESK
  21. C***ROUTINES CALLED CAIRY, CS1S2, CUCHK, CUNHJ, R1MACH
  22. C***REVISION HISTORY (YYMMDD)
  23. C 830501 DATE WRITTEN
  24. C 910415 Prologue converted to Version 4.0 format. (BAB)
  25. C***END PROLOGUE CUNK2
  26. COMPLEX AI, ARG, ASUM, BSUM, CFN, CI, CIP,
  27. * CK, CONE, CRSC, CR1, CR2, CS, CSCL, CSGN, CSPN, CSR, CSS, CY,
  28. * CZERO, C1, C2, DAI, PHI, RZ, S1, S2, Y, Z, ZB, ZETA1,
  29. * ZETA2, ZN, ZR, PHID, ARGD, ZETA1D, ZETA2D, ASUMD, BSUMD
  30. REAL AARG, AIC, ALIM, ANG, APHI, ASC, ASCLE, BRY, CAR, CPN, C2I,
  31. * C2M, C2R, ELIM, FMR, FN, FNF, FNU, HPI, PI, RS1, SAR, SGN, SPN,
  32. * TOL, X, YY, R1MACH
  33. INTEGER I, IB, IFLAG, IFN, IL, IN, INU, IUF, K, KDFLG, KFLAG, KK,
  34. * KODE, MR, N, NAI, NDAI, NW, NZ, IDUM, J, IPARD, IC
  35. DIMENSION BRY(3), Y(N), ASUM(2), BSUM(2), PHI(2), ARG(2),
  36. * ZETA1(2), ZETA2(2), CY(2), CIP(4), CSS(3), CSR(3)
  37. DATA CZERO, CONE, CI, CR1, CR2 /
  38. 1 (0.0E0,0.0E0),(1.0E0,0.0E0),(0.0E0,1.0E0),
  39. 1(1.0E0,1.73205080756887729E0),(-0.5E0,-8.66025403784438647E-01)/
  40. DATA HPI, PI, AIC /
  41. 1 1.57079632679489662E+00, 3.14159265358979324E+00,
  42. 1 1.26551212348464539E+00/
  43. DATA CIP(1),CIP(2),CIP(3),CIP(4)/
  44. 1 (1.0E0,0.0E0), (0.0E0,-1.0E0), (-1.0E0,0.0E0), (0.0E0,1.0E0)/
  45. C***FIRST EXECUTABLE STATEMENT CUNK2
  46. KDFLG = 1
  47. NZ = 0
  48. C-----------------------------------------------------------------------
  49. C EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION GREATER THAN
  50. C THE UNDERFLOW LIMIT
  51. C-----------------------------------------------------------------------
  52. CSCL = CMPLX(1.0E0/TOL,0.0E0)
  53. CRSC = CMPLX(TOL,0.0E0)
  54. CSS(1) = CSCL
  55. CSS(2) = CONE
  56. CSS(3) = CRSC
  57. CSR(1) = CRSC
  58. CSR(2) = CONE
  59. CSR(3) = CSCL
  60. BRY(1) = 1.0E+3*R1MACH(1)/TOL
  61. BRY(2) = 1.0E0/BRY(1)
  62. BRY(3) = R1MACH(2)
  63. X = REAL(Z)
  64. ZR = Z
  65. IF (X.LT.0.0E0) ZR = -Z
  66. YY = AIMAG(ZR)
  67. ZN = -ZR*CI
  68. ZB = ZR
  69. INU = FNU
  70. FNF = FNU - INU
  71. ANG = -HPI*FNF
  72. CAR = COS(ANG)
  73. SAR = SIN(ANG)
  74. CPN = -HPI*CAR
  75. SPN = -HPI*SAR
  76. C2 = CMPLX(-SPN,CPN)
  77. KK = MOD(INU,4) + 1
  78. CS = CR1*C2*CIP(KK)
  79. IF (YY.GT.0.0E0) GO TO 10
  80. ZN = CONJG(-ZN)
  81. ZB = CONJG(ZB)
  82. 10 CONTINUE
  83. C-----------------------------------------------------------------------
  84. C K(FNU,Z) IS COMPUTED FROM H(2,FNU,-I*Z) WHERE Z IS IN THE FIRST
  85. C QUADRANT. FOURTH QUADRANT VALUES (YY.LE.0.0E0) ARE COMPUTED BY
  86. C CONJUGATION SINCE THE K FUNCTION IS REAL ON THE POSITIVE REAL AXIS
  87. C-----------------------------------------------------------------------
  88. J = 2
  89. DO 70 I=1,N
  90. C-----------------------------------------------------------------------
  91. C J FLIP FLOPS BETWEEN 1 AND 2 IN J = 3 - J
  92. C-----------------------------------------------------------------------
  93. J = 3 - J
  94. FN = FNU + (I-1)
  95. CALL CUNHJ(ZN, FN, 0, TOL, PHI(J), ARG(J), ZETA1(J), ZETA2(J),
  96. * ASUM(J), BSUM(J))
  97. IF (KODE.EQ.1) GO TO 20
  98. CFN = CMPLX(FN,0.0E0)
  99. S1 = ZETA1(J) - CFN*(CFN/(ZB+ZETA2(J)))
  100. GO TO 30
  101. 20 CONTINUE
  102. S1 = ZETA1(J) - ZETA2(J)
  103. 30 CONTINUE
  104. C-----------------------------------------------------------------------
  105. C TEST FOR UNDERFLOW AND OVERFLOW
  106. C-----------------------------------------------------------------------
  107. RS1 = REAL(S1)
  108. IF (ABS(RS1).GT.ELIM) GO TO 60
  109. IF (KDFLG.EQ.1) KFLAG = 2
  110. IF (ABS(RS1).LT.ALIM) GO TO 40
  111. C-----------------------------------------------------------------------
  112. C REFINE TEST AND SCALE
  113. C-----------------------------------------------------------------------
  114. APHI = ABS(PHI(J))
  115. AARG = ABS(ARG(J))
  116. RS1 = RS1 + ALOG(APHI) - 0.25E0*ALOG(AARG) - AIC
  117. IF (ABS(RS1).GT.ELIM) GO TO 60
  118. IF (KDFLG.EQ.1) KFLAG = 1
  119. IF (RS1.LT.0.0E0) GO TO 40
  120. IF (KDFLG.EQ.1) KFLAG = 3
  121. 40 CONTINUE
  122. C-----------------------------------------------------------------------
  123. C SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
  124. C EXPONENT EXTREMES
  125. C-----------------------------------------------------------------------
  126. C2 = ARG(J)*CR2
  127. CALL CAIRY(C2, 0, 2, AI, NAI, IDUM)
  128. CALL CAIRY(C2, 1, 2, DAI, NDAI, IDUM)
  129. S2 = CS*PHI(J)*(AI*ASUM(J)+CR2*DAI*BSUM(J))
  130. C2R = REAL(S1)
  131. C2I = AIMAG(S1)
  132. C2M = EXP(C2R)*REAL(CSS(KFLAG))
  133. S1 = CMPLX(C2M,0.0E0)*CMPLX(COS(C2I),SIN(C2I))
  134. S2 = S2*S1
  135. IF (KFLAG.NE.1) GO TO 50
  136. CALL CUCHK(S2, NW, BRY(1), TOL)
  137. IF (NW.NE.0) GO TO 60
  138. 50 CONTINUE
  139. IF (YY.LE.0.0E0) S2 = CONJG(S2)
  140. CY(KDFLG) = S2
  141. Y(I) = S2*CSR(KFLAG)
  142. CS = -CI*CS
  143. IF (KDFLG.EQ.2) GO TO 75
  144. KDFLG = 2
  145. GO TO 70
  146. 60 CONTINUE
  147. IF (RS1.GT.0.0E0) GO TO 300
  148. C-----------------------------------------------------------------------
  149. C FOR X.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
  150. C-----------------------------------------------------------------------
  151. IF (X.LT.0.0E0) GO TO 300
  152. KDFLG = 1
  153. Y(I) = CZERO
  154. CS = -CI*CS
  155. NZ=NZ+1
  156. IF (I.EQ.1) GO TO 70
  157. IF (Y(I-1).EQ.CZERO) GO TO 70
  158. Y(I-1) = CZERO
  159. NZ=NZ+1
  160. 70 CONTINUE
  161. I=N
  162. 75 CONTINUE
  163. RZ = CMPLX(2.0E0,0.0E0)/ZR
  164. CK = CMPLX(FN,0.0E0)*RZ
  165. IB = I + 1
  166. IF (N.LT.IB) GO TO 170
  167. C-----------------------------------------------------------------------
  168. C TEST LAST MEMBER FOR UNDERFLOW AND OVERFLOW, SET SEQUENCE TO ZERO
  169. C ON UNDERFLOW
  170. C-----------------------------------------------------------------------
  171. FN = FNU+(N-1)
  172. IPARD = 1
  173. IF (MR.NE.0) IPARD = 0
  174. CALL CUNHJ(ZN,FN,IPARD,TOL,PHID,ARGD,ZETA1D,ZETA2D,ASUMD,BSUMD)
  175. IF (KODE.EQ.1) GO TO 80
  176. CFN=CMPLX(FN,0.0E0)
  177. S1=ZETA1D-CFN*(CFN/(ZB+ZETA2D))
  178. GO TO 90
  179. 80 CONTINUE
  180. S1=ZETA1D-ZETA2D
  181. 90 CONTINUE
  182. RS1=REAL(S1)
  183. IF (ABS(RS1).GT.ELIM) GO TO 95
  184. IF (ABS(RS1).LT.ALIM) GO TO 100
  185. C-----------------------------------------------------------------------
  186. C REFINE ESTIMATE AND TEST
  187. C-----------------------------------------------------------------------
  188. APHI=ABS(PHID)
  189. AARG = ABS(ARGD)
  190. RS1=RS1+ALOG(APHI)-0.25E0*ALOG(AARG)-AIC
  191. IF (ABS(RS1).LT.ELIM) GO TO 100
  192. 95 CONTINUE
  193. IF (RS1.GT.0.0E0) GO TO 300
  194. C-----------------------------------------------------------------------
  195. C FOR X.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
  196. C-----------------------------------------------------------------------
  197. IF (X.LT.0.0E0) GO TO 300
  198. NZ=N
  199. DO 96 I=1,N
  200. Y(I) = CZERO
  201. 96 CONTINUE
  202. RETURN
  203. 100 CONTINUE
  204. C-----------------------------------------------------------------------
  205. C SCALED FORWARD RECURRENCE FOR REMAINDER OF THE SEQUENCE
  206. C-----------------------------------------------------------------------
  207. S1 = CY(1)
  208. S2 = CY(2)
  209. C1 = CSR(KFLAG)
  210. ASCLE = BRY(KFLAG)
  211. DO 120 I=IB,N
  212. C2 = S2
  213. S2 = CK*S2 + S1
  214. S1 = C2
  215. CK = CK + RZ
  216. C2 = S2*C1
  217. Y(I) = C2
  218. IF (KFLAG.GE.3) GO TO 120
  219. C2R = REAL(C2)
  220. C2I = AIMAG(C2)
  221. C2R = ABS(C2R)
  222. C2I = ABS(C2I)
  223. C2M = MAX(C2R,C2I)
  224. IF (C2M.LE.ASCLE) GO TO 120
  225. KFLAG = KFLAG + 1
  226. ASCLE = BRY(KFLAG)
  227. S1 = S1*C1
  228. S2 = C2
  229. S1 = S1*CSS(KFLAG)
  230. S2 = S2*CSS(KFLAG)
  231. C1 = CSR(KFLAG)
  232. 120 CONTINUE
  233. 170 CONTINUE
  234. IF (MR.EQ.0) RETURN
  235. C-----------------------------------------------------------------------
  236. C ANALYTIC CONTINUATION FOR RE(Z).LT.0.0E0
  237. C-----------------------------------------------------------------------
  238. NZ = 0
  239. FMR = MR
  240. SGN = -SIGN(PI,FMR)
  241. C-----------------------------------------------------------------------
  242. C CSPN AND CSGN ARE COEFF OF K AND I FUNCTIONS RESP.
  243. C-----------------------------------------------------------------------
  244. CSGN = CMPLX(0.0E0,SGN)
  245. IF (YY.LE.0.0E0) CSGN = CONJG(CSGN)
  246. IFN = INU + N - 1
  247. ANG = FNF*SGN
  248. CPN = COS(ANG)
  249. SPN = SIN(ANG)
  250. CSPN = CMPLX(CPN,SPN)
  251. IF (MOD(IFN,2).EQ.1) CSPN = -CSPN
  252. C-----------------------------------------------------------------------
  253. C CS=COEFF OF THE J FUNCTION TO GET THE I FUNCTION. I(FNU,Z) IS
  254. C COMPUTED FROM EXP(I*FNU*HPI)*J(FNU,-I*Z) WHERE Z IS IN THE FIRST
  255. C QUADRANT. FOURTH QUADRANT VALUES (YY.LE.0.0E0) ARE COMPUTED BY
  256. C CONJUGATION SINCE THE I FUNCTION IS REAL ON THE POSITIVE REAL AXIS
  257. C-----------------------------------------------------------------------
  258. CS = CMPLX(CAR,-SAR)*CSGN
  259. IN = MOD(IFN,4) + 1
  260. C2 = CIP(IN)
  261. CS = CS*CONJG(C2)
  262. ASC = BRY(1)
  263. KK = N
  264. KDFLG = 1
  265. IB = IB-1
  266. IC = IB-1
  267. IUF = 0
  268. DO 270 K=1,N
  269. C-----------------------------------------------------------------------
  270. C LOGIC TO SORT OUT CASES WHOSE PARAMETERS WERE SET FOR THE K
  271. C FUNCTION ABOVE
  272. C-----------------------------------------------------------------------
  273. FN = FNU+(KK-1)
  274. IF (N.GT.2) GO TO 180
  275. 175 CONTINUE
  276. PHID = PHI(J)
  277. ARGD = ARG(J)
  278. ZETA1D = ZETA1(J)
  279. ZETA2D = ZETA2(J)
  280. ASUMD = ASUM(J)
  281. BSUMD = BSUM(J)
  282. J = 3 - J
  283. GO TO 190
  284. 180 CONTINUE
  285. IF ((KK.EQ.N).AND.(IB.LT.N)) GO TO 190
  286. IF ((KK.EQ.IB).OR.(KK.EQ.IC)) GO TO 175
  287. CALL CUNHJ(ZN, FN, 0, TOL, PHID, ARGD, ZETA1D, ZETA2D,
  288. * ASUMD, BSUMD)
  289. 190 CONTINUE
  290. IF (KODE.EQ.1) GO TO 200
  291. CFN = CMPLX(FN,0.0E0)
  292. S1 = -ZETA1D + CFN*(CFN/(ZB+ZETA2D))
  293. GO TO 210
  294. 200 CONTINUE
  295. S1 = -ZETA1D + ZETA2D
  296. 210 CONTINUE
  297. C-----------------------------------------------------------------------
  298. C TEST FOR UNDERFLOW AND OVERFLOW
  299. C-----------------------------------------------------------------------
  300. RS1 = REAL(S1)
  301. IF (ABS(RS1).GT.ELIM) GO TO 260
  302. IF (KDFLG.EQ.1) IFLAG = 2
  303. IF (ABS(RS1).LT.ALIM) GO TO 220
  304. C-----------------------------------------------------------------------
  305. C REFINE TEST AND SCALE
  306. C-----------------------------------------------------------------------
  307. APHI = ABS(PHID)
  308. AARG = ABS(ARGD)
  309. RS1 = RS1 + ALOG(APHI) - 0.25E0*ALOG(AARG) - AIC
  310. IF (ABS(RS1).GT.ELIM) GO TO 260
  311. IF (KDFLG.EQ.1) IFLAG = 1
  312. IF (RS1.LT.0.0E0) GO TO 220
  313. IF (KDFLG.EQ.1) IFLAG = 3
  314. 220 CONTINUE
  315. CALL CAIRY(ARGD, 0, 2, AI, NAI, IDUM)
  316. CALL CAIRY(ARGD, 1, 2, DAI, NDAI, IDUM)
  317. S2 = CS*PHID*(AI*ASUMD+DAI*BSUMD)
  318. C2R = REAL(S1)
  319. C2I = AIMAG(S1)
  320. C2M = EXP(C2R)*REAL(CSS(IFLAG))
  321. S1 = CMPLX(C2M,0.0E0)*CMPLX(COS(C2I),SIN(C2I))
  322. S2 = S2*S1
  323. IF (IFLAG.NE.1) GO TO 230
  324. CALL CUCHK(S2, NW, BRY(1), TOL)
  325. IF (NW.NE.0) S2 = CMPLX(0.0E0,0.0E0)
  326. 230 CONTINUE
  327. IF (YY.LE.0.0E0) S2 = CONJG(S2)
  328. CY(KDFLG) = S2
  329. C2 = S2
  330. S2 = S2*CSR(IFLAG)
  331. C-----------------------------------------------------------------------
  332. C ADD I AND K FUNCTIONS, K SEQUENCE IN Y(I), I=1,N
  333. C-----------------------------------------------------------------------
  334. S1 = Y(KK)
  335. IF (KODE.EQ.1) GO TO 250
  336. CALL CS1S2(ZR, S1, S2, NW, ASC, ALIM, IUF)
  337. NZ = NZ + NW
  338. 250 CONTINUE
  339. Y(KK) = S1*CSPN + S2
  340. KK = KK - 1
  341. CSPN = -CSPN
  342. CS = -CS*CI
  343. IF (C2.NE.CZERO) GO TO 255
  344. KDFLG = 1
  345. GO TO 270
  346. 255 CONTINUE
  347. IF (KDFLG.EQ.2) GO TO 275
  348. KDFLG = 2
  349. GO TO 270
  350. 260 CONTINUE
  351. IF (RS1.GT.0.0E0) GO TO 300
  352. S2 = CZERO
  353. GO TO 230
  354. 270 CONTINUE
  355. K = N
  356. 275 CONTINUE
  357. IL = N-K
  358. IF (IL.EQ.0) RETURN
  359. C-----------------------------------------------------------------------
  360. C RECUR BACKWARD FOR REMAINDER OF I SEQUENCE AND ADD IN THE
  361. C K FUNCTIONS, SCALING THE I SEQUENCE DURING RECURRENCE TO KEEP
  362. C INTERMEDIATE ARITHMETIC ON SCALE NEAR EXPONENT EXTREMES.
  363. C-----------------------------------------------------------------------
  364. S1 = CY(1)
  365. S2 = CY(2)
  366. CS = CSR(IFLAG)
  367. ASCLE = BRY(IFLAG)
  368. FN = INU+IL
  369. DO 290 I=1,IL
  370. C2 = S2
  371. S2 = S1 + CMPLX(FN+FNF,0.0E0)*RZ*S2
  372. S1 = C2
  373. FN = FN - 1.0E0
  374. C2 = S2*CS
  375. CK = C2
  376. C1 = Y(KK)
  377. IF (KODE.EQ.1) GO TO 280
  378. CALL CS1S2(ZR, C1, C2, NW, ASC, ALIM, IUF)
  379. NZ = NZ + NW
  380. 280 CONTINUE
  381. Y(KK) = C1*CSPN + C2
  382. KK = KK - 1
  383. CSPN = -CSPN
  384. IF (IFLAG.GE.3) GO TO 290
  385. C2R = REAL(CK)
  386. C2I = AIMAG(CK)
  387. C2R = ABS(C2R)
  388. C2I = ABS(C2I)
  389. C2M = MAX(C2R,C2I)
  390. IF (C2M.LE.ASCLE) GO TO 290
  391. IFLAG = IFLAG + 1
  392. ASCLE = BRY(IFLAG)
  393. S1 = S1*CS
  394. S2 = CK
  395. S1 = S1*CSS(IFLAG)
  396. S2 = S2*CSS(IFLAG)
  397. CS = CSR(IFLAG)
  398. 290 CONTINUE
  399. RETURN
  400. 300 CONTINUE
  401. NZ = -1
  402. RETURN
  403. END