LAPACK  3.10.1
LAPACK: Linear Algebra PACKage
cpteqr.f
Go to the documentation of this file.
1 *> \brief \b CPTEQR
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download CPTEQR + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cpteqr.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cpteqr.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cpteqr.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE CPTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO )
22 *
23 * .. Scalar Arguments ..
24 * CHARACTER COMPZ
25 * INTEGER INFO, LDZ, N
26 * ..
27 * .. Array Arguments ..
28 * REAL D( * ), E( * ), WORK( * )
29 * COMPLEX Z( LDZ, * )
30 * ..
31 *
32 *
33 *> \par Purpose:
34 * =============
35 *>
36 *> \verbatim
37 *>
38 *> CPTEQR computes all eigenvalues and, optionally, eigenvectors of a
39 *> symmetric positive definite tridiagonal matrix by first factoring the
40 *> matrix using SPTTRF and then calling CBDSQR to compute the singular
41 *> values of the bidiagonal factor.
42 *>
43 *> This routine computes the eigenvalues of the positive definite
44 *> tridiagonal matrix to high relative accuracy. This means that if the
45 *> eigenvalues range over many orders of magnitude in size, then the
46 *> small eigenvalues and corresponding eigenvectors will be computed
47 *> more accurately than, for example, with the standard QR method.
48 *>
49 *> The eigenvectors of a full or band positive definite Hermitian matrix
50 *> can also be found if CHETRD, CHPTRD, or CHBTRD has been used to
51 *> reduce this matrix to tridiagonal form. (The reduction to
52 *> tridiagonal form, however, may preclude the possibility of obtaining
53 *> high relative accuracy in the small eigenvalues of the original
54 *> matrix, if these eigenvalues range over many orders of magnitude.)
55 *> \endverbatim
56 *
57 * Arguments:
58 * ==========
59 *
60 *> \param[in] COMPZ
61 *> \verbatim
62 *> COMPZ is CHARACTER*1
63 *> = 'N': Compute eigenvalues only.
64 *> = 'V': Compute eigenvectors of original Hermitian
65 *> matrix also. Array Z contains the unitary matrix
66 *> used to reduce the original matrix to tridiagonal
67 *> form.
68 *> = 'I': Compute eigenvectors of tridiagonal matrix also.
69 *> \endverbatim
70 *>
71 *> \param[in] N
72 *> \verbatim
73 *> N is INTEGER
74 *> The order of the matrix. N >= 0.
75 *> \endverbatim
76 *>
77 *> \param[in,out] D
78 *> \verbatim
79 *> D is REAL array, dimension (N)
80 *> On entry, the n diagonal elements of the tridiagonal matrix.
81 *> On normal exit, D contains the eigenvalues, in descending
82 *> order.
83 *> \endverbatim
84 *>
85 *> \param[in,out] E
86 *> \verbatim
87 *> E is REAL array, dimension (N-1)
88 *> On entry, the (n-1) subdiagonal elements of the tridiagonal
89 *> matrix.
90 *> On exit, E has been destroyed.
91 *> \endverbatim
92 *>
93 *> \param[in,out] Z
94 *> \verbatim
95 *> Z is COMPLEX array, dimension (LDZ, N)
96 *> On entry, if COMPZ = 'V', the unitary matrix used in the
97 *> reduction to tridiagonal form.
98 *> On exit, if COMPZ = 'V', the orthonormal eigenvectors of the
99 *> original Hermitian matrix;
100 *> if COMPZ = 'I', the orthonormal eigenvectors of the
101 *> tridiagonal matrix.
102 *> If INFO > 0 on exit, Z contains the eigenvectors associated
103 *> with only the stored eigenvalues.
104 *> If COMPZ = 'N', then Z is not referenced.
105 *> \endverbatim
106 *>
107 *> \param[in] LDZ
108 *> \verbatim
109 *> LDZ is INTEGER
110 *> The leading dimension of the array Z. LDZ >= 1, and if
111 *> COMPZ = 'V' or 'I', LDZ >= max(1,N).
112 *> \endverbatim
113 *>
114 *> \param[out] WORK
115 *> \verbatim
116 *> WORK is REAL array, dimension (4*N)
117 *> \endverbatim
118 *>
119 *> \param[out] INFO
120 *> \verbatim
121 *> INFO is INTEGER
122 *> = 0: successful exit.
123 *> < 0: if INFO = -i, the i-th argument had an illegal value.
124 *> > 0: if INFO = i, and i is:
125 *> <= N the Cholesky factorization of the matrix could
126 *> not be performed because the i-th principal minor
127 *> was not positive definite.
128 *> > N the SVD algorithm failed to converge;
129 *> if INFO = N+i, i off-diagonal elements of the
130 *> bidiagonal factor did not converge to zero.
131 *> \endverbatim
132 *
133 * Authors:
134 * ========
135 *
136 *> \author Univ. of Tennessee
137 *> \author Univ. of California Berkeley
138 *> \author Univ. of Colorado Denver
139 *> \author NAG Ltd.
140 *
141 *> \ingroup complexPTcomputational
142 *
143 * =====================================================================
144  SUBROUTINE cpteqr( COMPZ, N, D, E, Z, LDZ, WORK, INFO )
145 *
146 * -- LAPACK computational routine --
147 * -- LAPACK is a software package provided by Univ. of Tennessee, --
148 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
149 *
150 * .. Scalar Arguments ..
151  CHARACTER COMPZ
152  INTEGER INFO, LDZ, N
153 * ..
154 * .. Array Arguments ..
155  REAL D( * ), E( * ), WORK( * )
156  COMPLEX Z( LDZ, * )
157 * ..
158 *
159 * ====================================================================
160 *
161 * .. Parameters ..
162  COMPLEX CZERO, CONE
163  parameter( czero = ( 0.0e+0, 0.0e+0 ),
164  $ cone = ( 1.0e+0, 0.0e+0 ) )
165 * ..
166 * .. External Functions ..
167  LOGICAL LSAME
168  EXTERNAL lsame
169 * ..
170 * .. External Subroutines ..
171  EXTERNAL cbdsqr, claset, spttrf, xerbla
172 * ..
173 * .. Local Arrays ..
174  COMPLEX C( 1, 1 ), VT( 1, 1 )
175 * ..
176 * .. Local Scalars ..
177  INTEGER I, ICOMPZ, NRU
178 * ..
179 * .. Intrinsic Functions ..
180  INTRINSIC max, sqrt
181 * ..
182 * .. Executable Statements ..
183 *
184 * Test the input parameters.
185 *
186  info = 0
187 *
188  IF( lsame( compz, 'N' ) ) THEN
189  icompz = 0
190  ELSE IF( lsame( compz, 'V' ) ) THEN
191  icompz = 1
192  ELSE IF( lsame( compz, 'I' ) ) THEN
193  icompz = 2
194  ELSE
195  icompz = -1
196  END IF
197  IF( icompz.LT.0 ) THEN
198  info = -1
199  ELSE IF( n.LT.0 ) THEN
200  info = -2
201  ELSE IF( ( ldz.LT.1 ) .OR. ( icompz.GT.0 .AND. ldz.LT.max( 1,
202  $ n ) ) ) THEN
203  info = -6
204  END IF
205  IF( info.NE.0 ) THEN
206  CALL xerbla( 'CPTEQR', -info )
207  RETURN
208  END IF
209 *
210 * Quick return if possible
211 *
212  IF( n.EQ.0 )
213  $ RETURN
214 *
215  IF( n.EQ.1 ) THEN
216  IF( icompz.GT.0 )
217  $ z( 1, 1 ) = cone
218  RETURN
219  END IF
220  IF( icompz.EQ.2 )
221  $ CALL claset( 'Full', n, n, czero, cone, z, ldz )
222 *
223 * Call SPTTRF to factor the matrix.
224 *
225  CALL spttrf( n, d, e, info )
226  IF( info.NE.0 )
227  $ RETURN
228  DO 10 i = 1, n
229  d( i ) = sqrt( d( i ) )
230  10 CONTINUE
231  DO 20 i = 1, n - 1
232  e( i ) = e( i )*d( i )
233  20 CONTINUE
234 *
235 * Call CBDSQR to compute the singular values/vectors of the
236 * bidiagonal factor.
237 *
238  IF( icompz.GT.0 ) THEN
239  nru = n
240  ELSE
241  nru = 0
242  END IF
243  CALL cbdsqr( 'Lower', n, 0, nru, 0, d, e, vt, 1, z, ldz, c, 1,
244  $ work, info )
245 *
246 * Square the singular values.
247 *
248  IF( info.EQ.0 ) THEN
249  DO 30 i = 1, n
250  d( i ) = d( i )*d( i )
251  30 CONTINUE
252  ELSE
253  info = n + info
254  END IF
255 *
256  RETURN
257 *
258 * End of CPTEQR
259 *
260  END
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
subroutine spttrf(N, D, E, INFO)
SPTTRF
Definition: spttrf.f:91
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
Definition: claset.f:106
subroutine cbdsqr(UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, LDC, RWORK, INFO)
CBDSQR
Definition: cbdsqr.f:222
subroutine cpteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
CPTEQR
Definition: cpteqr.f:145