r9gmic.f 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. *DECK R9GMIC
  2. FUNCTION R9GMIC (A, X, ALX)
  3. C***BEGIN PROLOGUE R9GMIC
  4. C***SUBSIDIARY
  5. C***PURPOSE Compute the complementary incomplete Gamma function for A
  6. C near a negative integer and for small X.
  7. C***LIBRARY SLATEC (FNLIB)
  8. C***CATEGORY C7E
  9. C***TYPE SINGLE PRECISION (R9GMIC-S, D9GMIC-D)
  10. C***KEYWORDS COMPLEMENTARY INCOMPLETE GAMMA FUNCTION, FNLIB, SMALL X,
  11. C SPECIAL FUNCTIONS
  12. C***AUTHOR Fullerton, W., (LANL)
  13. C***DESCRIPTION
  14. C
  15. C Compute the complementary incomplete gamma function for A near
  16. C a negative integer and for small X.
  17. C
  18. C***REFERENCES (NONE)
  19. C***ROUTINES CALLED ALNGAM, R1MACH, XERMSG
  20. C***REVISION HISTORY (YYMMDD)
  21. C 770701 DATE WRITTEN
  22. C 890531 Changed all specific intrinsics to generic. (WRB)
  23. C 890531 REVISION DATE from Version 3.2
  24. C 891214 Prologue converted to Version 4.0 format. (BAB)
  25. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  26. C 900720 Routine changed from user-callable to subsidiary. (WRB)
  27. C***END PROLOGUE R9GMIC
  28. SAVE EULER, EPS, BOT
  29. DATA EULER / .5772156649 015329 E0 /
  30. DATA EPS, BOT / 2*0.0 /
  31. C***FIRST EXECUTABLE STATEMENT R9GMIC
  32. IF (EPS.EQ.0.0) EPS = 0.5*R1MACH(3)
  33. IF (BOT.EQ.0.0) BOT = LOG(R1MACH(1))
  34. C
  35. IF (A .GT. 0.0) CALL XERMSG ('SLATEC', 'R9GMIC',
  36. + 'A MUST BE NEAR A NEGATIVE INTEGER', 2, 2)
  37. IF (X .LE. 0.0) CALL XERMSG ('SLATEC', 'R9GMIC',
  38. + 'X MUST BE GT ZERO', 3, 2)
  39. C
  40. MA = A - 0.5
  41. FM = -MA
  42. M = -MA
  43. C
  44. TE = 1.0
  45. T = 1.0
  46. S = T
  47. DO 20 K=1,200
  48. FKP1 = K + 1
  49. TE = -X*TE/(FM+FKP1)
  50. T = TE/FKP1
  51. S = S + T
  52. IF (ABS(T).LT.EPS*S) GO TO 30
  53. 20 CONTINUE
  54. CALL XERMSG ('SLATEC', 'R9GMIC',
  55. + 'NO CONVERGENCE IN 200 TERMS OF CONTINUED FRACTION', 4, 2)
  56. C
  57. 30 R9GMIC = -ALX - EULER + X*S/(FM+1.0)
  58. IF (M.EQ.0) RETURN
  59. C
  60. IF (M.EQ.1) R9GMIC = -R9GMIC - 1.0 + 1.0/X
  61. IF (M.EQ.1) RETURN
  62. C
  63. TE = FM
  64. T = 1.0
  65. S = T
  66. MM1 = M - 1
  67. DO 40 K=1,MM1
  68. FK = K
  69. TE = -X*TE/FK
  70. T = TE/(FM-FK)
  71. S = S + T
  72. IF (ABS(T).LT.EPS*ABS(S)) GO TO 50
  73. 40 CONTINUE
  74. C
  75. 50 DO 60 K=1,M
  76. R9GMIC = R9GMIC + 1.0/K
  77. 60 CONTINUE
  78. C
  79. SGNG = 1.0
  80. IF (MOD(M,2).EQ.1) SGNG = -1.0
  81. ALNG = LOG(R9GMIC) - ALNGAM(FM+1.0)
  82. C
  83. R9GMIC = 0.0
  84. IF (ALNG.GT.BOT) R9GMIC = SGNG*EXP(ALNG)
  85. IF (S.NE.0.0) R9GMIC = R9GMIC + SIGN (EXP(-FM*ALX+LOG(ABS(S)/FM))
  86. 1 , S)
  87. C
  88. IF (R9GMIC .EQ. 0.0 .AND. S .EQ. 0.0) CALL XERMSG ('SLATEC',
  89. + 'R9GMIC', 'RESULT UNDERFLOWS', 1, 1)
  90. RETURN
  91. C
  92. END