besj.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. *DECK BESJ
  2. SUBROUTINE BESJ (X, ALPHA, N, Y, NZ)
  3. C***BEGIN PROLOGUE BESJ
  4. C***PURPOSE Compute an N member sequence of J Bessel functions
  5. C J/SUB(ALPHA+K-1)/(X), K=1,...,N for non-negative ALPHA
  6. C and X.
  7. C***LIBRARY SLATEC
  8. C***CATEGORY C10A3
  9. C***TYPE SINGLE PRECISION (BESJ-S, DBESJ-D)
  10. C***KEYWORDS J BESSEL FUNCTION, SPECIAL FUNCTIONS
  11. C***AUTHOR Amos, D. E., (SNLA)
  12. C Daniel, S. L., (SNLA)
  13. C Weston, M. K., (SNLA)
  14. C***DESCRIPTION
  15. C
  16. C Abstract
  17. C BESJ computes an N member sequence of J Bessel functions
  18. C J/sub(ALPHA+K-1)/(X), K=1,...,N for non-negative ALPHA and X.
  19. C A combination of the power series, the asymptotic expansion
  20. C for X to infinity and the uniform asymptotic expansion for
  21. C NU to infinity are applied over subdivisions of the (NU,X)
  22. C plane. For values of (NU,X) not covered by one of these
  23. C formulae, the order is incremented or decremented by integer
  24. C values into a region where one of the formulae apply. Backward
  25. C recursion is applied to reduce orders by integer values except
  26. C where the entire sequence lies in the oscillatory region. In
  27. C this case forward recursion is stable and values from the
  28. C asymptotic expansion for X to infinity start the recursion
  29. C when it is efficient to do so. Leading terms of the series
  30. C and uniform expansion are tested for underflow. If a sequence
  31. C is requested and the last member would underflow, the result
  32. C is set to zero and the next lower order tried, etc., until a
  33. C member comes on scale or all members are set to zero.
  34. C Overflow cannot occur.
  35. C
  36. C Description of Arguments
  37. C
  38. C Input
  39. C X - X .GE. 0.0E0
  40. C ALPHA - order of first member of the sequence,
  41. C ALPHA .GE. 0.0E0
  42. C N - number of members in the sequence, N .GE. 1
  43. C
  44. C Output
  45. C Y - a vector whose first N components contain
  46. C values for J/sub(ALPHA+K-1)/(X), K=1,...,N
  47. C NZ - number of components of Y set to zero due to
  48. C underflow,
  49. C NZ=0 , normal return, computation completed
  50. C NZ .NE. 0, last NZ components of Y set to zero,
  51. C Y(K)=0.0E0, K=N-NZ+1,...,N.
  52. C
  53. C Error Conditions
  54. C Improper input arguments - a fatal error
  55. C Underflow - a non-fatal error (NZ .NE. 0)
  56. C
  57. C***REFERENCES D. E. Amos, S. L. Daniel and M. K. Weston, CDC 6600
  58. C subroutines IBESS and JBESS for Bessel functions
  59. C I(NU,X) and J(NU,X), X .GE. 0, NU .GE. 0, ACM
  60. C Transactions on Mathematical Software 3, (1977),
  61. C pp. 76-92.
  62. C F. W. J. Olver, Tables of Bessel Functions of Moderate
  63. C or Large Orders, NPL Mathematical Tables 6, Her
  64. C Majesty's Stationery Office, London, 1962.
  65. C***ROUTINES CALLED ALNGAM, ASYJY, I1MACH, JAIRY, R1MACH, XERMSG
  66. C***REVISION HISTORY (YYMMDD)
  67. C 750101 DATE WRITTEN
  68. C 890531 Changed all specific intrinsics to generic. (WRB)
  69. C 890531 REVISION DATE from Version 3.2
  70. C 891214 Prologue converted to Version 4.0 format. (BAB)
  71. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  72. C 900326 Removed duplicate information from DESCRIPTION section.
  73. C (WRB)
  74. C 920501 Reformatted the REFERENCES section. (WRB)
  75. C***END PROLOGUE BESJ
  76. EXTERNAL JAIRY
  77. INTEGER I,IALP,IDALP,IFLW,IN,INLIM,IS,I1,I2,K,KK,KM,KT,N,NN,
  78. 1 NS,NZ
  79. INTEGER I1MACH
  80. REAL AK,AKM,ALPHA,ANS,AP,ARG,COEF,DALPHA,DFN,DTM,EARG,
  81. 1 ELIM1,ETX,FIDAL,FLGJY,FN,FNF,FNI,FNP1,FNU,FNULIM,
  82. 2 GLN,PDF,PIDT,PP,RDEN,RELB,RTTP,RTWO,RTX,RZDEN,
  83. 3 S,SA,SB,SXO2,S1,S2,T,TA,TAU,TB,TEMP,TFN,TM,TOL,
  84. 4 TOLLN,TRX,TX,T1,T2,WK,X,XO2,XO2L,Y,RTOL,SLIM
  85. SAVE RTWO, PDF, RTTP, PIDT, PP, INLIM, FNULIM
  86. REAL R1MACH, ALNGAM
  87. DIMENSION Y(*), TEMP(3), FNULIM(2), PP(4), WK(7)
  88. DATA RTWO,PDF,RTTP,PIDT / 1.34839972492648E+00,
  89. 1 7.85398163397448E-01, 7.97884560802865E-01, 1.57079632679490E+00/
  90. DATA PP(1), PP(2), PP(3), PP(4) / 8.72909153935547E+00,
  91. 1 2.65693932265030E-01, 1.24578576865586E-01, 7.70133747430388E-04/
  92. DATA INLIM / 150 /
  93. DATA FNULIM(1), FNULIM(2) / 100.0E0, 60.0E0 /
  94. C***FIRST EXECUTABLE STATEMENT BESJ
  95. NZ = 0
  96. KT = 1
  97. NS=0
  98. C I1MACH(14) REPLACES I1MACH(11) IN A DOUBLE PRECISION CODE
  99. C I1MACH(15) REPLACES I1MACH(12) IN A DOUBLE PRECISION CODE
  100. TA = R1MACH(3)
  101. TOL = MAX(TA,1.0E-15)
  102. I1 = I1MACH(11) + 1
  103. I2 = I1MACH(12)
  104. TB = R1MACH(5)
  105. ELIM1 = -2.303E0*(I2*TB+3.0E0)
  106. RTOL=1.0E0/TOL
  107. SLIM=R1MACH(1)*1.0E+3*RTOL
  108. C TOLLN = -LN(TOL)
  109. TOLLN = 2.303E0*TB*I1
  110. TOLLN = MIN(TOLLN,34.5388E0)
  111. IF (N-1) 720, 10, 20
  112. 10 KT = 2
  113. 20 NN = N
  114. IF (X) 730, 30, 80
  115. 30 IF (ALPHA) 710, 40, 50
  116. 40 Y(1) = 1.0E0
  117. IF (N.EQ.1) RETURN
  118. I1 = 2
  119. GO TO 60
  120. 50 I1 = 1
  121. 60 DO 70 I=I1,N
  122. Y(I) = 0.0E0
  123. 70 CONTINUE
  124. RETURN
  125. 80 CONTINUE
  126. IF (ALPHA.LT.0.0E0) GO TO 710
  127. C
  128. IALP = INT(ALPHA)
  129. FNI = IALP + N - 1
  130. FNF = ALPHA - IALP
  131. DFN = FNI + FNF
  132. FNU = DFN
  133. XO2 = X*0.5E0
  134. SXO2 = XO2*XO2
  135. C
  136. C DECISION TREE FOR REGION WHERE SERIES, ASYMPTOTIC EXPANSION FOR X
  137. C TO INFINITY AND ASYMPTOTIC EXPANSION FOR NU TO INFINITY ARE
  138. C APPLIED.
  139. C
  140. IF (SXO2.LE.(FNU+1.0E0)) GO TO 90
  141. TA = MAX(20.0E0,FNU)
  142. IF (X.GT.TA) GO TO 120
  143. IF (X.GT.12.0E0) GO TO 110
  144. XO2L = LOG(XO2)
  145. NS = INT(SXO2-FNU) + 1
  146. GO TO 100
  147. 90 FN = FNU
  148. FNP1 = FN + 1.0E0
  149. XO2L = LOG(XO2)
  150. IS = KT
  151. IF (X.LE.0.50E0) GO TO 330
  152. NS = 0
  153. 100 FNI = FNI + NS
  154. DFN = FNI + FNF
  155. FN = DFN
  156. FNP1 = FN + 1.0E0
  157. IS = KT
  158. IF (N-1+NS.GT.0) IS = 3
  159. GO TO 330
  160. 110 ANS = MAX(36.0E0-FNU,0.0E0)
  161. NS = INT(ANS)
  162. FNI = FNI + NS
  163. DFN = FNI + FNF
  164. FN = DFN
  165. IS = KT
  166. IF (N-1+NS.GT.0) IS = 3
  167. GO TO 130
  168. 120 CONTINUE
  169. RTX = SQRT(X)
  170. TAU = RTWO*RTX
  171. TA = TAU + FNULIM(KT)
  172. IF (FNU.LE.TA) GO TO 480
  173. FN = FNU
  174. IS = KT
  175. C
  176. C UNIFORM ASYMPTOTIC EXPANSION FOR NU TO INFINITY
  177. C
  178. 130 CONTINUE
  179. I1 = ABS(3-IS)
  180. I1 = MAX(I1,1)
  181. FLGJY = 1.0E0
  182. CALL ASYJY(JAIRY,X,FN,FLGJY,I1,TEMP(IS),WK,IFLW)
  183. IF(IFLW.NE.0) GO TO 380
  184. GO TO (320, 450, 620), IS
  185. 310 TEMP(1) = TEMP(3)
  186. KT = 1
  187. 320 IS = 2
  188. FNI = FNI - 1.0E0
  189. DFN = FNI + FNF
  190. FN = DFN
  191. IF(I1.EQ.2) GO TO 450
  192. GO TO 130
  193. C
  194. C SERIES FOR (X/2)**2.LE.NU+1
  195. C
  196. 330 CONTINUE
  197. GLN = ALNGAM(FNP1)
  198. ARG = FN*XO2L - GLN
  199. IF (ARG.LT.(-ELIM1)) GO TO 400
  200. EARG = EXP(ARG)
  201. 340 CONTINUE
  202. S = 1.0E0
  203. IF (X.LT.TOL) GO TO 360
  204. AK = 3.0E0
  205. T2 = 1.0E0
  206. T = 1.0E0
  207. S1 = FN
  208. DO 350 K=1,17
  209. S2 = T2 + S1
  210. T = -T*SXO2/S2
  211. S = S + T
  212. IF (ABS(T).LT.TOL) GO TO 360
  213. T2 = T2 + AK
  214. AK = AK + 2.0E0
  215. S1 = S1 + FN
  216. 350 CONTINUE
  217. 360 CONTINUE
  218. TEMP(IS) = S*EARG
  219. GO TO (370, 450, 610), IS
  220. 370 EARG = EARG*FN/XO2
  221. FNI = FNI - 1.0E0
  222. DFN = FNI + FNF
  223. FN = DFN
  224. IS = 2
  225. GO TO 340
  226. C
  227. C SET UNDERFLOW VALUE AND UPDATE PARAMETERS
  228. C UNDERFLOW CAN ONLY OCCUR FOR NS=0 SINCE THE ORDER MUST BE
  229. C LARGER THAN 36. THEREFORE, NS NEED NOT BE CONSIDERED.
  230. C
  231. 380 Y(NN) = 0.0E0
  232. NN = NN - 1
  233. FNI = FNI - 1.0E0
  234. DFN = FNI + FNF
  235. FN = DFN
  236. IF (NN-1) 440, 390, 130
  237. 390 KT = 2
  238. IS = 2
  239. GO TO 130
  240. 400 Y(NN) = 0.0E0
  241. NN = NN - 1
  242. FNP1 = FN
  243. FNI = FNI - 1.0E0
  244. DFN = FNI + FNF
  245. FN = DFN
  246. IF (NN-1) 440, 410, 420
  247. 410 KT = 2
  248. IS = 2
  249. 420 IF (SXO2.LE.FNP1) GO TO 430
  250. GO TO 130
  251. 430 ARG = ARG - XO2L + LOG(FNP1)
  252. IF (ARG.LT.(-ELIM1)) GO TO 400
  253. GO TO 330
  254. 440 NZ = N - NN
  255. RETURN
  256. C
  257. C BACKWARD RECURSION SECTION
  258. C
  259. 450 CONTINUE
  260. IF(NS.NE.0) GO TO 451
  261. NZ = N - NN
  262. IF (KT.EQ.2) GO TO 470
  263. C BACKWARD RECUR FROM INDEX ALPHA+NN-1 TO ALPHA
  264. Y(NN) = TEMP(1)
  265. Y(NN-1) = TEMP(2)
  266. IF (NN.EQ.2) RETURN
  267. 451 CONTINUE
  268. TRX = 2.0E0/X
  269. DTM = FNI
  270. TM = (DTM+FNF)*TRX
  271. AK=1.0E0
  272. TA=TEMP(1)
  273. TB=TEMP(2)
  274. IF(ABS(TA).GT.SLIM) GO TO 455
  275. TA=TA*RTOL
  276. TB=TB*RTOL
  277. AK=TOL
  278. 455 CONTINUE
  279. KK=2
  280. IN=NS-1
  281. IF(IN.EQ.0) GO TO 690
  282. IF(NS.NE.0) GO TO 670
  283. K=NN-2
  284. DO 460 I=3,NN
  285. S=TB
  286. TB=TM*TB-TA
  287. TA=S
  288. Y(K)=TB*AK
  289. K=K-1
  290. DTM = DTM - 1.0E0
  291. TM = (DTM+FNF)*TRX
  292. 460 CONTINUE
  293. RETURN
  294. 470 Y(1) = TEMP(2)
  295. RETURN
  296. C
  297. C ASYMPTOTIC EXPANSION FOR X TO INFINITY WITH FORWARD RECURSION IN
  298. C OSCILLATORY REGION X.GT.MAX(20, NU), PROVIDED THE LAST MEMBER
  299. C OF THE SEQUENCE IS ALSO IN THE REGION.
  300. C
  301. 480 CONTINUE
  302. IN = INT(ALPHA-TAU+2.0E0)
  303. IF (IN.LE.0) GO TO 490
  304. IDALP = IALP - IN - 1
  305. KT = 1
  306. GO TO 500
  307. 490 CONTINUE
  308. IDALP = IALP
  309. IN = 0
  310. 500 IS = KT
  311. FIDAL = IDALP
  312. DALPHA = FIDAL + FNF
  313. ARG = X - PIDT*DALPHA - PDF
  314. SA = SIN(ARG)
  315. SB = COS(ARG)
  316. COEF = RTTP/RTX
  317. ETX = 8.0E0*X
  318. 510 CONTINUE
  319. DTM = FIDAL + FIDAL
  320. DTM = DTM*DTM
  321. TM = 0.0E0
  322. IF (FIDAL.EQ.0.0E0 .AND. ABS(FNF).LT.TOL) GO TO 520
  323. TM = 4.0E0*FNF*(FIDAL+FIDAL+FNF)
  324. 520 CONTINUE
  325. TRX = DTM - 1.0E0
  326. T2 = (TRX+TM)/ETX
  327. S2 = T2
  328. RELB = TOL*ABS(T2)
  329. T1 = ETX
  330. S1 = 1.0E0
  331. FN = 1.0E0
  332. AK = 8.0E0
  333. DO 530 K=1,13
  334. T1 = T1 + ETX
  335. FN = FN + AK
  336. TRX = DTM - FN
  337. AP = TRX + TM
  338. T2 = -T2*AP/T1
  339. S1 = S1 + T2
  340. T1 = T1 + ETX
  341. AK = AK + 8.0E0
  342. FN = FN + AK
  343. TRX = DTM - FN
  344. AP = TRX + TM
  345. T2 = T2*AP/T1
  346. S2 = S2 + T2
  347. IF (ABS(T2).LE.RELB) GO TO 540
  348. AK = AK + 8.0E0
  349. 530 CONTINUE
  350. 540 TEMP(IS) = COEF*(S1*SB-S2*SA)
  351. IF(IS.EQ.2) GO TO 560
  352. FIDAL = FIDAL + 1.0E0
  353. DALPHA = FIDAL + FNF
  354. IS = 2
  355. TB = SA
  356. SA = -SB
  357. SB = TB
  358. GO TO 510
  359. C
  360. C FORWARD RECURSION SECTION
  361. C
  362. 560 IF (KT.EQ.2) GO TO 470
  363. S1 = TEMP(1)
  364. S2 = TEMP(2)
  365. TX = 2.0E0/X
  366. TM = DALPHA*TX
  367. IF (IN.EQ.0) GO TO 580
  368. C
  369. C FORWARD RECUR TO INDEX ALPHA
  370. C
  371. DO 570 I=1,IN
  372. S = S2
  373. S2 = TM*S2 - S1
  374. TM = TM + TX
  375. S1 = S
  376. 570 CONTINUE
  377. IF (NN.EQ.1) GO TO 600
  378. S = S2
  379. S2 = TM*S2 - S1
  380. TM = TM + TX
  381. S1 = S
  382. 580 CONTINUE
  383. C
  384. C FORWARD RECUR FROM INDEX ALPHA TO ALPHA+N-1
  385. C
  386. Y(1) = S1
  387. Y(2) = S2
  388. IF (NN.EQ.2) RETURN
  389. DO 590 I=3,NN
  390. Y(I) = TM*Y(I-1) - Y(I-2)
  391. TM = TM + TX
  392. 590 CONTINUE
  393. RETURN
  394. 600 Y(1) = S2
  395. RETURN
  396. C
  397. C BACKWARD RECURSION WITH NORMALIZATION BY
  398. C ASYMPTOTIC EXPANSION FOR NU TO INFINITY OR POWER SERIES.
  399. C
  400. 610 CONTINUE
  401. C COMPUTATION OF LAST ORDER FOR SERIES NORMALIZATION
  402. AKM = MAX(3.0E0-FN,0.0E0)
  403. KM = INT(AKM)
  404. TFN = FN + KM
  405. TA = (GLN+TFN-0.9189385332E0-0.0833333333E0/TFN)/(TFN+0.5E0)
  406. TA = XO2L - TA
  407. TB = -(1.0E0-1.5E0/TFN)/TFN
  408. AKM = TOLLN/(-TA+SQRT(TA*TA-TOLLN*TB)) + 1.5E0
  409. IN = KM + INT(AKM)
  410. GO TO 660
  411. 620 CONTINUE
  412. C COMPUTATION OF LAST ORDER FOR ASYMPTOTIC EXPANSION NORMALIZATION
  413. GLN = WK(3) + WK(2)
  414. IF (WK(6).GT.30.0E0) GO TO 640
  415. RDEN = (PP(4)*WK(6)+PP(3))*WK(6) + 1.0E0
  416. RZDEN = PP(1) + PP(2)*WK(6)
  417. TA = RZDEN/RDEN
  418. IF (WK(1).LT.0.10E0) GO TO 630
  419. TB = GLN/WK(5)
  420. GO TO 650
  421. 630 TB=(1.259921049E0+(0.1679894730E0+0.0887944358E0*WK(1))*WK(1))
  422. 1 /WK(7)
  423. GO TO 650
  424. 640 CONTINUE
  425. TA = 0.5E0*TOLLN/WK(4)
  426. TA=((0.0493827160E0*TA-0.1111111111E0)*TA+0.6666666667E0)*TA*WK(6)
  427. IF (WK(1).LT.0.10E0) GO TO 630
  428. TB = GLN/WK(5)
  429. 650 IN = INT(TA/TB+1.5E0)
  430. IF (IN.GT.INLIM) GO TO 310
  431. 660 CONTINUE
  432. DTM = FNI + IN
  433. TRX = 2.0E0/X
  434. TM = (DTM+FNF)*TRX
  435. TA = 0.0E0
  436. TB = TOL
  437. KK = 1
  438. AK=1.0E0
  439. 670 CONTINUE
  440. C
  441. C BACKWARD RECUR UNINDEXED AND SCALE WHEN MAGNITUDES ARE CLOSE TO
  442. C UNDERFLOW LIMITS (LESS THAN SLIM=R1MACH(1)*1.0E+3/TOL)
  443. C
  444. DO 680 I=1,IN
  445. S = TB
  446. TB = TM*TB - TA
  447. TA = S
  448. DTM = DTM - 1.0E0
  449. TM = (DTM+FNF)*TRX
  450. 680 CONTINUE
  451. C NORMALIZATION
  452. IF (KK.NE.1) GO TO 690
  453. S=TEMP(3)
  454. SA=TA/TB
  455. TA=S
  456. TB=S
  457. IF(ABS(S).GT.SLIM) GO TO 685
  458. TA=TA*RTOL
  459. TB=TB*RTOL
  460. AK=TOL
  461. 685 CONTINUE
  462. TA=TA*SA
  463. KK = 2
  464. IN = NS
  465. IF (NS.NE.0) GO TO 670
  466. 690 Y(NN) = TB*AK
  467. NZ = N - NN
  468. IF (NN.EQ.1) RETURN
  469. K = NN - 1
  470. S=TB
  471. TB = TM*TB - TA
  472. TA=S
  473. Y(K)=TB*AK
  474. IF (NN.EQ.2) RETURN
  475. DTM = DTM - 1.0E0
  476. TM = (DTM+FNF)*TRX
  477. K=NN-2
  478. C
  479. C BACKWARD RECUR INDEXED
  480. C
  481. DO 700 I=3,NN
  482. S=TB
  483. TB = TM*TB - TA
  484. TA=S
  485. Y(K)=TB*AK
  486. DTM = DTM - 1.0E0
  487. TM = (DTM+FNF)*TRX
  488. K = K - 1
  489. 700 CONTINUE
  490. RETURN
  491. C
  492. C
  493. C
  494. 710 CONTINUE
  495. CALL XERMSG ('SLATEC', 'BESJ', 'ORDER, ALPHA, LESS THAN ZERO.',
  496. + 2, 1)
  497. RETURN
  498. 720 CONTINUE
  499. CALL XERMSG ('SLATEC', 'BESJ', 'N LESS THAN ONE.', 2, 1)
  500. RETURN
  501. 730 CONTINUE
  502. CALL XERMSG ('SLATEC', 'BESJ', 'X LESS THAN ZERO.', 2, 1)
  503. RETURN
  504. END