DGGSVP  - compute orthogonal matrices U, V and Q such that
       N-K-L K L U'*A*Q = K ( 0 A12 A13 ) if M-K-L >= 0


SYNOPSIS

       SUBROUTINE DGGSVP( JOBU, JOBV, JOBQ, M, P, N, A,  LDA,  B,
                          LDB,  TOLA, TOLB, K, L, U, LDU, V, LDV,
                          Q, LDQ, IWORK, TAU, WORK, INFO )

           CHARACTER      JOBQ, JOBU, JOBV

           INTEGER        INFO, K, L, LDA, LDB, LDQ, LDU, LDV, M,
                          N, P

           DOUBLE         PRECISION TOLA, TOLB

           INTEGER        IWORK( * )

           DOUBLE         PRECISION  A( LDA, * ), B( LDB, * ), Q(
                          LDQ, * ), TAU( * ), U(  LDU,  *  ),  V(
                          LDV, * ), WORK( * )


PURPOSE

       DGGSVP  computes  orthogonal matrices U, V and Q such that
       N-K-L K L U'*A*Q = K  (  0  A12  A13  )  if  M-K-L  >=  0;
       L ( 0     0   A23 )
                 M-K-L ( 0     0    0  )

                        N-K-L  K    L
               =     K ( 0    A12  A13 )  if M-K-L < 0;
                   M-K ( 0     0   A23 )

                      N-K-L  K    L
        V'*B*Q =   L ( 0     0   B13 )
                 P-L ( 0     0    0  )

       where the K-by-K matrix A12 and L-by-L matrix B13 are non­
       singular upper triangular; A23 is L-by-L upper  triangular
       if  M-K-L  >=  0, otherwise A23 is (M-K)-by-L upper trape­
       zoidal.   K+L  =  the  effective  numerical  rank  of  the
       (M+P)-by-N  matrix  (A',B')'.  Z' denotes the transpose of
       Z.

       This decomposition is the preprocessing step for computing
       the  Generalized  Singular Value Decomposition (GSVD), see
       subroutine DGGSVD.


ARGUMENTS

       JOBU    (input) CHARACTER*1
               = 'U':  Orthogonal matrix U is computed;
               = 'N':  U is not computed.

               = 'V':  Orthogonal matrix V is computed;
               = 'N':  V is not computed.

       JOBQ    (input) CHARACTER*1
               = 'Q':  Orthogonal matrix Q is computed;
               = 'N':  Q is not computed.

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

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

       N       (input) INTEGER
               The number of columns of the matrices A and B.   N
               >= 0.

       A       (input/output) DOUBLE PRECISION array, dimension
               (LDA,N)
               On entry, the M-by-N matrix A.  On  exit,  A  con­
               tains   the  triangular  (or  trapezoidal)  matrix
               described in the Purpose section.

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

       B       (input/output) DOUBLE PRECISION array, dimension
               (LDB,N)
               On entry, the P-by-N matrix B.  On  exit,  B  con­
               tains  the triangular matrix described in the Pur­
               pose section.

       LDB     (input) INTEGER
               The leading dimension  of  the  array  B.  LDB  >=
               max(1,P).

       TOLA    (input) DOUBLE PRECISION
               TOLB    (input) DOUBLE PRECISION TOLA and TOLB are
               the thresholds to determine the effective  numeri­
               cal  rank  of matrix B and a subblock of A. Gener­
               ally,    they    are     set     to     TOLA     =
               MAX(M,N)*norm(A)*MAZHEPS,          TOLB          =
               MAX(P,N)*norm(B)*MAZHEPS.  The size  of  TOLA  and
               TOLB may affect the size of backward errors of the
               decomposition.

       K       (output) INTEGER
               L       (output) INTEGER On exit, K and L  specify
               the  dimension  of the subblocks described in Pur­
               pose.   K  +  L  =  effective  numerical  rank  of
               (A',B')'.

               If JOBU = 'U', U contains the orthogonal matrix U.
               If JOBU = 'N', U is not referenced.

       LDU     (input) INTEGER
               The  leading  dimension  of  the  array  U. LDU >=
               max(1,M) if JOBU = 'U'; LDU >= 1 otherwise.

       V       (output) DOUBLE PRECISION array, dimension (LDV,M)
               If JOBV = 'V', V contains the orthogonal matrix V.
               If JOBV = 'N', V is not referenced.

       LDV     (input) INTEGER
               The leading dimension  of  the  array  V.  LDV  >=
               max(1,P) if JOBV = 'V'; LDV >= 1 otherwise.

       Q       (output) DOUBLE PRECISION array, dimension (LDQ,N)
               If JOBQ = 'Q', Q contains the orthogonal matrix Q.
               If JOBQ = 'N', Q is not referenced.

       LDQ     (input) INTEGER
               The  leading  dimension  of  the  array  Q. LDQ >=
               max(1,N) if JOBQ = 'Q'; LDQ >= 1 otherwise.

       IWORK   (workspace) INTEGER array, dimension (N)

       TAU     (workspace) DOUBLE PRECISION array, dimension (N)

       WORK      (workspace)   DOUBLE   PRECISION    array,
               dimension (max(3*N,M,P))

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


FURTHER DETAILS

       The  subroutine  uses  LAPACK subroutine DGEQPF for the QR
       factorization with column pivoting to detect the effective
       numerical  rank  of  the a matrix. It may be replaced by a
       better rank determination strategy.


Man(1) output converted with man2html