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