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.

cgeesx.f 16 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. *> \brief <b> CGEESX computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE matrices</b>
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download CGEESX + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cgeesx.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cgeesx.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cgeesx.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * SUBROUTINE CGEESX( JOBVS, SORT, SELECT, SENSE, N, A, LDA, SDIM, W,
  22. * VS, LDVS, RCONDE, RCONDV, WORK, LWORK, RWORK,
  23. * BWORK, INFO )
  24. *
  25. * .. Scalar Arguments ..
  26. * CHARACTER JOBVS, SENSE, SORT
  27. * INTEGER INFO, LDA, LDVS, LWORK, N, SDIM
  28. * REAL RCONDE, RCONDV
  29. * ..
  30. * .. Array Arguments ..
  31. * LOGICAL BWORK( * )
  32. * REAL RWORK( * )
  33. * COMPLEX A( LDA, * ), VS( LDVS, * ), W( * ), WORK( * )
  34. * ..
  35. * .. Function Arguments ..
  36. * LOGICAL SELECT
  37. * EXTERNAL SELECT
  38. * ..
  39. *
  40. *
  41. *> \par Purpose:
  42. * =============
  43. *>
  44. *> \verbatim
  45. *>
  46. *> CGEESX computes for an N-by-N complex nonsymmetric matrix A, the
  47. *> eigenvalues, the Schur form T, and, optionally, the matrix of Schur
  48. *> vectors Z. This gives the Schur factorization A = Z*T*(Z**H).
  49. *>
  50. *> Optionally, it also orders the eigenvalues on the diagonal of the
  51. *> Schur form so that selected eigenvalues are at the top left;
  52. *> computes a reciprocal condition number for the average of the
  53. *> selected eigenvalues (RCONDE); and computes a reciprocal condition
  54. *> number for the right invariant subspace corresponding to the
  55. *> selected eigenvalues (RCONDV). The leading columns of Z form an
  56. *> orthonormal basis for this invariant subspace.
  57. *>
  58. *> For further explanation of the reciprocal condition numbers RCONDE
  59. *> and RCONDV, see Section 4.10 of the LAPACK Users' Guide (where
  60. *> these quantities are called s and sep respectively).
  61. *>
  62. *> A complex matrix is in Schur form if it is upper triangular.
  63. *> \endverbatim
  64. *
  65. * Arguments:
  66. * ==========
  67. *
  68. *> \param[in] JOBVS
  69. *> \verbatim
  70. *> JOBVS is CHARACTER*1
  71. *> = 'N': Schur vectors are not computed;
  72. *> = 'V': Schur vectors are computed.
  73. *> \endverbatim
  74. *>
  75. *> \param[in] SORT
  76. *> \verbatim
  77. *> SORT is CHARACTER*1
  78. *> Specifies whether or not to order the eigenvalues on the
  79. *> diagonal of the Schur form.
  80. *> = 'N': Eigenvalues are not ordered;
  81. *> = 'S': Eigenvalues are ordered (see SELECT).
  82. *> \endverbatim
  83. *>
  84. *> \param[in] SELECT
  85. *> \verbatim
  86. *> SELECT is a LOGICAL FUNCTION of one COMPLEX argument
  87. *> SELECT must be declared EXTERNAL in the calling subroutine.
  88. *> If SORT = 'S', SELECT is used to select eigenvalues to order
  89. *> to the top left of the Schur form.
  90. *> If SORT = 'N', SELECT is not referenced.
  91. *> An eigenvalue W(j) is selected if SELECT(W(j)) is true.
  92. *> \endverbatim
  93. *>
  94. *> \param[in] SENSE
  95. *> \verbatim
  96. *> SENSE is CHARACTER*1
  97. *> Determines which reciprocal condition numbers are computed.
  98. *> = 'N': None are computed;
  99. *> = 'E': Computed for average of selected eigenvalues only;
  100. *> = 'V': Computed for selected right invariant subspace only;
  101. *> = 'B': Computed for both.
  102. *> If SENSE = 'E', 'V' or 'B', SORT must equal 'S'.
  103. *> \endverbatim
  104. *>
  105. *> \param[in] N
  106. *> \verbatim
  107. *> N is INTEGER
  108. *> The order of the matrix A. N >= 0.
  109. *> \endverbatim
  110. *>
  111. *> \param[in,out] A
  112. *> \verbatim
  113. *> A is COMPLEX array, dimension (LDA, N)
  114. *> On entry, the N-by-N matrix A.
  115. *> On exit, A is overwritten by its Schur form T.
  116. *> \endverbatim
  117. *>
  118. *> \param[in] LDA
  119. *> \verbatim
  120. *> LDA is INTEGER
  121. *> The leading dimension of the array A. LDA >= max(1,N).
  122. *> \endverbatim
  123. *>
  124. *> \param[out] SDIM
  125. *> \verbatim
  126. *> SDIM is INTEGER
  127. *> If SORT = 'N', SDIM = 0.
  128. *> If SORT = 'S', SDIM = number of eigenvalues for which
  129. *> SELECT is true.
  130. *> \endverbatim
  131. *>
  132. *> \param[out] W
  133. *> \verbatim
  134. *> W is COMPLEX array, dimension (N)
  135. *> W contains the computed eigenvalues, in the same order
  136. *> that they appear on the diagonal of the output Schur form T.
  137. *> \endverbatim
  138. *>
  139. *> \param[out] VS
  140. *> \verbatim
  141. *> VS is COMPLEX array, dimension (LDVS,N)
  142. *> If JOBVS = 'V', VS contains the unitary matrix Z of Schur
  143. *> vectors.
  144. *> If JOBVS = 'N', VS is not referenced.
  145. *> \endverbatim
  146. *>
  147. *> \param[in] LDVS
  148. *> \verbatim
  149. *> LDVS is INTEGER
  150. *> The leading dimension of the array VS. LDVS >= 1, and if
  151. *> JOBVS = 'V', LDVS >= N.
  152. *> \endverbatim
  153. *>
  154. *> \param[out] RCONDE
  155. *> \verbatim
  156. *> RCONDE is REAL
  157. *> If SENSE = 'E' or 'B', RCONDE contains the reciprocal
  158. *> condition number for the average of the selected eigenvalues.
  159. *> Not referenced if SENSE = 'N' or 'V'.
  160. *> \endverbatim
  161. *>
  162. *> \param[out] RCONDV
  163. *> \verbatim
  164. *> RCONDV is REAL
  165. *> If SENSE = 'V' or 'B', RCONDV contains the reciprocal
  166. *> condition number for the selected right invariant subspace.
  167. *> Not referenced if SENSE = 'N' or 'E'.
  168. *> \endverbatim
  169. *>
  170. *> \param[out] WORK
  171. *> \verbatim
  172. *> WORK is COMPLEX array, dimension (MAX(1,LWORK))
  173. *> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
  174. *> \endverbatim
  175. *>
  176. *> \param[in] LWORK
  177. *> \verbatim
  178. *> LWORK is INTEGER
  179. *> The dimension of the array WORK. LWORK >= max(1,2*N).
  180. *> Also, if SENSE = 'E' or 'V' or 'B', LWORK >= 2*SDIM*(N-SDIM),
  181. *> where SDIM is the number of selected eigenvalues computed by
  182. *> this routine. Note that 2*SDIM*(N-SDIM) <= N*N/2. Note also
  183. *> that an error is only returned if LWORK < max(1,2*N), but if
  184. *> SENSE = 'E' or 'V' or 'B' this may not be large enough.
  185. *> For good performance, LWORK must generally be larger.
  186. *>
  187. *> If LWORK = -1, then a workspace query is assumed; the routine
  188. *> only calculates upper bound on the optimal size of the
  189. *> array WORK, returns this value as the first entry of the WORK
  190. *> array, and no error message related to LWORK is issued by
  191. *> XERBLA.
  192. *> \endverbatim
  193. *>
  194. *> \param[out] RWORK
  195. *> \verbatim
  196. *> RWORK is REAL array, dimension (N)
  197. *> \endverbatim
  198. *>
  199. *> \param[out] BWORK
  200. *> \verbatim
  201. *> BWORK is LOGICAL array, dimension (N)
  202. *> Not referenced if SORT = 'N'.
  203. *> \endverbatim
  204. *>
  205. *> \param[out] INFO
  206. *> \verbatim
  207. *> INFO is INTEGER
  208. *> = 0: successful exit
  209. *> < 0: if INFO = -i, the i-th argument had an illegal value.
  210. *> > 0: if INFO = i, and i is
  211. *> <= N: the QR algorithm failed to compute all the
  212. *> eigenvalues; elements 1:ILO-1 and i+1:N of W
  213. *> contain those eigenvalues which have converged; if
  214. *> JOBVS = 'V', VS contains the transformation which
  215. *> reduces A to its partially converged Schur form.
  216. *> = N+1: the eigenvalues could not be reordered because some
  217. *> eigenvalues were too close to separate (the problem
  218. *> is very ill-conditioned);
  219. *> = N+2: after reordering, roundoff changed values of some
  220. *> complex eigenvalues so that leading eigenvalues in
  221. *> the Schur form no longer satisfy SELECT=.TRUE. This
  222. *> could also be caused by underflow due to scaling.
  223. *> \endverbatim
  224. *
  225. * Authors:
  226. * ========
  227. *
  228. *> \author Univ. of Tennessee
  229. *> \author Univ. of California Berkeley
  230. *> \author Univ. of Colorado Denver
  231. *> \author NAG Ltd.
  232. *
  233. *> \ingroup geesx
  234. *
  235. * =====================================================================
  236. SUBROUTINE CGEESX( JOBVS, SORT, SELECT, SENSE, N, A, LDA, SDIM, W,
  237. $ VS, LDVS, RCONDE, RCONDV, WORK, LWORK, RWORK,
  238. $ BWORK, INFO )
  239. *
  240. * -- LAPACK driver routine --
  241. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  242. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  243. *
  244. * .. Scalar Arguments ..
  245. CHARACTER JOBVS, SENSE, SORT
  246. INTEGER INFO, LDA, LDVS, LWORK, N, SDIM
  247. REAL RCONDE, RCONDV
  248. * ..
  249. * .. Array Arguments ..
  250. LOGICAL BWORK( * )
  251. REAL RWORK( * )
  252. COMPLEX A( LDA, * ), VS( LDVS, * ), W( * ), WORK( * )
  253. * ..
  254. * .. Function Arguments ..
  255. LOGICAL SELECT
  256. EXTERNAL SELECT
  257. * ..
  258. *
  259. * =====================================================================
  260. *
  261. * .. Parameters ..
  262. REAL ZERO, ONE
  263. PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 )
  264. * ..
  265. * .. Local Scalars ..
  266. LOGICAL LQUERY, SCALEA, WANTSB, WANTSE, WANTSN, WANTST,
  267. $ WANTSV, WANTVS
  268. INTEGER HSWORK, I, IBAL, ICOND, IERR, IEVAL, IHI, ILO,
  269. $ ITAU, IWRK, LWRK, MAXWRK, MINWRK
  270. REAL ANRM, BIGNUM, CSCALE, EPS, SMLNUM
  271. * ..
  272. * .. Local Arrays ..
  273. REAL DUM( 1 )
  274. * ..
  275. * .. External Subroutines ..
  276. EXTERNAL CCOPY, CGEBAK, CGEBAL, CGEHRD, CHSEQR, CLACPY,
  277. $ CLASCL, CTRSEN, CUNGHR, SLASCL, XERBLA
  278. * ..
  279. * .. External Functions ..
  280. LOGICAL LSAME
  281. INTEGER ILAENV
  282. REAL CLANGE, SLAMCH, SROUNDUP_LWORK
  283. EXTERNAL LSAME, ILAENV, CLANGE, SLAMCH, SROUNDUP_LWORK
  284. * ..
  285. * .. Intrinsic Functions ..
  286. INTRINSIC MAX, SQRT
  287. * ..
  288. * .. Executable Statements ..
  289. *
  290. * Test the input arguments
  291. *
  292. INFO = 0
  293. WANTVS = LSAME( JOBVS, 'V' )
  294. WANTST = LSAME( SORT, 'S' )
  295. WANTSN = LSAME( SENSE, 'N' )
  296. WANTSE = LSAME( SENSE, 'E' )
  297. WANTSV = LSAME( SENSE, 'V' )
  298. WANTSB = LSAME( SENSE, 'B' )
  299. LQUERY = ( LWORK.EQ.-1 )
  300. *
  301. IF( ( .NOT.WANTVS ) .AND. ( .NOT.LSAME( JOBVS, 'N' ) ) ) THEN
  302. INFO = -1
  303. ELSE IF( ( .NOT.WANTST ) .AND. ( .NOT.LSAME( SORT, 'N' ) ) ) THEN
  304. INFO = -2
  305. ELSE IF( .NOT.( WANTSN .OR. WANTSE .OR. WANTSV .OR. WANTSB ) .OR.
  306. $ ( .NOT.WANTST .AND. .NOT.WANTSN ) ) THEN
  307. INFO = -4
  308. ELSE IF( N.LT.0 ) THEN
  309. INFO = -5
  310. ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
  311. INFO = -7
  312. ELSE IF( LDVS.LT.1 .OR. ( WANTVS .AND. LDVS.LT.N ) ) THEN
  313. INFO = -11
  314. END IF
  315. *
  316. * Compute workspace
  317. * (Note: Comments in the code beginning "Workspace:" describe the
  318. * minimal amount of real workspace needed at that point in the
  319. * code, as well as the preferred amount for good performance.
  320. * CWorkspace refers to complex workspace, and RWorkspace to real
  321. * workspace. NB refers to the optimal block size for the
  322. * immediately following subroutine, as returned by ILAENV.
  323. * HSWORK refers to the workspace preferred by CHSEQR, as
  324. * calculated below. HSWORK is computed assuming ILO=1 and IHI=N,
  325. * the worst case.
  326. * If SENSE = 'E', 'V' or 'B', then the amount of workspace needed
  327. * depends on SDIM, which is computed by the routine CTRSEN later
  328. * in the code.)
  329. *
  330. IF( INFO.EQ.0 ) THEN
  331. IF( N.EQ.0 ) THEN
  332. MINWRK = 1
  333. LWRK = 1
  334. ELSE
  335. MAXWRK = N + N*ILAENV( 1, 'CGEHRD', ' ', N, 1, N, 0 )
  336. MINWRK = 2*N
  337. *
  338. CALL CHSEQR( 'S', JOBVS, N, 1, N, A, LDA, W, VS, LDVS,
  339. $ WORK, -1, IEVAL )
  340. HSWORK = INT( WORK( 1 ) )
  341. *
  342. IF( .NOT.WANTVS ) THEN
  343. MAXWRK = MAX( MAXWRK, HSWORK )
  344. ELSE
  345. MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1, 'CUNGHR',
  346. $ ' ', N, 1, N, -1 ) )
  347. MAXWRK = MAX( MAXWRK, HSWORK )
  348. END IF
  349. LWRK = MAXWRK
  350. IF( .NOT.WANTSN )
  351. $ LWRK = MAX( LWRK, ( N*N )/2 )
  352. END IF
  353. WORK( 1 ) = SROUNDUP_LWORK(LWRK)
  354. *
  355. IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
  356. INFO = -15
  357. END IF
  358. END IF
  359. *
  360. IF( INFO.NE.0 ) THEN
  361. CALL XERBLA( 'CGEESX', -INFO )
  362. RETURN
  363. ELSE IF( LQUERY ) THEN
  364. RETURN
  365. END IF
  366. *
  367. * Quick return if possible
  368. *
  369. IF( N.EQ.0 ) THEN
  370. SDIM = 0
  371. RETURN
  372. END IF
  373. *
  374. * Get machine constants
  375. *
  376. EPS = SLAMCH( 'P' )
  377. SMLNUM = SLAMCH( 'S' )
  378. BIGNUM = ONE / SMLNUM
  379. SMLNUM = SQRT( SMLNUM ) / EPS
  380. BIGNUM = ONE / SMLNUM
  381. *
  382. * Scale A if max element outside range [SMLNUM,BIGNUM]
  383. *
  384. ANRM = CLANGE( 'M', N, N, A, LDA, DUM )
  385. SCALEA = .FALSE.
  386. IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
  387. SCALEA = .TRUE.
  388. CSCALE = SMLNUM
  389. ELSE IF( ANRM.GT.BIGNUM ) THEN
  390. SCALEA = .TRUE.
  391. CSCALE = BIGNUM
  392. END IF
  393. IF( SCALEA )
  394. $ CALL CLASCL( 'G', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
  395. *
  396. *
  397. * Permute the matrix to make it more nearly triangular
  398. * (CWorkspace: none)
  399. * (RWorkspace: need N)
  400. *
  401. IBAL = 1
  402. CALL CGEBAL( 'P', N, A, LDA, ILO, IHI, RWORK( IBAL ), IERR )
  403. *
  404. * Reduce to upper Hessenberg form
  405. * (CWorkspace: need 2*N, prefer N+N*NB)
  406. * (RWorkspace: none)
  407. *
  408. ITAU = 1
  409. IWRK = N + ITAU
  410. CALL CGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
  411. $ LWORK-IWRK+1, IERR )
  412. *
  413. IF( WANTVS ) THEN
  414. *
  415. * Copy Householder vectors to VS
  416. *
  417. CALL CLACPY( 'L', N, N, A, LDA, VS, LDVS )
  418. *
  419. * Generate unitary matrix in VS
  420. * (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
  421. * (RWorkspace: none)
  422. *
  423. CALL CUNGHR( N, ILO, IHI, VS, LDVS, WORK( ITAU ), WORK( IWRK ),
  424. $ LWORK-IWRK+1, IERR )
  425. END IF
  426. *
  427. SDIM = 0
  428. *
  429. * Perform QR iteration, accumulating Schur vectors in VS if desired
  430. * (CWorkspace: need 1, prefer HSWORK (see comments) )
  431. * (RWorkspace: none)
  432. *
  433. IWRK = ITAU
  434. CALL CHSEQR( 'S', JOBVS, N, ILO, IHI, A, LDA, W, VS, LDVS,
  435. $ WORK( IWRK ), LWORK-IWRK+1, IEVAL )
  436. IF( IEVAL.GT.0 )
  437. $ INFO = IEVAL
  438. *
  439. * Sort eigenvalues if desired
  440. *
  441. IF( WANTST .AND. INFO.EQ.0 ) THEN
  442. IF( SCALEA )
  443. $ CALL CLASCL( 'G', 0, 0, CSCALE, ANRM, N, 1, W, N, IERR )
  444. DO 10 I = 1, N
  445. BWORK( I ) = SELECT( W( I ) )
  446. 10 CONTINUE
  447. *
  448. * Reorder eigenvalues, transform Schur vectors, and compute
  449. * reciprocal condition numbers
  450. * (CWorkspace: if SENSE is not 'N', need 2*SDIM*(N-SDIM)
  451. * otherwise, need none )
  452. * (RWorkspace: none)
  453. *
  454. CALL CTRSEN( SENSE, JOBVS, BWORK, N, A, LDA, VS, LDVS, W, SDIM,
  455. $ RCONDE, RCONDV, WORK( IWRK ), LWORK-IWRK+1,
  456. $ ICOND )
  457. IF( .NOT.WANTSN )
  458. $ MAXWRK = MAX( MAXWRK, 2*SDIM*( N-SDIM ) )
  459. IF( ICOND.EQ.-14 ) THEN
  460. *
  461. * Not enough complex workspace
  462. *
  463. INFO = -15
  464. END IF
  465. END IF
  466. *
  467. IF( WANTVS ) THEN
  468. *
  469. * Undo balancing
  470. * (CWorkspace: none)
  471. * (RWorkspace: need N)
  472. *
  473. CALL CGEBAK( 'P', 'R', N, ILO, IHI, RWORK( IBAL ), N, VS, LDVS,
  474. $ IERR )
  475. END IF
  476. *
  477. IF( SCALEA ) THEN
  478. *
  479. * Undo scaling for the Schur form of A
  480. *
  481. CALL CLASCL( 'U', 0, 0, CSCALE, ANRM, N, N, A, LDA, IERR )
  482. CALL CCOPY( N, A, LDA+1, W, 1 )
  483. IF( ( WANTSV .OR. WANTSB ) .AND. INFO.EQ.0 ) THEN
  484. DUM( 1 ) = RCONDV
  485. CALL SLASCL( 'G', 0, 0, CSCALE, ANRM, 1, 1, DUM, 1, IERR )
  486. RCONDV = DUM( 1 )
  487. END IF
  488. END IF
  489. *
  490. WORK( 1 ) = SROUNDUP_LWORK(MAXWRK)
  491. RETURN
  492. *
  493. * End of CGEESX
  494. *
  495. END