236 SUBROUTINE dgsvj1( JOBV, M, N, N1, A, LDA, D, SVA, MV, V, LDV,
237 $ EPS, SFMIN, TOL, NSWEEP, WORK, LWORK, INFO )
245 DOUBLE PRECISION EPS, SFMIN, TOL
246 INTEGER INFO, LDA, LDV, LWORK, M, MV, N, N1, NSWEEP
250 DOUBLE PRECISION A( LDA, * ), D( N ), SVA( N ), V( LDV, * ),
257 DOUBLE PRECISION ZERO, HALF, ONE
258 parameter( zero = 0.0d0, half = 0.5d0, one = 1.0d0 )
261 DOUBLE PRECISION AAPP, AAPP0, AAPQ, AAQQ, APOAQ, AQOAP, BIG,
262 $ bigtheta, cs, large, mxaapq, mxsinj, rootbig,
263 $ rooteps, rootsfmin, roottol, small, sn, t,
264 $ temp1, theta, thsign
265 INTEGER BLSKIP, EMPTSW, i, ibr, igl, IERR, IJBLSK,
266 $ iswrot, jbc, jgl, kbl, mvl, notrot, nblc, nblr,
267 $ p, pskipped, q, rowskip, swband
268 LOGICAL APPLV, ROTOK, RSVEC
271 DOUBLE PRECISION FASTR( 5 )
274 INTRINSIC dabs, max, dble, min, dsign, dsqrt
277 DOUBLE PRECISION DDOT, DNRM2
280 EXTERNAL idamax, lsame, ddot, dnrm2
290 applv = lsame( jobv,
'A' )
291 rsvec = lsame( jobv,
'V' )
292 IF( .NOT.( rsvec .OR. applv .OR. lsame( jobv,
'N' ) ) )
THEN
294 ELSE IF( m.LT.0 )
THEN
296 ELSE IF( ( n.LT.0 ) .OR. ( n.GT.m ) )
THEN
298 ELSE IF( n1.LT.0 )
THEN
300 ELSE IF( lda.LT.m )
THEN
302 ELSE IF( ( rsvec.OR.applv ) .AND. ( mv.LT.0 ) )
THEN
304 ELSE IF( ( rsvec.AND.( ldv.LT.n ) ).OR.
305 $ ( applv.AND.( ldv.LT.mv ) ) )
THEN
307 ELSE IF( tol.LE.eps )
THEN
309 ELSE IF( nsweep.LT.0 )
THEN
311 ELSE IF( lwork.LT.m )
THEN
319 CALL xerbla(
'DGSVJ1', -info )
325 ELSE IF( applv )
THEN
328 rsvec = rsvec .OR. applv
330 rooteps = dsqrt( eps )
331 rootsfmin = dsqrt( sfmin )
334 rootbig = one / rootsfmin
335 large = big / dsqrt( dble( m*n ) )
336 bigtheta = one / rooteps
337 roottol = dsqrt( tol )
351 IF( ( nblr*kbl ).NE.n1 )nblr = nblr + 1
355 nblc = ( n-n1 ) / kbl
356 IF( ( nblc*kbl ).NE.( n-n1 ) )nblc = nblc + 1
357 blskip = ( kbl**2 ) + 1
360 rowskip = min( 5, kbl )
376 DO 1993 i = 1, nsweep
386 DO 2000 ibr = 1, nblr
388 igl = ( ibr-1 )*kbl + 1
394 igl = ( ibr-1 )*kbl + 1
396 DO 2010 jbc = 1, nblc
398 jgl = n1 + ( jbc-1 )*kbl + 1
403 DO 2100 p = igl, min( igl+kbl-1, n1 )
407 IF( aapp.GT.zero )
THEN
411 DO 2200 q = jgl, min( jgl+kbl-1, n )
415 IF( aaqq.GT.zero )
THEN
422 IF( aaqq.GE.one )
THEN
423 IF( aapp.GE.aaqq )
THEN
424 rotok = ( small*aapp ).LE.aaqq
426 rotok = ( small*aaqq ).LE.aapp
428 IF( aapp.LT.( big / aaqq ) )
THEN
429 aapq = ( ddot( m, a( 1, p ), 1, a( 1,
430 $ q ), 1 )*d( p )*d( q ) / aaqq )
433 CALL dcopy( m, a( 1, p ), 1, work, 1 )
434 CALL dlascl(
'G', 0, 0, aapp, d( p ),
435 $ m, 1, work, lda, ierr )
436 aapq = ddot( m, work, 1, a( 1, q ),
440 IF( aapp.GE.aaqq )
THEN
441 rotok = aapp.LE.( aaqq / small )
443 rotok = aaqq.LE.( aapp / small )
445 IF( aapp.GT.( small / aaqq ) )
THEN
446 aapq = ( ddot( m, a( 1, p ), 1, a( 1,
447 $ q ), 1 )*d( p )*d( q ) / aaqq )
450 CALL dcopy( m, a( 1, q ), 1, work, 1 )
451 CALL dlascl(
'G', 0, 0, aaqq, d( q ),
452 $ m, 1, work, lda, ierr )
453 aapq = ddot( m, work, 1, a( 1, p ),
458 mxaapq = max( mxaapq, dabs( aapq ) )
462 IF( dabs( aapq ).GT.tol )
THEN
472 theta = -half*dabs(aqoap-apoaq) / aapq
473 IF( aaqq.GT.aapp0 )theta = -theta
475 IF( dabs( theta ).GT.bigtheta )
THEN
477 fastr( 3 ) = t*d( p ) / d( q )
478 fastr( 4 ) = -t*d( q ) / d( p )
479 CALL drotm( m, a( 1, p ), 1,
480 $ a( 1, q ), 1, fastr )
481 IF( rsvec )
CALL drotm( mvl,
485 sva( q ) = aaqq*dsqrt( max( zero,
486 $ one+t*apoaq*aapq ) )
487 aapp = aapp*dsqrt( max( zero,
488 $ one-t*aqoap*aapq ) )
489 mxsinj = max( mxsinj, dabs( t ) )
494 thsign = -dsign( one, aapq )
495 IF( aaqq.GT.aapp0 )thsign = -thsign
496 t = one / ( theta+thsign*
497 $ dsqrt( one+theta*theta ) )
498 cs = dsqrt( one / ( one+t*t ) )
500 mxsinj = max( mxsinj, dabs( sn ) )
501 sva( q ) = aaqq*dsqrt( max( zero,
502 $ one+t*apoaq*aapq ) )
503 aapp = aapp*dsqrt( max( zero,
504 $ one-t*aqoap*aapq ) )
506 apoaq = d( p ) / d( q )
507 aqoap = d( q ) / d( p )
508 IF( d( p ).GE.one )
THEN
510 IF( d( q ).GE.one )
THEN
512 fastr( 4 ) = -t*aqoap
515 CALL drotm( m, a( 1, p ), 1,
518 IF( rsvec )
CALL drotm( mvl,
519 $ v( 1, p ), 1, v( 1, q ),
522 CALL daxpy( m, -t*aqoap,
525 CALL daxpy( m, cs*sn*apoaq,
529 CALL daxpy( mvl, -t*aqoap,
541 IF( d( q ).GE.one )
THEN
542 CALL daxpy( m, t*apoaq,
545 CALL daxpy( m, -cs*sn*aqoap,
549 CALL daxpy( mvl, t*apoaq,
560 IF( d( p ).GE.d( q ) )
THEN
561 CALL daxpy( m, -t*aqoap,
564 CALL daxpy( m, cs*sn*apoaq,
580 CALL daxpy( m, t*apoaq,
591 $ t*apoaq, v( 1, p ),
604 IF( aapp.GT.aaqq )
THEN
605 CALL dcopy( m, a( 1, p ), 1, work,
607 CALL dlascl(
'G', 0, 0, aapp, one,
608 $ m, 1, work, lda, ierr )
609 CALL dlascl(
'G', 0, 0, aaqq, one,
610 $ m, 1, a( 1, q ), lda,
612 temp1 = -aapq*d( p ) / d( q )
613 CALL daxpy( m, temp1, work, 1,
615 CALL dlascl(
'G', 0, 0, one, aaqq,
616 $ m, 1, a( 1, q ), lda,
618 sva( q ) = aaqq*dsqrt( max( zero,
620 mxsinj = max( mxsinj, sfmin )
622 CALL dcopy( m, a( 1, q ), 1, work,
624 CALL dlascl(
'G', 0, 0, aaqq, one,
625 $ m, 1, work, lda, ierr )
626 CALL dlascl(
'G', 0, 0, aapp, one,
627 $ m, 1, a( 1, p ), lda,
629 temp1 = -aapq*d( q ) / d( p )
630 CALL daxpy( m, temp1, work, 1,
632 CALL dlascl(
'G', 0, 0, one, aapp,
633 $ m, 1, a( 1, p ), lda,
635 sva( p ) = aapp*dsqrt( max( zero,
637 mxsinj = max( mxsinj, sfmin )
644 IF( ( sva( q ) / aaqq )**2.LE.rooteps )
646 IF( ( aaqq.LT.rootbig ) .AND.
647 $ ( aaqq.GT.rootsfmin ) )
THEN
648 sva( q ) = dnrm2( m, a( 1, q ), 1 )*
653 CALL dlassq( m, a( 1, q ), 1, t,
655 sva( q ) = t*dsqrt( aaqq )*d( q )
658 IF( ( aapp / aapp0 )**2.LE.rooteps )
THEN
659 IF( ( aapp.LT.rootbig ) .AND.
660 $ ( aapp.GT.rootsfmin ) )
THEN
661 aapp = dnrm2( m, a( 1, p ), 1 )*
666 CALL dlassq( m, a( 1, p ), 1, t,
668 aapp = t*dsqrt( aapp )*d( p )
676 pskipped = pskipped + 1
681 pskipped = pskipped + 1
686 IF( ( i.LE.swband ) .AND. ( ijblsk.GE.blskip ) )
692 IF( ( i.LE.swband ) .AND.
693 $ ( pskipped.GT.rowskip ) )
THEN
707 IF( aapp.EQ.zero )notrot = notrot +
708 $ min( jgl+kbl-1, n ) - jgl + 1
709 IF( aapp.LT.zero )notrot = 0
719 DO 2012 p = igl, min( igl+kbl-1, n )
720 sva( p ) = dabs( sva( p ) )
727 IF( ( sva( n ).LT.rootbig ) .AND. ( sva( n ).GT.rootsfmin ) )
729 sva( n ) = dnrm2( m, a( 1, n ), 1 )*d( n )
733 CALL dlassq( m, a( 1, n ), 1, t, aapp )
734 sva( n ) = t*dsqrt( aapp )*d( n )
739 IF( ( i.LT.swband ) .AND. ( ( mxaapq.LE.roottol ) .OR.
740 $ ( iswrot.LE.n ) ) )swband = i
742 IF( ( i.GT.swband+1 ) .AND. ( mxaapq.LT.dble( n )*tol ) .AND.
743 $ ( dble( n )*mxaapq*mxsinj.LT.tol ) )
THEN
748 IF( notrot.GE.emptsw )
GO TO 1994
767 q = idamax( n-p+1, sva( p ), 1 ) + p - 1
775 CALL dswap( m, a( 1, p ), 1, a( 1, q ), 1 )
776 IF( rsvec )
CALL dswap( mvl, v( 1, p ), 1, v( 1, q ), 1 )