DORMBR - VECT = 'Q', DORMBR overwrites the general real M-
       by-N matrix C with SIDE = 'L' SIDE = 'R' TRANS = 'N'


SYNOPSIS

       SUBROUTINE DORMBR( VECT, SIDE, TRANS, M,  N,  K,  A,  LDA,
                          TAU, C, LDC, WORK, LWORK, INFO )

           CHARACTER      SIDE, TRANS, VECT

           INTEGER        INFO, K, LDA, LDC, LWORK, M, N

           DOUBLE         PRECISION  A(  LDA,  *  ), C( LDC, * ),
                          TAU( * ), WORK( * )


PURPOSE

       If VECT = 'Q', DORMBR overwrites the general  real  M-by-N
       matrix C with SIDE = 'L' SIDE = 'R' TRANS = 'N': Q * C C *
       Q TRANS = 'T':      Q**T * C       C * Q**T

       If VECT = 'P', DORMBR overwrites the general  real  M-by-N
       matrix C with
                       SIDE = 'L'     SIDE = 'R'
       TRANS = 'N':      P * C          C * P
       TRANS = 'T':      P**T * C       C * P**T

       Here  Q and P**T are the orthogonal matrices determined by
       DGEBRD when reducing a real matrix A to bidiagonal form: A
       = Q * B * P**T. Q and P**T are defined as products of ele­
       mentary reflectors H(i) and G(i) respectively.

       Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq
       is  the  order  of the orthogonal matrix Q or P**T that is
       applied.

       If VECT = 'Q', A  is  assumed  to  have  been  an  NQ-by-K
       matrix: if nq >= k, Q = H(1) H(2) . . . H(k);
       if nq < k, Q = H(1) H(2) . . . H(nq-1).

       If VECT = 'P', A is assumed to have been a K-by-NQ matrix:
       if k < nq, P = G(1) G(2) . . . G(k);
       if k >= nq, P = G(1) G(2) . . . G(nq-1).


ARGUMENTS

       VECT    (input) CHARACTER*1
               = 'Q': apply Q or Q**T;
               = 'P': apply P or P**T.

       SIDE    (input) CHARACTER*1
               = 'L': apply Q, Q**T, P or P**T from the Left;
               = 'R': apply Q, Q**T, P or P**T from the Right.

               = 'N':  No transpose, apply Q  or P;
               = 'T':  Transpose, apply Q**T or P**T.

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

       N       (input) INTEGER
               The number of columns of the matrix C. N >= 0.

       K       (input) INTEGER
               If VECT = 'Q', the number of columns in the origi­
               nal  matrix reduced by DGEBRD.  If VECT = 'P', the
               number of rows in the original matrix  reduced  by
               DGEBRD.  K >= 0.

       A       (input) DOUBLE PRECISION array, dimension
               (LDA,min(nq,K))  if  VECT = 'Q' (LDA,nq)        if
               VECT = 'P' The vectors which define the elementary
               reflectors H(i) and G(i), whose products determine
               the matrices Q and P, as returned by DGEBRD.

       LDA     (input) INTEGER
               The leading dimension of the array A.  If  VECT  =
               'Q',  LDA  >=  max(1,nq);  if  VECT  = 'P', LDA >=
               max(1,min(nq,K)).

       TAU     (input) DOUBLE PRECISION array, dimension
               (min(nq,K))
               TAU(i)  must contain the scalar factor of the ele­
               mentary reflector H(i) or G(i) which determines  Q
               or  P, as returned by DGEBRD in the array argument
               TAUQ or TAUP.

       C       (input/output) DOUBLE PRECISION array, dimension
               (LDC,N)
               On  entry,  the  M-by-N  matrix  C.  On exit, C is
               overwritten by Q*C or Q**T*C or C*Q**T or  C*Q  or
               P*C or P**T*C or C*P or C*P**T.

       LDC     (input) INTEGER
               The  leading  dimension  of  the  array  C. LDC >=
               max(1,M).

       WORK     (workspace/output)  DOUBLE  PRECISION  array,
               dimension (LWORK)
               On exit, if INFO = 0, WORK(1) returns the  optimal
               LWORK.

       LWORK   (input) INTEGER
               The  dimension  of the array WORK.  If SIDE = 'L',
               LWORK  >=  max(1,N);  if  SIDE  =  'R',  LWORK  >=
               max(1,M).   For  optimum performance LWORK >= N*NB
               if SIDE = 'L', and LWORK >= M*NB if  SIDE  =  'R',


               If  LWORK = -1, then a workspace query is assumed;
               the routine only calculates the  optimal  size  of
               the  WORK  array,  returns this value as the first
               entry of the WORK  array,  and  no  error  message
               related to LWORK is issued by XERBLA.

       INFO    (output) INTEGER
               = 0:  successful exit
               < 0:  if INFO = -i, the i-th argument had an ille­
               gal value


Man(1) output converted with man2html