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 
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 
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;
304 L40:
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;
338 L55:
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;
348 L120:
349  if (*nz == -2) {
350  goto L130;
351  }
352  *nz = 0;
353  *ierr = 2;
354  return 0;
355 L130:
356  *nz = 0;
357  *ierr = 5;
358  return 0;
359 L260:
360  *nz = 0;
361  *ierr = 4;
362  return 0;
363 } /* zbesi_ */
364 
static integer c__9
Definition: zbesi.c:21
int zbesi_(double *zr, double *zi, double *fnu, int *kode, int *n, double *cyr, double *cyi, int *nz, int *ierr)
Definition: zbesi.c:24
TBCI__ cplx< T > cos(const TBCI__ cplx< T > &z)
Definition: cplx.h:786
static integer c__1
Definition: zbesi.c:22
T max(const FS_Vector< dims, T > &fv)
Definition: fs_vector.h:594
static doublereal csgnr
Definition: zbesh.c:51
T arg(const TBCI__ cplx< T > &c)
Definition: cplx.h:690
doublereal myzabs_(const double *, const double *)
Definition: zbesh.c:1945
const double pi
Definition: constants.h:38
double sqrt(const int a)
Definition: basics.h:1216
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__14
Definition: zbesi.c:20
int integer
barf [ba:rf] 2.
Definition: f2c.h:27
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 integer c__15
Definition: zbesi.c:17
static doublereal csgni
Definition: zbesh.c:51
static integer c__4
Definition: zbesi.c:16
#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: zbesi.c:18
static integer c__5
Definition: zbesi.c:19