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 
16 static integer c__4 = 4;
17 static integer c__15 = 15;
18 static integer c__16 = 16;
19 static integer c__5 = 5;
20 static integer c__14 = 14;
21 static integer c__9 = 9;
22 static integer c__1 = 1;
23 static 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;
316 L50:
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  }
331 L60:
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 /* ----------------------------------------------------------------------- */
348 L70:
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 /* ----------------------------------------------------------------------- */
366 L80:
367  mr = 0;
368  if (*zr >= 0.) {
369  goto L90;
370  }
371  mr = 1;
372  if (*zi < 0.) {
373  mr = -1;
374  }
375 L90:
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;
383 L100:
384  if (*zr < 0.) {
385  goto L180;
386  }
387  return 0;
388 L180:
389  *nz = 0;
390  *ierr = 2;
391  return 0;
392 L200:
393  if (nw == -1) {
394  goto L180;
395  }
396  *nz = 0;
397  *ierr = 5;
398  return 0;
399 L260:
400  *nz = 0;
401  *ierr = 4;
402  return 0;
403 } /* zbesk_ */
404 
static integer c__14
Definition: zbesk.c:20
static integer c__2
Definition: zbesk.c:23
TBCI__ cplx< T > log(const TBCI__ cplx< T > &z)
Definition: cplx.h:771
int zbesk_(double *zr, double *zi, double *fnu, int *kode, int *n, double *cyr, double *cyi, int *nz, int *ierr)
Definition: zbesk.c:25
int zbknu_(double *, double *, double *, const integer *, integer *, double *, double *, integer *, double *, double *, double *)
static integer c__4
Definition: zbesk.c:16
T max(const FS_Vector< dims, T > &fv)
Definition: fs_vector.h:594
T arg(const TBCI__ cplx< T > &c)
Definition: cplx.h:690
doublereal myzabs_(const double *, const double *)
Definition: zbesh.c:1945
double sqrt(const int a)
Definition: basics.h:1216
static integer c__16
Definition: zbesk.c:18
static integer c__5
Definition: zbesk.c:19
static integer c__9
Definition: zbesk.c:21
double doublereal
Definition: f2c.h:32
int zacon_(double *, double *, double *, integer *, integer *, integer *, double *, double *, integer *, double *, double *, double *, double *, double *)
Definition: zbesh.c:2131
int integer
barf [ba:rf] 2.
Definition: f2c.h:27
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
static integer c__1
Definition: zbesk.c:22
#define abs(x)
Definition: f2c.h:178
float real
Definition: f2c.h:31
doublereal d1mach_(const integer *)
Definition: zbesh.c:576
int zbunk_(double *, double *, double *, integer *, integer *, integer *, double *, double *, integer *, double *, double *, double *)
Definition: zbesh.c:3736
#define min(a, b)
Definition: f2c.h:180
integer i1mach_(const integer *)
Definition: zbesh.c:1206
static integer c__15
Definition: zbesk.c:17