TBCI Numerical high perf. C++ Library  2.8.0
zbesj.c
Go to the documentation of this file.
1 
4 /* zbesj.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: zbesj.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 zbesj_(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 hpi = 1.57079632679489662;
29 
30  /* System generated locals */
31  integer i__1, i__2;
32  doublereal d__1, d__2;
33 
34  /* Builtin functions */
35  double sqrt(double), cos(double), sin(double);
36 
37  /* Local variables */
38  static doublereal alim, elim, atol;
39  static integer inuh;
40  static doublereal 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;
49  static integer nl;
50  static doublereal az;
51  static integer ir;
52  static doublereal rl;
54  static doublereal dig, cii, arg, r1m5;
55  static integer inu;
56  static doublereal tol, sti, zni, str, znr;
57 
58 /* ***BEGIN PROLOGUE ZBESJ */
59 /* ***DATE WRITTEN 830501 (YYMMDD) */
60 /* ***REVISION DATE 890801 (YYMMDD) */
61 /* ***CATEGORY NO. B5K */
62 /* ***KEYWORDS J-BESSEL FUNCTION,BESSEL FUNCTION OF COMPLEX ARGUMENT, */
63 /* BESSEL FUNCTION OF FIRST KIND */
64 /* ***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES */
65 /* ***PURPOSE TO COMPUTE THE J-BESSEL FUNCTION OF A COMPLEX ARGUMENT */
66 /* ***DESCRIPTION */
67 
68 /* ***A DOUBLE PRECISION ROUTINE*** */
69 /* ON KODE=1, CBESJ COMPUTES AN N MEMBER SEQUENCE OF COMPLEX */
70 /* BESSEL FUNCTIONS CY(I)=J(FNU+I-1,Z) FOR REAL, NONNEGATIVE */
71 /* ORDERS FNU+I-1, I=1,...,N AND COMPLEX Z IN THE CUT PLANE */
72 /* -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESJ RETURNS THE SCALED */
73 /* FUNCTIONS */
74 
75 /* CY(I)=EXP(-ABS(Y))*J(FNU+I-1,Z) I = 1,...,N , Y=AIMAG(Z) */
76 
77 /* WHICH REMOVE THE EXPONENTIAL GROWTH IN BOTH THE UPPER AND */
78 /* LOWER HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION */
79 /* ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS */
80 /* (REF. 1). */
81 
82 /* INPUT ZR,ZI,FNU ARE DOUBLE PRECISION */
83 /* ZR,ZI - Z=CMPLX(ZR,ZI), -PI.LT.ARG(Z).LE.PI */
84 /* FNU - ORDER OF INITIAL J FUNCTION, FNU.GE.0.0D0 */
85 /* KODE - A PARAMETER TO INDICATE THE SCALING OPTION */
86 /* KODE= 1 RETURNS */
87 /* CY(I)=J(FNU+I-1,Z), I=1,...,N */
88 /* = 2 RETURNS */
89 /* CY(I)=J(FNU+I-1,Z)EXP(-ABS(Y)), I=1,...,N */
90 /* N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1 */
91 
92 /* OUTPUT CYR,CYI ARE DOUBLE PRECISION */
93 /* CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS */
94 /* CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE */
95 /* CY(I)=J(FNU+I-1,Z) OR */
96 /* CY(I)=J(FNU+I-1,Z)EXP(-ABS(Y)) I=1,...,N */
97 /* DEPENDING ON KODE, Y=AIMAG(Z). */
98 /* NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW, */
99 /* NZ= 0 , NORMAL RETURN */
100 /* NZ.GT.0 , LAST NZ COMPONENTS OF CY SET ZERO DUE */
101 /* TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0), */
102 /* I = N-NZ+1,...,N */
103 /* IERR - ERROR FLAG */
104 /* IERR=0, NORMAL RETURN - COMPUTATION COMPLETED */
105 /* IERR=1, INPUT ERROR - NO COMPUTATION */
106 /* IERR=2, OVERFLOW - NO COMPUTATION, AIMAG(Z) */
107 /* TOO LARGE ON KODE=1 */
108 /* IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE */
109 /* BUT LOSSES OF SIGNIFCANCE BY ARGUMENT */
110 /* REDUCTION PRODUCE LESS THAN HALF OF MACHINE */
111 /* ACCURACY */
112 /* IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA- */
113 /* TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI- */
114 /* CANCE BY ARGUMENT REDUCTION */
115 /* IERR=5, ERROR - NO COMPUTATION, */
116 /* ALGORITHM TERMINATION CONDITION NOT MET */
117 
118 /* ***LONG DESCRIPTION */
119 
120 /* THE COMPUTATION IS CARRIED OUT BY THE FORMULA */
121 
122 /* J(FNU,Z)=EXP( FNU*PI*I/2)*I(FNU,-I*Z) AIMAG(Z).GE.0.0 */
123 
124 /* J(FNU,Z)=EXP(-FNU*PI*I/2)*I(FNU, I*Z) AIMAG(Z).LT.0.0 */
125 
126 /* WHERE I**2 = -1 AND I(FNU,Z) IS THE I BESSEL FUNCTION. */
127 
128 /* FOR NEGATIVE ORDERS,THE FORMULA */
129 
130 /* J(-FNU,Z) = J(FNU,Z)*COS(PI*FNU) - Y(FNU,Z)*SIN(PI*FNU) */
131 
132 /* CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO INTEGERS, THE */
133 /* THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE POSITIVE */
134 /* INTEGER,THE MAGNITUDE OF J(-FNU,Z)=J(FNU,Z)*COS(PI*FNU) IS A */
135 /* LARGE NEGATIVE POWER OF TEN. BUT WHEN FNU IS NOT AN INTEGER, */
136 /* Y(FNU,Z) DOMINATES IN MAGNITUDE WITH A LARGE POSITIVE POWER OF */
137 /* TEN AND THE MOST THAT THE SECOND TERM CAN BE REDUCED IS BY */
138 /* UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, WIDE CHANGES CAN */
139 /* OCCUR WITHIN UNIT ROUNDOFF OF A LARGE INTEGER FOR FNU. HERE, */
140 /* LARGE MEANS FNU.GT.CABS(Z). */
141 
142 /* IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE- */
143 /* MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS */
144 /* LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. */
145 /* CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN */
146 /* LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG */
147 /* IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS */
148 /* DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION. */
149 /* IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS */
150 /* LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS */
151 /* MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE */
152 /* INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS */
153 /* RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3 */
154 /* ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION */
155 /* ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION */
156 /* ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN */
157 /* THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT */
158 /* TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS */
159 /* IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC. */
160 /* SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES. */
161 
162 /* THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX */
163 /* BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT */
164 /* ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE- */
165 /* SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE */
166 /* ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))), */
167 /* ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF */
168 /* CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY */
169 /* HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN */
170 /* ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY */
171 /* SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER */
172 /* THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K, */
173 /* 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS */
174 /* THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER */
175 /* COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY */
176 /* BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER */
177 /* COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE */
178 /* MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES, */
179 /* THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P, */
180 /* OR -PI/2+P. */
181 
182 /* ***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ */
183 /* AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF */
184 /* COMMERCE, 1955. */
185 
186 /* COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT */
187 /* BY D. E. AMOS, SAND83-0083, MAY, 1983. */
188 
189 /* COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT */
190 /* AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983 */
191 
192 /* A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX */
193 /* ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85- */
194 /* 1018, MAY, 1985 */
195 
196 /* A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX */
197 /* ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS. */
198 /* MATH. SOFTWARE, 1986 */
199 
200 /* ***ROUTINES CALLED ZBINU,I1MACH,D1MACH */
201 /* ***END PROLOGUE ZBESJ */
202 
203 /* COMPLEX CI,CSGN,CY,Z,ZN */
204  /* Parameter adjustments */
205  --cyi;
206  --cyr;
207 
208  /* Function Body */
209 
210 /* ***FIRST EXECUTABLE STATEMENT ZBESJ */
211  *ierr = 0;
212  *nz = 0;
213  if (*fnu < 0.) {
214  *ierr = 1;
215  }
216  if (*kode < 1 || *kode > 2) {
217  *ierr = 1;
218  }
219  if (*n < 1) {
220  *ierr = 1;
221  }
222  if (*ierr != 0) {
223  return 0;
224  }
225 /* ----------------------------------------------------------------------- */
226 /* SET PARAMETERS RELATED TO MACHINE CONSTANTS. */
227 /* TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18. */
228 /* ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT. */
229 /* EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND */
230 /* EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR */
231 /* UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE. */
232 /* RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z. */
233 /* DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG). */
234 /* FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU. */
235 /* ----------------------------------------------------------------------- */
236 /* Computing MAX */
237  d__1 = d1mach_(&c__4);
238  tol = max(d__1,1e-18);
239  k1 = i1mach_(&c__15);
240  k2 = i1mach_(&c__16);
241  r1m5 = d1mach_(&c__5);
242 /* Computing MIN */
243  i__1 = abs(k1), i__2 = abs(k2);
244  k = min(i__1,i__2);
245  elim = ((doublereal) ((real) k) * r1m5 - 3.) * 2.303;
246  k1 = i1mach_(&c__14) - 1;
247  aa = r1m5 * (doublereal) ((real) k1);
248  dig = min(aa,18.);
249  aa *= 2.303;
250 /* Computing MAX */
251  d__1 = -aa;
252  alim = elim + max(d__1,-41.45);
253  rl = dig * 1.2 + 3.;
254  fnul = (dig - 3.) * 6. + 10.;
255 /* ----------------------------------------------------------------------- */
256 /* TEST FOR PROPER RANGE */
257 /* ----------------------------------------------------------------------- */
258  az = myzabs_(zr, zi);
259  fn = *fnu + (doublereal) ((real) (*n - 1));
260  aa = .5 / tol;
261  bb = (doublereal) ((real) i1mach_(&c__9)) * .5;
262  aa = min(aa,bb);
263  if (az > aa) {
264  goto L260;
265  }
266  if (fn > aa) {
267  goto L260;
268  }
269  aa = sqrt(aa);
270  if (az > aa) {
271  *ierr = 3;
272  }
273  if (fn > aa) {
274  *ierr = 3;
275  }
276 /* ----------------------------------------------------------------------- */
277 /* CALCULATE CSGN=EXP(FNU*HPI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE */
278 /* WHEN FNU IS LARGE */
279 /* ----------------------------------------------------------------------- */
280  cii = 1.;
281  inu = (integer) ((real) (*fnu));
282  inuh = inu / 2;
283  ir = inu - (inuh << 1);
284  arg = (*fnu - (doublereal) ((real) (inu - ir))) * hpi;
285  csgnr = cos(arg);
286  csgni = sin(arg);
287  if (inuh % 2 == 0) {
288  goto L40;
289  }
290  csgnr = -csgnr;
291  csgni = -csgni;
292 L40:
293 /* ----------------------------------------------------------------------- */
294 /* ZN IS IN THE RIGHT HALF PLANE */
295 /* ----------------------------------------------------------------------- */
296  znr = *zi;
297  zni = -(*zr);
298  if (*zi >= 0.) {
299  goto L50;
300  }
301  znr = -znr;
302  zni = -zni;
303  csgni = -csgni;
304  cii = -cii;
305 L50:
306  zbinu_(&znr, &zni, fnu, kode, n, &cyr[1], &cyi[1], nz, &rl, &fnul, &tol, &
307  elim, &alim);
308  if (*nz < 0) {
309  goto L130;
310  }
311  nl = *n - *nz;
312  if (nl == 0) {
313  return 0;
314  }
315  rtol = 1. / tol;
316  ascle = d1mach_(&c__1) * rtol * 1e3;
317  i__1 = nl;
318  for (i__ = 1; i__ <= i__1; ++i__) {
319 /* STR = CYR(I)*CSGNR - CYI(I)*CSGNI */
320 /* CYI(I) = CYR(I)*CSGNI + CYI(I)*CSGNR */
321 /* CYR(I) = STR */
322  aa = cyr[i__];
323  bb = cyi[i__];
324  atol = 1.;
325 /* Computing MAX */
326  d__1 = abs(aa), d__2 = abs(bb);
327  if (max(d__1,d__2) > ascle) {
328  goto L55;
329  }
330  aa *= rtol;
331  bb *= rtol;
332  atol = tol;
333 L55:
334  str = aa * csgnr - bb * csgni;
335  sti = aa * csgni + bb * csgnr;
336  cyr[i__] = str * atol;
337  cyi[i__] = sti * atol;
338  str = -csgni * cii;
339  csgni = csgnr * cii;
340  csgnr = str;
341 /* L60: */
342  }
343  return 0;
344 L130:
345  if (*nz == -2) {
346  goto L140;
347  }
348  *nz = 0;
349  *ierr = 2;
350  return 0;
351 L140:
352  *nz = 0;
353  *ierr = 5;
354  return 0;
355 L260:
356  *nz = 0;
357  *ierr = 4;
358  return 0;
359 } /* zbesj_ */
360 
static integer c__4
Definition: zbesj.c:16
static integer c__1
Definition: zbesj.c:22
TBCI__ cplx< T > cos(const TBCI__ cplx< T > &z)
Definition: cplx.h:786
T max(const FS_Vector< dims, T > &fv)
Definition: fs_vector.h:594
static integer c__15
Definition: zbesj.c:17
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
int zbesj_(double *zr, double *zi, double *fnu, int *kode, int *n, double *cyr, double *cyi, int *nz, int *ierr)
Definition: zbesj.c:24
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
int integer
barf [ba:rf] 2.
Definition: f2c.h:27
static integer c__16
Definition: zbesj.c:18
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__14
Definition: zbesj.c:20
static integer c__5
Definition: zbesj.c:19
static doublereal csgni
Definition: zbesh.c:51
#define abs(x)
Definition: f2c.h:178
static integer c__9
Definition: zbesj.c:21
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