zuni1.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. /* zuni1.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. static integer const c__0 = 0;
  8. static integer const c__2 = 2;
  9. int zuni1_(double *zr, double *zi, double const *fnu,
  10. integer const *kode, integer const *n, double *yr, double *yi, integer *
  11. nz, integer *nlast, double *fnul, double *tol, double *
  12. elim, double *alim)
  13. {
  14. /* Initialized data */
  15. static double const zeror = 0.;
  16. static double const zeroi = 0.;
  17. static double const coner = 1.;
  18. /* System generated locals */
  19. integer i__1;
  20. /* Local variables */
  21. integer i__, k, m, nd;
  22. double fn;
  23. integer nn, nw;
  24. double c2i, c2m, c1r, c2r, s1i, s2i, rs1, s1r, s2r, cyi[2];
  25. integer nuf;
  26. double bry[3], cyr[2], sti, rzi, str, rzr, aphi, cscl, phii, crsc;
  27. double phir;
  28. integer init;
  29. double csrr[3], cssr[3], rast, sumi, sumr;
  30. integer iflag = 0;
  31. double ascle, cwrki[16];
  32. double cwrkr[16];
  33. double zeta1i, zeta2i, zeta1r, zeta2r;
  34. /* ***BEGIN PROLOGUE ZUNI1 */
  35. /* ***SUBSIDIARY */
  36. /* ***PURPOSE Subsidiary to ZBESI and ZBESK */
  37. /* ***LIBRARY SLATEC */
  38. /* ***TYPE ALL (CUNI1-A, ZUNI1-A) */
  39. /* ***AUTHOR Amos, D. E., (SNL) */
  40. /* ***DESCRIPTION */
  41. /* ZUNI1 COMPUTES I(FNU,Z) BY MEANS OF THE UNIFORM ASYMPTOTIC */
  42. /* EXPANSION FOR I(FNU,Z) IN -PI/3.LE.ARG Z.LE.PI/3. */
  43. /* FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC */
  44. /* EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET. */
  45. /* NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER */
  46. /* FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL. */
  47. /* Y(I)=CZERO FOR I=NLAST+1,N */
  48. /* ***SEE ALSO ZBESI, ZBESK */
  49. /* ***ROUTINES CALLED D1MACH, ZABS, ZUCHK, ZUNIK, ZUOIK */
  50. /* ***REVISION HISTORY (YYMMDD) */
  51. /* 830501 DATE WRITTEN */
  52. /* 910415 Prologue converted to Version 4.0 format. (BAB) */
  53. /* ***END PROLOGUE ZUNI1 */
  54. /* COMPLEX CFN,CONE,CRSC,CSCL,CSR,CSS,CWRK,CZERO,C1,C2,PHI,RZ,SUM,S1, */
  55. /* *S2,Y,Z,ZETA1,ZETA2 */
  56. /* Parameter adjustments */
  57. --yi;
  58. --yr;
  59. /* Function Body */
  60. /* ***FIRST EXECUTABLE STATEMENT ZUNI1 */
  61. *nz = 0;
  62. nd = *n;
  63. *nlast = 0;
  64. /* ----------------------------------------------------------------------- */
  65. /* COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG- */
  66. /* NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE, */
  67. /* EXP(ALIM)=EXP(ELIM)*TOL */
  68. /* ----------------------------------------------------------------------- */
  69. cscl = 1. / *tol;
  70. crsc = *tol;
  71. cssr[0] = cscl;
  72. cssr[1] = coner;
  73. cssr[2] = crsc;
  74. csrr[0] = crsc;
  75. csrr[1] = coner;
  76. csrr[2] = cscl;
  77. bry[0] = d1mach_(1) * 1e3 / *tol;
  78. /* ----------------------------------------------------------------------- */
  79. /* CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER */
  80. /* ----------------------------------------------------------------------- */
  81. fn = max(*fnu,1.);
  82. init = 0;
  83. zunik_(zr, zi, &fn, &c__1, &c__1, tol, &init, &phir, &phii, &zeta1r, &
  84. zeta1i, &zeta2r, &zeta2i, &sumr, &sumi, cwrkr, cwrki);
  85. if (*kode == 1) {
  86. goto L10;
  87. }
  88. str = *zr + zeta2r;
  89. sti = *zi + zeta2i;
  90. rast = fn / zabs_(&str, &sti);
  91. str = str * rast * rast;
  92. sti = -sti * rast * rast;
  93. s1r = -zeta1r + str;
  94. s1i = -zeta1i + sti;
  95. goto L20;
  96. L10:
  97. s1r = -zeta1r + zeta2r;
  98. s1i = -zeta1i + zeta2i;
  99. L20:
  100. rs1 = s1r;
  101. if (abs(rs1) > *elim) {
  102. goto L130;
  103. }
  104. L30:
  105. nn = min(2,nd);
  106. i__1 = nn;
  107. for (i__ = 1; i__ <= i__1; ++i__) {
  108. fn = *fnu + (nd - i__);
  109. init = 0;
  110. zunik_(zr, zi, &fn, &c__1, &c__0, tol, &init, &phir, &phii, &zeta1r, &
  111. zeta1i, &zeta2r, &zeta2i, &sumr, &sumi, cwrkr, cwrki);
  112. if (*kode == 1) {
  113. goto L40;
  114. }
  115. str = *zr + zeta2r;
  116. sti = *zi + zeta2i;
  117. rast = fn / zabs_(&str, &sti);
  118. str = str * rast * rast;
  119. sti = -sti * rast * rast;
  120. s1r = -zeta1r + str;
  121. s1i = -zeta1i + sti + *zi;
  122. goto L50;
  123. L40:
  124. s1r = -zeta1r + zeta2r;
  125. s1i = -zeta1i + zeta2i;
  126. L50:
  127. /* ----------------------------------------------------------------------- */
  128. /* TEST FOR UNDERFLOW AND OVERFLOW */
  129. /* ----------------------------------------------------------------------- */
  130. rs1 = s1r;
  131. if (abs(rs1) > *elim) {
  132. goto L110;
  133. }
  134. if (i__ == 1) {
  135. iflag = 2;
  136. }
  137. if (abs(rs1) < *alim) {
  138. goto L60;
  139. }
  140. /* ----------------------------------------------------------------------- */
  141. /* REFINE TEST AND SCALE */
  142. /* ----------------------------------------------------------------------- */
  143. aphi = zabs_(&phir, &phii);
  144. rs1 += log(aphi);
  145. if (abs(rs1) > *elim) {
  146. goto L110;
  147. }
  148. if (i__ == 1) {
  149. iflag = 1;
  150. }
  151. if (rs1 < 0.) {
  152. goto L60;
  153. }
  154. if (i__ == 1) {
  155. iflag = 3;
  156. }
  157. L60:
  158. /* ----------------------------------------------------------------------- */
  159. /* SCALE S1 IF ABS(S1).LT.ASCLE */
  160. /* ----------------------------------------------------------------------- */
  161. s2r = phir * sumr - phii * sumi;
  162. s2i = phir * sumi + phii * sumr;
  163. str = exp(s1r) * cssr[iflag - 1];
  164. s1r = str * cos(s1i);
  165. s1i = str * sin(s1i);
  166. str = s2r * s1r - s2i * s1i;
  167. s2i = s2r * s1i + s2i * s1r;
  168. s2r = str;
  169. if (iflag != 1) {
  170. goto L70;
  171. }
  172. zuchk_(&s2r, &s2i, &nw, bry, tol);
  173. if (nw != 0) {
  174. goto L110;
  175. }
  176. L70:
  177. cyr[i__ - 1] = s2r;
  178. cyi[i__ - 1] = s2i;
  179. m = nd - i__ + 1;
  180. yr[m] = s2r * csrr[iflag - 1];
  181. yi[m] = s2i * csrr[iflag - 1];
  182. /* L80: */
  183. }
  184. if (nd <= 2) {
  185. goto L100;
  186. }
  187. rast = 1. / zabs_(zr, zi);
  188. str = *zr * rast;
  189. sti = -(*zi) * rast;
  190. rzr = (str + str) * rast;
  191. rzi = (sti + sti) * rast;
  192. bry[1] = 1. / bry[0];
  193. bry[2] = d1mach_(2);
  194. s1r = cyr[0];
  195. s1i = cyi[0];
  196. s2r = cyr[1];
  197. s2i = cyi[1];
  198. c1r = csrr[iflag - 1];
  199. ascle = bry[iflag - 1];
  200. k = nd - 2;
  201. fn = (double) k;
  202. i__1 = nd;
  203. for (i__ = 3; i__ <= i__1; ++i__) {
  204. c2r = s2r;
  205. c2i = s2i;
  206. s2r = s1r + (*fnu + fn) * (rzr * c2r - rzi * c2i);
  207. s2i = s1i + (*fnu + fn) * (rzr * c2i + rzi * c2r);
  208. s1r = c2r;
  209. s1i = c2i;
  210. c2r = s2r * c1r;
  211. c2i = s2i * c1r;
  212. yr[k] = c2r;
  213. yi[k] = c2i;
  214. --k;
  215. fn += -1.;
  216. if (iflag >= 3) {
  217. goto L90;
  218. }
  219. str = abs(c2r);
  220. sti = abs(c2i);
  221. c2m = max(str,sti);
  222. if (c2m <= ascle) {
  223. goto L90;
  224. }
  225. ++iflag;
  226. ascle = bry[iflag - 1];
  227. s1r *= c1r;
  228. s1i *= c1r;
  229. s2r = c2r;
  230. s2i = c2i;
  231. s1r *= cssr[iflag - 1];
  232. s1i *= cssr[iflag - 1];
  233. s2r *= cssr[iflag - 1];
  234. s2i *= cssr[iflag - 1];
  235. c1r = csrr[iflag - 1];
  236. L90:
  237. ;
  238. }
  239. L100:
  240. return 0;
  241. /* ----------------------------------------------------------------------- */
  242. /* SET UNDERFLOW AND UPDATE PARAMETERS */
  243. /* ----------------------------------------------------------------------- */
  244. L110:
  245. if (rs1 > 0.) {
  246. goto L120;
  247. }
  248. yr[nd] = zeror;
  249. yi[nd] = zeroi;
  250. ++(*nz);
  251. --nd;
  252. if (nd == 0) {
  253. goto L100;
  254. }
  255. zuoik_(zr, zi, fnu, kode, &c__1, &nd, &yr[1], &yi[1], &nuf, tol, elim,
  256. alim);
  257. if (nuf < 0) {
  258. goto L120;
  259. }
  260. nd -= nuf;
  261. *nz += nuf;
  262. if (nd == 0) {
  263. goto L100;
  264. }
  265. fn = *fnu + (nd - 1);
  266. if (fn >= *fnul) {
  267. goto L30;
  268. }
  269. *nlast = nd;
  270. return 0;
  271. L120:
  272. *nz = -1;
  273. return 0;
  274. L130:
  275. if (rs1 > 0.) {
  276. goto L120;
  277. }
  278. *nz = *n;
  279. i__1 = *n;
  280. for (i__ = 1; i__ <= i__1; ++i__) {
  281. yr[i__] = zeror;
  282. yi[i__] = zeroi;
  283. /* L140: */
  284. }
  285. return 0;
  286. } /* zuni1_ */