bkisr.f 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. *DECK BKISR
  2. SUBROUTINE BKISR (X, N, SUM, IERR)
  3. C***BEGIN PROLOGUE BKISR
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to BSKIN
  6. C***LIBRARY SLATEC
  7. C***TYPE SINGLE PRECISION (BKISR-S, DBKISR-D)
  8. C***AUTHOR Amos, D. E., (SNLA)
  9. C***DESCRIPTION
  10. C
  11. C BKISR computes repeated integrals of the K0 Bessel function
  12. C by the series for N=0,1, and 2.
  13. C
  14. C***SEE ALSO BSKIN
  15. C***ROUTINES CALLED PSIXN, R1MACH
  16. C***REVISION HISTORY (YYMMDD)
  17. C 820601 DATE WRITTEN
  18. C 890531 Changed all specific intrinsics to generic. (WRB)
  19. C 891214 Prologue converted to Version 4.0 format. (BAB)
  20. C 900328 Added TYPE section. (WRB)
  21. C 910722 Updated AUTHOR section. (ALS)
  22. C***END PROLOGUE BKISR
  23. INTEGER I, IERR, K, KK, KKN, K1, N, NP
  24. REAL AK, ATOL, BK, C, FK, FN, HX, HXS, POL, PR, SUM, TKP, TOL,
  25. * TRM, X, XLN
  26. REAL PSIXN, R1MACH
  27. DIMENSION C(2)
  28. SAVE C
  29. C
  30. DATA C(1), C(2) /1.57079632679489662E+00,1.0E0/
  31. C***FIRST EXECUTABLE STATEMENT BKISR
  32. IERR=0
  33. TOL = MAX(R1MACH(4),1.0E-18)
  34. IF (X.LT.TOL) GO TO 50
  35. PR = 1.0E0
  36. POL = 0.0E0
  37. IF (N.EQ.0) GO TO 20
  38. DO 10 I=1,N
  39. POL = -POL*X + C(I)
  40. PR = PR*X/I
  41. 10 CONTINUE
  42. 20 CONTINUE
  43. HX = X*0.5E0
  44. HXS = HX*HX
  45. XLN = LOG(HX)
  46. NP = N + 1
  47. TKP = 3.0E0
  48. FK = 2.0E0
  49. FN = N
  50. BK = 4.0E0
  51. AK = 2.0E0/((FN+1.0E0)*(FN+2.0E0))
  52. SUM = AK*(PSIXN(N+3)-PSIXN(3)+PSIXN(2)-XLN)
  53. ATOL = SUM*TOL*0.75E0
  54. DO 30 K=2,20
  55. AK = AK*(HXS/BK)*((TKP+1.0E0)/(TKP+FN+1.0E0))*(TKP/(TKP+FN))
  56. K1 = K + 1
  57. KK = K1 + K
  58. KKN = KK + N
  59. TRM = (PSIXN(K1)+PSIXN(KKN)-PSIXN(KK)-XLN)*AK
  60. SUM = SUM + TRM
  61. IF (ABS(TRM).LE.ATOL) GO TO 40
  62. TKP = TKP + 2.0E0
  63. BK = BK + TKP
  64. FK = FK + 1.0E0
  65. 30 CONTINUE
  66. GO TO 80
  67. 40 CONTINUE
  68. SUM = (SUM*HXS+PSIXN(NP)-XLN)*PR
  69. IF (N.EQ.1) SUM = -SUM
  70. SUM = POL + SUM
  71. RETURN
  72. C-----------------------------------------------------------------------
  73. C SMALL X CASE, X.LT.WORD TOLERANCE
  74. C-----------------------------------------------------------------------
  75. 50 CONTINUE
  76. IF (N.GT.0) GO TO 60
  77. HX = X*0.5E0
  78. SUM = PSIXN(1) - LOG(HX)
  79. RETURN
  80. 60 CONTINUE
  81. SUM = C(N)
  82. RETURN
  83. 80 CONTINUE
  84. IERR=2
  85. RETURN
  86. END