]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MINICERN/mathlib/gen/c/r3dp.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / MINICERN / mathlib / gen / c / r3dp.F
CommitLineData
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)
12C
13C evaluate the HYPERGEOMETRIC FUNCTION
14C i
15C F (AA,BB;;Z) = SUM (AA) (BB) Z / i!
16C 2 0 i i i
17C
18C to accuracy EPS with at most JMAX terms.
19C
20C if the terms start diverging,
21C the corresponding continued fraction is found by RCF
22C & evaluated progressively by Steed's method to obtain convergence.
23C
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))
34C
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