version 1.1, 2015/11/26 11:44:15
|
version 1.2, 2016/08/27 15:27:08
|
Line 123
|
Line 123
|
*> \param[in] VL |
*> \param[in] VL |
*> \verbatim |
*> \verbatim |
*> VL is DOUBLE PRECISION |
*> VL is DOUBLE PRECISION |
*> VL >=0. |
*> If RANGE='V', the lower bound of the interval to |
|
*> be searched for singular values. VU > VL. |
|
*> Not referenced if RANGE = 'A' or 'I'. |
*> \endverbatim |
*> \endverbatim |
*> |
*> |
*> \param[in] VU |
*> \param[in] VU |
*> \verbatim |
*> \verbatim |
*> VU is DOUBLE PRECISION |
*> VU is DOUBLE PRECISION |
*> If RANGE='V', the lower and upper bounds of the interval to |
*> If RANGE='V', the upper bound of the interval to |
*> be searched for singular values. VU > VL. |
*> be searched for singular values. VU > VL. |
*> Not referenced if RANGE = 'A' or 'I'. |
*> Not referenced if RANGE = 'A' or 'I'. |
*> \endverbatim |
*> \endverbatim |
Line 137
|
Line 139
|
*> \param[in] IL |
*> \param[in] IL |
*> \verbatim |
*> \verbatim |
*> IL is INTEGER |
*> IL is INTEGER |
|
*> If RANGE='I', the index of the |
|
*> smallest singular value to be returned. |
|
*> 1 <= IL <= IU <= min(M,N), if min(M,N) > 0. |
|
*> Not referenced if RANGE = 'A' or 'V'. |
*> \endverbatim |
*> \endverbatim |
*> |
*> |
*> \param[in] IU |
*> \param[in] IU |
*> \verbatim |
*> \verbatim |
*> IU is INTEGER |
*> IU is INTEGER |
*> If RANGE='I', the indices (in ascending order) of the |
*> If RANGE='I', the index of the |
*> smallest and largest singular values to be returned. |
*> largest singular value to be returned. |
*> 1 <= IL <= IU <= min(M,N), if min(M,N) > 0. |
*> 1 <= IL <= IU <= min(M,N), if min(M,N) > 0. |
*> Not referenced if RANGE = 'A' or 'V'. |
*> Not referenced if RANGE = 'A' or 'V'. |
*> \endverbatim |
*> \endverbatim |
Line 169
|
Line 175
|
*> vectors, stored columnwise) as specified by RANGE; if |
*> vectors, stored columnwise) as specified by RANGE; if |
*> JOBU = 'N', U is not referenced. |
*> JOBU = 'N', U is not referenced. |
*> Note: The user must ensure that UCOL >= NS; if RANGE = 'V', |
*> Note: The user must ensure that UCOL >= NS; if RANGE = 'V', |
*> the exact value of NS is not known ILQFin advance and an upper |
*> the exact value of NS is not known in advance and an upper |
*> bound must be used. |
*> bound must be used. |
*> \endverbatim |
*> \endverbatim |
*> |
*> |
Line 248
|
Line 254
|
*> \author Univ. of Colorado Denver |
*> \author Univ. of Colorado Denver |
*> \author NAG Ltd. |
*> \author NAG Ltd. |
* |
* |
*> \date November 2015 |
*> \date June 2016 |
* |
* |
*> \ingroup doubleGEsing |
*> \ingroup doubleGEsing |
* |
* |
Line 257
|
Line 263
|
$ IL, IU, NS, S, U, LDU, VT, LDVT, WORK, |
$ IL, IU, NS, S, U, LDU, VT, LDVT, WORK, |
$ LWORK, IWORK, INFO ) |
$ LWORK, IWORK, INFO ) |
* |
* |
* -- LAPACK driver routine (version 3.6.0) -- |
* -- LAPACK driver 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 2015 |
* June 2016 |
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
CHARACTER JOBU, JOBVT, RANGE |
CHARACTER JOBU, JOBVT, RANGE |
Line 357
|
Line 363
|
IF( INFO.EQ.0 ) THEN |
IF( INFO.EQ.0 ) THEN |
IF( WANTU .AND. LDU.LT.M ) THEN |
IF( WANTU .AND. LDU.LT.M ) THEN |
INFO = -15 |
INFO = -15 |
ELSE IF( WANTVT .AND. LDVT.LT.MINMN ) THEN |
ELSE IF( WANTVT ) THEN |
INFO = -16 |
IF( INDS ) THEN |
|
IF( LDVT.LT.IU-IL+1 ) THEN |
|
INFO = -17 |
|
END IF |
|
ELSE IF( LDVT.LT.MINMN ) THEN |
|
INFO = -17 |
|
END IF |
END IF |
END IF |
END IF |
END IF |
END IF |
END IF |
Line 380
|
Line 392
|
* |
* |
* Path 1 (M much larger than N) |
* Path 1 (M much larger than N) |
* |
* |
MAXWRK = N*(N*2+16) + |
MAXWRK = N + |
$ N*ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 ) |
$ N*ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 ) |
MAXWRK = MAX( MAXWRK, N*(N*2+20) + 2*N* |
MAXWRK = MAX( MAXWRK, N*(N+5) + 2*N* |
$ ILAENV( 1, 'DGEBRD', ' ', N, N, -1, -1 ) ) |
$ ILAENV( 1, 'DGEBRD', ' ', N, N, -1, -1 ) ) |
MINWRK = N*(N*2+21) |
IF (WANTU) THEN |
|
MAXWRK = MAX(MAXWRK,N*(N*3+6)+N* |
|
$ ILAENV( 1, 'DORMQR', ' ', N, N, -1, -1 ) ) |
|
END IF |
|
IF (WANTVT) THEN |
|
MAXWRK = MAX(MAXWRK,N*(N*3+6)+N* |
|
$ ILAENV( 1, 'DORMLQ', ' ', N, N, -1, -1 ) ) |
|
END IF |
|
MINWRK = N*(N*3+20) |
ELSE |
ELSE |
* |
* |
* Path 2 (M at least N, but not much larger) |
* Path 2 (M at least N, but not much larger) |
* |
* |
MAXWRK = N*(N*2+19) + ( M+N )* |
MAXWRK = 4*N + ( M+N )* |
$ ILAENV( 1, 'DGEBRD', ' ', M, N, -1, -1 ) |
$ ILAENV( 1, 'DGEBRD', ' ', M, N, -1, -1 ) |
MINWRK = N*(N*2+20) + M |
IF (WANTU) THEN |
|
MAXWRK = MAX(MAXWRK,N*(N*2+5)+N* |
|
$ ILAENV( 1, 'DORMQR', ' ', N, N, -1, -1 ) ) |
|
END IF |
|
IF (WANTVT) THEN |
|
MAXWRK = MAX(MAXWRK,N*(N*2+5)+N* |
|
$ ILAENV( 1, 'DORMLQ', ' ', N, N, -1, -1 ) ) |
|
END IF |
|
MINWRK = MAX(N*(N*2+19),4*N+M) |
END IF |
END IF |
ELSE |
ELSE |
MNTHR = ILAENV( 6, 'DGESVD', JOBU // JOBVT, M, N, 0, 0 ) |
MNTHR = ILAENV( 6, 'DGESVD', JOBU // JOBVT, M, N, 0, 0 ) |
Line 399
|
Line 427
|
* |
* |
* Path 1t (N much larger than M) |
* Path 1t (N much larger than M) |
* |
* |
MAXWRK = M*(M*2+16) + |
MAXWRK = M + |
$ M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 ) |
$ M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 ) |
MAXWRK = MAX( MAXWRK, M*(M*2+20) + 2*M* |
MAXWRK = MAX( MAXWRK, M*(M+5) + 2*M* |
$ ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) ) |
$ ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) ) |
MINWRK = M*(M*2+21) |
IF (WANTU) THEN |
|
MAXWRK = MAX(MAXWRK,M*(M*3+6)+M* |
|
$ ILAENV( 1, 'DORMQR', ' ', M, M, -1, -1 ) ) |
|
END IF |
|
IF (WANTVT) THEN |
|
MAXWRK = MAX(MAXWRK,M*(M*3+6)+M* |
|
$ ILAENV( 1, 'DORMLQ', ' ', M, M, -1, -1 ) ) |
|
END IF |
|
MINWRK = M*(M*3+20) |
ELSE |
ELSE |
* |
* |
* Path 2t (N greater than M, but not much larger) |
* Path 2t (N at least M, but not much larger) |
* |
* |
MAXWRK = M*(M*2+19) + ( M+N )* |
MAXWRK = 4*M + ( M+N )* |
$ ILAENV( 1, 'DGEBRD', ' ', M, N, -1, -1 ) |
$ ILAENV( 1, 'DGEBRD', ' ', M, N, -1, -1 ) |
MINWRK = M*(M*2+20) + N |
IF (WANTU) THEN |
|
MAXWRK = MAX(MAXWRK,M*(M*2+5)+M* |
|
$ ILAENV( 1, 'DORMQR', ' ', M, M, -1, -1 ) ) |
|
END IF |
|
IF (WANTVT) THEN |
|
MAXWRK = MAX(MAXWRK,M*(M*2+5)+M* |
|
$ ILAENV( 1, 'DORMLQ', ' ', M, M, -1, -1 ) ) |
|
END IF |
|
MINWRK = MAX(M*(M*2+19),4*M+N) |
END IF |
END IF |
END IF |
END IF |
END IF |
END IF |
Line 522
|
Line 566
|
CALL DCOPY( N, WORK( J ), 1, U( 1,I ), 1 ) |
CALL DCOPY( N, WORK( J ), 1, U( 1,I ), 1 ) |
J = J + N*2 |
J = J + N*2 |
END DO |
END DO |
CALL DLASET( 'A', M-N, N, ZERO, ZERO, U( N+1,1 ), LDU ) |
CALL DLASET( 'A', M-N, NS, ZERO, ZERO, U( N+1,1 ), LDU ) |
* |
* |
* Call DORMBR to compute QB*UB. |
* Call DORMBR to compute QB*UB. |
* (Workspace in WORK( ITEMP ): need N, prefer N*NB) |
* (Workspace in WORK( ITEMP ): need N, prefer N*NB) |
Line 591
|
Line 635
|
CALL DCOPY( N, WORK( J ), 1, U( 1,I ), 1 ) |
CALL DCOPY( N, WORK( J ), 1, U( 1,I ), 1 ) |
J = J + N*2 |
J = J + N*2 |
END DO |
END DO |
CALL DLASET( 'A', M-N, N, ZERO, ZERO, U( N+1,1 ), LDU ) |
CALL DLASET( 'A', M-N, NS, ZERO, ZERO, U( N+1,1 ), LDU ) |
* |
* |
* Call DORMBR to compute QB*UB. |
* Call DORMBR to compute QB*UB. |
* (Workspace in WORK( ITEMP ): need N, prefer N*NB) |
* (Workspace in WORK( ITEMP ): need N, prefer N*NB) |
Line 687
|
Line 731
|
CALL DCOPY( M, WORK( J ), 1, VT( I,1 ), LDVT ) |
CALL DCOPY( M, WORK( J ), 1, VT( I,1 ), LDVT ) |
J = J + M*2 |
J = J + M*2 |
END DO |
END DO |
CALL DLASET( 'A', M, N-M, ZERO, ZERO, VT( 1,M+1 ), LDVT ) |
CALL DLASET( 'A', NS, N-M, ZERO, ZERO, VT( 1,M+1 ), LDVT) |
* |
* |
* Call DORMBR to compute (VB**T)*(PB**T) |
* Call DORMBR to compute (VB**T)*(PB**T) |
* (Workspace in WORK( ITEMP ): need M, prefer M*NB) |
* (Workspace in WORK( ITEMP ): need M, prefer M*NB) |
Line 756
|
Line 800
|
CALL DCOPY( M, WORK( J ), 1, VT( I,1 ), LDVT ) |
CALL DCOPY( M, WORK( J ), 1, VT( I,1 ), LDVT ) |
J = J + M*2 |
J = J + M*2 |
END DO |
END DO |
CALL DLASET( 'A', M, N-M, ZERO, ZERO, VT( 1,M+1 ), LDVT ) |
CALL DLASET( 'A', NS, N-M, ZERO, ZERO, VT( 1,M+1 ), LDVT) |
* |
* |
* Call DORMBR to compute VB**T * PB**T |
* Call DORMBR to compute VB**T * PB**T |
* (Workspace in WORK( ITEMP ): need M, prefer M*NB) |
* (Workspace in WORK( ITEMP ): need M, prefer M*NB) |