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

dtrmm.c

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

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