You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

csytrf_rec2.c 13 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. /* -- translated by f2c (version 20100827).
  2. You must link the resulting object file with libf2c:
  3. on Microsoft Windows system, link with libf2c.lib;
  4. on Linux or Unix systems, link with .../path/to/libf2c.a -lm
  5. or, if you install libf2c.a in a standard place, with -lf2c -lm
  6. -- in that order, at the end of the command line, as in
  7. cc *.o -lf2c -lm
  8. Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
  9. http://www.netlib.org/f2c/libf2c.zip
  10. */
  11. #include "f2c.h"
  12. /* Table of constant values */
  13. static complex c_b1 = {1.f,0.f};
  14. static blasint c__1 = 1;
  15. /** CSYTRF_REC2 computes a partial factorization of a complex symmetric matrix using the Bunch-Kaufman diagon al pivoting method.
  16. *
  17. * This routine is a minor modification of LAPACK's clasyf.
  18. * It serves as an unblocked kernel in the recursive algorithms.
  19. * The blocked BLAS Level 3 updates were removed and moved to the
  20. * recursive algorithm.
  21. * */
  22. /* Subroutine */ void RELAPACK_csytrf_rec2(char *uplo, blasint *n, blasint *
  23. nb, blasint *kb, complex *a, blasint *lda, blasint *ipiv, complex *w,
  24. int *ldw, blasint *info, ftnlen uplo_len)
  25. {
  26. /* System generated locals */
  27. blasint a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3, i__4;
  28. float r__1, r__2, r__3, r__4;
  29. complex q__1, q__2, q__3;
  30. /* Builtin functions */
  31. double sqrt(double), r_imag(complex *);
  32. void c_div(complex *, complex *, complex *);
  33. /* Local variables */
  34. static blasint j, k;
  35. static complex t, r1, d11, d21, d22;
  36. static blasint jj, kk, jp, kp, kw, kkw, imax, jmax;
  37. static float alpha;
  38. extern /* Subroutine */ blasint cscal_(int *, complex *, complex *,
  39. blasint *);
  40. extern logical lsame_(char *, char *, ftnlen, ftnlen);
  41. extern /* Subroutine */ blasint cgemv_(char *, blasint *, blasint *, complex *
  42. , complex *, blasint *, complex *, blasint *, complex *, complex *
  43. , blasint *, ftnlen), ccopy_(int *, complex *, blasint *,
  44. complex *, blasint *), cswap_(int *, complex *, blasint *,
  45. complex *, blasint *);
  46. static blasint kstep;
  47. static float absakk;
  48. extern blasint icamax_(int *, complex *, blasint *);
  49. static float colmax, rowmax;
  50. /* Parameter adjustments */
  51. a_dim1 = *lda;
  52. a_offset = 1 + a_dim1;
  53. a -= a_offset;
  54. --ipiv;
  55. w_dim1 = *ldw;
  56. w_offset = 1 + w_dim1;
  57. w -= w_offset;
  58. /* Function Body */
  59. *info = 0;
  60. alpha = (sqrt(17.f) + 1.f) / 8.f;
  61. if (lsame_(uplo, "U", (ftnlen)1, (ftnlen)1)) {
  62. k = *n;
  63. L10:
  64. kw = *nb + k - *n;
  65. if ((k <= *n - *nb + 1 && *nb < *n) || k < 1) {
  66. goto L30;
  67. }
  68. ccopy_(&k, &a[k * a_dim1 + 1], &c__1, &w[kw * w_dim1 + 1], &c__1);
  69. if (k < *n) {
  70. i__1 = *n - k;
  71. q__1.r = -1.f, q__1.i = -0.f;
  72. cgemv_("No transpose", &k, &i__1, &q__1, &a[(k + 1) * a_dim1 + 1],
  73. lda, &w[k + (kw + 1) * w_dim1], ldw, &c_b1, &w[kw *
  74. w_dim1 + 1], &c__1, (ftnlen)12);
  75. }
  76. kstep = 1;
  77. i__1 = k + kw * w_dim1;
  78. absakk = (r__1 = w[i__1].r, dabs(r__1)) + (r__2 = r_imag(&w[k + kw *
  79. w_dim1]), dabs(r__2));
  80. if (k > 1) {
  81. i__1 = k - 1;
  82. imax = icamax_(&i__1, &w[kw * w_dim1 + 1], &c__1);
  83. i__1 = imax + kw * w_dim1;
  84. colmax = (r__1 = w[i__1].r, dabs(r__1)) + (r__2 = r_imag(&w[imax
  85. + kw * w_dim1]), dabs(r__2));
  86. } else {
  87. colmax = 0.f;
  88. }
  89. if (dmax(absakk,colmax) == 0.f) {
  90. if (*info == 0) {
  91. *info = k;
  92. }
  93. kp = k;
  94. } else {
  95. if (absakk >= alpha * colmax) {
  96. kp = k;
  97. } else {
  98. ccopy_(&imax, &a[imax * a_dim1 + 1], &c__1, &w[(kw - 1) *
  99. w_dim1 + 1], &c__1);
  100. i__1 = k - imax;
  101. ccopy_(&i__1, &a[imax + (imax + 1) * a_dim1], lda, &w[imax +
  102. 1 + (kw - 1) * w_dim1], &c__1);
  103. if (k < *n) {
  104. i__1 = *n - k;
  105. q__1.r = -1.f, q__1.i = -0.f;
  106. cgemv_("No transpose", &k, &i__1, &q__1, &a[(k + 1) *
  107. a_dim1 + 1], lda, &w[imax + (kw + 1) * w_dim1],
  108. ldw, &c_b1, &w[(kw - 1) * w_dim1 + 1], &c__1, (
  109. ftnlen)12);
  110. }
  111. i__1 = k - imax;
  112. jmax = imax + icamax_(&i__1, &w[imax + 1 + (kw - 1) * w_dim1],
  113. &c__1);
  114. i__1 = jmax + (kw - 1) * w_dim1;
  115. rowmax = (r__1 = w[i__1].r, dabs(r__1)) + (r__2 = r_imag(&w[
  116. jmax + (kw - 1) * w_dim1]), dabs(r__2));
  117. if (imax > 1) {
  118. i__1 = imax - 1;
  119. jmax = icamax_(&i__1, &w[(kw - 1) * w_dim1 + 1], &c__1);
  120. /* Computing MAX */
  121. i__1 = jmax + (kw - 1) * w_dim1;
  122. r__3 = rowmax, r__4 = (r__1 = w[i__1].r, dabs(r__1)) + (
  123. r__2 = r_imag(&w[jmax + (kw - 1) * w_dim1]), dabs(
  124. r__2));
  125. rowmax = dmax(r__3,r__4);
  126. }
  127. if (absakk >= alpha * colmax * (colmax / rowmax)) {
  128. kp = k;
  129. } else /* if(complicated condition) */ {
  130. i__1 = imax + (kw - 1) * w_dim1;
  131. if ((r__1 = w[i__1].r, dabs(r__1)) + (r__2 = r_imag(&w[
  132. imax + (kw - 1) * w_dim1]), dabs(r__2)) >= alpha *
  133. rowmax) {
  134. kp = imax;
  135. ccopy_(&k, &w[(kw - 1) * w_dim1 + 1], &c__1, &w[kw *
  136. w_dim1 + 1], &c__1);
  137. } else {
  138. kp = imax;
  139. kstep = 2;
  140. }
  141. }
  142. }
  143. kk = k - kstep + 1;
  144. kkw = *nb + kk - *n;
  145. if (kp != kk) {
  146. i__1 = kp + kp * a_dim1;
  147. i__2 = kk + kk * a_dim1;
  148. a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i;
  149. i__1 = kk - 1 - kp;
  150. ccopy_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + (kp +
  151. 1) * a_dim1], lda);
  152. if (kp > 1) {
  153. i__1 = kp - 1;
  154. ccopy_(&i__1, &a[kk * a_dim1 + 1], &c__1, &a[kp * a_dim1
  155. + 1], &c__1);
  156. }
  157. if (k < *n) {
  158. i__1 = *n - k;
  159. cswap_(&i__1, &a[kk + (k + 1) * a_dim1], lda, &a[kp + (k
  160. + 1) * a_dim1], lda);
  161. }
  162. i__1 = *n - kk + 1;
  163. cswap_(&i__1, &w[kk + kkw * w_dim1], ldw, &w[kp + kkw *
  164. w_dim1], ldw);
  165. }
  166. if (kstep == 1) {
  167. ccopy_(&k, &w[kw * w_dim1 + 1], &c__1, &a[k * a_dim1 + 1], &
  168. c__1);
  169. c_div(&q__1, &c_b1, &a[k + k * a_dim1]);
  170. r1.r = q__1.r, r1.i = q__1.i;
  171. i__1 = k - 1;
  172. cscal_(&i__1, &r1, &a[k * a_dim1 + 1], &c__1);
  173. } else {
  174. if (k > 2) {
  175. i__1 = k - 1 + kw * w_dim1;
  176. d21.r = w[i__1].r, d21.i = w[i__1].i;
  177. c_div(&q__1, &w[k + kw * w_dim1], &d21);
  178. d11.r = q__1.r, d11.i = q__1.i;
  179. c_div(&q__1, &w[k - 1 + (kw - 1) * w_dim1], &d21);
  180. d22.r = q__1.r, d22.i = q__1.i;
  181. q__3.r = d11.r * d22.r - d11.i * d22.i, q__3.i = d11.r *
  182. d22.i + d11.i * d22.r;
  183. q__2.r = q__3.r - 1.f, q__2.i = q__3.i - 0.f;
  184. c_div(&q__1, &c_b1, &q__2);
  185. t.r = q__1.r, t.i = q__1.i;
  186. c_div(&q__1, &t, &d21);
  187. d21.r = q__1.r, d21.i = q__1.i;
  188. i__1 = k - 2;
  189. for (j = 1; j <= i__1; ++j) {
  190. i__2 = j + (k - 1) * a_dim1;
  191. i__3 = j + (kw - 1) * w_dim1;
  192. q__3.r = d11.r * w[i__3].r - d11.i * w[i__3].i,
  193. q__3.i = d11.r * w[i__3].i + d11.i * w[i__3]
  194. .r;
  195. i__4 = j + kw * w_dim1;
  196. q__2.r = q__3.r - w[i__4].r, q__2.i = q__3.i - w[i__4]
  197. .i;
  198. q__1.r = d21.r * q__2.r - d21.i * q__2.i, q__1.i =
  199. d21.r * q__2.i + d21.i * q__2.r;
  200. a[i__2].r = q__1.r, a[i__2].i = q__1.i;
  201. i__2 = j + k * a_dim1;
  202. i__3 = j + kw * w_dim1;
  203. q__3.r = d22.r * w[i__3].r - d22.i * w[i__3].i,
  204. q__3.i = d22.r * w[i__3].i + d22.i * w[i__3]
  205. .r;
  206. i__4 = j + (kw - 1) * w_dim1;
  207. q__2.r = q__3.r - w[i__4].r, q__2.i = q__3.i - w[i__4]
  208. .i;
  209. q__1.r = d21.r * q__2.r - d21.i * q__2.i, q__1.i =
  210. d21.r * q__2.i + d21.i * q__2.r;
  211. a[i__2].r = q__1.r, a[i__2].i = q__1.i;
  212. /* L20: */
  213. }
  214. }
  215. i__1 = k - 1 + (k - 1) * a_dim1;
  216. i__2 = k - 1 + (kw - 1) * w_dim1;
  217. a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i;
  218. i__1 = k - 1 + k * a_dim1;
  219. i__2 = k - 1 + kw * w_dim1;
  220. a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i;
  221. i__1 = k + k * a_dim1;
  222. i__2 = k + kw * w_dim1;
  223. a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i;
  224. }
  225. }
  226. if (kstep == 1) {
  227. ipiv[k] = kp;
  228. } else {
  229. ipiv[k] = -kp;
  230. ipiv[k - 1] = -kp;
  231. }
  232. k -= kstep;
  233. goto L10;
  234. L30:
  235. j = k + 1;
  236. L60:
  237. jj = j;
  238. jp = ipiv[j];
  239. if (jp < 0) {
  240. jp = -jp;
  241. ++j;
  242. }
  243. ++j;
  244. if (jp != jj && j <= *n) {
  245. i__1 = *n - j + 1;
  246. cswap_(&i__1, &a[jp + j * a_dim1], lda, &a[jj + j * a_dim1], lda);
  247. }
  248. if (j < *n) {
  249. goto L60;
  250. }
  251. *kb = *n - k;
  252. } else {
  253. k = 1;
  254. L70:
  255. if ((k >= *nb && *nb < *n) || k > *n) {
  256. goto L90;
  257. }
  258. i__1 = *n - k + 1;
  259. ccopy_(&i__1, &a[k + k * a_dim1], &c__1, &w[k + k * w_dim1], &c__1);
  260. i__1 = *n - k + 1;
  261. i__2 = k - 1;
  262. q__1.r = -1.f, q__1.i = -0.f;
  263. cgemv_("No transpose", &i__1, &i__2, &q__1, &a[k + a_dim1], lda, &w[k
  264. + w_dim1], ldw, &c_b1, &w[k + k * w_dim1], &c__1, (ftnlen)12);
  265. kstep = 1;
  266. i__1 = k + k * w_dim1;
  267. absakk = (r__1 = w[i__1].r, dabs(r__1)) + (r__2 = r_imag(&w[k + k *
  268. w_dim1]), dabs(r__2));
  269. if (k < *n) {
  270. i__1 = *n - k;
  271. imax = k + icamax_(&i__1, &w[k + 1 + k * w_dim1], &c__1);
  272. i__1 = imax + k * w_dim1;
  273. colmax = (r__1 = w[i__1].r, dabs(r__1)) + (r__2 = r_imag(&w[imax
  274. + k * w_dim1]), dabs(r__2));
  275. } else {
  276. colmax = 0.f;
  277. }
  278. if (dmax(absakk,colmax) == 0.f) {
  279. if (*info == 0) {
  280. *info = k;
  281. }
  282. kp = k;
  283. } else {
  284. if (absakk >= alpha * colmax) {
  285. kp = k;
  286. } else {
  287. i__1 = imax - k;
  288. ccopy_(&i__1, &a[imax + k * a_dim1], lda, &w[k + (k + 1) *
  289. w_dim1], &c__1);
  290. i__1 = *n - imax + 1;
  291. ccopy_(&i__1, &a[imax + imax * a_dim1], &c__1, &w[imax + (k +
  292. 1) * w_dim1], &c__1);
  293. i__1 = *n - k + 1;
  294. i__2 = k - 1;
  295. q__1.r = -1.f, q__1.i = -0.f;
  296. cgemv_("No transpose", &i__1, &i__2, &q__1, &a[k + a_dim1],
  297. lda, &w[imax + w_dim1], ldw, &c_b1, &w[k + (k + 1) *
  298. w_dim1], &c__1, (ftnlen)12);
  299. i__1 = imax - k;
  300. jmax = k - 1 + icamax_(&i__1, &w[k + (k + 1) * w_dim1], &c__1)
  301. ;
  302. i__1 = jmax + (k + 1) * w_dim1;
  303. rowmax = (r__1 = w[i__1].r, dabs(r__1)) + (r__2 = r_imag(&w[
  304. jmax + (k + 1) * w_dim1]), dabs(r__2));
  305. if (imax < *n) {
  306. i__1 = *n - imax;
  307. jmax = imax + icamax_(&i__1, &w[imax + 1 + (k + 1) *
  308. w_dim1], &c__1);
  309. /* Computing MAX */
  310. i__1 = jmax + (k + 1) * w_dim1;
  311. r__3 = rowmax, r__4 = (r__1 = w[i__1].r, dabs(r__1)) + (
  312. r__2 = r_imag(&w[jmax + (k + 1) * w_dim1]), dabs(
  313. r__2));
  314. rowmax = dmax(r__3,r__4);
  315. }
  316. if (absakk >= alpha * colmax * (colmax / rowmax)) {
  317. kp = k;
  318. } else /* if(complicated condition) */ {
  319. i__1 = imax + (k + 1) * w_dim1;
  320. if ((r__1 = w[i__1].r, dabs(r__1)) + (r__2 = r_imag(&w[
  321. imax + (k + 1) * w_dim1]), dabs(r__2)) >= alpha *
  322. rowmax) {
  323. kp = imax;
  324. i__1 = *n - k + 1;
  325. ccopy_(&i__1, &w[k + (k + 1) * w_dim1], &c__1, &w[k +
  326. k * w_dim1], &c__1);
  327. } else {
  328. kp = imax;
  329. kstep = 2;
  330. }
  331. }
  332. }
  333. kk = k + kstep - 1;
  334. if (kp != kk) {
  335. i__1 = kp + kp * a_dim1;
  336. i__2 = kk + kk * a_dim1;
  337. a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i;
  338. i__1 = kp - kk - 1;
  339. ccopy_(&i__1, &a[kk + 1 + kk * a_dim1], &c__1, &a[kp + (kk +
  340. 1) * a_dim1], lda);
  341. if (kp < *n) {
  342. i__1 = *n - kp;
  343. ccopy_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + 1
  344. + kp * a_dim1], &c__1);
  345. }
  346. if (k > 1) {
  347. i__1 = k - 1;
  348. cswap_(&i__1, &a[kk + a_dim1], lda, &a[kp + a_dim1], lda);
  349. }
  350. cswap_(&kk, &w[kk + w_dim1], ldw, &w[kp + w_dim1], ldw);
  351. }
  352. if (kstep == 1) {
  353. i__1 = *n - k + 1;
  354. ccopy_(&i__1, &w[k + k * w_dim1], &c__1, &a[k + k * a_dim1], &
  355. c__1);
  356. if (k < *n) {
  357. c_div(&q__1, &c_b1, &a[k + k * a_dim1]);
  358. r1.r = q__1.r, r1.i = q__1.i;
  359. i__1 = *n - k;
  360. cscal_(&i__1, &r1, &a[k + 1 + k * a_dim1], &c__1);
  361. }
  362. } else {
  363. if (k < *n - 1) {
  364. i__1 = k + 1 + k * w_dim1;
  365. d21.r = w[i__1].r, d21.i = w[i__1].i;
  366. c_div(&q__1, &w[k + 1 + (k + 1) * w_dim1], &d21);
  367. d11.r = q__1.r, d11.i = q__1.i;
  368. c_div(&q__1, &w[k + k * w_dim1], &d21);
  369. d22.r = q__1.r, d22.i = q__1.i;
  370. q__3.r = d11.r * d22.r - d11.i * d22.i, q__3.i = d11.r *
  371. d22.i + d11.i * d22.r;
  372. q__2.r = q__3.r - 1.f, q__2.i = q__3.i - 0.f;
  373. c_div(&q__1, &c_b1, &q__2);
  374. t.r = q__1.r, t.i = q__1.i;
  375. c_div(&q__1, &t, &d21);
  376. d21.r = q__1.r, d21.i = q__1.i;
  377. i__1 = *n;
  378. for (j = k + 2; j <= i__1; ++j) {
  379. i__2 = j + k * a_dim1;
  380. i__3 = j + k * w_dim1;
  381. q__3.r = d11.r * w[i__3].r - d11.i * w[i__3].i,
  382. q__3.i = d11.r * w[i__3].i + d11.i * w[i__3]
  383. .r;
  384. i__4 = j + (k + 1) * w_dim1;
  385. q__2.r = q__3.r - w[i__4].r, q__2.i = q__3.i - w[i__4]
  386. .i;
  387. q__1.r = d21.r * q__2.r - d21.i * q__2.i, q__1.i =
  388. d21.r * q__2.i + d21.i * q__2.r;
  389. a[i__2].r = q__1.r, a[i__2].i = q__1.i;
  390. i__2 = j + (k + 1) * a_dim1;
  391. i__3 = j + (k + 1) * w_dim1;
  392. q__3.r = d22.r * w[i__3].r - d22.i * w[i__3].i,
  393. q__3.i = d22.r * w[i__3].i + d22.i * w[i__3]
  394. .r;
  395. i__4 = j + k * w_dim1;
  396. q__2.r = q__3.r - w[i__4].r, q__2.i = q__3.i - w[i__4]
  397. .i;
  398. q__1.r = d21.r * q__2.r - d21.i * q__2.i, q__1.i =
  399. d21.r * q__2.i + d21.i * q__2.r;
  400. a[i__2].r = q__1.r, a[i__2].i = q__1.i;
  401. /* L80: */
  402. }
  403. }
  404. i__1 = k + k * a_dim1;
  405. i__2 = k + k * w_dim1;
  406. a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i;
  407. i__1 = k + 1 + k * a_dim1;
  408. i__2 = k + 1 + k * w_dim1;
  409. a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i;
  410. i__1 = k + 1 + (k + 1) * a_dim1;
  411. i__2 = k + 1 + (k + 1) * w_dim1;
  412. a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i;
  413. }
  414. }
  415. if (kstep == 1) {
  416. ipiv[k] = kp;
  417. } else {
  418. ipiv[k] = -kp;
  419. ipiv[k + 1] = -kp;
  420. }
  421. k += kstep;
  422. goto L70;
  423. L90:
  424. j = k - 1;
  425. L120:
  426. jj = j;
  427. jp = ipiv[j];
  428. if (jp < 0) {
  429. jp = -jp;
  430. --j;
  431. }
  432. --j;
  433. if (jp != jj && j >= 1) {
  434. cswap_(&j, &a[jp + a_dim1], lda, &a[jj + a_dim1], lda);
  435. }
  436. if (j > 1) {
  437. goto L120;
  438. }
  439. *kb = k - 1;
  440. }
  441. return;
  442. }