d9chu.f 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. *DECK D9CHU
  2. DOUBLE PRECISION FUNCTION D9CHU (A, B, Z)
  3. C***BEGIN PROLOGUE D9CHU
  4. C***SUBSIDIARY
  5. C***PURPOSE Evaluate for large Z Z**A * U(A,B,Z) where U is the
  6. C logarithmic confluent hypergeometric function.
  7. C***LIBRARY SLATEC (FNLIB)
  8. C***CATEGORY C11
  9. C***TYPE DOUBLE PRECISION (R9CHU-S, D9CHU-D)
  10. C***KEYWORDS FNLIB, LOGARITHMIC CONFLUENT HYPERGEOMETRIC FUNCTION,
  11. C SPECIAL FUNCTIONS
  12. C***AUTHOR Fullerton, W., (LANL)
  13. C***DESCRIPTION
  14. C
  15. C Evaluate for large Z Z**A * U(A,B,Z) where U is the logarithmic
  16. C confluent hypergeometric function. A rational approximation due to Y.
  17. C L. Luke is used. When U is not in the asymptotic region, i.e., when A
  18. C or B is large compared with Z, considerable significance loss occurs.
  19. C A warning is provided when the computed result is less than half
  20. C precision.
  21. C
  22. C***REFERENCES (NONE)
  23. C***ROUTINES CALLED D1MACH, XERMSG
  24. C***REVISION HISTORY (YYMMDD)
  25. C 770801 DATE WRITTEN
  26. C 890531 Changed all specific intrinsics to generic. (WRB)
  27. C 890531 REVISION DATE from Version 3.2
  28. C 891214 Prologue converted to Version 4.0 format. (BAB)
  29. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  30. C 900720 Routine changed from user-callable to subsidiary. (WRB)
  31. C***END PROLOGUE D9CHU
  32. DOUBLE PRECISION A, B, Z, AA(4), BB(4), AB, ANBN, BP, CT1, CT2,
  33. 1 CT3, C2, D1Z, EPS, G1, G2, G3, SAB, SQEPS, X2I1, D1MACH
  34. LOGICAL FIRST
  35. SAVE EPS, SQEPS, FIRST
  36. DATA FIRST /.TRUE./
  37. C***FIRST EXECUTABLE STATEMENT D9CHU
  38. IF (FIRST) THEN
  39. EPS = 4.0D0*D1MACH(4)
  40. SQEPS = SQRT(D1MACH(4))
  41. ENDIF
  42. FIRST = .FALSE.
  43. C
  44. BP = 1.0D0 + A - B
  45. AB = A*BP
  46. CT2 = 2.0D0 * (Z - AB)
  47. SAB = A + BP
  48. C
  49. BB(1) = 1.0D0
  50. AA(1) = 1.0D0
  51. C
  52. CT3 = SAB + 1.0D0 + AB
  53. BB(2) = 1.0D0 + 2.0D0*Z/CT3
  54. AA(2) = 1.0D0 + CT2/CT3
  55. C
  56. ANBN = CT3 + SAB + 3.0D0
  57. CT1 = 1.0D0 + 2.0D0*Z/ANBN
  58. BB(3) = 1.0D0 + 6.0D0*CT1*Z/CT3
  59. AA(3) = 1.0D0 + 6.0D0*AB/ANBN + 3.0D0*CT1*CT2/CT3
  60. C
  61. DO 30 I=4,300
  62. X2I1 = 2*I - 3
  63. CT1 = X2I1/(X2I1-2.0D0)
  64. ANBN = ANBN + X2I1 + SAB
  65. CT2 = (X2I1 - 1.0D0)/ANBN
  66. C2 = X2I1*CT2 - 1.0D0
  67. D1Z = X2I1*2.0D0*Z/ANBN
  68. C
  69. CT3 = SAB*CT2
  70. G1 = D1Z + CT1*(C2+CT3)
  71. G2 = D1Z - C2
  72. G3 = CT1*(1.0D0 - CT3 - 2.0D0*CT2)
  73. C
  74. BB(4) = G1*BB(3) + G2*BB(2) + G3*BB(1)
  75. AA(4) = G1*AA(3) + G2*AA(2) + G3*AA(1)
  76. IF (ABS(AA(4)*BB(1)-AA(1)*BB(4)).LT.EPS*ABS(BB(4)*BB(1)))
  77. 1 GO TO 40
  78. C
  79. C IF OVERFLOWS OR UNDERFLOWS PROVE TO BE A PROBLEM, THE STATEMENTS
  80. C BELOW COULD BE ALTERED TO INCORPORATE A DYNAMICALLY ADJUSTED SCALE
  81. C FACTOR.
  82. C
  83. DO 20 J=1,3
  84. AA(J) = AA(J+1)
  85. BB(J) = BB(J+1)
  86. 20 CONTINUE
  87. 30 CONTINUE
  88. CALL XERMSG ('SLATEC', 'D9CHU', 'NO CONVERGENCE IN 300 TERMS', 2,
  89. + 2)
  90. C
  91. 40 D9CHU = AA(4)/BB(4)
  92. C
  93. IF (D9CHU .LT. SQEPS .OR. D9CHU .GT. 1.0D0/SQEPS) CALL XERMSG
  94. + ('SLATEC', 'D9CHU', 'ANSWER LT HALF PRECISION', 2, 1)
  95. C
  96. RETURN
  97. END