Ticket #84: INCGAMMAFUNC.FOR

File INCGAMMAFUNC.FOR, 1.4 KB (added by jhjcho, 12 years ago)
Line 
1        SUBROUTINE INCOG(A,X,GIP)
2C
3C       ===================================================
4C       Purpose: Compute the incomplete gamma function
5C                r(a,x), â(a,x) and P(a,x)
6C       Input :  a   --- Parameter ( a ó 170 )
7C                x   --- Argument
8C       Output:  GIN --- r(a,x)
9C                GIM --- â(a,x)
10C                GIP --- P(a,x)
11C       Routine called: GAMMA for computing â(x)
12C       ===================================================
13C
14        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
15        XAM=-X+A*DLOG(X)
16        IF (XAM.GT.700.0.OR.A.GT.170.0) THEN
17           WRITE(*,*)'INCGAMMAFUNC: variables a and/or x too large'
18           STOP
19        ENDIF
20        IF (X.EQ.0.0) THEN
21           GIN=0.0
22           CALL GAMMAFUNC(A,GA)
23           GIM=GA
24           GIP=0.0
25        ELSE IF (X.LE.1.0+A) THEN
26           S=1.0D0/A
27           R=S
28           DO 10 K=1,60
29              R=R*X/(A+K)
30              S=S+R
31              IF (DABS(R/S).LT.1.0D-15) GO TO 15
3210         CONTINUE
3315         GIN=DEXP(XAM)*S
34           CALL GAMMAFUNC(A,GA)
35           GIP=GIN/GA
36           GIM=GA-GIN
37        ELSE IF (X.GT.1.0+A) THEN
38           T0=0.0D0
39           DO 20 K=60,1,-1
40              T0=(K-A)/(1.0D0+K/(X+T0))
4120         CONTINUE
42           GIM=DEXP(XAM)/(X+T0)
43           CALL GAMMAFUNC(A,GA)
44           GIN=GA-GIM
45           GIP=1.0D0-GIM/GA
46        ENDIF
47        END