TBCI Numerical high perf. C++ Library 2.8.0
zbesy.c
Go to the documentation of this file.
1
4/* zbesy.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: zbesy.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__1 = 1;
17static integer c__2 = 2;
18static integer c__4 = 4;
19static integer c__15 = 15;
20static integer c__16 = 16;
21static integer c__5 = 5;
22
23/* Subroutine */ int zbesy_(doublereal *zr, doublereal *zi, doublereal *fnu, integer *kode, integer *n, doublereal *cyr, doublereal *cyi, integer *nz, doublereal *cwrkr, doublereal *cwrki, integer *ierr)
24{
25 /* System generated locals */
26 integer i__1, i__2;
27 doublereal d__1, d__2;
28
29 /* Builtin functions */
30 double cos(double), sin(double), exp(double);
31
32 /* Local variables */
33 static doublereal hcii, elim, atol, rtol;
34 static integer i__, k;
35 static doublereal ascle;
36 extern /* Subroutine */ int zbesh_ (doublereal* zr, doublereal* zi, doublereal* fnu,
37 integer* kode, integer* m, integer* n,
38 doublereal* cyr, doublereal* cyi,
39 integer* nz, integer* ierr);
40 extern doublereal d1mach_(integer*);
41 static integer k1, k2;
42 extern integer i1mach_(integer*);
43 static doublereal aa, bb, ey, c1i, c2i, c1r, c2r;
44 static integer nz1, nz2;
45 static doublereal exi;
46 static real r1m5;
47 static doublereal exr, sti, tay, tol, str;
48
49/* ***BEGIN PROLOGUE ZBESY */
50/* ***DATE WRITTEN 830501 (YYMMDD) */
51/* ***REVISION DATE 890801 (YYMMDD) */
52/* ***CATEGORY NO. B5K */
53/* ***KEYWORDS Y-BESSEL FUNCTION,BESSEL FUNCTION OF COMPLEX ARGUMENT, */
54/* BESSEL FUNCTION OF SECOND KIND */
55/* ***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES */
56/* ***PURPOSE TO COMPUTE THE Y-BESSEL FUNCTION OF A COMPLEX ARGUMENT */
57/* ***DESCRIPTION */
58
59/* ***A DOUBLE PRECISION ROUTINE*** */
60
61/* ON KODE=1, CBESY COMPUTES AN N MEMBER SEQUENCE OF COMPLEX */
62/* BESSEL FUNCTIONS CY(I)=Y(FNU+I-1,Z) FOR REAL, NONNEGATIVE */
63/* ORDERS FNU+I-1, I=1,...,N AND COMPLEX Z IN THE CUT PLANE */
64/* -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESY RETURNS THE SCALED */
65/* FUNCTIONS */
66
67/* CY(I)=EXP(-ABS(Y))*Y(FNU+I-1,Z) I = 1,...,N , Y=AIMAG(Z) */
68
69/* WHICH REMOVE THE EXPONENTIAL GROWTH IN BOTH THE UPPER AND */
70/* LOWER HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION */
71/* ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS */
72/* (REF. 1). */
73
74/* INPUT ZR,ZI,FNU ARE DOUBLE PRECISION */
75/* ZR,ZI - Z=CMPLX(ZR,ZI), Z.NE.CMPLX(0.0D0,0.0D0), */
76/* -PI.LT.ARG(Z).LE.PI */
77/* FNU - ORDER OF INITIAL Y FUNCTION, FNU.GE.0.0D0 */
78/* KODE - A PARAMETER TO INDICATE THE SCALING OPTION */
79/* KODE= 1 RETURNS */
80/* CY(I)=Y(FNU+I-1,Z), I=1,...,N */
81/* = 2 RETURNS */
82/* CY(I)=Y(FNU+I-1,Z)*EXP(-ABS(Y)), I=1,...,N */
83/* WHERE Y=AIMAG(Z) */
84/* N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1 */
85/* CWRKR, - DOUBLE PRECISION WORK VECTORS OF DIMENSION AT */
86/* CWRKI AT LEAST N */
87
88/* OUTPUT CYR,CYI ARE DOUBLE PRECISION */
89/* CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS */
90/* CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE */
91/* CY(I)=Y(FNU+I-1,Z) OR */
92/* CY(I)=Y(FNU+I-1,Z)*EXP(-ABS(Y)) I=1,...,N */
93/* DEPENDING ON KODE. */
94/* NZ - NZ=0 , A NORMAL RETURN */
95/* NZ.GT.0 , NZ COMPONENTS OF CY SET TO ZERO DUE TO */
96/* UNDERFLOW (GENERALLY ON KODE=2) */
97/* IERR - ERROR FLAG */
98/* IERR=0, NORMAL RETURN - COMPUTATION COMPLETED */
99/* IERR=1, INPUT ERROR - NO COMPUTATION */
100/* IERR=2, OVERFLOW - NO COMPUTATION, FNU IS */
101/* TOO LARGE OR CABS(Z) IS TOO SMALL OR BOTH */
102/* IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE */
103/* BUT LOSSES OF SIGNIFCANCE BY ARGUMENT */
104/* REDUCTION PRODUCE LESS THAN HALF OF MACHINE */
105/* ACCURACY */
106/* IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA- */
107/* TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI- */
108/* CANCE BY ARGUMENT REDUCTION */
109/* IERR=5, ERROR - NO COMPUTATION, */
110/* ALGORITHM TERMINATION CONDITION NOT MET */
111
112/* ***LONG DESCRIPTION */
113
114/* THE COMPUTATION IS CARRIED OUT BY THE FORMULA */
115
116/* Y(FNU,Z)=0.5*(H(1,FNU,Z)-H(2,FNU,Z))/I */
117
118/* WHERE I**2 = -1 AND THE HANKEL BESSEL FUNCTIONS H(1,FNU,Z) */
119/* AND H(2,FNU,Z) ARE CALCULATED IN CBESH. */
120
121/* FOR NEGATIVE ORDERS,THE FORMULA */
122
123/* Y(-FNU,Z) = Y(FNU,Z)*COS(PI*FNU) + J(FNU,Z)*SIN(PI*FNU) */
124
125/* CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO HALF ODD */
126/* INTEGERS THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE */
127/* POSITIVE HALF ODD INTEGER,THE MAGNITUDE OF Y(-FNU,Z)=J(FNU,Z)* */
128/* SIN(PI*FNU) IS A LARGE NEGATIVE POWER OF TEN. BUT WHEN FNU IS */
129/* NOT A HALF ODD INTEGER, Y(FNU,Z) DOMINATES IN MAGNITUDE WITH A */
130/* LARGE POSITIVE POWER OF TEN AND THE MOST THAT THE SECOND TERM */
131/* CAN BE REDUCED IS BY UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, */
132/* WIDE CHANGES CAN OCCUR WITHIN UNIT ROUNDOFF OF A LARGE HALF */
133/* ODD INTEGER. HERE, LARGE MEANS FNU.GT.CABS(Z). */
134
135/* IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE- */
136/* MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS */
137/* LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. */
138/* CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN */
139/* LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG */
140/* IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS */
141/* DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION. */
142/* IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS */
143/* LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS */
144/* MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE */
145/* INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS */
146/* RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3 */
147/* ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION */
148/* ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION */
149/* ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN */
150/* THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT */
151/* TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS */
152/* IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC. */
153/* SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES. */
154
155/* THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX */
156/* BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT */
157/* ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE- */
158/* SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE */
159/* ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))), */
160/* ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF */
161/* CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY */
162/* HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN */
163/* ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY */
164/* SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER */
165/* THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K, */
166/* 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS */
167/* THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER */
168/* COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY */
169/* BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER */
170/* COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE */
171/* MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES, */
172/* THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P, */
173/* OR -PI/2+P. */
174
175/* ***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ */
176/* AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF */
177/* COMMERCE, 1955. */
178
179/* COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT */
180/* BY D. E. AMOS, SAND83-0083, MAY, 1983. */
181
182/* COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT */
183/* AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983 */
184
185/* A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX */
186/* ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85- */
187/* 1018, MAY, 1985 */
188
189/* A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX */
190/* ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS. */
191/* MATH. SOFTWARE, 1986 */
192
193/* ***ROUTINES CALLED ZBESH,I1MACH,D1MACH */
194/* ***END PROLOGUE ZBESY */
195
196/* COMPLEX CWRK,CY,C1,C2,EX,HCI,Z,ZU,ZV */
197/* ***FIRST EXECUTABLE STATEMENT ZBESY */
198 /* Parameter adjustments */
199 --cwrki;
200 --cwrkr;
201 --cyi;
202 --cyr;
203
204 /* Function Body */
205 *ierr = 0;
206 *nz = 0;
207 if (*zr == 0. && *zi == 0.) {
208 *ierr = 1;
209 }
210 if (*fnu < 0.) {
211 *ierr = 1;
212 }
213 if (*kode < 1 || *kode > 2) {
214 *ierr = 1;
215 }
216 if (*n < 1) {
217 *ierr = 1;
218 }
219 if (*ierr != 0) {
220 return 0;
221 }
222 hcii = .5;
223 zbesh_(zr, zi, fnu, kode, &c__1, n, &cyr[1], &cyi[1], &nz1, ierr);
224 if (*ierr != 0 && *ierr != 3) {
225 goto L170;
226 }
227 zbesh_(zr, zi, fnu, kode, &c__2, n, &cwrkr[1], &cwrki[1], &nz2, ierr);
228 if (*ierr != 0 && *ierr != 3) {
229 goto L170;
230 }
231 *nz = min(nz1,nz2);
232 if (*kode == 2) {
233 goto L60;
234 }
235 i__1 = *n;
236 for (i__ = 1; i__ <= i__1; ++i__) {
237 str = cwrkr[i__] - cyr[i__];
238 sti = cwrki[i__] - cyi[i__];
239 cyr[i__] = -sti * hcii;
240 cyi[i__] = str * hcii;
241/* L50: */
242 }
243 return 0;
244L60:
245/* Computing MAX */
246 d__1 = d1mach_(&c__4);
247 tol = max(d__1,1e-18);
248 k1 = i1mach_(&c__15);
249 k2 = i1mach_(&c__16);
250/* Computing MIN */
251 i__1 = abs(k1), i__2 = abs(k2);
252 k = min(i__1,i__2);
253 r1m5 = d1mach_(&c__5);
254/* ----------------------------------------------------------------------- */
255/* ELIM IS THE APPROXIMATE EXPONENTIAL UNDER- AND OVERFLOW LIMIT */
256/* ----------------------------------------------------------------------- */
257 elim = ((doublereal) ((real) k) * r1m5 - 3.) * 2.303;
258 exr = cos(*zr);
259 exi = sin(*zr);
260 ey = 0.;
261 tay = (d__1 = *zi + *zi, abs(d__1));
262 if (tay < elim) {
263 ey = exp(-tay);
264 }
265 if (*zi < 0.) {
266 goto L90;
267 }
268 c1r = exr * ey;
269 c1i = exi * ey;
270 c2r = exr;
271 c2i = -exi;
272L70:
273 *nz = 0;
274 rtol = 1. / tol;
275 ascle = d1mach_(&c__1) * rtol * 1e3;
276 i__1 = *n;
277 for (i__ = 1; i__ <= i__1; ++i__) {
278/* STR = C1R*CYR(I) - C1I*CYI(I) */
279/* STI = C1R*CYI(I) + C1I*CYR(I) */
280/* STR = -STR + C2R*CWRKR(I) - C2I*CWRKI(I) */
281/* STI = -STI + C2R*CWRKI(I) + C2I*CWRKR(I) */
282/* CYR(I) = -STI*HCII */
283/* CYI(I) = STR*HCII */
284 aa = cwrkr[i__];
285 bb = cwrki[i__];
286 atol = 1.;
287/* Computing MAX */
288 d__1 = abs(aa), d__2 = abs(bb);
289 if (max(d__1,d__2) > ascle) {
290 goto L75;
291 }
292 aa *= rtol;
293 bb *= rtol;
294 atol = tol;
295L75:
296 str = (aa * c2r - bb * c2i) * atol;
297 sti = (aa * c2i + bb * c2r) * atol;
298 aa = cyr[i__];
299 bb = cyi[i__];
300 atol = 1.;
301/* Computing MAX */
302 d__1 = abs(aa), d__2 = abs(bb);
303 if (max(d__1,d__2) > ascle) {
304 goto L85;
305 }
306 aa *= rtol;
307 bb *= rtol;
308 atol = tol;
309L85:
310 str -= (aa * c1r - bb * c1i) * atol;
311 sti -= (aa * c1i + bb * c1r) * atol;
312 cyr[i__] = -sti * hcii;
313 cyi[i__] = str * hcii;
314 if (str == 0. && sti == 0. && ey == 0.) {
315 ++(*nz);
316 }
317/* L80: */
318 }
319 return 0;
320L90:
321 c1r = exr;
322 c1i = exi;
323 c2r = exr * ey;
324 c2i = -exi * ey;
325 goto L70;
326L170:
327 *nz = 0;
328 return 0;
329} /* zbesy_ */
330
static integer c__2
Definition TOMS404.C:24
TBCI__ cplx< T > exp(const TBCI__ cplx< T > &z)
Definition cplx.h:756
TBCI__ cplx< T > sin(const TBCI__ cplx< T > &z)
Definition cplx.h:776
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
int zbesh_(double *zr, double *zi, double *fnu, int *kode, int *m, int *n, double *cyr, double *cyi, int *nz, int *ierr)
Definition zbesh.c:132
static integer c__15
Definition zairy.c:17
static integer c__4
Definition zairy.c:16
static integer c__16
Definition zairy.c:18
static integer c__5
Definition zairy.c:19
integer i1mach_(const integer *)
Definition zbesh.c:1206
static doublereal ascle
Definition zbesh.c:51
doublereal d1mach_(const integer *)
Definition zbesh.c:576
int zbesy_(doublereal *zr, doublereal *zi, doublereal *fnu, integer *kode, integer *n, doublereal *cyr, doublereal *cyi, integer *nz, doublereal *cwrkr, doublereal *cwrki, integer *ierr)
Definition zbesy.c:23