257      SUBROUTINE cggsvp( JOBU, JOBV, JOBQ, M, P, N, A, LDA, B, LDB,
 
  258     $                   TOLA, TOLB, K, L, U, LDU, V, LDV, Q, LDQ,
 
  259     $                   IWORK, RWORK, TAU, WORK, INFO )
 
  266      CHARACTER          JOBQ, JOBU, JOBV
 
  267      INTEGER            INFO, K, L, LDA, LDB, LDQ, LDU, LDV, M, N, P
 
  273      COMPLEX            A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
 
  274     $                   tau( * ), u( ldu, * ), v( ldv, * ), work( * )
 
  281      PARAMETER          ( CZERO = ( 0.0e+0, 0.0e+0 ),
 
  282     $                   cone = ( 1.0e+0, 0.0e+0 ) )
 
  285      LOGICAL            FORWRD, WANTQ, WANTU, WANTV
 
  298      INTRINSIC          abs, aimag, max, min, real
 
  304      cabs1( t ) = abs( real( t ) ) + abs( aimag( t ) )
 
  310      wantu = lsame( jobu, 
'U' )
 
  311      wantv = lsame( jobv, 
'V' )
 
  312      wantq = lsame( jobq, 
'Q' )
 
  316      IF( .NOT.( wantu .OR. lsame( jobu, 
'N' ) ) ) 
THEN 
  318      ELSE IF( .NOT.( wantv .OR. lsame( jobv, 
'N' ) ) ) 
THEN 
  320      ELSE IF( .NOT.( wantq .OR. lsame( jobq, 
'N' ) ) ) 
THEN 
  322      ELSE IF( m.LT.0 ) 
THEN 
  324      ELSE IF( p.LT.0 ) 
THEN 
  326      ELSE IF( n.LT.0 ) 
THEN 
  328      ELSE IF( lda.LT.max( 1, m ) ) 
THEN 
  330      ELSE IF( ldb.LT.max( 1, p ) ) 
THEN 
  332      ELSE IF( ldu.LT.1 .OR. ( wantu .AND. ldu.LT.m ) ) 
THEN 
  334      ELSE IF( ldv.LT.1 .OR. ( wantv .AND. ldv.LT.p ) ) 
THEN 
  336      ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) ) 
THEN 
  340         CALL xerbla( 
'CGGSVP', -info )
 
  350      CALL cgeqpf( p, n, b, ldb, iwork, tau, work, rwork, info )
 
  354      CALL clapmt( forwrd, m, n, a, lda, iwork )
 
  359      DO 20 i = 1, min( p, n )
 
  360         IF( cabs1( b( i, i ) ).GT.tolb )
 
  368         CALL claset( 
'Full', p, p, czero, czero, v, ldv )
 
  370     $      
CALL clacpy( 
'Lower', p-1, n, b( 2, 1 ), ldb, v( 2, 1 ),
 
  372         CALL cung2r( p, p, min( p, n ), v, ldv, tau, work, info )
 
  383     $   
CALL claset( 
'Full', p-l, n, czero, czero, b( l+1, 1 ),
 
  390         CALL claset( 
'Full', n, n, czero, cone, q, ldq )
 
  391         CALL clapmt( forwrd, n, n, q, ldq, iwork )
 
  394      IF( p.GE.l .AND. n.NE.l ) 
THEN 
  398         CALL cgerq2( l, n, b, ldb, tau, work, info )
 
  402         CALL cunmr2( 
'Right', 
'Conjugate transpose', m, n, l, b,
 
  403     $                ldb, tau, a, lda, work, info )
 
  408            CALL cunmr2( 
'Right', 
'Conjugate transpose', n, n, l, b,
 
  409     $                   ldb, tau, q, ldq, work, info )
 
  414         CALL claset( 
'Full', l, n-l, czero, czero, b, ldb )
 
  415         DO 60 j = n - l + 1, n
 
  416            DO 50 i = j - n + l + 1, l
 
  434      CALL cgeqpf( m, n-l, a, lda, iwork, tau, work, rwork, info )
 
  439      DO 80 i = 1, min( m, n-l )
 
  440         IF( cabs1( a( i, i ) ).GT.tola )
 
  446      CALL cunm2r( 
'Left', 
'Conjugate transpose', m, l,
 
  447     $             min( m, n-l ), a, lda, tau, a( 1, n-l+1 ), lda, work,
 
  454         CALL claset( 
'Full', m, m, czero, czero, u, ldu )
 
  456     $      
CALL clacpy( 
'Lower', m-1, n-l, a( 2, 1 ), lda,
 
  458         CALL cung2r( m, m, min( m, n-l ), u, ldu, tau, work, info )
 
  465         CALL clapmt( forwrd, n, n-l, q, ldq, iwork )
 
  477     $   
CALL claset( 
'Full', m-k, n-l, czero, czero, a( k+1, 1 ),
 
  484         CALL cgerq2( k, n-l, a, lda, tau, work, info )
 
  490            CALL cunmr2( 
'Right', 
'Conjugate transpose', n, n-l, k,
 
  491     $                   a, lda, tau, q, ldq, work, info )
 
  496         CALL claset( 
'Full', k, n-l-k, czero, czero, a, lda )
 
  497         DO 120 j = n - l - k + 1, n - l
 
  498            DO 110 i = j - n + l + k + 1, k
 
  509         CALL cgeqr2( m-k, l, a( k+1, n-l+1 ), lda, tau, work, info )
 
  515            CALL cunm2r( 
'Right', 
'No transpose', m, m-k,
 
  516     $                   min( m-k, l ), a( k+1, n-l+1 ), lda, tau,
 
  517     $                   u( 1, k+1 ), ldu, work, info )
 
  522         DO 140 j = n - l + 1, n
 
  523            DO 130 i = j - n + k + l + 1, m