dbkisr.f 2.4 KB

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