Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages | Examples

dtrsm.c

Go to the documentation of this file.
00001 /* DTRSM.F -- translated by f2c (version 19941215).
00002    You must link the resulting object file with the libraries:
00003         -lf2c -lm   (in that order)
00004 */
00005 
00006 #include "f2c.h"
00007 
00008 
00009 /* *********************************************************************** */
00010 
00011 /* Subroutine */ int dtrsm_(side, uplo, transa, diag, m, n, alpha, a, lda, b, 
00012         ldb, side_len, uplo_len, transa_len, diag_len)
00013 char *side, *uplo, *transa, *diag;
00014 integer *m, *n;
00015 doublereal *alpha, *a;
00016 integer *lda;
00017 doublereal *b;
00018 integer *ldb;
00019 ftnlen side_len;
00020 ftnlen uplo_len;
00021 ftnlen transa_len;
00022 ftnlen diag_len;
00023 {
00024     /* System generated locals */
00025     integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3;
00026 
00027     /* Local variables */
00028     static integer info;
00029     static doublereal temp;
00030     static integer i, j, k;
00031     static logical lside;
00032     extern logical lsame_();
00033     static integer nrowa;
00034     static logical upper;
00035     extern /* Subroutine */ int xerbla_();
00036     static logical nounit;
00037 
00038 /*     .. Scalar Arguments .. */
00039 /*     .. Array Arguments .. */
00040 /*     .. */
00041 
00042 /*  Purpose */
00043 /*  ======= */
00044 
00045 /*  DTRSM  solves one of the matrix equations */
00046 
00047 /*     op( A )*X = alpha*B,   or   X*op( A ) = alpha*B, */
00048 
00049 /*  where alpha is a scalar, X and B are m by n matrices, A is a unit, or 
00050 */
00051 /*  non-unit,  upper or lower triangular matrix  and  op( A )  is one  of 
00052 */
00053 
00054 /*     op( A ) = A   or   op( A ) = A'. */
00055 
00056 /*  The matrix X is overwritten on B. */
00057 
00058 /*  Parameters */
00059 /*  ========== */
00060 
00061 /*  SIDE   - CHARACTER*1. */
00062 /*           On entry, SIDE specifies whether op( A ) appears on the left 
00063 */
00064 /*           or right of X as follows: */
00065 
00066 /*              SIDE = 'L' or 'l'   op( A )*X = alpha*B. */
00067 
00068 /*              SIDE = 'R' or 'r'   X*op( A ) = alpha*B. */
00069 
00070 /*           Unchanged on exit. */
00071 
00072 /*  UPLO   - CHARACTER*1. */
00073 /*           On entry, UPLO specifies whether the matrix A is an upper or 
00074 */
00075 /*           lower triangular matrix as follows: */
00076 
00077 /*              UPLO = 'U' or 'u'   A is an upper triangular matrix. */
00078 
00079 /*              UPLO = 'L' or 'l'   A is a lower triangular matrix. */
00080 
00081 /*           Unchanged on exit. */
00082 
00083 /*  TRANSA - CHARACTER*1. */
00084 /*           On entry, TRANSA specifies the form of op( A ) to be used in 
00085 */
00086 /*           the matrix multiplication as follows: */
00087 
00088 /*              TRANSA = 'N' or 'n'   op( A ) = A. */
00089 
00090 /*              TRANSA = 'T' or 't'   op( A ) = A'. */
00091 
00092 /*              TRANSA = 'C' or 'c'   op( A ) = A'. */
00093 
00094 /*           Unchanged on exit. */
00095 
00096 /*  DIAG   - CHARACTER*1. */
00097 /*           On entry, DIAG specifies whether or not A is unit triangular 
00098 */
00099 /*           as follows: */
00100 
00101 /*              DIAG = 'U' or 'u'   A is assumed to be unit triangular. */
00102 
00103 /*              DIAG = 'N' or 'n'   A is not assumed to be unit */
00104 /*                                  triangular. */
00105 
00106 /*           Unchanged on exit. */
00107 
00108 /*  M      - INTEGER. */
00109 /*           On entry, M specifies the number of rows of B. M must be at 
00110 */
00111 /*           least zero. */
00112 /*           Unchanged on exit. */
00113 
00114 /*  N      - INTEGER. */
00115 /*           On entry, N specifies the number of columns of B.  N must be 
00116 */
00117 /*           at least zero. */
00118 /*           Unchanged on exit. */
00119 
00120 /*  ALPHA  - DOUBLE PRECISION. */
00121 /*           On entry,  ALPHA specifies the scalar  alpha. When  alpha is 
00122 */
00123 /*           zero then  A is not referenced and  B need not be set before 
00124 */
00125 /*           entry. */
00126 /*           Unchanged on exit. */
00127 
00128 /*  A      - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m 
00129 */
00130 /*           when  SIDE = 'L' or 'l'  and is  n  when  SIDE = 'R' or 'r'. 
00131 */
00132 /*           Before entry  with  UPLO = 'U' or 'u',  the  leading  k by k 
00133 */
00134 /*           upper triangular part of the array  A must contain the upper 
00135 */
00136 /*           triangular matrix  and the strictly lower triangular part of 
00137 */
00138 /*           A is not referenced. */
00139 /*           Before entry  with  UPLO = 'L' or 'l',  the  leading  k by k 
00140 */
00141 /*           lower triangular part of the array  A must contain the lower 
00142 */
00143 /*           triangular matrix  and the strictly upper triangular part of 
00144 */
00145 /*           A is not referenced. */
00146 /*           Note that when  DIAG = 'U' or 'u',  the diagonal elements of 
00147 */
00148 /*           A  are not referenced either,  but are assumed to be  unity. 
00149 */
00150 /*           Unchanged on exit. */
00151 
00152 /*  LDA    - INTEGER. */
00153 /*           On entry, LDA specifies the first dimension of A as declared 
00154 */
00155 /*           in the calling (sub) program.  When  SIDE = 'L' or 'l'  then 
00156 */
00157 /*           LDA  must be at least  max( 1, m ),  when  SIDE = 'R' or 'r' 
00158 */
00159 /*           then LDA must be at least max( 1, n ). */
00160 /*           Unchanged on exit. */
00161 
00162 /*  B      - DOUBLE PRECISION array of DIMENSION ( LDB, n ). */
00163 /*           Before entry,  the leading  m by n part of the array  B must 
00164 */
00165 /*           contain  the  right-hand  side  matrix  B,  and  on exit  is 
00166 */
00167 /*           overwritten by the solution matrix  X. */
00168 
00169 /*  LDB    - INTEGER. */
00170 /*           On entry, LDB specifies the first dimension of B as declared 
00171 */
00172 /*           in  the  calling  (sub)  program.   LDB  must  be  at  least 
00173 */
00174 /*           max( 1, m ). */
00175 /*           Unchanged on exit. */
00176 
00177 
00178 /*  Level 3 Blas routine. */
00179 
00180 
00181 /*  -- Written on 8-February-1989. */
00182 /*     Jack Dongarra, Argonne National Laboratory. */
00183 /*     Iain Duff, AERE Harwell. */
00184 /*     Jeremy Du Croz, Numerical Algorithms Group Ltd. */
00185 /*     Sven Hammarling, Numerical Algorithms Group Ltd. */
00186 
00187 
00188 /*     .. External Functions .. */
00189 /*     .. External Subroutines .. */
00190 /*     .. Intrinsic Functions .. */
00191 /*     .. Local Scalars .. */
00192 /*     .. Parameters .. */
00193 /*     .. */
00194 /*     .. Executable Statements .. */
00195 
00196 /*     Test the input parameters. */
00197 
00198     /* Parameter adjustments */
00199     a_dim1 = *lda;
00200     a_offset = a_dim1 + 1;
00201     a -= a_offset;
00202     b_dim1 = *ldb;
00203     b_offset = b_dim1 + 1;
00204     b -= b_offset;
00205 
00206     /* Function Body */
00207     lside = lsame_(side, "L", 1L, 1L);
00208     if (lside) {
00209         nrowa = *m;
00210     } else {
00211         nrowa = *n;
00212     }
00213     nounit = lsame_(diag, "N", 1L, 1L);
00214     upper = lsame_(uplo, "U", 1L, 1L);
00215 
00216     info = 0;
00217     if (! lside && ! lsame_(side, "R", 1L, 1L)) {
00218         info = 1;
00219     } else if (! upper && ! lsame_(uplo, "L", 1L, 1L)) {
00220         info = 2;
00221     } else if (! lsame_(transa, "N", 1L, 1L) && ! lsame_(transa, "T", 1L, 1L) 
00222             && ! lsame_(transa, "C", 1L, 1L)) {
00223         info = 3;
00224     } else if (! lsame_(diag, "U", 1L, 1L) && ! lsame_(diag, "N", 1L, 1L)) {
00225         info = 4;
00226     } else if (*m < 0) {
00227         info = 5;
00228     } else if (*n < 0) {
00229         info = 6;
00230     } else if (*lda < max(1,nrowa)) {
00231         info = 9;
00232     } else if (*ldb < max(1,*m)) {
00233         info = 11;
00234     }
00235     if (info != 0) {
00236         xerbla_("DTRSM ", &info, 6L);
00237         return 0;
00238     }
00239 
00240 /*     Quick return if possible. */
00241 
00242     if (*n == 0) {
00243         return 0;
00244     }
00245 
00246 /*     And when  alpha.eq.zero. */
00247 
00248     if (*alpha == 0.) {
00249         i__1 = *n;
00250         for (j = 1; j <= i__1; ++j) {
00251             i__2 = *m;
00252             for (i = 1; i <= i__2; ++i) {
00253                 b[i + j * b_dim1] = 0.;
00254 /* L10: */
00255             }
00256 /* L20: */
00257         }
00258         return 0;
00259     }
00260 
00261 /*     Start the operations. */
00262 
00263     if (lside) {
00264         if (lsame_(transa, "N", 1L, 1L)) {
00265 
00266 /*           Form  B := alpha*inv( A )*B. */
00267 
00268             if (upper) {
00269                 i__1 = *n;
00270                 for (j = 1; j <= i__1; ++j) {
00271                     if (*alpha != 1.) {
00272                         i__2 = *m;
00273                         for (i = 1; i <= i__2; ++i) {
00274                             b[i + j * b_dim1] = *alpha * b[i + j * b_dim1];
00275 /* L30: */
00276                         }
00277                     }
00278                     for (k = *m; k >= 1; --k) {
00279                         if (b[k + j * b_dim1] != 0.) {
00280                             if (nounit) {
00281                                 b[k + j * b_dim1] /= a[k + k * a_dim1];
00282                             }
00283                             i__2 = k - 1;
00284                             for (i = 1; i <= i__2; ++i) {
00285                                 b[i + j * b_dim1] -= b[k + j * b_dim1] * a[i 
00286                                         + k * a_dim1];
00287 /* L40: */
00288                             }
00289                         }
00290 /* L50: */
00291                     }
00292 /* L60: */
00293                 }
00294             } else {
00295                 i__1 = *n;
00296                 for (j = 1; j <= i__1; ++j) {
00297                     if (*alpha != 1.) {
00298                         i__2 = *m;
00299                         for (i = 1; i <= i__2; ++i) {
00300                             b[i + j * b_dim1] = *alpha * b[i + j * b_dim1];
00301 /* L70: */
00302                         }
00303                     }
00304                     i__2 = *m;
00305                     for (k = 1; k <= i__2; ++k) {
00306                         if (b[k + j * b_dim1] != 0.) {
00307                             if (nounit) {
00308                                 b[k + j * b_dim1] /= a[k + k * a_dim1];
00309                             }
00310                             i__3 = *m;
00311                             for (i = k + 1; i <= i__3; ++i) {
00312                                 b[i + j * b_dim1] -= b[k + j * b_dim1] * a[i 
00313                                         + k * a_dim1];
00314 /* L80: */
00315                             }
00316                         }
00317 /* L90: */
00318                     }
00319 /* L100: */
00320                 }
00321             }
00322         } else {
00323 
00324 /*           Form  B := alpha*inv( A' )*B. */
00325 
00326             if (upper) {
00327                 i__1 = *n;
00328                 for (j = 1; j <= i__1; ++j) {
00329                     i__2 = *m;
00330                     for (i = 1; i <= i__2; ++i) {
00331                         temp = *alpha * b[i + j * b_dim1];
00332                         i__3 = i - 1;
00333                         for (k = 1; k <= i__3; ++k) {
00334                             temp -= a[k + i * a_dim1] * b[k + j * b_dim1];
00335 /* L110: */
00336                         }
00337                         if (nounit) {
00338                             temp /= a[i + i * a_dim1];
00339                         }
00340                         b[i + j * b_dim1] = temp;
00341 /* L120: */
00342                     }
00343 /* L130: */
00344                 }
00345             } else {
00346                 i__1 = *n;
00347                 for (j = 1; j <= i__1; ++j) {
00348                     for (i = *m; i >= 1; --i) {
00349                         temp = *alpha * b[i + j * b_dim1];
00350                         i__2 = *m;
00351                         for (k = i + 1; k <= i__2; ++k) {
00352                             temp -= a[k + i * a_dim1] * b[k + j * b_dim1];
00353 /* L140: */
00354                         }
00355                         if (nounit) {
00356                             temp /= a[i + i * a_dim1];
00357                         }
00358                         b[i + j * b_dim1] = temp;
00359 /* L150: */
00360                     }
00361 /* L160: */
00362                 }
00363             }
00364         }
00365     } else {
00366         if (lsame_(transa, "N", 1L, 1L)) {
00367 
00368 /*           Form  B := alpha*B*inv( A ). */
00369 
00370             if (upper) {
00371                 i__1 = *n;
00372                 for (j = 1; j <= i__1; ++j) {
00373                     if (*alpha != 1.) {
00374                         i__2 = *m;
00375                         for (i = 1; i <= i__2; ++i) {
00376                             b[i + j * b_dim1] = *alpha * b[i + j * b_dim1];
00377 /* L170: */
00378                         }
00379                     }
00380                     i__2 = j - 1;
00381                     for (k = 1; k <= i__2; ++k) {
00382                         if (a[k + j * a_dim1] != 0.) {
00383                             i__3 = *m;
00384                             for (i = 1; i <= i__3; ++i) {
00385                                 b[i + j * b_dim1] -= a[k + j * a_dim1] * b[i 
00386                                         + k * b_dim1];
00387 /* L180: */
00388                             }
00389                         }
00390 /* L190: */
00391                     }
00392                     if (nounit) {
00393                         temp = 1. / a[j + j * a_dim1];
00394                         i__2 = *m;
00395                         for (i = 1; i <= i__2; ++i) {
00396                             b[i + j * b_dim1] = temp * b[i + j * b_dim1];
00397 /* L200: */
00398                         }
00399                     }
00400 /* L210: */
00401                 }
00402             } else {
00403                 for (j = *n; j >= 1; --j) {
00404                     if (*alpha != 1.) {
00405                         i__1 = *m;
00406                         for (i = 1; i <= i__1; ++i) {
00407                             b[i + j * b_dim1] = *alpha * b[i + j * b_dim1];
00408 /* L220: */
00409                         }
00410                     }
00411                     i__1 = *n;
00412                     for (k = j + 1; k <= i__1; ++k) {
00413                         if (a[k + j * a_dim1] != 0.) {
00414                             i__2 = *m;
00415                             for (i = 1; i <= i__2; ++i) {
00416                                 b[i + j * b_dim1] -= a[k + j * a_dim1] * b[i 
00417                                         + k * b_dim1];
00418 /* L230: */
00419                             }
00420                         }
00421 /* L240: */
00422                     }
00423                     if (nounit) {
00424                         temp = 1. / a[j + j * a_dim1];
00425                         i__1 = *m;
00426                         for (i = 1; i <= i__1; ++i) {
00427                             b[i + j * b_dim1] = temp * b[i + j * b_dim1];
00428 /* L250: */
00429                         }
00430                     }
00431 /* L260: */
00432                 }
00433             }
00434         } else {
00435 
00436 /*           Form  B := alpha*B*inv( A' ). */
00437 
00438             if (upper) {
00439                 for (k = *n; k >= 1; --k) {
00440                     if (nounit) {
00441                         temp = 1. / a[k + k * a_dim1];
00442                         i__1 = *m;
00443                         for (i = 1; i <= i__1; ++i) {
00444                             b[i + k * b_dim1] = temp * b[i + k * b_dim1];
00445 /* L270: */
00446                         }
00447                     }
00448                     i__1 = k - 1;
00449                     for (j = 1; j <= i__1; ++j) {
00450                         if (a[j + k * a_dim1] != 0.) {
00451                             temp = a[j + k * a_dim1];
00452                             i__2 = *m;
00453                             for (i = 1; i <= i__2; ++i) {
00454                                 b[i + j * b_dim1] -= temp * b[i + k * b_dim1];
00455 /* L280: */
00456                             }
00457                         }
00458 /* L290: */
00459                     }
00460                     if (*alpha != 1.) {
00461                         i__1 = *m;
00462                         for (i = 1; i <= i__1; ++i) {
00463                             b[i + k * b_dim1] = *alpha * b[i + k * b_dim1];
00464 /* L300: */
00465                         }
00466                     }
00467 /* L310: */
00468                 }
00469             } else {
00470                 i__1 = *n;
00471                 for (k = 1; k <= i__1; ++k) {
00472                     if (nounit) {
00473                         temp = 1. / a[k + k * a_dim1];
00474                         i__2 = *m;
00475                         for (i = 1; i <= i__2; ++i) {
00476                             b[i + k * b_dim1] = temp * b[i + k * b_dim1];
00477 /* L320: */
00478                         }
00479                     }
00480                     i__2 = *n;
00481                     for (j = k + 1; j <= i__2; ++j) {
00482                         if (a[j + k * a_dim1] != 0.) {
00483                             temp = a[j + k * a_dim1];
00484                             i__3 = *m;
00485                             for (i = 1; i <= i__3; ++i) {
00486                                 b[i + j * b_dim1] -= temp * b[i + k * b_dim1];
00487 /* L330: */
00488                             }
00489                         }
00490 /* L340: */
00491                     }
00492                     if (*alpha != 1.) {
00493                         i__2 = *m;
00494                         for (i = 1; i <= i__2; ++i) {
00495                             b[i + k * b_dim1] = *alpha * b[i + k * b_dim1];
00496 /* L350: */
00497                         }
00498                     }
00499 /* L360: */
00500                 }
00501             }
00502         }
00503     }
00504 
00505     return 0;
00506 
00507 /*     End of DTRSM . */
00508 
00509 } /* dtrsm_ */
00510 

Generated on Wed Sep 5 12:54:20 2007 for DSACSS Operational Code by  doxygen 1.3.9.1