375 SUBROUTINE stgsja( 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,
390 REAL A( LDA, * ), ALPHA( * ), B( LDB, * ),
391 $ BETA( * ), Q( LDQ, * ), U( LDU, * ),
392 $ v( ldv, * ), work( * )
399 PARAMETER ( MAXIT = 40 )
401 parameter( zero = 0.0e+0, one = 1.0e+0 )
405 LOGICAL INITQ, INITU, INITV, UPPER, WANTQ, WANTU, WANTV
407 REAL 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(
'STGSJA', -info )
466 $
CALL slaset(
'Full', m, m, zero, one, u, ldu )
468 $
CALL slaset(
'Full', p, p, zero, one, v, ldv )
470 $
CALL slaset(
'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 slags2( upper, a1, a2, a3, b1, b2, b3, csu, snu,
504 $ csv, snv, csq, snq )
509 $
CALL srot( l, a( k+j, n-l+1 ), lda, a( k+i, n-l+1 ),
514 CALL srot( l, b( j, n-l+1 ), ldb, b( i, n-l+1 ), ldb,
520 CALL srot( min( k+l, m ), a( 1, n-l+j ), 1,
521 $ a( 1, n-l+i ), 1, csq, snq )
523 CALL srot( 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 srot( m, u( 1, k+j ), 1, u( 1, k+i ), 1, csu,
543 $
CALL srot( p, v( 1, j ), 1, v( 1, i ), 1, csv, snv )
546 $
CALL srot( 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 scopy( l-i+1, a( k+i, n-l+i ), lda, work, 1 )
563 CALL scopy( l-i+1, b( i, n-l+i ), ldb, work( l+1 ), 1 )
564 CALL slapll( 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 sscal( l-i+1, -one, b( i, n-l+i ), ldb )
605 $
CALL sscal( p, -one, v( 1, i ), 1 )
608 CALL slartg( abs( gamma ), one, beta( k+i ), alpha( k+i ),
611 IF( alpha( k+i ).GE.beta( k+i ) )
THEN
612 CALL sscal( l-i+1, one / alpha( k+i ), a( k+i, n-l+i ),
615 CALL sscal( l-i+1, one / beta( k+i ), b( i, n-l+i ),
617 CALL scopy( l-i+1, b( i, n-l+i ), ldb, a( k+i, n-l+i ),
625 CALL scopy( 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 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 slartg(F, G, CS, SN, R)
SLARTG generates a plane rotation with real cosine and real sine.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slags2(UPPER, A1, A2, A3, B1, B2, B3, CSU, SNU, CSV, SNV, CSQ, SNQ)
SLAGS2 computes 2-by-2 orthogonal matrices U, V, and Q, and applies them to matrices A and B such tha...
subroutine slapll(N, X, INCX, Y, INCY, SSMIN)
SLAPLL measures the linear dependence of two vectors.
subroutine stgsja(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)
STGSJA
subroutine srot(N, SX, INCX, SY, INCY, C, S)
SROT
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine sscal(N, SA, SX, INCX)
SSCAL