--- rpl/lapack/lapack/dlaed2.f 2010/12/21 13:53:28 1.7 +++ rpl/lapack/lapack/dlaed2.f 2011/11/21 20:42:54 1.8 @@ -1,10 +1,221 @@ +*> \brief \b DLAED2 +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DLAED2 + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE DLAED2( K, N, N1, D, Q, LDQ, INDXQ, RHO, Z, DLAMDA, W, +* Q2, INDX, INDXC, INDXP, COLTYP, INFO ) +* +* .. Scalar Arguments .. +* INTEGER INFO, K, LDQ, N, N1 +* DOUBLE PRECISION RHO +* .. +* .. Array Arguments .. +* INTEGER COLTYP( * ), INDX( * ), INDXC( * ), INDXP( * ), +* $ INDXQ( * ) +* DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), Q2( * ), +* $ W( * ), Z( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DLAED2 merges the two sets of eigenvalues together into a single +*> sorted set. Then it tries to deflate the size of the problem. +*> There are two ways in which deflation can occur: when two or more +*> eigenvalues are close together or if there is a tiny entry in the +*> Z vector. For each such occurrence the order of the related secular +*> equation problem is reduced by one. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[out] K +*> \verbatim +*> K is INTEGER +*> The number of non-deflated eigenvalues, and the order of the +*> related secular equation. 0 <= K <=N. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The dimension of the symmetric tridiagonal matrix. N >= 0. +*> \endverbatim +*> +*> \param[in] N1 +*> \verbatim +*> N1 is INTEGER +*> The location of the last eigenvalue in the leading sub-matrix. +*> min(1,N) <= N1 <= N/2. +*> \endverbatim +*> +*> \param[in,out] D +*> \verbatim +*> D is DOUBLE PRECISION array, dimension (N) +*> On entry, D contains the eigenvalues of the two submatrices to +*> be combined. +*> On exit, D contains the trailing (N-K) updated eigenvalues +*> (those which were deflated) sorted into increasing order. +*> \endverbatim +*> +*> \param[in,out] Q +*> \verbatim +*> Q is DOUBLE PRECISION array, dimension (LDQ, N) +*> On entry, Q contains the eigenvectors of two submatrices in +*> the two square blocks with corners at (1,1), (N1,N1) +*> and (N1+1, N1+1), (N,N). +*> On exit, Q contains the trailing (N-K) updated eigenvectors +*> (those which were deflated) in its last N-K columns. +*> \endverbatim +*> +*> \param[in] LDQ +*> \verbatim +*> LDQ is INTEGER +*> The leading dimension of the array Q. LDQ >= max(1,N). +*> \endverbatim +*> +*> \param[in,out] INDXQ +*> \verbatim +*> INDXQ is INTEGER array, dimension (N) +*> The permutation which separately sorts the two sub-problems +*> in D into ascending order. Note that elements in the second +*> half of this permutation must first have N1 added to their +*> values. Destroyed on exit. +*> \endverbatim +*> +*> \param[in,out] RHO +*> \verbatim +*> RHO is DOUBLE PRECISION +*> On entry, the off-diagonal element associated with the rank-1 +*> cut which originally split the two submatrices which are now +*> being recombined. +*> On exit, RHO has been modified to the value required by +*> DLAED3. +*> \endverbatim +*> +*> \param[in] Z +*> \verbatim +*> Z is DOUBLE PRECISION array, dimension (N) +*> On entry, Z contains the updating vector (the last +*> row of the first sub-eigenvector matrix and the first row of +*> the second sub-eigenvector matrix). +*> On exit, the contents of Z have been destroyed by the updating +*> process. +*> \endverbatim +*> +*> \param[out] DLAMDA +*> \verbatim +*> DLAMDA is DOUBLE PRECISION array, dimension (N) +*> A copy of the first K eigenvalues which will be used by +*> DLAED3 to form the secular equation. +*> \endverbatim +*> +*> \param[out] W +*> \verbatim +*> W is DOUBLE PRECISION array, dimension (N) +*> The first k values of the final deflation-altered z-vector +*> which will be passed to DLAED3. +*> \endverbatim +*> +*> \param[out] Q2 +*> \verbatim +*> Q2 is DOUBLE PRECISION array, dimension (N1**2+(N-N1)**2) +*> A copy of the first K eigenvectors which will be used by +*> DLAED3 in a matrix multiply (DGEMM) to solve for the new +*> eigenvectors. +*> \endverbatim +*> +*> \param[out] INDX +*> \verbatim +*> INDX is INTEGER array, dimension (N) +*> The permutation used to sort the contents of DLAMDA into +*> ascending order. +*> \endverbatim +*> +*> \param[out] INDXC +*> \verbatim +*> INDXC is INTEGER array, dimension (N) +*> The permutation used to arrange the columns of the deflated +*> Q matrix into three groups: the first group contains non-zero +*> elements only at and above N1, the second contains +*> non-zero elements only below N1, and the third is dense. +*> \endverbatim +*> +*> \param[out] INDXP +*> \verbatim +*> INDXP is INTEGER array, dimension (N) +*> The permutation used to place deflated values of D at the end +*> of the array. INDXP(1:K) points to the nondeflated D-values +*> and INDXP(K+1:N) points to the deflated eigenvalues. +*> \endverbatim +*> +*> \param[out] COLTYP +*> \verbatim +*> COLTYP is INTEGER array, dimension (N) +*> During execution, a label which will indicate which of the +*> following types a column in the Q2 matrix is: +*> 1 : non-zero in the upper half only; +*> 2 : dense; +*> 3 : non-zero in the lower half only; +*> 4 : deflated. +*> On exit, COLTYP(i) is the number of columns of type i, +*> for i=1 to 4 only. +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit. +*> < 0: if INFO = -i, the i-th argument had an illegal value. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup auxOTHERcomputational +* +*> \par Contributors: +* ================== +*> +*> Jeff Rutter, Computer Science Division, University of California +*> at Berkeley, USA \n +*> Modified by Francoise Tisseur, University of Tennessee +*> +* ===================================================================== SUBROUTINE DLAED2( K, N, N1, D, Q, LDQ, INDXQ, RHO, Z, DLAMDA, W, $ Q2, INDX, INDXC, INDXP, COLTYP, INFO ) * -* -- LAPACK routine (version 3.2) -- +* -- LAPACK computational 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..-- -* November 2006 +* November 2011 * * .. Scalar Arguments .. INTEGER INFO, K, LDQ, N, N1 @@ -17,116 +228,6 @@ $ W( * ), Z( * ) * .. * -* Purpose -* ======= -* -* DLAED2 merges the two sets of eigenvalues together into a single -* sorted set. Then it tries to deflate the size of the problem. -* There are two ways in which deflation can occur: when two or more -* eigenvalues are close together or if there is a tiny entry in the -* Z vector. For each such occurrence the order of the related secular -* equation problem is reduced by one. -* -* Arguments -* ========= -* -* K (output) INTEGER -* The number of non-deflated eigenvalues, and the order of the -* related secular equation. 0 <= K <=N. -* -* N (input) INTEGER -* The dimension of the symmetric tridiagonal matrix. N >= 0. -* -* N1 (input) INTEGER -* The location of the last eigenvalue in the leading sub-matrix. -* min(1,N) <= N1 <= N/2. -* -* D (input/output) DOUBLE PRECISION array, dimension (N) -* On entry, D contains the eigenvalues of the two submatrices to -* be combined. -* On exit, D contains the trailing (N-K) updated eigenvalues -* (those which were deflated) sorted into increasing order. -* -* Q (input/output) DOUBLE PRECISION array, dimension (LDQ, N) -* On entry, Q contains the eigenvectors of two submatrices in -* the two square blocks with corners at (1,1), (N1,N1) -* and (N1+1, N1+1), (N,N). -* On exit, Q contains the trailing (N-K) updated eigenvectors -* (those which were deflated) in its last N-K columns. -* -* LDQ (input) INTEGER -* The leading dimension of the array Q. LDQ >= max(1,N). -* -* INDXQ (input/output) INTEGER array, dimension (N) -* The permutation which separately sorts the two sub-problems -* in D into ascending order. Note that elements in the second -* half of this permutation must first have N1 added to their -* values. Destroyed on exit. -* -* RHO (input/output) DOUBLE PRECISION -* On entry, the off-diagonal element associated with the rank-1 -* cut which originally split the two submatrices which are now -* being recombined. -* On exit, RHO has been modified to the value required by -* DLAED3. -* -* Z (input) DOUBLE PRECISION array, dimension (N) -* On entry, Z contains the updating vector (the last -* row of the first sub-eigenvector matrix and the first row of -* the second sub-eigenvector matrix). -* On exit, the contents of Z have been destroyed by the updating -* process. -* -* DLAMDA (output) DOUBLE PRECISION array, dimension (N) -* A copy of the first K eigenvalues which will be used by -* DLAED3 to form the secular equation. -* -* W (output) DOUBLE PRECISION array, dimension (N) -* The first k values of the final deflation-altered z-vector -* which will be passed to DLAED3. -* -* Q2 (output) DOUBLE PRECISION array, dimension (N1**2+(N-N1)**2) -* A copy of the first K eigenvectors which will be used by -* DLAED3 in a matrix multiply (DGEMM) to solve for the new -* eigenvectors. -* -* INDX (workspace) INTEGER array, dimension (N) -* The permutation used to sort the contents of DLAMDA into -* ascending order. -* -* INDXC (output) INTEGER array, dimension (N) -* The permutation used to arrange the columns of the deflated -* Q matrix into three groups: the first group contains non-zero -* elements only at and above N1, the second contains -* non-zero elements only below N1, and the third is dense. -* -* INDXP (workspace) INTEGER array, dimension (N) -* The permutation used to place deflated values of D at the end -* of the array. INDXP(1:K) points to the nondeflated D-values -* and INDXP(K+1:N) points to the deflated eigenvalues. -* -* COLTYP (workspace/output) INTEGER array, dimension (N) -* During execution, a label which will indicate which of the -* following types a column in the Q2 matrix is: -* 1 : non-zero in the upper half only; -* 2 : dense; -* 3 : non-zero in the lower half only; -* 4 : deflated. -* On exit, COLTYP(i) is the number of columns of type i, -* for i=1 to 4 only. -* -* INFO (output) INTEGER -* = 0: successful exit. -* < 0: if INFO = -i, the i-th argument had an illegal value. -* -* Further Details -* =============== -* -* Based on contributions by -* Jeff Rutter, Computer Science Division, University of California -* at Berkeley, USA -* Modified by Francoise Tisseur, University of Tennessee. -* * ===================================================================== * * .. Parameters .. @@ -418,8 +519,11 @@ * The deflated eigenvalues and their corresponding vectors go back * into the last N - K slots of D and Q respectively. * - CALL DLACPY( 'A', N, CTOT( 4 ), Q2( IQ1 ), N, Q( 1, K+1 ), LDQ ) - CALL DCOPY( N-K, Z( K+1 ), 1, D( K+1 ), 1 ) + IF( K.LT.N ) THEN + CALL DLACPY( 'A', N, CTOT( 4 ), Q2( IQ1 ), N, + $ Q( 1, K+1 ), LDQ ) + CALL DCOPY( N-K, Z( K+1 ), 1, D( K+1 ), 1 ) + END IF * * Copy CTOT into COLTYP for referencing in DLAED3. *