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