dbskin.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. *DECK DBSKIN
  2. SUBROUTINE DBSKIN (X, N, KODE, M, Y, NZ, IERR)
  3. C***BEGIN PROLOGUE DBSKIN
  4. C***PURPOSE Compute repeated integrals of the K-zero Bessel function.
  5. C***LIBRARY SLATEC
  6. C***CATEGORY C10F
  7. C***TYPE DOUBLE PRECISION (BSKIN-S, DBSKIN-D)
  8. C***KEYWORDS BICKLEY FUNCTIONS, EXPONENTIAL INTEGRAL,
  9. C INTEGRALS OF BESSEL FUNCTIONS, K-ZERO BESSEL FUNCTION
  10. C***AUTHOR Amos, D. E., (SNLA)
  11. C***DESCRIPTION
  12. C
  13. C The following definitions are used in DBSKIN:
  14. C
  15. C Definition 1
  16. C KI(0,X) = K-zero Bessel function.
  17. C
  18. C Definition 2
  19. C KI(N,X) = Bickley Function
  20. C = integral from X to infinity of KI(N-1,t)dt
  21. C for X .ge. 0 and N = 1,2,...
  22. C _____________________________________________________________________
  23. C DBSKIN computes a sequence of Bickley functions (repeated integrals
  24. C of the K0 Bessel function); i.e. for fixed X and N and for K=1,...,
  25. C DBSKIN computes the sequence
  26. C
  27. C Y(K) = KI(N+K-1,X) for KODE=1
  28. C or
  29. C Y(K) = EXP(X)*KI(N+K-1,X) for KODE=2,
  30. C
  31. C for N.ge.0 and X.ge.0 (N and X cannot be zero simultaneously).
  32. C
  33. C INPUT X is DOUBLE PRECISION
  34. C X - Argument, X .ge. 0.0D0
  35. C N - Order of first member of the sequence N .ge. 0
  36. C KODE - Selection parameter
  37. C KODE = 1 returns Y(K)= KI(N+K-1,X), K=1,M
  38. C = 2 returns Y(K)=EXP(X)*KI(N+K-1,X), K=1,M
  39. C M - Number of members in the sequence, M.ge.1
  40. C
  41. C OUTPUT Y is a DOUBLE PRECISION VECTOR
  42. C Y - A vector of dimension at least M containing the
  43. C sequence selected by KODE.
  44. C NZ - Underflow flag
  45. C NZ = 0 means computation completed
  46. C = 1 means an exponential underflow occurred on
  47. C KODE=1. Y(K)=0.0D0, K=1,...,M is returned
  48. C KODE=1 AND Y(K)=0.0E0, K=1,...,M IS RETURNED
  49. C IERR - Error flag
  50. C IERR=0, Normal return, computation completed
  51. C IERR=1, Input error, no computation
  52. C IERR=2, Error, no computation
  53. C Algorithm termination condition not met
  54. C
  55. C The nominal computational accuracy is the maximum of unit
  56. C roundoff (=D1MACH(4)) and 1.0D-18 since critical constants
  57. C are given to only 18 digits.
  58. C
  59. C BSKIN is the single precision version of DBSKIN.
  60. C
  61. C *Long Description:
  62. C
  63. C Numerical recurrence on
  64. C
  65. C (L-1)*KI(L,X) = X(KI(L-3,X) - KI(L-1,X)) + (L-2)*KI(L-2,X)
  66. C
  67. C is stable where recurrence is carried forward or backward
  68. C away from INT(X+0.5). The power series for indices 0,1 and 2
  69. C on 0.le.X.le.2 starts a stable recurrence for indices
  70. C greater than 2. If N is sufficiently large (N.gt.NLIM), the
  71. C uniform asymptotic expansion for N to INFINITY is more
  72. C economical. On X.gt.2 the recursion is started by evaluating
  73. C the uniform expansion for the three members whose indices are
  74. C closest to INT(X+0.5) within the set N,...,N+M-1. Forward
  75. C recurrence, backward recurrence or both complete the
  76. C sequence depending on the relation of INT(X+0.5) to the
  77. C indices N,...,N+M-1.
  78. C
  79. C***REFERENCES D. E. Amos, Uniform asymptotic expansions for
  80. C exponential integrals E(N,X) and Bickley functions
  81. C KI(N,X), ACM Transactions on Mathematical Software,
  82. C 1983.
  83. C D. E. Amos, A portable Fortran subroutine for the
  84. C Bickley functions KI(N,X), Algorithm 609, ACM
  85. C Transactions on Mathematical Software, 1983.
  86. C***ROUTINES CALLED D1MACH, DBKIAS, DBKISR, DEXINT, DGAMRN, I1MACH
  87. C***REVISION HISTORY (YYMMDD)
  88. C 820601 DATE WRITTEN
  89. C 890531 Changed all specific intrinsics to generic. (WRB)
  90. C 890911 Removed unnecessary intrinsics. (WRB)
  91. C 891006 Cosmetic changes to prologue. (WRB)
  92. C 891009 Removed unreferenced statement label. (WRB)
  93. C 891009 REVISION DATE from Version 3.2
  94. C 891214 Prologue converted to Version 4.0 format. (BAB)
  95. C 920501 Reformatted the REFERENCES section. (WRB)
  96. C***END PROLOGUE DBSKIN
  97. INTEGER I, ICASE, IERR, IL, I1M, K, KK, KODE, KTRMS, M,
  98. * M3, N, NE, NFLG, NL, NLIM, NN, NP, NS, NT, NZ
  99. INTEGER I1MACH
  100. DOUBLE PRECISION A, ENLIM, EXI, FN, GR, H, HN, HRTPI, SS, TOL,
  101. * T1, T2, W, X, XLIM, XNLIM, XP, Y, YS, YSS
  102. DOUBLE PRECISION DGAMRN, D1MACH
  103. DIMENSION EXI(102), A(50), YS(3), YSS(3), H(31), Y(*)
  104. SAVE A, HRTPI
  105. C-----------------------------------------------------------------------
  106. C COEFFICIENTS IN SERIES OF EXPONENTIAL INTEGRALS
  107. C-----------------------------------------------------------------------
  108. DATA A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8), A(9), A(10),
  109. * A(11), A(12), A(13), A(14), A(15), A(16), A(17), A(18), A(19),
  110. * A(20), A(21), A(22), A(23), A(24) /1.00000000000000000D+00,
  111. * 5.00000000000000000D-01,3.75000000000000000D-01,
  112. * 3.12500000000000000D-01,2.73437500000000000D-01,
  113. * 2.46093750000000000D-01,2.25585937500000000D-01,
  114. * 2.09472656250000000D-01,1.96380615234375000D-01,
  115. * 1.85470581054687500D-01,1.76197052001953125D-01,
  116. * 1.68188095092773438D-01,1.61180257797241211D-01,
  117. * 1.54981017112731934D-01,1.49445980787277222D-01,
  118. * 1.44464448094367981D-01,1.39949934091418982D-01,
  119. * 1.35833759559318423D-01,1.32060599571559578D-01,
  120. * 1.28585320635465905D-01,1.25370687619579257D-01,
  121. * 1.22385671247684513D-01,1.19604178719328047D-01,
  122. * 1.17004087877603524D-01/
  123. DATA A(25), A(26), A(27), A(28), A(29), A(30), A(31), A(32),
  124. * A(33), A(34), A(35), A(36), A(37), A(38), A(39), A(40), A(41),
  125. * A(42), A(43), A(44), A(45), A(46), A(47), A(48)
  126. * /1.14566502713486784D-01,1.12275172659217048D-01,
  127. * 1.10116034723462874D-01,1.08076848895250599D-01,
  128. * 1.06146905164978267D-01,1.04316786110409676D-01,
  129. * 1.02578173008569515D-01,1.00923686347140974D-01,
  130. * 9.93467537479668965D-02,9.78414999033007314D-02,
  131. * 9.64026543164874854D-02,9.50254735405376642D-02,
  132. * 9.37056752969190855D-02,9.24393823875012600D-02,
  133. * 9.12230747245078224D-02,9.00535481254756708D-02,
  134. * 8.89278787739072249D-02,8.78433924473961612D-02,
  135. * 8.67976377754033498D-02,8.57883629175498224D-02,
  136. * 8.48134951571231199D-02,8.38711229887106408D-02,
  137. * 8.29594803475290034D-02,8.20769326842574183D-02/
  138. DATA A(49), A(50) /8.12219646354630702D-02,8.03931690779583449D-02
  139. * /
  140. C-----------------------------------------------------------------------
  141. C SQRT(PI)/2
  142. C-----------------------------------------------------------------------
  143. DATA HRTPI /8.86226925452758014D-01/
  144. C
  145. C***FIRST EXECUTABLE STATEMENT DBSKIN
  146. IERR = 0
  147. NZ=0
  148. IF (X.LT.0.0D0) IERR=1
  149. IF (N.LT.0) IERR=1
  150. IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
  151. IF (M.LT.1) IERR=1
  152. IF (X.EQ.0.0D0 .AND. N.EQ.0) IERR=1
  153. IF (IERR.NE.0) RETURN
  154. IF (X.EQ.0.0D0) GO TO 300
  155. I1M = -I1MACH(15)
  156. T1 = 2.3026D0*D1MACH(5)*I1M
  157. XLIM = T1 - 3.228086D0
  158. T2 = T1 + (N+M-1)
  159. IF (T2.GT.1000.0D0) XLIM = T1 - 0.5D0*(LOG(T2)-0.451583D0)
  160. IF (X.GT.XLIM .AND. KODE.EQ.1) GO TO 320
  161. TOL = MAX(D1MACH(4),1.0D-18)
  162. I1M = I1MACH(14)
  163. C-----------------------------------------------------------------------
  164. C LN(NLIM) = 0.125*LN(EPS), NLIM = 2*KTRMS+N
  165. C-----------------------------------------------------------------------
  166. XNLIM = 0.287823D0*(I1M-1)*D1MACH(5)
  167. ENLIM = EXP(XNLIM)
  168. NLIM = INT(ENLIM) + 2
  169. NLIM = MIN(100,NLIM)
  170. NLIM = MAX(20,NLIM)
  171. M3 = MIN(M,3)
  172. NL = N + M - 1
  173. IF (X.GT.2.0D0) GO TO 130
  174. IF (N.GT.NLIM) GO TO 280
  175. C-----------------------------------------------------------------------
  176. C COMPUTATION BY SERIES FOR 0.LE.X.LE.2
  177. C-----------------------------------------------------------------------
  178. NFLG = 0
  179. NN = N
  180. IF (NL.LE.2) GO TO 60
  181. M3 = 3
  182. NN = 0
  183. NFLG = 1
  184. 60 CONTINUE
  185. XP = 1.0D0
  186. IF (KODE.EQ.2) XP = EXP(X)
  187. DO 80 I=1,M3
  188. CALL DBKISR(X, NN, W, IERR)
  189. IF(IERR.NE.0) RETURN
  190. W = W*XP
  191. IF (NN.LT.N) GO TO 70
  192. KK = NN - N + 1
  193. Y(KK) = W
  194. 70 CONTINUE
  195. YS(I) = W
  196. NN = NN + 1
  197. 80 CONTINUE
  198. IF (NFLG.EQ.0) RETURN
  199. NS = NN
  200. XP = 1.0D0
  201. 90 CONTINUE
  202. C-----------------------------------------------------------------------
  203. C FORWARD RECURSION SCALED BY EXP(X) ON ICASE=0,1,2
  204. C-----------------------------------------------------------------------
  205. FN = NS - 1
  206. IL = NL - NS + 1
  207. IF (IL.LE.0) RETURN
  208. DO 110 I=1,IL
  209. T1 = YS(2)
  210. T2 = YS(3)
  211. YS(3) = (X*(YS(1)-YS(3))+(FN-1.0D0)*YS(2))/FN
  212. YS(2) = T2
  213. YS(1) = T1
  214. FN = FN + 1.0D0
  215. IF (NS.LT.N) GO TO 100
  216. KK = NS - N + 1
  217. Y(KK) = YS(3)*XP
  218. 100 CONTINUE
  219. NS = NS + 1
  220. 110 CONTINUE
  221. RETURN
  222. C-----------------------------------------------------------------------
  223. C COMPUTATION BY ASYMPTOTIC EXPANSION FOR X.GT.2
  224. C-----------------------------------------------------------------------
  225. 130 CONTINUE
  226. W = X + 0.5D0
  227. NT = INT(W)
  228. IF (NL.GT.NT) GO TO 270
  229. C-----------------------------------------------------------------------
  230. C CASE NL.LE.NT, ICASE=0
  231. C-----------------------------------------------------------------------
  232. ICASE = 0
  233. NN = NL
  234. NFLG = MIN(M-M3,1)
  235. 140 CONTINUE
  236. KK = (NLIM-NN)/2
  237. KTRMS = MAX(0,KK)
  238. NS = NN + 1
  239. NP = NN - M3 + 1
  240. XP = 1.0D0
  241. IF (KODE.EQ.1) XP = EXP(-X)
  242. DO 150 I=1,M3
  243. KK = I
  244. CALL DBKIAS(X, NP, KTRMS, A, W, KK, NE, GR, H, IERR)
  245. IF(IERR.NE.0) RETURN
  246. YS(I) = W
  247. NP = NP + 1
  248. 150 CONTINUE
  249. C-----------------------------------------------------------------------
  250. C SUM SERIES OF EXPONENTIAL INTEGRALS BACKWARD
  251. C-----------------------------------------------------------------------
  252. IF (KTRMS.EQ.0) GO TO 160
  253. NE = KTRMS + KTRMS + 1
  254. NP = NN - M3 + 2
  255. CALL DEXINT(X, NP, 2, NE, TOL, EXI, NZ, IERR)
  256. IF (NZ.NE.0) GO TO 320
  257. 160 CONTINUE
  258. DO 190 I=1,M3
  259. SS = 0.0D0
  260. IF (KTRMS.EQ.0) GO TO 180
  261. KK = I + KTRMS + KTRMS - 2
  262. IL = KTRMS
  263. DO 170 K=1,KTRMS
  264. SS = SS + A(IL)*EXI(KK)
  265. KK = KK - 2
  266. IL = IL - 1
  267. 170 CONTINUE
  268. 180 CONTINUE
  269. YS(I) = YS(I) + SS
  270. 190 CONTINUE
  271. IF (ICASE.EQ.1) GO TO 200
  272. IF (NFLG.NE.0) GO TO 220
  273. 200 CONTINUE
  274. DO 210 I=1,M3
  275. Y(I) = YS(I)*XP
  276. 210 CONTINUE
  277. IF (ICASE.EQ.1 .AND. NFLG.EQ.1) GO TO 90
  278. RETURN
  279. 220 CONTINUE
  280. C-----------------------------------------------------------------------
  281. C BACKWARD RECURSION SCALED BY EXP(X) ICASE=0,2
  282. C-----------------------------------------------------------------------
  283. KK = NN - N + 1
  284. K = M3
  285. DO 230 I=1,M3
  286. Y(KK) = YS(K)*XP
  287. YSS(I) = YS(I)
  288. KK = KK - 1
  289. K = K - 1
  290. 230 CONTINUE
  291. IL = KK
  292. IF (IL.LE.0) GO TO 250
  293. FN = NN - 3
  294. DO 240 I=1,IL
  295. T1 = YS(2)
  296. T2 = YS(1)
  297. YS(1) = YS(2) + ((FN+2.0D0)*YS(3)-(FN+1.0D0)*YS(1))/X
  298. YS(2) = T2
  299. YS(3) = T1
  300. Y(KK) = YS(1)*XP
  301. KK = KK - 1
  302. FN = FN - 1.0D0
  303. 240 CONTINUE
  304. 250 CONTINUE
  305. IF (ICASE.NE.2) RETURN
  306. DO 260 I=1,M3
  307. YS(I) = YSS(I)
  308. 260 CONTINUE
  309. GO TO 90
  310. 270 CONTINUE
  311. IF (N.LT.NT) GO TO 290
  312. C-----------------------------------------------------------------------
  313. C ICASE=1, NT.LE.N.LE.NL WITH FORWARD RECURSION
  314. C-----------------------------------------------------------------------
  315. 280 CONTINUE
  316. NN = N + M3 - 1
  317. NFLG = MIN(M-M3,1)
  318. ICASE = 1
  319. GO TO 140
  320. C-----------------------------------------------------------------------
  321. C ICASE=2, N.LT.NT.LT.NL WITH BOTH FORWARD AND BACKWARD RECURSION
  322. C-----------------------------------------------------------------------
  323. 290 CONTINUE
  324. NN = NT + 1
  325. NFLG = MIN(M-M3,1)
  326. ICASE = 2
  327. GO TO 140
  328. C-----------------------------------------------------------------------
  329. C X=0 CASE
  330. C-----------------------------------------------------------------------
  331. 300 CONTINUE
  332. FN = N
  333. HN = 0.5D0*FN
  334. GR = DGAMRN(HN)
  335. Y(1) = HRTPI*GR
  336. IF (M.EQ.1) RETURN
  337. Y(2) = HRTPI/(HN*GR)
  338. IF (M.EQ.2) RETURN
  339. DO 310 K=3,M
  340. Y(K) = FN*Y(K-2)/(FN+1.0D0)
  341. FN = FN + 1.0D0
  342. 310 CONTINUE
  343. RETURN
  344. C-----------------------------------------------------------------------
  345. C UNDERFLOW ON KODE=1, X.GT.XLIM
  346. C-----------------------------------------------------------------------
  347. 320 CONTINUE
  348. NZ=M
  349. DO 330 I=1,M
  350. Y(I) = 0.0D0
  351. 330 CONTINUE
  352. RETURN
  353. END