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 
16 static integer c__1 = 1;
17 static integer c__2 = 2;
18 static integer c__4 = 4;
19 static integer c__15 = 15;
20 static integer c__16 = 16;
21 static 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;
244 L60:
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;
272 L70:
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;
295 L75:
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;
309 L85:
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;
320 L90:
321  c1r = exr;
322  c1i = exi;
323  c2r = exr * ey;
324  c2i = -exi * ey;
325  goto L70;
326 L170:
327  *nz = 0;
328  return 0;
329 } /* zbesy_ */
330 
TBCI__ cplx< T > cos(const TBCI__ cplx< T > &z)
Definition: cplx.h:786
static integer c__1
Definition: zbesy.c:16
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
int zbesy_(double *zr, double *zi, double *fnu, int *kode, int *n, double *cyr, double *cyi, int *nz, double *wcyr, double *wcyi, int *ierr)
Definition: zbesy.c:23
T max(const FS_Vector< dims, T > &fv)
Definition: fs_vector.h:594
static doublereal ascle
Definition: zbesh.c:51
TBCI__ cplx< T > sin(const TBCI__ cplx< T > &z)
Definition: cplx.h:776
double doublereal
Definition: f2c.h:32
static integer c__2
Definition: zbesy.c:17
TBCI__ cplx< T > exp(const TBCI__ cplx< T > &z)
Definition: cplx.h:756
int integer
barf [ba:rf] 2.
Definition: f2c.h:27
static integer c__15
Definition: zbesy.c:19
static integer c__4
Definition: zbesy.c:18
#define abs(x)
Definition: f2c.h:178
float real
Definition: f2c.h:31
doublereal d1mach_(const integer *)
Definition: zbesh.c:576
#define min(a, b)
Definition: f2c.h:180
integer i1mach_(const integer *)
Definition: zbesh.c:1206
static integer c__16
Definition: zbesy.c:20
static integer c__5
Definition: zbesy.c:21