1
SUBROUTINE DLASQ3( N, Q, E, QQ, EE, SUP, SIGMA, KEND, OFF, IPHASE,
2
$ ICONV, EPS, TOL2, SMALL2 )
4
* -- LAPACK routine (version 2.0) --
5
* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
6
* Courant Institute, Argonne National Lab, and Rice University
9
* .. Scalar Arguments ..
10
INTEGER ICONV, IPHASE, KEND, N, OFF
11
DOUBLE PRECISION EPS, SIGMA, SMALL2, SUP, TOL2
13
* .. Array Arguments ..
14
DOUBLE PRECISION E( * ), EE( * ), Q( * ), QQ( * )
20
* DLASQ3 is the workhorse of the whole bidiagonal SVD algorithm.
21
* This can be described as the differential qd with shifts.
26
* N (input/output) INTEGER
27
* On entry, N specifies the number of rows and columns
28
* in the matrix. N must be at least 3.
29
* On exit N is non-negative and less than the input value.
31
* Q (input/output) DOUBLE PRECISION array, dimension (N)
32
* Q array in ping (see IPHASE below)
34
* E (input/output) DOUBLE PRECISION array, dimension (N)
35
* E array in ping (see IPHASE below)
37
* QQ (input/output) DOUBLE PRECISION array, dimension (N)
38
* Q array in pong (see IPHASE below)
40
* EE (input/output) DOUBLE PRECISION array, dimension (N)
41
* E array in pong (see IPHASE below)
43
* SUP (input/output) DOUBLE PRECISION
44
* Upper bound for the smallest eigenvalue
46
* SIGMA (input/output) DOUBLE PRECISION
47
* Accumulated shift for the present submatrix
49
* KEND (input/output) INTEGER
50
* Index where minimum D(i) occurs in recurrence for
53
* OFF (input/output) INTEGER
56
* IPHASE (input/output) INTEGER
57
* If IPHASE = 1 (ping) then data is in Q and E arrays
58
* If IPHASE = 2 (pong) then data is in QQ and EE arrays
60
* ICONV (input) INTEGER
61
* If ICONV = 0 a bottom part of a matrix (with a split)
62
* If ICONV =-3 a top part of a matrix (with a split)
64
* EPS (input) DOUBLE PRECISION
67
* TOL2 (input) DOUBLE PRECISION
68
* Square of the relative tolerance TOL as defined in DLASQ1
70
* SMALL2 (input) DOUBLE PRECISION
71
* A threshold value as defined in DLASQ1
73
* =====================================================================
76
DOUBLE PRECISION ONE, ZERO
77
PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
79
PARAMETER ( NPP = 32 )
82
DOUBLE PRECISION HALF, FOUR
83
PARAMETER ( HALF = 0.5D+0, FOUR = 4.0D+0 )
85
PARAMETER ( IFLMAX = 2 )
89
INTEGER I, IC, ICNT, IFL, IP, ISP, K1END, K2END, KE,
91
DOUBLE PRECISION D, DM, QEMAX, T1, TAU, TOLX, TOLY, TOLZ, XX, YY
93
* .. External Subroutines ..
94
EXTERNAL DCOPY, DLASQ4
96
* .. Intrinsic Functions ..
97
INTRINSIC ABS, MAX, MIN, SQRT
99
* .. Executable Statements ..
104
TOLZ = MAX( SMALL2, SIGMA )*TOL2
106
* Set maximum number of iterations
114
IF( IPHASE.EQ.1 ) THEN
116
IF( Q( I ).GT.Q( I+1 ) )
118
IF( E( I ).GT.E( I+1 ) )
121
IF( Q( N-1 ).GT.Q( N ) )
124
CALL DCOPY( N, Q, 1, QQ, -1 )
125
CALL DCOPY( N-1, E, 1, EE, -1 )
127
$ KEND = N - KEND + 1
132
IF( QQ( I ).GT.QQ( I+1 ) )
134
IF( EE( I ).GT.EE( I+1 ) )
137
IF( QQ( N-1 ).GT.QQ( N ) )
140
CALL DCOPY( N, QQ, 1, Q, -1 )
141
CALL DCOPY( N-1, EE, 1, E, -1 )
143
$ KEND = N - KEND + 1
148
IF( ICONV.EQ.-3 ) THEN
149
IF( IPHASE.EQ.1 ) THEN
158
* The ping section of the code
165
IF( KEND.EQ.0 .OR. SUP.EQ.ZERO ) THEN
167
ELSE IF( ICNT.GT.0 .AND. DM.LE.TOLZ ) THEN
170
IP = MAX( IPP, N / NPP )
175
ELSE IF( KEND+IP.GT.N ) THEN
177
ELSE IF( KEND-IP.LT.1 ) THEN
182
CALL DLASQ4( N2, Q( N1 ), E( N1 ), TAU, SUP )
186
IF( ICNT.GT.MAXIT ) THEN
190
IF( TAU.EQ.ZERO ) THEN
199
D = ( D / QQ( I ) )*Q( I+1 )
207
* Penultimate dqd step (in ping)
210
QQ( N-2 ) = D + E( N-2 )
211
D = ( D / QQ( N-2 ) )*Q( N-1 )
217
* Final dqd step (in ping)
220
QQ( N-1 ) = D + E( N-1 )
221
D = ( D / QQ( N-1 ) )*Q( N )
229
* The dqds algorithm (in ping)
238
D = ( D / QQ( I ) )*Q( I+1 ) - TAU
248
* Penultimate dqds step (in ping)
251
QQ( N-2 ) = D + E( N-2 )
252
D = ( D / QQ( N-2 ) )*Q( N-1 ) - TAU
260
* Final dqds step (in ping)
263
QQ( N-1 ) = D + E( N-1 )
264
D = ( D / QQ( N-1 ) )*Q( N ) - TAU
272
* Convergence when QQ(N) is small (in ping)
274
IF( ABS( QQ( N ) ).LE.SIGMA*TOL2 ) THEN
279
IF( QQ( N ).LT.ZERO )
282
* Non-negative qd array: Update the e's
285
EE( I ) = ( E( I ) / QQ( I ) )*Q( I+1 )
288
* Updating sigma and iphase in ping
295
TOLZ = MAX( SIGMA, SMALL2 )*TOL2
297
* Checking for deflation and convergence (in ping)
303
* Deflation: bottom 1x1 (in ping)
306
IF( EE( N-1 ).LE.TOLZ ) THEN
308
ELSE IF( SIGMA.GT.ZERO ) THEN
309
IF( EE( N-1 ).LE.EPS*( SIGMA+QQ( N ) ) ) THEN
310
IF( EE( N-1 )*( QQ( N ) / ( QQ( N )+SIGMA ) ).LE.TOL2*
311
$ ( QQ( N )+SIGMA ) ) THEN
316
IF( EE( N-1 ).LE.QQ( N )*TOL2 ) THEN
321
Q( N ) = QQ( N ) + SIGMA
327
* Deflation: bottom 2x2 (in ping)
330
IF( EE( N-2 ).LE.TOLZ ) THEN
332
ELSE IF( SIGMA.GT.ZERO ) THEN
333
T1 = SIGMA + EE( N-1 )*( SIGMA / ( SIGMA+QQ( N ) ) )
334
IF( EE( N-2 )*( T1 / ( QQ( N-1 )+T1 ) ).LE.TOLY ) THEN
335
IF( EE( N-2 )*( QQ( N-1 ) / ( QQ( N-1 )+T1 ) ).LE.TOLX )
341
IF( EE( N-2 ).LE.( QQ( N ) / ( QQ( N )+EE( N-1 )+QQ( N-1 ) ) )*
342
$ QQ( N-1 )*TOL2 ) THEN
347
QEMAX = MAX( QQ( N ), QQ( N-1 ), EE( N-1 ) )
348
IF( QEMAX.NE.ZERO ) THEN
349
IF( QEMAX.EQ.QQ( N-1 ) ) THEN
350
XX = HALF*( QQ( N )+QQ( N-1 )+EE( N-1 )+QEMAX*
351
$ SQRT( ( ( QQ( N )-QQ( N-1 )+EE( N-1 ) ) /
352
$ QEMAX )**2+FOUR*EE( N-1 ) / QEMAX ) )
353
ELSE IF( QEMAX.EQ.QQ( N ) ) THEN
354
XX = HALF*( QQ( N )+QQ( N-1 )+EE( N-1 )+QEMAX*
355
$ SQRT( ( ( QQ( N-1 )-QQ( N )+EE( N-1 ) ) /
356
$ QEMAX )**2+FOUR*EE( N-1 ) / QEMAX ) )
358
XX = HALF*( QQ( N )+QQ( N-1 )+EE( N-1 )+QEMAX*
359
$ SQRT( ( ( QQ( N )-QQ( N-1 )+EE( N-1 ) ) /
360
$ QEMAX )**2+FOUR*QQ( N-1 ) / QEMAX ) )
362
YY = ( MAX( QQ( N ), QQ( N-1 ) ) / XX )*
363
$ MIN( QQ( N ), QQ( N-1 ) )
368
Q( N-1 ) = SIGMA + XX
375
* Updating bounds before going to pong
377
IF( ICONV.EQ.0 ) THEN
379
SUP = MIN( DM, SUP-TAU )
380
ELSE IF( ICONV.GT.0 ) THEN
381
SUP = MIN( QQ( N ), QQ( N-1 ), QQ( N-2 ), QQ( 1 ), QQ( 2 ),
383
IF( ICONV.EQ.1 ) THEN
385
ELSE IF( ICONV.EQ.2 ) THEN
394
* Checking for splitting in ping
397
DO 100 KS = N - 3, 3, -1
398
IF( EE( KS ).LE.TOLY ) THEN
399
IF( EE( KS )*( MIN( QQ( KS+1 ),
400
$ QQ( KS ) ) / ( MIN( QQ( KS+1 ), QQ( KS ) )+SIGMA ) ).LE.
409
IF( EE( 2 ).LE.TOLZ ) THEN
411
ELSE IF( SIGMA.GT.ZERO ) THEN
412
T1 = SIGMA + EE( 1 )*( SIGMA / ( SIGMA+QQ( 1 ) ) )
413
IF( EE( 2 )*( T1 / ( QQ( 1 )+T1 ) ).LE.TOLY ) THEN
414
IF( EE( 2 )*( QQ( 1 ) / ( QQ( 1 )+T1 ) ).LE.TOLX ) THEN
419
IF( EE( 2 ).LE.( QQ( 1 ) / ( QQ( 1 )+EE( 1 )+QQ( 2 ) ) )*
420
$ QQ( 2 )*TOL2 ) THEN
428
IF( EE( 1 ).LE.TOLZ ) THEN
430
ELSE IF( SIGMA.GT.ZERO ) THEN
431
IF( EE( 1 ).LE.EPS*( SIGMA+QQ( 1 ) ) ) THEN
432
IF( EE( 1 )*( QQ( 1 ) / ( QQ( 1 )+SIGMA ) ).LE.TOL2*
433
$ ( QQ( 1 )+SIGMA ) ) THEN
438
IF( EE( 1 ).LE.QQ( 1 )*TOL2 ) THEN
445
SUP = MIN( QQ( N ), QQ( N-1 ), QQ( N-2 ) )
449
KEND = MAX( 1, KEND-KS )
458
IF( TAU.EQ.ZERO .AND. DM.LE.TOLZ .AND. KEND.NE.N .AND. ICONV.EQ.
459
$ 0 .AND. ICNT.GT.0 ) THEN
460
CALL DCOPY( N-KE, E( KE ), 1, QQ( KE ), 1 )
462
CALL DCOPY( N-KE, Q( KE+1 ), 1, EE( KE ), 1 )
468
* A new shift when the previous failed (in ping)
475
* Too many bad shifts (ping)
477
IF( SUP.LE.TOLZ .OR. IFL.GE.IFLMAX ) THEN
481
* The asymptotic shift (in ping)
484
TAU = MAX( TAU+D, ZERO )
490
* the pong section of the code
495
* Compute the shift (in pong)
497
IF( KEND.EQ.0 .AND. SUP.EQ.ZERO ) THEN
499
ELSE IF( ICNT.GT.0 .AND. DM.LE.TOLZ ) THEN
502
IP = MAX( IPP, N / NPP )
507
ELSE IF( KEND+IP.GT.N ) THEN
509
ELSE IF( KEND-IP.LT.1 ) THEN
514
CALL DLASQ4( N2, QQ( N1 ), EE( N1 ), TAU, SUP )
518
IF( ICNT.GT.MAXIT ) THEN
522
IF( TAU.EQ.ZERO ) THEN
524
* The dqd algorithm (in pong)
531
D = ( D / Q( I ) )*QQ( I+1 )
539
* Penultimate dqd step (in pong)
542
Q( N-2 ) = D + EE( N-2 )
543
D = ( D / Q( N-2 ) )*QQ( N-1 )
549
* Final dqd step (in pong)
552
Q( N-1 ) = D + EE( N-1 )
553
D = ( D / Q( N-1 ) )*QQ( N )
561
* The dqds algorithm (in pong)
570
D = ( D / Q( I ) )*QQ( I+1 ) - TAU
580
* Penultimate dqds step (in pong)
583
Q( N-2 ) = D + EE( N-2 )
584
D = ( D / Q( N-2 ) )*QQ( N-1 ) - TAU
592
* Final dqds step (in pong)
595
Q( N-1 ) = D + EE( N-1 )
596
D = ( D / Q( N-1 ) )*QQ( N ) - TAU
604
* Convergence when is small (in pong)
606
IF( ABS( Q( N ) ).LE.SIGMA*TOL2 ) THEN
614
* Non-negative qd array: Update the e's
617
E( I ) = ( EE( I ) / Q( I ) )*QQ( I+1 )
620
* Updating sigma and iphase in pong
628
* Checking for deflation and convergence (in pong)
634
* Deflation: bottom 1x1 (in pong)
637
IF( E( N-1 ).LE.TOLZ ) THEN
639
ELSE IF( SIGMA.GT.ZERO ) THEN
640
IF( E( N-1 ).LE.EPS*( SIGMA+Q( N ) ) ) THEN
641
IF( E( N-1 )*( Q( N ) / ( Q( N )+SIGMA ) ).LE.TOL2*
642
$ ( Q( N )+SIGMA ) ) THEN
647
IF( E( N-1 ).LE.Q( N )*TOL2 ) THEN
652
Q( N ) = Q( N ) + SIGMA
658
* Deflation: bottom 2x2 (in pong)
661
IF( E( N-2 ).LE.TOLZ ) THEN
663
ELSE IF( SIGMA.GT.ZERO ) THEN
664
T1 = SIGMA + E( N-1 )*( SIGMA / ( SIGMA+Q( N ) ) )
665
IF( E( N-2 )*( T1 / ( Q( N-1 )+T1 ) ).LE.TOLY ) THEN
666
IF( E( N-2 )*( Q( N-1 ) / ( Q( N-1 )+T1 ) ).LE.TOLX ) THEN
671
IF( E( N-2 ).LE.( Q( N ) / ( Q( N )+EE( N-1 )+Q( N-1 ) )*Q( N-
677
QEMAX = MAX( Q( N ), Q( N-1 ), E( N-1 ) )
678
IF( QEMAX.NE.ZERO ) THEN
679
IF( QEMAX.EQ.Q( N-1 ) ) THEN
680
XX = HALF*( Q( N )+Q( N-1 )+E( N-1 )+QEMAX*
681
$ SQRT( ( ( Q( N )-Q( N-1 )+E( N-1 ) ) / QEMAX )**2+
682
$ FOUR*E( N-1 ) / QEMAX ) )
683
ELSE IF( QEMAX.EQ.Q( N ) ) THEN
684
XX = HALF*( Q( N )+Q( N-1 )+E( N-1 )+QEMAX*
685
$ SQRT( ( ( Q( N-1 )-Q( N )+E( N-1 ) ) / QEMAX )**2+
686
$ FOUR*E( N-1 ) / QEMAX ) )
688
XX = HALF*( Q( N )+Q( N-1 )+E( N-1 )+QEMAX*
689
$ SQRT( ( ( Q( N )-Q( N-1 )+E( N-1 ) ) / QEMAX )**2+
690
$ FOUR*Q( N-1 ) / QEMAX ) )
692
YY = ( MAX( Q( N ), Q( N-1 ) ) / XX )*
693
$ MIN( Q( N ), Q( N-1 ) )
698
Q( N-1 ) = SIGMA + XX
705
* Updating bounds before going to pong
707
IF( ICONV.EQ.0 ) THEN
709
SUP = MIN( DM, SUP-TAU )
710
ELSE IF( ICONV.GT.0 ) THEN
711
SUP = MIN( Q( N ), Q( N-1 ), Q( N-2 ), Q( 1 ), Q( 2 ), Q( 3 ) )
712
IF( ICONV.EQ.1 ) THEN
714
ELSE IF( ICONV.EQ.2 ) THEN
723
* Checking for splitting in pong
726
DO 200 KS = N - 3, 3, -1
727
IF( E( KS ).LE.TOLY ) THEN
728
IF( E( KS )*( MIN( Q( KS+1 ), Q( KS ) ) / ( MIN( Q( KS+1 ),
729
$ Q( KS ) )+SIGMA ) ).LE.TOLX ) THEN
737
IF( E( 2 ).LE.TOLZ ) THEN
739
ELSE IF( SIGMA.GT.ZERO ) THEN
740
T1 = SIGMA + E( 1 )*( SIGMA / ( SIGMA+Q( 1 ) ) )
741
IF( E( 2 )*( T1 / ( Q( 1 )+T1 ) ).LE.TOLY ) THEN
742
IF( E( 2 )*( Q( 1 ) / ( Q( 1 )+T1 ) ).LE.TOLX ) THEN
747
IF( E( 2 ).LE.( Q( 1 ) / ( Q( 1 )+E( 1 )+Q( 2 ) ) )*Q( 2 )*
756
IF( E( 1 ).LE.TOLZ ) THEN
758
ELSE IF( SIGMA.GT.ZERO ) THEN
759
IF( E( 1 ).LE.EPS*( SIGMA+Q( 1 ) ) ) THEN
760
IF( E( 1 )*( Q( 1 ) / ( Q( 1 )+SIGMA ) ).LE.TOL2*
761
$ ( Q( 1 )+SIGMA ) ) THEN
766
IF( E( 1 ).LE.Q( 1 )*TOL2 ) THEN
773
SUP = MIN( Q( N ), Q( N-1 ), Q( N-2 ) )
776
KEND = MAX( 1, KEND-KS )
786
IF( TAU.EQ.ZERO .AND. DM.LE.TOLZ .AND. KEND.NE.N .AND. ICONV.EQ.
787
$ 0 .AND. ICNT.GT.0 ) THEN
788
CALL DCOPY( N-KE, EE( KE ), 1, Q( KE ), 1 )
790
CALL DCOPY( N-KE, QQ( KE+1 ), 1, E( KE ), 1 )
796
* Computation of a new shift when the previous failed (in pong)
803
* Too many bad shifts (in pong)
805
IF( SUP.LE.TOLZ .OR. IFL.GE.IFLMAX ) THEN
809
* The asymptotic shift (in pong)
812
TAU = MAX( TAU+D, ZERO )