LAPACK  3.8.0
LAPACK: Linear Algebra PACKage
zheevx_2stage.f
Go to the documentation of this file.
1 *> \brief <b> ZHEEVX_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices</b>
2 *
3 * @precisions fortran z -> s d c
4 *
5 * =========== DOCUMENTATION ===========
6 *
7 * Online html documentation available at
8 * http://www.netlib.org/lapack/explore-html/
9 *
10 *> \htmlonly
11 *> Download ZHEEVX_2STAGE + dependencies
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zheevx_2stage.f">
13 *> [TGZ]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zheevx_2stage.f">
15 *> [ZIP]</a>
16 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zheevx_2stage.f">
17 *> [TXT]</a>
18 *> \endhtmlonly
19 *
20 * Definition:
21 * ===========
22 *
23 * SUBROUTINE ZHEEVX_2STAGE( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
24 * IL, IU, ABSTOL, M, W, Z, LDZ, WORK,
25 * LWORK, RWORK, IWORK, IFAIL, INFO )
26 *
27 * IMPLICIT NONE
28 *
29 * .. Scalar Arguments ..
30 * CHARACTER JOBZ, RANGE, UPLO
31 * INTEGER IL, INFO, IU, LDA, LDZ, LWORK, M, N
32 * DOUBLE PRECISION ABSTOL, VL, VU
33 * ..
34 * .. Array Arguments ..
35 * INTEGER IFAIL( * ), IWORK( * )
36 * DOUBLE PRECISION RWORK( * ), W( * )
37 * COMPLEX*16 A( LDA, * ), WORK( * ), Z( LDZ, * )
38 * ..
39 *
40 *
41 *> \par Purpose:
42 * =============
43 *>
44 *> \verbatim
45 *>
46 *> ZHEEVX_2STAGE computes selected eigenvalues and, optionally, eigenvectors
47 *> of a complex Hermitian matrix A using the 2stage technique for
48 *> the reduction to tridiagonal. Eigenvalues and eigenvectors can
49 *> be selected by specifying either a range of values or a range of
50 *> indices for the desired eigenvalues.
51 *> \endverbatim
52 *
53 * Arguments:
54 * ==========
55 *
56 *> \param[in] JOBZ
57 *> \verbatim
58 *> JOBZ is CHARACTER*1
59 *> = 'N': Compute eigenvalues only;
60 *> = 'V': Compute eigenvalues and eigenvectors.
61 *> Not available in this release.
62 *> \endverbatim
63 *>
64 *> \param[in] RANGE
65 *> \verbatim
66 *> RANGE is CHARACTER*1
67 *> = 'A': all eigenvalues will be found.
68 *> = 'V': all eigenvalues in the half-open interval (VL,VU]
69 *> will be found.
70 *> = 'I': the IL-th through IU-th eigenvalues will be found.
71 *> \endverbatim
72 *>
73 *> \param[in] UPLO
74 *> \verbatim
75 *> UPLO is CHARACTER*1
76 *> = 'U': Upper triangle of A is stored;
77 *> = 'L': Lower triangle of A is stored.
78 *> \endverbatim
79 *>
80 *> \param[in] N
81 *> \verbatim
82 *> N is INTEGER
83 *> The order of the matrix A. N >= 0.
84 *> \endverbatim
85 *>
86 *> \param[in,out] A
87 *> \verbatim
88 *> A is COMPLEX*16 array, dimension (LDA, N)
89 *> On entry, the Hermitian matrix A. If UPLO = 'U', the
90 *> leading N-by-N upper triangular part of A contains the
91 *> upper triangular part of the matrix A. If UPLO = 'L',
92 *> the leading N-by-N lower triangular part of A contains
93 *> the lower triangular part of the matrix A.
94 *> On exit, the lower triangle (if UPLO='L') or the upper
95 *> triangle (if UPLO='U') of A, including the diagonal, is
96 *> destroyed.
97 *> \endverbatim
98 *>
99 *> \param[in] LDA
100 *> \verbatim
101 *> LDA is INTEGER
102 *> The leading dimension of the array A. LDA >= max(1,N).
103 *> \endverbatim
104 *>
105 *> \param[in] VL
106 *> \verbatim
107 *> VL is DOUBLE PRECISION
108 *> If RANGE='V', the lower bound of the interval to
109 *> be searched for eigenvalues. VL < VU.
110 *> Not referenced if RANGE = 'A' or 'I'.
111 *> \endverbatim
112 *>
113 *> \param[in] VU
114 *> \verbatim
115 *> VU is DOUBLE PRECISION
116 *> If RANGE='V', the upper bound of the interval to
117 *> be searched for eigenvalues. VL < VU.
118 *> Not referenced if RANGE = 'A' or 'I'.
119 *> \endverbatim
120 *>
121 *> \param[in] IL
122 *> \verbatim
123 *> IL is INTEGER
124 *> If RANGE='I', the index of the
125 *> smallest eigenvalue to be returned.
126 *> 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0.
127 *> Not referenced if RANGE = 'A' or 'V'.
128 *> \endverbatim
129 *>
130 *> \param[in] IU
131 *> \verbatim
132 *> IU is INTEGER
133 *> If RANGE='I', the index of the
134 *> largest eigenvalue to be returned.
135 *> 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if N = 0.
136 *> Not referenced if RANGE = 'A' or 'V'.
137 *> \endverbatim
138 *>
139 *> \param[in] ABSTOL
140 *> \verbatim
141 *> ABSTOL is DOUBLE PRECISION
142 *> The absolute error tolerance for the eigenvalues.
143 *> An approximate eigenvalue is accepted as converged
144 *> when it is determined to lie in an interval [a,b]
145 *> of width less than or equal to
146 *>
147 *> ABSTOL + EPS * max( |a|,|b| ) ,
148 *>
149 *> where EPS is the machine precision. If ABSTOL is less than
150 *> or equal to zero, then EPS*|T| will be used in its place,
151 *> where |T| is the 1-norm of the tridiagonal matrix obtained
152 *> by reducing A to tridiagonal form.
153 *>
154 *> Eigenvalues will be computed most accurately when ABSTOL is
155 *> set to twice the underflow threshold 2*DLAMCH('S'), not zero.
156 *> If this routine returns with INFO>0, indicating that some
157 *> eigenvectors did not converge, try setting ABSTOL to
158 *> 2*DLAMCH('S').
159 *>
160 *> See "Computing Small Singular Values of Bidiagonal Matrices
161 *> with Guaranteed High Relative Accuracy," by Demmel and
162 *> Kahan, LAPACK Working Note #3.
163 *> \endverbatim
164 *>
165 *> \param[out] M
166 *> \verbatim
167 *> M is INTEGER
168 *> The total number of eigenvalues found. 0 <= M <= N.
169 *> If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1.
170 *> \endverbatim
171 *>
172 *> \param[out] W
173 *> \verbatim
174 *> W is DOUBLE PRECISION array, dimension (N)
175 *> On normal exit, the first M elements contain the selected
176 *> eigenvalues in ascending order.
177 *> \endverbatim
178 *>
179 *> \param[out] Z
180 *> \verbatim
181 *> Z is COMPLEX*16 array, dimension (LDZ, max(1,M))
182 *> If JOBZ = 'V', then if INFO = 0, the first M columns of Z
183 *> contain the orthonormal eigenvectors of the matrix A
184 *> corresponding to the selected eigenvalues, with the i-th
185 *> column of Z holding the eigenvector associated with W(i).
186 *> If an eigenvector fails to converge, then that column of Z
187 *> contains the latest approximation to the eigenvector, and the
188 *> index of the eigenvector is returned in IFAIL.
189 *> If JOBZ = 'N', then Z is not referenced.
190 *> Note: the user must ensure that at least max(1,M) columns are
191 *> supplied in the array Z; if RANGE = 'V', the exact value of M
192 *> is not known in advance and an upper bound must be used.
193 *> \endverbatim
194 *>
195 *> \param[in] LDZ
196 *> \verbatim
197 *> LDZ is INTEGER
198 *> The leading dimension of the array Z. LDZ >= 1, and if
199 *> JOBZ = 'V', LDZ >= max(1,N).
200 *> \endverbatim
201 *>
202 *> \param[out] WORK
203 *> \verbatim
204 *> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK))
205 *> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
206 *> \endverbatim
207 *>
208 *> \param[in] LWORK
209 *> \verbatim
210 *> LWORK is INTEGER
211 *> The length of the array WORK. LWORK >= 1, when N <= 1;
212 *> otherwise
213 *> If JOBZ = 'N' and N > 1, LWORK must be queried.
214 *> LWORK = MAX(1, 8*N, dimension) where
215 *> dimension = max(stage1,stage2) + (KD+1)*N + N
216 *> = N*KD + N*max(KD+1,FACTOPTNB)
217 *> + max(2*KD*KD, KD*NTHREADS)
218 *> + (KD+1)*N + N
219 *> where KD is the blocking size of the reduction,
220 *> FACTOPTNB is the blocking used by the QR or LQ
221 *> algorithm, usually FACTOPTNB=128 is a good choice
222 *> NTHREADS is the number of threads used when
223 *> openMP compilation is enabled, otherwise =1.
224 *> If JOBZ = 'V' and N > 1, LWORK must be queried. Not yet available
225 *>
226 *> If LWORK = -1, then a workspace query is assumed; the routine
227 *> only calculates the optimal size of the WORK array, returns
228 *> this value as the first entry of the WORK array, and no error
229 *> message related to LWORK is issued by XERBLA.
230 *> \endverbatim
231 *>
232 *> \param[out] RWORK
233 *> \verbatim
234 *> RWORK is DOUBLE PRECISION array, dimension (7*N)
235 *> \endverbatim
236 *>
237 *> \param[out] IWORK
238 *> \verbatim
239 *> IWORK is INTEGER array, dimension (5*N)
240 *> \endverbatim
241 *>
242 *> \param[out] IFAIL
243 *> \verbatim
244 *> IFAIL is INTEGER array, dimension (N)
245 *> If JOBZ = 'V', then if INFO = 0, the first M elements of
246 *> IFAIL are zero. If INFO > 0, then IFAIL contains the
247 *> indices of the eigenvectors that failed to converge.
248 *> If JOBZ = 'N', then IFAIL is not referenced.
249 *> \endverbatim
250 *>
251 *> \param[out] INFO
252 *> \verbatim
253 *> INFO is INTEGER
254 *> = 0: successful exit
255 *> < 0: if INFO = -i, the i-th argument had an illegal value
256 *> > 0: if INFO = i, then i eigenvectors failed to converge.
257 *> Their indices are stored in array IFAIL.
258 *> \endverbatim
259 *
260 * Authors:
261 * ========
262 *
263 *> \author Univ. of Tennessee
264 *> \author Univ. of California Berkeley
265 *> \author Univ. of Colorado Denver
266 *> \author NAG Ltd.
267 *
268 *> \date June 2016
269 *
270 *> \ingroup complex16HEeigen
271 *
272 *> \par Further Details:
273 * =====================
274 *>
275 *> \verbatim
276 *>
277 *> All details about the 2stage techniques are available in:
278 *>
279 *> Azzam Haidar, Hatem Ltaief, and Jack Dongarra.
280 *> Parallel reduction to condensed forms for symmetric eigenvalue problems
281 *> using aggregated fine-grained and memory-aware kernels. In Proceedings
282 *> of 2011 International Conference for High Performance Computing,
283 *> Networking, Storage and Analysis (SC '11), New York, NY, USA,
284 *> Article 8 , 11 pages.
285 *> http://doi.acm.org/10.1145/2063384.2063394
286 *>
287 *> A. Haidar, J. Kurzak, P. Luszczek, 2013.
288 *> An improved parallel singular value algorithm and its implementation
289 *> for multicore hardware, In Proceedings of 2013 International Conference
290 *> for High Performance Computing, Networking, Storage and Analysis (SC '13).
291 *> Denver, Colorado, USA, 2013.
292 *> Article 90, 12 pages.
293 *> http://doi.acm.org/10.1145/2503210.2503292
294 *>
295 *> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra.
296 *> A novel hybrid CPU-GPU generalized eigensolver for electronic structure
297 *> calculations based on fine-grained memory aware tasks.
298 *> International Journal of High Performance Computing Applications.
299 *> Volume 28 Issue 2, Pages 196-209, May 2014.
300 *> http://hpc.sagepub.com/content/28/2/196
301 *>
302 *> \endverbatim
303 *
304 * =====================================================================
305  SUBROUTINE zheevx_2stage( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
306  $ IL, IU, ABSTOL, M, W, Z, LDZ, WORK,
307  $ LWORK, RWORK, IWORK, IFAIL, INFO )
308 *
309  IMPLICIT NONE
310 *
311 * -- LAPACK driver routine (version 3.8.0) --
312 * -- LAPACK is a software package provided by Univ. of Tennessee, --
313 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
314 * June 2016
315 *
316 * .. Scalar Arguments ..
317  CHARACTER JOBZ, RANGE, UPLO
318  INTEGER IL, INFO, IU, LDA, LDZ, LWORK, M, N
319  DOUBLE PRECISION ABSTOL, VL, VU
320 * ..
321 * .. Array Arguments ..
322  INTEGER IFAIL( * ), IWORK( * )
323  DOUBLE PRECISION RWORK( * ), W( * )
324  COMPLEX*16 A( lda, * ), WORK( * ), Z( ldz, * )
325 * ..
326 *
327 * =====================================================================
328 *
329 * .. Parameters ..
330  DOUBLE PRECISION ZERO, ONE
331  parameter( zero = 0.0d+0, one = 1.0d+0 )
332  COMPLEX*16 CONE
333  parameter( cone = ( 1.0d+0, 0.0d+0 ) )
334 * ..
335 * .. Local Scalars ..
336  LOGICAL ALLEIG, INDEIG, LOWER, LQUERY, TEST, VALEIG,
337  $ wantz
338  CHARACTER ORDER
339  INTEGER I, IINFO, IMAX, INDD, INDE, INDEE, INDIBL,
340  $ indisp, indiwk, indrwk, indtau, indwrk, iscale,
341  $ itmp1, j, jj, llwork,
342  $ nsplit, lwmin, lhtrd, lwtrd, kd, ib, indhous
343  DOUBLE PRECISION ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
344  $ sigma, smlnum, tmp1, vll, vuu
345 * ..
346 * .. External Functions ..
347  LOGICAL LSAME
348  INTEGER ILAENV2STAGE
349  DOUBLE PRECISION DLAMCH, ZLANHE
350  EXTERNAL lsame, dlamch, zlanhe, ilaenv2stage
351 * ..
352 * .. External Subroutines ..
353  EXTERNAL dcopy, dscal, dstebz, dsterf, xerbla, zdscal,
355  $ zhetrd_2stage
356 * ..
357 * .. Intrinsic Functions ..
358  INTRINSIC dble, max, min, sqrt
359 * ..
360 * .. Executable Statements ..
361 *
362 * Test the input parameters.
363 *
364  lower = lsame( uplo, 'L' )
365  wantz = lsame( jobz, 'V' )
366  alleig = lsame( range, 'A' )
367  valeig = lsame( range, 'V' )
368  indeig = lsame( range, 'I' )
369  lquery = ( lwork.EQ.-1 )
370 *
371  info = 0
372  IF( .NOT.( lsame( jobz, 'N' ) ) ) THEN
373  info = -1
374  ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) ) THEN
375  info = -2
376  ELSE IF( .NOT.( lower .OR. lsame( uplo, 'U' ) ) ) THEN
377  info = -3
378  ELSE IF( n.LT.0 ) THEN
379  info = -4
380  ELSE IF( lda.LT.max( 1, n ) ) THEN
381  info = -6
382  ELSE
383  IF( valeig ) THEN
384  IF( n.GT.0 .AND. vu.LE.vl )
385  $ info = -8
386  ELSE IF( indeig ) THEN
387  IF( il.LT.1 .OR. il.GT.max( 1, n ) ) THEN
388  info = -9
389  ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n ) THEN
390  info = -10
391  END IF
392  END IF
393  END IF
394  IF( info.EQ.0 ) THEN
395  IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) ) THEN
396  info = -15
397  END IF
398  END IF
399 *
400  IF( info.EQ.0 ) THEN
401  IF( n.LE.1 ) THEN
402  lwmin = 1
403  work( 1 ) = lwmin
404  ELSE
405  kd = ilaenv2stage( 1, 'ZHETRD_2STAGE', jobz,
406  $ n, -1, -1, -1 )
407  ib = ilaenv2stage( 2, 'ZHETRD_2STAGE', jobz,
408  $ n, kd, -1, -1 )
409  lhtrd = ilaenv2stage( 3, 'ZHETRD_2STAGE', jobz,
410  $ n, kd, ib, -1 )
411  lwtrd = ilaenv2stage( 4, 'ZHETRD_2STAGE', jobz,
412  $ n, kd, ib, -1 )
413  lwmin = n + lhtrd + lwtrd
414  work( 1 ) = lwmin
415  END IF
416 *
417  IF( lwork.LT.lwmin .AND. .NOT.lquery )
418  $ info = -17
419  END IF
420 *
421  IF( info.NE.0 ) THEN
422  CALL xerbla( 'ZHEEVX_2STAGE', -info )
423  RETURN
424  ELSE IF( lquery ) THEN
425  RETURN
426  END IF
427 *
428 * Quick return if possible
429 *
430  m = 0
431  IF( n.EQ.0 ) THEN
432  RETURN
433  END IF
434 *
435  IF( n.EQ.1 ) THEN
436  IF( alleig .OR. indeig ) THEN
437  m = 1
438  w( 1 ) = dble( a( 1, 1 ) )
439  ELSE IF( valeig ) THEN
440  IF( vl.LT.dble( a( 1, 1 ) ) .AND. vu.GE.dble( a( 1, 1 ) ) )
441  $ THEN
442  m = 1
443  w( 1 ) = dble( a( 1, 1 ) )
444  END IF
445  END IF
446  IF( wantz )
447  $ z( 1, 1 ) = cone
448  RETURN
449  END IF
450 *
451 * Get machine constants.
452 *
453  safmin = dlamch( 'Safe minimum' )
454  eps = dlamch( 'Precision' )
455  smlnum = safmin / eps
456  bignum = one / smlnum
457  rmin = sqrt( smlnum )
458  rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
459 *
460 * Scale matrix to allowable range, if necessary.
461 *
462  iscale = 0
463  abstll = abstol
464  IF( valeig ) THEN
465  vll = vl
466  vuu = vu
467  END IF
468  anrm = zlanhe( 'M', uplo, n, a, lda, rwork )
469  IF( anrm.GT.zero .AND. anrm.LT.rmin ) THEN
470  iscale = 1
471  sigma = rmin / anrm
472  ELSE IF( anrm.GT.rmax ) THEN
473  iscale = 1
474  sigma = rmax / anrm
475  END IF
476  IF( iscale.EQ.1 ) THEN
477  IF( lower ) THEN
478  DO 10 j = 1, n
479  CALL zdscal( n-j+1, sigma, a( j, j ), 1 )
480  10 CONTINUE
481  ELSE
482  DO 20 j = 1, n
483  CALL zdscal( j, sigma, a( 1, j ), 1 )
484  20 CONTINUE
485  END IF
486  IF( abstol.GT.0 )
487  $ abstll = abstol*sigma
488  IF( valeig ) THEN
489  vll = vl*sigma
490  vuu = vu*sigma
491  END IF
492  END IF
493 *
494 * Call ZHETRD_2STAGE to reduce Hermitian matrix to tridiagonal form.
495 *
496  indd = 1
497  inde = indd + n
498  indrwk = inde + n
499  indtau = 1
500  indhous = indtau + n
501  indwrk = indhous + lhtrd
502  llwork = lwork - indwrk + 1
503 *
504  CALL zhetrd_2stage( jobz, uplo, n, a, lda, rwork( indd ),
505  $ rwork( inde ), work( indtau ),
506  $ work( indhous ), lhtrd, work( indwrk ),
507  $ llwork, iinfo )
508 *
509 * If all eigenvalues are desired and ABSTOL is less than or equal to
510 * zero, then call DSTERF or ZUNGTR and ZSTEQR. If this fails for
511 * some eigenvalue, then try DSTEBZ.
512 *
513  test = .false.
514  IF( indeig ) THEN
515  IF( il.EQ.1 .AND. iu.EQ.n ) THEN
516  test = .true.
517  END IF
518  END IF
519  IF( ( alleig .OR. test ) .AND. ( abstol.LE.zero ) ) THEN
520  CALL dcopy( n, rwork( indd ), 1, w, 1 )
521  indee = indrwk + 2*n
522  IF( .NOT.wantz ) THEN
523  CALL dcopy( n-1, rwork( inde ), 1, rwork( indee ), 1 )
524  CALL dsterf( n, w, rwork( indee ), info )
525  ELSE
526  CALL zlacpy( 'A', n, n, a, lda, z, ldz )
527  CALL zungtr( uplo, n, z, ldz, work( indtau ),
528  $ work( indwrk ), llwork, iinfo )
529  CALL dcopy( n-1, rwork( inde ), 1, rwork( indee ), 1 )
530  CALL zsteqr( jobz, n, w, rwork( indee ), z, ldz,
531  $ rwork( indrwk ), info )
532  IF( info.EQ.0 ) THEN
533  DO 30 i = 1, n
534  ifail( i ) = 0
535  30 CONTINUE
536  END IF
537  END IF
538  IF( info.EQ.0 ) THEN
539  m = n
540  GO TO 40
541  END IF
542  info = 0
543  END IF
544 *
545 * Otherwise, call DSTEBZ and, if eigenvectors are desired, ZSTEIN.
546 *
547  IF( wantz ) THEN
548  order = 'B'
549  ELSE
550  order = 'E'
551  END IF
552  indibl = 1
553  indisp = indibl + n
554  indiwk = indisp + n
555  CALL dstebz( range, order, n, vll, vuu, il, iu, abstll,
556  $ rwork( indd ), rwork( inde ), m, nsplit, w,
557  $ iwork( indibl ), iwork( indisp ), rwork( indrwk ),
558  $ iwork( indiwk ), info )
559 *
560  IF( wantz ) THEN
561  CALL zstein( n, rwork( indd ), rwork( inde ), m, w,
562  $ iwork( indibl ), iwork( indisp ), z, ldz,
563  $ rwork( indrwk ), iwork( indiwk ), ifail, info )
564 *
565 * Apply unitary matrix used in reduction to tridiagonal
566 * form to eigenvectors returned by ZSTEIN.
567 *
568  CALL zunmtr( 'L', uplo, 'N', n, m, a, lda, work( indtau ), z,
569  $ ldz, work( indwrk ), llwork, iinfo )
570  END IF
571 *
572 * If matrix was scaled, then rescale eigenvalues appropriately.
573 *
574  40 CONTINUE
575  IF( iscale.EQ.1 ) THEN
576  IF( info.EQ.0 ) THEN
577  imax = m
578  ELSE
579  imax = info - 1
580  END IF
581  CALL dscal( imax, one / sigma, w, 1 )
582  END IF
583 *
584 * If eigenvalues are not in order, then sort them, along with
585 * eigenvectors.
586 *
587  IF( wantz ) THEN
588  DO 60 j = 1, m - 1
589  i = 0
590  tmp1 = w( j )
591  DO 50 jj = j + 1, m
592  IF( w( jj ).LT.tmp1 ) THEN
593  i = jj
594  tmp1 = w( jj )
595  END IF
596  50 CONTINUE
597 *
598  IF( i.NE.0 ) THEN
599  itmp1 = iwork( indibl+i-1 )
600  w( i ) = w( j )
601  iwork( indibl+i-1 ) = iwork( indibl+j-1 )
602  w( j ) = tmp1
603  iwork( indibl+j-1 ) = itmp1
604  CALL zswap( n, z( 1, i ), 1, z( 1, j ), 1 )
605  IF( info.NE.0 ) THEN
606  itmp1 = ifail( i )
607  ifail( i ) = ifail( j )
608  ifail( j ) = itmp1
609  END IF
610  END IF
611  60 CONTINUE
612  END IF
613 *
614 * Set WORK(1) to optimal complex workspace size.
615 *
616  work( 1 ) = lwmin
617 *
618  RETURN
619 *
620 * End of ZHEEVX_2STAGE
621 *
622  END
subroutine zheevx_2stage(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, RWORK, IWORK, IFAIL, INFO)
ZHEEVX_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE ma...
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
Definition: dcopy.f:84
subroutine zungtr(UPLO, N, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGTR
Definition: zungtr.f:125
subroutine zswap(N, ZX, INCX, ZY, INCY)
ZSWAP
Definition: zswap.f:83
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
Definition: zlacpy.f:105
subroutine dsterf(N, D, E, INFO)
DSTERF
Definition: dsterf.f:88
subroutine zsteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
ZSTEQR
Definition: zsteqr.f:134
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
subroutine dscal(N, DA, DX, INCX)
DSCAL
Definition: dscal.f:81
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
Definition: zdscal.f:80
subroutine dstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
DSTEBZ
Definition: dstebz.f:275
subroutine zstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
ZSTEIN
Definition: zstein.f:184
subroutine zunmtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
ZUNMTR
Definition: zunmtr.f:173
subroutine zhetrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
ZHETRD_2STAGE