240
241
242
243
244
245
246 CHARACTER UPLO
247 INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU
248
249
250 REAL C( LDC, * ), D( * ), E( * ), U( LDU, * ),
251 $ VT( LDVT, * ), WORK( * )
252
253
254
255
256
257 REAL ZERO
258 parameter( zero = 0.0e0 )
259 REAL ONE
260 parameter( one = 1.0e0 )
261 REAL NEGONE
262 parameter( negone = -1.0e0 )
263 REAL HNDRTH
264 parameter( hndrth = 0.01e0 )
265 REAL TEN
266 parameter( ten = 10.0e0 )
267 REAL HNDRD
268 parameter( hndrd = 100.0e0 )
269 REAL MEIGTH
270 parameter( meigth = -0.125e0 )
271 INTEGER MAXITR
272 parameter( maxitr = 6 )
273
274
275 LOGICAL LOWER, ROTATE
276 INTEGER I, IDIR, ISUB, ITER, ITERDIVN, J, LL, LLL, M,
277 $ MAXITDIVN, NM1, NM12, NM13, OLDLL, OLDM
278 REAL ABSE, ABSS, COSL, COSR, CS, EPS, F, G, H, MU,
279 $ OLDCS, OLDSN, R, SHIFT, SIGMN, SIGMX, SINL,
280 $ SINR, SLL, SMAX, SMIN, SMINL, SMINOA,
281 $ SN, THRESH, TOL, TOLMUL, UNFL
282
283
284 LOGICAL LSAME
285 REAL SLAMCH
287
288
291
292
293 INTRINSIC abs, max, min, real, sign, sqrt
294
295
296
297
298
299 info = 0
300 lower =
lsame( uplo,
'L' )
301 IF( .NOT.
lsame( uplo,
'U' ) .AND. .NOT.lower )
THEN
302 info = -1
303 ELSE IF( n.LT.0 ) THEN
304 info = -2
305 ELSE IF( ncvt.LT.0 ) THEN
306 info = -3
307 ELSE IF( nru.LT.0 ) THEN
308 info = -4
309 ELSE IF( ncc.LT.0 ) THEN
310 info = -5
311 ELSE IF( ( ncvt.EQ.0 .AND. ldvt.LT.1 ) .OR.
312 $ ( ncvt.GT.0 .AND. ldvt.LT.max( 1, n ) ) ) THEN
313 info = -9
314 ELSE IF( ldu.LT.max( 1, nru ) ) THEN
315 info = -11
316 ELSE IF( ( ncc.EQ.0 .AND. ldc.LT.1 ) .OR.
317 $ ( ncc.GT.0 .AND. ldc.LT.max( 1, n ) ) ) THEN
318 info = -13
319 END IF
320 IF( info.NE.0 ) THEN
321 CALL xerbla(
'SBDSQR', -info )
322 RETURN
323 END IF
324 IF( n.EQ.0 )
325 $ RETURN
326 IF( n.EQ.1 )
327 $ GO TO 160
328
329
330
331 rotate = ( ncvt.GT.0 ) .OR. ( nru.GT.0 ) .OR. ( ncc.GT.0 )
332
333
334
335 IF( .NOT.rotate ) THEN
336 CALL slasq1( n, d, e, work, info )
337
338
339
340 IF( info .NE. 2 ) RETURN
341 info = 0
342 END IF
343
344 nm1 = n - 1
345 nm12 = nm1 + nm1
346 nm13 = nm12 + nm1
347 idir = 0
348
349
350
352 unfl =
slamch(
'Safe minimum' )
353
354
355
356
357 IF( lower ) THEN
358 DO 10 i = 1, n - 1
359 CALL slartg( d( i ), e( i ), cs, sn, r )
360 d( i ) = r
361 e( i ) = sn*d( i+1 )
362 d( i+1 ) = cs*d( i+1 )
363 work( i ) = cs
364 work( nm1+i ) = sn
365 10 CONTINUE
366
367
368
369 IF( nru.GT.0 )
370 $
CALL slasr(
'R',
'V',
'F', nru, n, work( 1 ), work( n ), u,
371 $ ldu )
372 IF( ncc.GT.0 )
373 $
CALL slasr(
'L',
'V',
'F', n, ncc, work( 1 ), work( n ), c,
374 $ ldc )
375 END IF
376
377
378
379
380
381 tolmul = max( ten, min( hndrd, eps**meigth ) )
382 tol = tolmul*eps
383
384
385
386 smax = zero
387 DO 20 i = 1, n
388 smax = max( smax, abs( d( i ) ) )
389 20 CONTINUE
390 DO 30 i = 1, n - 1
391 smax = max( smax, abs( e( i ) ) )
392 30 CONTINUE
393 sminl = zero
394 IF( tol.GE.zero ) THEN
395
396
397
398 sminoa = abs( d( 1 ) )
399 IF( sminoa.EQ.zero )
400 $ GO TO 50
401 mu = sminoa
402 DO 40 i = 2, n
403 mu = abs( d( i ) )*( mu / ( mu+abs( e( i-1 ) ) ) )
404 sminoa = min( sminoa, mu )
405 IF( sminoa.EQ.zero )
406 $ GO TO 50
407 40 CONTINUE
408 50 CONTINUE
409 sminoa = sminoa / sqrt( real( n ) )
410 thresh = max( tol*sminoa, maxitr*(n*(n*unfl)) )
411 ELSE
412
413
414
415 thresh = max( abs( tol )*smax, maxitr*(n*(n*unfl)) )
416 END IF
417
418
419
420
421
422 maxitdivn = maxitr*n
423 iterdivn = 0
424 iter = -1
425 oldll = -1
426 oldm = -1
427
428
429
430 m = n
431
432
433
434 60 CONTINUE
435
436
437
438 IF( m.LE.1 )
439 $ GO TO 160
440
441 IF( iter.GE.n ) THEN
442 iter = iter - n
443 iterdivn = iterdivn + 1
444 IF( iterdivn.GE.maxitdivn )
445 $ GO TO 200
446 END IF
447
448
449
450 IF( tol.LT.zero .AND. abs( d( m ) ).LE.thresh )
451 $ d( m ) = zero
452 smax = abs( d( m ) )
453 smin = smax
454 DO 70 lll = 1, m - 1
455 ll = m - lll
456 abss = abs( d( ll ) )
457 abse = abs( e( ll ) )
458 IF( tol.LT.zero .AND. abss.LE.thresh )
459 $ d( ll ) = zero
460 IF( abse.LE.thresh )
461 $ GO TO 80
462 smin = min( smin, abss )
463 smax = max( smax, abss, abse )
464 70 CONTINUE
465 ll = 0
466 GO TO 90
467 80 CONTINUE
468 e( ll ) = zero
469
470
471
472 IF( ll.EQ.m-1 ) THEN
473
474
475
476 m = m - 1
477 GO TO 60
478 END IF
479 90 CONTINUE
480 ll = ll + 1
481
482
483
484 IF( ll.EQ.m-1 ) THEN
485
486
487
488 CALL slasv2( d( m-1 ), e( m-1 ), d( m ), sigmn, sigmx, sinr,
489 $ cosr, sinl, cosl )
490 d( m-1 ) = sigmx
491 e( m-1 ) = zero
492 d( m ) = sigmn
493
494
495
496 IF( ncvt.GT.0 )
497 $
CALL srot( ncvt, vt( m-1, 1 ), ldvt, vt( m, 1 ), ldvt, cosr,
498 $ sinr )
499 IF( nru.GT.0 )
500 $
CALL srot( nru, u( 1, m-1 ), 1, u( 1, m ), 1, cosl, sinl )
501 IF( ncc.GT.0 )
502 $
CALL srot( ncc, c( m-1, 1 ), ldc, c( m, 1 ), ldc, cosl,
503 $ sinl )
504 m = m - 2
505 GO TO 60
506 END IF
507
508
509
510
511 IF( ll.GT.oldm .OR. m.LT.oldll ) THEN
512 IF( abs( d( ll ) ).GE.abs( d( m ) ) ) THEN
513
514
515
516 idir = 1
517 ELSE
518
519
520
521 idir = 2
522 END IF
523 END IF
524
525
526
527 IF( idir.EQ.1 ) THEN
528
529
530
531
532 IF( abs( e( m-1 ) ).LE.abs( tol )*abs( d( m ) ) .OR.
533 $ ( tol.LT.zero .AND. abs( e( m-1 ) ).LE.thresh ) ) THEN
534 e( m-1 ) = zero
535 GO TO 60
536 END IF
537
538 IF( tol.GE.zero ) THEN
539
540
541
542
543 mu = abs( d( ll ) )
544 sminl = mu
545 DO 100 lll = ll, m - 1
546 IF( abs( e( lll ) ).LE.tol*mu ) THEN
547 e( lll ) = zero
548 GO TO 60
549 END IF
550 mu = abs( d( lll+1 ) )*( mu / ( mu+abs( e( lll ) ) ) )
551 sminl = min( sminl, mu )
552 100 CONTINUE
553 END IF
554
555 ELSE
556
557
558
559
560 IF( abs( e( ll ) ).LE.abs( tol )*abs( d( ll ) ) .OR.
561 $ ( tol.LT.zero .AND. abs( e( ll ) ).LE.thresh ) ) THEN
562 e( ll ) = zero
563 GO TO 60
564 END IF
565
566 IF( tol.GE.zero ) THEN
567
568
569
570
571 mu = abs( d( m ) )
572 sminl = mu
573 DO 110 lll = m - 1, ll, -1
574 IF( abs( e( lll ) ).LE.tol*mu ) THEN
575 e( lll ) = zero
576 GO TO 60
577 END IF
578 mu = abs( d( lll ) )*( mu / ( mu+abs( e( lll ) ) ) )
579 sminl = min( sminl, mu )
580 110 CONTINUE
581 END IF
582 END IF
583 oldll = ll
584 oldm = m
585
586
587
588
589 IF( tol.GE.zero .AND. n*tol*( sminl / smax ).LE.
590 $ max( eps, hndrth*tol ) ) THEN
591
592
593
594 shift = zero
595 ELSE
596
597
598
599 IF( idir.EQ.1 ) THEN
600 sll = abs( d( ll ) )
601 CALL slas2( d( m-1 ), e( m-1 ), d( m ), shift, r )
602 ELSE
603 sll = abs( d( m ) )
604 CALL slas2( d( ll ), e( ll ), d( ll+1 ), shift, r )
605 END IF
606
607
608
609 IF( sll.GT.zero ) THEN
610 IF( ( shift / sll )**2.LT.eps )
611 $ shift = zero
612 END IF
613 END IF
614
615
616
617 iter = iter + m - ll
618
619
620
621 IF( shift.EQ.zero ) THEN
622 IF( idir.EQ.1 ) THEN
623
624
625
626
627 cs = one
628 oldcs = one
629 DO 120 i = ll, m - 1
630 CALL slartg( d( i )*cs, e( i ), cs, sn, r )
631 IF( i.GT.ll )
632 $ e( i-1 ) = oldsn*r
633 CALL slartg( oldcs*r, d( i+1 )*sn, oldcs, oldsn, d( i ) )
634 work( i-ll+1 ) = cs
635 work( i-ll+1+nm1 ) = sn
636 work( i-ll+1+nm12 ) = oldcs
637 work( i-ll+1+nm13 ) = oldsn
638 120 CONTINUE
639 h = d( m )*cs
640 d( m ) = h*oldcs
641 e( m-1 ) = h*oldsn
642
643
644
645 IF( ncvt.GT.0 )
646 $
CALL slasr(
'L',
'V',
'F', m-ll+1, ncvt, work( 1 ),
647 $ work( n ), vt( ll, 1 ), ldvt )
648 IF( nru.GT.0 )
649 $
CALL slasr(
'R',
'V',
'F', nru, m-ll+1, work( nm12+1 ),
650 $ work( nm13+1 ), u( 1, ll ), ldu )
651 IF( ncc.GT.0 )
652 $
CALL slasr(
'L',
'V',
'F', m-ll+1, ncc, work( nm12+1 ),
653 $ work( nm13+1 ), c( ll, 1 ), ldc )
654
655
656
657 IF( abs( e( m-1 ) ).LE.thresh )
658 $ e( m-1 ) = zero
659
660 ELSE
661
662
663
664
665 cs = one
666 oldcs = one
667 DO 130 i = m, ll + 1, -1
668 CALL slartg( d( i )*cs, e( i-1 ), cs, sn, r )
669 IF( i.LT.m )
670 $ e( i ) = oldsn*r
671 CALL slartg( oldcs*r, d( i-1 )*sn, oldcs, oldsn, d( i ) )
672 work( i-ll ) = cs
673 work( i-ll+nm1 ) = -sn
674 work( i-ll+nm12 ) = oldcs
675 work( i-ll+nm13 ) = -oldsn
676 130 CONTINUE
677 h = d( ll )*cs
678 d( ll ) = h*oldcs
679 e( ll ) = h*oldsn
680
681
682
683 IF( ncvt.GT.0 )
684 $
CALL slasr(
'L',
'V',
'B', m-ll+1, ncvt, work( nm12+1 ),
685 $ work( nm13+1 ), vt( ll, 1 ), ldvt )
686 IF( nru.GT.0 )
687 $
CALL slasr(
'R',
'V',
'B', nru, m-ll+1, work( 1 ),
688 $ work( n ), u( 1, ll ), ldu )
689 IF( ncc.GT.0 )
690 $
CALL slasr(
'L',
'V',
'B', m-ll+1, ncc, work( 1 ),
691 $ work( n ), c( ll, 1 ), ldc )
692
693
694
695 IF( abs( e( ll ) ).LE.thresh )
696 $ e( ll ) = zero
697 END IF
698 ELSE
699
700
701
702 IF( idir.EQ.1 ) THEN
703
704
705
706
707 f = ( abs( d( ll ) )-shift )*
708 $ ( sign( one, d( ll ) )+shift / d( ll ) )
709 g = e( ll )
710 DO 140 i = ll, m - 1
711 CALL slartg( f, g, cosr, sinr, r )
712 IF( i.GT.ll )
713 $ e( i-1 ) = r
714 f = cosr*d( i ) + sinr*e( i )
715 e( i ) = cosr*e( i ) - sinr*d( i )
716 g = sinr*d( i+1 )
717 d( i+1 ) = cosr*d( i+1 )
718 CALL slartg( f, g, cosl, sinl, r )
719 d( i ) = r
720 f = cosl*e( i ) + sinl*d( i+1 )
721 d( i+1 ) = cosl*d( i+1 ) - sinl*e( i )
722 IF( i.LT.m-1 ) THEN
723 g = sinl*e( i+1 )
724 e( i+1 ) = cosl*e( i+1 )
725 END IF
726 work( i-ll+1 ) = cosr
727 work( i-ll+1+nm1 ) = sinr
728 work( i-ll+1+nm12 ) = cosl
729 work( i-ll+1+nm13 ) = sinl
730 140 CONTINUE
731 e( m-1 ) = f
732
733
734
735 IF( ncvt.GT.0 )
736 $
CALL slasr(
'L',
'V',
'F', m-ll+1, ncvt, work( 1 ),
737 $ work( n ), vt( ll, 1 ), ldvt )
738 IF( nru.GT.0 )
739 $
CALL slasr(
'R',
'V',
'F', nru, m-ll+1, work( nm12+1 ),
740 $ work( nm13+1 ), u( 1, ll ), ldu )
741 IF( ncc.GT.0 )
742 $
CALL slasr(
'L',
'V',
'F', m-ll+1, ncc, work( nm12+1 ),
743 $ work( nm13+1 ), c( ll, 1 ), ldc )
744
745
746
747 IF( abs( e( m-1 ) ).LE.thresh )
748 $ e( m-1 ) = zero
749
750 ELSE
751
752
753
754
755 f = ( abs( d( m ) )-shift )*( sign( one, d( m ) )+shift /
756 $ d( m ) )
757 g = e( m-1 )
758 DO 150 i = m, ll + 1, -1
759 CALL slartg( f, g, cosr, sinr, r )
760 IF( i.LT.m )
761 $ e( i ) = r
762 f = cosr*d( i ) + sinr*e( i-1 )
763 e( i-1 ) = cosr*e( i-1 ) - sinr*d( i )
764 g = sinr*d( i-1 )
765 d( i-1 ) = cosr*d( i-1 )
766 CALL slartg( f, g, cosl, sinl, r )
767 d( i ) = r
768 f = cosl*e( i-1 ) + sinl*d( i-1 )
769 d( i-1 ) = cosl*d( i-1 ) - sinl*e( i-1 )
770 IF( i.GT.ll+1 ) THEN
771 g = sinl*e( i-2 )
772 e( i-2 ) = cosl*e( i-2 )
773 END IF
774 work( i-ll ) = cosr
775 work( i-ll+nm1 ) = -sinr
776 work( i-ll+nm12 ) = cosl
777 work( i-ll+nm13 ) = -sinl
778 150 CONTINUE
779 e( ll ) = f
780
781
782
783 IF( abs( e( ll ) ).LE.thresh )
784 $ e( ll ) = zero
785
786
787
788 IF( ncvt.GT.0 )
789 $
CALL slasr(
'L',
'V',
'B', m-ll+1, ncvt, work( nm12+1 ),
790 $ work( nm13+1 ), vt( ll, 1 ), ldvt )
791 IF( nru.GT.0 )
792 $
CALL slasr(
'R',
'V',
'B', nru, m-ll+1, work( 1 ),
793 $ work( n ), u( 1, ll ), ldu )
794 IF( ncc.GT.0 )
795 $
CALL slasr(
'L',
'V',
'B', m-ll+1, ncc, work( 1 ),
796 $ work( n ), c( ll, 1 ), ldc )
797 END IF
798 END IF
799
800
801
802 GO TO 60
803
804
805
806 160 CONTINUE
807 DO 170 i = 1, n
808 IF( d( i ).LT.zero ) THEN
809 d( i ) = -d( i )
810
811
812
813 IF( ncvt.GT.0 )
814 $
CALL sscal( ncvt, negone, vt( i, 1 ), ldvt )
815 END IF
816 170 CONTINUE
817
818
819
820
821 DO 190 i = 1, n - 1
822
823
824
825 isub = 1
826 smin = d( 1 )
827 DO 180 j = 2, n + 1 - i
828 IF( d( j ).LE.smin ) THEN
829 isub = j
830 smin = d( j )
831 END IF
832 180 CONTINUE
833 IF( isub.NE.n+1-i ) THEN
834
835
836
837 d( isub ) = d( n+1-i )
838 d( n+1-i ) = smin
839 IF( ncvt.GT.0 )
840 $
CALL sswap( ncvt, vt( isub, 1 ), ldvt, vt( n+1-i, 1 ),
841 $ ldvt )
842 IF( nru.GT.0 )
843 $
CALL sswap( nru, u( 1, isub ), 1, u( 1, n+1-i ), 1 )
844 IF( ncc.GT.0 )
845 $
CALL sswap( ncc, c( isub, 1 ), ldc, c( n+1-i, 1 ), ldc )
846 END IF
847 190 CONTINUE
848 GO TO 220
849
850
851
852 200 CONTINUE
853 info = 0
854 DO 210 i = 1, n - 1
855 IF( e( i ).NE.zero )
856 $ info = info + 1
857 210 CONTINUE
858 220 CONTINUE
859 RETURN
860
861
862
subroutine slasr(SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA)
SLASR applies a sequence of plane rotations to a general rectangular matrix.
subroutine slas2(F, G, H, SSMIN, SSMAX)
SLAS2 computes singular values of a 2-by-2 triangular matrix.
subroutine slasv2(F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL)
SLASV2 computes the singular value decomposition of a 2-by-2 triangular matrix.
subroutine slartg(f, g, c, s, r)
SLARTG generates a plane rotation with real cosine and real sine.
subroutine xerbla(SRNAME, INFO)
XERBLA
logical function lsame(CA, CB)
LSAME
subroutine slasq1(N, D, E, WORK, INFO)
SLASQ1 computes the singular values of a real square bidiagonal matrix. Used by sbdsqr.
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine srot(N, SX, INCX, SY, INCY, C, S)
SROT
subroutine sscal(N, SA, SX, INCX)
SSCAL
real function slamch(CMACH)
SLAMCH