chu.f 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. *DECK CHU
  2. FUNCTION CHU (A, B, X)
  3. C***BEGIN PROLOGUE CHU
  4. C***PURPOSE Compute the logarithmic confluent hypergeometric function.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C11
  7. C***TYPE SINGLE 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 CHU computes the logarithmic confluent hypergeometric function,
  14. C U(A,B,X).
  15. C
  16. C Input Parameters:
  17. C A real
  18. C B real
  19. C X real and positive
  20. C
  21. C This routine is not valid when 1+A-B is close to zero if X is small.
  22. C
  23. C***REFERENCES (NONE)
  24. C***ROUTINES CALLED EXPREL, GAMMA, GAMR, POCH, POCH1, R1MACH, R9CHU,
  25. C XERMSG
  26. C***REVISION HISTORY (YYMMDD)
  27. C 770801 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 900727 Added EXTERNAL statement. (WRB)
  33. C***END PROLOGUE CHU
  34. EXTERNAL GAMMA
  35. SAVE PI, EPS
  36. DATA PI / 3.1415926535 8979324 E0 /
  37. DATA EPS / 0.0 /
  38. C***FIRST EXECUTABLE STATEMENT CHU
  39. IF (EPS.EQ.0.0) EPS = R1MACH(3)
  40. C
  41. IF (X .EQ. 0.0) CALL XERMSG ('SLATEC', 'CHU',
  42. + 'X IS ZERO SO CHU IS INFINITE', 1, 2)
  43. IF (X .LT. 0.0) CALL XERMSG ('SLATEC', 'CHU',
  44. + 'X IS NEGATIVE, USE CCHU', 2, 2)
  45. C
  46. IF (MAX(ABS(A),1.0)*MAX(ABS(1.0+A-B),1.0).LT.0.99*ABS(X))
  47. 1 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.0+A-B) .LT. SQRT(EPS)) CALL XERMSG ('SLATEC', 'CHU',
  53. + 'ALGORITHM IS BAD WHEN 1+A-B IS NEAR ZERO FOR SMALL X', 10, 2)
  54. C
  55. AINTB = AINT(B+0.5)
  56. IF (B.LT.0.0) AINTB = AINT(B-0.5)
  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.0
  70. IF (N.EQ.0) GO TO 30
  71. C
  72. T = 1.0
  73. M = -N
  74. DO 20 I=1,M
  75. XI1 = I - 1
  76. T = T*(A+XI1)*X/((B+XI1)*(XI1+1.0))
  77. SUM = SUM + T
  78. 20 CONTINUE
  79. C
  80. 30 SUM = POCH(1.0+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.0
  86. M = N - 2
  87. IF (M.LT.0) GO TO 70
  88. T = 1.0
  89. SUM = 1.0
  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.0-B+XI)*XI)
  95. SUM = SUM + T
  96. 50 CONTINUE
  97. C
  98. 60 SUM = GAMMA(B-1.0) * GAMR(A) * X**(1-N) * XTOEPS * SUM
  99. C
  100. C NOW 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.0)**N * GAMR(1.0+A-B) * X**ISTRT
  107. IF (BEPS.NE.0.0) FACTOR = FACTOR * BEPS*PI/SIN(BEPS*PI)
  108. C
  109. POCHAI = POCH (A, XI)
  110. GAMRI1 = GAMR (XI+1.0)
  111. GAMRNI = GAMR (AINTB+XI)
  112. B0 = FACTOR * POCH(A,XI-BEPS) * GAMRNI * GAMR(XI+1.0-BEPS)
  113. C
  114. IF (ABS(XTOEPS-1.0).GT.0.5) GO TO 90
  115. C
  116. C X**(-BEPS) IS CLOSE TO 1.0, SO WE MUST BE CAREFUL IN EVALUATING
  117. C THE DIFFERENCES
  118. C
  119. PCH1AI = POCH1 (A+XI, -BEPS)
  120. PCH1I = POCH1 (XI+1.0-BEPS, BEPS)
  121. C0 = FACTOR * POCHAI * GAMRNI * GAMRI1 * (
  122. 1 -POCH1(B+XI, -BEPS) + PCH1AI - PCH1I + BEPS*PCH1AI*PCH1I )
  123. C
  124. C XEPS1 = (1.0 - X**(-BEPS)) / BEPS
  125. XEPS1 = ALNX * EXPREL(-BEPS*ALNX)
  126. C
  127. CHU = 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) - ((A-1.0)*(XN+2.*XI-1.0)
  134. 1 + XI*(XI-BEPS)) * B0/(XI*(B+XI1)*(A+XI1-BEPS))
  135. T = C0 + XEPS1*B0
  136. CHU = CHU + T
  137. IF (ABS(T).LT.EPS*ABS(CHU)) GO TO 130
  138. 80 CONTINUE
  139. CALL XERMSG ('SLATEC', 'CHU',
  140. + 'NO CONVERGENCE IN 1000 TERMS OF THE ASCENDING SERIES', 3, 2)
  141. C
  142. C X**(-BEPS) IS VERY DIFFERENT FROM 1.0, SO THE STRAIGHTFORWARD
  143. C FORMULATION IS STABLE.
  144. C
  145. 90 A0 = FACTOR * POCHAI * GAMR(B+XI) * GAMRI1 / BEPS
  146. B0 = XTOEPS*B0/BEPS
  147. C
  148. CHU = SUM + A0 - B0
  149. DO 100 I=1,1000
  150. XI = ISTRT + I
  151. XI1 = ISTRT + I - 1
  152. A0 = (A+XI1)*A0*X/((B+XI1)*XI)
  153. B0 = (A+XI1-BEPS)*B0*X/((AINTB+XI1)*(XI-BEPS))
  154. T = A0 - B0
  155. CHU = CHU + T
  156. IF (ABS(T).LT.EPS*ABS(CHU)) GO TO 130
  157. 100 CONTINUE
  158. CALL XERMSG ('SLATEC', 'CHU',
  159. + 'NO CONVERGENCE IN 1000 TERMS OF THE ASCENDING SERIES', 3, 2)
  160. C
  161. C USE LUKE-S RATIONAL APPROX IN THE ASYMPTOTIC REGION.
  162. C
  163. 120 CHU = X**(-A) * R9CHU(A, B, X)
  164. C
  165. 130 RETURN
  166. END