NAME

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 * 1 JOBU, JOBV, JOBQ
  DOUBLE COMPLEX A(LDA,*), B(LDB,*), U(LDU,*), V(LDV,*), Q(LDQ,*), TAU(*), WORK(*)
  INTEGER M, P, N, LDA, LDB, K, L, LDU, LDV, LDQ, INFO
  INTEGER IWORK(*)
  DOUBLE PRECISION TOLA, TOLB
  DOUBLE PRECISION RWORK(*)
  SUBROUTINE ZGGSVP_64( 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 * 1 JOBU, JOBV, JOBQ
  DOUBLE COMPLEX A(LDA,*), B(LDB,*), U(LDU,*), V(LDV,*), Q(LDQ,*), TAU(*), WORK(*)
  INTEGER*8 M, P, N, LDA, LDB, K, L, LDU, LDV, LDQ, INFO
  INTEGER*8 IWORK(*)
  DOUBLE PRECISION TOLA, TOLB
  DOUBLE PRECISION RWORK(*)

F95 INTERFACE

  SUBROUTINE GGSVP( 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(LEN=1) :: JOBU, JOBV, JOBQ
  COMPLEX(8), DIMENSION(:) :: TAU, WORK
  COMPLEX(8), DIMENSION(:,:) :: A, B, U, V, Q
  INTEGER :: M, P, N, LDA, LDB, K, L, LDU, LDV, LDQ, INFO
  INTEGER, DIMENSION(:) :: IWORK
  REAL(8) :: TOLA, TOLB
  REAL(8), DIMENSION(:) :: RWORK
  SUBROUTINE GGSVP_64( 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(LEN=1) :: JOBU, JOBV, JOBQ
  COMPLEX(8), DIMENSION(:) :: TAU, WORK
  COMPLEX(8), DIMENSION(:,:) :: A, B, U, V, Q
  INTEGER(8) :: M, P, N, LDA, LDB, K, L, LDU, LDV, LDQ, INFO
  INTEGER(8), DIMENSION(:) :: IWORK
  REAL(8) :: TOLA, TOLB
  REAL(8), DIMENSION(:) :: RWORK

C INTERFACE

#include <sunperf.h>

void zggsvp(char jobu, char jobv, char jobq, int m, int p, int n, doublecomplex *a, int lda, doublecomplex *b, int ldb, double tola, double tolb, int *k, int *l, doublecomplex *u, int ldu, doublecomplex *v, int ldv, doublecomplex *q, int ldq, int *info);

void zggsvp_64(char jobu, char jobv, char jobq, long m, long p, long n, doublecomplex *a, long lda, doublecomplex *b, long ldb, double tola, double tolb, long *k, long *l, doublecomplex *u, long ldu, doublecomplex *v, long ldv, doublecomplex *q, long ldq, long *info);


PURPOSE

zggsvp computes unitary matrices U, V and Q such that 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 nonsingular upper triangular; A23 is L-by-L upper triangular if M-K-L >= 0, otherwise A23 is (M-K)-by-L upper trapezoidal. 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 CGGSVD.


ARGUMENTS


FURTHER DETAILS

The subroutine uses LAPACK subroutine CGEQPF 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.