TBCI Numerical high perf. C++ Library 2.8.0
zbesk.c
Go to the documentation of this file.
1
4/* zbesk.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: zbesk.c,v 1.2.2.5 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;
23static integer c__2 = 2;
24
25/* Subroutine */ int zbesk_(doublereal *zr, doublereal *zi, doublereal *fnu, integer *kode, integer *n, doublereal *cyr, doublereal *cyi, integer *nz, integer *ierr)
26{
27 /* System generated locals */
28 integer i__1, i__2;
29 doublereal d__1;
30
31 /* Builtin functions */
32 double sqrt(double), log(double);
33
34 /* Local variables */
35 static doublereal alim, elim, fnul;
36 static integer k;
37 extern /* Subroutine */ int zacon_(double*, double*, double*, integer*,
38 integer*, integer*, double*, double*,
39 integer*, double*, double*, double*,
40 double*, double*);
41 extern /* Subroutine */ int zbknu_(double*, double*, double*, integer*,
42 integer*, double*, double*,
43 integer*, double*, double*, double*);
44 extern /* Subroutine */ int zbunk_(double*, double*, double*, integer*,
45 integer*, integer*, double*, double*,
46 integer*, double*, double*, double*);
47 static integer k1;
48 extern doublereal d1mach_(integer*);
49 static integer k2;
50 extern /* Subroutine */ int zuoik_(double*, double*, double*, integer*,
51 integer*, integer*, double*, double*,
52 integer*, double*, double*, double*);
53 extern integer i1mach_(integer*);
54 static doublereal aa, bb, fn, az;
55 static integer nn;
56 static doublereal rl;
57 static integer mr, nw;
59 static doublereal dig, arg, aln, r1m5, ufl;
60 static integer nuf;
61 static doublereal tol;
62
63/* ***BEGIN PROLOGUE ZBESK */
64/* ***DATE WRITTEN 830501 (YYMMDD) */
65/* ***REVISION DATE 890801 (YYMMDD) */
66/* ***CATEGORY NO. B5K */
67/* ***KEYWORDS K-BESSEL FUNCTION,COMPLEX BESSEL FUNCTION, */
68/* MODIFIED BESSEL FUNCTION OF THE SECOND KIND, */
69/* BESSEL FUNCTION OF THE THIRD KIND */
70/* ***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES */
71/* ***PURPOSE TO COMPUTE K-BESSEL FUNCTIONS OF COMPLEX ARGUMENT */
72/* ***DESCRIPTION */
73
74/* ***A DOUBLE PRECISION ROUTINE*** */
75
76/* ON KODE=1, CBESK COMPUTES AN N MEMBER SEQUENCE OF COMPLEX */
77/* BESSEL FUNCTIONS CY(J)=K(FNU+J-1,Z) FOR REAL, NONNEGATIVE */
78/* ORDERS FNU+J-1, J=1,...,N AND COMPLEX Z.NE.CMPLX(0.0,0.0) */
79/* IN THE CUT PLANE -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESK */
80/* RETURNS THE SCALED K FUNCTIONS, */
81
82/* CY(J)=EXP(Z)*K(FNU+J-1,Z) , J=1,...,N, */
83
84/* WHICH REMOVE THE EXPONENTIAL BEHAVIOR IN BOTH THE LEFT AND */
85/* RIGHT HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND */
86/* NOTATION ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL */
87/* FUNCTIONS (REF. 1). */
88
89/* INPUT ZR,ZI,FNU ARE DOUBLE PRECISION */
90/* ZR,ZI - Z=CMPLX(ZR,ZI), Z.NE.CMPLX(0.0D0,0.0D0), */
91/* -PI.LT.ARG(Z).LE.PI */
92/* FNU - ORDER OF INITIAL K FUNCTION, FNU.GE.0.0D0 */
93/* N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1 */
94/* KODE - A PARAMETER TO INDICATE THE SCALING OPTION */
95/* KODE= 1 RETURNS */
96/* CY(I)=K(FNU+I-1,Z), I=1,...,N */
97/* = 2 RETURNS */
98/* CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N */
99
100/* OUTPUT CYR,CYI ARE DOUBLE PRECISION */
101/* CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS */
102/* CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE */
103/* CY(I)=K(FNU+I-1,Z), I=1,...,N OR */
104/* CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N */
105/* DEPENDING ON KODE */
106/* NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW. */
107/* NZ= 0 , NORMAL RETURN */
108/* NZ.GT.0 , FIRST NZ COMPONENTS OF CY SET TO ZERO DUE */
109/* TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0), */
110/* I=1,...,N WHEN X.GE.0.0. WHEN X.LT.0.0 */
111/* NZ STATES ONLY THE NUMBER OF UNDERFLOWS */
112/* IN THE SEQUENCE. */
113
114/* IERR - ERROR FLAG */
115/* IERR=0, NORMAL RETURN - COMPUTATION COMPLETED */
116/* IERR=1, INPUT ERROR - NO COMPUTATION */
117/* IERR=2, OVERFLOW - NO COMPUTATION, FNU IS */
118/* TOO LARGE OR CABS(Z) IS TOO SMALL OR BOTH */
119/* IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE */
120/* BUT LOSSES OF SIGNIFCANCE BY ARGUMENT */
121/* REDUCTION PRODUCE LESS THAN HALF OF MACHINE */
122/* ACCURACY */
123/* IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA- */
124/* TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI- */
125/* CANCE BY ARGUMENT REDUCTION */
126/* IERR=5, ERROR - NO COMPUTATION, */
127/* ALGORITHM TERMINATION CONDITION NOT MET */
128
129/* ***LONG DESCRIPTION */
130
131/* EQUATIONS OF THE REFERENCE ARE IMPLEMENTED FOR SMALL ORDERS */
132/* DNU AND DNU+1.0 IN THE RIGHT HALF PLANE X.GE.0.0. FORWARD */
133/* RECURRENCE GENERATES HIGHER ORDERS. K IS CONTINUED TO THE LEFT */
134/* HALF PLANE BY THE RELATION */
135
136/* K(FNU,Z*EXP(MP)) = EXP(-MP*FNU)*K(FNU,Z)-MP*I(FNU,Z) */
137/* MP=MR*PI*I, MR=+1 OR -1, RE(Z).GT.0, I**2=-1 */
138
139/* WHERE I(FNU,Z) IS THE I BESSEL FUNCTION. */
140
141/* FOR LARGE ORDERS, FNU.GT.FNUL, THE K FUNCTION IS COMPUTED */
142/* BY MEANS OF ITS UNIFORM ASYMPTOTIC EXPANSIONS. */
143
144/* FOR NEGATIVE ORDERS, THE FORMULA */
145
146/* K(-FNU,Z) = K(FNU,Z) */
147
148/* CAN BE USED. */
149
150/* CBESK ASSUMES THAT A SIGNIFICANT DIGIT SINH(X) FUNCTION IS */
151/* AVAILABLE. */
152
153/* IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE- */
154/* MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS */
155/* LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. */
156/* CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN */
157/* LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG */
158/* IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS */
159/* DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION. */
160/* IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS */
161/* LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS */
162/* MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE */
163/* INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS */
164/* RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3 */
165/* ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION */
166/* ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION */
167/* ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN */
168/* THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT */
169/* TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS */
170/* IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC. */
171/* SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES. */
172
173/* THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX */
174/* BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT */
175/* ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE- */
176/* SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE */
177/* ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))), */
178/* ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF */
179/* CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY */
180/* HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN */
181/* ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY */
182/* SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER */
183/* THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K, */
184/* 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS */
185/* THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER */
186/* COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY */
187/* BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER */
188/* COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE */
189/* MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES, */
190/* THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P, */
191/* OR -PI/2+P. */
192
193/* ***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ */
194/* AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF */
195/* COMMERCE, 1955. */
196
197/* COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT */
198/* BY D. E. AMOS, SAND83-0083, MAY, 1983. */
199
200/* COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT */
201/* AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983. */
202
203/* A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX */
204/* ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85- */
205/* 1018, MAY, 1985 */
206
207/* A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX */
208/* ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS. */
209/* MATH. SOFTWARE, 1986 */
210
211/* ***ROUTINES CALLED ZACON,ZBKNU,ZBUNK,ZUOIK,myzabs,I1MACH,D1MACH */
212/* ***END PROLOGUE ZBESK */
213
214/* COMPLEX CY,Z */
215/* ***FIRST EXECUTABLE STATEMENT ZBESK */
216 /* Parameter adjustments */
217 --cyi;
218 --cyr;
219
220 /* Function Body */
221 *ierr = 0;
222 *nz = 0;
223 if (*zi == (float)0. && *zr == (float)0.) {
224 *ierr = 1;
225 }
226 if (*fnu < 0.) {
227 *ierr = 1;
228 }
229 if (*kode < 1 || *kode > 2) {
230 *ierr = 1;
231 }
232 if (*n < 1) {
233 *ierr = 1;
234 }
235 if (*ierr != 0) {
236 return 0;
237 }
238 nn = *n;
239/* ----------------------------------------------------------------------- */
240/* SET PARAMETERS RELATED TO MACHINE CONSTANTS. */
241/* TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18. */
242/* ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT. */
243/* EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND */
244/* EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR */
245/* UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE. */
246/* RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z. */
247/* DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG). */
248/* FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU */
249/* ----------------------------------------------------------------------- */
250/* Computing MAX */
251 d__1 = d1mach_(&c__4);
252 tol = max(d__1,1e-18);
253 k1 = i1mach_(&c__15);
254 k2 = i1mach_(&c__16);
255 r1m5 = d1mach_(&c__5);
256/* Computing MIN */
257 i__1 = abs(k1), i__2 = abs(k2);
258 k = min(i__1,i__2);
259 elim = ((doublereal) ((real) k) * r1m5 - 3.) * 2.303;
260 k1 = i1mach_(&c__14) - 1;
261 aa = r1m5 * (doublereal) ((real) k1);
262 dig = min(aa,18.);
263 aa *= 2.303;
264/* Computing MAX */
265 d__1 = -aa;
266 alim = elim + max(d__1,-41.45);
267 fnul = (dig - 3.) * 6. + 10.;
268 rl = dig * 1.2 + 3.;
269/* ----------------------------------------------------------------------------- */
270/* TEST FOR PROPER RANGE */
271/* ----------------------------------------------------------------------- */
272 az = myzabs_(zr, zi);
273 fn = *fnu + (doublereal) ((real) (nn - 1));
274 aa = .5 / tol;
275 bb = (doublereal) ((real) i1mach_(&c__9)) * .5;
276 aa = min(aa,bb);
277 if (az > aa) {
278 goto L260;
279 }
280 if (fn > aa) {
281 goto L260;
282 }
283 aa = sqrt(aa);
284 if (az > aa) {
285 *ierr = 3;
286 }
287 if (fn > aa) {
288 *ierr = 3;
289 }
290/* ----------------------------------------------------------------------- */
291/* OVERFLOW TEST ON THE LAST MEMBER OF THE SEQUENCE */
292/* ----------------------------------------------------------------------- */
293/* UFL = DEXP(-ELIM) */
294 ufl = d1mach_(&c__1) * 1e3;
295 if (az < ufl) {
296 goto L180;
297 }
298 if (*fnu > fnul) {
299 goto L80;
300 }
301 if (fn <= 1.) {
302 goto L60;
303 }
304 if (fn > 2.) {
305 goto L50;
306 }
307 if (az > tol) {
308 goto L60;
309 }
310 arg = az * .5;
311 aln = -fn * log(arg);
312 if (aln > elim) {
313 goto L180;
314 }
315 goto L60;
316L50:
317 zuoik_(zr, zi, fnu, kode, &c__2, &nn, &cyr[1], &cyi[1], &nuf, &tol, &elim,
318 &alim);
319 if (nuf < 0) {
320 goto L180;
321 }
322 *nz += nuf;
323 nn -= nuf;
324/* ----------------------------------------------------------------------- */
325/* HERE NN=N OR NN=0 SINCE NUF=0,NN, OR -1 ON RETURN FROM CUOIK */
326/* IF NUF=NN, THEN CY(I)=CZERO FOR ALL I */
327/* ----------------------------------------------------------------------- */
328 if (nn == 0) {
329 goto L100;
330 }
331L60:
332 if (*zr < 0.) {
333 goto L70;
334 }
335/* ----------------------------------------------------------------------- */
336/* RIGHT HALF PLANE COMPUTATION, REAL(Z).GE.0. */
337/* ----------------------------------------------------------------------- */
338 zbknu_(zr, zi, fnu, kode, &nn, &cyr[1], &cyi[1], &nw, &tol, &elim, &alim);
339 if (nw < 0) {
340 goto L200;
341 }
342 *nz = nw;
343 return 0;
344/* ----------------------------------------------------------------------- */
345/* LEFT HALF PLANE COMPUTATION */
346/* PI/2.LT.ARG(Z).LE.PI AND -PI.LT.ARG(Z).LT.-PI/2. */
347/* ----------------------------------------------------------------------- */
348L70:
349 if (*nz != 0) {
350 goto L180;
351 }
352 mr = 1;
353 if (*zi < 0.) {
354 mr = -1;
355 }
356 zacon_(zr, zi, fnu, kode, &mr, &nn, &cyr[1], &cyi[1], &nw, &rl, &fnul, &
357 tol, &elim, &alim);
358 if (nw < 0) {
359 goto L200;
360 }
361 *nz = nw;
362 return 0;
363/* ----------------------------------------------------------------------- */
364/* UNIFORM ASYMPTOTIC EXPANSIONS FOR FNU.GT.FNUL */
365/* ----------------------------------------------------------------------- */
366L80:
367 mr = 0;
368 if (*zr >= 0.) {
369 goto L90;
370 }
371 mr = 1;
372 if (*zi < 0.) {
373 mr = -1;
374 }
375L90:
376 zbunk_(zr, zi, fnu, kode, &mr, &nn, &cyr[1], &cyi[1], &nw, &tol, &elim, &
377 alim);
378 if (nw < 0) {
379 goto L200;
380 }
381 *nz += nw;
382 return 0;
383L100:
384 if (*zr < 0.) {
385 goto L180;
386 }
387 return 0;
388L180:
389 *nz = 0;
390 *ierr = 2;
391 return 0;
392L200:
393 if (nw == -1) {
394 goto L180;
395 }
396 *nz = 0;
397 *ierr = 5;
398 return 0;
399L260:
400 *nz = 0;
401 *ierr = 4;
402 return 0;
403} /* zbesk_ */
404
static integer c__2
Definition TOMS404.C:24
T arg(const TBCI__ cplx< T > &c)
Definition cplx.h:690
TBCI__ cplx< T > log(const TBCI__ cplx< T > &z)
Definition cplx.h:771
NAMESPACE_END NAMESPACE_CSTD TBCI__ cplx< T > sqrt(const TBCI__ cplx< T > &z)
Definition cplx.h:751
#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
int zbknu_(double *, double *, double *, const integer *, integer *, double *, double *, integer *, double *, double *, double *)
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
int zuoik_(doublereal *zr, doublereal *zi, doublereal *fnu, integer *kode, integer *ikflg, integer *n, doublereal *yr, doublereal *yi, integer *nuf, doublereal *tol, doublereal *elim, doublereal *alim)
Definition zbesh.c:7759
int zbunk_(double *, double *, double *, integer *, integer *, integer *, double *, double *, integer *, double *, double *, double *)
Definition zbesh.c:3736
integer i1mach_(const integer *)
Definition zbesh.c:1206
int zacon_(double *, double *, double *, integer *, integer *, integer *, double *, double *, integer *, double *, double *, double *, double *, double *)
Definition zbesh.c:2131
doublereal d1mach_(const integer *)
Definition zbesh.c:576
int zbesk_(doublereal *zr, doublereal *zi, doublereal *fnu, integer *kode, integer *n, doublereal *cyr, doublereal *cyi, integer *nz, integer *ierr)
Definition zbesk.c:25