gamit.f 3.7 KB

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