00001 00004 /* zbesk.f -- translated by f2c (version 19980516). 00005 You must link the resulting object file with the libraries: 00006 -lf2c -lm (in that order) 00007 */ 00008 00009 /* $Id: zbesk.c,v 1.2.2.3 2008/07/18 17:16:01 garloff Exp $ */ 00010 00011 #include "prototypes.h" 00012 #include "prototypes2.h" 00013 00014 /* Table of constant values */ 00015 00016 static integer c__4 = 4; 00017 static integer c__15 = 15; 00018 static integer c__16 = 16; 00019 static integer c__5 = 5; 00020 static integer c__14 = 14; 00021 static integer c__9 = 9; 00022 static integer c__1 = 1; 00023 static integer c__2 = 2; 00024 00025 /* Subroutine */ int zbesk_(doublereal *zr, doublereal *zi, doublereal *fnu, integer *kode, integer *n, doublereal *cyr, doublereal *cyi, integer *nz, integer *ierr) 00026 { 00027 /* System generated locals */ 00028 integer i__1, i__2; 00029 doublereal d__1; 00030 00031 /* Builtin functions */ 00032 double sqrt(double), log(double); 00033 00034 /* Local variables */ 00035 static doublereal alim, elim, fnul; 00036 static integer k; 00037 extern /* Subroutine */ int zacon_(double*, double*, double*, integer*, 00038 integer*, integer*, double*, double*, 00039 integer*, double*, double*, double*, 00040 double*, double*); 00041 extern /* Subroutine */ int zbknu_(double*, double*, double*, integer*, 00042 integer*, double*, double*, 00043 integer*, double*, double*, double*); 00044 extern /* Subroutine */ int zbunk_(double*, double*, double*, integer*, 00045 integer*, integer*, double*, double*, 00046 integer*, double*, double*, double*); 00047 static integer k1; 00048 extern doublereal d1mach_(integer*); 00049 static integer k2; 00050 extern /* Subroutine */ int zuoik_(double*, double*, double*, integer*, 00051 integer*, integer*, double*, double*, 00052 integer*, double*, double*, double*); 00053 extern integer i1mach_(integer*); 00054 static doublereal aa, bb, fn, az; 00055 static integer nn; 00056 static doublereal rl; 00057 static integer mr, nw; 00058 extern doublereal myzabs_(doublereal*, doublereal*); 00059 static doublereal dig, arg, aln, r1m5, ufl; 00060 static integer nuf; 00061 static doublereal tol; 00062 00063 /* ***BEGIN PROLOGUE ZBESK */ 00064 /* ***DATE WRITTEN 830501 (YYMMDD) */ 00065 /* ***REVISION DATE 890801 (YYMMDD) */ 00066 /* ***CATEGORY NO. B5K */ 00067 /* ***KEYWORDS K-BESSEL FUNCTION,COMPLEX BESSEL FUNCTION, */ 00068 /* MODIFIED BESSEL FUNCTION OF THE SECOND KIND, */ 00069 /* BESSEL FUNCTION OF THE THIRD KIND */ 00070 /* ***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES */ 00071 /* ***PURPOSE TO COMPUTE K-BESSEL FUNCTIONS OF COMPLEX ARGUMENT */ 00072 /* ***DESCRIPTION */ 00073 00074 /* ***A DOUBLE PRECISION ROUTINE*** */ 00075 00076 /* ON KODE=1, CBESK COMPUTES AN N MEMBER SEQUENCE OF COMPLEX */ 00077 /* BESSEL FUNCTIONS CY(J)=K(FNU+J-1,Z) FOR REAL, NONNEGATIVE */ 00078 /* ORDERS FNU+J-1, J=1,...,N AND COMPLEX Z.NE.CMPLX(0.0,0.0) */ 00079 /* IN THE CUT PLANE -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESK */ 00080 /* RETURNS THE SCALED K FUNCTIONS, */ 00081 00082 /* CY(J)=EXP(Z)*K(FNU+J-1,Z) , J=1,...,N, */ 00083 00084 /* WHICH REMOVE THE EXPONENTIAL BEHAVIOR IN BOTH THE LEFT AND */ 00085 /* RIGHT HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND */ 00086 /* NOTATION ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL */ 00087 /* FUNCTIONS (REF. 1). */ 00088 00089 /* INPUT ZR,ZI,FNU ARE DOUBLE PRECISION */ 00090 /* ZR,ZI - Z=CMPLX(ZR,ZI), Z.NE.CMPLX(0.0D0,0.0D0), */ 00091 /* -PI.LT.ARG(Z).LE.PI */ 00092 /* FNU - ORDER OF INITIAL K FUNCTION, FNU.GE.0.0D0 */ 00093 /* N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1 */ 00094 /* KODE - A PARAMETER TO INDICATE THE SCALING OPTION */ 00095 /* KODE= 1 RETURNS */ 00096 /* CY(I)=K(FNU+I-1,Z), I=1,...,N */ 00097 /* = 2 RETURNS */ 00098 /* CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N */ 00099 00100 /* OUTPUT CYR,CYI ARE DOUBLE PRECISION */ 00101 /* CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS */ 00102 /* CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE */ 00103 /* CY(I)=K(FNU+I-1,Z), I=1,...,N OR */ 00104 /* CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N */ 00105 /* DEPENDING ON KODE */ 00106 /* NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW. */ 00107 /* NZ= 0 , NORMAL RETURN */ 00108 /* NZ.GT.0 , FIRST NZ COMPONENTS OF CY SET TO ZERO DUE */ 00109 /* TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0), */ 00110 /* I=1,...,N WHEN X.GE.0.0. WHEN X.LT.0.0 */ 00111 /* NZ STATES ONLY THE NUMBER OF UNDERFLOWS */ 00112 /* IN THE SEQUENCE. */ 00113 00114 /* IERR - ERROR FLAG */ 00115 /* IERR=0, NORMAL RETURN - COMPUTATION COMPLETED */ 00116 /* IERR=1, INPUT ERROR - NO COMPUTATION */ 00117 /* IERR=2, OVERFLOW - NO COMPUTATION, FNU IS */ 00118 /* TOO LARGE OR CABS(Z) IS TOO SMALL OR BOTH */ 00119 /* IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE */ 00120 /* BUT LOSSES OF SIGNIFCANCE BY ARGUMENT */ 00121 /* REDUCTION PRODUCE LESS THAN HALF OF MACHINE */ 00122 /* ACCURACY */ 00123 /* IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA- */ 00124 /* TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI- */ 00125 /* CANCE BY ARGUMENT REDUCTION */ 00126 /* IERR=5, ERROR - NO COMPUTATION, */ 00127 /* ALGORITHM TERMINATION CONDITION NOT MET */ 00128 00129 /* ***LONG DESCRIPTION */ 00130 00131 /* EQUATIONS OF THE REFERENCE ARE IMPLEMENTED FOR SMALL ORDERS */ 00132 /* DNU AND DNU+1.0 IN THE RIGHT HALF PLANE X.GE.0.0. FORWARD */ 00133 /* RECURRENCE GENERATES HIGHER ORDERS. K IS CONTINUED TO THE LEFT */ 00134 /* HALF PLANE BY THE RELATION */ 00135 00136 /* K(FNU,Z*EXP(MP)) = EXP(-MP*FNU)*K(FNU,Z)-MP*I(FNU,Z) */ 00137 /* MP=MR*PI*I, MR=+1 OR -1, RE(Z).GT.0, I**2=-1 */ 00138 00139 /* WHERE I(FNU,Z) IS THE I BESSEL FUNCTION. */ 00140 00141 /* FOR LARGE ORDERS, FNU.GT.FNUL, THE K FUNCTION IS COMPUTED */ 00142 /* BY MEANS OF ITS UNIFORM ASYMPTOTIC EXPANSIONS. */ 00143 00144 /* FOR NEGATIVE ORDERS, THE FORMULA */ 00145 00146 /* K(-FNU,Z) = K(FNU,Z) */ 00147 00148 /* CAN BE USED. */ 00149 00150 /* CBESK ASSUMES THAT A SIGNIFICANT DIGIT SINH(X) FUNCTION IS */ 00151 /* AVAILABLE. */ 00152 00153 /* IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE- */ 00154 /* MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS */ 00155 /* LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. */ 00156 /* CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN */ 00157 /* LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG */ 00158 /* IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS */ 00159 /* DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION. */ 00160 /* IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS */ 00161 /* LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS */ 00162 /* MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE */ 00163 /* INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS */ 00164 /* RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3 */ 00165 /* ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION */ 00166 /* ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION */ 00167 /* ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN */ 00168 /* THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT */ 00169 /* TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS */ 00170 /* IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC. */ 00171 /* SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES. */ 00172 00173 /* THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX */ 00174 /* BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT */ 00175 /* ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE- */ 00176 /* SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE */ 00177 /* ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))), */ 00178 /* ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF */ 00179 /* CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY */ 00180 /* HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN */ 00181 /* ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY */ 00182 /* SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER */ 00183 /* THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K, */ 00184 /* 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS */ 00185 /* THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER */ 00186 /* COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY */ 00187 /* BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER */ 00188 /* COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE */ 00189 /* MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES, */ 00190 /* THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P, */ 00191 /* OR -PI/2+P. */ 00192 00193 /* ***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ */ 00194 /* AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF */ 00195 /* COMMERCE, 1955. */ 00196 00197 /* COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT */ 00198 /* BY D. E. AMOS, SAND83-0083, MAY, 1983. */ 00199 00200 /* COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT */ 00201 /* AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983. */ 00202 00203 /* A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX */ 00204 /* ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85- */ 00205 /* 1018, MAY, 1985 */ 00206 00207 /* A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX */ 00208 /* ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS. */ 00209 /* MATH. SOFTWARE, 1986 */ 00210 00211 /* ***ROUTINES CALLED ZACON,ZBKNU,ZBUNK,ZUOIK,myzabs,I1MACH,D1MACH */ 00212 /* ***END PROLOGUE ZBESK */ 00213 00214 /* COMPLEX CY,Z */ 00215 /* ***FIRST EXECUTABLE STATEMENT ZBESK */ 00216 /* Parameter adjustments */ 00217 --cyi; 00218 --cyr; 00219 00220 /* Function Body */ 00221 *ierr = 0; 00222 *nz = 0; 00223 if (*zi == (float)0. && *zr == (float)0.) { 00224 *ierr = 1; 00225 } 00226 if (*fnu < 0.) { 00227 *ierr = 1; 00228 } 00229 if (*kode < 1 || *kode > 2) { 00230 *ierr = 1; 00231 } 00232 if (*n < 1) { 00233 *ierr = 1; 00234 } 00235 if (*ierr != 0) { 00236 return 0; 00237 } 00238 nn = *n; 00239 /* ----------------------------------------------------------------------- */ 00240 /* SET PARAMETERS RELATED TO MACHINE CONSTANTS. */ 00241 /* TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18. */ 00242 /* ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT. */ 00243 /* EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND */ 00244 /* EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR */ 00245 /* UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE. */ 00246 /* RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z. */ 00247 /* DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG). */ 00248 /* FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU */ 00249 /* ----------------------------------------------------------------------- */ 00250 /* Computing MAX */ 00251 d__1 = d1mach_(&c__4); 00252 tol = max(d__1,1e-18); 00253 k1 = i1mach_(&c__15); 00254 k2 = i1mach_(&c__16); 00255 r1m5 = d1mach_(&c__5); 00256 /* Computing MIN */ 00257 i__1 = abs(k1), i__2 = abs(k2); 00258 k = min(i__1,i__2); 00259 elim = ((doublereal) ((real) k) * r1m5 - 3.) * 2.303; 00260 k1 = i1mach_(&c__14) - 1; 00261 aa = r1m5 * (doublereal) ((real) k1); 00262 dig = min(aa,18.); 00263 aa *= 2.303; 00264 /* Computing MAX */ 00265 d__1 = -aa; 00266 alim = elim + max(d__1,-41.45); 00267 fnul = (dig - 3.) * 6. + 10.; 00268 rl = dig * 1.2 + 3.; 00269 /* ----------------------------------------------------------------------------- */ 00270 /* TEST FOR PROPER RANGE */ 00271 /* ----------------------------------------------------------------------- */ 00272 az = myzabs_(zr, zi); 00273 fn = *fnu + (doublereal) ((real) (nn - 1)); 00274 aa = .5 / tol; 00275 bb = (doublereal) ((real) i1mach_(&c__9)) * .5; 00276 aa = min(aa,bb); 00277 if (az > aa) { 00278 goto L260; 00279 } 00280 if (fn > aa) { 00281 goto L260; 00282 } 00283 aa = sqrt(aa); 00284 if (az > aa) { 00285 *ierr = 3; 00286 } 00287 if (fn > aa) { 00288 *ierr = 3; 00289 } 00290 /* ----------------------------------------------------------------------- */ 00291 /* OVERFLOW TEST ON THE LAST MEMBER OF THE SEQUENCE */ 00292 /* ----------------------------------------------------------------------- */ 00293 /* UFL = DEXP(-ELIM) */ 00294 ufl = d1mach_(&c__1) * 1e3; 00295 if (az < ufl) { 00296 goto L180; 00297 } 00298 if (*fnu > fnul) { 00299 goto L80; 00300 } 00301 if (fn <= 1.) { 00302 goto L60; 00303 } 00304 if (fn > 2.) { 00305 goto L50; 00306 } 00307 if (az > tol) { 00308 goto L60; 00309 } 00310 arg = az * .5; 00311 aln = -fn * log(arg); 00312 if (aln > elim) { 00313 goto L180; 00314 } 00315 goto L60; 00316 L50: 00317 zuoik_(zr, zi, fnu, kode, &c__2, &nn, &cyr[1], &cyi[1], &nuf, &tol, &elim, 00318 &alim); 00319 if (nuf < 0) { 00320 goto L180; 00321 } 00322 *nz += nuf; 00323 nn -= nuf; 00324 /* ----------------------------------------------------------------------- */ 00325 /* HERE NN=N OR NN=0 SINCE NUF=0,NN, OR -1 ON RETURN FROM CUOIK */ 00326 /* IF NUF=NN, THEN CY(I)=CZERO FOR ALL I */ 00327 /* ----------------------------------------------------------------------- */ 00328 if (nn == 0) { 00329 goto L100; 00330 } 00331 L60: 00332 if (*zr < 0.) { 00333 goto L70; 00334 } 00335 /* ----------------------------------------------------------------------- */ 00336 /* RIGHT HALF PLANE COMPUTATION, REAL(Z).GE.0. */ 00337 /* ----------------------------------------------------------------------- */ 00338 zbknu_(zr, zi, fnu, kode, &nn, &cyr[1], &cyi[1], &nw, &tol, &elim, &alim); 00339 if (nw < 0) { 00340 goto L200; 00341 } 00342 *nz = nw; 00343 return 0; 00344 /* ----------------------------------------------------------------------- */ 00345 /* LEFT HALF PLANE COMPUTATION */ 00346 /* PI/2.LT.ARG(Z).LE.PI AND -PI.LT.ARG(Z).LT.-PI/2. */ 00347 /* ----------------------------------------------------------------------- */ 00348 L70: 00349 if (*nz != 0) { 00350 goto L180; 00351 } 00352 mr = 1; 00353 if (*zi < 0.) { 00354 mr = -1; 00355 } 00356 zacon_(zr, zi, fnu, kode, &mr, &nn, &cyr[1], &cyi[1], &nw, &rl, &fnul, & 00357 tol, &elim, &alim); 00358 if (nw < 0) { 00359 goto L200; 00360 } 00361 *nz = nw; 00362 return 0; 00363 /* ----------------------------------------------------------------------- */ 00364 /* UNIFORM ASYMPTOTIC EXPANSIONS FOR FNU.GT.FNUL */ 00365 /* ----------------------------------------------------------------------- */ 00366 L80: 00367 mr = 0; 00368 if (*zr >= 0.) { 00369 goto L90; 00370 } 00371 mr = 1; 00372 if (*zi < 0.) { 00373 mr = -1; 00374 } 00375 L90: 00376 zbunk_(zr, zi, fnu, kode, &mr, &nn, &cyr[1], &cyi[1], &nw, &tol, &elim, & 00377 alim); 00378 if (nw < 0) { 00379 goto L200; 00380 } 00381 *nz += nw; 00382 return 0; 00383 L100: 00384 if (*zr < 0.) { 00385 goto L180; 00386 } 00387 return 0; 00388 L180: 00389 *nz = 0; 00390 *ierr = 2; 00391 return 0; 00392 L200: 00393 if (nw == -1) { 00394 goto L180; 00395 } 00396 *nz = 0; 00397 *ierr = 5; 00398 return 0; 00399 L260: 00400 *nz = 0; 00401 *ierr = 4; 00402 return 0; 00403 } /* zbesk_ */ 00404
1.5.6