1 *> \brief \b CLAED7 used by sstedc. Computes the updated eigensystem of a diagonal matrix after modification by a rank-one symmetric matrix. Used when the original matrix is dense.
3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
9 *> Download CLAED7 + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claed7.f">
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claed7.f">
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claed7.f">
21 * SUBROUTINE CLAED7( N, CUTPNT, QSIZ, TLVLS, CURLVL, CURPBM, D, Q,
22 * LDQ, RHO, INDXQ, QSTORE, QPTR, PRMPTR, PERM,
23 * GIVPTR, GIVCOL, GIVNUM, WORK, RWORK, IWORK,
26 * .. Scalar Arguments ..
27 * INTEGER CURLVL, CURPBM, CUTPNT, INFO, LDQ, N, QSIZ,
31 * .. Array Arguments ..
32 * INTEGER GIVCOL( 2, * ), GIVPTR( * ), INDXQ( * ),
33 * $ IWORK( * ), PERM( * ), PRMPTR( * ), QPTR( * )
34 * REAL D( * ), GIVNUM( 2, * ), QSTORE( * ), RWORK( * )
35 * COMPLEX Q( LDQ, * ), WORK( * )
44 *> CLAED7 computes the updated eigensystem of a diagonal
45 *> matrix after modification by a rank-one symmetric matrix. This
46 *> routine is used only for the eigenproblem which requires all
47 *> eigenvalues and optionally eigenvectors of a dense or banded
48 *> Hermitian matrix that has been reduced to tridiagonal form.
50 *> T = Q(in) ( D(in) + RHO * Z*Z**H ) Q**H(in) = Q(out) * D(out) * Q**H(out)
52 *> where Z = Q**Hu, u is a vector of length N with ones in the
53 *> CUTPNT and CUTPNT + 1 th elements and zeros elsewhere.
55 *> The eigenvectors of the original matrix are stored in Q, and the
56 *> eigenvalues are in D. The algorithm consists of three stages:
58 *> The first stage consists of deflating the size of the problem
59 *> when there are multiple eigenvalues or if there is a zero in
60 *> the Z vector. For each such occurrence the dimension of the
61 *> secular equation problem is reduced by one. This stage is
62 *> performed by the routine SLAED2.
64 *> The second stage consists of calculating the updated
65 *> eigenvalues. This is done by finding the roots of the secular
66 *> equation via the routine SLAED4 (as called by SLAED3).
67 *> This routine also calculates the eigenvectors of the current
70 *> The final stage consists of computing the updated eigenvectors
71 *> directly using the updated eigenvalues. The eigenvectors for
72 *> the current problem are multiplied with the eigenvectors from
73 *> the overall problem.
82 *> The dimension of the symmetric tridiagonal matrix. N >= 0.
88 *> Contains the location of the last eigenvalue in the leading
89 *> sub-matrix. min(1,N) <= CUTPNT <= N.
95 *> The dimension of the unitary matrix used to reduce
96 *> the full matrix to tridiagonal form. QSIZ >= N.
102 *> The total number of merging levels in the overall divide and
109 *> The current level in the overall merge routine,
110 *> 0 <= curlvl <= tlvls.
116 *> The current problem in the current level in the overall
117 *> merge routine (counting from upper left to lower right).
122 *> D is REAL array, dimension (N)
123 *> On entry, the eigenvalues of the rank-1-perturbed matrix.
124 *> On exit, the eigenvalues of the repaired matrix.
129 *> Q is COMPLEX array, dimension (LDQ,N)
130 *> On entry, the eigenvectors of the rank-1-perturbed matrix.
131 *> On exit, the eigenvectors of the repaired tridiagonal matrix.
137 *> The leading dimension of the array Q. LDQ >= max(1,N).
143 *> Contains the subdiagonal element used to create the rank-1
149 *> INDXQ is INTEGER array, dimension (N)
150 *> This contains the permutation which will reintegrate the
151 *> subproblem just solved back into sorted order,
152 *> ie. D( INDXQ( I = 1, N ) ) will be in ascending order.
157 *> IWORK is INTEGER array, dimension (4*N)
162 *> RWORK is REAL array,
163 *> dimension (3*N+2*QSIZ*N)
168 *> WORK is COMPLEX array, dimension (QSIZ*N)
171 *> \param[in,out] QSTORE
173 *> QSTORE is REAL array, dimension (N**2+1)
174 *> Stores eigenvectors of submatrices encountered during
175 *> divide and conquer, packed together. QPTR points to
176 *> beginning of the submatrices.
179 *> \param[in,out] QPTR
181 *> QPTR is INTEGER array, dimension (N+2)
182 *> List of indices pointing to beginning of submatrices stored
183 *> in QSTORE. The submatrices are numbered starting at the
184 *> bottom left of the divide and conquer tree, from left to
185 *> right and bottom to top.
190 *> PRMPTR is INTEGER array, dimension (N lg N)
191 *> Contains a list of pointers which indicate where in PERM a
192 *> level's permutation is stored. PRMPTR(i+1) - PRMPTR(i)
193 *> indicates the size of the permutation and also the size of
194 *> the full, non-deflated problem.
199 *> PERM is INTEGER array, dimension (N lg N)
200 *> Contains the permutations (from deflation and sorting) to be
201 *> applied to each eigenblock.
206 *> GIVPTR is INTEGER array, dimension (N lg N)
207 *> Contains a list of pointers which indicate where in GIVCOL a
208 *> level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i)
209 *> indicates the number of Givens rotations.
214 *> GIVCOL is INTEGER array, dimension (2, N lg N)
215 *> Each pair of numbers indicates a pair of columns to take place
216 *> in a Givens rotation.
221 *> GIVNUM is REAL array, dimension (2, N lg N)
222 *> Each number indicates the S value to be used in the
223 *> corresponding Givens rotation.
229 *> = 0: successful exit.
230 *> < 0: if INFO = -i, the i-th argument had an illegal value.
231 *> > 0: if INFO = 1, an eigenvalue did not converge
237 *> \author Univ. of Tennessee
238 *> \author Univ. of California Berkeley
239 *> \author Univ. of Colorado Denver
244 *> \ingroup complexOTHERcomputational
246 * =====================================================================
247 SUBROUTINE CLAED7( N, CUTPNT, QSIZ, TLVLS, CURLVL, CURPBM, D, Q,
248 $ LDQ, RHO, INDXQ, QSTORE, QPTR, PRMPTR, PERM,
249 $ GIVPTR, GIVCOL, GIVNUM, WORK, RWORK, IWORK,
252 * -- LAPACK computational routine (version 3.6.1) --
253 * -- LAPACK is a software package provided by Univ. of Tennessee, --
254 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
257 * .. Scalar Arguments ..
258 INTEGER CURLVL, CURPBM, CUTPNT, INFO, LDQ, N, QSIZ,
262 * .. Array Arguments ..
263 INTEGER GIVCOL( 2, * ), GIVPTR( * ), INDXQ( * ),
264 $ IWORK( * ), PERM( * ), PRMPTR( * ), QPTR( * )
265 REAL D( * ), GIVNUM( 2, * ), QSTORE( * ), RWORK( * )
266 COMPLEX Q( LDQ, * ), WORK( * )
269 * =====================================================================
271 * .. Local Scalars ..
272 INTEGER COLTYP, CURR, I, IDLMDA, INDX,
273 $ INDXC, INDXP, IQ, IW, IZ, K, N1, N2, PTR
275 * .. External Subroutines ..
276 EXTERNAL CLACRM, CLAED8, SLAED9, SLAEDA, SLAMRG, XERBLA
278 * .. Intrinsic Functions ..
281 * .. Executable Statements ..
283 * Test the input parameters.
287 * IF( ICOMPQ.LT.0 .OR. ICOMPQ.GT.1 ) THEN
289 * ELSE IF( N.LT.0 ) THEN
292 ELSE IF( MIN( 1, N ).GT.CUTPNT .OR. N.LT.CUTPNT ) THEN
294 ELSE IF( QSIZ.LT.N ) THEN
296 ELSE IF( LDQ.LT.MAX( 1, N ) ) THEN
300 CALL XERBLA( 'CLAED7', -INFO )
304 * Quick return if possible
309 * The following values are for bookkeeping purposes only. They are
310 * integer pointers which indicate the portion of the workspace
311 * used by a particular array in SLAED2 and SLAED3.
323 * Form the z-vector which consists of the last row of Q_1 and the
327 DO 10 I = 1, CURLVL - 1
328 PTR = PTR + 2**( TLVLS-I )
331 CALL SLAEDA( N, TLVLS, CURLVL, CURPBM, PRMPTR, PERM, GIVPTR,
332 $ GIVCOL, GIVNUM, QSTORE, QPTR, RWORK( IZ ),
333 $ RWORK( IZ+N ), INFO )
335 * When solving the final problem, we no longer need the stored data,
336 * so we will overwrite the data from this level onto the previously
337 * used storage space.
339 IF( CURLVL.EQ.TLVLS ) THEN
345 * Sort and Deflate eigenvalues.
347 CALL CLAED8( K, N, QSIZ, Q, LDQ, D, RHO, CUTPNT, RWORK( IZ ),
348 $ RWORK( IDLMDA ), WORK, QSIZ, RWORK( IW ),
349 $ IWORK( INDXP ), IWORK( INDX ), INDXQ,
350 $ PERM( PRMPTR( CURR ) ), GIVPTR( CURR+1 ),
351 $ GIVCOL( 1, GIVPTR( CURR ) ),
352 $ GIVNUM( 1, GIVPTR( CURR ) ), INFO )
353 PRMPTR( CURR+1 ) = PRMPTR( CURR ) + N
354 GIVPTR( CURR+1 ) = GIVPTR( CURR+1 ) + GIVPTR( CURR )
356 * Solve Secular Equation.
359 CALL SLAED9( K, 1, K, N, D, RWORK( IQ ), K, RHO,
360 $ RWORK( IDLMDA ), RWORK( IW ),
361 $ QSTORE( QPTR( CURR ) ), K, INFO )
362 CALL CLACRM( QSIZ, K, WORK, QSIZ, QSTORE( QPTR( CURR ) ), K, Q,
364 QPTR( CURR+1 ) = QPTR( CURR ) + K**2
369 * Prepare the INDXQ sorting premutation.
373 CALL SLAMRG( N1, N2, D, 1, -1, INDXQ )
375 QPTR( CURR+1 ) = QPTR( CURR )