You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

chseqr.f 18 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. *> \brief \b CHSEQR
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download CHSEQR + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/chseqr.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/chseqr.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/chseqr.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * SUBROUTINE CHSEQR( JOB, COMPZ, N, ILO, IHI, H, LDH, W, Z, LDZ,
  22. * WORK, LWORK, INFO )
  23. *
  24. * .. Scalar Arguments ..
  25. * INTEGER IHI, ILO, INFO, LDH, LDZ, LWORK, N
  26. * CHARACTER COMPZ, JOB
  27. * ..
  28. * .. Array Arguments ..
  29. * COMPLEX H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
  30. * ..
  31. *
  32. *
  33. *> \par Purpose:
  34. * =============
  35. *>
  36. *> \verbatim
  37. *>
  38. *> CHSEQR computes the eigenvalues of a Hessenberg matrix H
  39. *> and, optionally, the matrices T and Z from the Schur decomposition
  40. *> H = Z T Z**H, where T is an upper triangular matrix (the
  41. *> Schur form), and Z is the unitary matrix of Schur vectors.
  42. *>
  43. *> Optionally Z may be postmultiplied into an input unitary
  44. *> matrix Q so that this routine can give the Schur factorization
  45. *> of a matrix A which has been reduced to the Hessenberg form H
  46. *> by the unitary matrix Q: A = Q*H*Q**H = (QZ)*T*(QZ)**H.
  47. *> \endverbatim
  48. *
  49. * Arguments:
  50. * ==========
  51. *
  52. *> \param[in] JOB
  53. *> \verbatim
  54. *> JOB is CHARACTER*1
  55. *> = 'E': compute eigenvalues only;
  56. *> = 'S': compute eigenvalues and the Schur form T.
  57. *> \endverbatim
  58. *>
  59. *> \param[in] COMPZ
  60. *> \verbatim
  61. *> COMPZ is CHARACTER*1
  62. *> = 'N': no Schur vectors are computed;
  63. *> = 'I': Z is initialized to the unit matrix and the matrix Z
  64. *> of Schur vectors of H is returned;
  65. *> = 'V': Z must contain an unitary matrix Q on entry, and
  66. *> the product Q*Z is returned.
  67. *> \endverbatim
  68. *>
  69. *> \param[in] N
  70. *> \verbatim
  71. *> N is INTEGER
  72. *> The order of the matrix H. N >= 0.
  73. *> \endverbatim
  74. *>
  75. *> \param[in] ILO
  76. *> \verbatim
  77. *> ILO is INTEGER
  78. *> \endverbatim
  79. *>
  80. *> \param[in] IHI
  81. *> \verbatim
  82. *> IHI is INTEGER
  83. *>
  84. *> It is assumed that H is already upper triangular in rows
  85. *> and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
  86. *> set by a previous call to CGEBAL, and then passed to ZGEHRD
  87. *> when the matrix output by CGEBAL is reduced to Hessenberg
  88. *> form. Otherwise ILO and IHI should be set to 1 and N
  89. *> respectively. If N > 0, then 1 <= ILO <= IHI <= N.
  90. *> If N = 0, then ILO = 1 and IHI = 0.
  91. *> \endverbatim
  92. *>
  93. *> \param[in,out] H
  94. *> \verbatim
  95. *> H is COMPLEX array, dimension (LDH,N)
  96. *> On entry, the upper Hessenberg matrix H.
  97. *> On exit, if INFO = 0 and JOB = 'S', H contains the upper
  98. *> triangular matrix T from the Schur decomposition (the
  99. *> Schur form). If INFO = 0 and JOB = 'E', the contents of
  100. *> H are unspecified on exit. (The output value of H when
  101. *> INFO > 0 is given under the description of INFO below.)
  102. *>
  103. *> Unlike earlier versions of CHSEQR, this subroutine may
  104. *> explicitly H(i,j) = 0 for i > j and j = 1, 2, ... ILO-1
  105. *> or j = IHI+1, IHI+2, ... N.
  106. *> \endverbatim
  107. *>
  108. *> \param[in] LDH
  109. *> \verbatim
  110. *> LDH is INTEGER
  111. *> The leading dimension of the array H. LDH >= max(1,N).
  112. *> \endverbatim
  113. *>
  114. *> \param[out] W
  115. *> \verbatim
  116. *> W is COMPLEX array, dimension (N)
  117. *> The computed eigenvalues. If JOB = 'S', the eigenvalues are
  118. *> stored in the same order as on the diagonal of the Schur
  119. *> form returned in H, with W(i) = H(i,i).
  120. *> \endverbatim
  121. *>
  122. *> \param[in,out] Z
  123. *> \verbatim
  124. *> Z is COMPLEX array, dimension (LDZ,N)
  125. *> If COMPZ = 'N', Z is not referenced.
  126. *> If COMPZ = 'I', on entry Z need not be set and on exit,
  127. *> if INFO = 0, Z contains the unitary matrix Z of the Schur
  128. *> vectors of H. If COMPZ = 'V', on entry Z must contain an
  129. *> N-by-N matrix Q, which is assumed to be equal to the unit
  130. *> matrix except for the submatrix Z(ILO:IHI,ILO:IHI). On exit,
  131. *> if INFO = 0, Z contains Q*Z.
  132. *> Normally Q is the unitary matrix generated by CUNGHR
  133. *> after the call to CGEHRD which formed the Hessenberg matrix
  134. *> H. (The output value of Z when INFO > 0 is given under
  135. *> the description of INFO below.)
  136. *> \endverbatim
  137. *>
  138. *> \param[in] LDZ
  139. *> \verbatim
  140. *> LDZ is INTEGER
  141. *> The leading dimension of the array Z. if COMPZ = 'I' or
  142. *> COMPZ = 'V', then LDZ >= MAX(1,N). Otherwise, LDZ >= 1.
  143. *> \endverbatim
  144. *>
  145. *> \param[out] WORK
  146. *> \verbatim
  147. *> WORK is COMPLEX array, dimension (LWORK)
  148. *> On exit, if INFO = 0, WORK(1) returns an estimate of
  149. *> the optimal value for LWORK.
  150. *> \endverbatim
  151. *>
  152. *> \param[in] LWORK
  153. *> \verbatim
  154. *> LWORK is INTEGER
  155. *> The dimension of the array WORK. LWORK >= max(1,N)
  156. *> is sufficient and delivers very good and sometimes
  157. *> optimal performance. However, LWORK as large as 11*N
  158. *> may be required for optimal performance. A workspace
  159. *> query is recommended to determine the optimal workspace
  160. *> size.
  161. *>
  162. *> If LWORK = -1, then CHSEQR does a workspace query.
  163. *> In this case, CHSEQR checks the input parameters and
  164. *> estimates the optimal workspace size for the given
  165. *> values of N, ILO and IHI. The estimate is returned
  166. *> in WORK(1). No error message related to LWORK is
  167. *> issued by XERBLA. Neither H nor Z are accessed.
  168. *> \endverbatim
  169. *>
  170. *> \param[out] INFO
  171. *> \verbatim
  172. *> INFO is INTEGER
  173. *> = 0: successful exit
  174. *> < 0: if INFO = -i, the i-th argument had an illegal
  175. *> value
  176. *> > 0: if INFO = i, CHSEQR failed to compute all of
  177. *> the eigenvalues. Elements 1:ilo-1 and i+1:n of W
  178. *> contain those eigenvalues which have been
  179. *> successfully computed. (Failures are rare.)
  180. *>
  181. *> If INFO > 0 and JOB = 'E', then on exit, the
  182. *> remaining unconverged eigenvalues are the eigen-
  183. *> values of the upper Hessenberg matrix rows and
  184. *> columns ILO through INFO of the final, output
  185. *> value of H.
  186. *>
  187. *> If INFO > 0 and JOB = 'S', then on exit
  188. *>
  189. *> (*) (initial value of H)*U = U*(final value of H)
  190. *>
  191. *> where U is a unitary matrix. The final
  192. *> value of H is upper Hessenberg and triangular in
  193. *> rows and columns INFO+1 through IHI.
  194. *>
  195. *> If INFO > 0 and COMPZ = 'V', then on exit
  196. *>
  197. *> (final value of Z) = (initial value of Z)*U
  198. *>
  199. *> where U is the unitary matrix in (*) (regard-
  200. *> less of the value of JOB.)
  201. *>
  202. *> If INFO > 0 and COMPZ = 'I', then on exit
  203. *> (final value of Z) = U
  204. *> where U is the unitary matrix in (*) (regard-
  205. *> less of the value of JOB.)
  206. *>
  207. *> If INFO > 0 and COMPZ = 'N', then Z is not
  208. *> accessed.
  209. *> \endverbatim
  210. *
  211. * Authors:
  212. * ========
  213. *
  214. *> \author Univ. of Tennessee
  215. *> \author Univ. of California Berkeley
  216. *> \author Univ. of Colorado Denver
  217. *> \author NAG Ltd.
  218. *
  219. *> \ingroup hseqr
  220. *
  221. *> \par Contributors:
  222. * ==================
  223. *>
  224. *> Karen Braman and Ralph Byers, Department of Mathematics,
  225. *> University of Kansas, USA
  226. *
  227. *> \par Further Details:
  228. * =====================
  229. *>
  230. *> \verbatim
  231. *>
  232. *> Default values supplied by
  233. *> ILAENV(ISPEC,'CHSEQR',JOB(:1)//COMPZ(:1),N,ILO,IHI,LWORK).
  234. *> It is suggested that these defaults be adjusted in order
  235. *> to attain best performance in each particular
  236. *> computational environment.
  237. *>
  238. *> ISPEC=12: The CLAHQR vs CLAQR0 crossover point.
  239. *> Default: 75. (Must be at least 11.)
  240. *>
  241. *> ISPEC=13: Recommended deflation window size.
  242. *> This depends on ILO, IHI and NS. NS is the
  243. *> number of simultaneous shifts returned
  244. *> by ILAENV(ISPEC=15). (See ISPEC=15 below.)
  245. *> The default for (IHI-ILO+1) <= 500 is NS.
  246. *> The default for (IHI-ILO+1) > 500 is 3*NS/2.
  247. *>
  248. *> ISPEC=14: Nibble crossover point. (See IPARMQ for
  249. *> details.) Default: 14% of deflation window
  250. *> size.
  251. *>
  252. *> ISPEC=15: Number of simultaneous shifts in a multishift
  253. *> QR iteration.
  254. *>
  255. *> If IHI-ILO+1 is ...
  256. *>
  257. *> greater than ...but less ... the
  258. *> or equal to ... than default is
  259. *>
  260. *> 1 30 NS = 2(+)
  261. *> 30 60 NS = 4(+)
  262. *> 60 150 NS = 10(+)
  263. *> 150 590 NS = **
  264. *> 590 3000 NS = 64
  265. *> 3000 6000 NS = 128
  266. *> 6000 infinity NS = 256
  267. *>
  268. *> (+) By default some or all matrices of this order
  269. *> are passed to the implicit double shift routine
  270. *> CLAHQR and this parameter is ignored. See
  271. *> ISPEC=12 above and comments in IPARMQ for
  272. *> details.
  273. *>
  274. *> (**) The asterisks (**) indicate an ad-hoc
  275. *> function of N increasing from 10 to 64.
  276. *>
  277. *> ISPEC=16: Select structured matrix multiply.
  278. *> If the number of simultaneous shifts (specified
  279. *> by ISPEC=15) is less than 14, then the default
  280. *> for ISPEC=16 is 0. Otherwise the default for
  281. *> ISPEC=16 is 2.
  282. *> \endverbatim
  283. *
  284. *> \par References:
  285. * ================
  286. *>
  287. *> K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
  288. *> Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
  289. *> Performance, SIAM Journal of Matrix Analysis, volume 23, pages
  290. *> 929--947, 2002.
  291. *> \n
  292. *> K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
  293. *> Algorithm Part II: Aggressive Early Deflation, SIAM Journal
  294. *> of Matrix Analysis, volume 23, pages 948--973, 2002.
  295. *
  296. * =====================================================================
  297. SUBROUTINE CHSEQR( JOB, COMPZ, N, ILO, IHI, H, LDH, W, Z, LDZ,
  298. $ WORK, LWORK, INFO )
  299. *
  300. * -- LAPACK computational routine --
  301. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  302. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  303. *
  304. * .. Scalar Arguments ..
  305. INTEGER IHI, ILO, INFO, LDH, LDZ, LWORK, N
  306. CHARACTER COMPZ, JOB
  307. * ..
  308. * .. Array Arguments ..
  309. COMPLEX H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
  310. * ..
  311. *
  312. * =====================================================================
  313. *
  314. * .. Parameters ..
  315. *
  316. * ==== Matrices of order NTINY or smaller must be processed by
  317. * . CLAHQR because of insufficient subdiagonal scratch space.
  318. * . (This is a hard limit.) ====
  319. INTEGER NTINY
  320. PARAMETER ( NTINY = 15 )
  321. *
  322. * ==== NL allocates some local workspace to help small matrices
  323. * . through a rare CLAHQR failure. NL > NTINY = 15 is
  324. * . required and NL <= NMIN = ILAENV(ISPEC=12,...) is recom-
  325. * . mended. (The default value of NMIN is 75.) Using NL = 49
  326. * . allows up to six simultaneous shifts and a 16-by-16
  327. * . deflation window. ====
  328. INTEGER NL
  329. PARAMETER ( NL = 49 )
  330. COMPLEX ZERO, ONE
  331. PARAMETER ( ZERO = ( 0.0e0, 0.0e0 ),
  332. $ ONE = ( 1.0e0, 0.0e0 ) )
  333. REAL RZERO
  334. PARAMETER ( RZERO = 0.0e0 )
  335. * ..
  336. * .. Local Arrays ..
  337. COMPLEX HL( NL, NL ), WORKL( NL )
  338. * ..
  339. * .. Local Scalars ..
  340. INTEGER KBOT, NMIN
  341. LOGICAL INITZ, LQUERY, WANTT, WANTZ
  342. * ..
  343. * .. External Functions ..
  344. INTEGER ILAENV
  345. LOGICAL LSAME
  346. REAL SROUNDUP_LWORK
  347. EXTERNAL ILAENV, LSAME, SROUNDUP_LWORK
  348. * ..
  349. * .. External Subroutines ..
  350. EXTERNAL CCOPY, CLACPY, CLAHQR, CLAQR0, CLASET, XERBLA
  351. * ..
  352. * .. Intrinsic Functions ..
  353. INTRINSIC CMPLX, MAX, MIN, REAL
  354. * ..
  355. * .. Executable Statements ..
  356. *
  357. * ==== Decode and check the input parameters. ====
  358. *
  359. WANTT = LSAME( JOB, 'S' )
  360. INITZ = LSAME( COMPZ, 'I' )
  361. WANTZ = INITZ .OR. LSAME( COMPZ, 'V' )
  362. WORK( 1 ) = CMPLX( REAL( MAX( 1, N ) ), RZERO )
  363. LQUERY = LWORK.EQ.-1
  364. *
  365. INFO = 0
  366. IF( .NOT.LSAME( JOB, 'E' ) .AND. .NOT.WANTT ) THEN
  367. INFO = -1
  368. ELSE IF( .NOT.LSAME( COMPZ, 'N' ) .AND. .NOT.WANTZ ) THEN
  369. INFO = -2
  370. ELSE IF( N.LT.0 ) THEN
  371. INFO = -3
  372. ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
  373. INFO = -4
  374. ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
  375. INFO = -5
  376. ELSE IF( LDH.LT.MAX( 1, N ) ) THEN
  377. INFO = -7
  378. ELSE IF( LDZ.LT.1 .OR. ( WANTZ .AND. LDZ.LT.MAX( 1, N ) ) ) THEN
  379. INFO = -10
  380. ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
  381. INFO = -12
  382. END IF
  383. *
  384. IF( INFO.NE.0 ) THEN
  385. *
  386. * ==== Quick return in case of invalid argument. ====
  387. *
  388. CALL XERBLA( 'CHSEQR', -INFO )
  389. RETURN
  390. *
  391. ELSE IF( N.EQ.0 ) THEN
  392. *
  393. * ==== Quick return in case N = 0; nothing to do. ====
  394. *
  395. RETURN
  396. *
  397. ELSE IF( LQUERY ) THEN
  398. *
  399. * ==== Quick return in case of a workspace query ====
  400. *
  401. CALL CLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI, Z,
  402. $ LDZ, WORK, LWORK, INFO )
  403. * ==== Ensure reported workspace size is backward-compatible with
  404. * . previous LAPACK versions. ====
  405. WORK( 1 ) = CMPLX( MAX( REAL( WORK( 1 ) ), REAL( MAX( 1,
  406. $ N ) ) ), RZERO )
  407. RETURN
  408. *
  409. ELSE
  410. *
  411. * ==== copy eigenvalues isolated by CGEBAL ====
  412. *
  413. IF( ILO.GT.1 )
  414. $ CALL CCOPY( ILO-1, H, LDH+1, W, 1 )
  415. IF( IHI.LT.N )
  416. $ CALL CCOPY( N-IHI, H( IHI+1, IHI+1 ), LDH+1, W( IHI+1 ), 1 )
  417. *
  418. * ==== Initialize Z, if requested ====
  419. *
  420. IF( INITZ )
  421. $ CALL CLASET( 'A', N, N, ZERO, ONE, Z, LDZ )
  422. *
  423. * ==== Quick return if possible ====
  424. *
  425. IF( ILO.EQ.IHI ) THEN
  426. W( ILO ) = H( ILO, ILO )
  427. RETURN
  428. END IF
  429. *
  430. * ==== CLAHQR/CLAQR0 crossover point ====
  431. *
  432. NMIN = ILAENV( 12, 'CHSEQR', JOB( : 1 ) // COMPZ( : 1 ), N,
  433. $ ILO, IHI, LWORK )
  434. NMIN = MAX( NTINY, NMIN )
  435. *
  436. * ==== CLAQR0 for big matrices; CLAHQR for small ones ====
  437. *
  438. IF( N.GT.NMIN ) THEN
  439. CALL CLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI,
  440. $ Z, LDZ, WORK, LWORK, INFO )
  441. ELSE
  442. *
  443. * ==== Small matrix ====
  444. *
  445. CALL CLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI,
  446. $ Z, LDZ, INFO )
  447. *
  448. IF( INFO.GT.0 ) THEN
  449. *
  450. * ==== A rare CLAHQR failure! CLAQR0 sometimes succeeds
  451. * . when CLAHQR fails. ====
  452. *
  453. KBOT = INFO
  454. *
  455. IF( N.GE.NL ) THEN
  456. *
  457. * ==== Larger matrices have enough subdiagonal scratch
  458. * . space to call CLAQR0 directly. ====
  459. *
  460. CALL CLAQR0( WANTT, WANTZ, N, ILO, KBOT, H, LDH, W,
  461. $ ILO, IHI, Z, LDZ, WORK, LWORK, INFO )
  462. *
  463. ELSE
  464. *
  465. * ==== Tiny matrices don't have enough subdiagonal
  466. * . scratch space to benefit from CLAQR0. Hence,
  467. * . tiny matrices must be copied into a larger
  468. * . array before calling CLAQR0. ====
  469. *
  470. CALL CLACPY( 'A', N, N, H, LDH, HL, NL )
  471. HL( N+1, N ) = ZERO
  472. CALL CLASET( 'A', NL, NL-N, ZERO, ZERO, HL( 1, N+1 ),
  473. $ NL )
  474. CALL CLAQR0( WANTT, WANTZ, NL, ILO, KBOT, HL, NL, W,
  475. $ ILO, IHI, Z, LDZ, WORKL, NL, INFO )
  476. IF( WANTT .OR. INFO.NE.0 )
  477. $ CALL CLACPY( 'A', N, N, HL, NL, H, LDH )
  478. END IF
  479. END IF
  480. END IF
  481. *
  482. * ==== Clear out the trash, if necessary. ====
  483. *
  484. IF( ( WANTT .OR. INFO.NE.0 ) .AND. N.GT.2 )
  485. $ CALL CLASET( 'L', N-2, N-2, ZERO, ZERO, H( 3, 1 ), LDH )
  486. *
  487. * ==== Ensure reported workspace size is backward-compatible with
  488. * . previous LAPACK versions. ====
  489. *
  490. WORK( 1 ) = CMPLX( MAX( REAL( MAX( 1, N ) ),
  491. $ REAL( WORK( 1 ) ) ), RZERO )
  492. END IF
  493. *
  494. * ==== End of CHSEQR ====
  495. *
  496. END