375 SUBROUTINE dtgsja( JOBU, JOBV, JOBQ, M, P, N, K, L, A, LDA, B,
376 $ LDB, TOLA, TOLB, ALPHA, BETA, U, LDU, V, LDV,
377 $ Q, LDQ, WORK, NCYCLE, INFO )
384 CHARACTER JOBQ, JOBU, JOBV
385 INTEGER INFO, K, L, LDA, LDB, LDQ, LDU, LDV, M, N,
387 DOUBLE PRECISION TOLA, TOLB
390 DOUBLE PRECISION A( LDA, * ), ALPHA( * ), B( LDB, * ),
391 $ BETA( * ), Q( LDQ, * ), U( LDU, * ),
392 $ v( ldv, * ), work( * )
399 PARAMETER ( MAXIT = 40 )
400 DOUBLE PRECISION ZERO, ONE
401 parameter( zero = 0.0d+0, one = 1.0d+0 )
405 LOGICAL INITQ, INITU, INITV, UPPER, WANTQ, WANTU, WANTV
407 DOUBLE PRECISION A1, A2, A3, B1, B2, B3, CSQ, CSU, CSV, ERROR,
408 $ gamma, rwk, snq, snu, snv, ssmin
419 INTRINSIC abs, max, min
425 initu = lsame( jobu,
'I' )
426 wantu = initu .OR. lsame( jobu,
'U' )
428 initv = lsame( jobv,
'I' )
429 wantv = initv .OR. lsame( jobv,
'V' )
431 initq = lsame( jobq,
'I' )
432 wantq = initq .OR. lsame( jobq,
'Q' )
435 IF( .NOT.( initu .OR. wantu .OR. lsame( jobu,
'N' ) ) )
THEN
437 ELSE IF( .NOT.( initv .OR. wantv .OR. lsame( jobv,
'N' ) ) )
THEN
439 ELSE IF( .NOT.( initq .OR. wantq .OR. lsame( jobq,
'N' ) ) )
THEN
441 ELSE IF( m.LT.0 )
THEN
443 ELSE IF( p.LT.0 )
THEN
445 ELSE IF( n.LT.0 )
THEN
447 ELSE IF( lda.LT.max( 1, m ) )
THEN
449 ELSE IF( ldb.LT.max( 1, p ) )
THEN
451 ELSE IF( ldu.LT.1 .OR. ( wantu .AND. ldu.LT.m ) )
THEN
453 ELSE IF( ldv.LT.1 .OR. ( wantv .AND. ldv.LT.p ) )
THEN
455 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN
459 CALL xerbla(
'DTGSJA', -info )
466 $
CALL dlaset(
'Full', m, m, zero, one, u, ldu )
468 $
CALL dlaset(
'Full', p, p, zero, one, v, ldv )
470 $
CALL dlaset(
'Full', n, n, zero, one, q, ldq )
475 DO 40 kcycle = 1, maxit
486 $ a1 = a( k+i, n-l+i )
488 $ a3 = a( k+j, n-l+j )
495 $ a2 = a( k+i, n-l+j )
499 $ a2 = a( k+j, n-l+i )
503 CALL dlags2( upper, a1, a2, a3, b1, b2, b3, csu, snu,
504 $ csv, snv, csq, snq )
509 $
CALL drot( l, a( k+j, n-l+1 ), lda, a( k+i, n-l+1 ),
514 CALL drot( l, b( j, n-l+1 ), ldb, b( i, n-l+1 ), ldb,
520 CALL drot( min( k+l, m ), a( 1, n-l+j ), 1,
521 $ a( 1, n-l+i ), 1, csq, snq )
523 CALL drot( l, b( 1, n-l+j ), 1, b( 1, n-l+i ), 1, csq,
528 $ a( k+i, n-l+j ) = zero
532 $ a( k+j, n-l+i ) = zero
538 IF( wantu .AND. k+j.LE.m )
539 $
CALL drot( m, u( 1, k+j ), 1, u( 1, k+i ), 1, csu,
543 $
CALL drot( p, v( 1, j ), 1, v( 1, i ), 1, csv, snv )
546 $
CALL drot( n, q( 1, n-l+j ), 1, q( 1, n-l+i ), 1, csq,
552 IF( .NOT.upper )
THEN
561 DO 30 i = 1, min( l, m-k )
562 CALL dcopy( l-i+1, a( k+i, n-l+i ), lda, work, 1 )
563 CALL dcopy( l-i+1, b( i, n-l+i ), ldb, work( l+1 ), 1 )
564 CALL dlapll( l-i+1, work, 1, work( l+1 ), 1, ssmin )
565 error = max( error, ssmin )
568 IF( abs( error ).LE.min( tola, tolb ) )
592 DO 70 i = 1, min( l, m-k )
597 IF( a1.NE.zero )
THEN
602 IF( gamma.LT.zero )
THEN
603 CALL dscal( l-i+1, -one, b( i, n-l+i ), ldb )
605 $
CALL dscal( p, -one, v( 1, i ), 1 )
608 CALL dlartg( abs( gamma ), one, beta( k+i ), alpha( k+i ),
611 IF( alpha( k+i ).GE.beta( k+i ) )
THEN
612 CALL dscal( l-i+1, one / alpha( k+i ), a( k+i, n-l+i ),
615 CALL dscal( l-i+1, one / beta( k+i ), b( i, n-l+i ),
617 CALL dcopy( l-i+1, b( i, n-l+i ), ldb, a( k+i, n-l+i ),
625 CALL dcopy( l-i+1, b( i, n-l+i ), ldb, a( k+i, n-l+i ),
634 DO 80 i = m + 1, k + l
640 DO 90 i = k + l + 1, n
subroutine dlartg(F, G, CS, SN, R)
DLARTG generates a plane rotation with real cosine and real sine.
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 xerbla(SRNAME, INFO)
XERBLA
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine drot(N, DX, INCX, DY, INCY, C, S)
DROT
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dlapll(N, X, INCX, Y, INCY, SSMIN)
DLAPLL measures the linear dependence of two vectors.
subroutine dlags2(UPPER, A1, A2, A3, B1, B2, B3, CSU, SNU, CSV, SNV, CSQ, SNQ)
DLAGS2 computes 2-by-2 orthogonal matrices U, V, and Q, and applies them to matrices A and B such tha...
subroutine dtgsja(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)
DTGSJA