## MB02CX

### Bringing the first blocks of a generator in proper form

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

Purpose

      To bring the first blocks of a generator in proper form.
      The columns / rows of the positive and negative generators
      are contained in the arrays A and B, respectively.
      Transformation information will be stored and can be applied
      via SLICOT Library routine MB02CY.

Specification

          SUBROUTINE MB02CX( TYPET, P, Q, K, A, LDA, B, LDB, CS, LCS,
         $                   DWORK, LDWORK, INFO )
    C     .. Scalar Arguments ..
          CHARACTER         TYPET
          INTEGER           INFO, K, LDA, LDB, LCS, LDWORK, P, Q
    C     .. Array Arguments ..
          DOUBLE PRECISION  A(LDA, *), B(LDB, *), CS(*), DWORK(*)

Arguments

Mode Parameters

      TYPET   CHARACTER*1
              Specifies the type of the generator, as follows:
              = 'R':  A and B are the first blocks of the rows of the
                      positive and negative generators;
              = 'C':  A and B are the first blocks of the columns of the
                      positive and negative generators.
              Note:   in the sequel, the notation x / y means that
                      x corresponds to TYPET = 'R' and y corresponds to
                      TYPET = 'C'.

Input/Output Parameters

      P       (input)  INTEGER
              The number of rows / columns in A containing the positive
              generators.  P >= 0.

      Q       (input)  INTEGER
              The number of rows / columns in B containing the negative
              generators.  Q >= 0.

      K       (input)  INTEGER
              The number of columns / rows in A and B to be processed.
              Normally, the size of the first block.  P >= K >= 0.

      A       (input/output)  DOUBLE PRECISION array, dimension
              (LDA, K) / (LDA, P)
              On entry, the leading P-by-K upper / K-by-P lower
              triangular part of this array must contain the rows /
              columns of the positive part in the first block of the
              generator.
              On exit, the leading P-by-K upper / K-by-P lower
              triangular part of this array contains the rows / columns
              of the positive part in the first block of the proper
              generator.
              The lower / upper trapezoidal part is not referenced.

      LDA     INTEGER
              The leading dimension of the array A.
              LDA >= MAX(1,P),    if TYPET = 'R';
              LDA >= MAX(1,K),    if TYPET = 'C'.

      B       (input/output)  DOUBLE PRECISION array, dimension
              (LDB, K) / (LDB, Q)
              On entry, the leading Q-by-K / K-by-Q part of this array
              must contain the rows / columns of the negative part in
              the first block of the generator.
              On exit, the leading Q-by-K / K-by-Q part of this array
              contains part of the necessary information for the
              Householder transformations.

      LDB     INTEGER
              The leading dimension of the array B.
              LDB >= MAX(1,Q),    if TYPET = 'R';
              LDB >= MAX(1,K),    if TYPET = 'C'.

      CS      (output)  DOUBLE PRECISION array, dimension (LCS)
              On exit, the leading 2*K + MIN(K,Q) part of this array
              contains necessary information for the SLICOT Library
              routine MB02CY (modified hyperbolic rotation parameters
              and scalar factors of the Householder transformations).

      LCS     INTEGER
              The length of the array CS.  LCS >= 2*K + MIN(K,Q).

Workspace

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

      LDWORK  INTEGER
              The length of the array DWORK.  LDWORK >= MAX(1,K).
              For optimum performance LDWORK should be larger.

Error Indicator

      INFO    INTEGER
              = 0:  succesful exit;
              < 0:  if INFO = -i, the i-th argument had an illegal
                    value;
              = 1:  the reduction algorithm failed. The matrix
                    associated with the generator is not (numerically)
                    positive definite.

Method

      If  TYPET = 'R',  a QR decomposition of B is first computed.
      Then, the elements below the first row of each column i of B
      are annihilated by a Householder transformation modifying the
      first element in that column. This first element, in turn, is
      then annihilated by a modified hyperbolic rotation, acting also
      on the i-th row of A.

      If  TYPET = 'C',  an LQ decomposition of B is first computed.
      Then, the elements on the right of the first column of each row i
      of B are annihilated by a Householder transformation modifying the
      first element in that row. This first element, in turn, is
      then annihilated by a modified hyperbolic rotation, acting also
      on the i-th column of A.

Further Comments

      None

Example

Program Text

      None

Program Data

      None

Program Results

      None

Return to Supporting Routines index