00001 00004 /* zbesj.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: zbesj.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 00024 /* Subroutine */ int zbesj_(doublereal *zr, doublereal *zi, doublereal *fnu, integer *kode, integer *n, doublereal *cyr, doublereal *cyi, integer *nz, integer *ierr) 00025 { 00026 /* Initialized data */ 00027 00028 static doublereal hpi = 1.57079632679489662; 00029 00030 /* System generated locals */ 00031 integer i__1, i__2; 00032 doublereal d__1, d__2; 00033 00034 /* Builtin functions */ 00035 double sqrt(double), cos(double), sin(double); 00036 00037 /* Local variables */ 00038 static doublereal alim, elim, atol; 00039 static integer inuh; 00040 static doublereal fnul, rtol; 00041 static integer i__, k; 00042 static doublereal ascle, csgni, csgnr; 00043 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); 00044 static integer k1; 00045 extern doublereal d1mach_(integer*); 00046 static integer k2; 00047 extern integer i1mach_(integer*); 00048 static doublereal aa, bb, fn; 00049 static integer nl; 00050 static doublereal az; 00051 static integer ir; 00052 static doublereal rl; 00053 extern doublereal myzabs_(doublereal*, doublereal*); 00054 static doublereal dig, cii, arg, r1m5; 00055 static integer inu; 00056 static doublereal tol, sti, zni, str, znr; 00057 00058 /* ***BEGIN PROLOGUE ZBESJ */ 00059 /* ***DATE WRITTEN 830501 (YYMMDD) */ 00060 /* ***REVISION DATE 890801 (YYMMDD) */ 00061 /* ***CATEGORY NO. B5K */ 00062 /* ***KEYWORDS J-BESSEL FUNCTION,BESSEL FUNCTION OF COMPLEX ARGUMENT, */ 00063 /* BESSEL FUNCTION OF FIRST KIND */ 00064 /* ***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES */ 00065 /* ***PURPOSE TO COMPUTE THE J-BESSEL FUNCTION OF A COMPLEX ARGUMENT */ 00066 /* ***DESCRIPTION */ 00067 00068 /* ***A DOUBLE PRECISION ROUTINE*** */ 00069 /* ON KODE=1, CBESJ COMPUTES AN N MEMBER SEQUENCE OF COMPLEX */ 00070 /* BESSEL FUNCTIONS CY(I)=J(FNU+I-1,Z) FOR REAL, NONNEGATIVE */ 00071 /* ORDERS FNU+I-1, I=1,...,N AND COMPLEX Z IN THE CUT PLANE */ 00072 /* -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESJ RETURNS THE SCALED */ 00073 /* FUNCTIONS */ 00074 00075 /* CY(I)=EXP(-ABS(Y))*J(FNU+I-1,Z) I = 1,...,N , Y=AIMAG(Z) */ 00076 00077 /* WHICH REMOVE THE EXPONENTIAL GROWTH IN BOTH THE UPPER AND */ 00078 /* LOWER HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION */ 00079 /* ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS */ 00080 /* (REF. 1). */ 00081 00082 /* INPUT ZR,ZI,FNU ARE DOUBLE PRECISION */ 00083 /* ZR,ZI - Z=CMPLX(ZR,ZI), -PI.LT.ARG(Z).LE.PI */ 00084 /* FNU - ORDER OF INITIAL J FUNCTION, FNU.GE.0.0D0 */ 00085 /* KODE - A PARAMETER TO INDICATE THE SCALING OPTION */ 00086 /* KODE= 1 RETURNS */ 00087 /* CY(I)=J(FNU+I-1,Z), I=1,...,N */ 00088 /* = 2 RETURNS */ 00089 /* CY(I)=J(FNU+I-1,Z)EXP(-ABS(Y)), I=1,...,N */ 00090 /* N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1 */ 00091 00092 /* OUTPUT CYR,CYI ARE DOUBLE PRECISION */ 00093 /* CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS */ 00094 /* CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE */ 00095 /* CY(I)=J(FNU+I-1,Z) OR */ 00096 /* CY(I)=J(FNU+I-1,Z)EXP(-ABS(Y)) I=1,...,N */ 00097 /* DEPENDING ON KODE, Y=AIMAG(Z). */ 00098 /* NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW, */ 00099 /* NZ= 0 , NORMAL RETURN */ 00100 /* NZ.GT.0 , LAST NZ COMPONENTS OF CY SET ZERO DUE */ 00101 /* TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0), */ 00102 /* I = N-NZ+1,...,N */ 00103 /* IERR - ERROR FLAG */ 00104 /* IERR=0, NORMAL RETURN - COMPUTATION COMPLETED */ 00105 /* IERR=1, INPUT ERROR - NO COMPUTATION */ 00106 /* IERR=2, OVERFLOW - NO COMPUTATION, AIMAG(Z) */ 00107 /* TOO LARGE ON KODE=1 */ 00108 /* IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE */ 00109 /* BUT LOSSES OF SIGNIFCANCE BY ARGUMENT */ 00110 /* REDUCTION PRODUCE LESS THAN HALF OF MACHINE */ 00111 /* ACCURACY */ 00112 /* IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA- */ 00113 /* TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI- */ 00114 /* CANCE BY ARGUMENT REDUCTION */ 00115 /* IERR=5, ERROR - NO COMPUTATION, */ 00116 /* ALGORITHM TERMINATION CONDITION NOT MET */ 00117 00118 /* ***LONG DESCRIPTION */ 00119 00120 /* THE COMPUTATION IS CARRIED OUT BY THE FORMULA */ 00121 00122 /* J(FNU,Z)=EXP( FNU*PI*I/2)*I(FNU,-I*Z) AIMAG(Z).GE.0.0 */ 00123 00124 /* J(FNU,Z)=EXP(-FNU*PI*I/2)*I(FNU, I*Z) AIMAG(Z).LT.0.0 */ 00125 00126 /* WHERE I**2 = -1 AND I(FNU,Z) IS THE I BESSEL FUNCTION. */ 00127 00128 /* FOR NEGATIVE ORDERS,THE FORMULA */ 00129 00130 /* J(-FNU,Z) = J(FNU,Z)*COS(PI*FNU) - Y(FNU,Z)*SIN(PI*FNU) */ 00131 00132 /* CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO INTEGERS, THE */ 00133 /* THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE POSITIVE */ 00134 /* INTEGER,THE MAGNITUDE OF J(-FNU,Z)=J(FNU,Z)*COS(PI*FNU) IS A */ 00135 /* LARGE NEGATIVE POWER OF TEN. BUT WHEN FNU IS NOT AN INTEGER, */ 00136 /* Y(FNU,Z) DOMINATES IN MAGNITUDE WITH A LARGE POSITIVE POWER OF */ 00137 /* TEN AND THE MOST THAT THE SECOND TERM CAN BE REDUCED IS BY */ 00138 /* UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, WIDE CHANGES CAN */ 00139 /* OCCUR WITHIN UNIT ROUNDOFF OF A LARGE INTEGER FOR FNU. HERE, */ 00140 /* LARGE MEANS FNU.GT.CABS(Z). */ 00141 00142 /* IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE- */ 00143 /* MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS */ 00144 /* LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. */ 00145 /* CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN */ 00146 /* LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG */ 00147 /* IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS */ 00148 /* DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION. */ 00149 /* IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS */ 00150 /* LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS */ 00151 /* MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE */ 00152 /* INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS */ 00153 /* RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3 */ 00154 /* ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION */ 00155 /* ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION */ 00156 /* ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN */ 00157 /* THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT */ 00158 /* TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS */ 00159 /* IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC. */ 00160 /* SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES. */ 00161 00162 /* THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX */ 00163 /* BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT */ 00164 /* ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE- */ 00165 /* SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE */ 00166 /* ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))), */ 00167 /* ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF */ 00168 /* CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY */ 00169 /* HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN */ 00170 /* ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY */ 00171 /* SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER */ 00172 /* THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K, */ 00173 /* 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS */ 00174 /* THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER */ 00175 /* COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY */ 00176 /* BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER */ 00177 /* COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE */ 00178 /* MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES, */ 00179 /* THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P, */ 00180 /* OR -PI/2+P. */ 00181 00182 /* ***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ */ 00183 /* AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF */ 00184 /* COMMERCE, 1955. */ 00185 00186 /* COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT */ 00187 /* BY D. E. AMOS, SAND83-0083, MAY, 1983. */ 00188 00189 /* COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT */ 00190 /* AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983 */ 00191 00192 /* A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX */ 00193 /* ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85- */ 00194 /* 1018, MAY, 1985 */ 00195 00196 /* A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX */ 00197 /* ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS. */ 00198 /* MATH. SOFTWARE, 1986 */ 00199 00200 /* ***ROUTINES CALLED ZBINU,I1MACH,D1MACH */ 00201 /* ***END PROLOGUE ZBESJ */ 00202 00203 /* COMPLEX CI,CSGN,CY,Z,ZN */ 00204 /* Parameter adjustments */ 00205 --cyi; 00206 --cyr; 00207 00208 /* Function Body */ 00209 00210 /* ***FIRST EXECUTABLE STATEMENT ZBESJ */ 00211 *ierr = 0; 00212 *nz = 0; 00213 if (*fnu < 0.) { 00214 *ierr = 1; 00215 } 00216 if (*kode < 1 || *kode > 2) { 00217 *ierr = 1; 00218 } 00219 if (*n < 1) { 00220 *ierr = 1; 00221 } 00222 if (*ierr != 0) { 00223 return 0; 00224 } 00225 /* ----------------------------------------------------------------------- */ 00226 /* SET PARAMETERS RELATED TO MACHINE CONSTANTS. */ 00227 /* TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18. */ 00228 /* ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT. */ 00229 /* EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND */ 00230 /* EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR */ 00231 /* UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE. */ 00232 /* RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z. */ 00233 /* DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG). */ 00234 /* FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU. */ 00235 /* ----------------------------------------------------------------------- */ 00236 /* Computing MAX */ 00237 d__1 = d1mach_(&c__4); 00238 tol = max(d__1,1e-18); 00239 k1 = i1mach_(&c__15); 00240 k2 = i1mach_(&c__16); 00241 r1m5 = d1mach_(&c__5); 00242 /* Computing MIN */ 00243 i__1 = abs(k1), i__2 = abs(k2); 00244 k = min(i__1,i__2); 00245 elim = ((doublereal) ((real) k) * r1m5 - 3.) * 2.303; 00246 k1 = i1mach_(&c__14) - 1; 00247 aa = r1m5 * (doublereal) ((real) k1); 00248 dig = min(aa,18.); 00249 aa *= 2.303; 00250 /* Computing MAX */ 00251 d__1 = -aa; 00252 alim = elim + max(d__1,-41.45); 00253 rl = dig * 1.2 + 3.; 00254 fnul = (dig - 3.) * 6. + 10.; 00255 /* ----------------------------------------------------------------------- */ 00256 /* TEST FOR PROPER RANGE */ 00257 /* ----------------------------------------------------------------------- */ 00258 az = myzabs_(zr, zi); 00259 fn = *fnu + (doublereal) ((real) (*n - 1)); 00260 aa = .5 / tol; 00261 bb = (doublereal) ((real) i1mach_(&c__9)) * .5; 00262 aa = min(aa,bb); 00263 if (az > aa) { 00264 goto L260; 00265 } 00266 if (fn > aa) { 00267 goto L260; 00268 } 00269 aa = sqrt(aa); 00270 if (az > aa) { 00271 *ierr = 3; 00272 } 00273 if (fn > aa) { 00274 *ierr = 3; 00275 } 00276 /* ----------------------------------------------------------------------- */ 00277 /* CALCULATE CSGN=EXP(FNU*HPI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE */ 00278 /* WHEN FNU IS LARGE */ 00279 /* ----------------------------------------------------------------------- */ 00280 cii = 1.; 00281 inu = (integer) ((real) (*fnu)); 00282 inuh = inu / 2; 00283 ir = inu - (inuh << 1); 00284 arg = (*fnu - (doublereal) ((real) (inu - ir))) * hpi; 00285 csgnr = cos(arg); 00286 csgni = sin(arg); 00287 if (inuh % 2 == 0) { 00288 goto L40; 00289 } 00290 csgnr = -csgnr; 00291 csgni = -csgni; 00292 L40: 00293 /* ----------------------------------------------------------------------- */ 00294 /* ZN IS IN THE RIGHT HALF PLANE */ 00295 /* ----------------------------------------------------------------------- */ 00296 znr = *zi; 00297 zni = -(*zr); 00298 if (*zi >= 0.) { 00299 goto L50; 00300 } 00301 znr = -znr; 00302 zni = -zni; 00303 csgni = -csgni; 00304 cii = -cii; 00305 L50: 00306 zbinu_(&znr, &zni, fnu, kode, n, &cyr[1], &cyi[1], nz, &rl, &fnul, &tol, & 00307 elim, &alim); 00308 if (*nz < 0) { 00309 goto L130; 00310 } 00311 nl = *n - *nz; 00312 if (nl == 0) { 00313 return 0; 00314 } 00315 rtol = 1. / tol; 00316 ascle = d1mach_(&c__1) * rtol * 1e3; 00317 i__1 = nl; 00318 for (i__ = 1; i__ <= i__1; ++i__) { 00319 /* STR = CYR(I)*CSGNR - CYI(I)*CSGNI */ 00320 /* CYI(I) = CYR(I)*CSGNI + CYI(I)*CSGNR */ 00321 /* CYR(I) = STR */ 00322 aa = cyr[i__]; 00323 bb = cyi[i__]; 00324 atol = 1.; 00325 /* Computing MAX */ 00326 d__1 = abs(aa), d__2 = abs(bb); 00327 if (max(d__1,d__2) > ascle) { 00328 goto L55; 00329 } 00330 aa *= rtol; 00331 bb *= rtol; 00332 atol = tol; 00333 L55: 00334 str = aa * csgnr - bb * csgni; 00335 sti = aa * csgni + bb * csgnr; 00336 cyr[i__] = str * atol; 00337 cyi[i__] = sti * atol; 00338 str = -csgni * cii; 00339 csgni = csgnr * cii; 00340 csgnr = str; 00341 /* L60: */ 00342 } 00343 return 0; 00344 L130: 00345 if (*nz == -2) { 00346 goto L140; 00347 } 00348 *nz = 0; 00349 *ierr = 2; 00350 return 0; 00351 L140: 00352 *nz = 0; 00353 *ierr = 5; 00354 return 0; 00355 L260: 00356 *nz = 0; 00357 *ierr = 4; 00358 return 0; 00359 } /* zbesj_ */ 00360
1.5.6