besi.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. *DECK BESI
  2. SUBROUTINE BESI (X, ALPHA, KODE, N, Y, NZ)
  3. C***BEGIN PROLOGUE BESI
  4. C***PURPOSE Compute an N member sequence of I Bessel functions
  5. C I/SUB(ALPHA+K-1)/(X), K=1,...,N or scaled Bessel functions
  6. C EXP(-X)*I/SUB(ALPHA+K-1)/(X), K=1,...,N for non-negative
  7. C ALPHA and X.
  8. C***LIBRARY SLATEC
  9. C***CATEGORY C10B3
  10. C***TYPE SINGLE PRECISION (BESI-S, DBESI-D)
  11. C***KEYWORDS I BESSEL FUNCTION, SPECIAL FUNCTIONS
  12. C***AUTHOR Amos, D. E., (SNLA)
  13. C Daniel, S. L., (SNLA)
  14. C***DESCRIPTION
  15. C
  16. C Abstract
  17. C BESI computes an N member sequence of I Bessel functions
  18. C I/sub(ALPHA+K-1)/(X), K=1,...,N or scaled Bessel functions
  19. C EXP(-X)*I/sub(ALPHA+K-1)/(X), K=1,...,N for non-negative ALPHA
  20. C and X. A combination of the power series, the asymptotic
  21. C expansion for X to infinity, and the uniform asymptotic
  22. C expansion for NU to infinity are applied over subdivisions of
  23. C the (NU,X) plane. For values not covered by one of these
  24. C formulae, the order is incremented by an integer so that one
  25. C of these formulae apply. Backward recursion is used to reduce
  26. C orders by integer values. The asymptotic expansion for X to
  27. C infinity is used only when the entire sequence (specifically
  28. C the last member) lies within the region covered by the
  29. C expansion. Leading terms of these expansions are used to test
  30. C for over or underflow where appropriate. If a sequence is
  31. C requested and the last member would underflow, the result is
  32. C set to zero and the next lower order tried, etc., until a
  33. C member comes on scale or all are set to zero. An overflow
  34. C cannot occur with scaling.
  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 KODE - a parameter to indicate the scaling option
  43. C KODE=1 returns
  44. C Y(K)= I/sub(ALPHA+K-1)/(X),
  45. C K=1,...,N
  46. C KODE=2 returns
  47. C Y(K)=EXP(-X)*I/sub(ALPHA+K-1)/(X),
  48. C K=1,...,N
  49. C N - number of members in the sequence, N .GE. 1
  50. C
  51. C Output
  52. C Y - a vector whose first N components contain
  53. C values for I/sub(ALPHA+K-1)/(X) or scaled
  54. C values for EXP(-X)*I/sub(ALPHA+K-1)/(X),
  55. C K=1,...,N depending on KODE
  56. C NZ - number of components of Y set to zero due to
  57. C underflow,
  58. C NZ=0 , normal return, computation completed
  59. C NZ .NE. 0, last NZ components of Y set to zero,
  60. C Y(K)=0.0E0, K=N-NZ+1,...,N.
  61. C
  62. C Error Conditions
  63. C Improper input arguments - a fatal error
  64. C Overflow with KODE=1 - a fatal error
  65. C Underflow - a non-fatal error (NZ .NE. 0)
  66. C
  67. C***REFERENCES D. E. Amos, S. L. Daniel and M. K. Weston, CDC 6600
  68. C subroutines IBESS and JBESS for Bessel functions
  69. C I(NU,X) and J(NU,X), X .GE. 0, NU .GE. 0, ACM
  70. C Transactions on Mathematical Software 3, (1977),
  71. C pp. 76-92.
  72. C F. W. J. Olver, Tables of Bessel Functions of Moderate
  73. C or Large Orders, NPL Mathematical Tables 6, Her
  74. C Majesty's Stationery Office, London, 1962.
  75. C***ROUTINES CALLED ALNGAM, ASYIK, I1MACH, R1MACH, XERMSG
  76. C***REVISION HISTORY (YYMMDD)
  77. C 750101 DATE WRITTEN
  78. C 890531 Changed all specific intrinsics to generic. (WRB)
  79. C 890531 REVISION DATE from Version 3.2
  80. C 891214 Prologue converted to Version 4.0 format. (BAB)
  81. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  82. C 900326 Removed duplicate information from DESCRIPTION section.
  83. C (WRB)
  84. C 920501 Reformatted the REFERENCES section. (WRB)
  85. C***END PROLOGUE BESI
  86. C
  87. INTEGER I, IALP, IN, INLIM, IS, I1, K, KK, KM, KODE, KT,
  88. 1 N, NN, NS, NZ
  89. INTEGER I1MACH
  90. REAL AIN, AK, AKM, ALPHA, ANS, AP, ARG, ATOL, TOLLN, DFN,
  91. 1 DTM, DX, EARG, ELIM, ETX, FLGIK,FN, FNF, FNI,FNP1,FNU,GLN,RA,
  92. 2 RTTPI, S, SX, SXO2, S1, S2, T, TA, TB, TEMP, TFN, TM, TOL,
  93. 3 TRX, T2, X, XO2, XO2L, Y, Z
  94. REAL R1MACH, ALNGAM
  95. DIMENSION Y(*), TEMP(3)
  96. SAVE RTTPI, INLIM
  97. DATA RTTPI / 3.98942280401433E-01/
  98. DATA INLIM / 80 /
  99. C***FIRST EXECUTABLE STATEMENT BESI
  100. NZ = 0
  101. KT = 1
  102. C I1MACH(15) REPLACES I1MACH(12) IN A DOUBLE PRECISION CODE
  103. C I1MACH(14) REPLACES I1MACH(11) IN A DOUBLE PRECISION CODE
  104. RA = R1MACH(3)
  105. TOL = MAX(RA,1.0E-15)
  106. I1 = -I1MACH(12)
  107. GLN = R1MACH(5)
  108. ELIM = 2.303E0*(I1*GLN-3.0E0)
  109. C TOLLN = -LN(TOL)
  110. I1 = I1MACH(11)+1
  111. TOLLN = 2.303E0*GLN*I1
  112. TOLLN = MIN(TOLLN,34.5388E0)
  113. IF (N-1) 590, 10, 20
  114. 10 KT = 2
  115. 20 NN = N
  116. IF (KODE.LT.1 .OR. KODE.GT.2) GO TO 570
  117. IF (X) 600, 30, 80
  118. 30 IF (ALPHA) 580, 40, 50
  119. 40 Y(1) = 1.0E0
  120. IF (N.EQ.1) RETURN
  121. I1 = 2
  122. GO TO 60
  123. 50 I1 = 1
  124. 60 DO 70 I=I1,N
  125. Y(I) = 0.0E0
  126. 70 CONTINUE
  127. RETURN
  128. 80 CONTINUE
  129. IF (ALPHA.LT.0.0E0) GO TO 580
  130. C
  131. IALP = INT(ALPHA)
  132. FNI = IALP + N - 1
  133. FNF = ALPHA - IALP
  134. DFN = FNI + FNF
  135. FNU = DFN
  136. IN = 0
  137. XO2 = X*0.5E0
  138. SXO2 = XO2*XO2
  139. ETX = KODE - 1
  140. SX = ETX*X
  141. C
  142. C DECISION TREE FOR REGION WHERE SERIES, ASYMPTOTIC EXPANSION FOR X
  143. C TO INFINITY AND ASYMPTOTIC EXPANSION FOR NU TO INFINITY ARE
  144. C APPLIED.
  145. C
  146. IF (SXO2.LE.(FNU+1.0E0)) GO TO 90
  147. IF (X.LE.12.0E0) GO TO 110
  148. FN = 0.55E0*FNU*FNU
  149. FN = MAX(17.0E0,FN)
  150. IF (X.GE.FN) GO TO 430
  151. ANS = MAX(36.0E0-FNU,0.0E0)
  152. NS = INT(ANS)
  153. FNI = FNI + NS
  154. DFN = FNI + FNF
  155. FN = DFN
  156. IS = KT
  157. KM = N - 1 + NS
  158. IF (KM.GT.0) IS = 3
  159. GO TO 120
  160. 90 FN = FNU
  161. FNP1 = FN + 1.0E0
  162. XO2L = LOG(XO2)
  163. IS = KT
  164. IF (X.LE.0.5E0) GO TO 230
  165. NS = 0
  166. 100 FNI = FNI + NS
  167. DFN = FNI + FNF
  168. FN = DFN
  169. FNP1 = FN + 1.0E0
  170. IS = KT
  171. IF (N-1+NS.GT.0) IS = 3
  172. GO TO 230
  173. 110 XO2L = LOG(XO2)
  174. NS = INT(SXO2-FNU)
  175. GO TO 100
  176. 120 CONTINUE
  177. C
  178. C OVERFLOW TEST ON UNIFORM ASYMPTOTIC EXPANSION
  179. C
  180. IF (KODE.EQ.2) GO TO 130
  181. IF (ALPHA.LT.1.0E0) GO TO 150
  182. Z = X/ALPHA
  183. RA = SQRT(1.0E0+Z*Z)
  184. GLN = LOG((1.0E0+RA)/Z)
  185. T = RA*(1.0E0-ETX) + ETX/(Z+RA)
  186. ARG = ALPHA*(T-GLN)
  187. IF (ARG.GT.ELIM) GO TO 610
  188. IF (KM.EQ.0) GO TO 140
  189. 130 CONTINUE
  190. C
  191. C UNDERFLOW TEST ON UNIFORM ASYMPTOTIC EXPANSION
  192. C
  193. Z = X/FN
  194. RA = SQRT(1.0E0+Z*Z)
  195. GLN = LOG((1.0E0+RA)/Z)
  196. T = RA*(1.0E0-ETX) + ETX/(Z+RA)
  197. ARG = FN*(T-GLN)
  198. 140 IF (ARG.LT.(-ELIM)) GO TO 280
  199. GO TO 190
  200. 150 IF (X.GT.ELIM) GO TO 610
  201. GO TO 130
  202. C
  203. C UNIFORM ASYMPTOTIC EXPANSION FOR NU TO INFINITY
  204. C
  205. 160 IF (KM.NE.0) GO TO 170
  206. Y(1) = TEMP(3)
  207. RETURN
  208. 170 TEMP(1) = TEMP(3)
  209. IN = NS
  210. KT = 1
  211. I1 = 0
  212. 180 CONTINUE
  213. IS = 2
  214. FNI = FNI - 1.0E0
  215. DFN = FNI + FNF
  216. FN = DFN
  217. IF(I1.EQ.2) GO TO 350
  218. Z = X/FN
  219. RA = SQRT(1.0E0+Z*Z)
  220. GLN = LOG((1.0E0+RA)/Z)
  221. T = RA*(1.0E0-ETX) + ETX/(Z+RA)
  222. ARG = FN*(T-GLN)
  223. 190 CONTINUE
  224. I1 = ABS(3-IS)
  225. I1 = MAX(I1,1)
  226. FLGIK = 1.0E0
  227. CALL ASYIK(X,FN,KODE,FLGIK,RA,ARG,I1,TEMP(IS))
  228. GO TO (180, 350, 510), IS
  229. C
  230. C SERIES FOR (X/2)**2.LE.NU+1
  231. C
  232. 230 CONTINUE
  233. GLN = ALNGAM(FNP1)
  234. ARG = FN*XO2L - GLN - SX
  235. IF (ARG.LT.(-ELIM)) GO TO 300
  236. EARG = EXP(ARG)
  237. 240 CONTINUE
  238. S = 1.0E0
  239. IF (X.LT.TOL) GO TO 260
  240. AK = 3.0E0
  241. T2 = 1.0E0
  242. T = 1.0E0
  243. S1 = FN
  244. DO 250 K=1,17
  245. S2 = T2 + S1
  246. T = T*SXO2/S2
  247. S = S + T
  248. IF (ABS(T).LT.TOL) GO TO 260
  249. T2 = T2 + AK
  250. AK = AK + 2.0E0
  251. S1 = S1 + FN
  252. 250 CONTINUE
  253. 260 CONTINUE
  254. TEMP(IS) = S*EARG
  255. GO TO (270, 350, 500), IS
  256. 270 EARG = EARG*FN/XO2
  257. FNI = FNI - 1.0E0
  258. DFN = FNI + FNF
  259. FN = DFN
  260. IS = 2
  261. GO TO 240
  262. C
  263. C SET UNDERFLOW VALUE AND UPDATE PARAMETERS
  264. C
  265. 280 Y(NN) = 0.0E0
  266. NN = NN - 1
  267. FNI = FNI - 1.0E0
  268. DFN = FNI + FNF
  269. FN = DFN
  270. IF (NN-1) 340, 290, 130
  271. 290 KT = 2
  272. IS = 2
  273. GO TO 130
  274. 300 Y(NN) = 0.0E0
  275. NN = NN - 1
  276. FNP1 = FN
  277. FNI = FNI - 1.0E0
  278. DFN = FNI + FNF
  279. FN = DFN
  280. IF (NN-1) 340, 310, 320
  281. 310 KT = 2
  282. IS = 2
  283. 320 IF (SXO2.LE.FNP1) GO TO 330
  284. GO TO 130
  285. 330 ARG = ARG - XO2L + LOG(FNP1)
  286. IF (ARG.LT.(-ELIM)) GO TO 300
  287. GO TO 230
  288. 340 NZ = N - NN
  289. RETURN
  290. C
  291. C BACKWARD RECURSION SECTION
  292. C
  293. 350 CONTINUE
  294. NZ = N - NN
  295. 360 CONTINUE
  296. IF(KT.EQ.2) GO TO 420
  297. S1 = TEMP(1)
  298. S2 = TEMP(2)
  299. TRX = 2.0E0/X
  300. DTM = FNI
  301. TM = (DTM+FNF)*TRX
  302. IF (IN.EQ.0) GO TO 390
  303. C BACKWARD RECUR TO INDEX ALPHA+NN-1
  304. DO 380 I=1,IN
  305. S = S2
  306. S2 = TM*S2 + S1
  307. S1 = S
  308. DTM = DTM - 1.0E0
  309. TM = (DTM+FNF)*TRX
  310. 380 CONTINUE
  311. Y(NN) = S1
  312. IF (NN.EQ.1) RETURN
  313. Y(NN-1) = S2
  314. IF (NN.EQ.2) RETURN
  315. GO TO 400
  316. 390 CONTINUE
  317. C BACKWARD RECUR FROM INDEX ALPHA+NN-1 TO ALPHA
  318. Y(NN) = S1
  319. Y(NN-1) = S2
  320. IF (NN.EQ.2) RETURN
  321. 400 K = NN + 1
  322. DO 410 I=3,NN
  323. K = K - 1
  324. Y(K-2) = TM*Y(K-1) + Y(K)
  325. DTM = DTM - 1.0E0
  326. TM = (DTM+FNF)*TRX
  327. 410 CONTINUE
  328. RETURN
  329. 420 Y(1) = TEMP(2)
  330. RETURN
  331. C
  332. C ASYMPTOTIC EXPANSION FOR X TO INFINITY
  333. C
  334. 430 CONTINUE
  335. EARG = RTTPI/SQRT(X)
  336. IF (KODE.EQ.2) GO TO 440
  337. IF (X.GT.ELIM) GO TO 610
  338. EARG = EARG*EXP(X)
  339. 440 ETX = 8.0E0*X
  340. IS = KT
  341. IN = 0
  342. FN = FNU
  343. 450 DX = FNI + FNI
  344. TM = 0.0E0
  345. IF (FNI.EQ.0.0E0 .AND. ABS(FNF).LT.TOL) GO TO 460
  346. TM = 4.0E0*FNF*(FNI+FNI+FNF)
  347. 460 CONTINUE
  348. DTM = DX*DX
  349. S1 = ETX
  350. TRX = DTM - 1.0E0
  351. DX = -(TRX+TM)/ETX
  352. T = DX
  353. S = 1.0E0 + DX
  354. ATOL = TOL*ABS(S)
  355. S2 = 1.0E0
  356. AK = 8.0E0
  357. DO 470 K=1,25
  358. S1 = S1 + ETX
  359. S2 = S2 + AK
  360. DX = DTM - S2
  361. AP = DX + TM
  362. T = -T*AP/S1
  363. S = S + T
  364. IF (ABS(T).LE.ATOL) GO TO 480
  365. AK = AK + 8.0E0
  366. 470 CONTINUE
  367. 480 TEMP(IS) = S*EARG
  368. IF(IS.EQ.2) GO TO 360
  369. IS = 2
  370. FNI = FNI - 1.0E0
  371. DFN = FNI + FNF
  372. FN = DFN
  373. GO TO 450
  374. C
  375. C BACKWARD RECURSION WITH NORMALIZATION BY
  376. C ASYMPTOTIC EXPANSION FOR NU TO INFINITY OR POWER SERIES.
  377. C
  378. 500 CONTINUE
  379. C COMPUTATION OF LAST ORDER FOR SERIES NORMALIZATION
  380. AKM = MAX(3.0E0-FN,0.0E0)
  381. KM = INT(AKM)
  382. TFN = FN + KM
  383. TA = (GLN+TFN-0.9189385332E0-0.0833333333E0/TFN)/(TFN+0.5E0)
  384. TA = XO2L - TA
  385. TB = -(1.0E0-1.0E0/TFN)/TFN
  386. AIN = TOLLN/(-TA+SQRT(TA*TA-TOLLN*TB)) + 1.5E0
  387. IN = INT(AIN)
  388. IN = IN + KM
  389. GO TO 520
  390. 510 CONTINUE
  391. C COMPUTATION OF LAST ORDER FOR ASYMPTOTIC EXPANSION NORMALIZATION
  392. T = 1.0E0/(FN*RA)
  393. AIN = TOLLN/(GLN+SQRT(GLN*GLN+T*TOLLN)) + 1.5E0
  394. IN = INT(AIN)
  395. IF (IN.GT.INLIM) GO TO 160
  396. 520 CONTINUE
  397. TRX = 2.0E0/X
  398. DTM = FNI + IN
  399. TM = (DTM+FNF)*TRX
  400. TA = 0.0E0
  401. TB = TOL
  402. KK = 1
  403. 530 CONTINUE
  404. C
  405. C BACKWARD RECUR UNINDEXED
  406. C
  407. DO 540 I=1,IN
  408. S = TB
  409. TB = TM*TB + TA
  410. TA = S
  411. DTM = DTM - 1.0E0
  412. TM = (DTM+FNF)*TRX
  413. 540 CONTINUE
  414. C NORMALIZATION
  415. IF (KK.NE.1) GO TO 550
  416. TA = (TA/TB)*TEMP(3)
  417. TB = TEMP(3)
  418. KK = 2
  419. IN = NS
  420. IF (NS.NE.0) GO TO 530
  421. 550 Y(NN) = TB
  422. NZ = N - NN
  423. IF (NN.EQ.1) RETURN
  424. TB = TM*TB + TA
  425. K = NN - 1
  426. Y(K) = TB
  427. IF (NN.EQ.2) RETURN
  428. DTM = DTM - 1.0E0
  429. TM = (DTM+FNF)*TRX
  430. KM = K - 1
  431. C
  432. C BACKWARD RECUR INDEXED
  433. C
  434. DO 560 I=1,KM
  435. Y(K-1) = TM*Y(K) + Y(K+1)
  436. DTM = DTM - 1.0E0
  437. TM = (DTM+FNF)*TRX
  438. K = K - 1
  439. 560 CONTINUE
  440. RETURN
  441. C
  442. C
  443. C
  444. 570 CONTINUE
  445. CALL XERMSG ('SLATEC', 'BESI',
  446. + 'SCALING OPTION, KODE, NOT 1 OR 2.', 2, 1)
  447. RETURN
  448. 580 CONTINUE
  449. CALL XERMSG ('SLATEC', 'BESI', 'ORDER, ALPHA, LESS THAN ZERO.',
  450. + 2, 1)
  451. RETURN
  452. 590 CONTINUE
  453. CALL XERMSG ('SLATEC', 'BESI', 'N LESS THAN ONE.', 2, 1)
  454. RETURN
  455. 600 CONTINUE
  456. CALL XERMSG ('SLATEC', 'BESI', 'X LESS THAN ZERO.', 2, 1)
  457. RETURN
  458. 610 CONTINUE
  459. CALL XERMSG ('SLATEC', 'BESI',
  460. + 'OVERFLOW, X TOO LARGE FOR KODE = 1.', 6, 1)
  461. RETURN
  462. END