376 SUBROUTINE ztgsja( 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,
388 DOUBLE PRECISION TOLA, TOLB
391 DOUBLE PRECISION ALPHA( * ), BETA( * )
392 COMPLEX*16 A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
393 $ u( ldu, * ), v( ldv, * ), work( * )
400 PARAMETER ( MAXIT = 40 )
401 DOUBLE PRECISION ZERO, ONE, HUGENUM
402 parameter( zero = 0.0d+0, one = 1.0d+0 )
403 COMPLEX*16 CZERO, CONE
404 parameter( czero = ( 0.0d+0, 0.0d+0 ),
405 $ cone = ( 1.0d+0, 0.0d+0 ) )
409 LOGICAL INITQ, INITU, INITV, UPPER, WANTQ, WANTU, WANTV
411 DOUBLE PRECISION A1, A3, B1, B3, CSQ, CSU, CSV, ERROR, GAMMA,
413 COMPLEX*16 A2, B2, SNQ, SNU, SNV
424 INTRINSIC abs, dble, dconjg,
max,
min, huge
425 parameter( hugenum = huge(zero) )
431 initu = lsame( jobu,
'I' )
432 wantu = initu .OR. lsame( jobu,
'U' )
434 initv = lsame( jobv,
'I' )
435 wantv = initv .OR. lsame( jobv,
'V' )
437 initq = lsame( jobq,
'I' )
438 wantq = initq .OR. lsame( jobq,
'Q' )
441 IF( .NOT.( initu .OR. wantu .OR. lsame( jobu,
'N' ) ) )
THEN
443 ELSE IF( .NOT.( initv .OR. wantv .OR. lsame( jobv, 'n
' ) ) ) THEN
445.NOT..OR..OR.
ELSE IF( ( INITQ WANTQ LSAME( JOBQ, 'n
' ) ) ) THEN
447.LT.
ELSE IF( M0 ) THEN
449.LT.
ELSE IF( P0 ) THEN
451.LT.
ELSE IF( N0 ) THEN
453.LT.
ELSE IF( LDAMAX( 1, M ) ) THEN
455.LT.
ELSE IF( LDBMAX( 1, P ) ) THEN
457.LT..OR..AND..LT.
ELSE IF( LDU1 ( WANTU LDUM ) ) THEN
459.LT..OR..AND..LT.
ELSE IF( LDV1 ( WANTV LDVP ) ) THEN
461.LT..OR..AND..LT.
ELSE IF( LDQ1 ( WANTQ LDQN ) ) THEN
465 CALL XERBLA( 'ztgsja', -INFO )
472 $ CALL ZLASET( 'full
', M, M, CZERO, CONE, U, LDU )
474 $ CALL ZLASET( 'full
', P, P, CZERO, CONE, V, LDV )
476 $ CALL ZLASET( 'full
', N, N, CZERO, CONE, Q, LDQ )
481 DO 40 KCYCLE = 1, MAXIT
492 $ A1 = DBLE( A( K+I, N-L+I ) )
494 $ A3 = DBLE( A( K+J, N-L+J ) )
496 B1 = DBLE( B( I, N-L+I ) )
497 B3 = DBLE( B( J, N-L+J ) )
501 $ A2 = A( K+I, N-L+J )
505 $ A2 = A( K+J, N-L+I )
509 CALL ZLAGS2( UPPER, A1, A2, A3, B1, B2, B3, CSU, SNU,
510 $ CSV, SNV, CSQ, SNQ )
515 $ CALL ZROT( L, A( K+J, N-L+1 ), LDA, A( K+I, N-L+1 ),
516 $ LDA, CSU, DCONJG( SNU ) )
520 CALL ZROT( L, B( J, N-L+1 ), LDB, B( I, N-L+1 ), LDB,
521 $ CSV, DCONJG( SNV ) )
526 CALL ZROT( MIN( K+L, M ), A( 1, N-L+J ), 1,
527 $ A( 1, N-L+I ), 1, CSQ, SNQ )
529 CALL ZROT( L, B( 1, N-L+J ), 1, B( 1, N-L+I ), 1, CSQ,
534 $ A( K+I, N-L+J ) = CZERO
535 B( I, N-L+J ) = CZERO
538 $ A( K+J, N-L+I ) = CZERO
539 B( J, N-L+I ) = CZERO
545 $ A( K+I, N-L+I ) = DBLE( A( K+I, N-L+I ) )
547 $ A( K+J, N-L+J ) = DBLE( A( K+J, N-L+J ) )
548 B( I, N-L+I ) = DBLE( B( I, N-L+I ) )
549 B( J, N-L+J ) = DBLE( B( J, N-L+J ) )
553.AND..LE.
IF( WANTU K+JM )
554 $ CALL ZROT( M, U( 1, K+J ), 1, U( 1, K+I ), 1, CSU,
558 $ CALL ZROT( P, V( 1, J ), 1, V( 1, I ), 1, CSV, SNV )
561 $ CALL ZROT( N, Q( 1, N-L+J ), 1, Q( 1, N-L+I ), 1, CSQ,
567.NOT.
IF( UPPER ) THEN
576 DO 30 I = 1, MIN( L, M-K )
577 CALL ZCOPY( L-I+1, A( K+I, N-L+I ), LDA, WORK, 1 )
578 CALL ZCOPY( L-I+1, B( I, N-L+I ), LDB, WORK( L+1 ), 1 )
579 CALL ZLAPLL( L-I+1, WORK, 1, WORK( L+1 ), 1, SSMIN )
580 ERROR = MAX( ERROR, SSMIN )
583.LE.
IF( ABS( ERROR )MIN( TOLA, TOLB ) )
607 DO 70 I = 1, MIN( L, M-K )
609 A1 = DBLE( A( K+I, N-L+I ) )
610 B1 = DBLE( B( I, N-L+I ) )
613.LE..AND..GE.
IF( (GAMMAHUGENUM)(GAMMA-HUGENUM) ) THEN
615.LT.
IF( GAMMAZERO ) THEN
616 CALL ZDSCAL( L-I+1, -ONE, B( I, N-L+I ), LDB )
618 $ CALL ZDSCAL( P, -ONE, V( 1, I ), 1 )
621 CALL DLARTG( ABS( GAMMA ), ONE, BETA( K+I ), ALPHA( K+I ),
624.GE.
IF( ALPHA( K+I )BETA( K+I ) ) THEN
625 CALL ZDSCAL( L-I+1, ONE / ALPHA( K+I ), A( K+I, N-L+I ),
628 CALL ZDSCAL( L-I+1, ONE / BETA( K+I ), B( I, N-L+I ),
630 CALL ZCOPY( L-I+1, B( I, N-L+I ), LDB, A( K+I, N-L+I ),
638 CALL ZCOPY( L-I+1, B( I, N-L+I ), LDB, A( K+I, N-L+I ),
645 DO 80 I = M + 1, K + L
651 DO 90 I = K + L + 1, N
subroutine dlartg(f, g, c, s, r)
DLARTG generates a plane rotation with real cosine and real sine.
subroutine zlags2(upper, a1, a2, a3, b1, b2, b3, csu, snu, csv, snv, csq, snq)
ZLAGS2
subroutine zlapll(n, x, incx, y, incy, ssmin)
ZLAPLL measures the linear dependence of two vectors.
subroutine zrot(n, cx, incx, cy, incy, c, s)
ZROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors.
subroutine zlaset(uplo, m, n, alpha, beta, a, lda)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine ztgsja(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)
ZTGSJA