r9gmit.f 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. *DECK R9GMIT
  2. FUNCTION R9GMIT (A, X, ALGAP1, SGNGAM, ALX)
  3. C***BEGIN PROLOGUE R9GMIT
  4. C***SUBSIDIARY
  5. C***PURPOSE Compute Tricomi's incomplete Gamma function for small
  6. C arguments.
  7. C***LIBRARY SLATEC (FNLIB)
  8. C***CATEGORY C7E
  9. C***TYPE SINGLE PRECISION (R9GMIT-S, D9GMIT-D)
  10. C***KEYWORDS COMPLEMENTARY INCOMPLETE GAMMA FUNCTION, FNLIB, SMALL X,
  11. C SPECIAL FUNCTIONS, TRICOMI
  12. C***AUTHOR Fullerton, W., (LANL)
  13. C***DESCRIPTION
  14. C
  15. C Compute Tricomi's incomplete gamma function for small X.
  16. C
  17. C***REFERENCES (NONE)
  18. C***ROUTINES CALLED ALNGAM, R1MACH, XERMSG
  19. C***REVISION HISTORY (YYMMDD)
  20. C 770701 DATE WRITTEN
  21. C 890531 Changed all specific intrinsics to generic. (WRB)
  22. C 890531 REVISION DATE from Version 3.2
  23. C 891214 Prologue converted to Version 4.0 format. (BAB)
  24. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  25. C 900720 Routine changed from user-callable to subsidiary. (WRB)
  26. C***END PROLOGUE R9GMIT
  27. SAVE EPS, BOT
  28. DATA EPS, BOT / 2*0.0 /
  29. C***FIRST EXECUTABLE STATEMENT R9GMIT
  30. IF (EPS.EQ.0.0) EPS = 0.5*R1MACH(3)
  31. IF (BOT.EQ.0.0) BOT = LOG(R1MACH(1))
  32. C
  33. IF (X .LE. 0.0) CALL XERMSG ('SLATEC', 'R9GMIT',
  34. + 'X SHOULD BE GT 0', 1, 2)
  35. C
  36. MA = A + 0.5
  37. IF (A.LT.0.0) MA = A - 0.5
  38. AEPS = A - MA
  39. C
  40. AE = A
  41. IF (A.LT.(-0.5)) AE = AEPS
  42. C
  43. T = 1.0
  44. TE = AE
  45. S = T
  46. DO 20 K=1,200
  47. FK = K
  48. TE = -X*TE/FK
  49. T = TE/(AE+FK)
  50. S = S + T
  51. IF (ABS(T).LT.EPS*ABS(S)) GO TO 30
  52. 20 CONTINUE
  53. CALL XERMSG ('SLATEC', 'R9GMIT',
  54. + 'NO CONVERGENCE IN 200 TERMS OF TAYLOR-S SERIES', 2, 2)
  55. C
  56. 30 IF (A.GE.(-0.5)) ALGS = -ALGAP1 + LOG(S)
  57. IF (A.GE.(-0.5)) GO TO 60
  58. C
  59. ALGS = -ALNGAM(1.0+AEPS) + LOG(S)
  60. S = 1.0
  61. M = -MA - 1
  62. IF (M.EQ.0) GO TO 50
  63. T = 1.0
  64. DO 40 K=1,M
  65. T = X*T/(AEPS-M-1+K)
  66. S = S + T
  67. IF (ABS(T).LT.EPS*ABS(S)) GO TO 50
  68. 40 CONTINUE
  69. C
  70. 50 R9GMIT = 0.0
  71. ALGS = -MA*LOG(X) + ALGS
  72. IF (S.EQ.0.0 .OR. AEPS.EQ.0.0) GO TO 60
  73. C
  74. SGNG2 = SGNGAM*SIGN(1.0,S)
  75. ALG2 = -X - ALGAP1 + LOG(ABS(S))
  76. C
  77. IF (ALG2.GT.BOT) R9GMIT = SGNG2*EXP(ALG2)
  78. IF (ALGS.GT.BOT) R9GMIT = R9GMIT + EXP(ALGS)
  79. RETURN
  80. C
  81. 60 R9GMIT = EXP(ALGS)
  82. RETURN
  83. C
  84. END