zbknu.f 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. SUBROUTINE ZBKNU(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM,
  2. * ALIM)
  3. C***BEGIN PROLOGUE ZBKNU
  4. C***REFER TO ZBESI,ZBESK,ZAIRY,ZBESH
  5. C
  6. C ZBKNU COMPUTES THE K BESSEL FUNCTION IN THE RIGHT HALF Z PLANE.
  7. C
  8. C***ROUTINES CALLED DGAMLN,I1MACH,D1MACH,ZKSCL,ZSHCH,ZUCHK,ZABS,ZDIV,
  9. C ZEXP,ZLOG,ZMLT,ZSQRT
  10. C***END PROLOGUE ZBKNU
  11. C
  12. DOUBLE PRECISION AA, AK, ALIM, ASCLE, A1, A2, BB, BK, BRY, CAZ,
  13. * CBI, CBR, CC, CCHI, CCHR, CKI, CKR, COEFI, COEFR, CONEI, CONER,
  14. * CRSCR, CSCLR, CSHI, CSHR, CSI, CSR, CSRR, CSSR, CTWOR,
  15. * CZEROI, CZEROR, CZI, CZR, DNU, DNU2, DPI, ELIM, ETEST, FC, FHS,
  16. * FI, FK, FKS, FMUI, FMUR, FNU, FPI, FR, G1, G2, HPI, PI, PR, PTI,
  17. * PTR, P1I, P1R, P2I, P2M, P2R, QI, QR, RAK, RCAZ, RTHPI, RZI,
  18. * RZR, R1, S, SMUI, SMUR, SPI, STI, STR, S1I, S1R, S2I, S2R, TM,
  19. * TOL, TTH, T1, T2, YI, YR, ZI, ZR, DGAMLN, D1MACH, ZABS, ELM,
  20. * CELMR, ZDR, ZDI, AS, ALAS, HELIM, CYR, CYI
  21. INTEGER I, IFLAG, INU, K, KFLAG, KK, KMAX, KODE, KODED, N, NZ,
  22. * IDUM, I1MACH, J, IC, INUB, NW
  23. DIMENSION YR(N), YI(N), CC(8), CSSR(3), CSRR(3), BRY(3), CYR(2),
  24. * CYI(2)
  25. C COMPLEX Z,Y,A,B,RZ,SMU,FU,FMU,F,FLRZ,CZ,S1,S2,CSH,CCH
  26. C COMPLEX CK,P,Q,COEF,P1,P2,CBK,PT,CZERO,CONE,CTWO,ST,EZ,CS,DK
  27. C
  28. DATA KMAX / 30 /
  29. DATA CZEROR,CZEROI,CONER,CONEI,CTWOR,R1/
  30. 1 0.0D0 , 0.0D0 , 1.0D0 , 0.0D0 , 2.0D0 , 2.0D0 /
  31. DATA DPI, RTHPI, SPI ,HPI, FPI, TTH /
  32. 1 3.14159265358979324D0, 1.25331413731550025D0,
  33. 2 1.90985931710274403D0, 1.57079632679489662D0,
  34. 3 1.89769999331517738D0, 6.66666666666666666D-01/
  35. DATA CC(1), CC(2), CC(3), CC(4), CC(5), CC(6), CC(7), CC(8)/
  36. 1 5.77215664901532861D-01, -4.20026350340952355D-02,
  37. 2 -4.21977345555443367D-02, 7.21894324666309954D-03,
  38. 3 -2.15241674114950973D-04, -2.01348547807882387D-05,
  39. 4 1.13302723198169588D-06, 6.11609510448141582D-09/
  40. C
  41. CAZ = ZABS(COMPLEX(ZR,ZI))
  42. CSCLR = 1.0D0/TOL
  43. CRSCR = TOL
  44. CSSR(1) = CSCLR
  45. CSSR(2) = 1.0D0
  46. CSSR(3) = CRSCR
  47. CSRR(1) = CRSCR
  48. CSRR(2) = 1.0D0
  49. CSRR(3) = CSCLR
  50. BRY(1) = 1.0D+3*D1MACH(1)/TOL
  51. BRY(2) = 1.0D0/BRY(1)
  52. BRY(3) = D1MACH(2)
  53. NZ = 0
  54. IFLAG = 0
  55. KODED = KODE
  56. RCAZ = 1.0D0/CAZ
  57. STR = ZR*RCAZ
  58. STI = -ZI*RCAZ
  59. RZR = (STR+STR)*RCAZ
  60. RZI = (STI+STI)*RCAZ
  61. INU = INT(SNGL(FNU+0.5D0))
  62. DNU = FNU - DBLE(FLOAT(INU))
  63. IF (DABS(DNU).EQ.0.5D0) GO TO 110
  64. DNU2 = 0.0D0
  65. IF (DABS(DNU).GT.TOL) DNU2 = DNU*DNU
  66. IF (CAZ.GT.R1) GO TO 110
  67. C-----------------------------------------------------------------------
  68. C SERIES FOR CABS(Z).LE.R1
  69. C-----------------------------------------------------------------------
  70. FC = 1.0D0
  71. CALL ZLOG(RZR, RZI, SMUR, SMUI, IDUM)
  72. FMUR = SMUR*DNU
  73. FMUI = SMUI*DNU
  74. CALL ZSHCH(FMUR, FMUI, CSHR, CSHI, CCHR, CCHI)
  75. IF (DNU.EQ.0.0D0) GO TO 10
  76. FC = DNU*DPI
  77. FC = FC/DSIN(FC)
  78. SMUR = CSHR/DNU
  79. SMUI = CSHI/DNU
  80. 10 CONTINUE
  81. A2 = 1.0D0 + DNU
  82. C-----------------------------------------------------------------------
  83. C GAM(1-Z)*GAM(1+Z)=PI*Z/SIN(PI*Z), T1=1/GAM(1-DNU), T2=1/GAM(1+DNU)
  84. C-----------------------------------------------------------------------
  85. T2 = DEXP(-DGAMLN(A2,IDUM))
  86. T1 = 1.0D0/(T2*FC)
  87. IF (DABS(DNU).GT.0.1D0) GO TO 40
  88. C-----------------------------------------------------------------------
  89. C SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
  90. C-----------------------------------------------------------------------
  91. AK = 1.0D0
  92. S = CC(1)
  93. DO 20 K=2,8
  94. AK = AK*DNU2
  95. TM = CC(K)*AK
  96. S = S + TM
  97. IF (DABS(TM).LT.TOL) GO TO 30
  98. 20 CONTINUE
  99. 30 G1 = -S
  100. GO TO 50
  101. 40 CONTINUE
  102. G1 = (T1-T2)/(DNU+DNU)
  103. 50 CONTINUE
  104. G2 = (T1+T2)*0.5D0
  105. FR = FC*(CCHR*G1+SMUR*G2)
  106. FI = FC*(CCHI*G1+SMUI*G2)
  107. CALL ZEXP(FMUR, FMUI, STR, STI)
  108. PR = 0.5D0*STR/T2
  109. PI = 0.5D0*STI/T2
  110. CALL ZDIV(0.5D0, 0.0D0, STR, STI, PTR, PTI)
  111. QR = PTR/T1
  112. QI = PTI/T1
  113. S1R = FR
  114. S1I = FI
  115. S2R = PR
  116. S2I = PI
  117. AK = 1.0D0
  118. A1 = 1.0D0
  119. CKR = CONER
  120. CKI = CONEI
  121. BK = 1.0D0 - DNU2
  122. IF (INU.GT.0 .OR. N.GT.1) GO TO 80
  123. C-----------------------------------------------------------------------
  124. C GENERATE K(FNU,Z), 0.0D0 .LE. FNU .LT. 0.5D0 AND N=1
  125. C-----------------------------------------------------------------------
  126. IF (CAZ.LT.TOL) GO TO 70
  127. CALL ZMLT(ZR, ZI, ZR, ZI, CZR, CZI)
  128. CZR = 0.25D0*CZR
  129. CZI = 0.25D0*CZI
  130. T1 = 0.25D0*CAZ*CAZ
  131. 60 CONTINUE
  132. FR = (FR*AK+PR+QR)/BK
  133. FI = (FI*AK+PI+QI)/BK
  134. STR = 1.0D0/(AK-DNU)
  135. PR = PR*STR
  136. PI = PI*STR
  137. STR = 1.0D0/(AK+DNU)
  138. QR = QR*STR
  139. QI = QI*STR
  140. STR = CKR*CZR - CKI*CZI
  141. RAK = 1.0D0/AK
  142. CKI = (CKR*CZI+CKI*CZR)*RAK
  143. CKR = STR*RAK
  144. S1R = CKR*FR - CKI*FI + S1R
  145. S1I = CKR*FI + CKI*FR + S1I
  146. A1 = A1*T1*RAK
  147. BK = BK + AK + AK + 1.0D0
  148. AK = AK + 1.0D0
  149. IF (A1.GT.TOL) GO TO 60
  150. 70 CONTINUE
  151. YR(1) = S1R
  152. YI(1) = S1I
  153. IF (KODED.EQ.1) RETURN
  154. CALL ZEXP(ZR, ZI, STR, STI)
  155. CALL ZMLT(S1R, S1I, STR, STI, YR(1), YI(1))
  156. RETURN
  157. C-----------------------------------------------------------------------
  158. C GENERATE K(DNU,Z) AND K(DNU+1,Z) FOR FORWARD RECURRENCE
  159. C-----------------------------------------------------------------------
  160. 80 CONTINUE
  161. IF (CAZ.LT.TOL) GO TO 100
  162. CALL ZMLT(ZR, ZI, ZR, ZI, CZR, CZI)
  163. CZR = 0.25D0*CZR
  164. CZI = 0.25D0*CZI
  165. T1 = 0.25D0*CAZ*CAZ
  166. 90 CONTINUE
  167. FR = (FR*AK+PR+QR)/BK
  168. FI = (FI*AK+PI+QI)/BK
  169. STR = 1.0D0/(AK-DNU)
  170. PR = PR*STR
  171. PI = PI*STR
  172. STR = 1.0D0/(AK+DNU)
  173. QR = QR*STR
  174. QI = QI*STR
  175. STR = CKR*CZR - CKI*CZI
  176. RAK = 1.0D0/AK
  177. CKI = (CKR*CZI+CKI*CZR)*RAK
  178. CKR = STR*RAK
  179. S1R = CKR*FR - CKI*FI + S1R
  180. S1I = CKR*FI + CKI*FR + S1I
  181. STR = PR - FR*AK
  182. STI = PI - FI*AK
  183. S2R = CKR*STR - CKI*STI + S2R
  184. S2I = CKR*STI + CKI*STR + S2I
  185. A1 = A1*T1*RAK
  186. BK = BK + AK + AK + 1.0D0
  187. AK = AK + 1.0D0
  188. IF (A1.GT.TOL) GO TO 90
  189. 100 CONTINUE
  190. KFLAG = 2
  191. A1 = FNU + 1.0D0
  192. AK = A1*DABS(SMUR)
  193. IF (AK.GT.ALIM) KFLAG = 3
  194. STR = CSSR(KFLAG)
  195. P2R = S2R*STR
  196. P2I = S2I*STR
  197. CALL ZMLT(P2R, P2I, RZR, RZI, S2R, S2I)
  198. S1R = S1R*STR
  199. S1I = S1I*STR
  200. IF (KODED.EQ.1) GO TO 210
  201. CALL ZEXP(ZR, ZI, FR, FI)
  202. CALL ZMLT(S1R, S1I, FR, FI, S1R, S1I)
  203. CALL ZMLT(S2R, S2I, FR, FI, S2R, S2I)
  204. GO TO 210
  205. C-----------------------------------------------------------------------
  206. C IFLAG=0 MEANS NO UNDERFLOW OCCURRED
  207. C IFLAG=1 MEANS AN UNDERFLOW OCCURRED- COMPUTATION PROCEEDS WITH
  208. C KODED=2 AND A TEST FOR ON SCALE VALUES IS MADE DURING FORWARD
  209. C RECURSION
  210. C-----------------------------------------------------------------------
  211. 110 CONTINUE
  212. CALL ZSQRT(ZR, ZI, STR, STI)
  213. CALL ZDIV(RTHPI, CZEROI, STR, STI, COEFR, COEFI)
  214. KFLAG = 2
  215. IF (KODED.EQ.2) GO TO 120
  216. IF (ZR.GT.ALIM) GO TO 290
  217. C BLANK LINE
  218. STR = DEXP(-ZR)*CSSR(KFLAG)
  219. STI = -STR*DSIN(ZI)
  220. STR = STR*DCOS(ZI)
  221. CALL ZMLT(COEFR, COEFI, STR, STI, COEFR, COEFI)
  222. 120 CONTINUE
  223. IF (DABS(DNU).EQ.0.5D0) GO TO 300
  224. C-----------------------------------------------------------------------
  225. C MILLER ALGORITHM FOR CABS(Z).GT.R1
  226. C-----------------------------------------------------------------------
  227. AK = DCOS(DPI*DNU)
  228. AK = DABS(AK)
  229. IF (AK.EQ.CZEROR) GO TO 300
  230. FHS = DABS(0.25D0-DNU2)
  231. IF (FHS.EQ.CZEROR) GO TO 300
  232. C-----------------------------------------------------------------------
  233. C COMPUTE R2=F(E). IF CABS(Z).GE.R2, USE FORWARD RECURRENCE TO
  234. C DETERMINE THE BACKWARD INDEX K. R2=F(E) IS A STRAIGHT LINE ON
  235. C 12.LE.E.LE.60. E IS COMPUTED FROM 2**(-E)=B**(1-I1MACH(14))=
  236. C TOL WHERE B IS THE BASE OF THE ARITHMETIC.
  237. C-----------------------------------------------------------------------
  238. T1 = DBLE(FLOAT(I1MACH(14)-1))
  239. T1 = T1*D1MACH(5)*3.321928094D0
  240. T1 = DMAX1(T1,12.0D0)
  241. T1 = DMIN1(T1,60.0D0)
  242. T2 = TTH*T1 - 6.0D0
  243. IF (ZR.NE.0.0D0) GO TO 130
  244. T1 = HPI
  245. GO TO 140
  246. 130 CONTINUE
  247. T1 = DATAN(ZI/ZR)
  248. T1 = DABS(T1)
  249. 140 CONTINUE
  250. IF (T2.GT.CAZ) GO TO 170
  251. C-----------------------------------------------------------------------
  252. C FORWARD RECURRENCE LOOP WHEN CABS(Z).GE.R2
  253. C-----------------------------------------------------------------------
  254. ETEST = AK/(DPI*CAZ*TOL)
  255. FK = CONER
  256. IF (ETEST.LT.CONER) GO TO 180
  257. FKS = CTWOR
  258. CKR = CAZ + CAZ + CTWOR
  259. P1R = CZEROR
  260. P2R = CONER
  261. DO 150 I=1,KMAX
  262. AK = FHS/FKS
  263. CBR = CKR/(FK+CONER)
  264. PTR = P2R
  265. P2R = CBR*P2R - P1R*AK
  266. P1R = PTR
  267. CKR = CKR + CTWOR
  268. FKS = FKS + FK + FK + CTWOR
  269. FHS = FHS + FK + FK
  270. FK = FK + CONER
  271. STR = DABS(P2R)*FK
  272. IF (ETEST.LT.STR) GO TO 160
  273. 150 CONTINUE
  274. GO TO 310
  275. 160 CONTINUE
  276. FK = FK + SPI*T1*DSQRT(T2/CAZ)
  277. FHS = DABS(0.25D0-DNU2)
  278. GO TO 180
  279. 170 CONTINUE
  280. C-----------------------------------------------------------------------
  281. C COMPUTE BACKWARD INDEX K FOR CABS(Z).LT.R2
  282. C-----------------------------------------------------------------------
  283. A2 = DSQRT(CAZ)
  284. AK = FPI*AK/(TOL*DSQRT(A2))
  285. AA = 3.0D0*T1/(1.0D0+CAZ)
  286. BB = 14.7D0*T1/(28.0D0+CAZ)
  287. AK = (DLOG(AK)+CAZ*DCOS(AA)/(1.0D0+0.008D0*CAZ))/DCOS(BB)
  288. FK = 0.12125D0*AK*AK/CAZ + 1.5D0
  289. 180 CONTINUE
  290. C-----------------------------------------------------------------------
  291. C BACKWARD RECURRENCE LOOP FOR MILLER ALGORITHM
  292. C-----------------------------------------------------------------------
  293. K = INT(SNGL(FK))
  294. FK = DBLE(FLOAT(K))
  295. FKS = FK*FK
  296. P1R = CZEROR
  297. P1I = CZEROI
  298. P2R = TOL
  299. P2I = CZEROI
  300. CSR = P2R
  301. CSI = P2I
  302. DO 190 I=1,K
  303. A1 = FKS - FK
  304. AK = (FKS+FK)/(A1+FHS)
  305. RAK = 2.0D0/(FK+CONER)
  306. CBR = (FK+ZR)*RAK
  307. CBI = ZI*RAK
  308. PTR = P2R
  309. PTI = P2I
  310. P2R = (PTR*CBR-PTI*CBI-P1R)*AK
  311. P2I = (PTI*CBR+PTR*CBI-P1I)*AK
  312. P1R = PTR
  313. P1I = PTI
  314. CSR = CSR + P2R
  315. CSI = CSI + P2I
  316. FKS = A1 - FK + CONER
  317. FK = FK - CONER
  318. 190 CONTINUE
  319. C-----------------------------------------------------------------------
  320. C COMPUTE (P2/CS)=(P2/CABS(CS))*(CONJG(CS)/CABS(CS)) FOR BETTER
  321. C SCALING
  322. C-----------------------------------------------------------------------
  323. TM = ZABS(COMPLEX(CSR,CSI))
  324. PTR = 1.0D0/TM
  325. S1R = P2R*PTR
  326. S1I = P2I*PTR
  327. CSR = CSR*PTR
  328. CSI = -CSI*PTR
  329. CALL ZMLT(COEFR, COEFI, S1R, S1I, STR, STI)
  330. CALL ZMLT(STR, STI, CSR, CSI, S1R, S1I)
  331. IF (INU.GT.0 .OR. N.GT.1) GO TO 200
  332. ZDR = ZR
  333. ZDI = ZI
  334. IF(IFLAG.EQ.1) GO TO 270
  335. GO TO 240
  336. 200 CONTINUE
  337. C-----------------------------------------------------------------------
  338. C COMPUTE P1/P2=(P1/CABS(P2)*CONJG(P2)/CABS(P2) FOR SCALING
  339. C-----------------------------------------------------------------------
  340. TM = ZABS(COMPLEX(P2R,P2I))
  341. PTR = 1.0D0/TM
  342. P1R = P1R*PTR
  343. P1I = P1I*PTR
  344. P2R = P2R*PTR
  345. P2I = -P2I*PTR
  346. CALL ZMLT(P1R, P1I, P2R, P2I, PTR, PTI)
  347. STR = DNU + 0.5D0 - PTR
  348. STI = -PTI
  349. CALL ZDIV(STR, STI, ZR, ZI, STR, STI)
  350. STR = STR + 1.0D0
  351. CALL ZMLT(STR, STI, S1R, S1I, S2R, S2I)
  352. C-----------------------------------------------------------------------
  353. C FORWARD RECURSION ON THE THREE TERM RECURSION WITH RELATION WITH
  354. C SCALING NEAR EXPONENT EXTREMES ON KFLAG=1 OR KFLAG=3
  355. C-----------------------------------------------------------------------
  356. 210 CONTINUE
  357. STR = DNU + 1.0D0
  358. CKR = STR*RZR
  359. CKI = STR*RZI
  360. IF (N.EQ.1) INU = INU - 1
  361. IF (INU.GT.0) GO TO 220
  362. IF (N.GT.1) GO TO 215
  363. S1R = S2R
  364. S1I = S2I
  365. 215 CONTINUE
  366. ZDR = ZR
  367. ZDI = ZI
  368. IF(IFLAG.EQ.1) GO TO 270
  369. GO TO 240
  370. 220 CONTINUE
  371. INUB = 1
  372. IF(IFLAG.EQ.1) GO TO 261
  373. 225 CONTINUE
  374. P1R = CSRR(KFLAG)
  375. ASCLE = BRY(KFLAG)
  376. DO 230 I=INUB,INU
  377. STR = S2R
  378. STI = S2I
  379. S2R = CKR*STR - CKI*STI + S1R
  380. S2I = CKR*STI + CKI*STR + S1I
  381. S1R = STR
  382. S1I = STI
  383. CKR = CKR + RZR
  384. CKI = CKI + RZI
  385. IF (KFLAG.GE.3) GO TO 230
  386. P2R = S2R*P1R
  387. P2I = S2I*P1R
  388. STR = DABS(P2R)
  389. STI = DABS(P2I)
  390. P2M = DMAX1(STR,STI)
  391. IF (P2M.LE.ASCLE) GO TO 230
  392. KFLAG = KFLAG + 1
  393. ASCLE = BRY(KFLAG)
  394. S1R = S1R*P1R
  395. S1I = S1I*P1R
  396. S2R = P2R
  397. S2I = P2I
  398. STR = CSSR(KFLAG)
  399. S1R = S1R*STR
  400. S1I = S1I*STR
  401. S2R = S2R*STR
  402. S2I = S2I*STR
  403. P1R = CSRR(KFLAG)
  404. 230 CONTINUE
  405. IF (N.NE.1) GO TO 240
  406. S1R = S2R
  407. S1I = S2I
  408. 240 CONTINUE
  409. STR = CSRR(KFLAG)
  410. YR(1) = S1R*STR
  411. YI(1) = S1I*STR
  412. IF (N.EQ.1) RETURN
  413. YR(2) = S2R*STR
  414. YI(2) = S2I*STR
  415. IF (N.EQ.2) RETURN
  416. KK = 2
  417. 250 CONTINUE
  418. KK = KK + 1
  419. IF (KK.GT.N) RETURN
  420. P1R = CSRR(KFLAG)
  421. ASCLE = BRY(KFLAG)
  422. DO 260 I=KK,N
  423. P2R = S2R
  424. P2I = S2I
  425. S2R = CKR*P2R - CKI*P2I + S1R
  426. S2I = CKI*P2R + CKR*P2I + S1I
  427. S1R = P2R
  428. S1I = P2I
  429. CKR = CKR + RZR
  430. CKI = CKI + RZI
  431. P2R = S2R*P1R
  432. P2I = S2I*P1R
  433. YR(I) = P2R
  434. YI(I) = P2I
  435. IF (KFLAG.GE.3) GO TO 260
  436. STR = DABS(P2R)
  437. STI = DABS(P2I)
  438. P2M = DMAX1(STR,STI)
  439. IF (P2M.LE.ASCLE) GO TO 260
  440. KFLAG = KFLAG + 1
  441. ASCLE = BRY(KFLAG)
  442. S1R = S1R*P1R
  443. S1I = S1I*P1R
  444. S2R = P2R
  445. S2I = P2I
  446. STR = CSSR(KFLAG)
  447. S1R = S1R*STR
  448. S1I = S1I*STR
  449. S2R = S2R*STR
  450. S2I = S2I*STR
  451. P1R = CSRR(KFLAG)
  452. 260 CONTINUE
  453. RETURN
  454. C-----------------------------------------------------------------------
  455. C IFLAG=1 CASES, FORWARD RECURRENCE ON SCALED VALUES ON UNDERFLOW
  456. C-----------------------------------------------------------------------
  457. 261 CONTINUE
  458. HELIM = 0.5D0*ELIM
  459. ELM = DEXP(-ELIM)
  460. CELMR = ELM
  461. ASCLE = BRY(1)
  462. ZDR = ZR
  463. ZDI = ZI
  464. IC = -1
  465. J = 2
  466. DO 262 I=1,INU
  467. STR = S2R
  468. STI = S2I
  469. S2R = STR*CKR-STI*CKI+S1R
  470. S2I = STI*CKR+STR*CKI+S1I
  471. S1R = STR
  472. S1I = STI
  473. CKR = CKR+RZR
  474. CKI = CKI+RZI
  475. AS = ZABS(COMPLEX(S2R,S2I))
  476. ALAS = DLOG(AS)
  477. P2R = -ZDR+ALAS
  478. IF(P2R.LT.(-ELIM)) GO TO 263
  479. CALL ZLOG(S2R,S2I,STR,STI,IDUM)
  480. P2R = -ZDR+STR
  481. P2I = -ZDI+STI
  482. P2M = DEXP(P2R)/TOL
  483. P1R = P2M*DCOS(P2I)
  484. P1I = P2M*DSIN(P2I)
  485. CALL ZUCHK(P1R,P1I,NW,ASCLE,TOL)
  486. IF(NW.NE.0) GO TO 263
  487. J = 3 - J
  488. CYR(J) = P1R
  489. CYI(J) = P1I
  490. IF(IC.EQ.(I-1)) GO TO 264
  491. IC = I
  492. GO TO 262
  493. 263 CONTINUE
  494. IF(ALAS.LT.HELIM) GO TO 262
  495. ZDR = ZDR-ELIM
  496. S1R = S1R*CELMR
  497. S1I = S1I*CELMR
  498. S2R = S2R*CELMR
  499. S2I = S2I*CELMR
  500. 262 CONTINUE
  501. IF(N.NE.1) GO TO 270
  502. S1R = S2R
  503. S1I = S2I
  504. GO TO 270
  505. 264 CONTINUE
  506. KFLAG = 1
  507. INUB = I+1
  508. S2R = CYR(J)
  509. S2I = CYI(J)
  510. J = 3 - J
  511. S1R = CYR(J)
  512. S1I = CYI(J)
  513. IF(INUB.LE.INU) GO TO 225
  514. IF(N.NE.1) GO TO 240
  515. S1R = S2R
  516. S1I = S2I
  517. GO TO 240
  518. 270 CONTINUE
  519. YR(1) = S1R
  520. YI(1) = S1I
  521. IF(N.EQ.1) GO TO 280
  522. YR(2) = S2R
  523. YI(2) = S2I
  524. 280 CONTINUE
  525. ASCLE = BRY(1)
  526. CALL ZKSCL(ZDR,ZDI,FNU,N,YR,YI,NZ,RZR,RZI,ASCLE,TOL,ELIM)
  527. INU = N - NZ
  528. IF (INU.LE.0) RETURN
  529. KK = NZ + 1
  530. S1R = YR(KK)
  531. S1I = YI(KK)
  532. YR(KK) = S1R*CSRR(1)
  533. YI(KK) = S1I*CSRR(1)
  534. IF (INU.EQ.1) RETURN
  535. KK = NZ + 2
  536. S2R = YR(KK)
  537. S2I = YI(KK)
  538. YR(KK) = S2R*CSRR(1)
  539. YI(KK) = S2I*CSRR(1)
  540. IF (INU.EQ.2) RETURN
  541. T2 = FNU + DBLE(FLOAT(KK-1))
  542. CKR = T2*RZR
  543. CKI = T2*RZI
  544. KFLAG = 1
  545. GO TO 250
  546. 290 CONTINUE
  547. C-----------------------------------------------------------------------
  548. C SCALE BY DEXP(Z), IFLAG = 1 CASES
  549. C-----------------------------------------------------------------------
  550. KODED = 2
  551. IFLAG = 1
  552. KFLAG = 2
  553. GO TO 120
  554. C-----------------------------------------------------------------------
  555. C FNU=HALF ODD INTEGER CASE, DNU=-0.5
  556. C-----------------------------------------------------------------------
  557. 300 CONTINUE
  558. S1R = COEFR
  559. S1I = COEFI
  560. S2R = COEFR
  561. S2I = COEFI
  562. GO TO 210
  563. C
  564. C
  565. 310 CONTINUE
  566. NZ=-2
  567. RETURN
  568. END