ZGGSVP - compute unitary 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 ZGGSVP( JOBU, JOBV, JOBQ, M, P, N, A,  LDA,  B,
                          LDB,  TOLA, TOLB, K, L, U, LDU, V, LDV,
                          Q, LDQ, IWORK, RWORK, 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 RWORK( * )

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


PURPOSE

       ZGGSVP computes unitary 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  conjugate
       transpose of Z.

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


ARGUMENTS

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

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

       JOBQ    (input) CHARACTER*1
               = 'Q':  Unitary 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) COMPLEX*16 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) COMPLEX*16 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 section.  K + L = effective numerical rank of
               (A',B')'.

       U       (output) COMPLEX*16 array, dimension (LDU,M)
               If JOBU = 'U', U contains the  unitary  matrix  U.


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

       V       (output) COMPLEX*16 array, dimension (LDV,M)
               If JOBV = 'V', V contains the  unitary  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) COMPLEX*16 array, dimension (LDQ,N)
               If JOBQ = 'Q', Q contains the  unitary  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)

       RWORK   (workspace) DOUBLE PRECISION array, dimension
               (2*N)

       TAU     (workspace) COMPLEX*16 array, dimension (N)

       WORK    (workspace) COMPLEX*16 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 ZGEQPF 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