253 SUBROUTINE sggsvp( JOBU, JOBV, JOBQ, M, P, N, A, LDA, B, LDB,
254 $ TOLA, TOLB, K, L, U, LDU, V, LDV, Q, LDQ,
255 $ IWORK, TAU, WORK, INFO )
262 CHARACTER JOBQ, , JOBV
263 INTEGER INFO, K, L, , LDB, LDQ, LDU, LDV, M, , P
268 REAL A( , * ), ( LDB, * ), Q( LDQ
276 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
279 LOGICAL FORWRD, WANTQ, WANTU,
297 wantu = lsame( jobu,
'U' )
298 wantv = lsame( jobv,
'V' )
299 wantq = lsame( jobq,
'Q' )
303 IF( .NOT.( wantu .OR. lsame( jobu,
'N' ) ) )
THEN
305 ELSE IF( .NOT.( wantv .OR. lsame( jobv,
'N' ) ) )
THEN
307 ELSE IF( .NOT.( wantq .OR. lsame( jobq,
'N' ) ) )
THEN
309 ELSE IF( m.LT.0 )
THEN
311 ELSE IF( p.LT.0 )
THEN
313 ELSE IF( n.LT.0 )
THEN
315 ELSE IF( lda.LT.
max( 1, m ) )
THEN
317 ELSE IF( ldb.LT.
max( 1, p ) )
THEN
319 ELSE IF( ldu.LT.1 .OR. ( wantu .AND. ldu.LT.m ) )
THEN
321 ELSE IF( ldv.LT.1 .OR. ( wantv .AND. ldv.LT.p ) )
THEN
323 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN
327 CALL xerbla(
'SGGSVP', -info )
337 CALL sgeqpf( p, n, b, ldb, iwork, tau, work, info )
341 CALL slapmt( forwrd, m, n, a, lda, iwork )
346 DO 20 i = 1,
min( p, n )
347 IF( abs( b( i, i ) ).GT.tolb )
355 CALL slaset(
'Full', p, p, zero, zero, v, ldv )
357 $
CALL slacpy(
'Lower', p-1, n, b( 2, 1 ), ldb, v( 2, 1 ),
359 CALL sorg2r( p, p,
min( p, n ), v, ldv, tau, work, info )
370 $
CALL slaset(
'Full', p-l, n, zero, zero, b( l+1, 1 ), ldb )
376 CALL slaset(
'Full', n, n, zero, one, q, ldq )
377 CALL slapmt( forwrd, n, n, q, ldq, iwork )
380 IF( p.GE.l .AND. n.NE.l )
THEN
384 CALL sgerq2( l, n, b, ldb, tau, work, info )
388 CALL sormr2( 'right
', 'transpose
', M, N, L, B, LDB, TAU, A,
395 CALL SORMR2( 'right
', 'transpose
', N, N, L, B, LDB, TAU, Q,
401 CALL SLASET( 'full
', L, N-L, ZERO, ZERO, B, LDB )
402 DO 60 J = N - L + 1, N
403 DO 50 I = J - N + L + 1, L
421 CALL SGEQPF( M, N-L, A, LDA, IWORK, TAU, WORK, INFO )
426 DO 80 I = 1, MIN( M, N-L )
427.GT.
IF( ABS( A( I, I ) )TOLA )
433 CALL SORM2R( 'left',
'Transpose', m, l,
min( m, n-l ), a, lda,
434 $ tau, a( 1, n-l+1 ), lda, work, info )
440 CALL slaset(
'Full', m, m, zero, zero, u, ldu )
442 $
CALL slacpy(
'Lower', m-1, n-l, a( 2, 1 ), lda, u( 2, 1 ),
444 CALL sorg2r( m, m,
min( m, n-l ), u, ldu, tau, work, info )
451 CALL slapmt( forwrd, n, n-l, q, ldq, iwork )
463 $
CALL slaset(
'Full', m-k, n-l, zero, zero, a( k+1, 1 ), lda )
469 CALL sgerq2( k, n-l, a, lda, tau, work, info )
475 CALL sormr2(
'Right',
'Transpose', n, n-l, k, a, lda, tau,
476 $ q, ldq, work, info )
481 CALL slaset(
'Full', k, n-l-k, zero, zero, a, lda )
482 DO 120 j = n - l - k + 1, n - l
483 DO 110 i = j - n + l + k + 1, k
494 CALL sgeqr2( m-k, l, a( k+1, n-l+1 ), lda, tau, work, info )
500 CALL sorm2r(
'Right',
'No transpose', m, m-k,
min( m-k, l ),
501 $ a( k+1, n-l+1 ), lda, tau, u( 1, k+1 ), ldu,
507 DO 140 j = n - l + 1, n
508 DO 130 i = j - n + k + l + 1, m
subroutine sggsvp(jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola, tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, tau, work, info)
SGGSVP