d9gmic.f 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. *DECK D9GMIC
  2. DOUBLE PRECISION FUNCTION D9GMIC (A, X, ALX)
  3. C***BEGIN PROLOGUE D9GMIC
  4. C***SUBSIDIARY
  5. C***PURPOSE Compute the complementary incomplete Gamma function for A
  6. C near a negative integer and X small.
  7. C***LIBRARY SLATEC (FNLIB)
  8. C***CATEGORY C7E
  9. C***TYPE DOUBLE 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 D1MACH, DLNGAM, XERMSG
  20. C***REVISION HISTORY (YYMMDD)
  21. C 770701 DATE WRITTEN
  22. C 890531 Changed all specific intrinsics to generic. (WRB)
  23. C 890911 Removed unnecessary intrinsics. (WRB)
  24. C 890911 REVISION DATE from Version 3.2
  25. C 891214 Prologue converted to Version 4.0 format. (BAB)
  26. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  27. C 900720 Routine changed from user-callable to subsidiary. (WRB)
  28. C***END PROLOGUE D9GMIC
  29. DOUBLE PRECISION A, X, ALX, ALNG, BOT, EPS, EULER, FK, FKP1, FM,
  30. 1 S, SGNG, T, TE, D1MACH, DLNGAM
  31. LOGICAL FIRST
  32. SAVE EULER, EPS, BOT, FIRST
  33. DATA EULER / 0.5772156649 0153286060 6512090082 40 D0 /
  34. DATA FIRST /.TRUE./
  35. C***FIRST EXECUTABLE STATEMENT D9GMIC
  36. IF (FIRST) THEN
  37. EPS = 0.5D0*D1MACH(3)
  38. BOT = LOG (D1MACH(1))
  39. ENDIF
  40. FIRST = .FALSE.
  41. C
  42. IF (A .GT. 0.D0) CALL XERMSG ('SLATEC', 'D9GMIC',
  43. + 'A MUST BE NEAR A NEGATIVE INTEGER', 2, 2)
  44. IF (X .LE. 0.D0) CALL XERMSG ('SLATEC', 'D9GMIC',
  45. + 'X MUST BE GT ZERO', 3, 2)
  46. C
  47. M = -(A - 0.5D0)
  48. FM = M
  49. C
  50. TE = 1.0D0
  51. T = 1.0D0
  52. S = T
  53. DO 20 K=1,200
  54. FKP1 = K + 1
  55. TE = -X*TE/(FM+FKP1)
  56. T = TE/FKP1
  57. S = S + T
  58. IF (ABS(T).LT.EPS*S) GO TO 30
  59. 20 CONTINUE
  60. CALL XERMSG ('SLATEC', 'D9GMIC',
  61. + 'NO CONVERGENCE IN 200 TERMS OF CONTINUED FRACTION', 4, 2)
  62. C
  63. 30 D9GMIC = -ALX - EULER + X*S/(FM+1.0D0)
  64. IF (M.EQ.0) RETURN
  65. C
  66. IF (M.EQ.1) D9GMIC = -D9GMIC - 1.D0 + 1.D0/X
  67. IF (M.EQ.1) RETURN
  68. C
  69. TE = FM
  70. T = 1.D0
  71. S = T
  72. MM1 = M - 1
  73. DO 40 K=1,MM1
  74. FK = K
  75. TE = -X*TE/FK
  76. T = TE/(FM-FK)
  77. S = S + T
  78. IF (ABS(T).LT.EPS*ABS(S)) GO TO 50
  79. 40 CONTINUE
  80. C
  81. 50 DO 60 K=1,M
  82. D9GMIC = D9GMIC + 1.0D0/K
  83. 60 CONTINUE
  84. C
  85. SGNG = 1.0D0
  86. IF (MOD(M,2).EQ.1) SGNG = -1.0D0
  87. ALNG = LOG(D9GMIC) - DLNGAM(FM+1.D0)
  88. C
  89. D9GMIC = 0.D0
  90. IF (ALNG.GT.BOT) D9GMIC = SGNG * EXP(ALNG)
  91. IF (S.NE.0.D0) D9GMIC = D9GMIC +
  92. 1 SIGN (EXP(-FM*ALX+LOG(ABS(S)/FM)), S)
  93. C
  94. IF (D9GMIC .EQ. 0.D0 .AND. S .EQ. 0.D0) CALL XERMSG ('SLATEC',
  95. + 'D9GMIC', 'RESULT UNDERFLOWS', 1, 1)
  96. RETURN
  97. C
  98. END