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
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
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(
'ZTGSJA', -info )
471 $
CALL zlaset(
'Full', m, m, czero, cone, u, ldu )
473 $
CALL zlaset(
'Full', p, p, czero, cone, v, ldv )
475 $
CALL zlaset(
'Full', n, n, czero, cone, q, ldq )
480 DO 40 kcycle = 1, maxit
491 $ a1 = dble( a( k+i, n-l+i ) )
493 $ a3 = dble( a( k+j, n-l+j ) )
495 b1 = dble( b( i, n-l+i ) )
496 b3 = dble( b( j, n-l+j ) )
500 $ a2 = a( k+i, n-l+j )
504 $ a2 = a( k+j, n-l+i )
508 CALL zlags2( upper, a1, a2, a3, b1, b2, b3, csu, snu,
509 $ csv, snv, csq, snq )
514 $
CALL zrot( l, a( k+j, n-l+1 ), lda, a( k+i, n-l+1 ),
515 $ lda, csu, dconjg( snu ) )
519 CALL zrot( l, b( j, n-l+1 ), ldb, b( i, n-l+1 ), ldb,
520 $ csv, dconjg( snv ) )
525 CALL zrot( min( k+l, m ), a( 1, n-l+j ), 1,
526 $ a( 1, n-l+i ), 1, csq, snq )
528 CALL zrot( 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 ) = dble( a( k+i, n-l+i ) )
546 $ a( k+j, n-l+j ) = dble( a( k+j, n-l+j ) )
547 b( i, n-l+i ) = dble( b( i, n-l+i ) )
548 b( j, n-l+j ) = dble( b( j, n-l+j ) )
552 IF( wantu .AND. k+j.LE.m )
553 $
CALL zrot( m, u( 1, k+j ), 1, u( 1, k+i ), 1, csu,
557 $
CALL zrot( p, v( 1, j ), 1, v( 1, i ), 1, csv, snv )
560 $
CALL zrot( 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 zcopy( l-i+1, a( k+i, n-l+i ), lda, work, 1 )
577 CALL zcopy( l-i+1, b( i, n-l+i ), ldb, work( l+1 ), 1 )
578 CALL zlapll( 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 = dble( a( k+i, n-l+i ) )
609 b1 = dble( b( i, n-l+i ) )
611 IF( a1.NE.zero )
THEN
614 IF( gamma.LT.zero )
THEN
615 CALL zdscal( l-i+1, -one, b( i, n-l+i ), ldb )
617 $
CALL zdscal( p, -one, v( 1, i ), 1 )
620 CALL dlartg( abs( gamma ), one, beta( k+i ), alpha( k+i ),
623 IF( alpha( k+i ).GE.beta( k+i ) )
THEN
624 CALL zdscal( l-i+1, one / alpha( k+i ), a( k+i, n-l+i ),
627 CALL zdscal( l-i+1, one / beta( k+i ), b( i, n-l+i ),
629 CALL zcopy( l-i+1, b( i, n-l+i ), ldb, a( k+i, n-l+i ),
637 CALL zcopy( l-i+1, b( i, n-l+i ), ldb, a( k+i, n-l+i ),
644 DO 80 i = m + 1, k + l
650 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 xerbla(SRNAME, INFO)
XERBLA
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
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 zlapll(N, X, INCX, Y, INCY, SSMIN)
ZLAPLL measures the linear dependence of two 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 zlags2(UPPER, A1, A2, A3, B1, B2, B3, CSU, SNU, CSV, SNV, CSQ, SNQ)
ZLAGS2
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