234 SUBROUTINE dgsvj1( JOBV, M, N, N1, A, LDA, D, SVA, MV, V, LDV,
235 $ EPS, SFMIN, TOL, NSWEEP, WORK, LWORK, INFO )
242 DOUBLE PRECISION EPS, SFMIN, TOL
243 INTEGER INFO, LDA, LDV, LWORK, M, MV, N, N1, NSWEEP
247 DOUBLE PRECISION A( LDA, * ), D( ), SVA( N ), ( LDV, * ),
254 DOUBLE PRECISION ZERO, HALF, ONE
255 parameter( zero = 0.0d0, half = 0.5d0, one = 1.0d0 )
258 DOUBLE PRECISION AAPP, AAPP0, AAPQ, , 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 APPLV, ROTOK, RSVEC
268 DOUBLE PRECISION FASTR( 5 )
271 INTRINSIC dabs,
max, dble,
min, dsign, dsqrt
274 DOUBLE PRECISION DDOT, DNRM2
277 EXTERNAL idamax, lsame, ddot, dnrm2
287 applv = lsame( jobv,
'A' )
288 rsvec = lsame( jobv,
'V' )
289 IF( .NOT.( rsvec .OR. applv .OR. lsame( jobv,
'N' ) ) )
THEN
291 ELSE IF( m.LT.0 )
THEN
293 ELSE IF( ( n.LT.0 ) .OR. ( n.GT.m ) )
THEN
295 ELSE IF( n1.LT.0 )
THEN
297 ELSE IF( lda.LT.m )
THEN
299 ELSE IF( ( rsvec.OR.applv ) .AND. ( mv.LT.0 ) )
THEN
301 ELSE IF( ( rsvec.AND.( ldv.LT.n ) ).OR.
302 $ ( applv.AND.( ldv.LT.mv ) ) )
THEN
304 ELSE IF( tol.LE.eps )
THEN
306 ELSE IF( nsweep.LT.0 )
THEN
308 ELSE IF( lwork.LT.m )
THEN
316 CALL xerbla(
'DGSVJ1', -info )
322 ELSE IF( applv )
THEN
325 rsvec = rsvec .OR. applv
327 rooteps = dsqrt( eps )
328 rootsfmin = dsqrt( sfmin )
331 rootbig = one / rootsfmin
332 large = big / dsqrt( dble( m*n ) )
333 bigtheta = one / rooteps
334 roottol = dsqrt( tol )
348 IF( ( nblr*kbl ).NE.n1 )nblr = nblr + 1
352 nblc = ( n-n1 ) / kbl
353 IF( ( nblc*kbl ).NE.( 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 IF( aapp.GT.zero )
THEN
408 DO 2200 q = jgl,
min( jgl+kbl-1, n )
412 IF( aaqq.GT.zero )
THEN
419 IF( aaqq.GE.one )
THEN
420 IF( aapp.GE.aaqq )
THEN
421 rotok = ( small*aapp ).LE.aaqq
423 rotok = ( small*aaqq ).LE.aapp
425 IF( aapp.LT.( big / aaqq ) )
THEN
426 aapq = ( ddot( m, a( 1, p ), 1, a( 1,
427 $ q ), 1 )*d( p )*d( q ) / aaqq )
430 CALL dcopy( m, a( 1, p ), 1, work, 1 )
431 CALL dlascl( 'g
', 0, 0, AAPP, D( p ),
432 $ M, 1, WORK, LDA, IERR )
433 AAPQ = DDOT( 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 = ( DDOT( M, A( 1, p ), 1, A( 1,
444 $ q ), 1 )*D( p )*D( q ) / AAQQ )
447 CALL DCOPY( M, A( 1, q ), 1, WORK, 1 )
448 CALL DLASCL( 'g
', 0, 0, AAQQ, D( q ),
449 $ M, 1, WORK, LDA, IERR )
450 AAPQ = DDOT( M, WORK, 1, A( 1, p ),
455 MXAAPQ = MAX( MXAAPQ, DABS( AAPQ ) )
459.GT.
IF( DABS( AAPQ )TOL ) THEN
469 THETA = -HALF*DABS(AQOAP-APOAQ) / AAPQ
470.GT.
IF( AAQQAAPP0 )THETA = -THETA
472.GT.
IF( DABS( THETA )BIGTHETA ) THEN
474 FASTR( 3 ) = T*D( p ) / D( q )
475 FASTR( 4 ) = -T*D( q ) / D( p )
476 CALL DROTM( M, A( 1, p ), 1,
477 $ A( 1, q ), 1, FASTR )
478 IF( RSVEC )CALL DROTM( MVL,
482 SVA( q ) = AAQQ*DSQRT( MAX( ZERO,
483 $ ONE+T*APOAQ*AAPQ ) )
484 AAPP = AAPP*DSQRT( MAX( ZERO,
485 $ ONE-T*AQOAP*AAPQ ) )
486 MXSINJ = MAX( MXSINJ, DABS( T ) )
491 THSIGN = -DSIGN( ONE, AAPQ )
492.GT.
IF( AAQQAAPP0 )THSIGN = -THSIGN
493 T = ONE / ( THETA+THSIGN*
494 $ DSQRT( ONE+THETA*THETA ) )
495 CS = DSQRT( ONE / ( ONE+T*T ) )
497 MXSINJ = MAX( MXSINJ, DABS( SN ) )
498 SVA( q ) = AAQQ*DSQRT( MAX( ZERO,
499 $ ONE+T*APOAQ*AAPQ ) )
500 AAPP = AAPP*DSQRT( 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 DROTM( M, A( 1, p ), 1,
515 IF( RSVEC )CALL DROTM( MVL,
516 $ V( 1, p ), 1, V( 1, q ),
519 CALL DAXPY( M, -T*AQOAP,
522 CALL DAXPY( M, CS*SN*APOAQ,
526 CALL DAXPY( MVL, -T*AQOAP,
538.GE.
IF( D( q )ONE ) THEN
539 CALL DAXPY( M, T*APOAQ,
542 CALL DAXPY( M, -CS*SN*AQOAP,
546 CALL DAXPY( MVL, T*APOAQ,
557.GE.
IF( D( p )D( q ) ) THEN
558 CALL DAXPY( M, -T*AQOAP,
561 CALL DAXPY( M, CS*SN*APOAQ,
577 CALL DAXPY( M, T*APOAQ,
588 $ T*APOAQ, V( 1, p ),
601.GT.
IF( AAPPAAQQ ) THEN
602 CALL DCOPY( M, A( 1, p ), 1, WORK,
604 CALL DLASCL( 'g
', 0, 0, AAPP, ONE,
605 $ M, 1, WORK, LDA, IERR )
606 CALL DLASCL( 'g
', 0, 0, AAQQ, ONE,
607 $ M, 1, A( 1, q ), LDA,
609 TEMP1 = -AAPQ*D( p ) / D( q )
610 CALL DAXPY( M, TEMP1, WORK, 1,
612 CALL DLASCL( 'g
', 0, 0, ONE, AAQQ,
613 $ M, 1, A( 1, q ), LDA,
615 SVA( q ) = AAQQ*DSQRT( MAX( ZERO,
617 MXSINJ = MAX( MXSINJ, SFMIN )
619 CALL DCOPY( M, A( 1, q ), 1, WORK,
621 CALL DLASCL( 'g
', 0, 0, AAQQ, ONE,
622 $ M, 1, WORK, LDA, IERR )
623 CALL DLASCL( 'g
', 0, 0, AAPP, ONE,
624 $ M, 1, A( 1, p ), LDA,
626 TEMP1 = -AAPQ*D( q ) / D( p )
627 CALL DAXPY( M, TEMP1, WORK, 1,
629 CALL DLASCL( 'g
', 0, 0, ONE, AAPP,
630 $ M, 1, A( 1, p ), LDA,
632 SVA( p ) = AAPP*DSQRT( MAX( ZERO,
634 MXSINJ = MAX( MXSINJ, SFMIN )
641.LE.
IF( ( SVA( q ) / AAQQ )**2ROOTEPS )
643.LT..AND.
IF( ( AAQQROOTBIG )
644.GT.
$ ( AAQQROOTSFMIN ) ) THEN
645 SVA( q ) = DNRM2( M, A( 1, q ), 1 )*
650 CALL DLASSQ( M, A( 1, q ), 1, T,
652 SVA( q ) = T*DSQRT( AAQQ )*D( q )
655.LE.
IF( ( AAPP / AAPP0 )**2ROOTEPS ) THEN
656.LT..AND.
IF( ( AAPPROOTBIG )
657.GT.
$ ( AAPPROOTSFMIN ) ) THEN
658 AAPP = DNRM2( M, A( 1, p ), 1 )*
663 CALL DLASSQ( M, A( 1, p ), 1, T,
665 AAPP = T*DSQRT( AAPP )*D( p )
673 PSKIPPED = PSKIPPED + 1
678 PSKIPPED = PSKIPPED + 1
683.LE..AND..GE.
IF( ( iSWBAND ) ( IJBLSKBLSKIP ) )
689.LE..AND.
IF( ( iSWBAND )
690.GT.
$ ( PSKIPPEDROWSKIP ) ) THEN
704.EQ.
IF( AAPPZERO )NOTROT = NOTROT +
705 $ MIN( jgl+KBL-1, N ) - jgl + 1
706.LT.
IF( AAPPZERO )NOTROT = 0
716 DO 2012 p = igl, MIN( igl+KBL-1, N )
717 SVA( p ) = DABS( SVA( p ) )
724.LT..AND..GT.
IF( ( SVA( N )ROOTBIG ) ( SVA( N )ROOTSFMIN ) )
726 SVA( N ) = DNRM2( M, A( 1, N ), 1 )*D( N )
730 CALL DLASSQ( M, A( 1, N ), 1, T, AAPP )
731 SVA( N ) = T*DSQRT( AAPP )*D( N )
736.LT..AND..LE..OR.
IF( ( iSWBAND ) ( ( MXAAPQROOTTOL )
737.LE.
$ ( ISWROTN ) ) )SWBAND = i
739.GT..AND..LT..AND.
IF( ( iSWBAND+1 ) ( MXAAPQDBLE( N )*TOL )
740.LT.
$ ( DBLE( N )*MXAAPQ*MXSINJTOL ) ) THEN
745.GE.
IF( NOTROTEMPTSW )GO TO 1994
764 q = IDAMAX( N-p+1, SVA( p ), 1 ) + p - 1
772 CALL DSWAP( M, A( 1, p ), 1, A( 1, q ), 1 )
773 IF( RSVEC )CALL DSWAP( MVL, V( 1, p ), 1, V( 1, q ), 1 )
subroutine dlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine dgsvj1(jobv, m, n, n1, a, lda, d, sva, mv, v, ldv, eps, sfmin, tol, nsweep, work, lwork, info)
DGSVJ1 pre-processor for the routine dgesvj, applies Jacobi rotations targeting only particular pivot...