zacon.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. /* zacon.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__2 = 2;
  8. int zacon_(double *zr, double *zi, double const *fnu,
  9. integer const *kode, integer *mr, integer const *n, double *yr, double *
  10. yi, integer *nz, double *rl, double *fnul, double *tol,
  11. double *elim, double *alim)
  12. {
  13. /* Initialized data */
  14. static double const pi = 3.14159265358979324;
  15. static double const zeror = 0.;
  16. static double const coner = 1.;
  17. /* System generated locals */
  18. integer i__1;
  19. /* Local variables. Some initialized to avoid -Wmaybe-uninitialized */
  20. integer i__;
  21. double fn;
  22. integer nn, nw;
  23. double yy, c1i, c2i, c1m, as2, c1r, c2r, s1i, s2i, s1r, s2r, cki, arg,
  24. ckr, cpn;
  25. integer iuf;
  26. double cyi[2], fmr, csr, azn, sgn;
  27. integer inu;
  28. double bry[3], cyr[2], pti, spn, sti, zni, rzi, ptr, str, znr, rzr,
  29. sc1i, sc2i = 0., sc1r, sc2r = 0., cscl, cscr;
  30. double csrr[3], cssr[3], razn;
  31. integer kflag;
  32. double ascle, bscle, csgni, csgnr, cspni, cspnr;
  33. /* ***BEGIN PROLOGUE ZACON */
  34. /* ***SUBSIDIARY */
  35. /* ***PURPOSE Subsidiary to ZBESH and ZBESK */
  36. /* ***LIBRARY SLATEC */
  37. /* ***TYPE ALL (CACON-A, ZACON-A) */
  38. /* ***AUTHOR Amos, D. E., (SNL) */
  39. /* ***DESCRIPTION */
  40. /* ZACON APPLIES THE ANALYTIC CONTINUATION FORMULA */
  41. /* K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN) */
  42. /* MP=PI*MR*CMPLX(0.0,1.0) */
  43. /* TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT */
  44. /* HALF Z PLANE */
  45. /* ***SEE ALSO ZBESH, ZBESK */
  46. /* ***ROUTINES CALLED D1MACH, ZABS, ZBINU, ZBKNU, ZMLT, ZS1S2 */
  47. /* ***REVISION HISTORY (YYMMDD) */
  48. /* 830501 DATE WRITTEN */
  49. /* 910415 Prologue converted to Version 4.0 format. (BAB) */
  50. /* ***END PROLOGUE ZACON */
  51. /* COMPLEX CK,CONE,CSCL,CSCR,CSGN,CSPN,CY,CZERO,C1,C2,RZ,SC1,SC2,ST, */
  52. /* *S1,S2,Y,Z,ZN */
  53. /* Parameter adjustments */
  54. --yi;
  55. --yr;
  56. /* Function Body */
  57. /* ***FIRST EXECUTABLE STATEMENT ZACON */
  58. *nz = 0;
  59. znr = -(*zr);
  60. zni = -(*zi);
  61. nn = *n;
  62. zbinu_(&znr, &zni, fnu, kode, &nn, &yr[1], &yi[1], &nw, rl, fnul, tol,
  63. elim, alim);
  64. if (nw < 0) {
  65. goto L90;
  66. }
  67. /* ----------------------------------------------------------------------- */
  68. /* ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION */
  69. /* ----------------------------------------------------------------------- */
  70. nn = min(2,*n);
  71. zbknu_(&znr, &zni, fnu, kode, &nn, cyr, cyi, &nw, tol, elim, alim);
  72. if (nw != 0) {
  73. goto L90;
  74. }
  75. s1r = cyr[0];
  76. s1i = cyi[0];
  77. fmr = (double) (*mr);
  78. sgn = -f2c::d_sign(&pi, &fmr);
  79. csgnr = zeror;
  80. csgni = sgn;
  81. if (*kode == 1) {
  82. goto L10;
  83. }
  84. yy = -zni;
  85. cpn = cos(yy);
  86. spn = sin(yy);
  87. zmlt_(&csgnr, &csgni, &cpn, &spn, &csgnr, &csgni);
  88. L10:
  89. /* ----------------------------------------------------------------------- */
  90. /* CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE */
  91. /* WHEN FNU IS LARGE */
  92. /* ----------------------------------------------------------------------- */
  93. inu = (integer) (*fnu);
  94. arg = (*fnu - inu) * sgn;
  95. cpn = cos(arg);
  96. spn = sin(arg);
  97. cspnr = cpn;
  98. cspni = spn;
  99. if (inu % 2 == 0) {
  100. goto L20;
  101. }
  102. cspnr = -cspnr;
  103. cspni = -cspni;
  104. L20:
  105. iuf = 0;
  106. c1r = s1r;
  107. c1i = s1i;
  108. c2r = yr[1];
  109. c2i = yi[1];
  110. ascle = d1mach_(1) * 1e3 / *tol;
  111. if (*kode == 1) {
  112. goto L30;
  113. }
  114. zs1s2_(&znr, &zni, &c1r, &c1i, &c2r, &c2i, &nw, &ascle, alim, &iuf);
  115. *nz += nw;
  116. sc1r = c1r;
  117. sc1i = c1i;
  118. L30:
  119. zmlt_(&cspnr, &cspni, &c1r, &c1i, &str, &sti);
  120. zmlt_(&csgnr, &csgni, &c2r, &c2i, &ptr, &pti);
  121. yr[1] = str + ptr;
  122. yi[1] = sti + pti;
  123. if (*n == 1) {
  124. return 0;
  125. }
  126. cspnr = -cspnr;
  127. cspni = -cspni;
  128. s2r = cyr[1];
  129. s2i = cyi[1];
  130. c1r = s2r;
  131. c1i = s2i;
  132. c2r = yr[2];
  133. c2i = yi[2];
  134. if (*kode == 1) {
  135. goto L40;
  136. }
  137. zs1s2_(&znr, &zni, &c1r, &c1i, &c2r, &c2i, &nw, &ascle, alim, &iuf);
  138. *nz += nw;
  139. sc2r = c1r;
  140. sc2i = c1i;
  141. L40:
  142. zmlt_(&cspnr, &cspni, &c1r, &c1i, &str, &sti);
  143. zmlt_(&csgnr, &csgni, &c2r, &c2i, &ptr, &pti);
  144. yr[2] = str + ptr;
  145. yi[2] = sti + pti;
  146. if (*n == 2) {
  147. return 0;
  148. }
  149. cspnr = -cspnr;
  150. cspni = -cspni;
  151. azn = zabs_(&znr, &zni);
  152. razn = 1. / azn;
  153. str = znr * razn;
  154. sti = -zni * razn;
  155. rzr = (str + str) * razn;
  156. rzi = (sti + sti) * razn;
  157. fn = *fnu + 1.;
  158. ckr = fn * rzr;
  159. cki = fn * rzi;
  160. /* ----------------------------------------------------------------------- */
  161. /* SCALE NEAR EXPONENT EXTREMES DURING RECURRENCE ON K FUNCTIONS */
  162. /* ----------------------------------------------------------------------- */
  163. cscl = 1. / *tol;
  164. cscr = *tol;
  165. cssr[0] = cscl;
  166. cssr[1] = coner;
  167. cssr[2] = cscr;
  168. csrr[0] = cscr;
  169. csrr[1] = coner;
  170. csrr[2] = cscl;
  171. bry[0] = ascle;
  172. bry[1] = 1. / ascle;
  173. bry[2] = d1mach_(2);
  174. as2 = zabs_(&s2r, &s2i);
  175. kflag = 2;
  176. if (as2 > bry[0]) {
  177. goto L50;
  178. }
  179. kflag = 1;
  180. goto L60;
  181. L50:
  182. if (as2 < bry[1]) {
  183. goto L60;
  184. }
  185. kflag = 3;
  186. L60:
  187. bscle = bry[kflag - 1];
  188. s1r *= cssr[kflag - 1];
  189. s1i *= cssr[kflag - 1];
  190. s2r *= cssr[kflag - 1];
  191. s2i *= cssr[kflag - 1];
  192. csr = csrr[kflag - 1];
  193. i__1 = *n;
  194. for (i__ = 3; i__ <= i__1; ++i__) {
  195. str = s2r;
  196. sti = s2i;
  197. s2r = ckr * str - cki * sti + s1r;
  198. s2i = ckr * sti + cki * str + s1i;
  199. s1r = str;
  200. s1i = sti;
  201. c1r = s2r * csr;
  202. c1i = s2i * csr;
  203. str = c1r;
  204. sti = c1i;
  205. c2r = yr[i__];
  206. c2i = yi[i__];
  207. if (*kode == 1) {
  208. goto L70;
  209. }
  210. if (iuf < 0) {
  211. goto L70;
  212. }
  213. zs1s2_(&znr, &zni, &c1r, &c1i, &c2r, &c2i, &nw, &ascle, alim, &iuf);
  214. *nz += nw;
  215. sc1r = sc2r;
  216. sc1i = sc2i;
  217. sc2r = c1r;
  218. sc2i = c1i;
  219. if (iuf != 3) {
  220. goto L70;
  221. }
  222. iuf = -4;
  223. s1r = sc1r * cssr[kflag - 1];
  224. s1i = sc1i * cssr[kflag - 1];
  225. s2r = sc2r * cssr[kflag - 1];
  226. s2i = sc2i * cssr[kflag - 1];
  227. str = sc2r;
  228. sti = sc2i;
  229. L70:
  230. ptr = cspnr * c1r - cspni * c1i;
  231. pti = cspnr * c1i + cspni * c1r;
  232. yr[i__] = ptr + csgnr * c2r - csgni * c2i;
  233. yi[i__] = pti + csgnr * c2i + csgni * c2r;
  234. ckr += rzr;
  235. cki += rzi;
  236. cspnr = -cspnr;
  237. cspni = -cspni;
  238. if (kflag >= 3) {
  239. goto L80;
  240. }
  241. ptr = abs(c1r);
  242. pti = abs(c1i);
  243. c1m = max(ptr,pti);
  244. if (c1m <= bscle) {
  245. goto L80;
  246. }
  247. ++kflag;
  248. bscle = bry[kflag - 1];
  249. s1r *= csr;
  250. s1i *= csr;
  251. s2r = str;
  252. s2i = sti;
  253. s1r *= cssr[kflag - 1];
  254. s1i *= cssr[kflag - 1];
  255. s2r *= cssr[kflag - 1];
  256. s2i *= cssr[kflag - 1];
  257. csr = csrr[kflag - 1];
  258. L80:
  259. ;
  260. }
  261. return 0;
  262. L90:
  263. *nz = -1;
  264. if (nw == -2) {
  265. *nz = -2;
  266. }
  267. return 0;
  268. } /* zacon_ */