]>
Commit | Line | Data |
---|---|---|
fe4da5cc | 1 | * |
2 | * $Id$ | |
3 | * | |
4 | * $Log$ | |
5 | * Revision 1.1.1.1 1996/04/01 15:01:56 mclareni | |
6 | * Mathlib gen | |
7 | * | |
8 | * | |
9 | #include "gen/pilot.h" | |
10 | #if defined(CERNLIB_DOUBLE) | |
11 | FUNCTION C309R3(AA,BB,Z,EPS,JMAX,RE,FPMAX,N,X) | |
12 | C | |
13 | C evaluate the HYPERGEOMETRIC FUNCTION | |
14 | C i | |
15 | C F (AA,BB;;Z) = SUM (AA) (BB) Z / i! | |
16 | C 2 0 i i i | |
17 | C | |
18 | C to accuracy EPS with at most JMAX terms. | |
19 | C | |
20 | C if the terms start diverging, | |
21 | C the corresponding continued fraction is found by RCF | |
22 | C & evaluated progressively by Steed's method to obtain convergence. | |
23 | C | |
24 | IMPLICIT COMPLEX*16(A-H,O-Z) | |
25 | DIMENSION X(JMAX,4) | |
26 | LOGICAL FINITE | |
27 | DOUBLE PRECISION EP,EPS,AT,ATL,ABSC,RE,FPMAX | |
28 | ||
29 | #if defined(CERNLIB_QF2C) | |
30 | #include "defdr.inc" | |
31 | #endif | |
32 | ABSC(W)=ABS(DREAL(W))+ABS(DIMAG(W)) | |
33 | NINTC(W)=NINT(DREAL(W)) | |
34 | C | |
35 | RE=0 | |
36 | X(1,1)=1 | |
37 | SUM=X(1,1) | |
38 | ATL=ABSC(X(1,1)) | |
39 | F=SUM | |
40 | D=1 | |
41 | DF=SUM | |
42 | J=0 | |
43 | EP=EPS*(10*JMAX) | |
44 | MA=-NINTC(AA) | |
45 | MB=-NINTC(BB) | |
46 | FINITE=ABS(ABS(DREAL(AA))-MA) .LT. EP .AND. ABS(DIMAG(AA)) .LT. EP | |
47 | 1 .OR. ABS(ABS(DREAL(BB))-MB) .LT. EP .AND. ABS(DIMAG(BB)) .LT. EP | |
48 | IMAX=JMAX | |
49 | IF(FINITE .AND. MA .GE. 0) IMAX=MIN(MA+1,IMAX) | |
50 | IF(FINITE .AND. MB .GE. 0) IMAX=MIN(MB+1,IMAX) | |
51 | DO 10 I = 2,IMAX | |
52 | X(I,1)=X(I-1,1)*Z*(AA+I-2)*(BB+I-2)/(I-1) | |
53 | IF(ABSC(X(I,1)) .GT. FPMAX) THEN | |
54 | N=0 | |
55 | C309R3=SUM | |
56 | IF(.NOT.FINITE) RE=AT/ABSC(SUM) | |
57 | RETURN | |
58 | END IF | |
59 | AT=ABSC(X(I,1)) | |
60 | IF(J .EQ. 0) THEN | |
61 | SUM=SUM+X(I,1) | |
62 | IF(AT .LT. ABSC(SUM)*EPS) THEN | |
63 | N=I | |
64 | C309R3=SUM | |
65 | IF(.NOT.FINITE) RE=AT/ABSC(SUM) | |
66 | RETURN | |
67 | END IF | |
68 | END IF | |
69 | IF(FINITE) GO TO 10 | |
70 | IF(J .GT. 0 .OR. AT .GT. ATL .OR. I .GE. JMAX-2) J=J+1 | |
71 | IF(J .EQ. 0) GO TO 10 | |
72 | CALL C309R7(X(1,1),X(1,2),J,I,X(1,3),EPS) | |
73 | IF(I .LT. 0) THEN | |
74 | N=0 | |
75 | C309R3=SUM | |
76 | IF(.NOT.FINITE) RE=AT/ABSC(SUM) | |
77 | RETURN | |
78 | END IF | |
79 | DO 50 K = MAX(J,2),I | |
80 | D=1/(D*X(K,2)+1) | |
81 | DF=DF*D-DF | |
82 | F=F+DF | |
83 | IF(ABSC(DF) .LT. ABSC(F)*EPS .OR. | |
84 | 1 DF .EQ. 0 .AND. F .EQ. 0 .AND. I .GE. 4) THEN | |
85 | N=K | |
86 | C309R3=F | |
87 | RE=ABSC(DF)/ABSC(F) | |
88 | RETURN | |
89 | END IF | |
90 | 50 CONTINUE | |
91 | J=I | |
92 | 10 ATL=AT | |
93 | IF(.NOT.FINITE) I=-JMAX | |
94 | N=I | |
95 | C309R3=SUM | |
96 | IF(.NOT.FINITE) RE=AT/ABSC(SUM) | |
97 | RETURN | |
98 | END | |
99 | #endif |