besk0.f 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. *DECK BESK0
  2. FUNCTION BESK0 (X)
  3. C***BEGIN PROLOGUE BESK0
  4. C***PURPOSE Compute the modified (hyperbolic) Bessel function of the
  5. C third kind of order zero.
  6. C***LIBRARY SLATEC (FNLIB)
  7. C***CATEGORY C10B1
  8. C***TYPE SINGLE PRECISION (BESK0-S, DBESK0-D)
  9. C***KEYWORDS FNLIB, HYPERBOLIC BESSEL FUNCTION,
  10. C MODIFIED BESSEL FUNCTION, ORDER ZERO, SPECIAL FUNCTIONS,
  11. C THIRD KIND
  12. C***AUTHOR Fullerton, W., (LANL)
  13. C***DESCRIPTION
  14. C
  15. C BESK0(X) calculates the modified (hyperbolic) Bessel function
  16. C of the third kind of order zero for real argument X .GT. 0.0.
  17. C
  18. C Series for BK0 on the interval 0. to 4.00000D+00
  19. C with weighted error 3.57E-19
  20. C log weighted error 18.45
  21. C significant figures required 17.99
  22. C decimal places required 18.97
  23. C
  24. C***REFERENCES (NONE)
  25. C***ROUTINES CALLED BESI0, BESK0E, CSEVL, INITS, R1MACH, XERMSG
  26. C***REVISION HISTORY (YYMMDD)
  27. C 770401 DATE WRITTEN
  28. C 890531 Changed all specific intrinsics to generic. (WRB)
  29. C 890531 REVISION DATE from Version 3.2
  30. C 891214 Prologue converted to Version 4.0 format. (BAB)
  31. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  32. C 900326 Removed duplicate information from DESCRIPTION section.
  33. C (WRB)
  34. C***END PROLOGUE BESK0
  35. DIMENSION BK0CS(11)
  36. LOGICAL FIRST
  37. SAVE BK0CS, NTK0, XSML, XMAX, FIRST
  38. DATA BK0CS( 1) / -.0353273932 3390276872E0 /
  39. DATA BK0CS( 2) / .3442898999 246284869E0 /
  40. DATA BK0CS( 3) / .0359799365 1536150163E0 /
  41. DATA BK0CS( 4) / .0012646154 1144692592E0 /
  42. DATA BK0CS( 5) / .0000228621 2103119451E0 /
  43. DATA BK0CS( 6) / .0000002534 7910790261E0 /
  44. DATA BK0CS( 7) / .0000000019 0451637722E0 /
  45. DATA BK0CS( 8) / .0000000000 1034969525E0 /
  46. DATA BK0CS( 9) / .0000000000 0004259816E0 /
  47. DATA BK0CS(10) / .0000000000 0000013744E0 /
  48. DATA BK0CS(11) / .0000000000 0000000035E0 /
  49. DATA FIRST /.TRUE./
  50. C***FIRST EXECUTABLE STATEMENT BESK0
  51. IF (FIRST) THEN
  52. NTK0 = INITS (BK0CS, 11, 0.1*R1MACH(3))
  53. XSML = SQRT (4.0*R1MACH(3))
  54. XMAXT = -LOG(R1MACH(1))
  55. XMAX = XMAXT - 0.5*XMAXT*LOG(XMAXT)/(XMAXT+0.5) - 0.01
  56. ENDIF
  57. FIRST = .FALSE.
  58. C
  59. IF (X .LE. 0.) CALL XERMSG ('SLATEC', 'BESK0',
  60. + 'X IS ZERO OR NEGATIVE', 2, 2)
  61. IF (X.GT.2.) GO TO 20
  62. C
  63. Y = 0.
  64. IF (X.GT.XSML) Y = X*X
  65. BESK0 = -LOG(0.5*X)*BESI0(X) - .25 + CSEVL (.5*Y-1., BK0CS, NTK0)
  66. RETURN
  67. C
  68. 20 BESK0 = 0.
  69. IF (X .GT. XMAX) CALL XERMSG ('SLATEC', 'BESK0',
  70. + 'X SO BIG K0 UNDERFLOWS', 1, 1)
  71. IF (X.GT.XMAX) RETURN
  72. C
  73. BESK0 = EXP(-X) * BESK0E(X)
  74. C
  75. RETURN
  76. END