Commit d55dcfb5ae31249d42c99c6af1da476b7e14d14e
1 parent
e80b2ec787
Exists in
master
and in
3 other branches
1) Added single precision versions of besri and besrj
2) Modification of corresponding interface in fvn_fnlib.f90 git-svn-id: https://lxsd.femto-st.fr/svn/fvn@61 b657c933-2333-4658-acf2-d3c7c2708721
Showing 5 changed files with 438 additions and 6 deletions Side-by-side Diff
fvn_fnlib/Makefile
fvn_fnlib/b1slr.f
1 | + SUBROUTINE B1SLR(X,NB,IZE,B,NCALC) | |
2 | +C THIS ROUTINE CALCULATES BESSEL FUNCTIONS I AND J OF REAL | |
3 | +C ARGUMENT AND INTEGER ORDER. | |
4 | +C | |
5 | +C | |
6 | +C EXPLANATION OF VARIABLES IN THE CALLING SEQUENCE | |
7 | +C | |
8 | +C X REAL ARGUMENT FOR WHICH I*S OR J*S | |
9 | +C ARE TO BE CALCULATED. IF I*S ARE TO BE CALCULATED, | |
10 | +C ABS(X) MUST BE LESS THAN EXPARG (WHICH SEE BELOW). | |
11 | +C NB INTEGER TYPE. 1 + HIGHEST ORDER TO BE CALCULATED. | |
12 | +C IT MUST BE POSITIVE. | |
13 | +C IZE INTEGER TYPE. ZERO IF J*S ARE TO BE CALCULATED, 1 | |
14 | +C IF I*S ARE TO BE CALCULATED. | |
15 | +C B REAL VECTOR OF LENGTH NB, NEED NOT BE | |
16 | +C INITIALIZED BY USER. IF THE ROUTINE TERMINATES | |
17 | +C NORMALLY (NCALC=NB), IT RETURNS J(OR I)-SUB-ZERO | |
18 | +C THROUGH J(OR I)-SUB-NB-MINUS-ONE OF X IN THIS | |
19 | +C VECTOR. | |
20 | +C NCALC INTEGER TYPE, NEED NOT BE INITIALIZED BY USER. | |
21 | +C BEFORE USING THE RESULTS, THE USER SHOULD CHECK THAT | |
22 | +C NCALC=NB, I.E. ALL ORDERS HAVE BEEN CALCULATED TO | |
23 | +C THE DESIRED ACCURACY. SEE ERROR RETURNS BELOW. | |
24 | +C | |
25 | +C | |
26 | +C EXPLANATION OF MACHINE-DEPENDENT CONSTANTS | |
27 | +C | |
28 | +C NSIG DECIMAL SIGNIFICANCE DESIRED. SHOULD BE SET TO | |
29 | +C IFIX(ALOG10(2)*NBIT+1), WHERE NBIT IS THE NUMBER OF | |
30 | +C BITS IN THE MANTISSA OF A REAL VARIABLE. | |
31 | +C SETTING NSIG LOWER WILL RESULT IN DECREASED ACCURACY | |
32 | +C WHILE SETTING NSIG HIGHER WILL INCREASE CPU TIME | |
33 | +C WITHOUT INCREASING ACCURACY. THE TRUNCATION ERROR | |
34 | +C IS LIMITED TO T=.5*10**-NSIG FOR J*S OF ORDER LESS | |
35 | +C THAN ARGUMENT, AND TO A RELATIVE ERROR OF T FOR | |
36 | +C I*S AND THE OTHER J*S. | |
37 | +C NTEN LARGEST INTEGER K SUCH THAT 10**K IS MACHINE- | |
38 | +C REPRESENTABLE IN SINGLE PRECISION. | |
39 | +C LARGEX UPPER LIMIT ON THE MAGNITUDE OF X. BEAR IN MIND | |
40 | +C THAT IF ABS(X)=N, THEN AT LEAST N ITERATIONS OF THE | |
41 | +C BACKWARD RECURSION WILL BE EXECUTED. | |
42 | +C EXPARG LARGEST REAL ARGUMENT THAT THE LIBRARY | |
43 | +C EXP ROUTINE CAN HANDLE. | |
44 | +C | |
45 | +C PORT NOTE, SEPTEMBER 8,1976 - | |
46 | +C THE LARGEX AND EXPARG TESTS ARE MADE IN THE OUTER ROUTINES - | |
47 | +C BESRJ AND BESRI, WHICH CALL B1SLR. | |
48 | +C | |
49 | +C | |
50 | +C ERROR RETURNS | |
51 | +C | |
52 | +C PORT NOTE, SEPTEMBER 8, 1976 - | |
53 | +C THE NOTES BELOW ARE KEPT IN FOR THE RECORD, BUT, AS ABOVE, | |
54 | +C THE ACTUAL TESTS ARE NOW IN THE OUTER CALLING ROUTINES. | |
55 | +C | |
56 | +C LET G DENOTE EITHER I OR J. | |
57 | +C IN CASE OF AN ERROR, NCALC.NE.NB, AND NOT ALL G*S | |
58 | +C ARE CALCULATED TO THE DESIRED ACCURACY. | |
59 | +C IF NCALC.LT.0, AN ARGUMENT IS OUT OF RANGE. NB.LE.0 | |
60 | +C OR IZE IS NEITHER 0 NOR 1 OR IZE=1 AND ABS(X).GE.EXPARG. | |
61 | +C IN THIS CASE, THE B-VECTOR IS NOT CALCULATED, AND NCALC | |
62 | +C IS SET TO MIN0(NB,0)-1 SO NCALC.NE.NB. | |
63 | +C NB.GT.NCALC.GT.0 WILL OCCUR IF NB.GT.MAGX AND ABS(G- | |
64 | +C SUB-NB-OF-X/G-SUB-MAGX+NP-OF-X).LT.10.**(NTEN/2), I.E. NB | |
65 | +C IS MUCH GREATER THAN MAGX. IN THIS CASE, B(N) IS CALCU- | |
66 | +C LATED TO THE DESIRED ACCURACY FOR N.LE.NCALC, BUT FOR | |
67 | +C NCALC.LT.N.LE.NB, PRECISION IS LOST. IF N.GT.NCALC AND | |
68 | +C ABS(B(NCALC)/B(N)).EQ.10**-K, THEN THE LAST K SIGNIFICANT | |
69 | +C FIGURES OF B(N) ARE ERRONEOUS. IF THE USER WISHES TO | |
70 | +C CALCULATE B(N) TO HIGHER ACCURACY, HE SHOULD USE AN | |
71 | +C ASYMPTOTIC FORMULA FOR LARGE ORDER. | |
72 | +C | |
73 | + REAL | |
74 | + 1 X,B,P,TEST,TEMPA,TEMPB,TEMPC,SIGN,SUM,TOVER, | |
75 | + 2 PLAST,POLD,PSAVE,PSAVEL,R1MACH | |
76 | + DIMENSION B(NB) | |
77 | + DATA NSIG/0/, NTEN/0/ | |
78 | + IF(NSIG .NE. 0) GO TO 1 | |
79 | + NSIG = IFIX(-ALOG10(R1MACH(3))+1.) | |
80 | + NTEN = ALOG10(R1MACH(2)) | |
81 | + 1 TEMPA=ABS(X) | |
82 | + MAGX=IFIX((TEMPA)) | |
83 | +C | |
84 | + SIGN=FLOAT(1-2*IZE) | |
85 | + NCALC=NB | |
86 | +C USE 2-TERM ASCENDING SERIES FOR SMALL X | |
87 | + IF(TEMPA**4.LT..1E0**NSIG) GO TO 30 | |
88 | +C INITIALIZE THE CALCULATION OF P*S | |
89 | + NBMX=NB-MAGX | |
90 | + N=MAGX+1 | |
91 | + PLAST=1.E0 | |
92 | + P=FLOAT(2*N)/TEMPA | |
93 | +C CALCULATE GENERAL SIGNIFICANCE TEST | |
94 | + TEST=2.E0*1.E1**NSIG | |
95 | + IF(IZE.EQ.1.AND.2*MAGX.GT.5*NSIG) TEST=SQRT(TEST*P) | |
96 | + IF(IZE.EQ.1.AND.2*MAGX.LE.5*NSIG) TEST=TEST/1.585**MAGX | |
97 | + M=0 | |
98 | + IF(NBMX.LT.3) GO TO 4 | |
99 | +C CALCULATE P*S UNTIL N=NB-1. CHECK FOR POSSIBLE OVERFLOW. | |
100 | + TOVER=1.E1**(NTEN-NSIG) | |
101 | + NSTART=MAGX+2 | |
102 | + NEND=NB-1 | |
103 | + DO 3 N=NSTART,NEND | |
104 | + POLD=PLAST | |
105 | + PLAST=P | |
106 | + P=FLOAT(2*N)*PLAST/TEMPA-SIGN*POLD | |
107 | + IF(P-TOVER) 3,3,5 | |
108 | + 3 CONTINUE | |
109 | +C CALCULATE SPECIAL SIGNIFICANCE TEST FOR NBMX.GT.2. | |
110 | + TEST=AMAX1(TEST,SQRT(PLAST*1.E1**NSIG)*SQRT(2.E0*P)) | |
111 | +C CALCULATE P*S UNTIL SIGNIFICANCE TEST PASSES | |
112 | + 4 N=N+1 | |
113 | + POLD=PLAST | |
114 | + PLAST=P | |
115 | + P=FLOAT(2*N)*PLAST/TEMPA-SIGN*POLD | |
116 | + IF(P.LT.TEST) GO TO 4 | |
117 | + IF(IZE.EQ.1.OR.M.EQ.1) GO TO 12 | |
118 | +C FOR J*S, A STRONG VARIANT OF THE TEST IS NECESSARY. | |
119 | +C CALCULATE IT, AND CALCULATE P*S UNTIL THIS TEST IS PASSED. | |
120 | + M=1 | |
121 | + TEMPB=P/PLAST | |
122 | + TEMPC=FLOAT(N+1)/TEMPA | |
123 | + IF(TEMPB+1.E0/TEMPB.GT.2.E0*TEMPC)TEMPB=TEMPC+SQRT(TEMPC**2-1.E0) | |
124 | + TEST=TEST/SQRT(TEMPB-1.E0/TEMPB) | |
125 | + IF(P-TEST) 4,12,12 | |
126 | +C TO AVOID OVERFLOW, DIVIDE P*S BY TOVER. CALCULATE P*S | |
127 | +C UNTIL ABS(P).GT.1. | |
128 | + 5 TOVER=1.E1**NTEN | |
129 | + P=P/TOVER | |
130 | + PLAST=PLAST/TOVER | |
131 | + PSAVE=P | |
132 | + PSAVEL=PLAST | |
133 | + NSTART=N+1 | |
134 | + 6 N=N+1 | |
135 | + POLD=PLAST | |
136 | + PLAST=P | |
137 | + P=FLOAT(2*N)*PLAST/TEMPA-SIGN*POLD | |
138 | + IF(P.LE.1.E0) GO TO 6 | |
139 | + TEMPB=FLOAT(2*N)/TEMPA | |
140 | + IF(IZE.EQ.1) GO TO 8 | |
141 | + TEMPC=.5E0*TEMPB | |
142 | + TEMPB=PLAST/POLD | |
143 | + IF(TEMPB+1.E0/TEMPB.GT.2.E0*TEMPC)TEMPB=TEMPC+SQRT(TEMPC**2-1.E0) | |
144 | +C CALCULATE BACKWARD TEST, AND FIND NCALC, THE HIGHEST N | |
145 | +C SUCH THAT THE TEST IS PASSED. | |
146 | + 8 TEST=.5E0*POLD*PLAST*(1.E0-1.E0/TEMPB**2)/1.E1**NSIG | |
147 | + P=PLAST*TOVER | |
148 | + N=N-1 | |
149 | + NEND=MIN0(NB,N) | |
150 | + DO 9 NCALC=NSTART,NEND | |
151 | + POLD=PSAVEL | |
152 | + PSAVEL=PSAVE | |
153 | + PSAVE=FLOAT(2*N)*PSAVEL/TEMPA-SIGN*POLD | |
154 | + IF(PSAVE*PSAVEL-TEST) 9,9,10 | |
155 | + 9 CONTINUE | |
156 | + NCALC=NEND+1 | |
157 | + 10 NCALC=NCALC-1 | |
158 | +C THE SUM B(1)+2B(3)+2B(5)... IS USED TO NORMALIZE. M, THE | |
159 | +C COEFFICIENT OF B(N), IS INITIALIZED TO 2 OR 0. | |
160 | + 12 N=N+1 | |
161 | + M=2*N-4*(N/2) | |
162 | +C INITIALIZE THE BACKWARD RECURSION AND THE NORMALIZATION | |
163 | +C SUM | |
164 | + TEMPB=0.E0 | |
165 | + TEMPA=1.E0/P | |
166 | + SUM=FLOAT(M)*TEMPA | |
167 | + NEND=N-NB | |
168 | + IF(NEND) 17,15,13 | |
169 | +C RECUR BACKWARD VIA DIFFERENCE EQUATION, CALCULATING (BUT | |
170 | +C NOT STORING) B(N), UNTIL N=NB. | |
171 | + 13 DO 14 L=1,NEND | |
172 | + N=N-1 | |
173 | + TEMPC=TEMPB | |
174 | + TEMPB=TEMPA | |
175 | + TEMPA=FLOAT(2*N)*TEMPB/X-SIGN*TEMPC | |
176 | + M=2-M | |
177 | + 14 SUM=SUM+FLOAT(M)*TEMPA | |
178 | +C STORE B(NB) | |
179 | + 15 B(N)=TEMPA | |
180 | + IF(NB.GT.1) GO TO 16 | |
181 | +C NB=1. SINCE 2*TEMPA WAS ADDED TO THE SUM, TEMPA MUST BE | |
182 | +C SUBTRACTED | |
183 | + SUM=SUM-TEMPA | |
184 | + GO TO 23 | |
185 | +C CALCULATE AND STORE B(NB-1) | |
186 | + 16 N=N-1 | |
187 | + B(N) =FLOAT(2*N)*TEMPA/X-SIGN*TEMPB | |
188 | + IF(N.EQ.1) GO TO 22 | |
189 | + M=2-M | |
190 | + SUM=SUM+FLOAT(M)*B(N) | |
191 | + GO TO 19 | |
192 | +C N.LT.NB, SO STORE B(N) AND SET HIGHER ORDERS TO ZERO | |
193 | + 17 B(N)=TEMPA | |
194 | + NEND=-NEND | |
195 | + DO 18 L=1,NEND | |
196 | + K=N+L | |
197 | + 18 B(K)=0.E0 | |
198 | + 19 NEND=N-2 | |
199 | + IF(NEND.EQ.0) GO TO 21 | |
200 | +C CALCULATE VIA DIFFERENCE EQUATION AND STORE B(N), | |
201 | +C UNTIL N=2 | |
202 | + DO 20 L=1,NEND | |
203 | + N=N-1 | |
204 | + B(N)=(FLOAT(2*N)*B(N+1))/X-SIGN*B(N+2) | |
205 | + M=2-M | |
206 | + 20 SUM=SUM+FLOAT(M)*B(N) | |
207 | +C CALCULATE B(1) | |
208 | + 21 B(1)=2.E0*B(2)/X-SIGN*B(3) | |
209 | + 22 SUM=SUM+B(1) | |
210 | +C NORMALIZE--IF IZE=1, DIVIDE SUM BY COSH(X). DIVIDE ALL | |
211 | +C B(N) BY SUM. | |
212 | + 23 IF(IZE.EQ.0) GO TO 25 | |
213 | + TEMPA=EXP(ABS(X)) | |
214 | + SUM=2.E0*SUM/(TEMPA+1.E0/TEMPA) | |
215 | + 25 DO 26 N=1,NB | |
216 | + 26 B(N)=B(N)/SUM | |
217 | + RETURN | |
218 | +C | |
219 | +C TWO-TERM ASCENDING SERIES FOR SMALL X | |
220 | + 30 TEMPA=1.E0 | |
221 | + TEMPB=-.25E0*X*X*SIGN | |
222 | + B(1)=1.E0+TEMPB | |
223 | + IF(NB.EQ.1) GO TO 32 | |
224 | + DO 31 N=2,NB | |
225 | + TEMPA=TEMPA*X/FLOAT(2*N-2) | |
226 | + 31 B(N)=TEMPA*(1.E0+TEMPB/FLOAT(N)) | |
227 | + 32 RETURN | |
228 | + END |
fvn_fnlib/besri.f
1 | + SUBROUTINE BESRI(X, NB, B) | |
2 | +C | |
3 | +C THIS ROUTINE CALCULATES MODIFIED BESSEL FUNCTIONS I OF REAL | |
4 | +C ARGUMENT AND INTEGER ORDER. | |
5 | +C | |
6 | +C EXPLANATION OF VARIABLES IN THE CALLING SEQUENCE - | |
7 | +C | |
8 | +C X - REAL ARGUMENT FOR WHICH THE I*S | |
9 | +C ARE TO BE CALCULATED. | |
10 | +C | |
11 | +C NB - INTEGER TYPE. 1 + HIGHEST ORDER TO BE CALCULATED. | |
12 | +C IT MUST BE POSITIVE. | |
13 | +C | |
14 | +C B - REAL VECTOR OF LENGTH NB, NEED NOT BE | |
15 | +C INITIALIZED BY USER. IF THE ROUTINE TERMINATES | |
16 | +C NORMALLY IT RETURNS I-SUB-ZERO | |
17 | +C THROUGH I-SUB-NB-MINUS-ONE OF X IN THIS | |
18 | +C VECTOR. | |
19 | +C | |
20 | +C ACCURACY OF THE COMPUTED VALUES - | |
21 | +C | |
22 | +C IN CASE OF AN ERROR, NOT ALL I*S | |
23 | +C ARE CALCULATED TO THE DESIRED ACCURACY. | |
24 | +C | |
25 | +C THE SUBPROGRAM CALLED BY BESRI, B1SLR, | |
26 | +C RETURNS IN THE VARIABLE, NCALC, THE NUMBER CALCULATED CORRECTLY. | |
27 | +C | |
28 | +C LET NTEN BE THE LARGEST INTEGER K SUCH THAT 10**K IS MACHINE- | |
29 | +C REPRESENTABLE IN REAL. | |
30 | +C THEN NB.GT.NCALC.GT.0 WILL OCCUR IF NB.GT.MAGX AND ABS(I- | |
31 | +C SUB-NB-OF-X/I-SUB-MAGX+NP-OF-X).LT.10.**(NTEN/2), I.E. NB | |
32 | +C IS MUCH GREATER THAN MAGX. IN THIS CASE, B(N) IS CALCU- | |
33 | +C LATED TO THE DESIRED ACCURACY FOR N.LE.NCALC, BUT FOR | |
34 | +C NCALC.LT.N.LE.NB, PRECISION IS LOST. IF N.GT.NCALC AND | |
35 | +C ABS(B(NCALC)/B(N)).EQ.10**-K, THEN THE LAST K SIGNIFICANT | |
36 | +C FIGURES OF B(N) ARE ERRONEOUS. IF THE USER WISHES TO | |
37 | +C CALCULATE B(N) TO HIGHER ACCURACY, HE SHOULD USE AN | |
38 | +C ASYMPTOTIC FORMULA FOR LARGE ORDER. | |
39 | +C | |
40 | + REAL X,B(NB),R1MACH | |
41 | +C | |
42 | +C CHECK INPUT VALUES | |
43 | +C | |
44 | +C AN UPPER LIMIT OF 10000 IS SET ON THE MAGNITUDE OF X. | |
45 | +C BEAR IN MIND THAT IF ABS(X)=N, THEN AT LEAST N ITERATIONS | |
46 | +C OF THE BACKWARD RECURSION WILL BE EXECUTED. | |
47 | +C | |
48 | + MAGX = ABS(X) | |
49 | + MEXP = ALOG(R1MACH(2)) | |
50 | +C | |
51 | +C/6S | |
52 | +C IF (MAGX .GT. 10000 .OR. MAGX .GT. MEXP) CALL SETERR( | |
53 | +C 1 33H BESRI - X IS TOO BIG (MAGNITUDE),33,1,2) | |
54 | +C/7S | |
55 | + IF (MAGX .GT. 10000 .OR. MAGX .GT. MEXP) CALL SETERR( | |
56 | + 1 ' BESRI - X IS TOO BIG (MAGNITUDE)',33,1,2) | |
57 | +C/ | |
58 | +C | |
59 | +C/6S | |
60 | +C IF (NB .LT. 1) CALL SETERR( | |
61 | +C 1 28H BESRI - NB SHOULD = ORDER+1,28,2,2) | |
62 | +C/7S | |
63 | + IF (NB .LT. 1) CALL SETERR( | |
64 | + 1 ' BESRI - NB SHOULD = ORDER+1',28,2,2) | |
65 | +C/ | |
66 | +C | |
67 | +C BESRJ CALLS ON THE SUBPROGRAM,B1SLR, | |
68 | +C WHICH IS SOOKNES ORIGINAL BESLRI. | |
69 | +C | |
70 | +C THE ADDITIONAL INPUT ARGUMENTS REQUIRED FOR IT ARE - | |
71 | +C | |
72 | +C IZE INTEGER TYPE. ZERO IF J*S ARE TO BE CALCULATED, 1 | |
73 | +C IF I*S ARE TO BE CALCULATED.(THIRD ARGUMENT BELOW) | |
74 | +C | |
75 | +C NCALC INTEGER TYPE, NEED NOT BE INITIALIZED BY USER. | |
76 | +C BEFORE USING THE RESULTS, IT SHOULD BE CHECKED THAT | |
77 | +C NCALC=NB, I.E. ALL ORDERS HAVE BEEN CALCULATED TO | |
78 | +C THE DESIRED ACCURACY. | |
79 | +C | |
80 | + CALL B1SLR (X, NB, 1, B, NCALC) | |
81 | +C | |
82 | +C TEST IF ALL GOT COMPUTED OK | |
83 | +C (SINCE SOME VALUES MAY BE OK, THIS IS A RECOVERABLE ERROR.) | |
84 | +C | |
85 | + IF (NB .EQ. NCALC) RETURN | |
86 | +C | |
87 | + NCALC = NCALC+10 | |
88 | +C/6S | |
89 | +C CALL SETERR( | |
90 | +C 1 38H BESRI - ONLY THIS MANY ANSWERS ARE OK,38,NCALC,1) | |
91 | +C/7S | |
92 | + CALL SETERR( | |
93 | + 1 ' BESRI - ONLY THIS MANY ANSWERS ARE OK',38,NCALC,1) | |
94 | +C/ | |
95 | +C | |
96 | + RETURN | |
97 | + END |
fvn_fnlib/besrj.f
1 | + SUBROUTINE BESRJ(X, NB, B) | |
2 | +C | |
3 | +C THIS ROUTINE CALCULATES BESSEL FUNCTIONS J OF REAL | |
4 | +C ARGUMENT AND INTEGER ORDER. | |
5 | +C | |
6 | +C EXPLANATION OF VARIABLES IN THE CALLING SEQUENCE - | |
7 | +C | |
8 | +C X - REAL ARGUMENT FOR WHICH THE J*S | |
9 | +C ARE TO BE CALCULATED. | |
10 | +C | |
11 | +C NB - INTEGER TYPE. 1 + HIGHEST ORDER TO BE CALCULATED. | |
12 | +C IT MUST BE POSITIVE. | |
13 | +C | |
14 | +C B - REAL VECTOR OF LENGTH NB, NEED NOT BE | |
15 | +C INITIALIZED BY USER. IF THE ROUTINE TERMINATES | |
16 | +C NORMALLY IT RETURNS J(OR I)-SUB-ZERO | |
17 | +C THROUGH J(OR I)-SUB-NB-MINUS-ONE OF X IN THIS | |
18 | +C VECTOR. | |
19 | +C | |
20 | +C ACCURACY OF THE COMPUTED VALUES - | |
21 | +C | |
22 | +C IN CASE OF AN ERROR, NOT ALL J*S | |
23 | +C ARE CALCULATED TO THE DESIRED ACCURACY. | |
24 | +C | |
25 | +C THE SUBPROGRAM CALLED BY BESRJ, B1SLR, | |
26 | +C RETURNS IN THE VARIABLE, NCALC, THE NUMBER CALCULATED CORRECTLY. | |
27 | +C | |
28 | +C LET NTEN BE THE LARGEST INTEGER K SUCH THAT 10**K IS MACHINE- | |
29 | +C REPRESENTABLE IN SINGLE PRECISION. | |
30 | +C THEN NB.GT.NCALC.GT.0 WILL OCCUR IF NB.GT.MAGX AND ABS(J- | |
31 | +C SUB-NB-OF-X/J-SUB-MAGX+NP-OF-X).LT.10.**(NTEN/2), I.E. NB | |
32 | +C IS MUCH GREATER THAN MAGX. IN THIS CASE, B(N) IS CALCU- | |
33 | +C LATED TO THE DESIRED ACCURACY FOR N.LE.NCALC, BUT FOR | |
34 | +C NCALC.LT.N.LE.NB, PRECISION IS LOST. IF N.GT.NCALC AND | |
35 | +C ABS(B(NCALC)/B(N)).EQ.10**-K, THEN THE LAST K SIGNIFICANT | |
36 | +C FIGURES OF B(N) ARE ERRONEOUS. IF THE USER WISHES TO | |
37 | +C CALCULATE B(N) TO HIGHER ACCURACY, HE SHOULD USE AN | |
38 | +C ASYMPTOTIC FORMULA FOR LARGE ORDER. | |
39 | +C | |
40 | + REAL X,B(NB) | |
41 | +C | |
42 | +C CHECK INPUT VALUES | |
43 | +C | |
44 | +C AN UPPER LIMIT OF 10000 IS SET ON THE MAGNITUDE OF X. | |
45 | +C BEAR IN MIND THAT IF ABS(X)=N, THEN AT LEAST N ITERATIONS | |
46 | +C OF THE BACKWARD RECURSION WILL BE EXECUTED. | |
47 | +C | |
48 | + MAGX = ABS(X) | |
49 | +C | |
50 | +C/6S | |
51 | +C IF (MAGX .GT. 10000) CALL SETERR( | |
52 | +C 1 33H BESRJ - X IS TOO BIG (MAGNITUDE),33,1,2) | |
53 | +C/7S | |
54 | + IF (MAGX .GT. 10000) CALL SETERR( | |
55 | + 1 ' BESRJ - X IS TOO BIG (MAGNITUDE)',33,1,2) | |
56 | +C/ | |
57 | +C | |
58 | +C/6S | |
59 | +C IF (NB .LT. 1) CALL SETERR( | |
60 | +C 1 28H BESRJ - NB SHOULD = ORDER+1,28,2,2) | |
61 | +C/7S | |
62 | + IF (NB .LT. 1) CALL SETERR( | |
63 | + 1 ' BESRJ - NB SHOULD = ORDER+1',28,2,2) | |
64 | +C/ | |
65 | +C | |
66 | +C BESRJ CALLS ON THE SUBPROGRAM,B1SLR, | |
67 | +C WHICH IS SOOKNES ORIGINAL BESLRI. | |
68 | +C | |
69 | +C THE ADDITIONAL INPUT ARGUMENTS REQUIRED FOR IT ARE - | |
70 | +C | |
71 | +C IZE INTEGER TYPE. ZERO IF J*S ARE TO BE CALCULATED, 1 | |
72 | +C IF I*S ARE TO BE CALCULATED.(THIRD ARGUMENT BELOW) | |
73 | +C | |
74 | +C NCALC INTEGER TYPE, NEED NOT BE INITIALIZED BY USER. | |
75 | +C BEFORE USING THE RESULTS, IT SHOULD BE CHECKED THAT | |
76 | +C NCALC=NB, I.E. ALL ORDERS HAVE BEEN CALCULATED TO | |
77 | +C THE DESIRED ACCURACY. | |
78 | +C | |
79 | + CALL B1SLR (X, NB, 0, B, NCALC) | |
80 | +C | |
81 | +C TEST IF ALL GOT COMPUTED OK | |
82 | +C (SINCE SOME VALUES MAY BE OK, THIS IS A RECOVERABLE ERROR.) | |
83 | +C | |
84 | + IF (NB .EQ. NCALC) RETURN | |
85 | +C | |
86 | + NCALC = NCALC+10 | |
87 | +C/6S | |
88 | +C CALL SETERR( | |
89 | +C 1 38H BESRJ - ONLY THIS MANY ANSWERS ARE OK,38,NCALC,1) | |
90 | +C/7S | |
91 | + CALL SETERR( | |
92 | + 1 ' BESRJ - ONLY THIS MANY ANSWERS ARE OK',38,NCALC,1) | |
93 | +C/ | |
94 | +C | |
95 | + RETURN | |
96 | + END |
fvn_fnlib/fvn_fnlib.f90
... | ... | @@ -802,19 +802,29 @@ |
802 | 802 | !!!!!!!!!!!!!!!!!!!!! |
803 | 803 | ! vector b of Bessel J values of x from order 0 to order (n-1) |
804 | 804 | interface besrj |
805 | + subroutine besrj(x,n,b) | |
806 | + real(kind(1.e0)), intent(in) :: x | |
807 | + integer, intent(in) :: n | |
808 | + real(kind(1.e0)), intent(out) :: b(n) | |
809 | + end subroutine besrj | |
805 | 810 | subroutine dbesrj(x,n,b) |
806 | - real(kind(1.d0)) :: x | |
807 | - integer :: n | |
808 | - real(kind(1.d0)) :: b(n) | |
811 | + real(kind(1.d0)), intent(in) :: x | |
812 | + integer, intent(in) :: n | |
813 | + real(kind(1.d0)), intent(out) :: b(n) | |
809 | 814 | end subroutine dbesrj |
810 | 815 | end interface besrj |
811 | 816 | |
812 | 817 | ! vector b of Bessel I values of x from order 0 to order (n-1) |
813 | 818 | interface besri |
819 | + subroutine besri(x,n,b) | |
820 | + real(kind(1.e0)), intent(in) :: x | |
821 | + integer, intent(in) :: n | |
822 | + real(kind(1.e0)), intent(out) :: b(n) | |
823 | + end subroutine besri | |
814 | 824 | subroutine dbesri(x,n,b) |
815 | - real(kind(1.d0)) :: x | |
816 | - integer :: n | |
817 | - real(kind(1.d0)) :: b(n) | |
825 | + real(kind(1.d0)), intent(in) :: x | |
826 | + integer, intent(in) :: n | |
827 | + real(kind(1.d0)), intent(out) :: b(n) | |
818 | 828 | end subroutine dbesri |
819 | 829 | end interface besri |
820 | 830 |