374 SUBROUTINE ctgsja( JOBU, JOBV, JOBQ, M, P, N, K, L, A, LDA, B,
375 $ LDB, TOLA, TOLB, ALPHA, BETA, U, LDU, V, LDV,
376 $ Q, LDQ, WORK, NCYCLE, INFO )
383 CHARACTER JOBQ, JOBU, JOBV
384 INTEGER INFO, K, L, LDA, LDB, LDQ, LDU, LDV, M, N,
389 REAL ALPHA( * ), BETA( * )
390 COMPLEX A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
391 $ u( ldu, * ), v( ldv, * ), work( * )
398 PARAMETER ( MAXIT = 40 )
399 REAL ZERO, ONE, HUGENUM
400 parameter( zero = 0.0e+0, one = 1.0e+0 )
402 parameter( czero = ( 0.0e+0, 0.0e+0 ),
403 $ cone = ( 1.0e+0, 0.0e+0 ) )
407 LOGICAL INITQ, INITU, INITV, UPPER, WANTQ, WANTU, WANTV
409 REAL A1, A3, B1, B3, CSQ, CSU, CSV, ERROR, GAMMA,
411 COMPLEX A2, B2, SNQ, SNU, SNV
423 INTRINSIC abs, conjg, max, min, real, huge
424 parameter( hugenum = huge(zero) )
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.
444 $ lsame( jobv,
'N' ) ) )
THEN
446 ELSE IF( .NOT.( initq .OR.
448 $ lsame( jobq,
'N' ) ) )
THEN
450 ELSE IF( m.LT.0 )
THEN
452 ELSE IF( p.LT.0 )
THEN
454 ELSE IF( n.LT.0 )
THEN
456 ELSE IF( lda.LT.max( 1, m ) )
THEN
458 ELSE IF( ldb.LT.max( 1, p ) )
THEN
460 ELSE IF( ldu.LT.1 .OR. ( wantu .AND. ldu.LT.m ) )
THEN
462 ELSE IF( ldv.LT.1 .OR. ( wantv .AND. ldv.LT.p ) )
THEN
464 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN
468 CALL xerbla(
'CTGSJA', -info )
475 $
CALL claset(
'Full', m, m, czero, cone, u, ldu )
477 $
CALL claset(
'Full', p, p, czero, cone, v, ldv )
479 $
CALL claset(
'Full', n, n, czero, cone, q, ldq )
484 DO 40 kcycle = 1, maxit
495 $ a1 = real( a( k+i, n-l+i ) )
497 $ a3 = real( a( k+j, n-l+j ) )
499 b1 = real( b( i, n-l+i ) )
500 b3 = real( b( j, n-l+j ) )
504 $ a2 = a( k+i, n-l+j )
508 $ a2 = a( k+j, n-l+i )
512 CALL clags2( upper, a1, a2, a3, b1, b2, b3, csu, snu,
513 $ csv, snv, csq, snq )
518 $
CALL crot( l, a( k+j, n-l+1 ), lda, a( k+i,
520 $ lda, csu, conjg( snu ) )
524 CALL crot( l, b( j, n-l+1 ), ldb, b( i, n-l+1 ), ldb,
525 $ csv, conjg( snv ) )
530 CALL crot( min( k+l, m ), a( 1, n-l+j ), 1,
531 $ a( 1, n-l+i ), 1, csq, snq )
533 CALL crot( l, b( 1, n-l+j ), 1, b( 1, n-l+i ), 1, csq,
538 $ a( k+i, n-l+j ) = czero
539 b( i, n-l+j ) = czero
542 $ a( k+j, n-l+i ) = czero
543 b( j, n-l+i ) = czero
549 $ a( k+i, n-l+i ) = real( a( k+i, n-l+i ) )
551 $ a( k+j, n-l+j ) = real( a( k+j, n-l+j ) )
552 b( i, n-l+i ) = real( b( i, n-l+i ) )
553 b( j, n-l+j ) = real( b( j, n-l+j ) )
557 IF( wantu .AND. k+j.LE.m )
558 $
CALL crot( m, u( 1, k+j ), 1, u( 1, k+i ), 1, csu,
562 $
CALL crot( p, v( 1, j ), 1, v( 1, i ), 1, csv,
566 $
CALL crot( n, q( 1, n-l+j ), 1, q( 1, n-l+i ), 1,
573 IF( .NOT.upper )
THEN
582 DO 30 i = 1, min( l, m-k )
583 CALL ccopy( l-i+1, a( k+i, n-l+i ), lda, work, 1 )
584 CALL ccopy( l-i+1, b( i, n-l+i ), ldb, work( l+1 ),
586 CALL clapll( l-i+1, work, 1, work( l+1 ), 1, ssmin )
587 error = max( error, ssmin )
590 IF( abs( error ).LE.min( tola, tolb ) )
614 DO 70 i = 1, min( l, m-k )
616 a1 = real( a( k+i, n-l+i ) )
617 b1 = real( b( i, n-l+i ) )
620 IF( (gamma.LE.hugenum).AND.(gamma.GE.-hugenum) )
THEN
622 IF( gamma.LT.zero )
THEN
623 CALL csscal( l-i+1, -one, b( i, n-l+i ), ldb )
625 $
CALL csscal( p, -one, v( 1, i ), 1 )
628 CALL slartg( abs( gamma ), one, beta( k+i ),
632 IF( alpha( k+i ).GE.beta( k+i ) )
THEN
633 CALL csscal( l-i+1, one / alpha( k+i ), a( k+i,
637 CALL csscal( l-i+1, one / beta( k+i ), b( i, n-l+i ),
639 CALL ccopy( l-i+1, b( i, n-l+i ), ldb, a( k+i,
647 CALL ccopy( l-i+1, b( i, n-l+i ), ldb, a( k+i, n-l+i ),
654 DO 80 i = m + 1, k + l
660 DO 90 i = k + l + 1, n