234 SUBROUTINE sgsvj1( JOBV, M, N, N1, A, LDA, D, SVA, MV, V, LDV,
235 $ EPS, SFMIN, TOL, NSWEEP, WORK, LWORK, INFO )
243 INTEGER INFO, LDA, , LWORK, M, MV, N, N1, NSWEEP
247 REAL ( LDA, * ), D( N ), SVA( ), V( LDV, * ),
255 parameter( zero = 0.0e0, half = 0.5e0, one = 1.0e0)
258 REAL AAPP, AAPP0, AAPQ, AAQQ, APOAQ, AQOAP, BIG,
259 $ bigtheta, cs, large, mxaapq, mxsinj, rootbig,
260 $ rooteps, rootsfmin, roottol, small, sn, t,
261 $ temp1, theta, thsign
262 INTEGER BLSKIP, EMPTSW, i, ibr, igl, IERR, IJBLSK,
263 $ iswrot, jbc, jgl, kbl, mvl, notrot, nblc, nblr,
264 $ p, pskipped, q, rowskip, swband
265 LOGICAL , ROTOK, RSVEC
271 INTRINSIC abs,
max, float,
min, sign, sqrt
277 EXTERNAL isamax, lsame,
287 applv = lsame( jobv, 'a
' )
288 RSVEC = LSAME( JOBV, 'v
' )
289.NOT..OR..OR.
IF( ( RSVEC APPLV LSAME( JOBV, 'n
' ) ) ) THEN
291.LT.
ELSE IF( M0 ) THEN
293.LT..OR..GT.
ELSE IF( ( N0 ) ( NM ) ) THEN
295.LT.
ELSE IF( N10 ) THEN
297.LT.
ELSE IF( LDAM ) THEN
299.OR..AND..LT.
ELSE IF( ( RSVECAPPLV ) ( MV0 ) ) THEN
301.AND..LT..OR.
ELSE IF( ( RSVEC( LDVN ) )
302.AND..LT.
$ ( APPLV( LDVMV ) ) ) THEN
304.LE.
ELSE IF( TOLEPS ) THEN
306.LT.
ELSE IF( NSWEEP0 ) THEN
308.LT.
ELSE IF( LWORKM ) THEN
316 CALL XERBLA( 'sgsvj1', -INFO )
322 ELSE IF( APPLV ) THEN
325.OR.
RSVEC = RSVEC APPLV
327 ROOTEPS = SQRT( EPS )
328 ROOTSFMIN = SQRT( SFMIN )
331 ROOTBIG = ONE / ROOTSFMIN
332 LARGE = BIG / SQRT( FLOAT( M*N ) )
333 BIGTHETA = ONE / ROOTEPS
334 ROOTTOL = SQRT( TOL )
348.NE.
IF( ( NBLR*KBL )N1 )NBLR = NBLR + 1
352 NBLC = ( N-N1 ) / KBL
353.NE.
IF( ( NBLC*KBL )( N-N1 ) )NBLC = NBLC + 1
354 BLSKIP = ( KBL**2 ) + 1
357 ROWSKIP = MIN( 5, KBL )
373 DO 1993 i = 1, NSWEEP
383 DO 2000 ibr = 1, NBLR
385 igl = ( ibr-1 )*KBL + 1
391 igl = ( ibr-1 )*KBL + 1
393 DO 2010 jbc = 1, NBLC
395 jgl = N1 + ( jbc-1 )*KBL + 1
400 DO 2100 p = igl, MIN( igl+KBL-1, N1 )
404.GT.
IF( AAPPZERO ) THEN
408 DO 2200 q = jgl, MIN( jgl+KBL-1, N )
412.GT.
IF( AAQQZERO ) THEN
419.GE.
IF( AAQQONE ) THEN
420.GE.
IF( AAPPAAQQ ) THEN
421.LE.
ROTOK = ( SMALL*AAPP )AAQQ
423.LE.
ROTOK = ( SMALL*AAQQ )AAPP
425.LT.
IF( AAPP( BIG / AAQQ ) ) THEN
426 AAPQ = ( SDOT( M, A( 1, p ), 1, A( 1,
427 $ q ), 1 )*D( p )*D( q ) / AAQQ )
430 CALL SCOPY( M, A( 1, p ), 1, WORK, 1 )
431 CALL SLASCL( 'g
', 0, 0, AAPP, D( p ),
432 $ M, 1, WORK, LDA, IERR )
433 AAPQ = SDOT( M, WORK, 1, A( 1, q ),
437.GE.
IF( AAPPAAQQ ) THEN
438.LE.
ROTOK = AAPP( AAQQ / SMALL )
440.LE.
ROTOK = AAQQ( AAPP / SMALL )
442.GT.
IF( AAPP( SMALL / AAQQ ) ) THEN
443 AAPQ = ( SDOT( M, A( 1, p ), 1, A( 1,
444 $ q ), 1 )*D( p )*D( q ) / AAQQ )
447 CALL SCOPY( M, A( 1, q ), 1, WORK, 1 )
448 CALL SLASCL( 'g
', 0, 0, AAQQ, D( q ),
449 $ M, 1, WORK, LDA, IERR )
450 AAPQ = SDOT( M, WORK, 1, A( 1, p ),
455 MXAAPQ = MAX( MXAAPQ, ABS( AAPQ ) )
459.GT.
IF( ABS( AAPQ )TOL ) THEN
469 THETA = -HALF*ABS( AQOAP-APOAQ ) / AAPQ
470.GT.
IF( AAQQAAPP0 )THETA = -THETA
472.GT.
IF( ABS( THETA )BIGTHETA ) THEN
474 FASTR( 3 ) = T*D( p ) / D( q )
475 FASTR( 4 ) = -T*D( q ) / D( p )
476 CALL SROTM( M, A( 1, p ), 1,
477 $ A( 1, q ), 1, FASTR )
478 IF( RSVEC )CALL SROTM( MVL,
482 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
483 $ ONE+T*APOAQ*AAPQ ) )
484 AAPP = AAPP*SQRT( MAX( ZERO,
485 $ ONE-T*AQOAP*AAPQ ) )
486 MXSINJ = MAX( MXSINJ, ABS( T ) )
491 THSIGN = -SIGN( ONE, AAPQ )
492.GT.
IF( AAQQAAPP0 )THSIGN = -THSIGN
493 T = ONE / ( THETA+THSIGN*
494 $ SQRT( ONE+THETA*THETA ) )
495 CS = SQRT( ONE / ( ONE+T*T ) )
497 MXSINJ = MAX( MXSINJ, ABS( SN ) )
498 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
499 $ ONE+T*APOAQ*AAPQ ) )
500 AAPP = AAPP*SQRT( MAX( ZERO,
501 $ ONE-T*AQOAP*AAPQ ) )
503 APOAQ = D( p ) / D( q )
504 AQOAP = D( q ) / D( p )
505.GE.
IF( D( p )ONE ) THEN
507.GE.
IF( D( q )ONE ) THEN
509 FASTR( 4 ) = -T*AQOAP
512 CALL SROTM( M, A( 1, p ), 1,
515 IF( RSVEC )CALL SROTM( MVL,
516 $ V( 1, p ), 1, V( 1, q ),
519 CALL SAXPY( M, -T*AQOAP,
522 CALL SAXPY( M, CS*SN*APOAQ,
526 CALL SAXPY( MVL, -T*AQOAP,
538.GE.
IF( D( q )ONE ) THEN
539 CALL SAXPY( M, T*APOAQ,
542 CALL SAXPY( M, -CS*SN*AQOAP,
546 CALL SAXPY( MVL, T*APOAQ,
557.GE.
IF( D( p )D( q ) ) THEN
558 CALL SAXPY( M, -T*AQOAP,
561 CALL SAXPY( M, CS*SN*APOAQ,
577 CALL SAXPY( M, T*APOAQ,
588 $ T*APOAQ, V( 1, p ),
601.GT.
IF( AAPPAAQQ ) THEN
602 CALL SCOPY( M, A( 1, p ), 1, WORK,
604 CALL SLASCL( 'g
', 0, 0, AAPP, ONE,
605 $ M, 1, WORK, LDA, IERR )
606 CALL SLASCL( 'g
', 0, 0, AAQQ, ONE,
607 $ M, 1, A( 1, q ), LDA,
609 TEMP1 = -AAPQ*D( p ) / D( q )
610 CALL SAXPY( M, TEMP1, WORK, 1,
612 CALL SLASCL( 'g
', 0, 0, ONE, AAQQ,
613 $ M, 1, A( 1, q ), LDA,
615 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
617 MXSINJ = MAX( MXSINJ, SFMIN )
619 CALL SCOPY( M, A( 1, q ), 1, WORK,
621 CALL SLASCL( 'g
', 0, 0, AAQQ, ONE,
622 $ M, 1, WORK, LDA, IERR )
623 CALL SLASCL( 'g
', 0, 0, AAPP, ONE,
624 $ M, 1, A( 1, p ), LDA,
626 TEMP1 = -AAPQ*D( q ) / D( p )
627 CALL SAXPY( M, TEMP1, WORK, 1,
629 CALL SLASCL( 'g', 0, 0, one, aapp,
630 $ m, 1, a( 1, p ), lda,
632 sva( p ) = aapp*sqrt(
max( zero,
634 mxsinj =
max( mxsinj, sfmin )
641 IF( ( sva( q ) / aaqq )**2.LE.rooteps )
643 IF( ( aaqq.LT.rootbig ) .AND.
644 $ ( aaqq.GT.rootsfmin ) )
THEN
645 sva( q ) = snrm2( m, a( 1, q ), 1 )*
650 CALL slassq( m, a( 1, q ), 1, t
652 sva( q ) = t*sqrt( aaqq )*d( q )
655 IF( ( aapp / aapp0 )**2.LE.rooteps )
THEN
656 IF( ( aapp.LT.rootbig ) .AND.
657 $ ( aapp.GT.rootsfmin ) )
THEN
658 aapp = snrm2( m, a( 1, p ), 1 )*
663 CALL slassq( m, a( 1, p ), 1, t,
665 aapp = t*sqrt( aapp )*d( p )
673 pskipped = pskipped + 1
678 pskipped = pskipped + 1
683 IF( ( i.LE.swband ) .AND. ( ijblsk.GE.blskip ) )
689 IF( ( i.LE.swband ) .AND.
690 $ ( pskipped.GT.rowskip ) )
THEN
704 IF( aapp.EQ.zero )notrot = notrot +
705 $
min( jgl+kbl-1, n ) - jgl + 1
706 IF( aapp.LT.zero )notrot = 0
716 DO 2012 p = igl,
min( igl+kbl-1, n )
717 sva( p ) = abs( sva( p ) )
724 IF( ( sva( n ).LT.rootbig ) .AND. ( sva( n ).GT.rootsfmin ) )
726 sva( n ) = snrm2( m, a( 1, n ), 1 )*d( n )
730 CALL slassq( m, a( 1, n ), 1, t, aapp )
731 sva( n ) = t*sqrt( aapp )*d( n )
736 IF( ( i.LT.swband ) .AND. ( ( mxaapq.LE.roottol ) .OR.
737 $ ( iswrot.LE.n ) ) )swband = i
739 IF( ( i.GT.swband+1 ) .AND. ( mxaapq.LT.float( n )*tol ) .AND.
740 $ ( float( n )*mxaapq*mxsinj.LT.tol ) )
THEN
745 IF( notrot.GE.emptsw )
GO TO 1994
764 q = isamax( n-p+1, sva( p ), 1 ) + p - 1
772 CALL sswap( m, a( 1, p ), 1, a( 1, q ), 1 )
773 IF( rsvec )
CALL sswap( mvl, v( 1, p ), 1, v( 1, q ), 1 )
subroutine sgsvj1(jobv, m, n, n1, a, lda, d, sva, mv, v, ldv, eps, sfmin, tol, nsweep, work, lwork, info)
SGSVJ1 pre-processor for the routine sgesvj, applies Jacobi rotations targeting only particular pivot...