Purpose
To perform the following matrix operation C = alpha*kron( op(A), op(B) ) + beta*C, where alpha and beta are real scalars, op(M) is either matrix M or its transpose, M', and kron( X, Y ) denotes the Kronecker product of the matrices X and Y.Specification
SUBROUTINE MB01VD( TRANA, TRANB, MA, NA, MB, NB, ALPHA, BETA, $ A, LDA, B, LDB, C, LDC, MC, NC, INFO ) C .. Scalar Arguments .. CHARACTER TRANA, TRANB INTEGER INFO, LDA, LDB, LDC, MA, MB, MC, NA, NB, NC DOUBLE PRECISION ALPHA, BETA C .. Array Arguments .. DOUBLE PRECISION A(LDA,*), B(LDB,*), C(LDC,*)Arguments
Mode Parameters
TRANA CHARACTER*1 Specifies the form of op(A) to be used as follows: = 'N': op(A) = A; = 'T': op(A) = A'; = 'C': op(A) = A'. TRANB CHARACTER*1 Specifies the form of op(B) to be used as follows: = 'N': op(B) = B; = 'T': op(B) = B'; = 'C': op(B) = B'.Input/Output Parameters
MA (input) INTEGER The number of rows of the matrix op(A). MA >= 0. NA (input) INTEGER The number of columns of the matrix op(A). NA >= 0. MB (input) INTEGER The number of rows of the matrix op(B). MB >= 0. NB (input) INTEGER The number of columns of the matrix op(B). NB >= 0. ALPHA (input) DOUBLE PRECISION The scalar alpha. When alpha is zero then A and B need not be set before entry. BETA (input) DOUBLE PRECISION The scalar beta. When beta is zero then C need not be set before entry. A (input) DOUBLE PRECISION array, dimension (LDA,ka), where ka is NA when TRANA = 'N', and is MA otherwise. If TRANA = 'N', the leading MA-by-NA part of this array must contain the matrix A; otherwise, the leading NA-by-MA part of this array must contain the matrix A. LDA INTEGER The leading dimension of the array A. LDA >= max(1,MA), if TRANA = 'N'; LDA >= max(1,NA), if TRANA = 'T' or 'C'. B (input) DOUBLE PRECISION array, dimension (LDB,kb) where kb is NB when TRANB = 'N', and is MB otherwise. If TRANB = 'N', the leading MB-by-NB part of this array must contain the matrix B; otherwise, the leading NB-by-MB part of this array must contain the matrix B. LDB INTEGER The leading dimension of the array B. LDB >= max(1,MB), if TRANB = 'N'; LDB >= max(1,NB), if TRANB = 'T' or 'C'. C (input/output) DOUBLE PRECISION array, dimension (LDC,NC) On entry, if beta is nonzero, the leading MC-by-NC part of this array must contain the given matric C, where MC = MA*MB and NC = NA*NB. On exit, the leading MC-by-NC part of this array contains the computed matrix expression C = alpha*kron( op(A), op(B) ) + beta*C. LDC INTEGER The leading dimension of the array C. LDC >= max(1,MC). MC (output) INTEGER The number of rows of the matrix C. MC = MA*MB. NC (output) INTEGER The number of columns of the matrix C. NC = NA*NB.Error Indicator
INFO INTEGER = 0: successful exit; < 0: if INFO = -i, the i-th argument had an illegal value.Method
The Kronecker product of the matrices op(A) and op(B) is computed column by column.Further Comments
The multiplications by zero elements in A are avoided, if the matrix A is considered to be sparse, i.e., if (number of zeros in A)/(MA*NA) >= SPARST = 0.8. The code makes NB+1 passes through the matrix A, and MA*NA passes through the matrix B. If LDA and/or LDB are very large, and op(A) = A' and/or op(B) = B', it could be more efficient to transpose A and/or B before calling this routine, and use the 'N' values for TRANA and/or TRANB.Example
Program Text
NoneProgram Data
NoneProgram Results
None