123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510 |
- #include "slatec-internal.hpp"
- static integer const c__4 = 4;
- static integer const c__15 = 15;
- static integer const c__16 = 16;
- static integer const c__5 = 5;
- static integer const c__14 = 14;
- static integer const c__9 = 9;
- static integer const c__1 = 1;
- int zairy_(double *zr, double *zi, integer const *id,
- integer const *kode, double *air, double *aii, integer *nz, integer
- *ierr)
- {
-
- static double const tth = .666666666666666667;
- static double const c1 = .35502805388781724;
- static double const c2 = .258819403792806799;
- static double const coef = .183776298473930683;
- static double const zeror = 0.;
- static double const zeroi = 0.;
- static double const coner = 1.;
- static double const conei = 0.;
-
- integer i__1, i__2;
- double d__1;
-
- integer k;
- double d1, d2;
- integer k1, k2;
- double aa, bb, ad, cc, ak, bk, ck, dk, az;
- integer nn;
- double rl;
- integer mr;
- double s1i, az3, s2i, s1r, s2r, z3i, z3r, dig, fid, cyi[1], r1m5, fnu,
- cyr[1], tol, sti, ptr, str, sfac, alim, elim, alaz, csqi;
- double atrm, ztai, csqr, ztar;
- double trm1i, trm2i, trm1r, trm2r;
- integer iflag;
- *ierr = 0;
- *nz = 0;
- if (*id < 0 || *id > 1) {
- *ierr = 1;
- }
- if (*kode < 1 || *kode > 2) {
- *ierr = 1;
- }
- if (*ierr != 0) {
- return 0;
- }
- az = zabs_(zr, zi);
- d__1 = d1mach_(4);
- tol = max(d__1,1e-18);
- fid = (double) (*id);
- if (az > 1.) {
- goto L70;
- }
- s1r = coner;
- s1i = conei;
- s2r = coner;
- s2i = conei;
- if (az < tol) {
- goto L170;
- }
- aa = az * az;
- if (aa < tol / az) {
- goto L40;
- }
- trm1r = coner;
- trm1i = conei;
- trm2r = coner;
- trm2i = conei;
- atrm = 1.;
- str = *zr * *zr - *zi * *zi;
- sti = *zr * *zi + *zi * *zr;
- z3r = str * *zr - sti * *zi;
- z3i = str * *zi + sti * *zr;
- az3 = az * aa;
- ak = fid + 2.;
- bk = 3. - fid - fid;
- ck = 4. - fid;
- dk = fid + 3. + fid;
- d1 = ak * dk;
- d2 = bk * ck;
- ad = min(d1,d2);
- ak = fid * 9. + 24.;
- bk = 30. - fid * 9.;
- for (k = 1; k <= 25; ++k) {
- str = (trm1r * z3r - trm1i * z3i) / d1;
- trm1i = (trm1r * z3i + trm1i * z3r) / d1;
- trm1r = str;
- s1r += trm1r;
- s1i += trm1i;
- str = (trm2r * z3r - trm2i * z3i) / d2;
- trm2i = (trm2r * z3i + trm2i * z3r) / d2;
- trm2r = str;
- s2r += trm2r;
- s2i += trm2i;
- atrm = atrm * az3 / ad;
- d1 += ak;
- d2 += bk;
- ad = min(d1,d2);
- if (atrm < tol * ad) {
- goto L40;
- }
- ak += 18.;
- bk += 18.;
- }
- L40:
- if (*id == 1) {
- goto L50;
- }
- *air = s1r * c1 - c2 * (*zr * s2r - *zi * s2i);
- *aii = s1i * c1 - c2 * (*zr * s2i + *zi * s2r);
- if (*kode == 1) {
- return 0;
- }
- zsqrt_(zr, zi, &str, &sti);
- ztar = tth * (*zr * str - *zi * sti);
- ztai = tth * (*zr * sti + *zi * str);
- zexp_(&ztar, &ztai, &str, &sti);
- ptr = *air * str - *aii * sti;
- *aii = *air * sti + *aii * str;
- *air = ptr;
- return 0;
- L50:
- *air = -s2r * c2;
- *aii = -s2i * c2;
- if (az <= tol) {
- goto L60;
- }
- str = *zr * s1r - *zi * s1i;
- sti = *zr * s1i + *zi * s1r;
- cc = c1 / (fid + 1.);
- *air += cc * (str * *zr - sti * *zi);
- *aii += cc * (str * *zi + sti * *zr);
- L60:
- if (*kode == 1) {
- return 0;
- }
- zsqrt_(zr, zi, &str, &sti);
- ztar = tth * (*zr * str - *zi * sti);
- ztai = tth * (*zr * sti + *zi * str);
- zexp_(&ztar, &ztai, &str, &sti);
- ptr = str * *air - sti * *aii;
- *aii = str * *aii + sti * *air;
- *air = ptr;
- return 0;
- L70:
- fnu = (fid + 1.) / 3.;
- k1 = i1mach_(15);
- k2 = i1mach_(16);
- r1m5 = d1mach_(5);
- i__1 = abs(k1), i__2 = abs(k2);
- k = min(i__1,i__2);
- elim = (k * r1m5 - 3.) * 2.303;
- k1 = i1mach_(14) - 1;
- aa = r1m5 * k1;
- dig = min(aa,18.);
- aa *= 2.303;
- d__1 = -aa;
- alim = elim + max(d__1,-41.45);
- rl = dig * 1.2 + 3.;
- alaz = log(az);
- aa = .5 / tol;
- bb = i1mach_(9) * .5;
- aa = min(aa,bb);
- aa = f2c::pow_dd(&aa, &tth);
- if (az > aa) {
- goto L260;
- }
- aa = sqrt(aa);
- if (az > aa) {
- *ierr = 3;
- }
- zsqrt_(zr, zi, &csqr, &csqi);
- ztar = tth * (*zr * csqr - *zi * csqi);
- ztai = tth * (*zr * csqi + *zi * csqr);
- iflag = 0;
- sfac = 1.;
- ak = ztai;
- if (*zr >= 0.) {
- goto L80;
- }
- bk = ztar;
- ck = -abs(bk);
- ztar = ck;
- ztai = ak;
- L80:
- if (*zi != 0.) {
- goto L90;
- }
- if (*zr > 0.) {
- goto L90;
- }
- ztar = 0.;
- ztai = ak;
- L90:
- aa = ztar;
- if (aa >= 0. && *zr > 0.) {
- goto L110;
- }
- if (*kode == 2) {
- goto L100;
- }
- if (aa > -alim) {
- goto L100;
- }
- aa = -aa + alaz * .25;
- iflag = 1;
- sfac = tol;
- if (aa > elim) {
- goto L270;
- }
- L100:
- mr = 1;
- if (*zi < 0.) {
- mr = -1;
- }
- zacai_(&ztar, &ztai, &fnu, kode, &mr, &c__1, cyr, cyi, &nn, &rl, &tol, &
- elim, &alim);
- if (nn < 0) {
- goto L280;
- }
- *nz += nn;
- goto L130;
- L110:
- if (*kode == 2) {
- goto L120;
- }
- if (aa < alim) {
- goto L120;
- }
- aa = -aa - alaz * .25;
- iflag = 2;
- sfac = 1. / tol;
- if (aa < -elim) {
- goto L210;
- }
- L120:
- zbknu_(&ztar, &ztai, &fnu, kode, &c__1, cyr, cyi, nz, &tol, &elim, &alim);
- L130:
- s1r = cyr[0] * coef;
- s1i = cyi[0] * coef;
- if (iflag != 0) {
- goto L150;
- }
- if (*id == 1) {
- goto L140;
- }
- *air = csqr * s1r - csqi * s1i;
- *aii = csqr * s1i + csqi * s1r;
- return 0;
- L140:
- *air = -(*zr * s1r - *zi * s1i);
- *aii = -(*zr * s1i + *zi * s1r);
- return 0;
- L150:
- s1r *= sfac;
- s1i *= sfac;
- if (*id == 1) {
- goto L160;
- }
- str = s1r * csqr - s1i * csqi;
- s1i = s1r * csqi + s1i * csqr;
- s1r = str;
- *air = s1r / sfac;
- *aii = s1i / sfac;
- return 0;
- L160:
- str = -(s1r * *zr - s1i * *zi);
- s1i = -(s1r * *zi + s1i * *zr);
- s1r = str;
- *air = s1r / sfac;
- *aii = s1i / sfac;
- return 0;
- L170:
- aa = d1mach_(1) * 1e3;
- s1r = zeror;
- s1i = zeroi;
- if (*id == 1) {
- goto L190;
- }
- if (az <= aa) {
- goto L180;
- }
- s1r = c2 * *zr;
- s1i = c2 * *zi;
- L180:
- *air = c1 - s1r;
- *aii = -s1i;
- return 0;
- L190:
- *air = -c2;
- *aii = 0.;
- aa = sqrt(aa);
- if (az <= aa) {
- goto L200;
- }
- s1r = (*zr * *zr - *zi * *zi) * .5;
- s1i = *zr * *zi;
- L200:
- *air += c1 * s1r;
- *aii += c1 * s1i;
- return 0;
- L210:
- *nz = 1;
- *air = zeror;
- *aii = zeroi;
- return 0;
- L270:
- *nz = 0;
- *ierr = 2;
- return 0;
- L280:
- if (nn == -1) {
- goto L270;
- }
- *nz = 0;
- *ierr = 5;
- return 0;
- L260:
- *ierr = 4;
- *nz = 0;
- return 0;
- }
|