## TG01BD

### Orthogonal reduction of a descriptor system to the generalized Hessenberg form

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

Purpose

      To reduce the matrices A and E of the system pencil

              S =  ( A  B ) - lambda ( E  0 ) ,
                   ( C  0 )          ( 0  0 )

      corresponding to the descriptor triple (A-lambda E,B,C),
      to generalized upper Hessenberg form using orthogonal
      transformations,

           Q' * A * Z = H,   Q' * E * Z = T,

      where H is upper Hessenberg, T is upper triangular, Q and Z
      are orthogonal, and ' means transpose. The corresponding
      transformations, written compactly as diag(Q',I) * S * diag(Z,I),
      are also applied to B and C, getting Q' * B and C * Z.

      The orthogonal matrices Q and Z are determined as products of
      Givens rotations. They may either be formed explicitly, or they
      may be postmultiplied into input matrices Q1 and Z1, so that

           Q1 * A * Z1' = (Q1*Q) * H * (Z1*Z)'
           Q1 * E * Z1' = (Q1*Q) * T * (Z1*Z)'.

Specification

          SUBROUTINE TG01BD( JOBE, COMPQ, COMPZ, N, M, P, ILO, IHI, A, LDA,
         $                   E, LDE, B, LDB, C, LDC, Q, LDQ, Z, LDZ, DWORK,
         $                   LDWORK, INFO )
    C     .. Scalar Arguments ..
          CHARACTER          COMPQ, COMPZ, JOBE
          INTEGER            IHI, ILO, INFO, LDA, LDB, LDC, LDE, LDQ,
         $                   LDWORK, LDZ, M, N, P
    C     .. Array Arguments ..
          DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), C( LDC, * ),
         $                   DWORK(  * ), E( LDE, * ), Q( LDQ, * ),
         $                   Z( LDZ, * )

Arguments

Mode Parameters

      JOBE    CHARACTER*1
              Specifies whether E is a general square or an upper
              triangular matrix, as follows:
              = 'G':  E is a general square matrix;
              = 'U':  E is an upper triangular matrix.

      COMPQ   CHARACTER*1
              Indicates what should be done with matrix Q, as follows:
              = 'N':  do not compute Q;
              = 'I':  Q is initialized to the unit matrix, and the
                      orthogonal matrix Q is returned;
              = 'V':  Q must contain an orthogonal matrix Q1 on entry,
                      and the product Q1*Q is returned.

      COMPZ   CHARACTER*1
              Indicates what should be done with matrix Z, as follows:
              = 'N':  do not compute Z;
              = 'I':  Z is initialized to the unit matrix, and the
                      orthogonal matrix Z is returned;
              = 'V':  Z must contain an orthogonal matrix Z1 on entry,
                      and the product Z1*Z is returned.

Input/Output Parameters

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

      M       (input) INTEGER
              The number of columns of the matrix B.  M >= 0.

      P       (input) INTEGER
              The number of rows of the matrix C.  P >= 0.

      ILO     (input) INTEGER
      IHI     (input) INTEGER
              It is assumed that A and E are already upper triangular in
              rows and columns 1:ILO-1 and IHI+1:N.  ILO and IHI could
              normally be set by a previous call to LAPACK Library
              routine DGGBAL; otherwise they should be set to 1 and N,
              respectively.
              1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
              If JOBE = 'U', the matrix E is assumed upper triangular.

      A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
              On entry, the leading N-by-N part of this array must
              contain the state dynamics matrix A.
              On exit, the leading N-by-N part of this array contains
              the upper Hessenberg matrix H = Q' * A * Z. The elements
              below the first subdiagonal are set to zero.

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

      E       (input/output) DOUBLE PRECISION array, dimension (LDE,N)
              On entry, the leading N-by-N part of this array must
              contain the descriptor matrix E. If JOBE = 'U', this
              matrix is assumed upper triangular.
              On exit, the leading N-by-N part of this array contains
              the upper triangular matrix T = Q' * E * Z. The elements
              below the diagonal are set to zero.

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

      B       (input/output) DOUBLE PRECISION array, dimension (LDB,M)
              On entry, the leading N-by-M part of this array must
              contain the input/state matrix B.
              On exit, if M > 0, the leading N-by-M part of this array
              contains the transformed matrix Q' * B.
              The array B is not referenced if M = 0.

      LDB     INTEGER
              The leading dimension of array B.
              LDB >= MAX(1,N) if M > 0;  LDB >= 1 if M = 0.

      C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
              On entry, the leading P-by-N part of this array must
              contain the state/output matrix C.
              On exit, if P > 0, the leading P-by-N part of this array
              contains the transformed matrix C * Z.
              The array C is not referenced if P = 0.

      LDC     INTEGER
              The leading dimension of array C.  LDC >= MAX(1,P).

      Q       (input/output) DOUBLE PRECISION array, dimension (LDQ,N)
              If COMPQ = 'N':  Q is not referenced;
              If COMPQ = 'I':  on entry, Q need not be set, and on exit
                               it contains the orthogonal matrix Q,
                               where Q' is the product of the Givens
                               transformations which are applied to A,
                               E, and B on the left;
              If COMPQ = 'V':  on entry, Q must contain an orthogonal
                               matrix Q1, and on exit this is
                               overwritten by Q1*Q.

      LDQ     INTEGER
              The leading dimension of array Q.
              LDQ >= 1,        if COMPQ = 'N';
              LDQ >= MAX(1,N), if COMPQ = 'I' or 'V'.

      Z       (input/output) DOUBLE PRECISION array, dimension (LDZ,N)
              If COMPZ = 'N':  Z is not referenced;
              If COMPZ = 'I':  on entry, Z need not be set, and on exit
                               it contains the orthogonal matrix Z,
                               which is the product of the Givens
                               transformations applied to A, E, and C
                               on the right;
              If COMPZ = 'V':  on entry, Z must contain an orthogonal
                               matrix Z1, and on exit this is
                               overwritten by Z1*Z.

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

Workspace

      DWORK   DOUBLE PRECISION array, dimension (LDWORK)
              On exit, if INFO = 0, DWORK(1) contains the optimal value
              of LDWORK.

      LDWORK  INTEGER
              The dimension of the array DWORK.
              LDWORK >= 1,                          if JOBE = 'U';
              LDWORK >= MAX(1,IHI+1-ILO+MAX(NI,M)), if JOBE = 'G', where
              NI = N+1-ILO, if COMPQ = 'N', and NI = N, otherwise.
              For good performance, if JOBE = 'G', LDWORK must generally
              be larger, LDWORK >= MAX(1,IHI+1-ILO+MAX(NI,M)*NB), where
              NB is the optimal block size.

Error Indicator

      INFO    INTEGER
              = 0:  successful exit.
              < 0:  if INFO = -i, the i-th argument had an illegal
                    value.

Method

      First, this routine computes the QR factorization of E and applies
      the transformations to A, B, and possibly Q. Then, the routine
      reduces A to upper Hessenberg form, preserving E triangular, by
      an unblocked reduction [1], using two sequences of plane rotations
      applied alternately from the left and from the right. The
      corresponding transformations may be accumulated and/or applied
      to the matrices B and C. If JOBE = 'U', the initial reduction of E
      to upper triangular form is skipped.

      This routine is a modification and extension of the LAPACK Library
      routine DGGHRD [2].

References

      [1] Golub, G.H. and van Loan, C.F.
          Matrix Computations. Third Edition.
          M. D. Johns Hopkins University Press, Baltimore, 1996.

      [2] Anderson, E., Bai, Z., Bischof, C., Demmel, J., Dongarra, J.,
          Du Croz, J., Greenbaum, A., Hammarling, S., McKenney, A.,
          Ostrouchov, S., and Sorensen, D.
          LAPACK Users' Guide: Second Edition.
          SIAM, Philadelphia, 1995.

Further Comments

      None

Example

Program Text

      None

Program Data

      None

Program Results

      None

Return to index