]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MINICERN/mathlib/gen/c/bsja64.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / MINICERN / mathlib / gen / c / bsja64.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1996/04/01 15:02:08 mclareni
6* Mathlib gen
7*
8*
9#include "gen/pilot.h"
10#if defined(CERNLIB_DOUBLE)
11 SUBROUTINE DBSJA(X,A,NMAX,ND,B)
12#endif
13#if !defined(CERNLIB_DOUBLE)
14 SUBROUTINE BSJA(X,A,NMAX,ND,B)
15#endif
16
17#include "gen/imp64.inc"
18 REAL SX,D,T,Q,U,V,TC(11)
19 CHARACTER*80 ERRTXT
20 CHARACTER NAMEJ*(*),NAMEI*(*)
21#if defined(CERNLIB_DOUBLE)
22 PARAMETER (NAMEJ = 'BSJA/DBSJA',
23 1 NAMEI = 'BSIA/DBSIA')
24#endif
25#if !defined(CERNLIB_DOUBLE)
26 PARAMETER (NAMEJ = 'BSJA', NAMEI = 'BSIA')
27#endif
28 LOGICAL LJA,LIA,LEV,LER
29 DIMENSION B(0:*),BA(0:100),RR(0:100)
30
31 PARAMETER (Z1 = 1, HF = Z1/2, Z10 = 10)
32
33 DATA TC / 5.7941 E-5,-1.76148E-3, 2.08645E-2,-1.29013E-1,
34 1 8.5777 E-1, 1.0125 E+0, 7.75 E-1, 2.3026 E+0,
35 2 1.3863 E+0, 7.3576 E-1, 1.3591 E+0/
36
37 LJA=.TRUE.
38 LIA=.FALSE.
39 SGN=-1
40 GO TO 9
41
42#if defined(CERNLIB_DOUBLE)
43 ENTRY DBSIA(X,A,NMAX,ND,B)
44#endif
45#if !defined(CERNLIB_DOUBLE)
46 ENTRY BSIA(X,A,NMAX,ND,B)
47#endif
48 LJA=.FALSE.
49 LIA=.TRUE.
50 SGN=1
51
52 9 LER=.FALSE.
53 IF(X .LE. 0) THEN
54 WRITE(ERRTXT,101) X
55 IF(LJA) CALL MTLPRT(NAMEJ,'C343.1',ERRTXT)
56 IF(LIA) CALL MTLPRT(NAMEI,'C343.1',ERRTXT)
57 LER=.TRUE.
58 ELSEIF(.NOT.(0 .LE. A .AND. A .LT. 1)) THEN
59 WRITE(ERRTXT,102) A
60 IF(LJA) CALL MTLPRT(NAMEJ,'C343.2',ERRTXT)
61 IF(LIA) CALL MTLPRT(NAMEI,'C343.2',ERRTXT)
62 LER=.TRUE.
63 ELSEIF(ABS(NMAX) .GT. 100) THEN
64 WRITE(ERRTXT,103) NMAX
65 IF(LJA) CALL MTLPRT(NAMEJ,'C343.3',ERRTXT)
66 IF(LIA) CALL MTLPRT(NAMEI,'C343.3',ERRTXT)
67 LER=.TRUE.
68 END IF
69 IF(LER) RETURN
70 EPS=HF*Z10**(-ND)
71 NMX=ABS(NMAX)
72 IF(NMAX .LE. 0) NMX=1
73 DO 5 N = 0,NMX
74 RR(N)=0
75 5 BA(N)=0
76 D=TC(8)*ND+TC(9)
77 SX=X
78 Q=0
79 IF(NMX .GT. 0) THEN
80 V=0.5*D/NMX
81 IF(V .LE. 10) THEN
82 T=TC(1)
83 DO 6 I = 2,6
84 6 T=V*T+TC(I)
85 ELSE
86 U=LOG(V)-TC(7)
87 T=V/(U*(1+(TC(7)-LOG(U))/(1+U)))
88 ENDIF
89 Q=NMX*T
90 ENDIF
91#if defined(CERNLIB_DOUBLE)
92 F=(HF*X)**A/DGAMMA(1+A)
93#endif
94#if !defined(CERNLIB_DOUBLE)
95 F=(HF*X)**A/GAMMA(1+A)
96#endif
97 T=1
98 V=TC(10)*D/SX
99 IF(LIA) THEN
100 F=EXP(X)*F
101 V=V-TC(10)
102 ENDIF
103 IF(LJA .OR. LIA .AND. X .LT. D) THEN
104 IF(V .LE. 10) THEN
105 T=TC(1)
106 DO 7 I = 2,6
107 7 T=V*T+TC(I)
108 ELSE
109 U=LOG(V)-TC(7)
110 T=V/(U*(1+(TC(7)-LOG(U))/(1+U)))
111 ENDIF
112 ENDIF
113 NU=1+MAX(Q,TC(11)*SX*T)
114
115 MU=-1
116 2 MU=MU+1
117 AL=1
118 IF(LJA) THEN
119 DO 3 N = 1,NU/2
120 XN=N
121 3 AL=AL*(XN+A)/(XN+1)
122 R=0
123 S=0
124 LEV=.TRUE.
125 DO 4 N = 2*(NU/2),1,-1
126 XN=N
127 XA=XN+A
128 R=1/(2*XA/X-R)
129 IF(N .LE. NMX) RR(N-1)=R
130 IF(LEV) THEN
131 AL=AL*(XN+2)/(XA+A)
132 S=R*(AL*XA+S)
133 ELSE
134 S=R*S
135 ENDIF
136 LEV=.NOT.LEV
137 4 CONTINUE
138 ELSE
139 DO 23 N = 1,NU
140 XN=N
141 23 AL=AL*(XN+2*A)/(XN+1)
142 R=0
143 S=0
144 DO 24 N = NU,1,-1
145 XN=N
146 XA=XN+A
147 XA2=XA+XA
148 R=1/(XA2/X+R)
149 IF(N .LE. NMX) RR(N-1)=R
150 AL=AL*(XN+1)/(XA+A)
151 S=R*(XA2*AL+S)
152 24 CONTINUE
153 ENDIF
154 B(0)=F/(1+S)
155 DO 10 N = 0,NMX-1
156 10 B(N+1)=RR(N)*B(N)
157 DO 11 N = 0,NMX
158 IF(ABS(B(N)-BA(N)) .GT. EPS*ABS(B(N))) THEN
159 DO 12 M = 0,NMX
160 12 BA(M)=B(M)
161 NU=NU+5
162 IF(MU .LE. 50) GO TO 2
163 WRITE(ERRTXT,104) X,A
164 IF(LJA) CALL MTLPRT(NAMEJ,'C343.4',ERRTXT)
165 IF(LIA) CALL MTLPRT(NAMEI,'C343.4',ERRTXT)
166 RETURN
167 ENDIF
168 11 CONTINUE
169 IF(NMAX .LT. 0) THEN
170 AL=2/X
171 B(1)=AL*A*B(0)+SGN*B(1)
172 DO 13 N = 1,-NMAX-1
173 13 B(N+1)=AL*(A-N)*B(N)+SGN*B(N-1)
174 ENDIF
175 RETURN
176 101 FORMAT('ILLEGAL ARGUMENT X = ',1P,D15.8)
177 102 FORMAT('ILLEGAL ORDER A = ',1P,D15.8)
178 103 FORMAT('ILLEGAL NMAX = ',I5)
179 104 FORMAT('NO CONVERGENCE FOR X = ',1P,D15.8,' A = ',D15.8,
180 1 ' TRY SMALLER ND')
181 END