--- rpl/lapack/lapack/dlasd1.f 2011/07/22 07:38:07 1.9 +++ rpl/lapack/lapack/dlasd1.f 2011/11/21 20:42:58 1.10 @@ -1,10 +1,213 @@ +*> \brief \b DLASD1 +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DLASD1 + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE DLASD1( NL, NR, SQRE, D, ALPHA, BETA, U, LDU, VT, LDVT, +* IDXQ, IWORK, WORK, INFO ) +* +* .. Scalar Arguments .. +* INTEGER INFO, LDU, LDVT, NL, NR, SQRE +* DOUBLE PRECISION ALPHA, BETA +* .. +* .. Array Arguments .. +* INTEGER IDXQ( * ), IWORK( * ) +* DOUBLE PRECISION D( * ), U( LDU, * ), VT( LDVT, * ), WORK( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DLASD1 computes the SVD of an upper bidiagonal N-by-M matrix B, +*> where N = NL + NR + 1 and M = N + SQRE. DLASD1 is called from DLASD0. +*> +*> A related subroutine DLASD7 handles the case in which the singular +*> values (and the singular vectors in factored form) are desired. +*> +*> DLASD1 computes the SVD as follows: +*> +*> ( D1(in) 0 0 0 ) +*> B = U(in) * ( Z1**T a Z2**T b ) * VT(in) +*> ( 0 0 D2(in) 0 ) +*> +*> = U(out) * ( D(out) 0) * VT(out) +*> +*> where Z**T = (Z1**T a Z2**T b) = u**T VT**T, and u is a vector of dimension M +*> with ALPHA and BETA in the NL+1 and NL+2 th entries and zeros +*> elsewhere; and the entry b is empty if SQRE = 0. +*> +*> The left singular vectors of the original matrix are stored in U, and +*> the transpose of the right singular vectors are stored in VT, and the +*> singular values are in D. The algorithm consists of three stages: +*> +*> The first stage consists of deflating the size of the problem +*> when there are multiple singular values or when there are zeros in +*> the Z vector. For each such occurence the dimension of the +*> secular equation problem is reduced by one. This stage is +*> performed by the routine DLASD2. +*> +*> The second stage consists of calculating the updated +*> singular values. This is done by finding the square roots of the +*> roots of the secular equation via the routine DLASD4 (as called +*> by DLASD3). This routine also calculates the singular vectors of +*> the current problem. +*> +*> The final stage consists of computing the updated singular vectors +*> directly using the updated singular values. The singular vectors +*> for the current problem are multiplied with the singular vectors +*> from the overall problem. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] NL +*> \verbatim +*> NL is INTEGER +*> The row dimension of the upper block. NL >= 1. +*> \endverbatim +*> +*> \param[in] NR +*> \verbatim +*> NR is INTEGER +*> The row dimension of the lower block. NR >= 1. +*> \endverbatim +*> +*> \param[in] SQRE +*> \verbatim +*> SQRE is INTEGER +*> = 0: the lower block is an NR-by-NR square matrix. +*> = 1: the lower block is an NR-by-(NR+1) rectangular matrix. +*> +*> The bidiagonal matrix has row dimension N = NL + NR + 1, +*> and column dimension M = N + SQRE. +*> \endverbatim +*> +*> \param[in,out] D +*> \verbatim +*> D is DOUBLE PRECISION array, +*> dimension (N = NL+NR+1). +*> On entry D(1:NL,1:NL) contains the singular values of the +*> upper block; and D(NL+2:N) contains the singular values of +*> the lower block. On exit D(1:N) contains the singular values +*> of the modified matrix. +*> \endverbatim +*> +*> \param[in,out] ALPHA +*> \verbatim +*> ALPHA is DOUBLE PRECISION +*> Contains the diagonal element associated with the added row. +*> \endverbatim +*> +*> \param[in,out] BETA +*> \verbatim +*> BETA is DOUBLE PRECISION +*> Contains the off-diagonal element associated with the added +*> row. +*> \endverbatim +*> +*> \param[in,out] U +*> \verbatim +*> U is DOUBLE PRECISION array, dimension(LDU,N) +*> On entry U(1:NL, 1:NL) contains the left singular vectors of +*> the upper block; U(NL+2:N, NL+2:N) contains the left singular +*> vectors of the lower block. On exit U contains the left +*> singular vectors of the bidiagonal matrix. +*> \endverbatim +*> +*> \param[in] LDU +*> \verbatim +*> LDU is INTEGER +*> The leading dimension of the array U. LDU >= max( 1, N ). +*> \endverbatim +*> +*> \param[in,out] VT +*> \verbatim +*> VT is DOUBLE PRECISION array, dimension(LDVT,M) +*> where M = N + SQRE. +*> On entry VT(1:NL+1, 1:NL+1)**T contains the right singular +*> vectors of the upper block; VT(NL+2:M, NL+2:M)**T contains +*> the right singular vectors of the lower block. On exit +*> VT**T contains the right singular vectors of the +*> bidiagonal matrix. +*> \endverbatim +*> +*> \param[in] LDVT +*> \verbatim +*> LDVT is INTEGER +*> The leading dimension of the array VT. LDVT >= max( 1, M ). +*> \endverbatim +*> +*> \param[out] IDXQ +*> \verbatim +*> IDXQ is INTEGER array, dimension(N) +*> This contains the permutation which will reintegrate the +*> subproblem just solved back into sorted order, i.e. +*> D( IDXQ( I = 1, N ) ) will be in ascending order. +*> \endverbatim +*> +*> \param[out] IWORK +*> \verbatim +*> IWORK is INTEGER array, dimension( 4 * N ) +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is DOUBLE PRECISION array, dimension( 3*M**2 + 2*M ) +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit. +*> < 0: if INFO = -i, the i-th argument had an illegal value. +*> > 0: if INFO = 1, a singular value did not converge +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup auxOTHERauxiliary +* +*> \par Contributors: +* ================== +*> +*> Ming Gu and Huan Ren, Computer Science Division, University of +*> California at Berkeley, USA +*> +* ===================================================================== SUBROUTINE DLASD1( NL, NR, SQRE, D, ALPHA, BETA, U, LDU, VT, LDVT, $ IDXQ, IWORK, WORK, INFO ) * -* -- LAPACK auxiliary routine (version 3.3.1) -- +* -- LAPACK auxiliary routine (version 3.4.0) -- * -- LAPACK is a software package provided by Univ. of Tennessee, -- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -- April 2011 -- +* November 2011 * * .. Scalar Arguments .. INTEGER INFO, LDU, LDVT, NL, NR, SQRE @@ -15,119 +218,6 @@ DOUBLE PRECISION D( * ), U( LDU, * ), VT( LDVT, * ), WORK( * ) * .. * -* Purpose -* ======= -* -* DLASD1 computes the SVD of an upper bidiagonal N-by-M matrix B, -* where N = NL + NR + 1 and M = N + SQRE. DLASD1 is called from DLASD0. -* -* A related subroutine DLASD7 handles the case in which the singular -* values (and the singular vectors in factored form) are desired. -* -* DLASD1 computes the SVD as follows: -* -* ( D1(in) 0 0 0 ) -* B = U(in) * ( Z1**T a Z2**T b ) * VT(in) -* ( 0 0 D2(in) 0 ) -* -* = U(out) * ( D(out) 0) * VT(out) -* -* where Z**T = (Z1**T a Z2**T b) = u**T VT**T, and u is a vector of dimension M -* with ALPHA and BETA in the NL+1 and NL+2 th entries and zeros -* elsewhere; and the entry b is empty if SQRE = 0. -* -* The left singular vectors of the original matrix are stored in U, and -* the transpose of the right singular vectors are stored in VT, and the -* singular values are in D. The algorithm consists of three stages: -* -* The first stage consists of deflating the size of the problem -* when there are multiple singular values or when there are zeros in -* the Z vector. For each such occurence the dimension of the -* secular equation problem is reduced by one. This stage is -* performed by the routine DLASD2. -* -* The second stage consists of calculating the updated -* singular values. This is done by finding the square roots of the -* roots of the secular equation via the routine DLASD4 (as called -* by DLASD3). This routine also calculates the singular vectors of -* the current problem. -* -* The final stage consists of computing the updated singular vectors -* directly using the updated singular values. The singular vectors -* for the current problem are multiplied with the singular vectors -* from the overall problem. -* -* Arguments -* ========= -* -* NL (input) INTEGER -* The row dimension of the upper block. NL >= 1. -* -* NR (input) INTEGER -* The row dimension of the lower block. NR >= 1. -* -* SQRE (input) INTEGER -* = 0: the lower block is an NR-by-NR square matrix. -* = 1: the lower block is an NR-by-(NR+1) rectangular matrix. -* -* The bidiagonal matrix has row dimension N = NL + NR + 1, -* and column dimension M = N + SQRE. -* -* D (input/output) DOUBLE PRECISION array, -* dimension (N = NL+NR+1). -* On entry D(1:NL,1:NL) contains the singular values of the -* upper block; and D(NL+2:N) contains the singular values of -* the lower block. On exit D(1:N) contains the singular values -* of the modified matrix. -* -* ALPHA (input/output) DOUBLE PRECISION -* Contains the diagonal element associated with the added row. -* -* BETA (input/output) DOUBLE PRECISION -* Contains the off-diagonal element associated with the added -* row. -* -* U (input/output) DOUBLE PRECISION array, dimension(LDU,N) -* On entry U(1:NL, 1:NL) contains the left singular vectors of -* the upper block; U(NL+2:N, NL+2:N) contains the left singular -* vectors of the lower block. On exit U contains the left -* singular vectors of the bidiagonal matrix. -* -* LDU (input) INTEGER -* The leading dimension of the array U. LDU >= max( 1, N ). -* -* VT (input/output) DOUBLE PRECISION array, dimension(LDVT,M) -* where M = N + SQRE. -* On entry VT(1:NL+1, 1:NL+1)**T contains the right singular -* vectors of the upper block; VT(NL+2:M, NL+2:M)**T contains -* the right singular vectors of the lower block. On exit -* VT**T contains the right singular vectors of the -* bidiagonal matrix. -* -* LDVT (input) INTEGER -* The leading dimension of the array VT. LDVT >= max( 1, M ). -* -* IDXQ (output) INTEGER array, dimension(N) -* This contains the permutation which will reintegrate the -* subproblem just solved back into sorted order, i.e. -* D( IDXQ( I = 1, N ) ) will be in ascending order. -* -* IWORK (workspace) INTEGER array, dimension( 4 * N ) -* -* WORK (workspace) DOUBLE PRECISION array, dimension( 3*M**2 + 2*M ) -* -* INFO (output) INTEGER -* = 0: successful exit. -* < 0: if INFO = -i, the i-th argument had an illegal value. -* > 0: if INFO = 1, a singular value did not converge -* -* Further Details -* =============== -* -* Based on contributions by -* Ming Gu and Huan Ren, Computer Science Division, University of -* California at Berkeley, USA -* * ===================================================================== * * .. Parameters ..