1
*> \brief \b SLAED8 used by sstedc. Merges eigenvalues and deflates secular equation. 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 SLAED8 + dependencies
10
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slaed8.f">
12
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slaed8.f">
14
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slaed8.f">
21
* SUBROUTINE SLAED8( ICOMPQ, K, N, QSIZ, D, Q, LDQ, INDXQ, RHO,
22
* CUTPNT, Z, DLAMDA, Q2, LDQ2, W, PERM, GIVPTR,
23
* GIVCOL, GIVNUM, INDXP, INDX, INFO )
25
* .. Scalar Arguments ..
26
* INTEGER CUTPNT, GIVPTR, ICOMPQ, INFO, K, LDQ, LDQ2, N,
30
* .. Array Arguments ..
31
* INTEGER GIVCOL( 2, * ), INDX( * ), INDXP( * ),
32
* $ INDXQ( * ), PERM( * )
33
* REAL D( * ), DLAMDA( * ), GIVNUM( 2, * ),
34
* $ Q( LDQ, * ), Q2( LDQ2, * ), W( * ), Z( * )
43
*> SLAED8 merges the two sets of eigenvalues together into a single
44
*> sorted set. Then it tries to deflate the size of the problem.
45
*> There are two ways in which deflation can occur: when two or more
46
*> eigenvalues are close together or if there is a tiny element in the
47
*> Z vector. For each such occurrence the order of the related secular
48
*> equation problem is reduced by one.
57
*> = 0: Compute eigenvalues only.
58
*> = 1: Compute eigenvectors of original dense symmetric matrix
59
*> also. On entry, Q contains the orthogonal matrix used
60
*> to reduce the original matrix to tridiagonal form.
66
*> The number of non-deflated eigenvalues, and the order of the
67
*> related secular equation.
73
*> The dimension of the symmetric tridiagonal matrix. N >= 0.
79
*> The dimension of the orthogonal matrix used to reduce
80
*> the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1.
85
*> D is REAL array, dimension (N)
86
*> On entry, the eigenvalues of the two submatrices to be
87
*> combined. On exit, the trailing (N-K) updated eigenvalues
88
*> (those which were deflated) sorted into increasing order.
93
*> Q is REAL array, dimension (LDQ,N)
94
*> If ICOMPQ = 0, Q is not referenced. Otherwise,
95
*> on entry, Q contains the eigenvectors of the partially solved
96
*> system which has been previously updated in matrix
97
*> multiplies with other partially solved eigensystems.
98
*> On exit, Q contains the trailing (N-K) updated eigenvectors
99
*> (those which were deflated) in its last N-K columns.
105
*> The leading dimension of the array Q. LDQ >= max(1,N).
110
*> INDXQ is INTEGER array, dimension (N)
111
*> The permutation which separately sorts the two sub-problems
112
*> in D into ascending order. Note that elements in the second
113
*> half of this permutation must first have CUTPNT added to
114
*> their values in order to be accurate.
117
*> \param[in,out] RHO
120
*> On entry, the off-diagonal element associated with the rank-1
121
*> cut which originally split the two submatrices which are now
123
*> On exit, RHO has been modified to the value required by
130
*> The location of the last eigenvalue in the leading
131
*> sub-matrix. min(1,N) <= CUTPNT <= N.
136
*> Z is REAL array, dimension (N)
137
*> On entry, Z contains the updating vector (the last row of
138
*> the first sub-eigenvector matrix and the first row of the
139
*> second sub-eigenvector matrix).
140
*> On exit, the contents of Z are destroyed by the updating
144
*> \param[out] DLAMDA
146
*> DLAMDA is REAL array, dimension (N)
147
*> A copy of the first K eigenvalues which will be used by
148
*> SLAED3 to form the secular equation.
153
*> Q2 is REAL array, dimension (LDQ2,N)
154
*> If ICOMPQ = 0, Q2 is not referenced. Otherwise,
155
*> a copy of the first K eigenvectors which will be used by
156
*> SLAED7 in a matrix multiply (SGEMM) to update the new
163
*> The leading dimension of the array Q2. LDQ2 >= max(1,N).
168
*> W is REAL array, dimension (N)
169
*> The first k values of the final deflation-altered z-vector and
170
*> will be passed to SLAED3.
175
*> PERM is INTEGER array, dimension (N)
176
*> The permutations (from deflation and sorting) to be applied
177
*> to each eigenblock.
180
*> \param[out] GIVPTR
183
*> The number of Givens rotations which took place in this
187
*> \param[out] GIVCOL
189
*> GIVCOL is INTEGER array, dimension (2, N)
190
*> Each pair of numbers indicates a pair of columns to take place
191
*> in a Givens rotation.
194
*> \param[out] GIVNUM
196
*> GIVNUM is REAL array, dimension (2, N)
197
*> Each number indicates the S value to be used in the
198
*> corresponding Givens rotation.
203
*> INDXP is INTEGER array, dimension (N)
204
*> The permutation used to place deflated values of D at the end
205
*> of the array. INDXP(1:K) points to the nondeflated D-values
206
*> and INDXP(K+1:N) points to the deflated eigenvalues.
211
*> INDX is INTEGER array, dimension (N)
212
*> The permutation used to sort the contents of D into ascending
219
*> = 0: successful exit.
220
*> < 0: if INFO = -i, the i-th argument had an illegal value.
226
*> \author Univ. of Tennessee
227
*> \author Univ. of California Berkeley
228
*> \author Univ. of Colorado Denver
231
*> \date September 2012
233
*> \ingroup auxOTHERcomputational
235
*> \par Contributors:
238
*> Jeff Rutter, Computer Science Division, University of California
241
* =====================================================================
1
242
SUBROUTINE SLAED8( ICOMPQ, K, N, QSIZ, D, Q, LDQ, INDXQ, RHO,
2
243
$ CUTPNT, Z, DLAMDA, Q2, LDQ2, W, PERM, GIVPTR,
3
244
$ GIVCOL, GIVNUM, INDXP, INDX, INFO )
5
* -- LAPACK routine (version 3.0) --
6
* Univ. of Tennessee, Oak Ridge National Lab, Argonne National Lab,
7
* Courant Institute, NAG Ltd., and Rice University
246
* -- LAPACK computational routine (version 3.4.2) --
247
* -- LAPACK is a software package provided by Univ. of Tennessee, --
248
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
10
251
* .. Scalar Arguments ..
11
252
INTEGER CUTPNT, GIVPTR, ICOMPQ, INFO, K, LDQ, LDQ2, N,
19
260
$ Q( LDQ, * ), Q2( LDQ2, * ), W( * ), Z( * )
25
* SLAED8 merges the two sets of eigenvalues together into a single
26
* sorted set. Then it tries to deflate the size of the problem.
27
* There are two ways in which deflation can occur: when two or more
28
* eigenvalues are close together or if there is a tiny element in the
29
* Z vector. For each such occurrence the order of the related secular
30
* equation problem is reduced by one.
35
* ICOMPQ (input) INTEGER
36
* = 0: Compute eigenvalues only.
37
* = 1: Compute eigenvectors of original dense symmetric matrix
38
* also. On entry, Q contains the orthogonal matrix used
39
* to reduce the original matrix to tridiagonal form.
42
* The number of non-deflated eigenvalues, and the order of the
43
* related secular equation.
46
* The dimension of the symmetric tridiagonal matrix. N >= 0.
48
* QSIZ (input) INTEGER
49
* The dimension of the orthogonal matrix used to reduce
50
* the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1.
52
* D (input/output) REAL array, dimension (N)
53
* On entry, the eigenvalues of the two submatrices to be
54
* combined. On exit, the trailing (N-K) updated eigenvalues
55
* (those which were deflated) sorted into increasing order.
57
* Q (input/output) REAL array, dimension (LDQ,N)
58
* If ICOMPQ = 0, Q is not referenced. Otherwise,
59
* on entry, Q contains the eigenvectors of the partially solved
60
* system which has been previously updated in matrix
61
* multiplies with other partially solved eigensystems.
62
* On exit, Q contains the trailing (N-K) updated eigenvectors
63
* (those which were deflated) in its last N-K columns.
66
* The leading dimension of the array Q. LDQ >= max(1,N).
68
* INDXQ (input) INTEGER array, dimension (N)
69
* The permutation which separately sorts the two sub-problems
70
* in D into ascending order. Note that elements in the second
71
* half of this permutation must first have CUTPNT added to
72
* their values in order to be accurate.
74
* RHO (input/output) REAL
75
* On entry, the off-diagonal element associated with the rank-1
76
* cut which originally split the two submatrices which are now
78
* On exit, RHO has been modified to the value required by
81
* CUTPNT (input) INTEGER
82
* The location of the last eigenvalue in the leading
83
* sub-matrix. min(1,N) <= CUTPNT <= N.
85
* Z (input) REAL array, dimension (N)
86
* On entry, Z contains the updating vector (the last row of
87
* the first sub-eigenvector matrix and the first row of the
88
* second sub-eigenvector matrix).
89
* On exit, the contents of Z are destroyed by the updating
92
* DLAMDA (output) REAL array, dimension (N)
93
* A copy of the first K eigenvalues which will be used by
94
* SLAED3 to form the secular equation.
96
* Q2 (output) REAL array, dimension (LDQ2,N)
97
* If ICOMPQ = 0, Q2 is not referenced. Otherwise,
98
* a copy of the first K eigenvectors which will be used by
99
* SLAED7 in a matrix multiply (SGEMM) to update the new
102
* LDQ2 (input) INTEGER
103
* The leading dimension of the array Q2. LDQ2 >= max(1,N).
105
* W (output) REAL array, dimension (N)
106
* The first k values of the final deflation-altered z-vector and
107
* will be passed to SLAED3.
109
* PERM (output) INTEGER array, dimension (N)
110
* The permutations (from deflation and sorting) to be applied
111
* to each eigenblock.
113
* GIVPTR (output) INTEGER
114
* The number of Givens rotations which took place in this
117
* GIVCOL (output) INTEGER array, dimension (2, N)
118
* Each pair of numbers indicates a pair of columns to take place
119
* in a Givens rotation.
121
* GIVNUM (output) REAL array, dimension (2, N)
122
* Each number indicates the S value to be used in the
123
* corresponding Givens rotation.
125
* INDXP (workspace) INTEGER array, dimension (N)
126
* The permutation used to place deflated values of D at the end
127
* of the array. INDXP(1:K) points to the nondeflated D-values
128
* and INDXP(K+1:N) points to the deflated eigenvalues.
130
* INDX (workspace) INTEGER array, dimension (N)
131
* The permutation used to sort the contents of D into ascending
134
* INFO (output) INTEGER
135
* = 0: successful exit.
136
* < 0: if INFO = -i, the i-th argument had an illegal value.
141
* Based on contributions by
142
* Jeff Rutter, Computer Science Division, University of California
145
263
* =====================================================================
147
265
* .. Parameters ..