hkseq.f 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. *DECK HKSEQ
  2. SUBROUTINE HKSEQ (X, M, H, IERR)
  3. C***BEGIN PROLOGUE HKSEQ
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to BSKIN
  6. C***LIBRARY SLATEC
  7. C***TYPE SINGLE PRECISION (HKSEQ-S, DHKSEQ-D)
  8. C***AUTHOR Amos, D. E., (SNLA)
  9. C***DESCRIPTION
  10. C
  11. C HKSEQ is an adaptation of subroutine PSIFN described in the
  12. C reference below. HKSEQ generates the sequence
  13. C H(K,X) = (-X)**(K+1)*(PSI(K,X) PSI(K,X+0.5))/GAMMA(K+1), for
  14. C K=0,...,M.
  15. C
  16. C***SEE ALSO BSKIN
  17. C***REFERENCES D. E. Amos, A portable Fortran subroutine for
  18. C derivatives of the Psi function, Algorithm 610, ACM
  19. C Transactions on Mathematical Software 9, 4 (1983),
  20. C pp. 494-502.
  21. C***ROUTINES CALLED I1MACH, R1MACH
  22. C***REVISION HISTORY (YYMMDD)
  23. C 820601 DATE WRITTEN
  24. C 890531 Changed all specific intrinsics to generic. (WRB)
  25. C 891214 Prologue converted to Version 4.0 format. (BAB)
  26. C 900328 Added TYPE section. (WRB)
  27. C 910722 Updated AUTHOR section. (ALS)
  28. C 920528 DESCRIPTION and REFERENCES sections revised. (WRB)
  29. C***END PROLOGUE HKSEQ
  30. INTEGER I, IERR, J, K, M, MX, NX
  31. INTEGER I1MACH
  32. REAL B, FK, FLN, FN, FNP, H, HRX, RLN, RXSQ, R1M5, S, SLOPE, T,
  33. * TK, TRM, TRMH, TRMR, TST, U, V, WDTOL, X, XDMY, XH, XINC, XM,
  34. * XMIN, YINT
  35. REAL R1MACH
  36. DIMENSION B(22), TRM(22), TRMR(25), TRMH(25), U(25), V(25), H(*)
  37. SAVE B
  38. C-----------------------------------------------------------------------
  39. C SCALED BERNOULLI NUMBERS 2.0*B(2K)*(1-2**(-2K))
  40. C-----------------------------------------------------------------------
  41. DATA B(1), B(2), B(3), B(4), B(5), B(6), B(7), B(8), B(9), B(10),
  42. * B(11), B(12), B(13), B(14), B(15), B(16), B(17), B(18), B(19),
  43. * B(20), B(21), B(22) /1.00000000000000000E+00,
  44. * -5.00000000000000000E-01,2.50000000000000000E-01,
  45. * -6.25000000000000000E-02,4.68750000000000000E-02,
  46. * -6.64062500000000000E-02,1.51367187500000000E-01,
  47. * -5.06103515625000000E-01,2.33319091796875000E+00,
  48. * -1.41840972900390625E+01,1.09941936492919922E+02,
  49. * -1.05824747562408447E+03,1.23842434241771698E+04,
  50. * -1.73160495905935764E+05,2.85103429084961116E+06,
  51. * -5.45964619322445132E+07,1.20316174668075304E+09,
  52. * -3.02326315271452307E+10,8.59229286072319606E+11,
  53. * -2.74233104097776039E+13,9.76664637943633248E+14,
  54. * -3.85931586838450360E+16/
  55. C
  56. C***FIRST EXECUTABLE STATEMENT HKSEQ
  57. IERR=0
  58. WDTOL = MAX(R1MACH(4),1.0E-18)
  59. FN = M - 1
  60. FNP = FN + 1.0E0
  61. C-----------------------------------------------------------------------
  62. C COMPUTE XMIN
  63. C-----------------------------------------------------------------------
  64. R1M5 = R1MACH(5)
  65. RLN = R1M5*I1MACH(11)
  66. RLN = MIN(RLN,18.06E0)
  67. FLN = MAX(RLN,3.0E0) - 3.0E0
  68. YINT = 3.50E0 + 0.40E0*FLN
  69. SLOPE = 0.21E0 + FLN*(0.0006038E0*FLN+0.008677E0)
  70. XM = YINT + SLOPE*FN
  71. MX = INT(XM) + 1
  72. XMIN = MX
  73. C-----------------------------------------------------------------------
  74. C GENERATE H(M-1,XDMY)*XDMY**(M) BY THE ASYMPTOTIC EXPANSION
  75. C-----------------------------------------------------------------------
  76. XDMY = X
  77. XINC = 0.0E0
  78. IF (X.GE.XMIN) GO TO 10
  79. NX = INT(X)
  80. XINC = XMIN - NX
  81. XDMY = X + XINC
  82. 10 CONTINUE
  83. RXSQ = 1.0E0/(XDMY*XDMY)
  84. HRX = 0.5E0/XDMY
  85. TST = 0.5E0*WDTOL
  86. T = FNP*HRX
  87. C-----------------------------------------------------------------------
  88. C INITIALIZE COEFFICIENT ARRAY
  89. C-----------------------------------------------------------------------
  90. S = T*B(3)
  91. IF (ABS(S).LT.TST) GO TO 30
  92. TK = 2.0E0
  93. DO 20 K=4,22
  94. T = T*((TK+FN+1.0E0)/(TK+1.0E0))*((TK+FN)/(TK+2.0E0))*RXSQ
  95. TRM(K) = T*B(K)
  96. IF (ABS(TRM(K)).LT.TST) GO TO 30
  97. S = S + TRM(K)
  98. TK = TK + 2.0E0
  99. 20 CONTINUE
  100. GO TO 110
  101. 30 CONTINUE
  102. H(M) = S + 0.5E0
  103. IF (M.EQ.1) GO TO 70
  104. C-----------------------------------------------------------------------
  105. C GENERATE LOWER DERIVATIVES, I.LT.M-1
  106. C-----------------------------------------------------------------------
  107. DO 60 I=2,M
  108. FNP = FN
  109. FN = FN - 1.0E0
  110. S = FNP*HRX*B(3)
  111. IF (ABS(S).LT.TST) GO TO 50
  112. FK = FNP + 3.0E0
  113. DO 40 K=4,22
  114. TRM(K) = TRM(K)*FNP/FK
  115. IF (ABS(TRM(K)).LT.TST) GO TO 50
  116. S = S + TRM(K)
  117. FK = FK + 2.0E0
  118. 40 CONTINUE
  119. GO TO 110
  120. 50 CONTINUE
  121. MX = M - I + 1
  122. H(MX) = S + 0.5E0
  123. 60 CONTINUE
  124. 70 CONTINUE
  125. IF (XINC.EQ.0.0E0) RETURN
  126. C-----------------------------------------------------------------------
  127. C RECUR BACKWARD FROM XDMY TO X
  128. C-----------------------------------------------------------------------
  129. XH = X + 0.5E0
  130. S = 0.0E0
  131. NX = INT(XINC)
  132. DO 80 I=1,NX
  133. TRMR(I) = X/(X+NX-I)
  134. U(I) = TRMR(I)
  135. TRMH(I) = X/(XH+NX-I)
  136. V(I) = TRMH(I)
  137. S = S + U(I) - V(I)
  138. 80 CONTINUE
  139. MX = NX + 1
  140. TRMR(MX) = X/XDMY
  141. U(MX) = TRMR(MX)
  142. H(1) = H(1)*TRMR(MX) + S
  143. IF (M.EQ.1) RETURN
  144. DO 100 J=2,M
  145. S = 0.0E0
  146. DO 90 I=1,NX
  147. TRMR(I) = TRMR(I)*U(I)
  148. TRMH(I) = TRMH(I)*V(I)
  149. S = S + TRMR(I) - TRMH(I)
  150. 90 CONTINUE
  151. TRMR(MX) = TRMR(MX)*U(MX)
  152. H(J) = H(J)*TRMR(MX) + S
  153. 100 CONTINUE
  154. RETURN
  155. 110 CONTINUE
  156. IERR=2
  157. RETURN
  158. END