376 SUBROUTINE ctgsja( JOBU, JOBV, JOBQ, M, P, N, K, L, A, LDA, B,
377 $ LDB, TOLA, TOLB, ALPHA, BETA, U, LDU, V, LDV,
378 $ Q, LDQ, WORK, NCYCLE, INFO )
385 CHARACTER JOBQ, JOBU, JOBV
386 INTEGER INFO, K, L, LDA, LDB, LDQ, LDU, LDV, M, N,
391 REAL ALPHA( * ), BETA( * )
392 COMPLEX A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
393 $ u( ldu, * ), v( ldv, * ), work( * )
400 PARAMETER ( MAXIT = 40 )
402 parameter( zero = 0.0e+0, one = 1.0e+0 )
404 parameter( czero = ( 0.0e+0, 0.0e+0 ),
405 $ cone = ( 1.0e+0, 0.0e+0 ) )
409 LOGICAL INITQ, INITU, INITV, UPPER, WANTQ, WANTU, WANTV
411 REAL A1, A3, B1, B3, CSQ, CSU, CSV, ERROR, GAMMA,
413 COMPLEX A2, B2, SNQ, SNU, SNV
424 INTRINSIC abs, conjg, max, min, real
430 initu = lsame( jobu,
'I' )
431 wantu = initu .OR. lsame( jobu,
'U' )
433 initv = lsame( jobv,
'I' )
434 wantv = initv .OR. lsame( jobv,
'V' )
436 initq = lsame( jobq,
'I' )
437 wantq = initq .OR. lsame( jobq,
'Q' )
440 IF( .NOT.( initu .OR. wantu .OR. lsame( jobu,
'N' ) ) )
THEN
442 ELSE IF( .NOT.( initv .OR. wantv .OR. lsame( jobv,
'N' ) ) )
THEN
444 ELSE IF( .NOT.( initq .OR. wantq .OR. lsame( jobq,
'N' ) ) )
THEN
446 ELSE IF( m.LT.0 )
THEN
448 ELSE IF( p.LT.0 )
THEN
450 ELSE IF( n.LT.0 )
THEN
452 ELSE IF( lda.LT.max( 1, m ) )
THEN
454 ELSE IF( ldb.LT.max( 1, p ) )
THEN
456 ELSE IF( ldu.LT.1 .OR. ( wantu .AND. ldu.LT.m ) )
THEN
458 ELSE IF( ldv.LT.1 .OR. ( wantv .AND. ldv.LT.p ) )
THEN
460 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN
464 CALL xerbla(
'CTGSJA', -info )
471 $
CALL claset(
'Full', m, m, czero, cone, u, ldu )
473 $
CALL claset(
'Full', p, p, czero, cone, v, ldv )
475 $
CALL claset(
'Full', n, n, czero, cone, q, ldq )
480 DO 40 kcycle = 1, maxit
491 $ a1 = real( a( k+i, n-l+i ) )
493 $ a3 = real( a( k+j, n-l+j ) )
495 b1 = real( b( i, n-l+i ) )
496 b3 = real( b( j, n-l+j ) )
500 $ a2 = a( k+i, n-l+j )
504 $ a2 = a( k+j, n-l+i )
508 CALL clags2( upper, a1, a2, a3, b1, b2, b3, csu, snu,
509 $ csv, snv, csq, snq )
514 $
CALL crot( l, a( k+j, n-l+1 ), lda, a( k+i, n-l+1 ),
515 $ lda, csu, conjg( snu ) )
519 CALL crot( l, b( j, n-l+1 ), ldb, b( i, n-l+1 ), ldb,
520 $ csv, conjg( snv ) )
525 CALL crot( min( k+l, m ), a( 1, n-l+j ), 1,
526 $ a( 1, n-l+i ), 1, csq, snq )
528 CALL crot( l, b( 1, n-l+j ), 1, b( 1, n-l+i ), 1, csq,
533 $ a( k+i, n-l+j ) = czero
534 b( i, n-l+j ) = czero
537 $ a( k+j, n-l+i ) = czero
538 b( j, n-l+i ) = czero
544 $ a( k+i, n-l+i ) = real( a( k+i, n-l+i ) )
546 $ a( k+j, n-l+j ) = real( a( k+j, n-l+j ) )
547 b( i, n-l+i ) = real( b( i, n-l+i ) )
548 b( j, n-l+j ) = real( b( j, n-l+j ) )
552 IF( wantu .AND. k+j.LE.m )
553 $
CALL crot( m, u( 1, k+j ), 1, u( 1, k+i ), 1, csu,
557 $
CALL crot( p, v( 1, j ), 1, v( 1, i ), 1, csv, snv )
560 $
CALL crot( n, q( 1, n-l+j ), 1, q( 1, n-l+i ), 1, csq,
566 IF( .NOT.upper )
THEN
575 DO 30 i = 1, min( l, m-k )
576 CALL ccopy( l-i+1, a( k+i, n-l+i ), lda, work, 1 )
577 CALL ccopy( l-i+1, b( i, n-l+i ), ldb, work( l+1 ), 1 )
578 CALL clapll( l-i+1, work, 1, work( l+1 ), 1, ssmin )
579 error = max( error, ssmin )
582 IF( abs( error ).LE.min( tola, tolb ) )
606 DO 70 i = 1, min( l, m-k )
608 a1 = real( a( k+i, n-l+i ) )
609 b1 = real( b( i, n-l+i ) )
611 IF( a1.NE.zero )
THEN
614 IF( gamma.LT.zero )
THEN
615 CALL csscal( l-i+1, -one, b( i, n-l+i ), ldb )
617 $
CALL csscal( p, -one, v( 1, i ), 1 )
620 CALL slartg( abs( gamma ), one, beta( k+i ), alpha( k+i ),
623 IF( alpha( k+i ).GE.beta( k+i ) )
THEN
624 CALL csscal( l-i+1, one / alpha( k+i ), a( k+i, n-l+i ),
627 CALL csscal( l-i+1, one / beta( k+i ), b( i, n-l+i ),
629 CALL ccopy( l-i+1, b( i, n-l+i ), ldb, a( k+i, n-l+i ),
636 CALL ccopy( l-i+1, b( i, n-l+i ), ldb, a( k+i, n-l+i ),
643 DO 80 i = m + 1, k + l
649 DO 90 i = k + l + 1, n
subroutine slartg(F, G, CS, SN, R)
SLARTG generates a plane rotation with real cosine and real sine.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
subroutine csscal(N, SA, CX, INCX)
CSSCAL
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine clags2(UPPER, A1, A2, A3, B1, B2, B3, CSU, SNU, CSV, SNV, CSQ, SNQ)
CLAGS2
subroutine crot(N, CX, INCX, CY, INCY, C, S)
CROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors.
subroutine clapll(N, X, INCX, Y, INCY, SSMIN)
CLAPLL measures the linear dependence of two vectors.
subroutine ctgsja(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)
CTGSJA