TBCI Numerical high perf. C++ Library 2.8.0
zbesj.c
Go to the documentation of this file.
1
4/* zbesj.f -- translated by f2c (version 19980516).
5 You must link the resulting object file with the libraries:
6 -lf2c -lm (in that order)
7*/
8
9/* $Id: zbesj.c,v 1.2.2.4 2019/05/28 11:13:02 garloff Exp $ */
10
11#include "tbci/specfun/prototypes.h"
12#include "tbci/specfun/prototypes2.h"
13
14/* Table of constant values */
15
16static integer c__4 = 4;
17static integer c__15 = 15;
18static integer c__16 = 16;
19static integer c__5 = 5;
20static integer c__14 = 14;
21static integer c__9 = 9;
22static integer c__1 = 1;
23
24/* Subroutine */ int zbesj_(doublereal *zr, doublereal *zi, doublereal *fnu, integer *kode, integer *n, doublereal *cyr, doublereal *cyi, integer *nz, integer *ierr)
25{
26 /* Initialized data */
27
28 static doublereal hpi = 1.57079632679489662;
29
30 /* System generated locals */
31 integer i__1, i__2;
32 doublereal d__1, d__2;
33
34 /* Builtin functions */
35 double sqrt(double), cos(double), sin(double);
36
37 /* Local variables */
38 static doublereal alim, elim, atol;
39 static integer inuh;
40 static doublereal fnul, rtol;
41 static integer i__, k;
42 static doublereal ascle, csgni, csgnr;
43 extern /* Subroutine */ int zbinu_(doublereal *zr, doublereal *zi, doublereal *fnu, integer *kode, integer *n, doublereal *cyr, doublereal *cyi, integer *nz, doublereal *rl, doublereal *fnul, doublereal *tol, doublereal *elim, doublereal *alim);
44 static integer k1;
45 extern doublereal d1mach_(integer*);
46 static integer k2;
47 extern integer i1mach_(integer*);
48 static doublereal aa, bb, fn;
49 static integer nl;
50 static doublereal az;
51 static integer ir;
52 static doublereal rl;
54 static doublereal dig, cii, arg, r1m5;
55 static integer inu;
56 static doublereal tol, sti, zni, str, znr;
57
58/* ***BEGIN PROLOGUE ZBESJ */
59/* ***DATE WRITTEN 830501 (YYMMDD) */
60/* ***REVISION DATE 890801 (YYMMDD) */
61/* ***CATEGORY NO. B5K */
62/* ***KEYWORDS J-BESSEL FUNCTION,BESSEL FUNCTION OF COMPLEX ARGUMENT, */
63/* BESSEL FUNCTION OF FIRST KIND */
64/* ***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES */
65/* ***PURPOSE TO COMPUTE THE J-BESSEL FUNCTION OF A COMPLEX ARGUMENT */
66/* ***DESCRIPTION */
67
68/* ***A DOUBLE PRECISION ROUTINE*** */
69/* ON KODE=1, CBESJ COMPUTES AN N MEMBER SEQUENCE OF COMPLEX */
70/* BESSEL FUNCTIONS CY(I)=J(FNU+I-1,Z) FOR REAL, NONNEGATIVE */
71/* ORDERS FNU+I-1, I=1,...,N AND COMPLEX Z IN THE CUT PLANE */
72/* -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESJ RETURNS THE SCALED */
73/* FUNCTIONS */
74
75/* CY(I)=EXP(-ABS(Y))*J(FNU+I-1,Z) I = 1,...,N , Y=AIMAG(Z) */
76
77/* WHICH REMOVE THE EXPONENTIAL GROWTH IN BOTH THE UPPER AND */
78/* LOWER HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION */
79/* ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS */
80/* (REF. 1). */
81
82/* INPUT ZR,ZI,FNU ARE DOUBLE PRECISION */
83/* ZR,ZI - Z=CMPLX(ZR,ZI), -PI.LT.ARG(Z).LE.PI */
84/* FNU - ORDER OF INITIAL J FUNCTION, FNU.GE.0.0D0 */
85/* KODE - A PARAMETER TO INDICATE THE SCALING OPTION */
86/* KODE= 1 RETURNS */
87/* CY(I)=J(FNU+I-1,Z), I=1,...,N */
88/* = 2 RETURNS */
89/* CY(I)=J(FNU+I-1,Z)EXP(-ABS(Y)), I=1,...,N */
90/* N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1 */
91
92/* OUTPUT CYR,CYI ARE DOUBLE PRECISION */
93/* CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS */
94/* CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE */
95/* CY(I)=J(FNU+I-1,Z) OR */
96/* CY(I)=J(FNU+I-1,Z)EXP(-ABS(Y)) I=1,...,N */
97/* DEPENDING ON KODE, Y=AIMAG(Z). */
98/* NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW, */
99/* NZ= 0 , NORMAL RETURN */
100/* NZ.GT.0 , LAST NZ COMPONENTS OF CY SET ZERO DUE */
101/* TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0), */
102/* I = N-NZ+1,...,N */
103/* IERR - ERROR FLAG */
104/* IERR=0, NORMAL RETURN - COMPUTATION COMPLETED */
105/* IERR=1, INPUT ERROR - NO COMPUTATION */
106/* IERR=2, OVERFLOW - NO COMPUTATION, AIMAG(Z) */
107/* TOO LARGE ON KODE=1 */
108/* IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE */
109/* BUT LOSSES OF SIGNIFCANCE BY ARGUMENT */
110/* REDUCTION PRODUCE LESS THAN HALF OF MACHINE */
111/* ACCURACY */
112/* IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA- */
113/* TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI- */
114/* CANCE BY ARGUMENT REDUCTION */
115/* IERR=5, ERROR - NO COMPUTATION, */
116/* ALGORITHM TERMINATION CONDITION NOT MET */
117
118/* ***LONG DESCRIPTION */
119
120/* THE COMPUTATION IS CARRIED OUT BY THE FORMULA */
121
122/* J(FNU,Z)=EXP( FNU*PI*I/2)*I(FNU,-I*Z) AIMAG(Z).GE.0.0 */
123
124/* J(FNU,Z)=EXP(-FNU*PI*I/2)*I(FNU, I*Z) AIMAG(Z).LT.0.0 */
125
126/* WHERE I**2 = -1 AND I(FNU,Z) IS THE I BESSEL FUNCTION. */
127
128/* FOR NEGATIVE ORDERS,THE FORMULA */
129
130/* J(-FNU,Z) = J(FNU,Z)*COS(PI*FNU) - Y(FNU,Z)*SIN(PI*FNU) */
131
132/* CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO INTEGERS, THE */
133/* THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE POSITIVE */
134/* INTEGER,THE MAGNITUDE OF J(-FNU,Z)=J(FNU,Z)*COS(PI*FNU) IS A */
135/* LARGE NEGATIVE POWER OF TEN. BUT WHEN FNU IS NOT AN INTEGER, */
136/* Y(FNU,Z) DOMINATES IN MAGNITUDE WITH A LARGE POSITIVE POWER OF */
137/* TEN AND THE MOST THAT THE SECOND TERM CAN BE REDUCED IS BY */
138/* UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, WIDE CHANGES CAN */
139/* OCCUR WITHIN UNIT ROUNDOFF OF A LARGE INTEGER FOR FNU. HERE, */
140/* LARGE MEANS FNU.GT.CABS(Z). */
141
142/* IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE- */
143/* MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS */
144/* LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. */
145/* CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN */
146/* LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG */
147/* IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS */
148/* DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION. */
149/* IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS */
150/* LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS */
151/* MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE */
152/* INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS */
153/* RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3 */
154/* ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION */
155/* ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION */
156/* ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN */
157/* THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT */
158/* TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS */
159/* IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC. */
160/* SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES. */
161
162/* THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX */
163/* BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT */
164/* ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE- */
165/* SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE */
166/* ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))), */
167/* ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF */
168/* CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY */
169/* HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN */
170/* ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY */
171/* SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER */
172/* THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K, */
173/* 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS */
174/* THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER */
175/* COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY */
176/* BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER */
177/* COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE */
178/* MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES, */
179/* THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P, */
180/* OR -PI/2+P. */
181
182/* ***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ */
183/* AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF */
184/* COMMERCE, 1955. */
185
186/* COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT */
187/* BY D. E. AMOS, SAND83-0083, MAY, 1983. */
188
189/* COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT */
190/* AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983 */
191
192/* A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX */
193/* ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85- */
194/* 1018, MAY, 1985 */
195
196/* A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX */
197/* ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS. */
198/* MATH. SOFTWARE, 1986 */
199
200/* ***ROUTINES CALLED ZBINU,I1MACH,D1MACH */
201/* ***END PROLOGUE ZBESJ */
202
203/* COMPLEX CI,CSGN,CY,Z,ZN */
204 /* Parameter adjustments */
205 --cyi;
206 --cyr;
207
208 /* Function Body */
209
210/* ***FIRST EXECUTABLE STATEMENT ZBESJ */
211 *ierr = 0;
212 *nz = 0;
213 if (*fnu < 0.) {
214 *ierr = 1;
215 }
216 if (*kode < 1 || *kode > 2) {
217 *ierr = 1;
218 }
219 if (*n < 1) {
220 *ierr = 1;
221 }
222 if (*ierr != 0) {
223 return 0;
224 }
225/* ----------------------------------------------------------------------- */
226/* SET PARAMETERS RELATED TO MACHINE CONSTANTS. */
227/* TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18. */
228/* ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT. */
229/* EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND */
230/* EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR */
231/* UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE. */
232/* RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z. */
233/* DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG). */
234/* FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU. */
235/* ----------------------------------------------------------------------- */
236/* Computing MAX */
237 d__1 = d1mach_(&c__4);
238 tol = max(d__1,1e-18);
239 k1 = i1mach_(&c__15);
240 k2 = i1mach_(&c__16);
241 r1m5 = d1mach_(&c__5);
242/* Computing MIN */
243 i__1 = abs(k1), i__2 = abs(k2);
244 k = min(i__1,i__2);
245 elim = ((doublereal) ((real) k) * r1m5 - 3.) * 2.303;
246 k1 = i1mach_(&c__14) - 1;
247 aa = r1m5 * (doublereal) ((real) k1);
248 dig = min(aa,18.);
249 aa *= 2.303;
250/* Computing MAX */
251 d__1 = -aa;
252 alim = elim + max(d__1,-41.45);
253 rl = dig * 1.2 + 3.;
254 fnul = (dig - 3.) * 6. + 10.;
255/* ----------------------------------------------------------------------- */
256/* TEST FOR PROPER RANGE */
257/* ----------------------------------------------------------------------- */
258 az = myzabs_(zr, zi);
259 fn = *fnu + (doublereal) ((real) (*n - 1));
260 aa = .5 / tol;
261 bb = (doublereal) ((real) i1mach_(&c__9)) * .5;
262 aa = min(aa,bb);
263 if (az > aa) {
264 goto L260;
265 }
266 if (fn > aa) {
267 goto L260;
268 }
269 aa = sqrt(aa);
270 if (az > aa) {
271 *ierr = 3;
272 }
273 if (fn > aa) {
274 *ierr = 3;
275 }
276/* ----------------------------------------------------------------------- */
277/* CALCULATE CSGN=EXP(FNU*HPI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE */
278/* WHEN FNU IS LARGE */
279/* ----------------------------------------------------------------------- */
280 cii = 1.;
281 inu = (integer) ((real) (*fnu));
282 inuh = inu / 2;
283 ir = inu - (inuh << 1);
284 arg = (*fnu - (doublereal) ((real) (inu - ir))) * hpi;
285 csgnr = cos(arg);
286 csgni = sin(arg);
287 if (inuh % 2 == 0) {
288 goto L40;
289 }
290 csgnr = -csgnr;
291 csgni = -csgni;
292L40:
293/* ----------------------------------------------------------------------- */
294/* ZN IS IN THE RIGHT HALF PLANE */
295/* ----------------------------------------------------------------------- */
296 znr = *zi;
297 zni = -(*zr);
298 if (*zi >= 0.) {
299 goto L50;
300 }
301 znr = -znr;
302 zni = -zni;
303 csgni = -csgni;
304 cii = -cii;
305L50:
306 zbinu_(&znr, &zni, fnu, kode, n, &cyr[1], &cyi[1], nz, &rl, &fnul, &tol, &
307 elim, &alim);
308 if (*nz < 0) {
309 goto L130;
310 }
311 nl = *n - *nz;
312 if (nl == 0) {
313 return 0;
314 }
315 rtol = 1. / tol;
316 ascle = d1mach_(&c__1) * rtol * 1e3;
317 i__1 = nl;
318 for (i__ = 1; i__ <= i__1; ++i__) {
319/* STR = CYR(I)*CSGNR - CYI(I)*CSGNI */
320/* CYI(I) = CYR(I)*CSGNI + CYI(I)*CSGNR */
321/* CYR(I) = STR */
322 aa = cyr[i__];
323 bb = cyi[i__];
324 atol = 1.;
325/* Computing MAX */
326 d__1 = abs(aa), d__2 = abs(bb);
327 if (max(d__1,d__2) > ascle) {
328 goto L55;
329 }
330 aa *= rtol;
331 bb *= rtol;
332 atol = tol;
333L55:
334 str = aa * csgnr - bb * csgni;
335 sti = aa * csgni + bb * csgnr;
336 cyr[i__] = str * atol;
337 cyi[i__] = sti * atol;
338 str = -csgni * cii;
339 csgni = csgnr * cii;
340 csgnr = str;
341/* L60: */
342 }
343 return 0;
344L130:
345 if (*nz == -2) {
346 goto L140;
347 }
348 *nz = 0;
349 *ierr = 2;
350 return 0;
351L140:
352 *nz = 0;
353 *ierr = 5;
354 return 0;
355L260:
356 *nz = 0;
357 *ierr = 4;
358 return 0;
359} /* zbesj_ */
360
T arg(const TBCI__ cplx< T > &c)
Definition cplx.h:690
TBCI__ cplx< T > sin(const TBCI__ cplx< T > &z)
Definition cplx.h:776
NAMESPACE_END NAMESPACE_CSTD TBCI__ cplx< T > sqrt(const TBCI__ cplx< T > &z)
Definition cplx.h:751
TBCI__ cplx< T > cos(const TBCI__ cplx< T > &z)
Definition cplx.h:786
#define abs(x)
Definition f2c.h:178
#define min(a, b)
Definition f2c.h:180
#define max(a, b)
Definition f2c.h:181
#define doublereal
static long int c__1
#define integer
#define real
static long int c__9
doublereal myzabs_(const double *, const double *)
Definition zbesh.c:1945
static integer c__15
Definition zairy.c:17
static integer c__14
Definition zairy.c:20
static integer c__4
Definition zairy.c:16
static integer c__16
Definition zairy.c:18
static integer c__5
Definition zairy.c:19
static doublereal csgni
Definition zbesh.c:51
static doublereal csgnr
Definition zbesh.c:51
integer i1mach_(const integer *)
Definition zbesh.c:1206
int zbinu_(doublereal *zr, doublereal *zi, doublereal *fnu, integer *kode, integer *n, doublereal *cyr, doublereal *cyi, integer *nz, doublereal *rl, doublereal *fnul, doublereal *tol, doublereal *elim, doublereal *alim)
Definition zbesh.c:2621
static doublereal ascle
Definition zbesh.c:51
doublereal d1mach_(const integer *)
Definition zbesh.c:576
int zbesj_(doublereal *zr, doublereal *zi, doublereal *fnu, integer *kode, integer *n, doublereal *cyr, doublereal *cyi, integer *nz, integer *ierr)
Definition zbesj.c:24