r9knus.f 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. *DECK R9KNUS
  2. SUBROUTINE R9KNUS (XNU, X, BKNU, BKNU1, ISWTCH)
  3. C***BEGIN PROLOGUE R9KNUS
  4. C***SUBSIDIARY
  5. C***PURPOSE Compute Bessel functions EXP(X)*K-SUB-XNU(X) and EXP(X)*
  6. C K-SUB-XNU+1(X) for 0.0 .LE. XNU .LT. 1.0.
  7. C***LIBRARY SLATEC (FNLIB)
  8. C***CATEGORY C10B3
  9. C***TYPE SINGLE PRECISION (R9KNUS-S, D9KNUS-D)
  10. C***KEYWORDS BESSEL FUNCTION, FNLIB, SPECIAL FUNCTIONS
  11. C***AUTHOR Fullerton, W., (LANL)
  12. C***DESCRIPTION
  13. C
  14. C Compute Bessel functions EXP(X) * K-sub-XNU (X) and
  15. C EXP(X) * K-sub-XNU+1 (X) for 0.0 .LE. XNU .LT. 1.0 .
  16. C
  17. C Series for C0K on the interval 0. to 2.50000D-01
  18. C with weighted error 1.60E-17
  19. C log weighted error 16.79
  20. C significant figures required 15.99
  21. C decimal places required 17.40
  22. C
  23. C Series for ZNU1 on the interval -7.00000D-01 to 0.
  24. C with weighted error 1.43E-17
  25. C log weighted error 16.85
  26. C significant figures required 16.08
  27. C decimal places required 17.38
  28. C
  29. C***REFERENCES (NONE)
  30. C***ROUTINES CALLED CSEVL, GAMMA, INITS, R1MACH, XERMSG
  31. C***REVISION HISTORY (YYMMDD)
  32. C 770601 DATE WRITTEN
  33. C 890531 Changed all specific intrinsics to generic. (WRB)
  34. C 890531 REVISION DATE from Version 3.2
  35. C 891214 Prologue converted to Version 4.0 format. (BAB)
  36. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  37. C 900720 Routine changed from user-callable to subsidiary. (WRB)
  38. C 900727 Added EXTERNAL statement. (WRB)
  39. C 920618 Removed space from variable names. (RWC, WRB)
  40. C***END PROLOGUE R9KNUS
  41. DIMENSION ALPHA(15), BETA(15), A(15), C0KCS(16), ZNU1CS(12)
  42. LOGICAL FIRST
  43. EXTERNAL GAMMA
  44. SAVE C0KCS, ZNU1CS, EULER, SQPI2, ALN2, NTC0K, NTZNU1,
  45. 1 XNUSML, XSML, ALNSML, ALNBIG, ALNEPS, FIRST
  46. DATA C0KCS( 1) / .0601830572 42626108E0 /
  47. DATA C0KCS( 2) / -.1536487143 3017286E0 /
  48. DATA C0KCS( 3) / -.0117511760 08210492E0 /
  49. DATA C0KCS( 4) / -.0008524878 88919795E0 /
  50. DATA C0KCS( 5) / -.0000613298 38767496E0 /
  51. DATA C0KCS( 6) / -.0000044052 28124551E0 /
  52. DATA C0KCS( 7) / -.0000003163 12467283E0 /
  53. DATA C0KCS( 8) / -.0000000227 10719382E0 /
  54. DATA C0KCS( 9) / -.0000000016 30564460E0 /
  55. DATA C0KCS(10) / -.0000000001 17069392E0 /
  56. DATA C0KCS(11) / -.0000000000 08405206E0 /
  57. DATA C0KCS(12) / -.0000000000 00603466E0 /
  58. DATA C0KCS(13) / -.0000000000 00043326E0 /
  59. DATA C0KCS(14) / -.0000000000 00003110E0 /
  60. DATA C0KCS(15) / -.0000000000 00000223E0 /
  61. DATA C0KCS(16) / -.0000000000 00000016E0 /
  62. DATA ZNU1CS( 1) / .2033067569 9419173E0 /
  63. DATA ZNU1CS( 2) / .1400779334 1321977E0 /
  64. DATA ZNU1CS( 3) / .0079167969 61001613E0 /
  65. DATA ZNU1CS( 4) / .0003398011 82532104E0 /
  66. DATA ZNU1CS( 5) / .0000117419 75688989E0 /
  67. DATA ZNU1CS( 6) / .0000003393 57570612E0 /
  68. DATA ZNU1CS( 7) / .0000000084 25941769E0 /
  69. DATA ZNU1CS( 8) / .0000000001 83336677E0 /
  70. DATA ZNU1CS( 9) / .0000000000 03549698E0 /
  71. DATA ZNU1CS(10) / .0000000000 00061903E0 /
  72. DATA ZNU1CS(11) / .0000000000 00000981E0 /
  73. DATA ZNU1CS(12) / .0000000000 00000014E0 /
  74. DATA EULER / 0.5772156649 0153286E0 /
  75. DATA SQPI2 / 1.253314137 3155003E0 /
  76. DATA ALN2 / 0.693147180 55994531E0 /
  77. DATA FIRST /.TRUE./
  78. C***FIRST EXECUTABLE STATEMENT R9KNUS
  79. IF (FIRST) THEN
  80. NTC0K = INITS (C0KCS, 16, 0.1*R1MACH(3))
  81. NTZNU1 = INITS (ZNU1CS, 12, 0.1*R1MACH(3))
  82. C
  83. XNUSML = SQRT (R1MACH(3)/8.0)
  84. XSML = 0.1*R1MACH(3)
  85. ALNSML = LOG (R1MACH(1))
  86. ALNBIG = LOG (R1MACH(2))
  87. ALNEPS = LOG (0.1*R1MACH(3))
  88. ENDIF
  89. FIRST = .FALSE.
  90. C
  91. IF (XNU .LT. 0. .OR. XNU .GE. 1.0) CALL XERMSG ('SLATEC',
  92. + 'R9KNUS', 'XNU MUST BE GE 0 AND LT 1', 1, 2)
  93. IF (X .LE. 0.) CALL XERMSG ('SLATEC', 'R9KNUS', 'X MUST BE GT 0',
  94. + 2, 2)
  95. C
  96. ISWTCH = 0
  97. IF (X.GT.2.0) GO TO 50
  98. C
  99. C X IS SMALL. COMPUTE K-SUB-XNU (X) AND THE DERIVATIVE OF K-SUB-XNU (X)
  100. C THEN FIND K-SUB-XNU+1 (X). XNU IS REDUCED TO THE INTERVAL (-.5,+.5)
  101. C THEN TO (0., .5), BECAUSE K OF NEGATIVE ORDER (-NU) = K OF POSITIVE
  102. C ORDER (+NU).
  103. C
  104. V = XNU
  105. IF (XNU.GT.0.5) V = 1.0 - XNU
  106. C
  107. C CAREFULLY FIND (X/2)**XNU AND Z**XNU WHERE Z = X*X/4.
  108. ALNZ = 2.0 * (LOG(X) - ALN2)
  109. C
  110. IF (X.GT.XNU) GO TO 20
  111. IF (-0.5*XNU*ALNZ-ALN2-LOG(XNU) .GT. ALNBIG) CALL XERMSG
  112. + ('SLATEC', 'R9KNUS', 'X SO SMALL BESSEL K-SUB-XNU OVERFLOWS',
  113. + 3, 2)
  114. C
  115. 20 VLNZ = V*ALNZ
  116. X2TOV = EXP (0.5*VLNZ)
  117. ZTOV = 0.0
  118. IF (VLNZ.GT.ALNSML) ZTOV = X2TOV**2
  119. C
  120. A0 = 0.5*GAMMA(1.0+V)
  121. B0 = 0.5*GAMMA(1.0-V)
  122. C0 = -EULER
  123. IF (ZTOV.GT.0.5 .AND. V.GT.XNUSML) C0 = -0.75 +
  124. 1 CSEVL ((8.0*V)*V-1., C0KCS, NTC0K)
  125. C
  126. IF (ZTOV.LE.0.5) ALPHA(1) = (A0-ZTOV*B0)/V
  127. IF (ZTOV.GT.0.5) ALPHA(1) = C0 - ALNZ*(0.75 +
  128. 1 CSEVL (VLNZ/0.35+1.0, ZNU1CS, NTZNU1))*B0
  129. BETA(1) = -0.5*(A0+ZTOV*B0)
  130. C
  131. Z = 0.0
  132. IF (X.GT.XSML) Z = 0.25*X*X
  133. NTERMS = MAX (2.0, 11.0+(8.*ALNZ-25.19-ALNEPS)/(4.28-ALNZ))
  134. DO 30 I=2,NTERMS
  135. XI = I - 1
  136. A0 = A0/(XI*(XI-V))
  137. B0 = B0/(XI*(XI+V))
  138. ALPHA(I) = (ALPHA(I-1)+2.0*XI*A0)/(XI*(XI+V))
  139. BETA(I) = (XI-0.5*V)*ALPHA(I) - ZTOV*B0
  140. 30 CONTINUE
  141. C
  142. BKNU = ALPHA(NTERMS)
  143. BKNUD = BETA(NTERMS)
  144. DO 40 II=2,NTERMS
  145. I = NTERMS + 1 - II
  146. BKNU = ALPHA(I) + BKNU*Z
  147. BKNUD = BETA(I) + BKNUD*Z
  148. 40 CONTINUE
  149. C
  150. EXPX = EXP(X)
  151. BKNU = EXPX*BKNU/X2TOV
  152. C
  153. IF (-0.5*(XNU+1.)*ALNZ-2.0*ALN2.GT.ALNBIG) ISWTCH = 1
  154. IF (ISWTCH.EQ.1) RETURN
  155. BKNUD = EXPX*BKNUD*2.0/(X2TOV*X)
  156. C
  157. IF (XNU.LE.0.5) BKNU1 = V*BKNU/X - BKNUD
  158. IF (XNU.LE.0.5) RETURN
  159. C
  160. BKNU0 = BKNU
  161. BKNU = -V*BKNU/X - BKNUD
  162. BKNU1 = 2.0*XNU*BKNU/X + BKNU0
  163. RETURN
  164. C
  165. C X IS LARGE. FIND K-SUB-XNU (X) AND K-SUB-XNU+1 (X) WITH Y. L. LUKE-S
  166. C RATIONAL EXPANSION.
  167. C
  168. 50 SQRTX = SQRT(X)
  169. IF (X.GT.1.0/XSML) GO TO 90
  170. AN = -1.56 + 4.0/X
  171. BN = -0.29 - 0.22/X
  172. NTERMS = MIN (15, MAX1 (3.0, AN+BN*ALNEPS))
  173. C
  174. DO 80 INU=1,2
  175. XMU = 0.
  176. IF (INU.EQ.1 .AND. XNU.GT.XNUSML) XMU = (4.0*XNU)*XNU
  177. IF (INU.EQ.2) XMU = 4.0*(ABS(XNU)+1.)**2
  178. C
  179. A(1) = 1.0 - XMU
  180. A(2) = 9.0 - XMU
  181. A(3) = 25.0 - XMU
  182. IF (A(2).EQ.0.) RESULT = SQPI2*(16.*X+XMU+7.)/(16.*X*SQRTX)
  183. IF (A(2).EQ.0.) GO TO 70
  184. C
  185. ALPHA(1) = 1.0
  186. ALPHA(2) = (16.*X+A(2))/A(2)
  187. ALPHA(3) = ((768.*X+48.*A(3))*X + A(2)*A(3))/(A(2)*A(3))
  188. C
  189. BETA(1) = 1.0
  190. BETA(2) = (16.*X+(XMU+7.))/A(2)
  191. BETA(3) = ((768.*X+48.*(XMU+23.))*X + ((XMU+62.)*XMU+129.))
  192. 1 / (A(2)*A(3))
  193. C
  194. IF (NTERMS.LT.4) GO TO 65
  195. DO 60 I=4,NTERMS
  196. N = I - 1
  197. X2N = 2*N - 1
  198. C
  199. A(I) = (X2N+2.)**2 - XMU
  200. QQ = 16.*X2N/A(I)
  201. P1 = -X2N*(12*N*N-20*N-A(1))/((X2N-2.)*A(I)) - QQ*X
  202. P2 = (12*N*N-28*N+8-A(1))/A(I) - QQ*X
  203. P3 = -X2N*A(I-3)/((X2N-2.)*A(I))
  204. C
  205. ALPHA(I) = -P1*ALPHA(I-1) - P2*ALPHA(I-2) - P3*ALPHA(I-3)
  206. BETA(I) = -P1*BETA(I-1) - P2*BETA(I-2) - P3*BETA(I-3)
  207. 60 CONTINUE
  208. C
  209. 65 RESULT = SQPI2*BETA(NTERMS)/(SQRTX*ALPHA(NTERMS))
  210. C
  211. 70 IF (INU.EQ.1) BKNU = RESULT
  212. IF (INU.EQ.2) BKNU1 = RESULT
  213. 80 CONTINUE
  214. RETURN
  215. C
  216. 90 BKNU = SQPI2/SQRTX
  217. BKNU1 = BKNU
  218. RETURN
  219. C
  220. END