348      SUBROUTINE zggsvd3( JOBU, JOBV, JOBQ, M, N, P, K, L, A, LDA, B,
 
  349     $                    LDB, ALPHA, BETA, U, LDU, V, LDV, Q, LDQ,
 
  350     $                    WORK, LWORK, RWORK, IWORK, INFO )
 
  357      CHARACTER          JOBQ, JOBU, JOBV
 
  358      INTEGER            INFO, K, L, LDA, LDB, LDQ, LDU, LDV, M, N, P,
 
  363      DOUBLE PRECISION   ALPHA( * ), BETA( * ), RWORK( * )
 
  364      COMPLEX*16         A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
 
  365     $                   u( ldu, * ), v( ldv, * ), work( * )
 
  371      LOGICAL            WANTQ, WANTU, WANTV, LQUERY
 
  372      INTEGER            I, IBND, ISUB, J, NCYCLE, LWKOPT
 
  373      DOUBLE PRECISION   ANORM, BNORM, SMAX, TEMP, TOLA, TOLB, ULP, UNFL
 
  377      DOUBLE PRECISION   DLAMCH, ZLANGE
 
  378      EXTERNAL           lsame, dlamch, zlange
 
  390      wantu = lsame( jobu, 
'U' )
 
  391      wantv = lsame( jobv, 
'V' )
 
  392      wantq = lsame( jobq, 
'Q' )
 
  393      lquery = ( lwork.EQ.-1 )
 
  399      IF( .NOT.( wantu .OR. lsame( jobu, 
'N' ) ) ) 
THEN 
  401      ELSE IF( .NOT.( wantv .OR. lsame( jobv, 
'N' ) ) ) 
THEN 
  403      ELSE IF( .NOT.( wantq .OR. lsame( jobq, 
'N' ) ) ) 
THEN 
  405      ELSE IF( m.LT.0 ) 
THEN 
  407      ELSE IF( n.LT.0 ) 
THEN 
  409      ELSE IF( p.LT.0 ) 
THEN 
  411      ELSE IF( lda.LT.max( 1, m ) ) 
THEN 
  413      ELSE IF( ldb.LT.max( 1, p ) ) 
THEN 
  415      ELSE IF( ldu.LT.1 .OR. ( wantu .AND. ldu.LT.m ) ) 
THEN 
  417      ELSE IF( ldv.LT.1 .OR. ( wantv .AND. ldv.LT.p ) ) 
THEN 
  419      ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) ) 
THEN 
  421      ELSE IF( lwork.LT.1 .AND. .NOT.lquery ) 
THEN 
  428         CALL zggsvp3( jobu, jobv, jobq, m, p, n, a, lda, b, ldb,
 
  430     $                 tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, rwork,
 
  431     $                 work, work, -1, info )
 
  432         lwkopt = n + int( work( 1 ) )
 
  433         lwkopt = max( 2*n, lwkopt )
 
  434         lwkopt = max( 1, lwkopt )
 
  435         work( 1 ) = dcmplx( lwkopt )
 
  439         CALL xerbla( 
'ZGGSVD3', -info )
 
  448      anorm = zlange( 
'1', m, n, a, lda, rwork )
 
  449      bnorm = zlange( 
'1', p, n, b, ldb, rwork )
 
  454      ulp = dlamch( 
'Precision' )
 
  455      unfl = dlamch( 
'Safe Minimum' )
 
  456      tola = max( m, n )*max( anorm, unfl )*ulp
 
  457      tolb = max( p, n )*max( bnorm, unfl )*ulp
 
  459      CALL zggsvp3( jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola,
 
  460     $              tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, rwork,
 
  461     $              work, work( n+1 ), lwork-n, info )
 
  465      CALL ztgsja( jobu, jobv, jobq, m, p, n, k, l, a, lda, b, ldb,
 
  466     $             tola, tolb, alpha, beta, u, ldu, v, ldv, q, ldq,
 
  467     $             work, ncycle, info )
 
  472      CALL dcopy( n, alpha, 1, rwork, 1 )
 
  480         DO 10 j = i + 1, ibnd
 
  482            IF( temp.GT.smax ) 
THEN 
  488            rwork( k+isub ) = rwork( k+i )
 
  490            iwork( k+i ) = k + isub
 
  496      work( 1 ) = dcmplx( lwkopt )
 
 
subroutine zggsvd3(jobu, jobv, jobq, m, n, p, k, l, a, lda, b, ldb, alpha, beta, u, ldu, v, ldv, q, ldq, work, lwork, rwork, iwork, info)
ZGGSVD3 computes the singular value decomposition (SVD) for OTHER matrices
 
subroutine zggsvp3(jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola, tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, rwork, tau, work, lwork, info)
ZGGSVP3
 
subroutine ztgsja(jobu, jobv, jobq, m, p, n, k, l, a, lda, b, ldb, tola, tolb, alpha, beta, u, ldu, v, ldv, q, ldq, work, ncycle, info)
ZTGSJA