Purpose
  To compute one of the matrix products
    A : = alpha*op( T ) * A, or A : = alpha*A * op( T ),
  where alpha is a scalar, A is an m-by-n matrix, T is a quasi-
  triangular matrix, and op( T ) is one of
     op( T ) = T   or   op( T ) = T',  the transpose of T.
Specification
      SUBROUTINE MB01UX( SIDE, UPLO, TRANS, M, N, ALPHA, T, LDT, A, LDA,
     $                   DWORK, LDWORK, INFO )
C     .. Scalar Arguments ..
      CHARACTER         SIDE, TRANS, UPLO
      INTEGER           INFO, LDA, LDT, LDWORK, M, N
      DOUBLE PRECISION  ALPHA
C     .. Array Arguments ..
      DOUBLE PRECISION  A(LDA,*), DWORK(*), T(LDT,*)
Arguments
Mode Parameters
  SIDE    CHARACTER*1
          Specifies whether the upper quasi-triangular matrix H
          appears on the left or right in the matrix product as
          follows:
          = 'L':  A := alpha*op( T ) * A;
          = 'R':  A := alpha*A * op( T ).
  UPLO    CHARACTER*1.
          Specifies whether the matrix T is an upper or lower
          quasi-triangular matrix as follows:
          = 'U':  T is an upper quasi-triangular matrix;
          = 'L':  T is a lower quasi-triangular matrix.
  TRANS   CHARACTER*1
          Specifies the form of op( T ) to be used in the matrix
          multiplication as follows:
          = 'N':  op( T ) = T;
          = 'T':  op( T ) = T';
          = 'C':  op( T ) = T'.
Input/Output Parameters
  M       (input) INTEGER
          The number of rows of the matrix A.  M >= 0.
  N       (input) INTEGER
          The number of columns of the matrix A.  N >= 0.
  ALPHA   (input) DOUBLE PRECISION
          The scalar alpha. When alpha is zero then T is not
          referenced and A need not be set before entry.
  T       (input) DOUBLE PRECISION array, dimension (LDT,k)
          where k is M when SIDE = 'L' and is N when SIDE = 'R'.
          On entry with UPLO = 'U', the leading k-by-k upper
          Hessenberg part of this array must contain the upper
          quasi-triangular matrix T. The elements below the
          subdiagonal are not referenced.
          On entry with UPLO = 'L', the leading k-by-k lower
          Hessenberg part of this array must contain the lower
          quasi-triangular matrix T. The elements above the
          supdiagonal are not referenced.
  LDT     INTEGER
          The leading dimension of the array T.  LDT >= max(1,k),
          where k is M when SIDE = 'L' and is N when SIDE = 'R'.
  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
          On entry, the leading M-by-N part of this array must
          contain the matrix A.
          On exit, the leading M-by-N part of this array contains
          the computed product.
  LDA     INTEGER
          The leading dimension of the array A.  LDA >= max(1,M).
Workspace
  DWORK   DOUBLE PRECISION array, dimension (LDWORK)
          On exit, if INFO = 0 and ALPHA<>0,  DWORK(1)  returns the
          optimal value of LDWORK.
          On exit, if  INFO = -12,  DWORK(1)  returns the minimum
          value of LDWORK.
          This array is not referenced when alpha = 0.
  LDWORK  The length of the array DWORK.
          LDWORK >= 1,       if alpha =  0 or MIN(M,N) = 0;
          LDWORK >= 2*(M-1), if SIDE  = 'L';
          LDWORK >= 2*(N-1), if SIDE  = 'R'.
          For maximal efficiency LDWORK should be at least
          NOFF*N + M - 1,    if SIDE  = 'L';
          NOFF*M + N - 1,    if SIDE  = 'R';
          where NOFF is the number of nonzero elements on the
          subdiagonal (if UPLO = 'U') or supdiagonal (if UPLO = 'L')
          of T.
Error Indicator
  INFO    INTEGER
          = 0:  successful exit;
          < 0:  if INFO = -i, the i-th argument had an illegal
                value.
Method
The technique used in this routine is similiar to the technique used in the SLICOT [1] subroutine MB01UW developed by Vasile Sima. The required matrix product is computed in two steps. In the first step, the triangle of T specified by UPLO is used; in the second step, the contribution of the sub-/supdiagonal is added. If the workspace can accommodate parts of A, a fast BLAS 3 DTRMM operation is used in the first step.References
  [1] Benner, P., Mehrmann, V., Sima, V., Van Huffel, S., and
      Varga, A.
      SLICOT - A subroutine library in systems and control theory.
      In: Applied and computational control, signals, and circuits,
      Vol. 1, pp. 499-539, Birkhauser, Boston, 1999.
Further Comments
NoneExample
Program Text
NoneProgram Data
NoneProgram Results
None
Click here to get a compressed (gzip) tar file containing the source code of the routine, the example program, data, documentation, and related files.
Return to index