]>
Commit | Line | Data |
---|---|---|
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 |