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, LDV, LWORK, M, MV, N, NSWEEP
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, rootbig, rooteps,
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 IF( ( sva( q ) / aaqq )**2.LE.rooteps )
564 IF( ( aaqq.LT.rootbig ) .AND.
565 $ ( aaqq.GT.rootsfmin ) )
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 IF( ( aapp / aapp0 ).LE.rooteps )
THEN 576 IF( ( aapp.LT.rootbig ) .AND.
577 $ ( aapp.GT.rootsfmin ) )
THEN 578 aapp = scnrm2( m, a( 1, p ), 1 )
582 CALL classq( m, a( 1, p ), 1, t,
584 aapp = t*sqrt( aapp )
591 IF( ir1.EQ.0 )notrot = notrot + 1
593 pskipped = pskipped + 1
597 IF( ir1.EQ.0 )notrot = notrot + 1
598 pskipped = pskipped + 1
601 IF( ( i.LE.swband ) .AND.
602 $ ( pskipped.GT.rowskip ) )
THEN 603 IF( ir1.EQ.0 )aapp = -aapp
618 IF( ( ir1.EQ.0 ) .AND. ( aapp.EQ.zero ) )
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 IF( aapp.GT.zero )
THEN 646 DO 2200 q = jgl, min( jgl+kbl-1, n )
649 IF( aaqq.GT.zero )
THEN 656 IF( aaqq.GE.one )
THEN 657 IF( aapp.GE.aaqq )
THEN 658 rotok = ( small*aapp ).LE.aaqq
660 rotok = ( small*aaqq ).LE.aapp
662 IF( aapp.LT.( 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 IF( aapp.GE.aaqq )
THEN 676 rotok = aapp.LE.( aaqq / small )
678 rotok = aaqq.LE.( aapp / small )
680 IF( aapp.GT.( 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 IF( abs( aapq1 ).GT.tol )
THEN 702 ompq = aapq / abs(aapq)
712 theta = -half*abs( aqoap-apoaq )/ aapq1
713 IF( aaqq.GT.aapp0 )theta = -theta
715 IF( abs( theta ).GT.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 IF( aaqq.GT.aapp0 )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 IF( aapp.GT.aaqq )
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 IF( ( sva( q ) / aaqq )**2.LE.rooteps )
798 IF( ( aaqq.LT.rootbig ) .AND.
799 $ ( aaqq.GT.rootsfmin ) )
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 IF( ( aapp / aapp0 )**2.LE.rooteps )
THEN 810 IF( ( aapp.LT.rootbig ) .AND.
811 $ ( aapp.GT.rootsfmin ) )
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 IF( ( i.LE.swband ) .AND. ( ijblsk.GE.blskip ) )
841 IF( ( i.LE.swband ) .AND.
842 $ ( pskipped.GT.rowskip ) )
THEN 856 IF( aapp.EQ.zero )notrot = notrot +
857 $ min( jgl+kbl-1, n ) - jgl + 1
858 IF( aapp.LT.zero )notrot = 0
868 DO 2012 p = igl, min( igl+kbl-1, n )
869 sva( p ) = abs( sva( p ) )
876 IF( ( sva( n ).LT.rootbig ) .AND. ( sva( n ).GT.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 IF( ( i.LT.swband ) .AND. ( ( mxaapq.LE.roottol ) .OR.
889 $ ( iswrot.LE.n ) ) )swband = i
891 IF( ( i.GT.swband+1 ) .AND. ( mxaapq.LT.sqrt(
REAL( N ) )*
892 $ tol ) .AND. (
REAL( n )*MXAAPQ*MXSINJ.LT.TOL ) ) then
896 IF( notrot.GE.emptsw )
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 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
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 clascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
CLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine cgsvj0(JOBV, M, N, A, LDA, D, SVA, MV, V, LDV, EPS, SFMIN, TOL, NSWEEP, WORK, LWORK, INFO)
CGSVJ0 pre-processor for the routine cgesvj.
subroutine cswap(N, CX, INCX, CY, INCY)
CSWAP
subroutine caxpy(N, CA, CX, INCX, CY, INCY)
CAXPY