dchu.f 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. *DECK DCHU
  2. DOUBLE PRECISION FUNCTION DCHU (A, B, X)
  3. C***BEGIN PROLOGUE DCHU
  4. C***PURPOSE Compute the logarithmic confluent hypergeometric function.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C11
  7. C***TYPE DOUBLE PRECISION (CHU-S, DCHU-D)
  8. C***KEYWORDS FNLIB, LOGARITHMIC CONFLUENT HYPERGEOMETRIC FUNCTION,
  9. C SPECIAL FUNCTIONS
  10. C***AUTHOR Fullerton, W., (LANL)
  11. C***DESCRIPTION
  12. C
  13. C DCHU(A,B,X) calculates the double precision logarithmic confluent
  14. C hypergeometric function U(A,B,X) for double precision arguments
  15. C A, B, and X.
  16. C
  17. C This routine is not valid when 1+A-B is close to zero if X is small.
  18. C
  19. C***REFERENCES (NONE)
  20. C***ROUTINES CALLED D1MACH, D9CHU, DEXPRL, DGAMMA, DGAMR, DPOCH,
  21. C DPOCH1, XERMSG
  22. C***REVISION HISTORY (YYMMDD)
  23. C 770801 DATE WRITTEN
  24. C 890531 Changed all specific intrinsics to generic. (WRB)
  25. C 890531 REVISION DATE from Version 3.2
  26. C 891214 Prologue converted to Version 4.0 format. (BAB)
  27. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  28. C 900727 Added EXTERNAL statement. (WRB)
  29. C***END PROLOGUE DCHU
  30. DOUBLE PRECISION A, B, X, AINTB, ALNX, A0, BEPS, B0, C0, EPS,
  31. 1 FACTOR, GAMRI1, GAMRNI, PCH1AI, PCH1I, PI, POCHAI, SUM, T,
  32. 2 XEPS1, XI, XI1, XN, XTOEPS, D1MACH, DPOCH, DGAMMA, DGAMR,
  33. 3 DPOCH1, DEXPRL, D9CHU
  34. EXTERNAL DGAMMA
  35. SAVE PI, EPS
  36. DATA PI / 3.1415926535 8979323846 2643383279 503 D0 /
  37. DATA EPS / 0.0D0 /
  38. C***FIRST EXECUTABLE STATEMENT DCHU
  39. IF (EPS.EQ.0.0D0) EPS = D1MACH(3)
  40. C
  41. IF (X .EQ. 0.0D0) CALL XERMSG ('SLATEC', 'DCHU',
  42. + 'X IS ZERO SO DCHU IS INFINITE', 1, 2)
  43. IF (X .LT. 0.0D0) CALL XERMSG ('SLATEC', 'DCHU',
  44. + 'X IS NEGATIVE, USE CCHU', 2, 2)
  45. C
  46. IF (MAX(ABS(A),1.0D0)*MAX(ABS(1.0D0+A-B),1.0D0).LT.
  47. 1 0.99D0*ABS(X)) GO TO 120
  48. C
  49. C THE ASCENDING SERIES WILL BE USED, BECAUSE THE DESCENDING RATIONAL
  50. C APPROXIMATION (WHICH IS BASED ON THE ASYMPTOTIC SERIES) IS UNSTABLE.
  51. C
  52. IF (ABS(1.0D0+A-B) .LT. SQRT(EPS)) CALL XERMSG ('SLATEC', 'DCHU',
  53. + 'ALGORITHMIS BAD WHEN 1+A-B IS NEAR ZERO FOR SMALL X', 10, 2)
  54. C
  55. IF (B.GE.0.0D0) AINTB = AINT(B+0.5D0)
  56. IF (B.LT.0.0D0) AINTB = AINT(B-0.5D0)
  57. BEPS = B - AINTB
  58. N = AINTB
  59. C
  60. ALNX = LOG(X)
  61. XTOEPS = EXP (-BEPS*ALNX)
  62. C
  63. C EVALUATE THE FINITE SUM. -----------------------------------------
  64. C
  65. IF (N.GE.1) GO TO 40
  66. C
  67. C CONSIDER THE CASE B .LT. 1.0 FIRST.
  68. C
  69. SUM = 1.0D0
  70. IF (N.EQ.0) GO TO 30
  71. C
  72. T = 1.0D0
  73. M = -N
  74. DO 20 I=1,M
  75. XI1 = I - 1
  76. T = T*(A+XI1)*X/((B+XI1)*(XI1+1.0D0))
  77. SUM = SUM + T
  78. 20 CONTINUE
  79. C
  80. 30 SUM = DPOCH(1.0D0+A-B, -A)*SUM
  81. GO TO 70
  82. C
  83. C NOW CONSIDER THE CASE B .GE. 1.0.
  84. C
  85. 40 SUM = 0.0D0
  86. M = N - 2
  87. IF (M.LT.0) GO TO 70
  88. T = 1.0D0
  89. SUM = 1.0D0
  90. IF (M.EQ.0) GO TO 60
  91. C
  92. DO 50 I=1,M
  93. XI = I
  94. T = T * (A-B+XI)*X/((1.0D0-B+XI)*XI)
  95. SUM = SUM + T
  96. 50 CONTINUE
  97. C
  98. 60 SUM = DGAMMA(B-1.0D0) * DGAMR(A) * X**(1-N) * XTOEPS * SUM
  99. C
  100. C NEXT EVALUATE THE INFINITE SUM. ----------------------------------
  101. C
  102. 70 ISTRT = 0
  103. IF (N.LT.1) ISTRT = 1 - N
  104. XI = ISTRT
  105. C
  106. FACTOR = (-1.0D0)**N * DGAMR(1.0D0+A-B) * X**ISTRT
  107. IF (BEPS.NE.0.0D0) FACTOR = FACTOR * BEPS*PI/SIN(BEPS*PI)
  108. C
  109. POCHAI = DPOCH (A, XI)
  110. GAMRI1 = DGAMR (XI+1.0D0)
  111. GAMRNI = DGAMR (AINTB+XI)
  112. B0 = FACTOR * DPOCH(A,XI-BEPS) * GAMRNI * DGAMR(XI+1.0D0-BEPS)
  113. C
  114. IF (ABS(XTOEPS-1.0D0).GT.0.5D0) GO TO 90
  115. C
  116. C X**(-BEPS) IS CLOSE TO 1.0D0, SO WE MUST BE CAREFUL IN EVALUATING THE
  117. C DIFFERENCES.
  118. C
  119. PCH1AI = DPOCH1 (A+XI, -BEPS)
  120. PCH1I = DPOCH1 (XI+1.0D0-BEPS, BEPS)
  121. C0 = FACTOR * POCHAI * GAMRNI * GAMRI1 * (
  122. 1 -DPOCH1(B+XI,-BEPS) + PCH1AI - PCH1I + BEPS*PCH1AI*PCH1I)
  123. C
  124. C XEPS1 = (1.0 - X**(-BEPS))/BEPS = (X**(-BEPS) - 1.0)/(-BEPS)
  125. XEPS1 = ALNX*DEXPRL(-BEPS*ALNX)
  126. C
  127. DCHU = SUM + C0 + XEPS1*B0
  128. XN = N
  129. DO 80 I=1,1000
  130. XI = ISTRT + I
  131. XI1 = ISTRT + I - 1
  132. B0 = (A+XI1-BEPS)*B0*X/((XN+XI1)*(XI-BEPS))
  133. C0 = (A+XI1)*C0*X/((B+XI1)*XI)
  134. 1 - ((A-1.0D0)*(XN+2.D0*XI-1.0D0) + XI*(XI-BEPS)) * B0
  135. 2 / (XI*(B+XI1)*(A+XI1-BEPS))
  136. T = C0 + XEPS1*B0
  137. DCHU = DCHU + T
  138. IF (ABS(T).LT.EPS*ABS(DCHU)) GO TO 130
  139. 80 CONTINUE
  140. CALL XERMSG ('SLATEC', 'DCHU',
  141. + 'NO CONVERGENCE IN 1000 TERMS OF THE ASCENDING SERIES', 3, 2)
  142. C
  143. C X**(-BEPS) IS VERY DIFFERENT FROM 1.0, SO THE STRAIGHTFORWARD
  144. C FORMULATION IS STABLE.
  145. C
  146. 90 A0 = FACTOR * POCHAI * DGAMR(B+XI) * GAMRI1 / BEPS
  147. B0 = XTOEPS * B0 / BEPS
  148. C
  149. DCHU = SUM + A0 - B0
  150. DO 100 I=1,1000
  151. XI = ISTRT + I
  152. XI1 = ISTRT + I - 1
  153. A0 = (A+XI1)*A0*X/((B+XI1)*XI)
  154. B0 = (A+XI1-BEPS)*B0*X/((AINTB+XI1)*(XI-BEPS))
  155. T = A0 - B0
  156. DCHU = DCHU + T
  157. IF (ABS(T).LT.EPS*ABS(DCHU)) GO TO 130
  158. 100 CONTINUE
  159. CALL XERMSG ('SLATEC', 'DCHU',
  160. + 'NO CONVERGENCE IN 1000 TERMS OF THE ASCENDING SERIES', 3, 2)
  161. C
  162. C USE LUKE-S RATIONAL APPROXIMATION IN THE ASYMPTOTIC REGION.
  163. C
  164. 120 DCHU = X**(-A) * D9CHU(A,B,X)
  165. C
  166. 130 RETURN
  167. END