269 SUBROUTINE sggsvp3( JOBU, JOBV, JOBQ, M, P, N, A, LDA, B, LDB,
270 $ TOLA, TOLB, K, L, U, LDU, V, LDV, Q, LDQ,
271 $ IWORK, TAU, WORK, LWORK, INFO )
280 CHARACTER JOBQ, JOBU, JOBV
281 INTEGER INFO, K, L, LDA, LDB, LDQ, LDU, LDV, M, N, P,
287 REAL A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
288 $ tau( * ), u( ldu, * ), v( ldv, * ), work( * )
295 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
298 LOGICAL FORWRD, WANTQ, WANTU, WANTV, LQUERY
310 INTRINSIC abs, max, min
316 wantu = lsame( jobu,
'U' )
317 wantv = lsame( jobv,
'V' )
318 wantq = lsame( jobq,
'Q' )
320 lquery = ( lwork.EQ.-1 )
326 IF( .NOT.( wantu .OR. lsame( jobu,
'N' ) ) )
THEN
328 ELSE IF( .NOT.( wantv .OR. lsame( jobv,
'N' ) ) )
THEN
330 ELSE IF( .NOT.( wantq .OR. lsame( jobq,
'N' ) ) )
THEN
332 ELSE IF( m.LT.0 )
THEN
334 ELSE IF( p.LT.0 )
THEN
336 ELSE IF( n.LT.0 )
THEN
338 ELSE IF( lda.LT.max( 1, m ) )
THEN
340 ELSE IF( ldb.LT.max( 1, p ) )
THEN
342 ELSE IF( ldu.LT.1 .OR. ( wantu .AND. ldu.LT.m ) )
THEN
344 ELSE IF( ldv.LT.1 .OR. ( wantv .AND. ldv.LT.p ) )
THEN
346 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN
348 ELSE IF( lwork.LT.1 .AND. .NOT.lquery )
THEN
355 CALL sgeqp3( p, n, b, ldb, iwork, tau, work, -1, info )
356 lwkopt = int( work( 1 ) )
358 lwkopt = max( lwkopt, p )
360 lwkopt = max( lwkopt, min( n, p ) )
361 lwkopt = max( lwkopt, m )
363 lwkopt = max( lwkopt, n )
365 CALL sgeqp3( m, n, a, lda, iwork, tau, work, -1, info )
366 lwkopt = max( lwkopt, int( work( 1 ) ) )
367 lwkopt = max( 1, lwkopt )
368 work( 1 ) = real( lwkopt )
372 CALL xerbla(
'SGGSVP3', -info )
385 CALL sgeqp3( p, n, b, ldb, iwork, tau, work, lwork, info )
389 CALL slapmt( forwrd, m, n, a, lda, iwork )
394 DO 20 i = 1, min( p, n )
395 IF( abs( b( i, i ) ).GT.tolb )
403 CALL slaset(
'Full', p, p, zero, zero, v, ldv )
405 $
CALL slacpy(
'Lower', p-1, n, b( 2, 1 ), ldb, v( 2, 1 ),
407 CALL sorg2r( p, p, min( p, n ), v, ldv, tau, work, info )
418 $
CALL slaset(
'Full', p-l, n, zero, zero, b( l+1, 1 ), ldb )
424 CALL slaset(
'Full', n, n, zero, one, q, ldq )
425 CALL slapmt( forwrd, n, n, q, ldq, iwork )
428 IF( p.GE.l .AND. n.NE.l )
THEN
432 CALL sgerq2( l, n, b, ldb, tau, work, info )
436 CALL sormr2(
'Right',
'Transpose', m, n, l, b, ldb, tau, a,
443 CALL sormr2(
'Right',
'Transpose', n, n, l, b, ldb, tau, q,
449 CALL slaset(
'Full', l, n-l, zero, zero, b, ldb )
450 DO 60 j = n - l + 1, n
451 DO 50 i = j - n + l + 1, l
469 CALL sgeqp3( m, n-l, a, lda, iwork, tau, work, lwork, info )
474 DO 80 i = 1, min( m, n-l )
475 IF( abs( a( i, i ) ).GT.tola )
481 CALL sorm2r(
'Left',
'Transpose', m, l, min( m, n-l ), a, lda,
482 $ tau, a( 1, n-l+1 ), lda, work, info )
488 CALL slaset(
'Full', m, m, zero, zero, u, ldu )
490 $
CALL slacpy(
'Lower', m-1, n-l, a( 2, 1 ), lda, u( 2, 1 ),
492 CALL sorg2r( m, m, min( m, n-l ), u, ldu, tau, work, info )
499 CALL slapmt( forwrd, n, n-l, q, ldq, iwork )
511 $
CALL slaset(
'Full', m-k, n-l, zero, zero, a( k+1, 1 ), lda )
517 CALL sgerq2( k, n-l, a, lda, tau, work, info )
523 CALL sormr2(
'Right',
'Transpose', n, n-l, k, a, lda, tau,
524 $ q, ldq, work, info )
529 CALL slaset(
'Full', k, n-l-k, zero, zero, a, lda )
530 DO 120 j = n - l - k + 1, n - l
531 DO 110 i = j - n + l + k + 1, k
542 CALL sgeqr2( m-k, l, a( k+1, n-l+1 ), lda, tau, work, info )
548 CALL sorm2r(
'Right',
'No transpose', m, m-k, min( m-k, l ),
549 $ a( k+1, n-l+1 ), lda, tau, u( 1, k+1 ), ldu,
555 DO 140 j = n - l + 1, n
556 DO 130 i = j - n + k + l + 1, m
563 work( 1 ) = real( lwkopt )
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sgerq2(M, N, A, LDA, TAU, WORK, INFO)
SGERQ2 computes the RQ factorization of a general rectangular matrix using an unblocked algorithm.
subroutine sgeqp3(M, N, A, LDA, JPVT, TAU, WORK, LWORK, INFO)
SGEQP3
subroutine sgeqr2(M, N, A, LDA, TAU, WORK, INFO)
SGEQR2 computes the QR factorization of a general rectangular matrix using an unblocked algorithm.
subroutine slapmt(FORWRD, M, N, X, LDX, K)
SLAPMT performs a forward or backward permutation of the columns of a matrix.
subroutine sormr2(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
SORMR2 multiplies a general matrix by the orthogonal matrix from a RQ factorization determined by sge...
subroutine sorm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
SORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sge...
subroutine sorg2r(M, N, K, A, LDA, TAU, WORK, INFO)
SORG2R generates all or part of the orthogonal matrix Q from a QR factorization determined by sgeqrf ...
subroutine sggsvp3(JOBU, JOBV, JOBQ, M, P, N, A, LDA, B, LDB, TOLA, TOLB, K, L, U, LDU, V, LDV, Q, LDQ, IWORK, TAU, WORK, LWORK, INFO)
SGGSVP3