253 SUBROUTINE dggsvp( 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, jobu, jobv
263 INTEGER info, k, l, lda, ldb, ldq, ldu, ldv, m, n, p
264 DOUBLE PRECISION tola, tolb
268 DOUBLE PRECISION a( lda, * ), b( ldb, * ), q( ldq, * ),
269 $ tau( * ), u( ldu, * ), v( ldv, * ), work( * )
275 DOUBLE PRECISION zero, one
276 parameter( zero = 0.0d+0, one = 1.0d+0 )
279 LOGICAL forwrd, wantq, wantu, wantv
291 INTRINSIC abs, max, min
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(
'DGGSVP', -info )
337 CALL dgeqpf( p, n, b, ldb, iwork, tau, work, info )
341 CALL dlapmt( forwrd, m, n, a, lda, iwork )
346 DO 20 i = 1, min( p, n )
347 IF( abs( b( i, i ) ).GT.tolb )
355 CALL dlaset(
'Full', p, p, zero, zero, v, ldv )
357 $
CALL dlacpy(
'Lower', p-1, n, b( 2, 1 ), ldb, v( 2, 1 ),
359 CALL dorg2r( p, p, min( p, n ), v, ldv, tau, work, info )
370 $
CALL dlaset(
'Full', p-l, n, zero, zero, b( l+1, 1 ), ldb )
376 CALL dlaset(
'Full', n, n, zero, one, q, ldq )
377 CALL dlapmt( forwrd, n, n, q, ldq, iwork )
380 IF( p.GE.l .AND. n.NE.l )
THEN 384 CALL dgerq2( l, n, b, ldb, tau, work, info )
388 CALL dormr2(
'Right',
'Transpose', m, n, l, b, ldb, tau, a,
395 CALL dormr2(
'Right',
'Transpose', n, n, l, b, ldb, tau, q,
401 CALL dlaset(
'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 dgeqpf( m, n-l, a, lda, iwork, tau, work, info )
426 DO 80 i = 1, min( m, n-l )
427 IF( abs( a( i, i ) ).GT.tola )
433 CALL dorm2r(
'Left',
'Transpose', m, l, min( m, n-l ), a, lda,
434 $ tau, a( 1, n-l+1 ), lda, work, info )
440 CALL dlaset(
'Full', m, m, zero, zero, u, ldu )
442 $
CALL dlacpy(
'Lower', m-1, n-l, a( 2, 1 ), lda, u( 2, 1 ),
444 CALL dorg2r( m, m, min( m, n-l ), u, ldu, tau, work, info )
451 CALL dlapmt( forwrd, n, n-l, q, ldq, iwork )
463 $
CALL dlaset(
'Full', m-k, n-l, zero, zero, a( k+1, 1 ), lda )
469 CALL dgerq2( k, n-l, a, lda, tau, work, info )
475 CALL dormr2(
'Right',
'Transpose', n, n-l, k, a, lda, tau,
476 $ q, ldq, work, info )
481 CALL dlaset(
'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 dgeqr2( m-k, l, a( k+1, n-l+1 ), lda, tau, work, info )
500 CALL dorm2r(
'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
logical function lsame(CA, CB)
LSAME
subroutine dgerq2(M, N, A, LDA, TAU, WORK, INFO)
DGERQ2 computes the RQ factorization of a general rectangular matrix using an unblocked algorithm...
subroutine dgeqr2(M, N, A, LDA, TAU, WORK, INFO)
DGEQR2 computes the QR factorization of a general rectangular matrix using an unblocked algorithm...
subroutine dlapmt(FORWRD, M, N, X, LDX, K)
DLAPMT performs a forward or backward permutation of the columns of a matrix.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dorm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
DORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sge...
subroutine dorg2r(M, N, K, A, LDA, TAU, WORK, INFO)
DORG2R generates all or part of the orthogonal matrix Q from a QR factorization determined by sgeqrf ...
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine dormr2(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
DORMR2 multiplies a general matrix by the orthogonal matrix from a RQ factorization determined by sge...