Chris@202: /* dtrsm.f -- translated by f2c (version 20061008). Chris@202: You must link the resulting object file with libf2c: Chris@202: on Microsoft Windows system, link with libf2c.lib; Chris@202: on Linux or Unix systems, link with .../path/to/libf2c.a -lm Chris@202: or, if you install libf2c.a in a standard place, with -lf2c -lm Chris@202: -- in that order, at the end of the command line, as in Chris@202: cc *.o -lf2c -lm Chris@202: Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., Chris@202: Chris@202: http://www.netlib.org/f2c/libf2c.zip Chris@202: */ Chris@202: Chris@202: #include "f2c.h" Chris@202: #include "blaswrap.h" Chris@202: Chris@202: /* Subroutine */ int dtrsm_(char *side, char *uplo, char *transa, char *diag, Chris@202: integer *m, integer *n, doublereal *alpha, doublereal *a, integer * Chris@202: lda, doublereal *b, integer *ldb) Chris@202: { Chris@202: /* System generated locals */ Chris@202: integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; Chris@202: Chris@202: /* Local variables */ Chris@202: integer i__, j, k, info; Chris@202: doublereal temp; Chris@202: logical lside; Chris@202: extern logical lsame_(char *, char *); Chris@202: integer nrowa; Chris@202: logical upper; Chris@202: extern /* Subroutine */ int xerbla_(char *, integer *); Chris@202: logical nounit; Chris@202: Chris@202: /* .. Scalar Arguments .. */ Chris@202: /* .. */ Chris@202: /* .. Array Arguments .. */ Chris@202: /* .. */ Chris@202: Chris@202: /* Purpose */ Chris@202: /* ======= */ Chris@202: Chris@202: /* DTRSM solves one of the matrix equations */ Chris@202: Chris@202: /* op( A )*X = alpha*B, or X*op( A ) = alpha*B, */ Chris@202: Chris@202: /* where alpha is a scalar, X and B are m by n matrices, A is a unit, or */ Chris@202: /* non-unit, upper or lower triangular matrix and op( A ) is one of */ Chris@202: Chris@202: /* op( A ) = A or op( A ) = A'. */ Chris@202: Chris@202: /* The matrix X is overwritten on B. */ Chris@202: Chris@202: /* Arguments */ Chris@202: /* ========== */ Chris@202: Chris@202: /* SIDE - CHARACTER*1. */ Chris@202: /* On entry, SIDE specifies whether op( A ) appears on the left */ Chris@202: /* or right of X as follows: */ Chris@202: Chris@202: /* SIDE = 'L' or 'l' op( A )*X = alpha*B. */ Chris@202: Chris@202: /* SIDE = 'R' or 'r' X*op( A ) = alpha*B. */ Chris@202: Chris@202: /* Unchanged on exit. */ Chris@202: Chris@202: /* UPLO - CHARACTER*1. */ Chris@202: /* On entry, UPLO specifies whether the matrix A is an upper or */ Chris@202: /* lower triangular matrix as follows: */ Chris@202: Chris@202: /* UPLO = 'U' or 'u' A is an upper triangular matrix. */ Chris@202: Chris@202: /* UPLO = 'L' or 'l' A is a lower triangular matrix. */ Chris@202: Chris@202: /* Unchanged on exit. */ Chris@202: Chris@202: /* TRANSA - CHARACTER*1. */ Chris@202: /* On entry, TRANSA specifies the form of op( A ) to be used in */ Chris@202: /* the matrix multiplication as follows: */ Chris@202: Chris@202: /* TRANSA = 'N' or 'n' op( A ) = A. */ Chris@202: Chris@202: /* TRANSA = 'T' or 't' op( A ) = A'. */ Chris@202: Chris@202: /* TRANSA = 'C' or 'c' op( A ) = A'. */ Chris@202: Chris@202: /* Unchanged on exit. */ Chris@202: Chris@202: /* DIAG - CHARACTER*1. */ Chris@202: /* On entry, DIAG specifies whether or not A is unit triangular */ Chris@202: /* as follows: */ Chris@202: Chris@202: /* DIAG = 'U' or 'u' A is assumed to be unit triangular. */ Chris@202: Chris@202: /* DIAG = 'N' or 'n' A is not assumed to be unit */ Chris@202: /* triangular. */ Chris@202: Chris@202: /* Unchanged on exit. */ Chris@202: Chris@202: /* M - INTEGER. */ Chris@202: /* On entry, M specifies the number of rows of B. M must be at */ Chris@202: /* least zero. */ Chris@202: /* Unchanged on exit. */ Chris@202: Chris@202: /* N - INTEGER. */ Chris@202: /* On entry, N specifies the number of columns of B. N must be */ Chris@202: /* at least zero. */ Chris@202: /* Unchanged on exit. */ Chris@202: Chris@202: /* ALPHA - DOUBLE PRECISION. */ Chris@202: /* On entry, ALPHA specifies the scalar alpha. When alpha is */ Chris@202: /* zero then A is not referenced and B need not be set before */ Chris@202: /* entry. */ Chris@202: /* Unchanged on exit. */ Chris@202: Chris@202: /* A - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m */ Chris@202: /* when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. */ Chris@202: /* Before entry with UPLO = 'U' or 'u', the leading k by k */ Chris@202: /* upper triangular part of the array A must contain the upper */ Chris@202: /* triangular matrix and the strictly lower triangular part of */ Chris@202: /* A is not referenced. */ Chris@202: /* Before entry with UPLO = 'L' or 'l', the leading k by k */ Chris@202: /* lower triangular part of the array A must contain the lower */ Chris@202: /* triangular matrix and the strictly upper triangular part of */ Chris@202: /* A is not referenced. */ Chris@202: /* Note that when DIAG = 'U' or 'u', the diagonal elements of */ Chris@202: /* A are not referenced either, but are assumed to be unity. */ Chris@202: /* Unchanged on exit. */ Chris@202: Chris@202: /* LDA - INTEGER. */ Chris@202: /* On entry, LDA specifies the first dimension of A as declared */ Chris@202: /* in the calling (sub) program. When SIDE = 'L' or 'l' then */ Chris@202: /* LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' */ Chris@202: /* then LDA must be at least max( 1, n ). */ Chris@202: /* Unchanged on exit. */ Chris@202: Chris@202: /* B - DOUBLE PRECISION array of DIMENSION ( LDB, n ). */ Chris@202: /* Before entry, the leading m by n part of the array B must */ Chris@202: /* contain the right-hand side matrix B, and on exit is */ Chris@202: /* overwritten by the solution matrix X. */ Chris@202: Chris@202: /* LDB - INTEGER. */ Chris@202: /* On entry, LDB specifies the first dimension of B as declared */ Chris@202: /* in the calling (sub) program. LDB must be at least */ Chris@202: /* max( 1, m ). */ Chris@202: /* Unchanged on exit. */ Chris@202: Chris@202: Chris@202: /* Level 3 Blas routine. */ Chris@202: Chris@202: Chris@202: /* -- Written on 8-February-1989. */ Chris@202: /* Jack Dongarra, Argonne National Laboratory. */ Chris@202: /* Iain Duff, AERE Harwell. */ Chris@202: /* Jeremy Du Croz, Numerical Algorithms Group Ltd. */ Chris@202: /* Sven Hammarling, Numerical Algorithms Group Ltd. */ Chris@202: Chris@202: Chris@202: /* .. External Functions .. */ Chris@202: /* .. */ Chris@202: /* .. External Subroutines .. */ Chris@202: /* .. */ Chris@202: /* .. Intrinsic Functions .. */ Chris@202: /* .. */ Chris@202: /* .. Local Scalars .. */ Chris@202: /* .. */ Chris@202: /* .. Parameters .. */ Chris@202: /* .. */ Chris@202: Chris@202: /* Test the input parameters. */ Chris@202: Chris@202: /* Parameter adjustments */ Chris@202: a_dim1 = *lda; Chris@202: a_offset = 1 + a_dim1; Chris@202: a -= a_offset; Chris@202: b_dim1 = *ldb; Chris@202: b_offset = 1 + b_dim1; Chris@202: b -= b_offset; Chris@202: Chris@202: /* Function Body */ Chris@202: lside = lsame_(side, "L"); Chris@202: if (lside) { Chris@202: nrowa = *m; Chris@202: } else { Chris@202: nrowa = *n; Chris@202: } Chris@202: nounit = lsame_(diag, "N"); Chris@202: upper = lsame_(uplo, "U"); Chris@202: Chris@202: info = 0; Chris@202: if (! lside && ! lsame_(side, "R")) { Chris@202: info = 1; Chris@202: } else if (! upper && ! lsame_(uplo, "L")) { Chris@202: info = 2; Chris@202: } else if (! lsame_(transa, "N") && ! lsame_(transa, Chris@202: "T") && ! lsame_(transa, "C")) { Chris@202: info = 3; Chris@202: } else if (! lsame_(diag, "U") && ! lsame_(diag, Chris@202: "N")) { Chris@202: info = 4; Chris@202: } else if (*m < 0) { Chris@202: info = 5; Chris@202: } else if (*n < 0) { Chris@202: info = 6; Chris@202: } else if (*lda < max(1,nrowa)) { Chris@202: info = 9; Chris@202: } else if (*ldb < max(1,*m)) { Chris@202: info = 11; Chris@202: } Chris@202: if (info != 0) { Chris@202: xerbla_("DTRSM ", &info); Chris@202: return 0; Chris@202: } Chris@202: Chris@202: /* Quick return if possible. */ Chris@202: Chris@202: if (*m == 0 || *n == 0) { Chris@202: return 0; Chris@202: } Chris@202: Chris@202: /* And when alpha.eq.zero. */ Chris@202: Chris@202: if (*alpha == 0.) { Chris@202: i__1 = *n; Chris@202: for (j = 1; j <= i__1; ++j) { Chris@202: i__2 = *m; Chris@202: for (i__ = 1; i__ <= i__2; ++i__) { Chris@202: b[i__ + j * b_dim1] = 0.; Chris@202: /* L10: */ Chris@202: } Chris@202: /* L20: */ Chris@202: } Chris@202: return 0; Chris@202: } Chris@202: Chris@202: /* Start the operations. */ Chris@202: Chris@202: if (lside) { Chris@202: if (lsame_(transa, "N")) { Chris@202: Chris@202: /* Form B := alpha*inv( A )*B. */ Chris@202: Chris@202: if (upper) { Chris@202: i__1 = *n; Chris@202: for (j = 1; j <= i__1; ++j) { Chris@202: if (*alpha != 1.) { Chris@202: i__2 = *m; Chris@202: for (i__ = 1; i__ <= i__2; ++i__) { Chris@202: b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] Chris@202: ; Chris@202: /* L30: */ Chris@202: } Chris@202: } Chris@202: for (k = *m; k >= 1; --k) { Chris@202: if (b[k + j * b_dim1] != 0.) { Chris@202: if (nounit) { Chris@202: b[k + j * b_dim1] /= a[k + k * a_dim1]; Chris@202: } Chris@202: i__2 = k - 1; Chris@202: for (i__ = 1; i__ <= i__2; ++i__) { Chris@202: b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ Chris@202: i__ + k * a_dim1]; Chris@202: /* L40: */ Chris@202: } Chris@202: } Chris@202: /* L50: */ Chris@202: } Chris@202: /* L60: */ Chris@202: } Chris@202: } else { Chris@202: i__1 = *n; Chris@202: for (j = 1; j <= i__1; ++j) { Chris@202: if (*alpha != 1.) { Chris@202: i__2 = *m; Chris@202: for (i__ = 1; i__ <= i__2; ++i__) { Chris@202: b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] Chris@202: ; Chris@202: /* L70: */ Chris@202: } Chris@202: } Chris@202: i__2 = *m; Chris@202: for (k = 1; k <= i__2; ++k) { Chris@202: if (b[k + j * b_dim1] != 0.) { Chris@202: if (nounit) { Chris@202: b[k + j * b_dim1] /= a[k + k * a_dim1]; Chris@202: } Chris@202: i__3 = *m; Chris@202: for (i__ = k + 1; i__ <= i__3; ++i__) { Chris@202: b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ Chris@202: i__ + k * a_dim1]; Chris@202: /* L80: */ Chris@202: } Chris@202: } Chris@202: /* L90: */ Chris@202: } Chris@202: /* L100: */ Chris@202: } Chris@202: } Chris@202: } else { Chris@202: Chris@202: /* Form B := alpha*inv( A' )*B. */ Chris@202: Chris@202: if (upper) { Chris@202: i__1 = *n; Chris@202: for (j = 1; j <= i__1; ++j) { Chris@202: i__2 = *m; Chris@202: for (i__ = 1; i__ <= i__2; ++i__) { Chris@202: temp = *alpha * b[i__ + j * b_dim1]; Chris@202: i__3 = i__ - 1; Chris@202: for (k = 1; k <= i__3; ++k) { Chris@202: temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; Chris@202: /* L110: */ Chris@202: } Chris@202: if (nounit) { Chris@202: temp /= a[i__ + i__ * a_dim1]; Chris@202: } Chris@202: b[i__ + j * b_dim1] = temp; Chris@202: /* L120: */ Chris@202: } Chris@202: /* L130: */ Chris@202: } Chris@202: } else { Chris@202: i__1 = *n; Chris@202: for (j = 1; j <= i__1; ++j) { Chris@202: for (i__ = *m; i__ >= 1; --i__) { Chris@202: temp = *alpha * b[i__ + j * b_dim1]; Chris@202: i__2 = *m; Chris@202: for (k = i__ + 1; k <= i__2; ++k) { Chris@202: temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; Chris@202: /* L140: */ Chris@202: } Chris@202: if (nounit) { Chris@202: temp /= a[i__ + i__ * a_dim1]; Chris@202: } Chris@202: b[i__ + j * b_dim1] = temp; Chris@202: /* L150: */ Chris@202: } Chris@202: /* L160: */ Chris@202: } Chris@202: } Chris@202: } Chris@202: } else { Chris@202: if (lsame_(transa, "N")) { Chris@202: Chris@202: /* Form B := alpha*B*inv( A ). */ Chris@202: Chris@202: if (upper) { Chris@202: i__1 = *n; Chris@202: for (j = 1; j <= i__1; ++j) { Chris@202: if (*alpha != 1.) { Chris@202: i__2 = *m; Chris@202: for (i__ = 1; i__ <= i__2; ++i__) { Chris@202: b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] Chris@202: ; Chris@202: /* L170: */ Chris@202: } Chris@202: } Chris@202: i__2 = j - 1; Chris@202: for (k = 1; k <= i__2; ++k) { Chris@202: if (a[k + j * a_dim1] != 0.) { Chris@202: i__3 = *m; Chris@202: for (i__ = 1; i__ <= i__3; ++i__) { Chris@202: b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ Chris@202: i__ + k * b_dim1]; Chris@202: /* L180: */ Chris@202: } Chris@202: } Chris@202: /* L190: */ Chris@202: } Chris@202: if (nounit) { Chris@202: temp = 1. / a[j + j * a_dim1]; Chris@202: i__2 = *m; Chris@202: for (i__ = 1; i__ <= i__2; ++i__) { Chris@202: b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; Chris@202: /* L200: */ Chris@202: } Chris@202: } Chris@202: /* L210: */ Chris@202: } Chris@202: } else { Chris@202: for (j = *n; j >= 1; --j) { Chris@202: if (*alpha != 1.) { Chris@202: i__1 = *m; Chris@202: for (i__ = 1; i__ <= i__1; ++i__) { Chris@202: b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] Chris@202: ; Chris@202: /* L220: */ Chris@202: } Chris@202: } Chris@202: i__1 = *n; Chris@202: for (k = j + 1; k <= i__1; ++k) { Chris@202: if (a[k + j * a_dim1] != 0.) { Chris@202: i__2 = *m; Chris@202: for (i__ = 1; i__ <= i__2; ++i__) { Chris@202: b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ Chris@202: i__ + k * b_dim1]; Chris@202: /* L230: */ Chris@202: } Chris@202: } Chris@202: /* L240: */ Chris@202: } Chris@202: if (nounit) { Chris@202: temp = 1. / a[j + j * a_dim1]; Chris@202: i__1 = *m; Chris@202: for (i__ = 1; i__ <= i__1; ++i__) { Chris@202: b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; Chris@202: /* L250: */ Chris@202: } Chris@202: } Chris@202: /* L260: */ Chris@202: } Chris@202: } Chris@202: } else { Chris@202: Chris@202: /* Form B := alpha*B*inv( A' ). */ Chris@202: Chris@202: if (upper) { Chris@202: for (k = *n; k >= 1; --k) { Chris@202: if (nounit) { Chris@202: temp = 1. / a[k + k * a_dim1]; Chris@202: i__1 = *m; Chris@202: for (i__ = 1; i__ <= i__1; ++i__) { Chris@202: b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; Chris@202: /* L270: */ Chris@202: } Chris@202: } Chris@202: i__1 = k - 1; Chris@202: for (j = 1; j <= i__1; ++j) { Chris@202: if (a[j + k * a_dim1] != 0.) { Chris@202: temp = a[j + k * a_dim1]; Chris@202: i__2 = *m; Chris@202: for (i__ = 1; i__ <= i__2; ++i__) { Chris@202: b[i__ + j * b_dim1] -= temp * b[i__ + k * Chris@202: b_dim1]; Chris@202: /* L280: */ Chris@202: } Chris@202: } Chris@202: /* L290: */ Chris@202: } Chris@202: if (*alpha != 1.) { Chris@202: i__1 = *m; Chris@202: for (i__ = 1; i__ <= i__1; ++i__) { Chris@202: b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] Chris@202: ; Chris@202: /* L300: */ Chris@202: } Chris@202: } Chris@202: /* L310: */ Chris@202: } Chris@202: } else { Chris@202: i__1 = *n; Chris@202: for (k = 1; k <= i__1; ++k) { Chris@202: if (nounit) { Chris@202: temp = 1. / a[k + k * a_dim1]; Chris@202: i__2 = *m; Chris@202: for (i__ = 1; i__ <= i__2; ++i__) { Chris@202: b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; Chris@202: /* L320: */ Chris@202: } Chris@202: } Chris@202: i__2 = *n; Chris@202: for (j = k + 1; j <= i__2; ++j) { Chris@202: if (a[j + k * a_dim1] != 0.) { Chris@202: temp = a[j + k * a_dim1]; Chris@202: i__3 = *m; Chris@202: for (i__ = 1; i__ <= i__3; ++i__) { Chris@202: b[i__ + j * b_dim1] -= temp * b[i__ + k * Chris@202: b_dim1]; Chris@202: /* L330: */ Chris@202: } Chris@202: } Chris@202: /* L340: */ Chris@202: } Chris@202: if (*alpha != 1.) { Chris@202: i__2 = *m; Chris@202: for (i__ = 1; i__ <= i__2; ++i__) { Chris@202: b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] Chris@202: ; Chris@202: /* L350: */ Chris@202: } Chris@202: } Chris@202: /* L360: */ Chris@202: } Chris@202: } Chris@202: } Chris@202: } Chris@202: Chris@202: return 0; Chris@202: Chris@202: /* End of DTRSM . */ Chris@202: Chris@202: } /* dtrsm_ */