123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 |
- #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;
- static integer const c__2 = 2;
- int zbesh_(double *zr, double *zi, double const *fnu,
- integer const *kode, integer const *m, integer const *n, double *cyr, double *
- cyi, integer *nz, integer *ierr)
- {
-
- static double const hpi = 1.57079632679489662;
-
- integer i__1, i__2;
- double d__1, d__2;
-
- integer i__, k, k1, k2;
- double aa, bb, fn;
- integer mm;
- double az;
- integer ir, nn;
- double rl;
- integer mr, nw;
- double dig, arg, aln, fmm, r1m5, ufl, sgn;
- integer nuf, inu;
- double tol, sti, zni, zti, str, znr, alim, elim;
- double atol, rhpi;
- integer inuh;
- double fnul, rtol, ascle, csgni;
- double csgnr;
-
- --cyi;
- --cyr;
-
- *ierr = 0;
- *nz = 0;
- if (*zr == 0. && *zi == 0.) {
- *ierr = 1;
- }
- if (*fnu < 0.) {
- *ierr = 1;
- }
- if (*m < 1 || *m > 2) {
- *ierr = 1;
- }
- if (*kode < 1 || *kode > 2) {
- *ierr = 1;
- }
- if (*n < 1) {
- *ierr = 1;
- }
- if (*ierr != 0) {
- return 0;
- }
- nn = *n;
- d__1 = d1mach_(4);
- tol = max(d__1,1e-18);
- 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);
- fnul = (dig - 3.) * 6. + 10.;
- rl = dig * 1.2 + 3.;
- fn = *fnu + (nn - 1);
- mm = 3 - *m - *m;
- fmm = (double) mm;
- znr = fmm * *zi;
- zni = -fmm * *zr;
- az = zabs_(zr, zi);
- aa = .5 / tol;
- bb = i1mach_(9) * .5;
- aa = min(aa,bb);
- if (az > aa) {
- goto L260;
- }
- if (fn > aa) {
- goto L260;
- }
- aa = sqrt(aa);
- if (az > aa) {
- *ierr = 3;
- }
- if (fn > aa) {
- *ierr = 3;
- }
- ufl = d1mach_(1) * 1e3;
- if (az < ufl) {
- goto L230;
- }
- if (*fnu > fnul) {
- goto L90;
- }
- if (fn <= 1.) {
- goto L70;
- }
- if (fn > 2.) {
- goto L60;
- }
- if (az > tol) {
- goto L70;
- }
- arg = az * .5;
- aln = -fn * log(arg);
- if (aln > elim) {
- goto L230;
- }
- goto L70;
- L60:
- zuoik_(&znr, &zni, fnu, kode, &c__2, &nn, &cyr[1], &cyi[1], &nuf, &tol, &
- elim, &alim);
- if (nuf < 0) {
- goto L230;
- }
- *nz += nuf;
- nn -= nuf;
- if (nn == 0) {
- goto L140;
- }
- L70:
- if (znr < 0. || znr == 0. && zni < 0. && *m == 2) {
- goto L80;
- }
- zbknu_(&znr, &zni, fnu, kode, &nn, &cyr[1], &cyi[1], nz, &tol, &elim, &
- alim);
- goto L110;
- L80:
- mr = -mm;
- zacon_(&znr, &zni, fnu, kode, &mr, &nn, &cyr[1], &cyi[1], &nw, &rl, &fnul,
- &tol, &elim, &alim);
- if (nw < 0) {
- goto L240;
- }
- *nz = nw;
- goto L110;
- L90:
- mr = 0;
- if (znr >= 0. && (znr != 0. || zni >= 0. || *m != 2)) {
- goto L100;
- }
- mr = -mm;
- if (znr != 0. || zni >= 0.) {
- goto L100;
- }
- znr = -znr;
- zni = -zni;
- L100:
- zbunk_(&znr, &zni, fnu, kode, &mr, &nn, &cyr[1], &cyi[1], &nw, &tol, &
- elim, &alim);
- if (nw < 0) {
- goto L240;
- }
- *nz += nw;
- L110:
- d__1 = -fmm;
- sgn = f2c::d_sign(&hpi, &d__1);
- inu = (integer) (*fnu);
- inuh = inu / 2;
- ir = inu - (inuh << 1);
- arg = (*fnu - (inu - ir)) * sgn;
- rhpi = 1. / sgn;
- csgni = rhpi * cos(arg);
- csgnr = -rhpi * sin(arg);
- if (inuh % 2 == 0) {
- goto L120;
- }
- csgnr = -csgnr;
- csgni = -csgni;
- L120:
- zti = -fmm;
- rtol = 1. / tol;
- ascle = ufl * rtol;
- i__1 = nn;
- for (i__ = 1; i__ <= i__1; ++i__) {
- aa = cyr[i__];
- bb = cyi[i__];
- atol = 1.;
- d__1 = abs(aa), d__2 = abs(bb);
- if (max(d__1,d__2) > ascle) {
- goto L135;
- }
- aa *= rtol;
- bb *= rtol;
- atol = tol;
- L135:
- str = aa * csgnr - bb * csgni;
- sti = aa * csgni + bb * csgnr;
- cyr[i__] = str * atol;
- cyi[i__] = sti * atol;
- str = -csgni * zti;
- csgni = csgnr * zti;
- csgnr = str;
- }
- return 0;
- L140:
- if (znr < 0.) {
- goto L230;
- }
- return 0;
- L230:
- *nz = 0;
- *ierr = 2;
- return 0;
- L240:
- if (nw == -1) {
- goto L230;
- }
- *nz = 0;
- *ierr = 5;
- return 0;
- L260:
- *nz = 0;
- *ierr = 4;
- return 0;
- }
|