dsfrk.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. /* dsfrk.f -- translated by f2c (version 20061008).
  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. #include "blaswrap.h"
  13. /* Subroutine */ int _starpu_dsfrk_(char *transr, char *uplo, char *trans, integer *n,
  14. integer *k, doublereal *alpha, doublereal *a, integer *lda,
  15. doublereal *beta, doublereal *c__)
  16. {
  17. /* System generated locals */
  18. integer a_dim1, a_offset, i__1;
  19. /* Local variables */
  20. integer j, n1, n2, nk, info;
  21. logical normaltransr;
  22. extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *,
  23. integer *, doublereal *, doublereal *, integer *, doublereal *,
  24. integer *, doublereal *, doublereal *, integer *);
  25. extern logical _starpu_lsame_(char *, char *);
  26. integer nrowa;
  27. logical lower;
  28. extern /* Subroutine */ int _starpu_dsyrk_(char *, char *, integer *, integer *,
  29. doublereal *, doublereal *, integer *, doublereal *, doublereal *,
  30. integer *), _starpu_xerbla_(char *, integer *);
  31. logical nisodd, notrans;
  32. /* -- LAPACK routine (version 3.2) -- */
  33. /* -- Contributed by Julien Langou of the Univ. of Colorado Denver -- */
  34. /* -- November 2008 -- */
  35. /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */
  36. /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
  37. /* .. */
  38. /* .. Scalar Arguments .. */
  39. /* .. */
  40. /* .. Array Arguments .. */
  41. /* .. */
  42. /* Purpose */
  43. /* ======= */
  44. /* Level 3 BLAS like routine for C in RFP Format. */
  45. /* DSFRK performs one of the symmetric rank--k operations */
  46. /* C := alpha*A*A' + beta*C, */
  47. /* or */
  48. /* C := alpha*A'*A + beta*C, */
  49. /* where alpha and beta are real scalars, C is an n--by--n symmetric */
  50. /* matrix and A is an n--by--k matrix in the first case and a k--by--n */
  51. /* matrix in the second case. */
  52. /* Arguments */
  53. /* ========== */
  54. /* TRANSR (input) CHARACTER */
  55. /* = 'N': The Normal Form of RFP A is stored; */
  56. /* = 'T': The Transpose Form of RFP A is stored. */
  57. /* UPLO - (input) CHARACTER */
  58. /* On entry, UPLO specifies whether the upper or lower */
  59. /* triangular part of the array C is to be referenced as */
  60. /* follows: */
  61. /* UPLO = 'U' or 'u' Only the upper triangular part of C */
  62. /* is to be referenced. */
  63. /* UPLO = 'L' or 'l' Only the lower triangular part of C */
  64. /* is to be referenced. */
  65. /* Unchanged on exit. */
  66. /* TRANS - (input) CHARACTER */
  67. /* On entry, TRANS specifies the operation to be performed as */
  68. /* follows: */
  69. /* TRANS = 'N' or 'n' C := alpha*A*A' + beta*C. */
  70. /* TRANS = 'T' or 't' C := alpha*A'*A + beta*C. */
  71. /* Unchanged on exit. */
  72. /* N - (input) INTEGER. */
  73. /* On entry, N specifies the order of the matrix C. N must be */
  74. /* at least zero. */
  75. /* Unchanged on exit. */
  76. /* K - (input) INTEGER. */
  77. /* On entry with TRANS = 'N' or 'n', K specifies the number */
  78. /* of columns of the matrix A, and on entry with TRANS = 'T' */
  79. /* or 't', K specifies the number of rows of the matrix A. K */
  80. /* must be at least zero. */
  81. /* Unchanged on exit. */
  82. /* ALPHA - (input) DOUBLE PRECISION. */
  83. /* On entry, ALPHA specifies the scalar alpha. */
  84. /* Unchanged on exit. */
  85. /* A - (input) DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where KA */
  86. /* is K when TRANS = 'N' or 'n', and is N otherwise. Before */
  87. /* entry with TRANS = 'N' or 'n', the leading N--by--K part of */
  88. /* the array A must contain the matrix A, otherwise the leading */
  89. /* K--by--N part of the array A must contain the matrix A. */
  90. /* Unchanged on exit. */
  91. /* LDA - (input) INTEGER. */
  92. /* On entry, LDA specifies the first dimension of A as declared */
  93. /* in the calling (sub) program. When TRANS = 'N' or 'n' */
  94. /* then LDA must be at least max( 1, n ), otherwise LDA must */
  95. /* be at least max( 1, k ). */
  96. /* Unchanged on exit. */
  97. /* BETA - (input) DOUBLE PRECISION. */
  98. /* On entry, BETA specifies the scalar beta. */
  99. /* Unchanged on exit. */
  100. /* C - (input/output) DOUBLE PRECISION array, dimension ( NT ); */
  101. /* NT = N*(N+1)/2. On entry, the symmetric matrix C in RFP */
  102. /* Format. RFP Format is described by TRANSR, UPLO and N. */
  103. /* Arguments */
  104. /* ========== */
  105. /* .. */
  106. /* .. Parameters .. */
  107. /* .. */
  108. /* .. Local Scalars .. */
  109. /* .. */
  110. /* .. External Functions .. */
  111. /* .. */
  112. /* .. External Subroutines .. */
  113. /* .. */
  114. /* .. Intrinsic Functions .. */
  115. /* .. */
  116. /* .. Executable Statements .. */
  117. /* Test the input parameters. */
  118. /* Parameter adjustments */
  119. a_dim1 = *lda;
  120. a_offset = 1 + a_dim1;
  121. a -= a_offset;
  122. --c__;
  123. /* Function Body */
  124. info = 0;
  125. normaltransr = _starpu_lsame_(transr, "N");
  126. lower = _starpu_lsame_(uplo, "L");
  127. notrans = _starpu_lsame_(trans, "N");
  128. if (notrans) {
  129. nrowa = *n;
  130. } else {
  131. nrowa = *k;
  132. }
  133. if (! normaltransr && ! _starpu_lsame_(transr, "T")) {
  134. info = -1;
  135. } else if (! lower && ! _starpu_lsame_(uplo, "U")) {
  136. info = -2;
  137. } else if (! notrans && ! _starpu_lsame_(trans, "T")) {
  138. info = -3;
  139. } else if (*n < 0) {
  140. info = -4;
  141. } else if (*k < 0) {
  142. info = -5;
  143. } else if (*lda < max(1,nrowa)) {
  144. info = -8;
  145. }
  146. if (info != 0) {
  147. i__1 = -info;
  148. _starpu_xerbla_("DSFRK ", &i__1);
  149. return 0;
  150. }
  151. /* Quick return if possible. */
  152. /* The quick return case: ((ALPHA.EQ.0).AND.(BETA.NE.ZERO)) is not */
  153. /* done (it is in DSYRK for example) and left in the general case. */
  154. if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) {
  155. return 0;
  156. }
  157. if (*alpha == 0. && *beta == 0.) {
  158. i__1 = *n * (*n + 1) / 2;
  159. for (j = 1; j <= i__1; ++j) {
  160. c__[j] = 0.;
  161. }
  162. return 0;
  163. }
  164. /* C is N-by-N. */
  165. /* If N is odd, set NISODD = .TRUE., and N1 and N2. */
  166. /* If N is even, NISODD = .FALSE., and NK. */
  167. if (*n % 2 == 0) {
  168. nisodd = FALSE_;
  169. nk = *n / 2;
  170. } else {
  171. nisodd = TRUE_;
  172. if (lower) {
  173. n2 = *n / 2;
  174. n1 = *n - n2;
  175. } else {
  176. n1 = *n / 2;
  177. n2 = *n - n1;
  178. }
  179. }
  180. if (nisodd) {
  181. /* N is odd */
  182. if (normaltransr) {
  183. /* N is odd and TRANSR = 'N' */
  184. if (lower) {
  185. /* N is odd, TRANSR = 'N', and UPLO = 'L' */
  186. if (notrans) {
  187. /* N is odd, TRANSR = 'N', UPLO = 'L', and TRANS = 'N' */
  188. _starpu_dsyrk_("L", "N", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
  189. &c__[1], n);
  190. _starpu_dsyrk_("U", "N", &n2, k, alpha, &a[n1 + 1 + a_dim1], lda,
  191. beta, &c__[*n + 1], n);
  192. _starpu_dgemm_("N", "T", &n2, &n1, k, alpha, &a[n1 + 1 + a_dim1],
  193. lda, &a[a_dim1 + 1], lda, beta, &c__[n1 + 1], n);
  194. } else {
  195. /* N is odd, TRANSR = 'N', UPLO = 'L', and TRANS = 'T' */
  196. _starpu_dsyrk_("L", "T", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
  197. &c__[1], n);
  198. _starpu_dsyrk_("U", "T", &n2, k, alpha, &a[(n1 + 1) * a_dim1 + 1],
  199. lda, beta, &c__[*n + 1], n)
  200. ;
  201. _starpu_dgemm_("T", "N", &n2, &n1, k, alpha, &a[(n1 + 1) * a_dim1
  202. + 1], lda, &a[a_dim1 + 1], lda, beta, &c__[n1 + 1]
  203. , n);
  204. }
  205. } else {
  206. /* N is odd, TRANSR = 'N', and UPLO = 'U' */
  207. if (notrans) {
  208. /* N is odd, TRANSR = 'N', UPLO = 'U', and TRANS = 'N' */
  209. _starpu_dsyrk_("L", "N", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
  210. &c__[n2 + 1], n);
  211. _starpu_dsyrk_("U", "N", &n2, k, alpha, &a[n2 + a_dim1], lda,
  212. beta, &c__[n1 + 1], n);
  213. _starpu_dgemm_("N", "T", &n1, &n2, k, alpha, &a[a_dim1 + 1], lda,
  214. &a[n2 + a_dim1], lda, beta, &c__[1], n);
  215. } else {
  216. /* N is odd, TRANSR = 'N', UPLO = 'U', and TRANS = 'T' */
  217. _starpu_dsyrk_("L", "T", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
  218. &c__[n2 + 1], n);
  219. _starpu_dsyrk_("U", "T", &n2, k, alpha, &a[n2 * a_dim1 + 1], lda,
  220. beta, &c__[n1 + 1], n);
  221. _starpu_dgemm_("T", "N", &n1, &n2, k, alpha, &a[a_dim1 + 1], lda,
  222. &a[n2 * a_dim1 + 1], lda, beta, &c__[1], n);
  223. }
  224. }
  225. } else {
  226. /* N is odd, and TRANSR = 'T' */
  227. if (lower) {
  228. /* N is odd, TRANSR = 'T', and UPLO = 'L' */
  229. if (notrans) {
  230. /* N is odd, TRANSR = 'T', UPLO = 'L', and TRANS = 'N' */
  231. _starpu_dsyrk_("U", "N", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
  232. &c__[1], &n1);
  233. _starpu_dsyrk_("L", "N", &n2, k, alpha, &a[n1 + 1 + a_dim1], lda,
  234. beta, &c__[2], &n1);
  235. _starpu_dgemm_("N", "T", &n1, &n2, k, alpha, &a[a_dim1 + 1], lda,
  236. &a[n1 + 1 + a_dim1], lda, beta, &c__[n1 * n1 + 1],
  237. &n1);
  238. } else {
  239. /* N is odd, TRANSR = 'T', UPLO = 'L', and TRANS = 'T' */
  240. _starpu_dsyrk_("U", "T", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
  241. &c__[1], &n1);
  242. _starpu_dsyrk_("L", "T", &n2, k, alpha, &a[(n1 + 1) * a_dim1 + 1],
  243. lda, beta, &c__[2], &n1);
  244. _starpu_dgemm_("T", "N", &n1, &n2, k, alpha, &a[a_dim1 + 1], lda,
  245. &a[(n1 + 1) * a_dim1 + 1], lda, beta, &c__[n1 *
  246. n1 + 1], &n1);
  247. }
  248. } else {
  249. /* N is odd, TRANSR = 'T', and UPLO = 'U' */
  250. if (notrans) {
  251. /* N is odd, TRANSR = 'T', UPLO = 'U', and TRANS = 'N' */
  252. _starpu_dsyrk_("U", "N", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
  253. &c__[n2 * n2 + 1], &n2);
  254. _starpu_dsyrk_("L", "N", &n2, k, alpha, &a[n1 + 1 + a_dim1], lda,
  255. beta, &c__[n1 * n2 + 1], &n2);
  256. _starpu_dgemm_("N", "T", &n2, &n1, k, alpha, &a[n1 + 1 + a_dim1],
  257. lda, &a[a_dim1 + 1], lda, beta, &c__[1], &n2);
  258. } else {
  259. /* N is odd, TRANSR = 'T', UPLO = 'U', and TRANS = 'T' */
  260. _starpu_dsyrk_("U", "T", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
  261. &c__[n2 * n2 + 1], &n2);
  262. _starpu_dsyrk_("L", "T", &n2, k, alpha, &a[(n1 + 1) * a_dim1 + 1],
  263. lda, beta, &c__[n1 * n2 + 1], &n2);
  264. _starpu_dgemm_("T", "N", &n2, &n1, k, alpha, &a[(n1 + 1) * a_dim1
  265. + 1], lda, &a[a_dim1 + 1], lda, beta, &c__[1], &
  266. n2);
  267. }
  268. }
  269. }
  270. } else {
  271. /* N is even */
  272. if (normaltransr) {
  273. /* N is even and TRANSR = 'N' */
  274. if (lower) {
  275. /* N is even, TRANSR = 'N', and UPLO = 'L' */
  276. if (notrans) {
  277. /* N is even, TRANSR = 'N', UPLO = 'L', and TRANS = 'N' */
  278. i__1 = *n + 1;
  279. _starpu_dsyrk_("L", "N", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
  280. &c__[2], &i__1);
  281. i__1 = *n + 1;
  282. _starpu_dsyrk_("U", "N", &nk, k, alpha, &a[nk + 1 + a_dim1], lda,
  283. beta, &c__[1], &i__1);
  284. i__1 = *n + 1;
  285. _starpu_dgemm_("N", "T", &nk, &nk, k, alpha, &a[nk + 1 + a_dim1],
  286. lda, &a[a_dim1 + 1], lda, beta, &c__[nk + 2], &
  287. i__1);
  288. } else {
  289. /* N is even, TRANSR = 'N', UPLO = 'L', and TRANS = 'T' */
  290. i__1 = *n + 1;
  291. _starpu_dsyrk_("L", "T", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
  292. &c__[2], &i__1);
  293. i__1 = *n + 1;
  294. _starpu_dsyrk_("U", "T", &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1],
  295. lda, beta, &c__[1], &i__1);
  296. i__1 = *n + 1;
  297. _starpu_dgemm_("T", "N", &nk, &nk, k, alpha, &a[(nk + 1) * a_dim1
  298. + 1], lda, &a[a_dim1 + 1], lda, beta, &c__[nk + 2]
  299. , &i__1);
  300. }
  301. } else {
  302. /* N is even, TRANSR = 'N', and UPLO = 'U' */
  303. if (notrans) {
  304. /* N is even, TRANSR = 'N', UPLO = 'U', and TRANS = 'N' */
  305. i__1 = *n + 1;
  306. _starpu_dsyrk_("L", "N", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
  307. &c__[nk + 2], &i__1);
  308. i__1 = *n + 1;
  309. _starpu_dsyrk_("U", "N", &nk, k, alpha, &a[nk + 1 + a_dim1], lda,
  310. beta, &c__[nk + 1], &i__1);
  311. i__1 = *n + 1;
  312. _starpu_dgemm_("N", "T", &nk, &nk, k, alpha, &a[a_dim1 + 1], lda,
  313. &a[nk + 1 + a_dim1], lda, beta, &c__[1], &i__1);
  314. } else {
  315. /* N is even, TRANSR = 'N', UPLO = 'U', and TRANS = 'T' */
  316. i__1 = *n + 1;
  317. _starpu_dsyrk_("L", "T", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
  318. &c__[nk + 2], &i__1);
  319. i__1 = *n + 1;
  320. _starpu_dsyrk_("U", "T", &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1],
  321. lda, beta, &c__[nk + 1], &i__1);
  322. i__1 = *n + 1;
  323. _starpu_dgemm_("T", "N", &nk, &nk, k, alpha, &a[a_dim1 + 1], lda,
  324. &a[(nk + 1) * a_dim1 + 1], lda, beta, &c__[1], &
  325. i__1);
  326. }
  327. }
  328. } else {
  329. /* N is even, and TRANSR = 'T' */
  330. if (lower) {
  331. /* N is even, TRANSR = 'T', and UPLO = 'L' */
  332. if (notrans) {
  333. /* N is even, TRANSR = 'T', UPLO = 'L', and TRANS = 'N' */
  334. _starpu_dsyrk_("U", "N", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
  335. &c__[nk + 1], &nk);
  336. _starpu_dsyrk_("L", "N", &nk, k, alpha, &a[nk + 1 + a_dim1], lda,
  337. beta, &c__[1], &nk);
  338. _starpu_dgemm_("N", "T", &nk, &nk, k, alpha, &a[a_dim1 + 1], lda,
  339. &a[nk + 1 + a_dim1], lda, beta, &c__[(nk + 1) *
  340. nk + 1], &nk);
  341. } else {
  342. /* N is even, TRANSR = 'T', UPLO = 'L', and TRANS = 'T' */
  343. _starpu_dsyrk_("U", "T", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
  344. &c__[nk + 1], &nk);
  345. _starpu_dsyrk_("L", "T", &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1],
  346. lda, beta, &c__[1], &nk);
  347. _starpu_dgemm_("T", "N", &nk, &nk, k, alpha, &a[a_dim1 + 1], lda,
  348. &a[(nk + 1) * a_dim1 + 1], lda, beta, &c__[(nk +
  349. 1) * nk + 1], &nk);
  350. }
  351. } else {
  352. /* N is even, TRANSR = 'T', and UPLO = 'U' */
  353. if (notrans) {
  354. /* N is even, TRANSR = 'T', UPLO = 'U', and TRANS = 'N' */
  355. _starpu_dsyrk_("U", "N", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
  356. &c__[nk * (nk + 1) + 1], &nk);
  357. _starpu_dsyrk_("L", "N", &nk, k, alpha, &a[nk + 1 + a_dim1], lda,
  358. beta, &c__[nk * nk + 1], &nk);
  359. _starpu_dgemm_("N", "T", &nk, &nk, k, alpha, &a[nk + 1 + a_dim1],
  360. lda, &a[a_dim1 + 1], lda, beta, &c__[1], &nk);
  361. } else {
  362. /* N is even, TRANSR = 'T', UPLO = 'U', and TRANS = 'T' */
  363. _starpu_dsyrk_("U", "T", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
  364. &c__[nk * (nk + 1) + 1], &nk);
  365. _starpu_dsyrk_("L", "T", &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1],
  366. lda, beta, &c__[nk * nk + 1], &nk);
  367. _starpu_dgemm_("T", "N", &nk, &nk, k, alpha, &a[(nk + 1) * a_dim1
  368. + 1], lda, &a[a_dim1 + 1], lda, beta, &c__[1], &
  369. nk);
  370. }
  371. }
  372. }
  373. }
  374. return 0;
  375. /* End of DSFRK */
  376. } /* _starpu_dsfrk_ */