cbknu.f 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. *DECK CBKNU
  2. SUBROUTINE CBKNU (Z, FNU, KODE, N, Y, NZ, TOL, ELIM, ALIM)
  3. C***BEGIN PROLOGUE CBKNU
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to CAIRY, CBESH, CBESI and CBESK
  6. C***LIBRARY SLATEC
  7. C***TYPE ALL (CBKNU-A, ZBKNU-A)
  8. C***AUTHOR Amos, D. E., (SNL)
  9. C***DESCRIPTION
  10. C
  11. C CBKNU COMPUTES THE K BESSEL FUNCTION IN THE RIGHT HALF Z PLANE
  12. C
  13. C***SEE ALSO CAIRY, CBESH, CBESI, CBESK
  14. C***ROUTINES CALLED CKSCL, CSHCH, CUCHK, GAMLN, I1MACH, R1MACH
  15. C***REVISION HISTORY (YYMMDD)
  16. C 830501 DATE WRITTEN
  17. C 910415 Prologue converted to Version 4.0 format. (BAB)
  18. C***END PROLOGUE CBKNU
  19. C
  20. COMPLEX CCH, CK, COEF, CONE, CRSC, CS, CSCL, CSH, CSR, CSS, CTWO,
  21. * CZ, CZERO, F, FMU, P, PT, P1, P2, Q, RZ, SMU, ST, S1, S2, Y, Z,
  22. * ZD, CELM, CY
  23. REAL AA, AK, ALIM, ASCLE, A1, A2, BB, BK, BRY, CAZ, CC, DNU,
  24. * DNU2, ELIM, ETEST, FC, FHS, FK, FKS, FNU, FPI, G1, G2, HPI, PI,
  25. * P2I, P2M, P2R, RK, RTHPI, R1, S, SPI, TM, TOL, TTH, T1, T2, XX,
  26. * YY, GAMLN, R1MACH, HELIM, ELM, XD, YD, ALAS, AS
  27. INTEGER I, IDUM, IFLAG, INU, K, KFLAG, KK, KMAX, KODE, KODED, N,
  28. * NZ, I1MACH, NW, J, IC, INUB
  29. DIMENSION BRY(3), CC(8), CSS(3), CSR(3), Y(N), CY(2)
  30. C
  31. DATA KMAX / 30 /
  32. DATA R1 / 2.0E0 /
  33. DATA CZERO,CONE,CTWO /(0.0E0,0.0E0),(1.0E0,0.0E0),(2.0E0,0.0E0)/
  34. C
  35. DATA PI, RTHPI, SPI ,HPI, FPI, TTH /
  36. 1 3.14159265358979324E0, 1.25331413731550025E0,
  37. 2 1.90985931710274403E0, 1.57079632679489662E0,
  38. 3 1.89769999331517738E0, 6.66666666666666666E-01/
  39. C
  40. DATA CC(1), CC(2), CC(3), CC(4), CC(5), CC(6), CC(7), CC(8)/
  41. 1 5.77215664901532861E-01, -4.20026350340952355E-02,
  42. 2 -4.21977345555443367E-02, 7.21894324666309954E-03,
  43. 3 -2.15241674114950973E-04, -2.01348547807882387E-05,
  44. 4 1.13302723198169588E-06, 6.11609510448141582E-09/
  45. C
  46. C***FIRST EXECUTABLE STATEMENT CBKNU
  47. XX = REAL(Z)
  48. YY = AIMAG(Z)
  49. CAZ = ABS(Z)
  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. BRY(2) = 1.0E0/BRY(1)
  60. BRY(3) = R1MACH(2)
  61. NZ = 0
  62. IFLAG = 0
  63. KODED = KODE
  64. RZ = CTWO/Z
  65. INU = FNU+0.5E0
  66. DNU = FNU - INU
  67. IF (ABS(DNU).EQ.0.5E0) GO TO 110
  68. DNU2 = 0.0E0
  69. IF (ABS(DNU).GT.TOL) DNU2 = DNU*DNU
  70. IF (CAZ.GT.R1) GO TO 110
  71. C-----------------------------------------------------------------------
  72. C SERIES FOR ABS(Z).LE.R1
  73. C-----------------------------------------------------------------------
  74. FC = 1.0E0
  75. SMU = CLOG(RZ)
  76. FMU = SMU*CMPLX(DNU,0.0E0)
  77. CALL CSHCH(FMU, CSH, CCH)
  78. IF (DNU.EQ.0.0E0) GO TO 10
  79. FC = DNU*PI
  80. FC = FC/SIN(FC)
  81. SMU = CSH*CMPLX(1.0E0/DNU,0.0E0)
  82. 10 CONTINUE
  83. A2 = 1.0E0 + DNU
  84. C-----------------------------------------------------------------------
  85. C GAM(1-Z)*GAM(1+Z)=PI*Z/SIN(PI*Z), T1=1/GAM(1-DNU), T2=1/GAM(1+DNU)
  86. C-----------------------------------------------------------------------
  87. T2 = EXP(-GAMLN(A2,IDUM))
  88. T1 = 1.0E0/(T2*FC)
  89. IF (ABS(DNU).GT.0.1E0) GO TO 40
  90. C-----------------------------------------------------------------------
  91. C SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
  92. C-----------------------------------------------------------------------
  93. AK = 1.0E0
  94. S = CC(1)
  95. DO 20 K=2,8
  96. AK = AK*DNU2
  97. TM = CC(K)*AK
  98. S = S + TM
  99. IF (ABS(TM).LT.TOL) GO TO 30
  100. 20 CONTINUE
  101. 30 G1 = -S
  102. GO TO 50
  103. 40 CONTINUE
  104. G1 = (T1-T2)/(DNU+DNU)
  105. 50 CONTINUE
  106. G2 = 0.5E0*(T1+T2)*FC
  107. G1 = G1*FC
  108. F = CMPLX(G1,0.0E0)*CCH + SMU*CMPLX(G2,0.0E0)
  109. PT = CEXP(FMU)
  110. P = CMPLX(0.5E0/T2,0.0E0)*PT
  111. Q = CMPLX(0.5E0/T1,0.0E0)/PT
  112. S1 = F
  113. S2 = P
  114. AK = 1.0E0
  115. A1 = 1.0E0
  116. CK = CONE
  117. BK = 1.0E0 - DNU2
  118. IF (INU.GT.0 .OR. N.GT.1) GO TO 80
  119. C-----------------------------------------------------------------------
  120. C GENERATE K(FNU,Z), 0.0D0 .LE. FNU .LT. 0.5D0 AND N=1
  121. C-----------------------------------------------------------------------
  122. IF (CAZ.LT.TOL) GO TO 70
  123. CZ = Z*Z*CMPLX(0.25E0,0.0E0)
  124. T1 = 0.25E0*CAZ*CAZ
  125. 60 CONTINUE
  126. F = (F*CMPLX(AK,0.0E0)+P+Q)*CMPLX(1.0E0/BK,0.0E0)
  127. P = P*CMPLX(1.0E0/(AK-DNU),0.0E0)
  128. Q = Q*CMPLX(1.0E0/(AK+DNU),0.0E0)
  129. RK = 1.0E0/AK
  130. CK = CK*CZ*CMPLX(RK,0.0)
  131. S1 = S1 + CK*F
  132. A1 = A1*T1*RK
  133. BK = BK + AK + AK + 1.0E0
  134. AK = AK + 1.0E0
  135. IF (A1.GT.TOL) GO TO 60
  136. 70 CONTINUE
  137. Y(1) = S1
  138. IF (KODED.EQ.1) RETURN
  139. Y(1) = S1*CEXP(Z)
  140. RETURN
  141. C-----------------------------------------------------------------------
  142. C GENERATE K(DNU,Z) AND K(DNU+1,Z) FOR FORWARD RECURRENCE
  143. C-----------------------------------------------------------------------
  144. 80 CONTINUE
  145. IF (CAZ.LT.TOL) GO TO 100
  146. CZ = Z*Z*CMPLX(0.25E0,0.0E0)
  147. T1 = 0.25E0*CAZ*CAZ
  148. 90 CONTINUE
  149. F = (F*CMPLX(AK,0.0E0)+P+Q)*CMPLX(1.0E0/BK,0.0E0)
  150. P = P*CMPLX(1.0E0/(AK-DNU),0.0E0)
  151. Q = Q*CMPLX(1.0E0/(AK+DNU),0.0E0)
  152. RK = 1.0E0/AK
  153. CK = CK*CZ*CMPLX(RK,0.0E0)
  154. S1 = S1 + CK*F
  155. S2 = S2 + CK*(P-F*CMPLX(AK,0.0E0))
  156. A1 = A1*T1*RK
  157. BK = BK + AK + AK + 1.0E0
  158. AK = AK + 1.0E0
  159. IF (A1.GT.TOL) GO TO 90
  160. 100 CONTINUE
  161. KFLAG = 2
  162. BK = REAL(SMU)
  163. A1 = FNU + 1.0E0
  164. AK = A1*ABS(BK)
  165. IF (AK.GT.ALIM) KFLAG = 3
  166. P2 = S2*CSS(KFLAG)
  167. S2 = P2*RZ
  168. S1 = S1*CSS(KFLAG)
  169. IF (KODED.EQ.1) GO TO 210
  170. F = CEXP(Z)
  171. S1 = S1*F
  172. S2 = S2*F
  173. GO TO 210
  174. C-----------------------------------------------------------------------
  175. C IFLAG=0 MEANS NO UNDERFLOW OCCURRED
  176. C IFLAG=1 MEANS AN UNDERFLOW OCCURRED- COMPUTATION PROCEEDS WITH
  177. C KODED=2 AND A TEST FOR ON SCALE VALUES IS MADE DURING FORWARD
  178. C RECURSION
  179. C-----------------------------------------------------------------------
  180. 110 CONTINUE
  181. COEF = CMPLX(RTHPI,0.0E0)/CSQRT(Z)
  182. KFLAG = 2
  183. IF (KODED.EQ.2) GO TO 120
  184. IF (XX.GT.ALIM) GO TO 290
  185. C BLANK LINE
  186. A1 = EXP(-XX)*REAL(CSS(KFLAG))
  187. PT = CMPLX(A1,0.0E0)*CMPLX(COS(YY),-SIN(YY))
  188. COEF = COEF*PT
  189. 120 CONTINUE
  190. IF (ABS(DNU).EQ.0.5E0) GO TO 300
  191. C-----------------------------------------------------------------------
  192. C MILLER ALGORITHM FOR ABS(Z).GT.R1
  193. C-----------------------------------------------------------------------
  194. AK = COS(PI*DNU)
  195. AK = ABS(AK)
  196. IF (AK.EQ.0.0E0) GO TO 300
  197. FHS = ABS(0.25E0-DNU2)
  198. IF (FHS.EQ.0.0E0) GO TO 300
  199. C-----------------------------------------------------------------------
  200. C COMPUTE R2=F(E). IF ABS(Z).GE.R2, USE FORWARD RECURRENCE TO
  201. C DETERMINE THE BACKWARD INDEX K. R2=F(E) IS A STRAIGHT LINE ON
  202. C 12.LE.E.LE.60. E IS COMPUTED FROM 2**(-E)=B**(1-I1MACH(11))=
  203. C TOL WHERE B IS THE BASE OF THE ARITHMETIC.
  204. C-----------------------------------------------------------------------
  205. T1 = (I1MACH(11)-1)*R1MACH(5)*3.321928094E0
  206. T1 = MAX(T1,12.0E0)
  207. T1 = MIN(T1,60.0E0)
  208. T2 = TTH*T1 - 6.0E0
  209. IF (XX.NE.0.0E0) GO TO 130
  210. T1 = HPI
  211. GO TO 140
  212. 130 CONTINUE
  213. T1 = ATAN(YY/XX)
  214. T1 = ABS(T1)
  215. 140 CONTINUE
  216. IF (T2.GT.CAZ) GO TO 170
  217. C-----------------------------------------------------------------------
  218. C FORWARD RECURRENCE LOOP WHEN ABS(Z).GE.R2
  219. C-----------------------------------------------------------------------
  220. ETEST = AK/(PI*CAZ*TOL)
  221. FK = 1.0E0
  222. IF (ETEST.LT.1.0E0) GO TO 180
  223. FKS = 2.0E0
  224. RK = CAZ + CAZ + 2.0E0
  225. A1 = 0.0E0
  226. A2 = 1.0E0
  227. DO 150 I=1,KMAX
  228. AK = FHS/FKS
  229. BK = RK/(FK+1.0E0)
  230. TM = A2
  231. A2 = BK*A2 - AK*A1
  232. A1 = TM
  233. RK = RK + 2.0E0
  234. FKS = FKS + FK + FK + 2.0E0
  235. FHS = FHS + FK + FK
  236. FK = FK + 1.0E0
  237. TM = ABS(A2)*FK
  238. IF (ETEST.LT.TM) GO TO 160
  239. 150 CONTINUE
  240. GO TO 310
  241. 160 CONTINUE
  242. FK = FK + SPI*T1*SQRT(T2/CAZ)
  243. FHS = ABS(0.25E0-DNU2)
  244. GO TO 180
  245. 170 CONTINUE
  246. C-----------------------------------------------------------------------
  247. C COMPUTE BACKWARD INDEX K FOR ABS(Z).LT.R2
  248. C-----------------------------------------------------------------------
  249. A2 = SQRT(CAZ)
  250. AK = FPI*AK/(TOL*SQRT(A2))
  251. AA = 3.0E0*T1/(1.0E0+CAZ)
  252. BB = 14.7E0*T1/(28.0E0+CAZ)
  253. AK = (ALOG(AK)+CAZ*COS(AA)/(1.0E0+0.008E0*CAZ))/COS(BB)
  254. FK = 0.12125E0*AK*AK/CAZ + 1.5E0
  255. 180 CONTINUE
  256. K = FK
  257. C-----------------------------------------------------------------------
  258. C BACKWARD RECURRENCE LOOP FOR MILLER ALGORITHM
  259. C-----------------------------------------------------------------------
  260. FK = K
  261. FKS = FK*FK
  262. P1 = CZERO
  263. P2 = CMPLX(TOL,0.0E0)
  264. CS = P2
  265. DO 190 I=1,K
  266. A1 = FKS - FK
  267. A2 = (FKS+FK)/(A1+FHS)
  268. RK = 2.0E0/(FK+1.0E0)
  269. T1 = (FK+XX)*RK
  270. T2 = YY*RK
  271. PT = P2
  272. P2 = (P2*CMPLX(T1,T2)-P1)*CMPLX(A2,0.0E0)
  273. P1 = PT
  274. CS = CS + P2
  275. FKS = A1 - FK + 1.0E0
  276. FK = FK - 1.0E0
  277. 190 CONTINUE
  278. C-----------------------------------------------------------------------
  279. C COMPUTE (P2/CS)=(P2/ABS(CS))*(CONJG(CS)/ABS(CS)) FOR BETTER
  280. C SCALING
  281. C-----------------------------------------------------------------------
  282. TM = ABS(CS)
  283. PT = CMPLX(1.0E0/TM,0.0E0)
  284. S1 = PT*P2
  285. CS = CONJG(CS)*PT
  286. S1 = COEF*S1*CS
  287. IF (INU.GT.0 .OR. N.GT.1) GO TO 200
  288. ZD = Z
  289. IF(IFLAG.EQ.1) GO TO 270
  290. GO TO 240
  291. 200 CONTINUE
  292. C-----------------------------------------------------------------------
  293. C COMPUTE P1/P2=(P1/ABS(P2)*CONJG(P2)/ABS(P2) FOR SCALING
  294. C-----------------------------------------------------------------------
  295. TM = ABS(P2)
  296. PT = CMPLX(1.0E0/TM,0.0E0)
  297. P1 = PT*P1
  298. P2 = CONJG(P2)*PT
  299. PT = P1*P2
  300. S2 = S1*(CONE+(CMPLX(DNU+0.5E0,0.0E0)-PT)/Z)
  301. C-----------------------------------------------------------------------
  302. C FORWARD RECURSION ON THE THREE TERM RECURSION RELATION WITH
  303. C SCALING NEAR EXPONENT EXTREMES ON KFLAG=1 OR KFLAG=3
  304. C-----------------------------------------------------------------------
  305. 210 CONTINUE
  306. CK = CMPLX(DNU+1.0E0,0.0E0)*RZ
  307. IF (N.EQ.1) INU = INU - 1
  308. IF (INU.GT.0) GO TO 220
  309. IF (N.EQ.1) S1=S2
  310. ZD = Z
  311. IF(IFLAG.EQ.1) GO TO 270
  312. GO TO 240
  313. 220 CONTINUE
  314. INUB = 1
  315. IF (IFLAG.EQ.1) GO TO 261
  316. 225 CONTINUE
  317. P1 = CSR(KFLAG)
  318. ASCLE = BRY(KFLAG)
  319. DO 230 I=INUB,INU
  320. ST = S2
  321. S2 = CK*S2 + S1
  322. S1 = ST
  323. CK = CK + RZ
  324. IF (KFLAG.GE.3) GO TO 230
  325. P2 = S2*P1
  326. P2R = REAL(P2)
  327. P2I = AIMAG(P2)
  328. P2R = ABS(P2R)
  329. P2I = ABS(P2I)
  330. P2M = MAX(P2R,P2I)
  331. IF (P2M.LE.ASCLE) GO TO 230
  332. KFLAG = KFLAG + 1
  333. ASCLE = BRY(KFLAG)
  334. S1 = S1*P1
  335. S2 = P2
  336. S1 = S1*CSS(KFLAG)
  337. S2 = S2*CSS(KFLAG)
  338. P1 = CSR(KFLAG)
  339. 230 CONTINUE
  340. IF (N.EQ.1) S1 = S2
  341. 240 CONTINUE
  342. Y(1) = S1*CSR(KFLAG)
  343. IF (N.EQ.1) RETURN
  344. Y(2) = S2*CSR(KFLAG)
  345. IF (N.EQ.2) RETURN
  346. KK = 2
  347. 250 CONTINUE
  348. KK = KK + 1
  349. IF (KK.GT.N) RETURN
  350. P1 = CSR(KFLAG)
  351. ASCLE = BRY(KFLAG)
  352. DO 260 I=KK,N
  353. P2 = S2
  354. S2 = CK*S2 + S1
  355. S1 = P2
  356. CK = CK + RZ
  357. P2 = S2*P1
  358. Y(I) = P2
  359. IF (KFLAG.GE.3) GO TO 260
  360. P2R = REAL(P2)
  361. P2I = AIMAG(P2)
  362. P2R = ABS(P2R)
  363. P2I = ABS(P2I)
  364. P2M = MAX(P2R,P2I)
  365. IF (P2M.LE.ASCLE) GO TO 260
  366. KFLAG = KFLAG + 1
  367. ASCLE = BRY(KFLAG)
  368. S1 = S1*P1
  369. S2 = P2
  370. S1 = S1*CSS(KFLAG)
  371. S2 = S2*CSS(KFLAG)
  372. P1 = CSR(KFLAG)
  373. 260 CONTINUE
  374. RETURN
  375. C-----------------------------------------------------------------------
  376. C IFLAG=1 CASES, FORWARD RECURRENCE ON SCALED VALUES ON UNDERFLOW
  377. C-----------------------------------------------------------------------
  378. 261 CONTINUE
  379. HELIM = 0.5E0*ELIM
  380. ELM = EXP(-ELIM)
  381. CELM = CMPLX(ELM,0.0)
  382. ASCLE = BRY(1)
  383. ZD = Z
  384. XD = XX
  385. YD = YY
  386. IC = -1
  387. J = 2
  388. DO 262 I=1,INU
  389. ST = S2
  390. S2 = CK*S2+S1
  391. S1 = ST
  392. CK = CK+RZ
  393. AS = ABS(S2)
  394. ALAS = ALOG(AS)
  395. P2R = -XD+ALAS
  396. IF(P2R.LT.(-ELIM)) GO TO 263
  397. P2 = -ZD+CLOG(S2)
  398. P2R = REAL(P2)
  399. P2I = AIMAG(P2)
  400. P2M = EXP(P2R)/TOL
  401. P1 = CMPLX(P2M,0.0E0)*CMPLX(COS(P2I),SIN(P2I))
  402. CALL CUCHK(P1,NW,ASCLE,TOL)
  403. IF(NW.NE.0) GO TO 263
  404. J=3-J
  405. CY(J) = P1
  406. IF(IC.EQ.(I-1)) GO TO 264
  407. IC = I
  408. GO TO 262
  409. 263 CONTINUE
  410. IF(ALAS.LT.HELIM) GO TO 262
  411. XD = XD-ELIM
  412. S1 = S1*CELM
  413. S2 = S2*CELM
  414. ZD = CMPLX(XD,YD)
  415. 262 CONTINUE
  416. IF(N.EQ.1) S1 = S2
  417. GO TO 270
  418. 264 CONTINUE
  419. KFLAG = 1
  420. INUB = I+1
  421. S2 = CY(J)
  422. J = 3 - J
  423. S1 = CY(J)
  424. IF(INUB.LE.INU) GO TO 225
  425. IF(N.EQ.1) S1 = S2
  426. GO TO 240
  427. 270 CONTINUE
  428. Y(1) = S1
  429. IF (N.EQ.1) GO TO 280
  430. Y(2) = S2
  431. 280 CONTINUE
  432. ASCLE = BRY(1)
  433. CALL CKSCL(ZD, FNU, N, Y, NZ, RZ, ASCLE, TOL, ELIM)
  434. INU = N - NZ
  435. IF (INU.LE.0) RETURN
  436. KK = NZ + 1
  437. S1 = Y(KK)
  438. Y(KK) = S1*CSR(1)
  439. IF (INU.EQ.1) RETURN
  440. KK = NZ + 2
  441. S2 = Y(KK)
  442. Y(KK) = S2*CSR(1)
  443. IF (INU.EQ.2) RETURN
  444. T2 = FNU + (KK-1)
  445. CK = CMPLX(T2,0.0E0)*RZ
  446. KFLAG = 1
  447. GO TO 250
  448. 290 CONTINUE
  449. C-----------------------------------------------------------------------
  450. C SCALE BY EXP(Z), IFLAG = 1 CASES
  451. C-----------------------------------------------------------------------
  452. KODED = 2
  453. IFLAG = 1
  454. KFLAG = 2
  455. GO TO 120
  456. C-----------------------------------------------------------------------
  457. C FNU=HALF ODD INTEGER CASE, DNU=-0.5
  458. C-----------------------------------------------------------------------
  459. 300 CONTINUE
  460. S1 = COEF
  461. S2 = COEF
  462. GO TO 210
  463. 310 CONTINUE
  464. NZ=-2
  465. RETURN
  466. END