MB04VD

Upper block triangular form for a rectangular pencil sE-A, with E in column echelon form (added functionality)

[Specification] [Arguments] [Method] [References] [Comments] [Example]

Purpose

  To compute orthogonal transformations Q and Z such that the
  transformed pencil Q'(sE-A)Z is in upper block triangular form,
  where E is an M-by-N matrix in column echelon form (see SLICOT
  Library routine MB04UD) and A is an M-by-N matrix.

  If MODE = 'B', then the matrices A and E are transformed into the
  following generalized Schur form by unitary transformations Q1
  and Z1 :

                   | sE(eps,inf)-A(eps,inf) |      X     |
     Q1'(sE-A)Z1 = |------------------------|------------|.   (1)
                   |            O           | sE(r)-A(r) |

  The pencil sE(eps,inf)-A(eps,inf) is in staircase form, and it
  contains all Kronecker column indices and infinite elementary
  divisors of the pencil sE-A. The pencil sE(r)-A(r) contains all
  Kronecker row indices and elementary divisors of sE-A.
  Note: X is a pencil.

  If MODE = 'T', then the submatrices having full row and column
  rank in the pencil sE(eps,inf)-A(eps,inf) in (1) are
  triangularized by applying unitary transformations Q2 and Z2 to
  Q1'*(sE-A)*Z1.

  If MODE = 'S', then the pencil sE(eps,inf)-A(eps,inf) in (1) is
  separated into sE(eps)-A(eps) and sE(inf)-A(inf) by applying
  unitary transformations Q3 and Z3 to Q2'*Q1'*(sE-A)*Z1*Z2.

  This gives

             | sE(eps)-A(eps) |        X       |      X     |
             |----------------|----------------|------------|
             |        O       | sE(inf)-A(inf) |      X     |
  Q'(sE-A)Z =|=================================|============| (2)
             |                                 |            |
             |                O                | sE(r)-A(r) |

  where Q = Q1*Q2*Q3 and Z = Z1*Z2*Z3.
  Note: the pencil sE(r)-A(r) is not reduced further.

Specification
      SUBROUTINE MB04VD( MODE, JOBQ, JOBZ, M, N, RANKE, A, LDA, E, LDE,
     $                   Q, LDQ, Z, LDZ, ISTAIR, NBLCKS, NBLCKI, IMUK,
     $                   INUK, IMUK0, MNEI, TOL, IWORK, INFO )
C     .. Scalar Arguments ..
      CHARACTER         JOBQ, JOBZ, MODE
      INTEGER           INFO, LDA, LDE, LDQ, LDZ, M, N, NBLCKI, NBLCKS,
     $                  RANKE
      DOUBLE PRECISION  TOL
C     .. Array Arguments ..
      INTEGER           IMUK(*), IMUK0(*), INUK(*), ISTAIR(*), IWORK(*),
     $                  MNEI(*)
      DOUBLE PRECISION  A(LDA,*), E(LDE,*), Q(LDQ,*), Z(LDZ,*)

Arguments

Mode Parameters

  MODE    CHARACTER*1
          Specifies the desired structure of the transformed
          pencil Q'(sE-A)Z to be computed as follows:
          = 'B':  Basic reduction given by (1);
          = 'T':  Further reduction of (1) to triangular form;
          = 'S':  Further separation of sE(eps,inf)-A(eps,inf)
                  in (1) into the two pencils in (2).

  JOBQ    CHARACTER*1
          Indicates whether the user wishes to accumulate in a
          matrix Q the orthogonal row transformations, as follows:
          = 'N':  Do not form Q;
          = 'I':  Q is initialized to the unit matrix and the
                  orthogonal transformation matrix Q is returned;
          = 'U':  The given matrix Q is updated by the orthogonal
                  row transformations used in the reduction.

  JOBZ    CHARACTER*1
          Indicates whether the user wishes to accumulate in a
          matrix Z the orthogonal column transformations, as
          follows:
          = 'N':  Do not form Z;
          = 'I':  Z is initialized to the unit matrix and the
                  orthogonal transformation matrix Z is returned;
          = 'U':  The given matrix Z is updated by the orthogonal
                  transformations used in the reduction.

Input/Output Parameters
  M       (input) INTEGER
          The number of rows in the matrices A, E and the order of
          the matrix Q.  M >= 0.

  N       (input) INTEGER
          The number of columns in the matrices A, E and the order
          of the matrix Z.  N >= 0.

  RANKE   (input) INTEGER
          The rank of the matrix E in column echelon form.
          RANKE >= 0.

  A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
          On entry, the leading M-by-N part of this array must
          contain the matrix to be row compressed.
          On exit, the leading M-by-N part of this array contains
          the matrix that has been row compressed while keeping
          matrix E in column echelon form.

  LDA     INTEGER
          The leading dimension of array A.  LDA >= MAX(1,M).

  E       (input/output) DOUBLE PRECISION array, dimension (LDE,N)
          On entry, the leading M-by-N part of this array must
          contain the matrix in column echelon form to be
          transformed equivalent to matrix A.
          On exit, the leading M-by-N part of this array contains
          the matrix that has been transformed equivalent to matrix
          A.

  LDE     INTEGER
          The leading dimension of array E.  LDE >= MAX(1,M).

  Q       (input/output) DOUBLE PRECISION array, dimension (LDQ,*)
          On entry, if JOBQ = 'U', then the leading M-by-M part of
          this array must contain a given matrix Q (e.g. from a
          previous call to another SLICOT routine), and on exit, the
          leading M-by-M part of this array contains the product of
          the input matrix Q and the row transformation matrix used
          to transform the rows of matrices A and E.
          On exit, if JOBQ = 'I', then the leading M-by-M part of
          this array contains the matrix of accumulated orthogonal
          row transformations performed.
          If JOBQ = 'N', the array Q is not referenced and can be
          supplied as a dummy array (i.e. set parameter LDQ = 1 and
          declare this array to be Q(1,1) in the calling program).

  LDQ     INTEGER
          The leading dimension of array Q. If JOBQ = 'U' or
          JOBQ = 'I', LDQ >= MAX(1,M); if JOBQ = 'N', LDQ >= 1.

  Z       (input/output) DOUBLE PRECISION array, dimension (LDZ,*)
          On entry, if JOBZ = 'U', then the leading N-by-N part of
          this array must contain a given matrix Z (e.g. from a
          previous call to another SLICOT routine), and on exit, the
          leading N-by-N part of this array contains the product of
          the input matrix Z and the column transformation matrix
          used to transform the columns of matrices A and E.
          On exit, if JOBZ = 'I', then the leading N-by-N part of
          this array contains the matrix of accumulated orthogonal
          column transformations performed.
          If JOBZ = 'N', the array Z is not referenced and can be
          supplied as a dummy array (i.e. set parameter LDZ = 1 and
          declare this array to be Z(1,1) in the calling program).

  LDZ     INTEGER
          The leading dimension of array Z. If JOBZ = 'U' or
          JOBZ = 'I', LDZ >= MAX(1,N); if JOBZ = 'N', LDZ >= 1.

  ISTAIR  (input/output) INTEGER array, dimension (M)
          On entry, this array must contain information on the
          column echelon form of the unitary transformed matrix E.
          Specifically, ISTAIR(i) must be set to +j if the first
          non-zero element E(i,j) is a corner point and -j
          otherwise, for i = 1,2,...,M.
          On exit, this array contains no useful information.

  NBLCKS  (output) INTEGER
          The number of submatrices having full row rank greater
          than or equal to 0 detected in matrix A in the pencil
          sE(x)-A(x),
             where  x = eps,inf  if MODE = 'B' or 'T',
             or     x = eps      if MODE = 'S'.

  NBLCKI  (output) INTEGER
          If MODE = 'S', the number of diagonal submatrices in the
          pencil sE(inf)-A(inf). If MODE = 'B' or 'T' then
          NBLCKI = 0.

  IMUK    (output) INTEGER array, dimension (MAX(N,M+1))
          The leading NBLCKS elements of this array contain the
          column dimensions mu(1),...,mu(NBLCKS) of the submatrices
          having full column rank in the pencil sE(x)-A(x),
             where  x = eps,inf  if MODE = 'B' or 'T',
             or     x = eps      if MODE = 'S'.

  INUK    (output) INTEGER array, dimension (MAX(N,M+1))
          The leading NBLCKS elements of this array contain the
          row dimensions nu(1),...,nu(NBLCKS) of the submatrices
          having full row rank in the pencil sE(x)-A(x),
             where  x = eps,inf  if MODE = 'B' or 'T',
             or     x = eps      if MODE = 'S'.

  IMUK0   (output) INTEGER array, dimension (limuk0),
          where limuk0 = N if MODE = 'S' and 1, otherwise.
          If MODE = 'S', then the leading NBLCKI elements of this
          array contain the dimensions mu0(1),...,mu0(NBLCKI)
          of the square diagonal submatrices in the pencil
          sE(inf)-A(inf).
          Otherwise, IMUK0 is not referenced and can be supplied
          as a dummy array.

  MNEI    (output) INTEGER array, dimension (3)
          If MODE = 'B' or 'T' then
          MNEI(1) contains the row dimension of
                  sE(eps,inf)-A(eps,inf);
          MNEI(2) contains the column dimension of
                  sE(eps,inf)-A(eps,inf);
          MNEI(3) = 0.
          If MODE = 'S', then
          MNEI(1) contains the row    dimension of sE(eps)-A(eps);
          MNEI(2) contains the column dimension of sE(eps)-A(eps);
          MNEI(3) contains the order of the regular pencil
                  sE(inf)-A(inf).

Tolerances
  TOL     DOUBLE PRECISION
          A tolerance below which matrix elements are considered
          to be zero. If the user sets TOL to be less than (or
          equal to) zero then the tolerance is taken as
          EPS * MAX( ABS(A(I,J)), ABS(E(I,J)) ), where EPS is the
          machine precision (see LAPACK Library routine DLAMCH),
          I = 1,2,...,M and J = 1,2,...,N.

Workspace
  IWORK   INTEGER array, dimension (N)

Error Indicator
  INFO    INTEGER
          = 0:  successful exit;
          < 0:  if INFO = -i, the i-th argument had an illegal
                value.
          > 0:  if incorrect rank decisions were revealed during the
                triangularization phase. This failure is not likely
                to occur. The possible values are:
          = 1:  if incorrect dimensions of a full column rank
                submatrix;
          = 2:  if incorrect dimensions of a full row rank
                submatrix.

Method
  Let sE - A be an arbitrary pencil. Prior to calling the routine,
  this pencil must be transformed into a pencil with E in column
  echelon form. This may be accomplished by calling the SLICOT
  Library routine MB04UD. Depending on the value of MODE,
  submatrices of A and E are then reduced to one of the forms
  described above. Further details can be found in [1].

References
  [1] Beelen, Th. and Van Dooren, P.
      An improved algorithm for the computation of Kronecker's
      canonical form of a singular pencil.
      Linear Algebra and Applications, 105, pp. 9-65, 1988.

Numerical Aspects
  It is shown in [1] that the algorithm is numerically backward
  stable. The operations count is proportional to (MAX(M,N))**3.

Further Comments
  The difference mu(k)-nu(k), for k = 1,2,...,NBLCKS, is the number
  of elementary Kronecker blocks of size k x (k+1).

  If MODE = 'B' or 'T' on entry, then the difference nu(k)-mu(k+1),
  for k = 1,2,...,NBLCKS, is the number of infinite elementary
  divisors of degree k (with mu(NBLCKS+1) = 0).

  If MODE = 'S' on entry, then the difference mu0(k)-mu0(k+1),
  for k = 1,2,...,NBLCKI, is the number of infinite elementary
  divisors of degree k (with mu0(NBLCKI+1) = 0).
  In the pencil sE(r)-A(r), the pencils sE(f)-A(f) and
  sE(eta)-A(eta) can be separated by pertransposing the pencil
  sE(r)-A(r) and calling the routine with MODE set to 'B'. The
  result has got to be pertransposed again. (For more details see
  [1]).

Example

Program Text

*     MB04VD EXAMPLE PROGRAM TEXT
*     Copyright (c) 2002-2017 NICONET e.V.
*
*     .. Parameters ..
      INTEGER          NIN, NOUT
      PARAMETER        ( NIN = 5, NOUT = 6 )
      INTEGER          MMAX, NMAX
      PARAMETER        ( MMAX = 20, NMAX = 20 )
      INTEGER          LDA, LDE, LDQ, LDZ
      PARAMETER        ( LDA  = MMAX, LDE = MMAX, LDQ = MMAX,
     $                   LDZ = NMAX )
      INTEGER          LINUK
      PARAMETER        ( LINUK = MAX( NMAX,MMAX+1 ) )
*     PARAMETER        ( LINUK = NMAX+MMAX+1 )
      INTEGER          LIWORK
      PARAMETER        ( LIWORK = NMAX )
      INTEGER          LDWORK
      PARAMETER        ( LDWORK = MAX( NMAX,MMAX ) )
*     PARAMETER        ( LDWORK = NMAX+MMAX )
      DOUBLE PRECISION ZERO, ONE
      PARAMETER        ( ZERO = 0.0D0, ONE = 1.0D0 )
*     .. Local Scalars ..
      DOUBLE PRECISION TOL
      INTEGER          I, INFO, J, M, N, NBLCKI, NBLCKS, RANKE
      CHARACTER*1      JOBQ, JOBZ, MODE
*     .. Local Arrays ..
      DOUBLE PRECISION A(LDA,NMAX), DWORK(LDWORK), E(LDE,NMAX),
     $                 Q(LDQ,MMAX), Z(LDZ,NMAX)
      INTEGER          IMUK(LINUK), IMUK0(NMAX), INUK(LINUK),
     $                 ISTAIR(MMAX), IWORK(LIWORK), MNEI(3)
C     .. External Functions ..
      LOGICAL          LSAME
      EXTERNAL         LSAME
*     .. External Subroutines ..
      EXTERNAL         MB04UD, MB04VD
*     .. Intrinsic Functions ..
      INTRINSIC        MAX
*     .. Executable Statements ..
*
      WRITE ( NOUT, FMT = 99999 )
*     Skip the heading in the data file and read the data.
      READ ( NIN, FMT = '()' )
      READ ( NIN, FMT = * ) M, N, TOL, MODE
      IF ( M.LT.0 .OR. M.GT.MMAX ) THEN
         WRITE ( NOUT, FMT = 99984 ) M
      ELSE IF ( N.LT.0 .OR. N.GT.NMAX ) THEN
         WRITE ( NOUT, FMT = 99983 ) N
      ELSE
         READ ( NIN, FMT = * ) ( ( A(I,J), J = 1,N ), I = 1,M )
         READ ( NIN, FMT = * ) ( ( E(I,J), J = 1,N ), I = 1,M )
         JOBQ = 'I'
         JOBZ = 'I'
*        Reduce E to column echelon form and compute Q'*A*Z.
         CALL MB04UD( JOBQ, JOBZ, M, N, A, LDA, E, LDE, Q, LDQ, Z, LDZ,
     $                RANKE, ISTAIR, TOL, DWORK, INFO )
         JOBQ = 'U'
         JOBZ = 'U'
*
         IF ( INFO.EQ.0 ) THEN
*           Compute a unitary transformed pencil Q'*(s*E-A)*Z.
            CALL MB04VD( MODE, JOBQ, JOBZ, M, N, RANKE, A, LDA, E, LDE,
     $                   Q, LDQ, Z, LDZ, ISTAIR, NBLCKS, NBLCKI, IMUK,
     $                   INUK, IMUK0, MNEI, TOL, IWORK, INFO )
*
            IF ( INFO.EQ.0 ) THEN
               WRITE ( NOUT, FMT = 99996 )
               WRITE ( NOUT, FMT = 99995 )
               DO 140 I = 1, M
                  WRITE ( NOUT, FMT = 99994 ) ( Q(I,J), J = 1,M )
  140          CONTINUE
               WRITE ( NOUT, FMT = 99993 )
               DO 160 I = 1, M
                  WRITE ( NOUT, FMT = 99994 ) ( E(I,J), J = 1,N )
  160          CONTINUE
               WRITE ( NOUT, FMT = 99992 )
               DO 180 I = 1, M
                  WRITE ( NOUT, FMT = 99994 ) ( A(I,J), J = 1,N )
  180          CONTINUE
               WRITE ( NOUT, FMT = 99991 )
               DO 200 I = 1, N
                  WRITE ( NOUT, FMT = 99994 ) ( Z(I,J), J = 1,N )
  200          CONTINUE
               WRITE ( NOUT, FMT = 99990 ) NBLCKS
               IF ( .NOT. LSAME( MODE, 'S' ) ) THEN
                  WRITE ( NOUT, FMT = 99989 ) ( IMUK(I),  I = 1,NBLCKS )
                  WRITE ( NOUT, FMT = 99988 ) ( INUK(I),  I = 1,NBLCKS )
               ELSE
                  WRITE ( NOUT, FMT = 99987 ) ( IMUK(I),  I = 1,NBLCKS )
                  WRITE ( NOUT, FMT = 99986 ) ( INUK(I),  I = 1,NBLCKS )
                  WRITE ( NOUT, FMT = 99982 ) ( IMUK0(I), I = 1,NBLCKI )
                  WRITE ( NOUT, FMT = 99985 ) ( MNEI(I),  I = 1,3 )
               END IF
            ELSE
               WRITE ( NOUT, FMT = 99998 ) INFO
            END IF
         ELSE
            WRITE ( NOUT, FMT = 99997 ) INFO
         END IF
      END IF
      STOP
*
99999 FORMAT (' MB04VD EXAMPLE PROGRAM RESULTS',/1X)
99998 FORMAT (' INFO on exit from MB04VD = ',I2)
99997 FORMAT (' INFO on exit from MB04UD = ',I2)
99996 FORMAT (' The unitary transformed pencil is Q''*(s*E-A)*Z, where',
     $          /)
99995 FORMAT (' Matrix Q',/)
99994 FORMAT (20(1X,F8.4))
99993 FORMAT (/' Matrix E',/)
99992 FORMAT (/' Matrix A',/)
99991 FORMAT (/' Matrix Z',/)
99990 FORMAT (/' The number of submatrices having full row rank detect',
     $       'ed in matrix A = ',I3)
99989 FORMAT (/' The column dimensions of the submatrices having full ',
     $       'column rank in the pencil',/' sE(eps,inf) - A(eps,inf) a',
     $       're',/20(1X,I5))
99988 FORMAT (/' The row dimensions of the submatrices having full row',
     $       ' rank in the pencil',/' sE(eps,inf) - A(eps,inf) are',
     $       /20(1X,I5))
99987 FORMAT (/' The column dimensions of the submatrices having full ',
     $       'column rank in the pencil',/' sE(eps) - A(eps) are',
     $       /20(1X,I5))
99986 FORMAT (/' The row dimensions of the submatrices having full row',
     $       ' rank in the pencil',/' sE(eps) - A(eps) are',/20(1X,I5))
99985 FORMAT (/' MNEI is ',/20(1X,I5))
99984 FORMAT (/' M is out of range.',/' M = ',I5)
99983 FORMAT (/' N is out of range.',/' N = ',I5)
99982 FORMAT (/' The orders of the diagonal submatrices in the pencil ',
     $       'sE(inf) - A(inf) are',/20(1X,I5))
      END
Program Data
 MB04VD EXAMPLE PROGRAM DATA
   2     4     0.0     S
   1.0  0.0 -1.0  0.0
   1.0  1.0  0.0 -1.0
   0.0 -1.0  0.0  0.0
   0.0 -1.0  0.0  0.0
Program Results
 MB04VD EXAMPLE PROGRAM RESULTS

 The unitary transformed pencil is Q'*(s*E-A)*Z, where

 Matrix Q

   0.7071  -0.7071
   0.7071   0.7071

 Matrix E

   0.0000   0.0000  -1.1547   0.8165
   0.0000   0.0000   0.0000   0.0000

 Matrix A

   0.0000   1.7321   0.5774  -0.4082
   0.0000   0.0000   0.0000  -1.2247

 Matrix Z

   0.5774   0.8165   0.0000   0.0000
   0.0000   0.0000   0.8165  -0.5774
   0.5774  -0.4082  -0.4082  -0.5774
   0.5774  -0.4082   0.4082   0.5774

 The number of submatrices having full row rank detected in matrix A =   2

 The column dimensions of the submatrices having full column rank in the pencil
 sE(eps) - A(eps) are
     2     1

 The row dimensions of the submatrices having full row rank in the pencil
 sE(eps) - A(eps) are
     1     0

 The orders of the diagonal submatrices in the pencil sE(inf) - A(inf) are
     1

 MNEI is 
     1     3     1

Return to index