123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518 |
- /* dsfrk.f -- translated by f2c (version 20061008).
- You must link the resulting object file with libf2c:
- on Microsoft Windows system, link with libf2c.lib;
- on Linux or Unix systems, link with .../path/to/libf2c.a -lm
- or, if you install libf2c.a in a standard place, with -lf2c -lm
- -- in that order, at the end of the command line, as in
- cc *.o -lf2c -lm
- Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
- http://www.netlib.org/f2c/libf2c.zip
- */
- #include "f2c.h"
- #include "blaswrap.h"
- /* Subroutine */ int _starpu_dsfrk_(char *transr, char *uplo, char *trans, integer *n,
- integer *k, doublereal *alpha, doublereal *a, integer *lda,
- doublereal *beta, doublereal *c__)
- {
- /* System generated locals */
- integer a_dim1, a_offset, i__1;
- /* Local variables */
- integer j, n1, n2, nk, info;
- logical normaltransr;
- extern /* Subroutine */ int _starpu_dgemm_(char *, char *, integer *, integer *,
- integer *, doublereal *, doublereal *, integer *, doublereal *,
- integer *, doublereal *, doublereal *, integer *);
- extern logical _starpu_lsame_(char *, char *);
- integer nrowa;
- logical lower;
- extern /* Subroutine */ int _starpu_dsyrk_(char *, char *, integer *, integer *,
- doublereal *, doublereal *, integer *, doublereal *, doublereal *,
- integer *), _starpu_xerbla_(char *, integer *);
- logical nisodd, notrans;
- /* -- LAPACK routine (version 3.2) -- */
- /* -- Contributed by Julien Langou of the Univ. of Colorado Denver -- */
- /* -- November 2008 -- */
- /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */
- /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
- /* .. */
- /* .. Scalar Arguments .. */
- /* .. */
- /* .. Array Arguments .. */
- /* .. */
- /* Purpose */
- /* ======= */
- /* Level 3 BLAS like routine for C in RFP Format. */
- /* DSFRK performs one of the symmetric rank--k operations */
- /* C := alpha*A*A' + beta*C, */
- /* or */
- /* C := alpha*A'*A + beta*C, */
- /* where alpha and beta are real scalars, C is an n--by--n symmetric */
- /* matrix and A is an n--by--k matrix in the first case and a k--by--n */
- /* matrix in the second case. */
- /* Arguments */
- /* ========== */
- /* TRANSR (input) CHARACTER */
- /* = 'N': The Normal Form of RFP A is stored; */
- /* = 'T': The Transpose Form of RFP A is stored. */
- /* UPLO - (input) CHARACTER */
- /* On entry, UPLO specifies whether the upper or lower */
- /* triangular part of the array C is to be referenced as */
- /* follows: */
- /* UPLO = 'U' or 'u' Only the upper triangular part of C */
- /* is to be referenced. */
- /* UPLO = 'L' or 'l' Only the lower triangular part of C */
- /* is to be referenced. */
- /* Unchanged on exit. */
- /* TRANS - (input) CHARACTER */
- /* On entry, TRANS specifies the operation to be performed as */
- /* follows: */
- /* TRANS = 'N' or 'n' C := alpha*A*A' + beta*C. */
- /* TRANS = 'T' or 't' C := alpha*A'*A + beta*C. */
- /* Unchanged on exit. */
- /* N - (input) INTEGER. */
- /* On entry, N specifies the order of the matrix C. N must be */
- /* at least zero. */
- /* Unchanged on exit. */
- /* K - (input) INTEGER. */
- /* On entry with TRANS = 'N' or 'n', K specifies the number */
- /* of columns of the matrix A, and on entry with TRANS = 'T' */
- /* or 't', K specifies the number of rows of the matrix A. K */
- /* must be at least zero. */
- /* Unchanged on exit. */
- /* ALPHA - (input) DOUBLE PRECISION. */
- /* On entry, ALPHA specifies the scalar alpha. */
- /* Unchanged on exit. */
- /* A - (input) DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where KA */
- /* is K when TRANS = 'N' or 'n', and is N otherwise. Before */
- /* entry with TRANS = 'N' or 'n', the leading N--by--K part of */
- /* the array A must contain the matrix A, otherwise the leading */
- /* K--by--N part of the array A must contain the matrix A. */
- /* Unchanged on exit. */
- /* LDA - (input) INTEGER. */
- /* On entry, LDA specifies the first dimension of A as declared */
- /* in the calling (sub) program. When TRANS = 'N' or 'n' */
- /* then LDA must be at least max( 1, n ), otherwise LDA must */
- /* be at least max( 1, k ). */
- /* Unchanged on exit. */
- /* BETA - (input) DOUBLE PRECISION. */
- /* On entry, BETA specifies the scalar beta. */
- /* Unchanged on exit. */
- /* C - (input/output) DOUBLE PRECISION array, dimension ( NT ); */
- /* NT = N*(N+1)/2. On entry, the symmetric matrix C in RFP */
- /* Format. RFP Format is described by TRANSR, UPLO and N. */
- /* Arguments */
- /* ========== */
- /* .. */
- /* .. Parameters .. */
- /* .. */
- /* .. Local Scalars .. */
- /* .. */
- /* .. External Functions .. */
- /* .. */
- /* .. External Subroutines .. */
- /* .. */
- /* .. Intrinsic Functions .. */
- /* .. */
- /* .. Executable Statements .. */
- /* Test the input parameters. */
- /* Parameter adjustments */
- a_dim1 = *lda;
- a_offset = 1 + a_dim1;
- a -= a_offset;
- --c__;
- /* Function Body */
- info = 0;
- normaltransr = _starpu_lsame_(transr, "N");
- lower = _starpu_lsame_(uplo, "L");
- notrans = _starpu_lsame_(trans, "N");
- if (notrans) {
- nrowa = *n;
- } else {
- nrowa = *k;
- }
- if (! normaltransr && ! _starpu_lsame_(transr, "T")) {
- info = -1;
- } else if (! lower && ! _starpu_lsame_(uplo, "U")) {
- info = -2;
- } else if (! notrans && ! _starpu_lsame_(trans, "T")) {
- info = -3;
- } else if (*n < 0) {
- info = -4;
- } else if (*k < 0) {
- info = -5;
- } else if (*lda < max(1,nrowa)) {
- info = -8;
- }
- if (info != 0) {
- i__1 = -info;
- _starpu_xerbla_("DSFRK ", &i__1);
- return 0;
- }
- /* Quick return if possible. */
- /* The quick return case: ((ALPHA.EQ.0).AND.(BETA.NE.ZERO)) is not */
- /* done (it is in DSYRK for example) and left in the general case. */
- if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) {
- return 0;
- }
- if (*alpha == 0. && *beta == 0.) {
- i__1 = *n * (*n + 1) / 2;
- for (j = 1; j <= i__1; ++j) {
- c__[j] = 0.;
- }
- return 0;
- }
- /* C is N-by-N. */
- /* If N is odd, set NISODD = .TRUE., and N1 and N2. */
- /* If N is even, NISODD = .FALSE., and NK. */
- if (*n % 2 == 0) {
- nisodd = FALSE_;
- nk = *n / 2;
- } else {
- nisodd = TRUE_;
- if (lower) {
- n2 = *n / 2;
- n1 = *n - n2;
- } else {
- n1 = *n / 2;
- n2 = *n - n1;
- }
- }
- if (nisodd) {
- /* N is odd */
- if (normaltransr) {
- /* N is odd and TRANSR = 'N' */
- if (lower) {
- /* N is odd, TRANSR = 'N', and UPLO = 'L' */
- if (notrans) {
- /* N is odd, TRANSR = 'N', UPLO = 'L', and TRANS = 'N' */
- _starpu_dsyrk_("L", "N", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[1], n);
- _starpu_dsyrk_("U", "N", &n2, k, alpha, &a[n1 + 1 + a_dim1], lda,
- beta, &c__[*n + 1], n);
- _starpu_dgemm_("N", "T", &n2, &n1, k, alpha, &a[n1 + 1 + a_dim1],
- lda, &a[a_dim1 + 1], lda, beta, &c__[n1 + 1], n);
- } else {
- /* N is odd, TRANSR = 'N', UPLO = 'L', and TRANS = 'T' */
- _starpu_dsyrk_("L", "T", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[1], n);
- _starpu_dsyrk_("U", "T", &n2, k, alpha, &a[(n1 + 1) * a_dim1 + 1],
- lda, beta, &c__[*n + 1], n)
- ;
- _starpu_dgemm_("T", "N", &n2, &n1, k, alpha, &a[(n1 + 1) * a_dim1
- + 1], lda, &a[a_dim1 + 1], lda, beta, &c__[n1 + 1]
- , n);
- }
- } else {
- /* N is odd, TRANSR = 'N', and UPLO = 'U' */
- if (notrans) {
- /* N is odd, TRANSR = 'N', UPLO = 'U', and TRANS = 'N' */
- _starpu_dsyrk_("L", "N", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[n2 + 1], n);
- _starpu_dsyrk_("U", "N", &n2, k, alpha, &a[n2 + a_dim1], lda,
- beta, &c__[n1 + 1], n);
- _starpu_dgemm_("N", "T", &n1, &n2, k, alpha, &a[a_dim1 + 1], lda,
- &a[n2 + a_dim1], lda, beta, &c__[1], n);
- } else {
- /* N is odd, TRANSR = 'N', UPLO = 'U', and TRANS = 'T' */
- _starpu_dsyrk_("L", "T", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[n2 + 1], n);
- _starpu_dsyrk_("U", "T", &n2, k, alpha, &a[n2 * a_dim1 + 1], lda,
- beta, &c__[n1 + 1], n);
- _starpu_dgemm_("T", "N", &n1, &n2, k, alpha, &a[a_dim1 + 1], lda,
- &a[n2 * a_dim1 + 1], lda, beta, &c__[1], n);
- }
- }
- } else {
- /* N is odd, and TRANSR = 'T' */
- if (lower) {
- /* N is odd, TRANSR = 'T', and UPLO = 'L' */
- if (notrans) {
- /* N is odd, TRANSR = 'T', UPLO = 'L', and TRANS = 'N' */
- _starpu_dsyrk_("U", "N", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[1], &n1);
- _starpu_dsyrk_("L", "N", &n2, k, alpha, &a[n1 + 1 + a_dim1], lda,
- beta, &c__[2], &n1);
- _starpu_dgemm_("N", "T", &n1, &n2, k, alpha, &a[a_dim1 + 1], lda,
- &a[n1 + 1 + a_dim1], lda, beta, &c__[n1 * n1 + 1],
- &n1);
- } else {
- /* N is odd, TRANSR = 'T', UPLO = 'L', and TRANS = 'T' */
- _starpu_dsyrk_("U", "T", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[1], &n1);
- _starpu_dsyrk_("L", "T", &n2, k, alpha, &a[(n1 + 1) * a_dim1 + 1],
- lda, beta, &c__[2], &n1);
- _starpu_dgemm_("T", "N", &n1, &n2, k, alpha, &a[a_dim1 + 1], lda,
- &a[(n1 + 1) * a_dim1 + 1], lda, beta, &c__[n1 *
- n1 + 1], &n1);
- }
- } else {
- /* N is odd, TRANSR = 'T', and UPLO = 'U' */
- if (notrans) {
- /* N is odd, TRANSR = 'T', UPLO = 'U', and TRANS = 'N' */
- _starpu_dsyrk_("U", "N", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[n2 * n2 + 1], &n2);
- _starpu_dsyrk_("L", "N", &n2, k, alpha, &a[n1 + 1 + a_dim1], lda,
- beta, &c__[n1 * n2 + 1], &n2);
- _starpu_dgemm_("N", "T", &n2, &n1, k, alpha, &a[n1 + 1 + a_dim1],
- lda, &a[a_dim1 + 1], lda, beta, &c__[1], &n2);
- } else {
- /* N is odd, TRANSR = 'T', UPLO = 'U', and TRANS = 'T' */
- _starpu_dsyrk_("U", "T", &n1, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[n2 * n2 + 1], &n2);
- _starpu_dsyrk_("L", "T", &n2, k, alpha, &a[(n1 + 1) * a_dim1 + 1],
- lda, beta, &c__[n1 * n2 + 1], &n2);
- _starpu_dgemm_("T", "N", &n2, &n1, k, alpha, &a[(n1 + 1) * a_dim1
- + 1], lda, &a[a_dim1 + 1], lda, beta, &c__[1], &
- n2);
- }
- }
- }
- } else {
- /* N is even */
- if (normaltransr) {
- /* N is even and TRANSR = 'N' */
- if (lower) {
- /* N is even, TRANSR = 'N', and UPLO = 'L' */
- if (notrans) {
- /* N is even, TRANSR = 'N', UPLO = 'L', and TRANS = 'N' */
- i__1 = *n + 1;
- _starpu_dsyrk_("L", "N", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[2], &i__1);
- i__1 = *n + 1;
- _starpu_dsyrk_("U", "N", &nk, k, alpha, &a[nk + 1 + a_dim1], lda,
- beta, &c__[1], &i__1);
- i__1 = *n + 1;
- _starpu_dgemm_("N", "T", &nk, &nk, k, alpha, &a[nk + 1 + a_dim1],
- lda, &a[a_dim1 + 1], lda, beta, &c__[nk + 2], &
- i__1);
- } else {
- /* N is even, TRANSR = 'N', UPLO = 'L', and TRANS = 'T' */
- i__1 = *n + 1;
- _starpu_dsyrk_("L", "T", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[2], &i__1);
- i__1 = *n + 1;
- _starpu_dsyrk_("U", "T", &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1],
- lda, beta, &c__[1], &i__1);
- i__1 = *n + 1;
- _starpu_dgemm_("T", "N", &nk, &nk, k, alpha, &a[(nk + 1) * a_dim1
- + 1], lda, &a[a_dim1 + 1], lda, beta, &c__[nk + 2]
- , &i__1);
- }
- } else {
- /* N is even, TRANSR = 'N', and UPLO = 'U' */
- if (notrans) {
- /* N is even, TRANSR = 'N', UPLO = 'U', and TRANS = 'N' */
- i__1 = *n + 1;
- _starpu_dsyrk_("L", "N", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[nk + 2], &i__1);
- i__1 = *n + 1;
- _starpu_dsyrk_("U", "N", &nk, k, alpha, &a[nk + 1 + a_dim1], lda,
- beta, &c__[nk + 1], &i__1);
- i__1 = *n + 1;
- _starpu_dgemm_("N", "T", &nk, &nk, k, alpha, &a[a_dim1 + 1], lda,
- &a[nk + 1 + a_dim1], lda, beta, &c__[1], &i__1);
- } else {
- /* N is even, TRANSR = 'N', UPLO = 'U', and TRANS = 'T' */
- i__1 = *n + 1;
- _starpu_dsyrk_("L", "T", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[nk + 2], &i__1);
- i__1 = *n + 1;
- _starpu_dsyrk_("U", "T", &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1],
- lda, beta, &c__[nk + 1], &i__1);
- i__1 = *n + 1;
- _starpu_dgemm_("T", "N", &nk, &nk, k, alpha, &a[a_dim1 + 1], lda,
- &a[(nk + 1) * a_dim1 + 1], lda, beta, &c__[1], &
- i__1);
- }
- }
- } else {
- /* N is even, and TRANSR = 'T' */
- if (lower) {
- /* N is even, TRANSR = 'T', and UPLO = 'L' */
- if (notrans) {
- /* N is even, TRANSR = 'T', UPLO = 'L', and TRANS = 'N' */
- _starpu_dsyrk_("U", "N", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[nk + 1], &nk);
- _starpu_dsyrk_("L", "N", &nk, k, alpha, &a[nk + 1 + a_dim1], lda,
- beta, &c__[1], &nk);
- _starpu_dgemm_("N", "T", &nk, &nk, k, alpha, &a[a_dim1 + 1], lda,
- &a[nk + 1 + a_dim1], lda, beta, &c__[(nk + 1) *
- nk + 1], &nk);
- } else {
- /* N is even, TRANSR = 'T', UPLO = 'L', and TRANS = 'T' */
- _starpu_dsyrk_("U", "T", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[nk + 1], &nk);
- _starpu_dsyrk_("L", "T", &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1],
- lda, beta, &c__[1], &nk);
- _starpu_dgemm_("T", "N", &nk, &nk, k, alpha, &a[a_dim1 + 1], lda,
- &a[(nk + 1) * a_dim1 + 1], lda, beta, &c__[(nk +
- 1) * nk + 1], &nk);
- }
- } else {
- /* N is even, TRANSR = 'T', and UPLO = 'U' */
- if (notrans) {
- /* N is even, TRANSR = 'T', UPLO = 'U', and TRANS = 'N' */
- _starpu_dsyrk_("U", "N", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[nk * (nk + 1) + 1], &nk);
- _starpu_dsyrk_("L", "N", &nk, k, alpha, &a[nk + 1 + a_dim1], lda,
- beta, &c__[nk * nk + 1], &nk);
- _starpu_dgemm_("N", "T", &nk, &nk, k, alpha, &a[nk + 1 + a_dim1],
- lda, &a[a_dim1 + 1], lda, beta, &c__[1], &nk);
- } else {
- /* N is even, TRANSR = 'T', UPLO = 'U', and TRANS = 'T' */
- _starpu_dsyrk_("U", "T", &nk, k, alpha, &a[a_dim1 + 1], lda, beta,
- &c__[nk * (nk + 1) + 1], &nk);
- _starpu_dsyrk_("L", "T", &nk, k, alpha, &a[(nk + 1) * a_dim1 + 1],
- lda, beta, &c__[nk * nk + 1], &nk);
- _starpu_dgemm_("T", "N", &nk, &nk, k, alpha, &a[(nk + 1) * a_dim1
- + 1], lda, &a[a_dim1 + 1], lda, beta, &c__[1], &
- nk);
- }
- }
- }
- }
- return 0;
- /* End of DSFRK */
- } /* _starpu_dsfrk_ */
|