234 SUBROUTINE zgsvj1( JOBV, M, N, N1, A, LDA, D, SVA, MV, V, LDV,
235 $ EPS, SFMIN, TOL, NSWEEP, WORK, LWORK, INFO )
243 DOUBLE PRECISION EPS, SFMIN, TOL
244 INTEGER INFO, LDA, LDV, LWORK, M, MV, N, N1,
248 COMPLEX*16 A( LDA, * ), D( N ), V( LDV, * ), WORK( LWORK )
249 DOUBLE PRECISION SVA( N )
255 DOUBLE PRECISION, ONE
256 parameter( zero = 0.0d0, half = 0.5d0, one = 1.0d0)
259 COMPLEX*16 AAPQ, OMPQ
260 DOUBLE PRECISION AAPP, AAPP0, AAPQ1, AAQQ, APOAQ, AQOAP, BIG,
261 $ bigtheta, cs, mxaapq, mxsinj, rootbig,
262 $ rooteps, rootsfmin, roottol, small, sn, t,
263 $ temp1, theta, thsign
264 INTEGER BLSKIP, EMPTSW, i, ibr, igl, IERR, ,
265 $ iswrot, jbc, jgl, kbl, mvl, notrot, nblc, nblr,
266 $ p, pskipped, q, rowskip, swband
267 LOGICAL APPLV, , RSVEC
271 INTRINSIC abs, conjg,
max, dble,
min, sign, sqrt
274 DOUBLE PRECISION DZNRM2
278 EXTERNAL idamax, lsame, zdotc, dznrm2
290 applv = lsame( jobv,
'A' )
291 rsvec = lsame( jobv,
'V' )
292 IF( .NOT.( rsvec .OR. applv
'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(
'ZGSVJ1', -info )
325 ELSE IF( applv )
THEN
328 rsvec = rsvec .OR. applv
330 rooteps = sqrt( eps )
331 rootsfmin = sqrt( sfmin )
334 rootbig = one / rootsfmin
336 bigtheta = one / rooteps
337 roottol = sqrt( tol )
350 IF( ( nblr*kbl ).NE.n1 )nblr = nblr + 1
354 nblc = ( n-n1 ) / kbl
355 IF( ( nblc*kbl ).NE.( n-n1 ) )nblc = nblc + 1
356 blskip = ( kbl**2 ) + 1
359 rowskip =
min( 5, kbl )
375 DO 1993 i = 1, nsweep
391 DO 2000 ibr = 1, nblr
393 igl = ( ibr-1 )*kbl + 1
399 igl = ( ibr-1 )*kbl + 1
402 DO 2010 jbc = 1, nblc
404 jgl = ( jbc-1 )*kbl + n1 + 1
409 DO 2100 p = igl,
min( igl+kbl-1, n1 )
412 IF( aapp.GT.zero )
THEN
416 DO 2200 q = jgl,
min( jgl+kbl-1, n )
419 IF( aaqq.GT.zero )
THEN
426 IF( aaqq.GE.one )
THEN
427 IF( aapp.GE.aaqq )
THEN
428 rotok = ( small*aapp ).LE.aaqq
430 rotok = ( small*aaqq ).LE.aapp
432 IF( aapp.LT.( big / aaqq ) )
THEN
433 aapq = ( zdotc( m, a(
434 $ a( 1, q ), 1 ) / aaqq ) / aapp
436 CALL zcopy( m, a( 1, p ), 1,
438 CALL zlascl( 'g
', 0, 0, AAPP,
441 AAPQ = ZDOTC( M, WORK, 1,
442 $ A( 1, q ), 1 ) / AAQQ
445.GE.
IF( AAPPAAQQ ) THEN
446.LE.
ROTOK = AAPP( AAQQ / SMALL )
448.LE.
ROTOK = AAQQ( AAPP / SMALL )
450.GT.
IF( AAPP( SMALL / AAQQ ) ) THEN
451 AAPQ = ( ZDOTC( M, A( 1, p ), 1,
452 $ A( 1, q ), 1 ) / MAX(AAQQ,AAPP) )
455 CALL ZCOPY( M, A( 1, q ), 1,
457 CALL ZLASCL( 'g
', 0, 0, AAQQ,
460 AAPQ = ZDOTC( M, A( 1, p ), 1,
467 MXAAPQ = MAX( MXAAPQ, -AAPQ1 )
471.GT.
IF( ABS( AAPQ1 )TOL ) THEN
472 OMPQ = AAPQ / ABS(AAPQ)
482 THETA = -HALF*ABS( AQOAP-APOAQ )/ AAPQ1
483.GT.
IF( AAQQAAPP0 )THETA = -THETA
485.GT.
IF( ABS( THETA )BIGTHETA ) THEN
488 CALL ZROT( M, A(1,p), 1, A(1,q), 1,
489 $ CS, CONJG(OMPQ)*T )
491 CALL ZROT( MVL, V(1,p), 1,
492 $ V(1,q), 1, CS, CONJG(OMPQ)*T )
494 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
495 $ ONE+T*APOAQ*AAPQ1 ) )
496 AAPP = AAPP*SQRT( MAX( ZERO,
497 $ ONE-T*AQOAP*AAPQ1 ) )
498 MXSINJ = MAX( MXSINJ, ABS( T ) )
503 THSIGN = -SIGN( ONE, AAPQ1 )
504.GT.
IF( AAQQAAPP0 )THSIGN = -THSIGN
505 T = ONE / ( THETA+THSIGN*
506 $ SQRT( ONE+THETA*THETA ) )
507 CS = SQRT( ONE / ( ONE+T*T ) )
509 MXSINJ = MAX( MXSINJ, ABS( SN ) )
510 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
511 $ ONE+T*APOAQ*AAPQ1 ) )
512 AAPP = AAPP*SQRT( MAX( ZERO,
513 $ ONE-T*AQOAP*AAPQ1 ) )
515 CALL ZROT( M, A(1,p), 1, A(1,q), 1,
516 $ CS, CONJG(OMPQ)*SN )
518 CALL ZROT( MVL, V(1,p), 1,
519 $ V(1,q), 1, CS, CONJG(OMPQ)*SN )
526.GT.
IF( AAPPAAQQ ) THEN
527 CALL ZCOPY( M, A( 1, p ), 1,
529 CALL ZLASCL( 'g
', 0, 0, AAPP, ONE,
532 CALL ZLASCL( 'g
', 0, 0, AAQQ, ONE,
533 $ M, 1, A( 1, q ), LDA,
535 CALL ZAXPY( M, -AAPQ, WORK,
537 CALL ZLASCL( 'g
', 0, 0, ONE, AAQQ,
538 $ M, 1, A( 1, q ), LDA,
540 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
541 $ ONE-AAPQ1*AAPQ1 ) )
542 MXSINJ = MAX( MXSINJ, SFMIN )
544 CALL ZCOPY( M, A( 1, q ), 1,
546 CALL ZLASCL( 'g
', 0, 0, AAQQ, ONE,
549 CALL ZLASCL( 'g
', 0, 0, AAPP, ONE,
550 $ M, 1, A( 1, p ), LDA,
552 CALL ZAXPY( M, -CONJG(AAPQ),
553 $ WORK, 1, A( 1, p ), 1 )
554 CALL ZLASCL( 'g
', 0, 0, ONE, AAPP,
555 $ M, 1, A( 1, p ), LDA,
557 SVA( p ) = AAPP*SQRT( MAX( ZERO,
558 $ ONE-AAPQ1*AAPQ1 ) )
559 MXSINJ = MAX( MXSINJ, SFMIN )
566.LE.
IF( ( SVA( q ) / AAQQ )**2ROOTEPS )
568.LT..AND.
IF( ( AAQQROOTBIG )
569.GT.
$ ( AAQQROOTSFMIN ) ) THEN
570 SVA( q ) = DZNRM2( M, A( 1, q ), 1)
574 CALL ZLASSQ( M, A( 1, q ), 1, T,
576 SVA( q ) = T*SQRT( AAQQ )
579.LE.
IF( ( AAPP / AAPP0 )**2ROOTEPS ) THEN
580.LT..AND.
IF( ( AAPPROOTBIG )
581.GT.
$ ( AAPPROOTSFMIN ) ) THEN
582 AAPP = DZNRM2( M, A( 1, p ), 1 )
586 CALL ZLASSQ( M, A( 1, p ), 1, T,
588 AAPP = T*SQRT( AAPP )
596 PSKIPPED = PSKIPPED + 1
601 PSKIPPED = PSKIPPED + 1
605.LE..AND..GE.
IF( ( iSWBAND ) ( IJBLSKBLSKIP ) )
611.LE..AND.
IF( ( iSWBAND )
612.GT.
$ ( PSKIPPEDROWSKIP ) ) THEN
626.EQ.
IF( AAPPZERO )NOTROT = NOTROT +
627 $ MIN( jgl+KBL-1, N ) - jgl + 1
628.LT.
IF( AAPPZERO )NOTROT = 0
638 DO 2012 p = igl, MIN( igl+KBL-1, N )
639 SVA( p ) = ABS( SVA( p ) )
646.LT..AND..GT.
IF( ( SVA( N )ROOTBIG ) ( SVA( N )ROOTSFMIN ) )
648 SVA( N ) = DZNRM2( M, A( 1, N ), 1 )
652 CALL ZLASSQ( M, A( 1, N ), 1, T, AAPP )
653 SVA( N ) = T*SQRT( AAPP )
658.LT..AND..LE..OR.
IF( ( iSWBAND ) ( ( MXAAPQROOTTOL )
659.LE.
$ ( ISWROTN ) ) )SWBAND = i
661.GT..AND..LT.
IF( ( iSWBAND+1 ) ( MXAAPQSQRT( DBLE( N ) )*
662.AND..LT.
$ TOL ) ( DBLE( N )*MXAAPQ*MXSINJTOL ) ) THEN
666.GE.
IF( NOTROTEMPTSW )GO TO 1994
685 q = IDAMAX( N-p+1, SVA( p ), 1 ) + p - 1
693 CALL ZSWAP( M, A( 1, p ), 1, A( 1, q ), 1 )
694 IF( RSVEC )CALL ZSWAP( MVL, V( 1, p ), 1, V( 1, q ), 1 )
subroutine zlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zrot(n, cx, incx, cy, incy, c, s)
ZROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors.
subroutine zgsvj1(jobv, m, n, n1, a, lda, d, sva, mv, v, ldv, eps, sfmin, tol, nsweep, work, lwork, info)
ZGSVJ1 pre-processor for the routine zgesvj, applies Jacobi rotations targeting only particular pivot...