version 1.14, 2014/01/27 09:28:15
|
version 1.15, 2016/08/27 15:27:07
|
Line 191
|
Line 191
|
*> \author Univ. of Colorado Denver |
*> \author Univ. of Colorado Denver |
*> \author NAG Ltd. |
*> \author NAG Ltd. |
* |
* |
*> \date November 2011 |
*> \date June 2016 |
* |
* |
*> \ingroup auxOTHERcomputational |
*> \ingroup auxOTHERcomputational |
* |
* |
Line 205
|
Line 205
|
SUBROUTINE DBDSDC( UPLO, COMPQ, N, D, E, U, LDU, VT, LDVT, Q, IQ, |
SUBROUTINE DBDSDC( UPLO, COMPQ, N, D, E, U, LDU, VT, LDVT, Q, IQ, |
$ WORK, IWORK, INFO ) |
$ WORK, IWORK, INFO ) |
* |
* |
* -- LAPACK computational routine (version 3.4.0) -- |
* -- LAPACK computational routine (version 3.6.1) -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* November 2011 |
* June 2016 |
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
CHARACTER COMPQ, UPLO |
CHARACTER COMPQ, UPLO |
Line 311
|
Line 311
|
WSTART = 1 |
WSTART = 1 |
QSTART = 3 |
QSTART = 3 |
IF( ICOMPQ.EQ.1 ) THEN |
IF( ICOMPQ.EQ.1 ) THEN |
CALL DCOPY( N, D, 1, Q( 1 ), 1 ) |
CALL DCOPY( N, D, 1, Q( 1 ), 1 ) |
CALL DCOPY( N-1, E, 1, Q( N+1 ), 1 ) |
CALL DCOPY( N-1, E, 1, Q( N+1 ), 1 ) |
END IF |
END IF |
IF( IUPLO.EQ.2 ) THEN |
IF( IUPLO.EQ.2 ) THEN |
Line 335
|
Line 335
|
* If ICOMPQ = 0, use DLASDQ to compute the singular values. |
* If ICOMPQ = 0, use DLASDQ to compute the singular values. |
* |
* |
IF( ICOMPQ.EQ.0 ) THEN |
IF( ICOMPQ.EQ.0 ) THEN |
|
* Ignore WSTART, instead using WORK( 1 ), since the two vectors |
|
* for CS and -SN above are added only if ICOMPQ == 2, |
|
* and adding them exceeds documented WORK size of 4*n. |
CALL DLASDQ( 'U', 0, N, 0, 0, 0, D, E, VT, LDVT, U, LDU, U, |
CALL DLASDQ( 'U', 0, N, 0, 0, 0, D, E, VT, LDVT, U, LDU, U, |
$ LDU, WORK( WSTART ), INFO ) |
$ LDU, WORK( 1 ), INFO ) |
GO TO 40 |
GO TO 40 |
END IF |
END IF |
* |
* |
Line 412
|
Line 415
|
DO 30 I = 1, NM1 |
DO 30 I = 1, NM1 |
IF( ( ABS( E( I ) ).LT.EPS ) .OR. ( I.EQ.NM1 ) ) THEN |
IF( ( ABS( E( I ) ).LT.EPS ) .OR. ( I.EQ.NM1 ) ) THEN |
* |
* |
* Subproblem found. First determine its size and then |
* Subproblem found. First determine its size and then |
* apply divide and conquer on it. |
* apply divide and conquer on it. |
* |
* |
IF( I.LT.NM1 ) THEN |
IF( I.LT.NM1 ) THEN |
* |
* |
* A subproblem with E(I) small for I < NM1. |
* A subproblem with E(I) small for I < NM1. |
* |
* |
NSIZE = I - START + 1 |
NSIZE = I - START + 1 |
ELSE IF( ABS( E( I ) ).GE.EPS ) THEN |
ELSE IF( ABS( E( I ) ).GE.EPS ) THEN |
* |
* |
* A subproblem with E(NM1) not too small but I = NM1. |
* A subproblem with E(NM1) not too small but I = NM1. |
* |
* |
NSIZE = N - START + 1 |
NSIZE = N - START + 1 |
ELSE |
ELSE |
* |
* |
* A subproblem with E(NM1) small. This implies an |
* A subproblem with E(NM1) small. This implies an |
* 1-by-1 subproblem at D(N). Solve this 1-by-1 problem |
* 1-by-1 subproblem at D(N). Solve this 1-by-1 problem |
* first. |
* first. |
* |
* |
NSIZE = I - START + 1 |
NSIZE = I - START + 1 |
IF( ICOMPQ.EQ.2 ) THEN |
IF( ICOMPQ.EQ.2 ) THEN |