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.

zhsein.f 15 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. *> \brief \b ZHSEIN
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download ZHSEIN + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zhsein.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zhsein.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zhsein.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * SUBROUTINE ZHSEIN( SIDE, EIGSRC, INITV, SELECT, N, H, LDH, W, VL,
  22. * LDVL, VR, LDVR, MM, M, WORK, RWORK, IFAILL,
  23. * IFAILR, INFO )
  24. *
  25. * .. Scalar Arguments ..
  26. * CHARACTER EIGSRC, INITV, SIDE
  27. * INTEGER INFO, LDH, LDVL, LDVR, M, MM, N
  28. * ..
  29. * .. Array Arguments ..
  30. * LOGICAL SELECT( * )
  31. * INTEGER IFAILL( * ), IFAILR( * )
  32. * DOUBLE PRECISION RWORK( * )
  33. * COMPLEX*16 H( LDH, * ), VL( LDVL, * ), VR( LDVR, * ),
  34. * $ W( * ), WORK( * )
  35. * ..
  36. *
  37. *
  38. *> \par Purpose:
  39. * =============
  40. *>
  41. *> \verbatim
  42. *>
  43. *> ZHSEIN uses inverse iteration to find specified right and/or left
  44. *> eigenvectors of a complex upper Hessenberg matrix H.
  45. *>
  46. *> The right eigenvector x and the left eigenvector y of the matrix H
  47. *> corresponding to an eigenvalue w are defined by:
  48. *>
  49. *> H * x = w * x, y**h * H = w * y**h
  50. *>
  51. *> where y**h denotes the conjugate transpose of the vector y.
  52. *> \endverbatim
  53. *
  54. * Arguments:
  55. * ==========
  56. *
  57. *> \param[in] SIDE
  58. *> \verbatim
  59. *> SIDE is CHARACTER*1
  60. *> = 'R': compute right eigenvectors only;
  61. *> = 'L': compute left eigenvectors only;
  62. *> = 'B': compute both right and left eigenvectors.
  63. *> \endverbatim
  64. *>
  65. *> \param[in] EIGSRC
  66. *> \verbatim
  67. *> EIGSRC is CHARACTER*1
  68. *> Specifies the source of eigenvalues supplied in W:
  69. *> = 'Q': the eigenvalues were found using ZHSEQR; thus, if
  70. *> H has zero subdiagonal elements, and so is
  71. *> block-triangular, then the j-th eigenvalue can be
  72. *> assumed to be an eigenvalue of the block containing
  73. *> the j-th row/column. This property allows ZHSEIN to
  74. *> perform inverse iteration on just one diagonal block.
  75. *> = 'N': no assumptions are made on the correspondence
  76. *> between eigenvalues and diagonal blocks. In this
  77. *> case, ZHSEIN must always perform inverse iteration
  78. *> using the whole matrix H.
  79. *> \endverbatim
  80. *>
  81. *> \param[in] INITV
  82. *> \verbatim
  83. *> INITV is CHARACTER*1
  84. *> = 'N': no initial vectors are supplied;
  85. *> = 'U': user-supplied initial vectors are stored in the arrays
  86. *> VL and/or VR.
  87. *> \endverbatim
  88. *>
  89. *> \param[in] SELECT
  90. *> \verbatim
  91. *> SELECT is LOGICAL array, dimension (N)
  92. *> Specifies the eigenvectors to be computed. To select the
  93. *> eigenvector corresponding to the eigenvalue W(j),
  94. *> SELECT(j) must be set to .TRUE..
  95. *> \endverbatim
  96. *>
  97. *> \param[in] N
  98. *> \verbatim
  99. *> N is INTEGER
  100. *> The order of the matrix H. N >= 0.
  101. *> \endverbatim
  102. *>
  103. *> \param[in] H
  104. *> \verbatim
  105. *> H is COMPLEX*16 array, dimension (LDH,N)
  106. *> The upper Hessenberg matrix H.
  107. *> If a NaN is detected in H, the routine will return with INFO=-6.
  108. *> \endverbatim
  109. *>
  110. *> \param[in] LDH
  111. *> \verbatim
  112. *> LDH is INTEGER
  113. *> The leading dimension of the array H. LDH >= max(1,N).
  114. *> \endverbatim
  115. *>
  116. *> \param[in,out] W
  117. *> \verbatim
  118. *> W is COMPLEX*16 array, dimension (N)
  119. *> On entry, the eigenvalues of H.
  120. *> On exit, the real parts of W may have been altered since
  121. *> close eigenvalues are perturbed slightly in searching for
  122. *> independent eigenvectors.
  123. *> \endverbatim
  124. *>
  125. *> \param[in,out] VL
  126. *> \verbatim
  127. *> VL is COMPLEX*16 array, dimension (LDVL,MM)
  128. *> On entry, if INITV = 'U' and SIDE = 'L' or 'B', VL must
  129. *> contain starting vectors for the inverse iteration for the
  130. *> left eigenvectors; the starting vector for each eigenvector
  131. *> must be in the same column in which the eigenvector will be
  132. *> stored.
  133. *> On exit, if SIDE = 'L' or 'B', the left eigenvectors
  134. *> specified by SELECT will be stored consecutively in the
  135. *> columns of VL, in the same order as their eigenvalues.
  136. *> If SIDE = 'R', VL is not referenced.
  137. *> \endverbatim
  138. *>
  139. *> \param[in] LDVL
  140. *> \verbatim
  141. *> LDVL is INTEGER
  142. *> The leading dimension of the array VL.
  143. *> LDVL >= max(1,N) if SIDE = 'L' or 'B'; LDVL >= 1 otherwise.
  144. *> \endverbatim
  145. *>
  146. *> \param[in,out] VR
  147. *> \verbatim
  148. *> VR is COMPLEX*16 array, dimension (LDVR,MM)
  149. *> On entry, if INITV = 'U' and SIDE = 'R' or 'B', VR must
  150. *> contain starting vectors for the inverse iteration for the
  151. *> right eigenvectors; the starting vector for each eigenvector
  152. *> must be in the same column in which the eigenvector will be
  153. *> stored.
  154. *> On exit, if SIDE = 'R' or 'B', the right eigenvectors
  155. *> specified by SELECT will be stored consecutively in the
  156. *> columns of VR, in the same order as their eigenvalues.
  157. *> If SIDE = 'L', VR is not referenced.
  158. *> \endverbatim
  159. *>
  160. *> \param[in] LDVR
  161. *> \verbatim
  162. *> LDVR is INTEGER
  163. *> The leading dimension of the array VR.
  164. *> LDVR >= max(1,N) if SIDE = 'R' or 'B'; LDVR >= 1 otherwise.
  165. *> \endverbatim
  166. *>
  167. *> \param[in] MM
  168. *> \verbatim
  169. *> MM is INTEGER
  170. *> The number of columns in the arrays VL and/or VR. MM >= M.
  171. *> \endverbatim
  172. *>
  173. *> \param[out] M
  174. *> \verbatim
  175. *> M is INTEGER
  176. *> The number of columns in the arrays VL and/or VR required to
  177. *> store the eigenvectors (= the number of .TRUE. elements in
  178. *> SELECT).
  179. *> \endverbatim
  180. *>
  181. *> \param[out] WORK
  182. *> \verbatim
  183. *> WORK is COMPLEX*16 array, dimension (N*N)
  184. *> \endverbatim
  185. *>
  186. *> \param[out] RWORK
  187. *> \verbatim
  188. *> RWORK is DOUBLE PRECISION array, dimension (N)
  189. *> \endverbatim
  190. *>
  191. *> \param[out] IFAILL
  192. *> \verbatim
  193. *> IFAILL is INTEGER array, dimension (MM)
  194. *> If SIDE = 'L' or 'B', IFAILL(i) = j > 0 if the left
  195. *> eigenvector in the i-th column of VL (corresponding to the
  196. *> eigenvalue w(j)) failed to converge; IFAILL(i) = 0 if the
  197. *> eigenvector converged satisfactorily.
  198. *> If SIDE = 'R', IFAILL is not referenced.
  199. *> \endverbatim
  200. *>
  201. *> \param[out] IFAILR
  202. *> \verbatim
  203. *> IFAILR is INTEGER array, dimension (MM)
  204. *> If SIDE = 'R' or 'B', IFAILR(i) = j > 0 if the right
  205. *> eigenvector in the i-th column of VR (corresponding to the
  206. *> eigenvalue w(j)) failed to converge; IFAILR(i) = 0 if the
  207. *> eigenvector converged satisfactorily.
  208. *> If SIDE = 'L', IFAILR is not referenced.
  209. *> \endverbatim
  210. *>
  211. *> \param[out] INFO
  212. *> \verbatim
  213. *> INFO is INTEGER
  214. *> = 0: successful exit
  215. *> < 0: if INFO = -i, the i-th argument had an illegal value
  216. *> > 0: if INFO = i, i is the number of eigenvectors which
  217. *> failed to converge; see IFAILL and IFAILR for further
  218. *> details.
  219. *> \endverbatim
  220. *
  221. * Authors:
  222. * ========
  223. *
  224. *> \author Univ. of Tennessee
  225. *> \author Univ. of California Berkeley
  226. *> \author Univ. of Colorado Denver
  227. *> \author NAG Ltd.
  228. *
  229. *> \ingroup complex16OTHERcomputational
  230. *
  231. *> \par Further Details:
  232. * =====================
  233. *>
  234. *> \verbatim
  235. *>
  236. *> Each eigenvector is normalized so that the element of largest
  237. *> magnitude has magnitude 1; here the magnitude of a complex number
  238. *> (x,y) is taken to be |x|+|y|.
  239. *> \endverbatim
  240. *>
  241. * =====================================================================
  242. SUBROUTINE ZHSEIN( SIDE, EIGSRC, INITV, SELECT, N, H, LDH, W, VL,
  243. $ LDVL, VR, LDVR, MM, M, WORK, RWORK, IFAILL,
  244. $ IFAILR, INFO )
  245. *
  246. * -- LAPACK computational routine --
  247. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  248. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  249. *
  250. * .. Scalar Arguments ..
  251. CHARACTER EIGSRC, INITV, SIDE
  252. INTEGER INFO, LDH, LDVL, LDVR, M, MM, N
  253. * ..
  254. * .. Array Arguments ..
  255. LOGICAL SELECT( * )
  256. INTEGER IFAILL( * ), IFAILR( * )
  257. DOUBLE PRECISION RWORK( * )
  258. COMPLEX*16 H( LDH, * ), VL( LDVL, * ), VR( LDVR, * ),
  259. $ W( * ), WORK( * )
  260. * ..
  261. *
  262. * =====================================================================
  263. *
  264. * .. Parameters ..
  265. COMPLEX*16 ZERO
  266. PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) )
  267. DOUBLE PRECISION RZERO
  268. PARAMETER ( RZERO = 0.0D+0 )
  269. * ..
  270. * .. Local Scalars ..
  271. LOGICAL BOTHV, FROMQR, LEFTV, NOINIT, RIGHTV
  272. INTEGER I, IINFO, K, KL, KLN, KR, KS, LDWORK
  273. DOUBLE PRECISION EPS3, HNORM, SMLNUM, ULP, UNFL
  274. COMPLEX*16 CDUM, WK
  275. * ..
  276. * .. External Functions ..
  277. LOGICAL LSAME, DISNAN
  278. DOUBLE PRECISION DLAMCH, ZLANHS
  279. EXTERNAL LSAME, DLAMCH, ZLANHS, DISNAN
  280. * ..
  281. * .. External Subroutines ..
  282. EXTERNAL XERBLA, ZLAEIN
  283. * ..
  284. * .. Intrinsic Functions ..
  285. INTRINSIC ABS, DBLE, DIMAG, MAX
  286. * ..
  287. * .. Statement Functions ..
  288. DOUBLE PRECISION CABS1
  289. * ..
  290. * .. Statement Function definitions ..
  291. CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
  292. * ..
  293. * .. Executable Statements ..
  294. *
  295. * Decode and test the input parameters.
  296. *
  297. BOTHV = LSAME( SIDE, 'B' )
  298. RIGHTV = LSAME( SIDE, 'R' ) .OR. BOTHV
  299. LEFTV = LSAME( SIDE, 'L' ) .OR. BOTHV
  300. *
  301. FROMQR = LSAME( EIGSRC, 'Q' )
  302. *
  303. NOINIT = LSAME( INITV, 'N' )
  304. *
  305. * Set M to the number of columns required to store the selected
  306. * eigenvectors.
  307. *
  308. M = 0
  309. DO 10 K = 1, N
  310. IF( SELECT( K ) )
  311. $ M = M + 1
  312. 10 CONTINUE
  313. *
  314. INFO = 0
  315. IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
  316. INFO = -1
  317. ELSE IF( .NOT.FROMQR .AND. .NOT.LSAME( EIGSRC, 'N' ) ) THEN
  318. INFO = -2
  319. ELSE IF( .NOT.NOINIT .AND. .NOT.LSAME( INITV, 'U' ) ) THEN
  320. INFO = -3
  321. ELSE IF( N.LT.0 ) THEN
  322. INFO = -5
  323. ELSE IF( LDH.LT.MAX( 1, N ) ) THEN
  324. INFO = -7
  325. ELSE IF( LDVL.LT.1 .OR. ( LEFTV .AND. LDVL.LT.N ) ) THEN
  326. INFO = -10
  327. ELSE IF( LDVR.LT.1 .OR. ( RIGHTV .AND. LDVR.LT.N ) ) THEN
  328. INFO = -12
  329. ELSE IF( MM.LT.M ) THEN
  330. INFO = -13
  331. END IF
  332. IF( INFO.NE.0 ) THEN
  333. CALL XERBLA( 'ZHSEIN', -INFO )
  334. RETURN
  335. END IF
  336. *
  337. * Quick return if possible.
  338. *
  339. IF( N.EQ.0 )
  340. $ RETURN
  341. *
  342. * Set machine-dependent constants.
  343. *
  344. UNFL = DLAMCH( 'Safe minimum' )
  345. ULP = DLAMCH( 'Precision' )
  346. SMLNUM = UNFL*( N / ULP )
  347. *
  348. LDWORK = N
  349. *
  350. KL = 1
  351. KLN = 0
  352. IF( FROMQR ) THEN
  353. KR = 0
  354. ELSE
  355. KR = N
  356. END IF
  357. KS = 1
  358. *
  359. DO 100 K = 1, N
  360. IF( SELECT( K ) ) THEN
  361. *
  362. * Compute eigenvector(s) corresponding to W(K).
  363. *
  364. IF( FROMQR ) THEN
  365. *
  366. * If affiliation of eigenvalues is known, check whether
  367. * the matrix splits.
  368. *
  369. * Determine KL and KR such that 1 <= KL <= K <= KR <= N
  370. * and H(KL,KL-1) and H(KR+1,KR) are zero (or KL = 1 or
  371. * KR = N).
  372. *
  373. * Then inverse iteration can be performed with the
  374. * submatrix H(KL:N,KL:N) for a left eigenvector, and with
  375. * the submatrix H(1:KR,1:KR) for a right eigenvector.
  376. *
  377. DO 20 I = K, KL + 1, -1
  378. IF( H( I, I-1 ).EQ.ZERO )
  379. $ GO TO 30
  380. 20 CONTINUE
  381. 30 CONTINUE
  382. KL = I
  383. IF( K.GT.KR ) THEN
  384. DO 40 I = K, N - 1
  385. IF( H( I+1, I ).EQ.ZERO )
  386. $ GO TO 50
  387. 40 CONTINUE
  388. 50 CONTINUE
  389. KR = I
  390. END IF
  391. END IF
  392. *
  393. IF( KL.NE.KLN ) THEN
  394. KLN = KL
  395. *
  396. * Compute infinity-norm of submatrix H(KL:KR,KL:KR) if it
  397. * has not ben computed before.
  398. *
  399. HNORM = ZLANHS( 'I', KR-KL+1, H( KL, KL ), LDH, RWORK )
  400. IF( DISNAN( HNORM ) ) THEN
  401. INFO = -6
  402. RETURN
  403. ELSE IF( HNORM.GT.RZERO ) THEN
  404. EPS3 = HNORM*ULP
  405. ELSE
  406. EPS3 = SMLNUM
  407. END IF
  408. END IF
  409. *
  410. * Perturb eigenvalue if it is close to any previous
  411. * selected eigenvalues affiliated to the submatrix
  412. * H(KL:KR,KL:KR). Close roots are modified by EPS3.
  413. *
  414. WK = W( K )
  415. 60 CONTINUE
  416. DO 70 I = K - 1, KL, -1
  417. IF( SELECT( I ) .AND. CABS1( W( I )-WK ).LT.EPS3 ) THEN
  418. WK = WK + EPS3
  419. GO TO 60
  420. END IF
  421. 70 CONTINUE
  422. W( K ) = WK
  423. *
  424. IF( LEFTV ) THEN
  425. *
  426. * Compute left eigenvector.
  427. *
  428. CALL ZLAEIN( .FALSE., NOINIT, N-KL+1, H( KL, KL ), LDH,
  429. $ WK, VL( KL, KS ), WORK, LDWORK, RWORK, EPS3,
  430. $ SMLNUM, IINFO )
  431. IF( IINFO.GT.0 ) THEN
  432. INFO = INFO + 1
  433. IFAILL( KS ) = K
  434. ELSE
  435. IFAILL( KS ) = 0
  436. END IF
  437. DO 80 I = 1, KL - 1
  438. VL( I, KS ) = ZERO
  439. 80 CONTINUE
  440. END IF
  441. IF( RIGHTV ) THEN
  442. *
  443. * Compute right eigenvector.
  444. *
  445. CALL ZLAEIN( .TRUE., NOINIT, KR, H, LDH, WK, VR( 1, KS ),
  446. $ WORK, LDWORK, RWORK, EPS3, SMLNUM, IINFO )
  447. IF( IINFO.GT.0 ) THEN
  448. INFO = INFO + 1
  449. IFAILR( KS ) = K
  450. ELSE
  451. IFAILR( KS ) = 0
  452. END IF
  453. DO 90 I = KR + 1, N
  454. VR( I, KS ) = ZERO
  455. 90 CONTINUE
  456. END IF
  457. KS = KS + 1
  458. END IF
  459. 100 CONTINUE
  460. *
  461. RETURN
  462. *
  463. * End of ZHSEIN
  464. *
  465. END