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