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