File:  [local] / rpl / lapack / blas / dtrsm.f
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Jan 26 15:22:45 2010 UTC (14 years, 3 months ago) by bertrand
Branches: JKB
CVS tags: start, rpl-4_0_14, rpl-4_0_13, rpl-4_0_12, rpl-4_0_11, rpl-4_0_10


Commit initial.

    1:       SUBROUTINE DTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)
    2: *     .. Scalar Arguments ..
    3:       DOUBLE PRECISION ALPHA
    4:       INTEGER LDA,LDB,M,N
    5:       CHARACTER DIAG,SIDE,TRANSA,UPLO
    6: *     ..
    7: *     .. Array Arguments ..
    8:       DOUBLE PRECISION A(LDA,*),B(LDB,*)
    9: *     ..
   10: *
   11: *  Purpose
   12: *  =======
   13: *
   14: *  DTRSM  solves one of the matrix equations
   15: *
   16: *     op( A )*X = alpha*B,   or   X*op( A ) = alpha*B,
   17: *
   18: *  where alpha is a scalar, X and B are m by n matrices, A is a unit, or
   19: *  non-unit,  upper or lower triangular matrix  and  op( A )  is one  of
   20: *
   21: *     op( A ) = A   or   op( A ) = A'.
   22: *
   23: *  The matrix X is overwritten on B.
   24: *
   25: *  Arguments
   26: *  ==========
   27: *
   28: *  SIDE   - CHARACTER*1.
   29: *           On entry, SIDE specifies whether op( A ) appears on the left
   30: *           or right of X as follows:
   31: *
   32: *              SIDE = 'L' or 'l'   op( A )*X = alpha*B.
   33: *
   34: *              SIDE = 'R' or 'r'   X*op( A ) = alpha*B.
   35: *
   36: *           Unchanged on exit.
   37: *
   38: *  UPLO   - CHARACTER*1.
   39: *           On entry, UPLO specifies whether the matrix A is an upper or
   40: *           lower triangular matrix as follows:
   41: *
   42: *              UPLO = 'U' or 'u'   A is an upper triangular matrix.
   43: *
   44: *              UPLO = 'L' or 'l'   A is a lower triangular matrix.
   45: *
   46: *           Unchanged on exit.
   47: *
   48: *  TRANSA - CHARACTER*1.
   49: *           On entry, TRANSA specifies the form of op( A ) to be used in
   50: *           the matrix multiplication as follows:
   51: *
   52: *              TRANSA = 'N' or 'n'   op( A ) = A.
   53: *
   54: *              TRANSA = 'T' or 't'   op( A ) = A'.
   55: *
   56: *              TRANSA = 'C' or 'c'   op( A ) = A'.
   57: *
   58: *           Unchanged on exit.
   59: *
   60: *  DIAG   - CHARACTER*1.
   61: *           On entry, DIAG specifies whether or not A is unit triangular
   62: *           as follows:
   63: *
   64: *              DIAG = 'U' or 'u'   A is assumed to be unit triangular.
   65: *
   66: *              DIAG = 'N' or 'n'   A is not assumed to be unit
   67: *                                  triangular.
   68: *
   69: *           Unchanged on exit.
   70: *
   71: *  M      - INTEGER.
   72: *           On entry, M specifies the number of rows of B. M must be at
   73: *           least zero.
   74: *           Unchanged on exit.
   75: *
   76: *  N      - INTEGER.
   77: *           On entry, N specifies the number of columns of B.  N must be
   78: *           at least zero.
   79: *           Unchanged on exit.
   80: *
   81: *  ALPHA  - DOUBLE PRECISION.
   82: *           On entry,  ALPHA specifies the scalar  alpha. When  alpha is
   83: *           zero then  A is not referenced and  B need not be set before
   84: *           entry.
   85: *           Unchanged on exit.
   86: *
   87: *  A      - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m
   88: *           when  SIDE = 'L' or 'l'  and is  n  when  SIDE = 'R' or 'r'.
   89: *           Before entry  with  UPLO = 'U' or 'u',  the  leading  k by k
   90: *           upper triangular part of the array  A must contain the upper
   91: *           triangular matrix  and the strictly lower triangular part of
   92: *           A is not referenced.
   93: *           Before entry  with  UPLO = 'L' or 'l',  the  leading  k by k
   94: *           lower triangular part of the array  A must contain the lower
   95: *           triangular matrix  and the strictly upper triangular part of
   96: *           A is not referenced.
   97: *           Note that when  DIAG = 'U' or 'u',  the diagonal elements of
   98: *           A  are not referenced either,  but are assumed to be  unity.
   99: *           Unchanged on exit.
  100: *
  101: *  LDA    - INTEGER.
  102: *           On entry, LDA specifies the first dimension of A as declared
  103: *           in the calling (sub) program.  When  SIDE = 'L' or 'l'  then
  104: *           LDA  must be at least  max( 1, m ),  when  SIDE = 'R' or 'r'
  105: *           then LDA must be at least max( 1, n ).
  106: *           Unchanged on exit.
  107: *
  108: *  B      - DOUBLE PRECISION array of DIMENSION ( LDB, n ).
  109: *           Before entry,  the leading  m by n part of the array  B must
  110: *           contain  the  right-hand  side  matrix  B,  and  on exit  is
  111: *           overwritten by the solution matrix  X.
  112: *
  113: *  LDB    - INTEGER.
  114: *           On entry, LDB specifies the first dimension of B as declared
  115: *           in  the  calling  (sub)  program.   LDB  must  be  at  least
  116: *           max( 1, m ).
  117: *           Unchanged on exit.
  118: *
  119: *  Further Details
  120: *  ===============
  121: *
  122: *  Level 3 Blas routine.
  123: *
  124: *
  125: *  -- Written on 8-February-1989.
  126: *     Jack Dongarra, Argonne National Laboratory.
  127: *     Iain Duff, AERE Harwell.
  128: *     Jeremy Du Croz, Numerical Algorithms Group Ltd.
  129: *     Sven Hammarling, Numerical Algorithms Group Ltd.
  130: *
  131: *  =====================================================================
  132: *
  133: *     .. External Functions ..
  134:       LOGICAL LSAME
  135:       EXTERNAL LSAME
  136: *     ..
  137: *     .. External Subroutines ..
  138:       EXTERNAL XERBLA
  139: *     ..
  140: *     .. Intrinsic Functions ..
  141:       INTRINSIC MAX
  142: *     ..
  143: *     .. Local Scalars ..
  144:       DOUBLE PRECISION TEMP
  145:       INTEGER I,INFO,J,K,NROWA
  146:       LOGICAL LSIDE,NOUNIT,UPPER
  147: *     ..
  148: *     .. Parameters ..
  149:       DOUBLE PRECISION ONE,ZERO
  150:       PARAMETER (ONE=1.0D+0,ZERO=0.0D+0)
  151: *     ..
  152: *
  153: *     Test the input parameters.
  154: *
  155:       LSIDE = LSAME(SIDE,'L')
  156:       IF (LSIDE) THEN
  157:           NROWA = M
  158:       ELSE
  159:           NROWA = N
  160:       END IF
  161:       NOUNIT = LSAME(DIAG,'N')
  162:       UPPER = LSAME(UPLO,'U')
  163: *
  164:       INFO = 0
  165:       IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THEN
  166:           INFO = 1
  167:       ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
  168:           INFO = 2
  169:       ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND.
  170:      +         (.NOT.LSAME(TRANSA,'T')) .AND.
  171:      +         (.NOT.LSAME(TRANSA,'C'))) THEN
  172:           INFO = 3
  173:       ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN
  174:           INFO = 4
  175:       ELSE IF (M.LT.0) THEN
  176:           INFO = 5
  177:       ELSE IF (N.LT.0) THEN
  178:           INFO = 6
  179:       ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
  180:           INFO = 9
  181:       ELSE IF (LDB.LT.MAX(1,M)) THEN
  182:           INFO = 11
  183:       END IF
  184:       IF (INFO.NE.0) THEN
  185:           CALL XERBLA('DTRSM ',INFO)
  186:           RETURN
  187:       END IF
  188: *
  189: *     Quick return if possible.
  190: *
  191:       IF (M.EQ.0 .OR. N.EQ.0) RETURN
  192: *
  193: *     And when  alpha.eq.zero.
  194: *
  195:       IF (ALPHA.EQ.ZERO) THEN
  196:           DO 20 J = 1,N
  197:               DO 10 I = 1,M
  198:                   B(I,J) = ZERO
  199:    10         CONTINUE
  200:    20     CONTINUE
  201:           RETURN
  202:       END IF
  203: *
  204: *     Start the operations.
  205: *
  206:       IF (LSIDE) THEN
  207:           IF (LSAME(TRANSA,'N')) THEN
  208: *
  209: *           Form  B := alpha*inv( A )*B.
  210: *
  211:               IF (UPPER) THEN
  212:                   DO 60 J = 1,N
  213:                       IF (ALPHA.NE.ONE) THEN
  214:                           DO 30 I = 1,M
  215:                               B(I,J) = ALPHA*B(I,J)
  216:    30                     CONTINUE
  217:                       END IF
  218:                       DO 50 K = M,1,-1
  219:                           IF (B(K,J).NE.ZERO) THEN
  220:                               IF (NOUNIT) B(K,J) = B(K,J)/A(K,K)
  221:                               DO 40 I = 1,K - 1
  222:                                   B(I,J) = B(I,J) - B(K,J)*A(I,K)
  223:    40                         CONTINUE
  224:                           END IF
  225:    50                 CONTINUE
  226:    60             CONTINUE
  227:               ELSE
  228:                   DO 100 J = 1,N
  229:                       IF (ALPHA.NE.ONE) THEN
  230:                           DO 70 I = 1,M
  231:                               B(I,J) = ALPHA*B(I,J)
  232:    70                     CONTINUE
  233:                       END IF
  234:                       DO 90 K = 1,M
  235:                           IF (B(K,J).NE.ZERO) THEN
  236:                               IF (NOUNIT) B(K,J) = B(K,J)/A(K,K)
  237:                               DO 80 I = K + 1,M
  238:                                   B(I,J) = B(I,J) - B(K,J)*A(I,K)
  239:    80                         CONTINUE
  240:                           END IF
  241:    90                 CONTINUE
  242:   100             CONTINUE
  243:               END IF
  244:           ELSE
  245: *
  246: *           Form  B := alpha*inv( A' )*B.
  247: *
  248:               IF (UPPER) THEN
  249:                   DO 130 J = 1,N
  250:                       DO 120 I = 1,M
  251:                           TEMP = ALPHA*B(I,J)
  252:                           DO 110 K = 1,I - 1
  253:                               TEMP = TEMP - A(K,I)*B(K,J)
  254:   110                     CONTINUE
  255:                           IF (NOUNIT) TEMP = TEMP/A(I,I)
  256:                           B(I,J) = TEMP
  257:   120                 CONTINUE
  258:   130             CONTINUE
  259:               ELSE
  260:                   DO 160 J = 1,N
  261:                       DO 150 I = M,1,-1
  262:                           TEMP = ALPHA*B(I,J)
  263:                           DO 140 K = I + 1,M
  264:                               TEMP = TEMP - A(K,I)*B(K,J)
  265:   140                     CONTINUE
  266:                           IF (NOUNIT) TEMP = TEMP/A(I,I)
  267:                           B(I,J) = TEMP
  268:   150                 CONTINUE
  269:   160             CONTINUE
  270:               END IF
  271:           END IF
  272:       ELSE
  273:           IF (LSAME(TRANSA,'N')) THEN
  274: *
  275: *           Form  B := alpha*B*inv( A ).
  276: *
  277:               IF (UPPER) THEN
  278:                   DO 210 J = 1,N
  279:                       IF (ALPHA.NE.ONE) THEN
  280:                           DO 170 I = 1,M
  281:                               B(I,J) = ALPHA*B(I,J)
  282:   170                     CONTINUE
  283:                       END IF
  284:                       DO 190 K = 1,J - 1
  285:                           IF (A(K,J).NE.ZERO) THEN
  286:                               DO 180 I = 1,M
  287:                                   B(I,J) = B(I,J) - A(K,J)*B(I,K)
  288:   180                         CONTINUE
  289:                           END IF
  290:   190                 CONTINUE
  291:                       IF (NOUNIT) THEN
  292:                           TEMP = ONE/A(J,J)
  293:                           DO 200 I = 1,M
  294:                               B(I,J) = TEMP*B(I,J)
  295:   200                     CONTINUE
  296:                       END IF
  297:   210             CONTINUE
  298:               ELSE
  299:                   DO 260 J = N,1,-1
  300:                       IF (ALPHA.NE.ONE) THEN
  301:                           DO 220 I = 1,M
  302:                               B(I,J) = ALPHA*B(I,J)
  303:   220                     CONTINUE
  304:                       END IF
  305:                       DO 240 K = J + 1,N
  306:                           IF (A(K,J).NE.ZERO) THEN
  307:                               DO 230 I = 1,M
  308:                                   B(I,J) = B(I,J) - A(K,J)*B(I,K)
  309:   230                         CONTINUE
  310:                           END IF
  311:   240                 CONTINUE
  312:                       IF (NOUNIT) THEN
  313:                           TEMP = ONE/A(J,J)
  314:                           DO 250 I = 1,M
  315:                               B(I,J) = TEMP*B(I,J)
  316:   250                     CONTINUE
  317:                       END IF
  318:   260             CONTINUE
  319:               END IF
  320:           ELSE
  321: *
  322: *           Form  B := alpha*B*inv( A' ).
  323: *
  324:               IF (UPPER) THEN
  325:                   DO 310 K = N,1,-1
  326:                       IF (NOUNIT) THEN
  327:                           TEMP = ONE/A(K,K)
  328:                           DO 270 I = 1,M
  329:                               B(I,K) = TEMP*B(I,K)
  330:   270                     CONTINUE
  331:                       END IF
  332:                       DO 290 J = 1,K - 1
  333:                           IF (A(J,K).NE.ZERO) THEN
  334:                               TEMP = A(J,K)
  335:                               DO 280 I = 1,M
  336:                                   B(I,J) = B(I,J) - TEMP*B(I,K)
  337:   280                         CONTINUE
  338:                           END IF
  339:   290                 CONTINUE
  340:                       IF (ALPHA.NE.ONE) THEN
  341:                           DO 300 I = 1,M
  342:                               B(I,K) = ALPHA*B(I,K)
  343:   300                     CONTINUE
  344:                       END IF
  345:   310             CONTINUE
  346:               ELSE
  347:                   DO 360 K = 1,N
  348:                       IF (NOUNIT) THEN
  349:                           TEMP = ONE/A(K,K)
  350:                           DO 320 I = 1,M
  351:                               B(I,K) = TEMP*B(I,K)
  352:   320                     CONTINUE
  353:                       END IF
  354:                       DO 340 J = K + 1,N
  355:                           IF (A(J,K).NE.ZERO) THEN
  356:                               TEMP = A(J,K)
  357:                               DO 330 I = 1,M
  358:                                   B(I,J) = B(I,J) - TEMP*B(I,K)
  359:   330                         CONTINUE
  360:                           END IF
  361:   340                 CONTINUE
  362:                       IF (ALPHA.NE.ONE) THEN
  363:                           DO 350 I = 1,M
  364:                               B(I,K) = ALPHA*B(I,K)
  365:   350                     CONTINUE
  366:                       END IF
  367:   360             CONTINUE
  368:               END IF
  369:           END IF
  370:       END IF
  371: *
  372:       RETURN
  373: *
  374: *     End of DTRSM .
  375: *
  376:       END

CVSweb interface <joel.bertrand@systella.fr>