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