## MB04QU

### Applying a product of symplectic reflectors and Givens rotations to two general real matrices (unblocked version)

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

Purpose

      To overwrite general real m-by-n matrices C and D, or their
      transposes, with

                [ op(C) ]
          Q  *  [       ]   if TRANQ = 'N', or
                [ op(D) ]

           T    [ op(C) ]
          Q  *  [       ]   if TRANQ = 'T',
                [ op(D) ]

      where Q is defined as the product of symplectic reflectors and
      Givens rotations,

          Q = diag( H(1),H(1) ) G(1) diag( F(1),F(1) )
              diag( H(2),H(2) ) G(2) diag( F(2),F(2) )
                                ....
              diag( H(k),H(k) ) G(k) diag( F(k),F(k) ).

      Unblocked version.

Specification

          SUBROUTINE MB04QU( TRANC, TRAND, TRANQ, STOREV, STOREW, M, N, K,
         $                   V, LDV, W, LDW, C, LDC, D, LDD, CS, TAU, DWORK,
         $                   LDWORK, INFO )
    C     .. Scalar Arguments ..
          CHARACTER         STOREV, STOREW, TRANC, TRAND, TRANQ
          INTEGER           INFO, K, LDC, LDD, LDV, LDW, LDWORK, M, N
    C     .. Array Arguments ..
          DOUBLE PRECISION  CS(*), DWORK(*), C(LDC,*), D(LDD,*), V(LDV,*),
         $                  W(LDW,*), TAU(*)

Arguments

Mode Parameters

      TRANC   CHARACTER*1
              Specifies the form of op( C ) as follows:
              = 'N':  op( C ) = C;
              = 'T':  op( C ) = C';
              = 'C':  op( C ) = C'.

      STOREV  CHARACTER*1
              Specifies how the vectors which define the concatenated
              Householder reflectors contained in V are stored:
              = 'C':  columnwise;
              = 'R':  rowwise.

      STOREW  CHARACTER*1
              Specifies how the vectors which define the concatenated
              Householder reflectors contained in W are stored:
              = 'C':  columnwise;
              = 'R':  rowwise.

      TRAND   CHARACTER*1
              Specifies the form of op( D ) as follows:
              = 'N':  op( D ) = D;
              = 'T':  op( D ) = D';
              = 'C':  op( D ) = D'.

      TRANQ   CHARACTER*1
              = 'N':  apply Q;
              = 'T':  apply Q'.

Input/Output Parameters

      M       (input) INTEGER
              The number of rows of the matrices op(C) and op(D).
              M >= 0.

      N       (input) INTEGER
              The number of columns of the matrices op(C) and op(D).
              N >= 0.

      K       (input) INTEGER
              The number of elementary reflectors whose product defines
              the matrix Q.  M >= K >= 0.

      V       (input) DOUBLE PRECISION array, dimension
                      (LDV,K) if STOREV = 'C',
                      (LDV,M) if STOREV = 'R'
              On entry with STOREV = 'C', the leading M-by-K part of
              this array must contain in its columns the vectors which
              define the elementary reflectors F(i).
              On entry with STOREV = 'R', the leading K-by-M part of
              this array must contain in its rows the vectors which
              define the elementary reflectors F(i).

      LDV     INTEGER
              The leading dimension of the array V.
              LDV >= MAX(1,M),  if STOREV = 'C';
              LDV >= MAX(1,K),  if STOREV = 'R'.

      W       (input) DOUBLE PRECISION array, dimension
                      (LDW,K) if STOREW = 'C',
                      (LDW,M) if STOREW = 'R'
              On entry with STOREW = 'C', the leading M-by-K part of
              this array must contain in its columns the vectors which
              define the elementary reflectors H(i).
              On entry with STOREW = 'R', the leading K-by-M part of
              this array must contain in its rows the vectors which
              define the elementary reflectors H(i).

      LDW     INTEGER
              The leading dimension of the array W.
              LDW >= MAX(1,M),  if STOREW = 'C';
              LDW >= MAX(1,K),  if STOREW = 'R'.

      C       (input/output) DOUBLE PRECISION array, dimension
                      (LDC,N) if TRANC = 'N',
                      (LDC,M) if TRANC = 'T' or TRANC = 'C'
              On entry with TRANC = 'N', the leading M-by-N part of
              this array must contain the matrix C.
              On entry with TRANC = 'C' or TRANC = 'T', the leading
              N-by-M part of this array must contain the transpose of
              the matrix C.
              On exit with TRANC = 'N', the leading M-by-N part of
              this array contains the updated matrix C.
              On exit with TRANC = 'C' or TRANC = 'T', the leading
              N-by-M part of this array contains the transpose of the
              updated matrix C.

      LDC     INTEGER
              The leading dimension of the array C.
              LDC >= MAX(1,M),  if TRANC = 'N';
              LDC >= MAX(1,N),  if TRANC = 'T' or TRANC = 'C'.

      D       (input/output) DOUBLE PRECISION array, dimension
                      (LDD,N) if TRAND = 'N',
                      (LDD,M) if TRAND = 'T' or TRAND = 'C'
              On entry with TRAND = 'N', the leading M-by-N part of
              this array must contain the matrix D.
              On entry with TRAND = 'C' or TRAND = 'T', the leading
              N-by-M part of this array must contain the transpose of
              the matrix D.
              On exit with TRAND = 'N', the leading M-by-N part of
              this array contains the updated matrix D.
              On exit with TRAND = 'C' or TRAND = 'T', the leading
              N-by-M part of this array contains the transpose of the
              updated matrix D.

      LDD     INTEGER
              The leading dimension of the array D.
              LDD >= MAX(1,M),  if TRAND = 'N';
              LDD >= MAX(1,N),  if TRAND = 'T' or TRAND = 'C'.

      CS      (input) DOUBLE PRECISION array, dimension (2*K)
              On entry, the first 2*K elements of this array must
              contain the cosines and sines of the symplectic Givens
              rotations G(i).

      TAU     (input) DOUBLE PRECISION array, dimension (K)
              On entry, the first K elements of this array must
              contain the scalar factors of the elementary reflectors
              F(i).

Workspace

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

      LDWORK  INTEGER
              The length of the array DWORK.  LDWORK >= MAX(1,N).

Error Indicator

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

Further Comments

      None

Example

Program Text

      None

Program Data

      None

Program Results

      None

Return to Supporting Routines index