zuoik.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. /* zuoik.f -- translated by f2c (version 20100827).
  2. This file no longer depends on f2c.
  3. */
  4. #include "slatec-internal.hpp"
  5. /* Table of constant values */
  6. static integer const c__1 = 1;
  7. int zuoik_(double const *zr, double const *zi, double const *fnu,
  8. integer const *kode, integer const *ikflg, integer const *n, double *yr, double *yi,
  9. integer *nuf, double *tol, double *elim, double * alim)
  10. {
  11. /* Initialized data */
  12. static double const zeror = 0.;
  13. static double const zeroi = 0.;
  14. static double const aic = 1.265512123484645396;
  15. /* System generated locals */
  16. integer i__1;
  17. /* Local variables */
  18. integer i__;
  19. double ax, ay;
  20. integer nn, nw;
  21. double fnn, gnn, zbi, czi, gnu, zbr, czr, rcz, sti, zni, zri, str,
  22. znr, zrr, aarg, aphi, argi, phii, argr;
  23. integer idum;
  24. double phir;
  25. integer init;
  26. double sumi, sumr, ascle;
  27. integer iform;
  28. double asumi, bsumi, cwrki[16];
  29. double asumr, bsumr, cwrkr[16];
  30. double zeta1i, zeta2i, zeta1r, zeta2r;
  31. /* ***BEGIN PROLOGUE ZUOIK */
  32. /* ***SUBSIDIARY */
  33. /* ***PURPOSE Subsidiary to ZBESH, ZBESI and ZBESK */
  34. /* ***LIBRARY SLATEC */
  35. /* ***TYPE ALL (CUOIK-A, ZUOIK-A) */
  36. /* ***AUTHOR Amos, D. E., (SNL) */
  37. /* ***DESCRIPTION */
  38. /* ZUOIK COMPUTES THE LEADING TERMS OF THE UNIFORM ASYMPTOTIC */
  39. /* EXPANSIONS FOR THE I AND K FUNCTIONS AND COMPARES THEM */
  40. /* (IN LOGARITHMIC FORM) TO ALIM AND ELIM FOR OVER AND UNDERFLOW */
  41. /* WHERE ALIM.LT.ELIM. IF THE MAGNITUDE, BASED ON THE LEADING */
  42. /* EXPONENTIAL, IS LESS THAN ALIM OR GREATER THAN -ALIM, THEN */
  43. /* THE RESULT IS ON SCALE. IF NOT, THEN A REFINED TEST USING OTHER */
  44. /* MULTIPLIERS (IN LOGARITHMIC FORM) IS MADE BASED ON ELIM. HERE */
  45. /* EXP(-ELIM)=SMALLEST MACHINE NUMBER*1.0E+3 AND EXP(-ALIM)= */
  46. /* EXP(-ELIM)/TOL */
  47. /* IKFLG=1 MEANS THE I SEQUENCE IS TESTED */
  48. /* =2 MEANS THE K SEQUENCE IS TESTED */
  49. /* NUF = 0 MEANS THE LAST MEMBER OF THE SEQUENCE IS ON SCALE */
  50. /* =-1 MEANS AN OVERFLOW WOULD OCCUR */
  51. /* IKFLG=1 AND NUF.GT.0 MEANS THE LAST NUF Y VALUES WERE SET TO ZERO */
  52. /* THE FIRST N-NUF VALUES MUST BE SET BY ANOTHER ROUTINE */
  53. /* IKFLG=2 AND NUF.EQ.N MEANS ALL Y VALUES WERE SET TO ZERO */
  54. /* IKFLG=2 AND 0.LT.NUF.LT.N NOT CONSIDERED. Y MUST BE SET BY */
  55. /* ANOTHER ROUTINE */
  56. /* ***SEE ALSO ZBESH, ZBESI, ZBESK */
  57. /* ***ROUTINES CALLED D1MACH, ZABS, ZLOG, ZUCHK, ZUNHJ, ZUNIK */
  58. /* ***REVISION HISTORY (YYMMDD) */
  59. /* 830501 DATE WRITTEN */
  60. /* 910415 Prologue converted to Version 4.0 format. (BAB) */
  61. /* 930122 Added ZLOG to EXTERNAL statement. (RWC) */
  62. /* ***END PROLOGUE ZUOIK */
  63. /* COMPLEX ARG,ASUM,BSUM,CWRK,CZ,CZERO,PHI,SUM,Y,Z,ZB,ZETA1,ZETA2,ZN, */
  64. /* *ZR */
  65. /* Parameter adjustments */
  66. --yi;
  67. --yr;
  68. /* Function Body */
  69. /* ***FIRST EXECUTABLE STATEMENT ZUOIK */
  70. *nuf = 0;
  71. nn = *n;
  72. zrr = *zr;
  73. zri = *zi;
  74. if (*zr >= 0.) {
  75. goto L10;
  76. }
  77. zrr = -(*zr);
  78. zri = -(*zi);
  79. L10:
  80. zbr = zrr;
  81. zbi = zri;
  82. ax = abs(*zr) * 1.7321;
  83. ay = abs(*zi);
  84. iform = 1;
  85. if (ay > ax) {
  86. iform = 2;
  87. }
  88. gnu = max(*fnu,1.);
  89. if (*ikflg == 1) {
  90. goto L20;
  91. }
  92. fnn = (double) nn;
  93. gnn = *fnu + fnn - 1.;
  94. gnu = max(gnn,fnn);
  95. L20:
  96. /* ----------------------------------------------------------------------- */
  97. /* ONLY THE MAGNITUDE OF ARG AND PHI ARE NEEDED ALONG WITH THE */
  98. /* REAL PARTS OF ZETA1, ZETA2 AND ZB. NO ATTEMPT IS MADE TO GET */
  99. /* THE SIGN OF THE IMAGINARY PART CORRECT. */
  100. /* ----------------------------------------------------------------------- */
  101. if (iform == 2) {
  102. goto L30;
  103. }
  104. init = 0;
  105. zunik_(&zrr, &zri, &gnu, ikflg, &c__1, tol, &init, &phir, &phii, &zeta1r,
  106. &zeta1i, &zeta2r, &zeta2i, &sumr, &sumi, cwrkr, cwrki);
  107. czr = -zeta1r + zeta2r;
  108. czi = -zeta1i + zeta2i;
  109. goto L50;
  110. L30:
  111. znr = zri;
  112. zni = -zrr;
  113. if (*zi > 0.) {
  114. goto L40;
  115. }
  116. znr = -znr;
  117. L40:
  118. zunhj_(&znr, &zni, &gnu, &c__1, tol, &phir, &phii, &argr, &argi, &zeta1r,
  119. &zeta1i, &zeta2r, &zeta2i, &asumr, &asumi, &bsumr, &bsumi);
  120. czr = -zeta1r + zeta2r;
  121. czi = -zeta1i + zeta2i;
  122. aarg = zabs_(&argr, &argi);
  123. L50:
  124. if (*kode == 1) {
  125. goto L60;
  126. }
  127. czr -= zbr;
  128. czi -= zbi;
  129. L60:
  130. if (*ikflg == 1) {
  131. goto L70;
  132. }
  133. czr = -czr;
  134. czi = -czi;
  135. L70:
  136. aphi = zabs_(&phir, &phii);
  137. rcz = czr;
  138. /* ----------------------------------------------------------------------- */
  139. /* OVERFLOW TEST */
  140. /* ----------------------------------------------------------------------- */
  141. if (rcz > *elim) {
  142. goto L210;
  143. }
  144. if (rcz < *alim) {
  145. goto L80;
  146. }
  147. rcz += log(aphi);
  148. if (iform == 2) {
  149. rcz = rcz - log(aarg) * .25 - aic;
  150. }
  151. if (rcz > *elim) {
  152. goto L210;
  153. }
  154. goto L130;
  155. L80:
  156. /* ----------------------------------------------------------------------- */
  157. /* UNDERFLOW TEST */
  158. /* ----------------------------------------------------------------------- */
  159. if (rcz < -(*elim)) {
  160. goto L90;
  161. }
  162. if (rcz > -(*alim)) {
  163. goto L130;
  164. }
  165. rcz += log(aphi);
  166. if (iform == 2) {
  167. rcz = rcz - log(aarg) * .25 - aic;
  168. }
  169. if (rcz > -(*elim)) {
  170. goto L110;
  171. }
  172. L90:
  173. i__1 = nn;
  174. for (i__ = 1; i__ <= i__1; ++i__) {
  175. yr[i__] = zeror;
  176. yi[i__] = zeroi;
  177. /* L100: */
  178. }
  179. *nuf = nn;
  180. return 0;
  181. L110:
  182. ascle = d1mach_(1) * 1e3 / *tol;
  183. zlog_(&phir, &phii, &str, &sti, &idum);
  184. czr += str;
  185. czi += sti;
  186. if (iform == 1) {
  187. goto L120;
  188. }
  189. zlog_(&argr, &argi, &str, &sti, &idum);
  190. czr = czr - str * .25 - aic;
  191. czi -= sti * .25;
  192. L120:
  193. ax = exp(rcz) / *tol;
  194. ay = czi;
  195. czr = ax * cos(ay);
  196. czi = ax * sin(ay);
  197. zuchk_(&czr, &czi, &nw, &ascle, tol);
  198. if (nw != 0) {
  199. goto L90;
  200. }
  201. L130:
  202. if (*ikflg == 2) {
  203. return 0;
  204. }
  205. if (*n == 1) {
  206. return 0;
  207. }
  208. /* ----------------------------------------------------------------------- */
  209. /* SET UNDERFLOWS ON I SEQUENCE */
  210. /* ----------------------------------------------------------------------- */
  211. L140:
  212. gnu = *fnu + (nn - 1);
  213. if (iform == 2) {
  214. goto L150;
  215. }
  216. init = 0;
  217. zunik_(&zrr, &zri, &gnu, ikflg, &c__1, tol, &init, &phir, &phii, &zeta1r,
  218. &zeta1i, &zeta2r, &zeta2i, &sumr, &sumi, cwrkr, cwrki);
  219. czr = -zeta1r + zeta2r;
  220. czi = -zeta1i + zeta2i;
  221. goto L160;
  222. L150:
  223. zunhj_(&znr, &zni, &gnu, &c__1, tol, &phir, &phii, &argr, &argi, &zeta1r,
  224. &zeta1i, &zeta2r, &zeta2i, &asumr, &asumi, &bsumr, &bsumi);
  225. czr = -zeta1r + zeta2r;
  226. czi = -zeta1i + zeta2i;
  227. aarg = zabs_(&argr, &argi);
  228. L160:
  229. if (*kode == 1) {
  230. goto L170;
  231. }
  232. czr -= zbr;
  233. czi -= zbi;
  234. L170:
  235. aphi = zabs_(&phir, &phii);
  236. rcz = czr;
  237. if (rcz < -(*elim)) {
  238. goto L180;
  239. }
  240. if (rcz > -(*alim)) {
  241. return 0;
  242. }
  243. rcz += log(aphi);
  244. if (iform == 2) {
  245. rcz = rcz - log(aarg) * .25 - aic;
  246. }
  247. if (rcz > -(*elim)) {
  248. goto L190;
  249. }
  250. L180:
  251. yr[nn] = zeror;
  252. yi[nn] = zeroi;
  253. --nn;
  254. ++(*nuf);
  255. if (nn == 0) {
  256. return 0;
  257. }
  258. goto L140;
  259. L190:
  260. ascle = d1mach_(1) * 1e3 / *tol;
  261. zlog_(&phir, &phii, &str, &sti, &idum);
  262. czr += str;
  263. czi += sti;
  264. if (iform == 1) {
  265. goto L200;
  266. }
  267. zlog_(&argr, &argi, &str, &sti, &idum);
  268. czr = czr - str * .25 - aic;
  269. czi -= sti * .25;
  270. L200:
  271. ax = exp(rcz) / *tol;
  272. ay = czi;
  273. czr = ax * cos(ay);
  274. czi = ax * sin(ay);
  275. zuchk_(&czr, &czi, &nw, &ascle, tol);
  276. if (nw != 0) {
  277. goto L180;
  278. }
  279. return 0;
  280. L210:
  281. *nuf = -1;
  282. return 0;
  283. } /* zuoik_ */