216 SUBROUTINE cgsvj0( JOBV, M, N, A, LDA, D, SVA, MV, V, LDV, EPS,
217 $ SFMIN, TOL, NSWEEP, WORK, LWORK, INFO )
225 INTEGER INFO, LDA, , LWORK, M, MV, N,
230 COMPLEX A( LDA, * ), D( N ), V( LDV, * ), WORK( LWORK )
238 parameter( zero = 0.0e0, half = 0.5e0, one = 1.0e0)
240 parameter( czero = (0.0e0, 0.0e0), cone = (1.0e0, 0.0e0) )
244 REAL AAPP, AAPP0, AAPQ1, AAQQ, APOAQ, AQOAP, BIG,
245 $ bigtheta, cs, mxaapq, mxsinj,
246 $ rootsfmin, roottol, small, sn, t, temp1, theta,
248 INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
249 $ iswrot, jbc, jgl, kbl, lkahead, mvl, nbl,
250 $ notrot, p, pskipped, q, rowskip, swband
251 LOGICAL APPLV, ROTOK, RSVEC
255 INTRINSIC abs,
max, conjg, real,
min, sign, sqrt
262 EXTERNAL isamax,
lsame, cdotc, scnrm2
276 applv =
lsame( jobv,
'A' )
277 rsvec =
lsame( jobv,
'V' )
278 IF( .NOT.( rsvec .OR. applv .OR.
lsame( jobv,
'N' ) ) )
THEN
280 ELSE IF( m.LT.0 )
THEN
282 ELSE IF( ( n.LT.0 ) .OR. ( n.GT.m ) )
THEN
284 ELSE IF( lda.LT.m )
THEN
286 ELSE IF( ( rsvec.OR.applv ) .AND. ( mv.LT.0 ) )
THEN
288 ELSE IF( ( rsvec.AND.( ldv.LT.n ) ).OR.
289 $ ( applv.AND.( ldv.LT.mv ) ) )
THEN
291 ELSE IF( tol.LE.eps )
THEN
293 ELSE IF( nsweep.LT.0 )
THEN
295 ELSE IF( lwork.LT.m )
THEN
303 CALL xerbla(
'CGSVJ0', -info )
309 ELSE IF( applv )
THEN
312 rsvec = rsvec .OR. applv
314 rooteps = sqrt( eps )
315 rootsfmin = sqrt( sfmin )
318 rootbig = one / rootsfmin
319 bigtheta = one / rooteps
320 roottol = sqrt( tol )
324 emptsw = ( n*( n-1 ) ) / 2
345 IF( ( nbl*kbl ).NE.n )nbl = nbl + 1
350 rowskip =
min( 5, kbl )
364 DO 1993 i = 1, nsweep
382 igl = ( ibr-1 )*kbl + 1
384 DO 1002 ir1 = 0,
min( lkahead, nbl-ibr )
388 DO 2001 p = igl,
min( igl+kbl-1, n-1 )
392 q = isamax( n-p+1, sva( p ), 1 ) + p - 1
394 CALL cswap( m, a( 1, p ), 1, a( 1, q ), 1 )
395 IF( rsvec )
CALL cswap( mvl, v( 1, p ), 1,
419 IF( ( sva( p ).LT.rootbig ) .AND.
420 $ ( sva( p ).GT.rootsfmin ) )
THEN
421 sva( p ) = scnrm2( m, a( 1, p ), 1 )
425 CALL classq( m, a( 1, p ), 1, temp1, aapp )
426 sva( p ) = temp1*sqrt( aapp )
433 IF( aapp.GT.zero )
THEN
437 DO 2002 q = p + 1,
min( igl+kbl-1, n )
441 IF( aaqq.GT.zero )
THEN
444 IF( aaqq.GE.one )
THEN
445 rotok = ( small*aapp ).LE.aaqq
446 IF( aapp.LT.( big / aaqq ) )
THEN
447 aapq = ( cdotc( m, a( 1, p ), 1,
448 $ a( 1, q ), 1 ) / aaqq ) / aapp
450 CALL ccopy( m, a( 1, p ), 1,
452 CALL clascl(
'G', 0, 0, aapp, one,
453 $ m, 1, work, lda, ierr )
454 aapq = cdotc( m, work, 1,
455 $ a( 1, q ), 1 ) / aaqq
458 rotok = aapp.LE.( aaqq / small )
459 IF( aapp.GT.( small / aaqq ) )
THEN
460 aapq = ( cdotc( m, a( 1, p ), 1,
461 $ a( 1, q ), 1 ) / aapp ) / aaqq
463 CALL ccopy( m, a( 1, q ), 1,
465 CALL clascl(
'G', 0, 0, aaqq,
468 aapq = cdotc( m, a( 1, p ), 1,
475 mxaapq =
max( mxaapq, -aapq1 )
479 IF( abs( aapq1 ).GT.tol )
THEN
480 ompq = aapq / abs(aapq)
495 theta = -half*abs( aqoap-apoaq )/aapq1
497 IF( abs( theta ).GT.bigtheta )
THEN
502 CALL crot( m, a(1,p), 1, a(1,q), 1,
503 $ cs, conjg(ompq)*t )
505 CALL crot( mvl, v(1,p), 1,
506 $ v(1,q), 1, cs, conjg(ompq)*t )
509 sva( q ) = aaqq*sqrt(
max( zero,
510 $ one+t*apoaq*aapq1 ) )
511 aapp = aapp*sqrt(
max( zero,
512 $ one-t*aqoap*aapq1 ) )
513 mxsinj =
max( mxsinj, abs( t ) )
519 thsign = -sign( one, aapq1 )
520 t = one / ( theta+thsign*
521 $ sqrt( one+theta*theta ) )
522 cs = sqrt( one / ( one+t*t ) )
525 mxsinj =
max( mxsinj, abs( sn ) )
526 sva( q ) = aaqq*sqrt(
max( zero,
527 $ one+t*apoaq*aapq1 ) )
528 aapp = aapp*sqrt(
max( zero,
529 $ one-t*aqoap*aapq1 ) )
531 CALL crot( m, a(1,p), 1, a(1,q), 1,
532 $ cs, conjg(ompq)*sn )
534 CALL crot( mvl, v(1,p), 1,
535 $ v(1,q), 1, cs, conjg(ompq)*sn )
542 CALL ccopy( m, a( 1, p ), 1,
544 CALL clascl( 'g
', 0, 0, AAPP, ONE, M,
547 CALL CLASCL( 'g
', 0, 0, AAQQ, ONE, M,
548 $ 1, A( 1, q ), LDA, IERR )
549 CALL CAXPY( M, -AAPQ, WORK, 1,
551 CALL CLASCL( 'g
', 0, 0, ONE, AAQQ, M,
552 $ 1, A( 1, q ), LDA, IERR )
553 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
554 $ ONE-AAPQ1*AAPQ1 ) )
555 MXSINJ = MAX( MXSINJ, SFMIN )
562.LE.
IF( ( SVA( q ) / AAQQ )**2ROOTEPS )
564.LT..AND.
IF( ( AAQQROOTBIG )
565.GT.
$ ( AAQQROOTSFMIN ) ) THEN
566 SVA( q ) = SCNRM2( M, A( 1, q ), 1 )
570 CALL CLASSQ( M, A( 1, q ), 1, T,
572 SVA( q ) = T*SQRT( AAQQ )
575.LE.
IF( ( AAPP / AAPP0 )ROOTEPS ) THEN
576.LT..AND.
IF( ( AAPPROOTBIG )
577.GT.
$ ( AAPPROOTSFMIN ) ) THEN
578 AAPP = SCNRM2( M, A( 1, p ), 1 )
582 CALL CLASSQ( M, A( 1, p ), 1, T,
584 AAPP = T*SQRT( AAPP )
591.EQ.
IF( ir10 )NOTROT = NOTROT + 1
593 PSKIPPED = PSKIPPED + 1
597.EQ.
IF( ir10 )NOTROT = NOTROT + 1
598 PSKIPPED = PSKIPPED + 1
601.LE..AND.
IF( ( iSWBAND )
602.GT.
$ ( PSKIPPEDROWSKIP ) ) THEN
603.EQ.
IF( ir10 )AAPP = -AAPP
618.EQ..AND..EQ.
IF( ( ir10 ) ( AAPPZERO ) )
619 $ NOTROT = NOTROT + MIN( igl+KBL-1, N ) - p
630 igl = ( ibr-1 )*KBL + 1
632 DO 2010 jbc = ibr + 1, NBL
634 jgl = ( jbc-1 )*KBL + 1
639 DO 2100 p = igl, MIN( igl+KBL-1, N )
642.GT.
IF( AAPPZERO ) THEN
646 DO 2200 q = jgl, MIN( jgl+KBL-1, N )
649.GT.
IF( AAQQZERO ) THEN
656.GE.
IF( AAQQONE ) THEN
657.GE.
IF( AAPPAAQQ ) THEN
658.LE.
ROTOK = ( SMALL*AAPP )AAQQ
660.LE.
ROTOK = ( SMALL*AAQQ )AAPP
662.LT.
IF( AAPP( BIG / AAQQ ) ) THEN
663 AAPQ = ( CDOTC( M, A( 1, p ), 1,
664 $ A( 1, q ), 1 ) / AAQQ ) / AAPP
666 CALL CCOPY( M, A( 1, p ), 1,
668 CALL CLASCL( 'g
', 0, 0, AAPP,
671 AAPQ = CDOTC( M, WORK, 1,
672 $ A( 1, q ), 1 ) / AAQQ
675.GE.
IF( AAPPAAQQ ) THEN
676.LE.
ROTOK = AAPP( AAQQ / SMALL )
678.LE.
ROTOK = AAQQ( AAPP / SMALL )
680.GT.
IF( AAPP( SMALL / AAQQ ) ) THEN
681 AAPQ = ( CDOTC( M, A( 1, p ), 1,
682 $ A( 1, q ), 1 ) / MAX(AAQQ,AAPP) )
685 CALL CCOPY( M, A( 1, q ), 1,
687 CALL CLASCL( 'g
', 0, 0, AAQQ,
690 AAPQ = CDOTC( M, A( 1, p ), 1,
697 MXAAPQ = MAX( MXAAPQ, -AAPQ1 )
701.GT.
IF( ABS( AAPQ1 )TOL ) THEN
702 OMPQ = AAPQ / ABS(AAPQ)
712 THETA = -HALF*ABS( AQOAP-APOAQ )/ AAPQ1
713.GT.
IF( AAQQAAPP0 )THETA = -THETA
715.GT.
IF( ABS( THETA )BIGTHETA ) THEN
718 CALL CROT( M, A(1,p), 1, A(1,q), 1,
719 $ CS, CONJG(OMPQ)*T )
721 CALL CROT( MVL, V(1,p), 1,
722 $ V(1,q), 1, CS, CONJG(OMPQ)*T )
724 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
725 $ ONE+T*APOAQ*AAPQ1 ) )
726 AAPP = AAPP*SQRT( MAX( ZERO,
727 $ ONE-T*AQOAP*AAPQ1 ) )
728 MXSINJ = MAX( MXSINJ, ABS( T ) )
733 THSIGN = -SIGN( ONE, AAPQ1 )
734.GT.
IF( AAQQAAPP0 )THSIGN = -THSIGN
735 T = ONE / ( THETA+THSIGN*
736 $ SQRT( ONE+THETA*THETA ) )
737 CS = SQRT( ONE / ( ONE+T*T ) )
739 MXSINJ = MAX( MXSINJ, ABS( SN ) )
740 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
741 $ ONE+T*APOAQ*AAPQ1 ) )
742 AAPP = AAPP*SQRT( MAX( ZERO,
743 $ ONE-T*AQOAP*AAPQ1 ) )
745 CALL CROT( M, A(1,p), 1, A(1,q), 1,
746 $ CS, CONJG(OMPQ)*SN )
748 CALL CROT( MVL, V(1,p), 1,
749 $ V(1,q), 1, CS, CONJG(OMPQ)*SN )
756.GT.
IF( AAPPAAQQ ) THEN
757 CALL CCOPY( M, A( 1, p ), 1,
759 CALL CLASCL( 'g
', 0, 0, AAPP, ONE,
762 CALL CLASCL( 'g
', 0, 0, AAQQ, ONE,
763 $ M, 1, A( 1, q ), LDA,
765 CALL CAXPY( M, -AAPQ, WORK,
767 CALL CLASCL( 'g
', 0, 0, ONE, AAQQ,
768 $ M, 1, A( 1, q ), LDA,
770 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
771 $ ONE-AAPQ1*AAPQ1 ) )
772 MXSINJ = MAX( MXSINJ, SFMIN )
774 CALL CCOPY( M, A( 1, q ), 1,
776 CALL CLASCL( 'g
', 0, 0, AAQQ, ONE,
779 CALL CLASCL( 'g
', 0, 0, AAPP, ONE,
780 $ M, 1, A( 1, p ), LDA,
782 CALL CAXPY( M, -CONJG(AAPQ),
783 $ WORK, 1, A( 1, p ), 1 )
784 CALL CLASCL( 'g
', 0, 0, ONE, AAPP,
785 $ M, 1, A( 1, p ), LDA,
787 SVA( p ) = AAPP*SQRT( MAX( ZERO,
788 $ ONE-AAPQ1*AAPQ1 ) )
789 MXSINJ = MAX( MXSINJ, SFMIN )
796.LE.
IF( ( SVA( q ) / AAQQ )**2ROOTEPS )
798.LT..AND.
IF( ( AAQQROOTBIG )
799.GT.
$ ( AAQQROOTSFMIN ) ) THEN
800 SVA( q ) = SCNRM2( M, A( 1, q ), 1)
804 CALL CLASSQ( M, A( 1, q ), 1, T,
806 SVA( q ) = T*SQRT( AAQQ )
809.LE.
IF( ( AAPP / AAPP0 )**2ROOTEPS ) THEN
810.LT..AND.
IF( ( AAPPROOTBIG )
811.GT.
$ ( AAPPROOTSFMIN ) ) THEN
812 AAPP = SCNRM2( M, A( 1, p ), 1 )
816 CALL CLASSQ( M, A( 1, p ), 1, T,
818 AAPP = T*SQRT( AAPP )
826 PSKIPPED = PSKIPPED + 1
831 PSKIPPED = PSKIPPED + 1
835.LE..AND..GE.
IF( ( iSWBAND ) ( IJBLSKBLSKIP ) )
841.LE..AND.
IF( ( iSWBAND )
842.GT.
$ ( PSKIPPEDROWSKIP ) ) THEN
856.EQ.
IF( AAPPZERO )NOTROT = NOTROT +
857 $ MIN( jgl+KBL-1, N ) - jgl + 1
858.LT.
IF( AAPPZERO )NOTROT = 0
868 DO 2012 p = igl, MIN( igl+KBL-1, N )
869 SVA( p ) = ABS( SVA( p ) )
876.LT..AND..GT.
IF( ( SVA( N )ROOTBIG ) ( SVA( N )ROOTSFMIN ) )
878 SVA( N ) = SCNRM2( M, A( 1, N ), 1 )
882 CALL CLASSQ( M, A( 1, N ), 1, T, AAPP )
883 SVA( N ) = T*SQRT( AAPP )
888.LT..AND..LE..OR.
IF( ( iSWBAND ) ( ( MXAAPQROOTTOL )
889.LE.
$ ( ISWROTN ) ) )SWBAND = i
891.GT..AND..LT.
IF( ( iSWBAND+1 ) ( MXAAPQSQRT( REAL( N ) )*
892.AND..LT.
$ TOL ) ( REAL( N )*MXAAPQ*MXSINJTOL ) ) THEN
896.GE.
IF( NOTROTEMPTSW )GO TO 1994
915 q = ISAMAX( N-p+1, SVA( p ), 1 ) + p - 1
923 CALL CSWAP( M, A( 1, p ), 1, A( 1, q ), 1 )
924 IF( RSVEC )CALL CSWAP( MVL, V( 1, p ), 1, V( 1, q ), 1 )