dgamic.f 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. *DECK DGAMIC
  2. DOUBLE PRECISION FUNCTION DGAMIC (A, X)
  3. C***BEGIN PROLOGUE DGAMIC
  4. C***PURPOSE Calculate the complementary incomplete Gamma function.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C7E
  7. C***TYPE DOUBLE PRECISION (GAMIC-S, DGAMIC-D)
  8. C***KEYWORDS COMPLEMENTARY INCOMPLETE GAMMA FUNCTION, FNLIB,
  9. C SPECIAL FUNCTIONS
  10. C***AUTHOR Fullerton, W., (LANL)
  11. C***DESCRIPTION
  12. C
  13. C Evaluate the complementary incomplete Gamma function
  14. C
  15. C DGAMIC = integral from X to infinity of EXP(-T) * T**(A-1.) .
  16. C
  17. C DGAMIC is evaluated for arbitrary real values of A and for non-
  18. C negative values of X (even though DGAMIC is defined for X .LT.
  19. C 0.0), except that for X = 0 and A .LE. 0.0, DGAMIC is undefined.
  20. C
  21. C DGAMIC, A, and X are DOUBLE PRECISION.
  22. C
  23. C A slight deterioration of 2 or 3 digits accuracy will occur when
  24. C DGAMIC is very large or very small in absolute value, because log-
  25. C arithmic variables are used. Also, if the parameter A is very close
  26. C to a negative INTEGER (but not a negative integer), there is a loss
  27. C of accuracy, which is reported if the result is less than half
  28. C machine precision.
  29. C
  30. C***REFERENCES W. Gautschi, A computational procedure for incomplete
  31. C gamma functions, ACM Transactions on Mathematical
  32. C Software 5, 4 (December 1979), pp. 466-481.
  33. C W. Gautschi, Incomplete gamma functions, Algorithm 542,
  34. C ACM Transactions on Mathematical Software 5, 4
  35. C (December 1979), pp. 482-489.
  36. C***ROUTINES CALLED D1MACH, D9GMIC, D9GMIT, D9LGIC, D9LGIT, DLGAMS,
  37. C DLNGAM, XERCLR, XERMSG
  38. C***REVISION HISTORY (YYMMDD)
  39. C 770701 DATE WRITTEN
  40. C 890531 Changed all specific intrinsics to generic. (WRB)
  41. C 890531 REVISION DATE from Version 3.2
  42. C 891214 Prologue converted to Version 4.0 format. (BAB)
  43. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  44. C 920528 DESCRIPTION and REFERENCES sections revised. (WRB)
  45. C***END PROLOGUE DGAMIC
  46. DOUBLE PRECISION A, X, AEPS, AINTA, ALGAP1, ALNEPS, ALNGS, ALX,
  47. 1 BOT, E, EPS, GSTAR, H, SGA, SGNG, SGNGAM, SGNGS, SQEPS, T,
  48. 2 D1MACH, DLNGAM, D9GMIC, D9GMIT, D9LGIC, D9LGIT
  49. LOGICAL FIRST
  50. SAVE EPS, SQEPS, ALNEPS, BOT, FIRST
  51. DATA FIRST /.TRUE./
  52. C***FIRST EXECUTABLE STATEMENT DGAMIC
  53. IF (FIRST) THEN
  54. EPS = 0.5D0*D1MACH(3)
  55. SQEPS = SQRT(D1MACH(4))
  56. ALNEPS = -LOG (D1MACH(3))
  57. BOT = LOG (D1MACH(1))
  58. ENDIF
  59. FIRST = .FALSE.
  60. C
  61. IF (X .LT. 0.D0) CALL XERMSG ('SLATEC', 'DGAMIC', 'X IS NEGATIVE'
  62. + , 2, 2)
  63. C
  64. IF (X.GT.0.D0) GO TO 20
  65. IF (A .LE. 0.D0) CALL XERMSG ('SLATEC', 'DGAMIC',
  66. + 'X = 0 AND A LE 0 SO DGAMIC IS UNDEFINED', 3, 2)
  67. C
  68. DGAMIC = EXP (DLNGAM(A+1.D0) - LOG(A))
  69. RETURN
  70. C
  71. 20 ALX = LOG (X)
  72. SGA = 1.0D0
  73. IF (A.NE.0.D0) SGA = SIGN (1.0D0, A)
  74. AINTA = AINT (A + 0.5D0*SGA)
  75. AEPS = A - AINTA
  76. C
  77. IZERO = 0
  78. IF (X.GE.1.0D0) GO TO 40
  79. C
  80. IF (A.GT.0.5D0 .OR. ABS(AEPS).GT.0.001D0) GO TO 30
  81. E = 2.0D0
  82. IF (-AINTA.GT.1.D0) E = 2.D0*(-AINTA+2.D0)/(AINTA*AINTA-1.0D0)
  83. E = E - ALX * X**(-0.001D0)
  84. IF (E*ABS(AEPS).GT.EPS) GO TO 30
  85. C
  86. DGAMIC = D9GMIC (A, X, ALX)
  87. RETURN
  88. C
  89. 30 CALL DLGAMS (A+1.0D0, ALGAP1, SGNGAM)
  90. GSTAR = D9GMIT (A, X, ALGAP1, SGNGAM, ALX)
  91. IF (GSTAR.EQ.0.D0) IZERO = 1
  92. IF (GSTAR.NE.0.D0) ALNGS = LOG (ABS(GSTAR))
  93. IF (GSTAR.NE.0.D0) SGNGS = SIGN (1.0D0, GSTAR)
  94. GO TO 50
  95. C
  96. 40 IF (A.LT.X) DGAMIC = EXP (D9LGIC(A, X, ALX))
  97. IF (A.LT.X) RETURN
  98. C
  99. SGNGAM = 1.0D0
  100. ALGAP1 = DLNGAM (A+1.0D0)
  101. SGNGS = 1.0D0
  102. ALNGS = D9LGIT (A, X, ALGAP1)
  103. C
  104. C EVALUATION OF DGAMIC(A,X) IN TERMS OF TRICOMI-S INCOMPLETE GAMMA FN.
  105. C
  106. 50 H = 1.D0
  107. IF (IZERO.EQ.1) GO TO 60
  108. C
  109. T = A*ALX + ALNGS
  110. IF (T.GT.ALNEPS) GO TO 70
  111. IF (T.GT.(-ALNEPS)) H = 1.0D0 - SGNGS*EXP(T)
  112. C
  113. IF (ABS(H).LT.SQEPS) CALL XERCLR
  114. IF (ABS(H) .LT. SQEPS) CALL XERMSG ('SLATEC', 'DGAMIC',
  115. + 'RESULT LT HALF PRECISION', 1, 1)
  116. C
  117. 60 SGNG = SIGN (1.0D0, H) * SGA * SGNGAM
  118. T = LOG(ABS(H)) + ALGAP1 - LOG(ABS(A))
  119. IF (T.LT.BOT) CALL XERCLR
  120. DGAMIC = SGNG * EXP(T)
  121. RETURN
  122. C
  123. 70 SGNG = -SGNGS * SGA * SGNGAM
  124. T = T + ALGAP1 - LOG(ABS(A))
  125. IF (T.LT.BOT) CALL XERCLR
  126. DGAMIC = SGNG * EXP(T)
  127. RETURN
  128. C
  129. END