123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- #include "slatec-internal.hpp"
- int wofz_(double *xi, double *yi, double *u,
- double *v, logical *flag__)
- {
-
- double d__1, d__2;
-
- logical a, b;
- double c__, h__;
- integer i__, j, n;
- double x, y, h2 = 0., u1, v1, u2, v2, w1;
- integer nu;
- double rx, ry, sx, sy, tx, ty;
- integer np1, kapn;
- double xabs, yabs, daux, qrho, xaux, xsum, ysum, xabsq, xquad, yquad;
- *flag__ = FALSE_;
- xabs = abs(*xi);
- yabs = abs(*yi);
- x = xabs / (float)6.3;
- y = yabs / (float)4.4;
- if (xabs > 5e153 || yabs > 5e153) {
- goto L100;
- }
- d__1 = x;
- d__2 = y;
- qrho = d__1 * d__1 + d__2 * d__2;
- d__1 = xabs;
- xabsq = d__1 * d__1;
- d__1 = yabs;
- xquad = xabsq - d__1 * d__1;
- yquad = xabs * 2 * yabs;
- a = qrho < .085264;
- if (a) {
- qrho = (1 - y * (float).85) * sqrt(qrho);
- d__1 = qrho * 72 + 6;
- n = f2c::i_dnnt(&d__1);
- j = (n << 1) + 1;
- xsum = (float)1. / j;
- ysum = 0.;
- for (i__ = n; i__ >= 1; --i__) {
- j += -2;
- xaux = (xsum * xquad - ysum * yquad) / i__;
- ysum = (xsum * yquad + ysum * xquad) / i__;
- xsum = xaux + (float)1. / j;
- }
- u1 = (xsum * yabs + ysum * xabs) *
- -1.12837916709551257389615890312154517 + (float)1.;
- v1 = (xsum * xabs - ysum * yabs) *
- 1.12837916709551257389615890312154517;
- daux = exp(-xquad);
- u2 = daux * cos(yquad);
- v2 = -daux * sin(yquad);
- *u = u1 * u2 - v1 * v2;
- *v = u1 * v2 + v1 * u2;
- } else {
- if (qrho > (float)1.) {
- h__ = 0.;
- kapn = 0;
- qrho = sqrt(qrho);
- nu = (integer) (1442 / (qrho * 26 + 77) + 3);
- } else {
- qrho = (1 - y) * sqrt(1 - qrho);
- h__ = qrho * (float)1.88;
- h2 = h__ * 2;
- d__1 = qrho * 34 + 7;
- kapn = f2c::i_dnnt(&d__1);
- d__1 = qrho * 26 + 16;
- nu = f2c::i_dnnt(&d__1);
- }
- b = h__ > (float)0.;
- double qlambda = b ? f2c::pow_di(&h2, &kapn) : 0.;
- rx = (float)0.;
- ry = (float)0.;
- sx = (float)0.;
- sy = (float)0.;
- for (n = nu; n >= 0; --n) {
- np1 = n + 1;
- tx = yabs + h__ + np1 * rx;
- ty = xabs - np1 * ry;
- d__1 = tx;
- d__2 = ty;
- c__ = (float).5 / (d__1 * d__1 + d__2 * d__2);
- rx = c__ * tx;
- ry = c__ * ty;
- if (b && n <= kapn) {
- tx = qlambda + sx;
- sx = rx * tx - ry * sy;
- sy = ry * tx + rx * sy;
- qlambda /= h2;
- }
- }
- if (h__ == (float)0.) {
- *u = rx * 1.12837916709551257389615890312154517;
- *v = ry * 1.12837916709551257389615890312154517;
- } else {
- *u = sx * 1.12837916709551257389615890312154517;
- *v = sy * 1.12837916709551257389615890312154517;
- }
- if (yabs == (float)0.) {
- d__1 = xabs;
- *u = exp(-(d__1 * d__1));
- }
- }
- if (*yi < (float)0.) {
- if (a) {
- u2 *= 2;
- v2 *= 2;
- } else {
- xquad = -xquad;
- if (yquad > 3537118876014220. || xquad > 708.503061461606) {
- goto L100;
- }
- w1 = exp(xquad) * 2;
- u2 = w1 * cos(yquad);
- v2 = -w1 * sin(yquad);
- }
- *u = u2 - *u;
- *v = v2 - *v;
- if (*xi > (float)0.) {
- *v = -(*v);
- }
- } else {
- if (*xi < (float)0.) {
- *v = -(*v);
- }
- }
- return 0;
- L100:
- *flag__ = TRUE_;
- return 0;
- }
|