Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 44 additions & 21 deletions lapack-netlib/SRC/cbdsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,13 @@
* Online html documentation available at
* http://www.netlib.org/lapack/explore-html/
*
*> \htmlonly
*> Download CBDSQR + dependencies
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cbdsqr.f">
*> [TGZ]</a>
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cbdsqr.f">
*> [ZIP]</a>
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cbdsqr.f">
*> [TXT]</a>
*> \endhtmlonly
*
* Definition:
* ===========
Expand Down Expand Up @@ -166,7 +164,9 @@
*>
*> \param[out] RWORK
*> \verbatim
*> RWORK is REAL array, dimension (4*N)
*> RWORK is REAL array, dimension (LRWORK)
*> LRWORK = 4*N, if NCVT = NRU = NCC = 0, and
*> LRWORK = 4*(N-1), otherwise
*> \endverbatim
*>
*> \param[out] INFO
Expand Down Expand Up @@ -230,6 +230,7 @@
* =====================================================================
SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
$ LDU, C, LDC, RWORK, INFO )
IMPLICIT NONE
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
Expand Down Expand Up @@ -279,7 +280,8 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
EXTERNAL LSAME, SLAMCH
* ..
* .. External Subroutines ..
EXTERNAL CLASR, CSROT, CSSCAL, CSWAP, SLARTG, SLAS2,
EXTERNAL CLASR, CSROT, CSSCAL, CSWAP, SLARTG,
$ SLAS2,
$ SLASQ1, SLASV2, XERBLA
* ..
* .. Intrinsic Functions ..
Expand Down Expand Up @@ -328,9 +330,10 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
IF( .NOT.ROTATE ) THEN
CALL SLASQ1( N, D, E, RWORK, INFO )
*
* If INFO equals 2, dqds didn't finish, try to finish
* If the dqds algorithm failed, try to finish with
* the standard QR algorithm
*
IF( INFO .NE. 2 ) RETURN
IF( INFO .EQ. 0 ) RETURN
INFO = 0
END IF
*
Expand Down Expand Up @@ -360,10 +363,12 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
* Update singular vectors if desired
*
IF( NRU.GT.0 )
$ CALL CLASR( 'R', 'V', 'F', NRU, N, RWORK( 1 ), RWORK( N ),
$ CALL CLASR( 'R', 'V', 'F', NRU, N, RWORK( 1 ),
$ RWORK( N ),
$ U, LDU )
IF( NCC.GT.0 )
$ CALL CLASR( 'L', 'V', 'F', N, NCC, RWORK( 1 ), RWORK( N ),
$ CALL CLASR( 'L', 'V', 'F', N, NCC, RWORK( 1 ),
$ RWORK( N ),
$ C, LDC )
END IF
*
Expand Down Expand Up @@ -400,12 +405,14 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
40 CONTINUE
50 CONTINUE
SMINOA = SMINOA / SQRT( REAL( N ) )
THRESH = MAX( TOL*SMINOA, MAXITR*(N*(N*UNFL)) )
THRESH = MAX( TOL*SMINOA,
$ REAL(MAXITR)*(REAL(N)*(REAL(N)*UNFL)) )
ELSE
*
* Absolute accuracy desired
*
THRESH = MAX( ABS( TOL )*SMAX, MAXITR*(N*(N*UNFL)) )
THRESH = MAX( ABS( TOL )*SMAX,
$ REAL(MAXITR)*(REAL(N)*(REAL(N)*UNFL)) )
END IF
*
* Prepare for main iteration loop for the singular values
Expand Down Expand Up @@ -487,7 +494,8 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
$ CALL CSROT( NCVT, VT( M-1, 1 ), LDVT, VT( M, 1 ), LDVT,
$ COSR, SINR )
IF( NRU.GT.0 )
$ CALL CSROT( NRU, U( 1, M-1 ), 1, U( 1, M ), 1, COSL, SINL )
$ CALL CSROT( NRU, U( 1, M-1 ), 1, U( 1, M ), 1, COSL,
$ SINL )
IF( NCC.GT.0 )
$ CALL CSROT( NCC, C( M-1, 1 ), LDC, C( M, 1 ), LDC, COSL,
$ SINL )
Expand Down Expand Up @@ -576,7 +584,7 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
* Compute shift. First, test if shifting would ruin relative
* accuracy, and if so set the shift to zero.
*
IF( TOL.GE.ZERO .AND. N*TOL*( SMIN / SMAX ).LE.
IF( TOL.GE.ZERO .AND. REAL( N )*TOL*( SMIN / SMAX ).LE.
$ MAX( EPS, HNDRTH*TOL ) ) THEN
*
* Use a zero shift to avoid loss of relative accuracy
Expand Down Expand Up @@ -620,7 +628,8 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
CALL SLARTG( D( I )*CS, E( I ), CS, SN, R )
IF( I.GT.LL )
$ E( I-1 ) = OLDSN*R
CALL SLARTG( OLDCS*R, D( I+1 )*SN, OLDCS, OLDSN, D( I ) )
CALL SLARTG( OLDCS*R, D( I+1 )*SN, OLDCS, OLDSN,
$ D( I ) )
RWORK( I-LL+1 ) = CS
RWORK( I-LL+1+NM1 ) = SN
RWORK( I-LL+1+NM12 ) = OLDCS
Expand All @@ -636,10 +645,12 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
$ CALL CLASR( 'L', 'V', 'F', M-LL+1, NCVT, RWORK( 1 ),
$ RWORK( N ), VT( LL, 1 ), LDVT )
IF( NRU.GT.0 )
$ CALL CLASR( 'R', 'V', 'F', NRU, M-LL+1, RWORK( NM12+1 ),
$ CALL CLASR( 'R', 'V', 'F', NRU, M-LL+1,
$ RWORK( NM12+1 ),
$ RWORK( NM13+1 ), U( 1, LL ), LDU )
IF( NCC.GT.0 )
$ CALL CLASR( 'L', 'V', 'F', M-LL+1, NCC, RWORK( NM12+1 ),
$ CALL CLASR( 'L', 'V', 'F', M-LL+1, NCC,
$ RWORK( NM12+1 ),
$ RWORK( NM13+1 ), C( LL, 1 ), LDC )
*
* Test convergence
Expand All @@ -658,7 +669,8 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
CALL SLARTG( D( I )*CS, E( I-1 ), CS, SN, R )
IF( I.LT.M )
$ E( I ) = OLDSN*R
CALL SLARTG( OLDCS*R, D( I-1 )*SN, OLDCS, OLDSN, D( I ) )
CALL SLARTG( OLDCS*R, D( I-1 )*SN, OLDCS, OLDSN,
$ D( I ) )
RWORK( I-LL ) = CS
RWORK( I-LL+NM1 ) = -SN
RWORK( I-LL+NM12 ) = OLDCS
Expand All @@ -671,7 +683,8 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
* Update singular vectors
*
IF( NCVT.GT.0 )
$ CALL CLASR( 'L', 'V', 'B', M-LL+1, NCVT, RWORK( NM12+1 ),
$ CALL CLASR( 'L', 'V', 'B', M-LL+1, NCVT,
$ RWORK( NM12+1 ),
$ RWORK( NM13+1 ), VT( LL, 1 ), LDVT )
IF( NRU.GT.0 )
$ CALL CLASR( 'R', 'V', 'B', NRU, M-LL+1, RWORK( 1 ),
Expand Down Expand Up @@ -726,10 +739,12 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
$ CALL CLASR( 'L', 'V', 'F', M-LL+1, NCVT, RWORK( 1 ),
$ RWORK( N ), VT( LL, 1 ), LDVT )
IF( NRU.GT.0 )
$ CALL CLASR( 'R', 'V', 'F', NRU, M-LL+1, RWORK( NM12+1 ),
$ CALL CLASR( 'R', 'V', 'F', NRU, M-LL+1,
$ RWORK( NM12+1 ),
$ RWORK( NM13+1 ), U( 1, LL ), LDU )
IF( NCC.GT.0 )
$ CALL CLASR( 'L', 'V', 'F', M-LL+1, NCC, RWORK( NM12+1 ),
$ CALL CLASR( 'L', 'V', 'F', M-LL+1, NCC,
$ RWORK( NM12+1 ),
$ RWORK( NM13+1 ), C( LL, 1 ), LDC )
*
* Test convergence
Expand Down Expand Up @@ -776,7 +791,8 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
* Update singular vectors if desired
*
IF( NCVT.GT.0 )
$ CALL CLASR( 'L', 'V', 'B', M-LL+1, NCVT, RWORK( NM12+1 ),
$ CALL CLASR( 'L', 'V', 'B', M-LL+1, NCVT,
$ RWORK( NM12+1 ),
$ RWORK( NM13+1 ), VT( LL, 1 ), LDVT )
IF( NRU.GT.0 )
$ CALL CLASR( 'R', 'V', 'B', NRU, M-LL+1, RWORK( 1 ),
Expand All @@ -795,6 +811,12 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
*
160 CONTINUE
DO 170 I = 1, N
IF( D( I ).EQ.ZERO ) THEN
*
* Avoid -ZERO
*
D( I ) = ZERO
END IF
IF( D( I ).LT.ZERO ) THEN
D( I ) = -D( I )
*
Expand Down Expand Up @@ -832,7 +854,8 @@ SUBROUTINE CBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
IF( NRU.GT.0 )
$ CALL CSWAP( NRU, U( 1, ISUB ), 1, U( 1, N+1-I ), 1 )
IF( NCC.GT.0 )
$ CALL CSWAP( NCC, C( ISUB, 1 ), LDC, C( N+1-I, 1 ), LDC )
$ CALL CSWAP( NCC, C( ISUB, 1 ), LDC, C( N+1-I, 1 ),
$ LDC )
END IF
190 CONTINUE
GO TO 220
Expand Down
64 changes: 43 additions & 21 deletions lapack-netlib/SRC/dbdsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,13 @@
* Online html documentation available at
* http://www.netlib.org/lapack/explore-html/
*
*> \htmlonly
*> Download DBDSQR + dependencies
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dbdsqr.f">
*> [TGZ]</a>
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dbdsqr.f">
*> [ZIP]</a>
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dbdsqr.f">
*> [TXT]</a>
*> \endhtmlonly
*
* Definition:
* ===========
Expand Down Expand Up @@ -166,7 +164,9 @@
*>
*> \param[out] WORK
*> \verbatim
*> WORK is DOUBLE PRECISION array, dimension (4*(N-1))
*> WORK is DOUBLE PRECISION array, dimension (LWORK)
*> LWORK = 4*N, if NCVT = NRU = NCC = 0, and
*> LWORK = 4*(N-1), otherwise
*> \endverbatim
*>
*> \param[out] INFO
Expand All @@ -181,7 +181,7 @@
*> iterations (in inner while loop)
*> = 3, termination criterion of outer while loop not met
*> (program created more than N unreduced blocks)
*> else NCVT = NRU = NCC = 0,
*> else,
*> the algorithm did not converge; D and E contain the
*> elements of a bidiagonal matrix which is orthogonally
*> similar to the input matrix B; if INFO = i, i
Expand Down Expand Up @@ -233,11 +233,12 @@
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
*> \ingroup auxOTHERcomputational
*> \ingroup bdsqr
*
* =====================================================================
SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
$ LDU, C, LDC, WORK, INFO )
IMPLICIT NONE
*
* -- LAPACK computational routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
Expand Down Expand Up @@ -287,7 +288,8 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
EXTERNAL LSAME, DLAMCH
* ..
* .. External Subroutines ..
EXTERNAL DLARTG, DLAS2, DLASQ1, DLASR, DLASV2, DROT,
EXTERNAL DLARTG, DLAS2, DLASQ1, DLASR, DLASV2,
$ DROT,
$ DSCAL, DSWAP, XERBLA
* ..
* .. Intrinsic Functions ..
Expand Down Expand Up @@ -336,9 +338,10 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
IF( .NOT.ROTATE ) THEN
CALL DLASQ1( N, D, E, WORK, INFO )
*
* If INFO equals 2, dqds didn't finish, try to finish
* If the dqds algorithm failed, try to finish with
* the standard QR algorithm
*
IF( INFO .NE. 2 ) RETURN
IF( INFO .EQ. 0 ) RETURN
INFO = 0
END IF
*
Expand Down Expand Up @@ -368,10 +371,12 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
* Update singular vectors if desired
*
IF( NRU.GT.0 )
$ CALL DLASR( 'R', 'V', 'F', NRU, N, WORK( 1 ), WORK( N ), U,
$ CALL DLASR( 'R', 'V', 'F', NRU, N, WORK( 1 ), WORK( N ),
$ U,
$ LDU )
IF( NCC.GT.0 )
$ CALL DLASR( 'L', 'V', 'F', N, NCC, WORK( 1 ), WORK( N ), C,
$ CALL DLASR( 'L', 'V', 'F', N, NCC, WORK( 1 ), WORK( N ),
$ C,
$ LDC )
END IF
*
Expand Down Expand Up @@ -493,10 +498,12 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
* Compute singular vectors, if desired
*
IF( NCVT.GT.0 )
$ CALL DROT( NCVT, VT( M-1, 1 ), LDVT, VT( M, 1 ), LDVT, COSR,
$ CALL DROT( NCVT, VT( M-1, 1 ), LDVT, VT( M, 1 ), LDVT,
$ COSR,
$ SINR )
IF( NRU.GT.0 )
$ CALL DROT( NRU, U( 1, M-1 ), 1, U( 1, M ), 1, COSL, SINL )
$ CALL DROT( NRU, U( 1, M-1 ), 1, U( 1, M ), 1, COSL,
$ SINL )
IF( NCC.GT.0 )
$ CALL DROT( NCC, C( M-1, 1 ), LDC, C( M, 1 ), LDC, COSL,
$ SINL )
Expand Down Expand Up @@ -629,7 +636,8 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
CALL DLARTG( D( I )*CS, E( I ), CS, SN, R )
IF( I.GT.LL )
$ E( I-1 ) = OLDSN*R
CALL DLARTG( OLDCS*R, D( I+1 )*SN, OLDCS, OLDSN, D( I ) )
CALL DLARTG( OLDCS*R, D( I+1 )*SN, OLDCS, OLDSN,
$ D( I ) )
WORK( I-LL+1 ) = CS
WORK( I-LL+1+NM1 ) = SN
WORK( I-LL+1+NM12 ) = OLDCS
Expand All @@ -645,10 +653,12 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
$ CALL DLASR( 'L', 'V', 'F', M-LL+1, NCVT, WORK( 1 ),
$ WORK( N ), VT( LL, 1 ), LDVT )
IF( NRU.GT.0 )
$ CALL DLASR( 'R', 'V', 'F', NRU, M-LL+1, WORK( NM12+1 ),
$ CALL DLASR( 'R', 'V', 'F', NRU, M-LL+1,
$ WORK( NM12+1 ),
$ WORK( NM13+1 ), U( 1, LL ), LDU )
IF( NCC.GT.0 )
$ CALL DLASR( 'L', 'V', 'F', M-LL+1, NCC, WORK( NM12+1 ),
$ CALL DLASR( 'L', 'V', 'F', M-LL+1, NCC,
$ WORK( NM12+1 ),
$ WORK( NM13+1 ), C( LL, 1 ), LDC )
*
* Test convergence
Expand All @@ -667,7 +677,8 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
CALL DLARTG( D( I )*CS, E( I-1 ), CS, SN, R )
IF( I.LT.M )
$ E( I ) = OLDSN*R
CALL DLARTG( OLDCS*R, D( I-1 )*SN, OLDCS, OLDSN, D( I ) )
CALL DLARTG( OLDCS*R, D( I-1 )*SN, OLDCS, OLDSN,
$ D( I ) )
WORK( I-LL ) = CS
WORK( I-LL+NM1 ) = -SN
WORK( I-LL+NM12 ) = OLDCS
Expand All @@ -680,7 +691,8 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
* Update singular vectors
*
IF( NCVT.GT.0 )
$ CALL DLASR( 'L', 'V', 'B', M-LL+1, NCVT, WORK( NM12+1 ),
$ CALL DLASR( 'L', 'V', 'B', M-LL+1, NCVT,
$ WORK( NM12+1 ),
$ WORK( NM13+1 ), VT( LL, 1 ), LDVT )
IF( NRU.GT.0 )
$ CALL DLASR( 'R', 'V', 'B', NRU, M-LL+1, WORK( 1 ),
Expand Down Expand Up @@ -735,10 +747,12 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
$ CALL DLASR( 'L', 'V', 'F', M-LL+1, NCVT, WORK( 1 ),
$ WORK( N ), VT( LL, 1 ), LDVT )
IF( NRU.GT.0 )
$ CALL DLASR( 'R', 'V', 'F', NRU, M-LL+1, WORK( NM12+1 ),
$ CALL DLASR( 'R', 'V', 'F', NRU, M-LL+1,
$ WORK( NM12+1 ),
$ WORK( NM13+1 ), U( 1, LL ), LDU )
IF( NCC.GT.0 )
$ CALL DLASR( 'L', 'V', 'F', M-LL+1, NCC, WORK( NM12+1 ),
$ CALL DLASR( 'L', 'V', 'F', M-LL+1, NCC,
$ WORK( NM12+1 ),
$ WORK( NM13+1 ), C( LL, 1 ), LDC )
*
* Test convergence
Expand Down Expand Up @@ -785,7 +799,8 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
* Update singular vectors if desired
*
IF( NCVT.GT.0 )
$ CALL DLASR( 'L', 'V', 'B', M-LL+1, NCVT, WORK( NM12+1 ),
$ CALL DLASR( 'L', 'V', 'B', M-LL+1, NCVT,
$ WORK( NM12+1 ),
$ WORK( NM13+1 ), VT( LL, 1 ), LDVT )
IF( NRU.GT.0 )
$ CALL DLASR( 'R', 'V', 'B', NRU, M-LL+1, WORK( 1 ),
Expand All @@ -804,6 +819,12 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
*
160 CONTINUE
DO 170 I = 1, N
IF( D( I ).EQ.ZERO ) THEN
*
* Avoid -ZERO
*
D( I ) = ZERO
END IF
IF( D( I ).LT.ZERO ) THEN
D( I ) = -D( I )
*
Expand Down Expand Up @@ -841,7 +862,8 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
IF( NRU.GT.0 )
$ CALL DSWAP( NRU, U( 1, ISUB ), 1, U( 1, N+1-I ), 1 )
IF( NCC.GT.0 )
$ CALL DSWAP( NCC, C( ISUB, 1 ), LDC, C( N+1-I, 1 ), LDC )
$ CALL DSWAP( NCC, C( ISUB, 1 ), LDC, C( N+1-I, 1 ),
$ LDC )
END IF
190 CONTINUE
GO TO 220
Expand Down
Loading
Loading