00001
00004
00005
00006
00007
00008
00009
00010
00011 #include "prototypes.h"
00012 #include "prototypes2.h"
00013
00014
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 int zexp_(const double*, const double*, double*, double*);
00025 int zacai_(double*, double*, double*, const integer*,
00026 integer*, integer*, double*, double*,
00027 integer*, double*, double*,
00028 double*, double*);
00029 int zbknu_(double*, double*, double*, const integer*,
00030 integer*, double*, double*,
00031 integer*, double*, double*, double*);
00032 int zsqrt_(const double*, const double*, double*, double*);
00033 doublereal myzabs_(const double*, const double*);
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 int zairy_ (const doublereal * zr, const doublereal * zi,
00044 const integer * id, const integer * kode,
00045 doublereal * air, doublereal * aii, integer * nz, integer * ierr)
00046 {
00047
00048
00049 static doublereal tth = .666666666666666667;
00050 static doublereal c1 = .35502805388781724;
00051 static doublereal c2 = .258819403792806799;
00052 static doublereal coef = .183776298473930683;
00053 static doublereal zeror = 0.;
00054 static doublereal zeroi = 0.;
00055 static doublereal coner = 1.;
00056 static doublereal conei = 0.;
00057
00058
00059 integer i__1, i__2;
00060 doublereal d__1;
00061
00062
00063
00064
00065 static doublereal sfac, alim, elim, alaz, csqi, atrm, ztai, csqr, ztar;
00066 static doublereal trm1i, trm2i, trm1r, trm2r;
00067 static integer k, iflag;
00068 static doublereal d1, d2;
00069 static integer k1;
00070 extern doublereal d1mach_(integer*);
00071 static integer k2;
00072 extern integer i1mach_(integer*);
00073 static doublereal aa, bb, ad, cc, ak, bk, ck, dk, az;
00074 static integer nn;
00075 static doublereal rl;
00076 static integer mr;
00077 static doublereal s1i, az3, s2i, s1r, s2r, z3i, z3r, dig, fid, cyi[1],
00078 r1m5, fnu, cyr[1], tol, sti, ptr, str;
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 *ierr = 0;
00210 *nz = 0;
00211 if (*id < 0 || *id > 1) {
00212 *ierr = 1;
00213 }
00214 if (*kode < 1 || *kode > 2) {
00215 *ierr = 1;
00216 }
00217 if (*ierr != 0) {
00218 return 0;
00219 }
00220 az = myzabs_(zr, zi);
00221
00222 d__1 = d1mach_(&c__4);
00223 tol = max(d__1,1e-18);
00224 fid = (doublereal) ((real) (*id));
00225 if (az > 1.) {
00226 goto L70;
00227 }
00228
00229
00230
00231 s1r = coner;
00232 s1i = conei;
00233 s2r = coner;
00234 s2i = conei;
00235 if (az < tol) {
00236 goto L170;
00237 }
00238 aa = az * az;
00239 if (aa < tol / az) {
00240 goto L40;
00241 }
00242 trm1r = coner;
00243 trm1i = conei;
00244 trm2r = coner;
00245 trm2i = conei;
00246 atrm = 1.;
00247 str = *zr * *zr - *zi * *zi;
00248 sti = *zr * *zi + *zi * *zr;
00249 z3r = str * *zr - sti * *zi;
00250 z3i = str * *zi + sti * *zr;
00251 az3 = az * aa;
00252 ak = fid + 2.;
00253 bk = 3. - fid - fid;
00254 ck = 4. - fid;
00255 dk = fid + 3. + fid;
00256 d1 = ak * dk;
00257 d2 = bk * ck;
00258 ad = min(d1,d2);
00259 ak = fid * 9. + 24.;
00260 bk = 30. - fid * 9.;
00261 for (k = 1; k <= 25; ++k) {
00262 str = (trm1r * z3r - trm1i * z3i) / d1;
00263 trm1i = (trm1r * z3i + trm1i * z3r) / d1;
00264 trm1r = str;
00265 s1r += trm1r;
00266 s1i += trm1i;
00267 str = (trm2r * z3r - trm2i * z3i) / d2;
00268 trm2i = (trm2r * z3i + trm2i * z3r) / d2;
00269 trm2r = str;
00270 s2r += trm2r;
00271 s2i += trm2i;
00272 atrm = atrm * az3 / ad;
00273 d1 += ak;
00274 d2 += bk;
00275 ad = min(d1,d2);
00276 if (atrm < tol * ad) {
00277 goto L40;
00278 }
00279 ak += 18.;
00280 bk += 18.;
00281
00282 }
00283 L40:
00284 if (*id == 1) {
00285 goto L50;
00286 }
00287 *air = s1r * c1 - c2 * (*zr * s2r - *zi * s2i);
00288 *aii = s1i * c1 - c2 * (*zr * s2i + *zi * s2r);
00289 if (*kode == 1) {
00290 return 0;
00291 }
00292 zsqrt_(zr, zi, &str, &sti);
00293 ztar = tth * (*zr * str - *zi * sti);
00294 ztai = tth * (*zr * sti + *zi * str);
00295 zexp_(&ztar, &ztai, &str, &sti);
00296 ptr = *air * str - *aii * sti;
00297 *aii = *air * sti + *aii * str;
00298 *air = ptr;
00299 return 0;
00300 L50:
00301 *air = -s2r * c2;
00302 *aii = -s2i * c2;
00303 if (az <= tol) {
00304 goto L60;
00305 }
00306 str = *zr * s1r - *zi * s1i;
00307 sti = *zr * s1i + *zi * s1r;
00308 cc = c1 / (fid + 1.);
00309 *air += cc * (str * *zr - sti * *zi);
00310 *aii += cc * (str * *zi + sti * *zr);
00311 L60:
00312 if (*kode == 1) {
00313 return 0;
00314 }
00315 zsqrt_(zr, zi, &str, &sti);
00316 ztar = tth * (*zr * str - *zi * sti);
00317 ztai = tth * (*zr * sti + *zi * str);
00318 zexp_(&ztar, &ztai, &str, &sti);
00319 ptr = str * *air - sti * *aii;
00320 *aii = str * *aii + sti * *air;
00321 *air = ptr;
00322 return 0;
00323
00324
00325
00326 L70:
00327 fnu = (fid + 1.) / 3.;
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338 k1 = i1mach_(&c__15);
00339 k2 = i1mach_(&c__16);
00340 r1m5 = d1mach_(&c__5);
00341
00342 i__1 = abs(k1), i__2 = abs(k2);
00343 k = min(i__1,i__2);
00344 elim = ((doublereal) ((real) k) * r1m5 - 3.) * 2.303;
00345 k1 = i1mach_(&c__14) - 1;
00346 aa = r1m5 * (doublereal) ((real) k1);
00347 dig = min(aa,18.);
00348 aa *= 2.303;
00349
00350 d__1 = -aa;
00351 alim = elim + max(d__1,-41.45);
00352 rl = dig * 1.2 + 3.;
00353 alaz = log(az);
00354
00355
00356
00357 aa = .5 / tol;
00358 bb = (doublereal) ((real) i1mach_(&c__9)) * .5;
00359 aa = min(aa,bb);
00360 aa = pow_dd(&aa, &tth);
00361 if (az > aa) {
00362 goto L260;
00363 }
00364 aa = sqrt(aa);
00365 if (az > aa) {
00366 *ierr = 3;
00367 }
00368 zsqrt_(zr, zi, &csqr, &csqi);
00369 ztar = tth * (*zr * csqr - *zi * csqi);
00370 ztai = tth * (*zr * csqi + *zi * csqr);
00371
00372
00373
00374 iflag = 0;
00375 sfac = 1.;
00376 ak = ztai;
00377 if (*zr >= 0.) {
00378 goto L80;
00379 }
00380 bk = ztar;
00381 ck = -abs(bk);
00382 ztar = ck;
00383 ztai = ak;
00384 L80:
00385 if (*zi != 0.) {
00386 goto L90;
00387 }
00388 if (*zr > 0.) {
00389 goto L90;
00390 }
00391 ztar = 0.;
00392 ztai = ak;
00393 L90:
00394 aa = ztar;
00395 if (aa >= 0. && *zr > 0.) {
00396 goto L110;
00397 }
00398 if (*kode == 2) {
00399 goto L100;
00400 }
00401
00402
00403
00404 if (aa > -alim) {
00405 goto L100;
00406 }
00407 aa = -aa + alaz * .25;
00408 iflag = 1;
00409 sfac = tol;
00410 if (aa > elim) {
00411 goto L270;
00412 }
00413 L100:
00414
00415
00416
00417 mr = 1;
00418 if (*zi < 0.) {
00419 mr = -1;
00420 }
00421 zacai_(&ztar, &ztai, &fnu, kode, &mr, &c__1, cyr, cyi, &nn, &rl, &tol,
00422 &elim, &alim);
00423 if (nn < 0) {
00424 goto L280;
00425 }
00426 *nz += nn;
00427 goto L130;
00428 L110:
00429 if (*kode == 2) {
00430 goto L120;
00431 }
00432
00433
00434
00435 if (aa < alim) {
00436 goto L120;
00437 }
00438 aa = -aa - alaz * .25;
00439 iflag = 2;
00440 sfac = 1. / tol;
00441 if (aa < -elim) {
00442 goto L210;
00443 }
00444 L120:
00445 zbknu_(&ztar, &ztai, &fnu, kode, &c__1, cyr, cyi, nz, &tol, &elim, &alim);
00446 L130:
00447 s1r = cyr[0] * coef;
00448 s1i = cyi[0] * coef;
00449 if (iflag != 0) {
00450 goto L150;
00451 }
00452 if (*id == 1) {
00453 goto L140;
00454 }
00455 *air = csqr * s1r - csqi * s1i;
00456 *aii = csqr * s1i + csqi * s1r;
00457 return 0;
00458 L140:
00459 *air = -(*zr * s1r - *zi * s1i);
00460 *aii = -(*zr * s1i + *zi * s1r);
00461 return 0;
00462 L150:
00463 s1r *= sfac;
00464 s1i *= sfac;
00465 if (*id == 1) {
00466 goto L160;
00467 }
00468 str = s1r * csqr - s1i * csqi;
00469 s1i = s1r * csqi + s1i * csqr;
00470 s1r = str;
00471 *air = s1r / sfac;
00472 *aii = s1i / sfac;
00473 return 0;
00474 L160:
00475 str = -(s1r * *zr - s1i * *zi);
00476 s1i = -(s1r * *zi + s1i * *zr);
00477 s1r = str;
00478 *air = s1r / sfac;
00479 *aii = s1i / sfac;
00480 return 0;
00481 L170:
00482 aa = d1mach_(&c__1) * 1e3;
00483 s1r = zeror;
00484 s1i = zeroi;
00485 if (*id == 1) {
00486 goto L190;
00487 }
00488 if (az <= aa) {
00489 goto L180;
00490 }
00491 s1r = c2 * *zr;
00492 s1i = c2 * *zi;
00493 L180:
00494 *air = c1 - s1r;
00495 *aii = -s1i;
00496 return 0;
00497 L190:
00498 *air = -c2;
00499 *aii = 0.;
00500 aa = sqrt(aa);
00501 if (az <= aa) {
00502 goto L200;
00503 }
00504 s1r = (*zr * *zr - *zi * *zi) * .5;
00505 s1i = *zr * *zi;
00506 L200:
00507 *air += c1 * s1r;
00508 *aii += c1 * s1i;
00509 return 0;
00510 L210:
00511 *nz = 1;
00512 *air = zeror;
00513 *aii = zeroi;
00514 return 0;
00515 L270:
00516 *nz = 0;
00517 *ierr = 2;
00518 return 0;
00519 L280:
00520 if (nn == -1) {
00521 goto L270;
00522 }
00523 *nz = 0;
00524 *ierr = 5;
00525 return 0;
00526 L260:
00527 *ierr = 4;
00528 *nz = 0;
00529 return 0;
00530 }
00531