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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  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. *> \date November 2013
  230. *
  231. *> \ingroup complex16OTHERcomputational
  232. *
  233. *> \par Further Details:
  234. * =====================
  235. *>
  236. *> \verbatim
  237. *>
  238. *> Each eigenvector is normalized so that the element of largest
  239. *> magnitude has magnitude 1; here the magnitude of a complex number
  240. *> (x,y) is taken to be |x|+|y|.
  241. *> \endverbatim
  242. *>
  243. * =====================================================================
  244. SUBROUTINE ZHSEIN( SIDE, EIGSRC, INITV, SELECT, N, H, LDH, W, VL,
  245. $ LDVL, VR, LDVR, MM, M, WORK, RWORK, IFAILL,
  246. $ IFAILR, INFO )
  247. *
  248. * -- LAPACK computational routine (version 3.5.0) --
  249. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  250. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  251. * November 2013
  252. *
  253. * .. Scalar Arguments ..
  254. CHARACTER EIGSRC, INITV, SIDE
  255. INTEGER INFO, LDH, LDVL, LDVR, M, MM, N
  256. * ..
  257. * .. Array Arguments ..
  258. LOGICAL SELECT( * )
  259. INTEGER IFAILL( * ), IFAILR( * )
  260. DOUBLE PRECISION RWORK( * )
  261. COMPLEX*16 H( LDH, * ), VL( LDVL, * ), VR( LDVR, * ),
  262. $ W( * ), WORK( * )
  263. * ..
  264. *
  265. * =====================================================================
  266. *
  267. * .. Parameters ..
  268. COMPLEX*16 ZERO
  269. PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) )
  270. DOUBLE PRECISION RZERO
  271. PARAMETER ( RZERO = 0.0D+0 )
  272. * ..
  273. * .. Local Scalars ..
  274. LOGICAL BOTHV, FROMQR, LEFTV, NOINIT, RIGHTV
  275. INTEGER I, IINFO, K, KL, KLN, KR, KS, LDWORK
  276. DOUBLE PRECISION EPS3, HNORM, SMLNUM, ULP, UNFL
  277. COMPLEX*16 CDUM, WK
  278. * ..
  279. * .. External Functions ..
  280. LOGICAL LSAME, DISNAN
  281. DOUBLE PRECISION DLAMCH, ZLANHS
  282. EXTERNAL LSAME, DLAMCH, ZLANHS, DISNAN
  283. * ..
  284. * .. External Subroutines ..
  285. EXTERNAL XERBLA, ZLAEIN
  286. * ..
  287. * .. Intrinsic Functions ..
  288. INTRINSIC ABS, DBLE, DIMAG, MAX
  289. * ..
  290. * .. Statement Functions ..
  291. DOUBLE PRECISION CABS1
  292. * ..
  293. * .. Statement Function definitions ..
  294. CABS1( CDUM ) = ABS( DBLE( CDUM ) ) + ABS( DIMAG( CDUM ) )
  295. * ..
  296. * .. Executable Statements ..
  297. *
  298. * Decode and test the input parameters.
  299. *
  300. BOTHV = LSAME( SIDE, 'B' )
  301. RIGHTV = LSAME( SIDE, 'R' ) .OR. BOTHV
  302. LEFTV = LSAME( SIDE, 'L' ) .OR. BOTHV
  303. *
  304. FROMQR = LSAME( EIGSRC, 'Q' )
  305. *
  306. NOINIT = LSAME( INITV, 'N' )
  307. *
  308. * Set M to the number of columns required to store the selected
  309. * eigenvectors.
  310. *
  311. M = 0
  312. DO 10 K = 1, N
  313. IF( SELECT( K ) )
  314. $ M = M + 1
  315. 10 CONTINUE
  316. *
  317. INFO = 0
  318. IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
  319. INFO = -1
  320. ELSE IF( .NOT.FROMQR .AND. .NOT.LSAME( EIGSRC, 'N' ) ) THEN
  321. INFO = -2
  322. ELSE IF( .NOT.NOINIT .AND. .NOT.LSAME( INITV, 'U' ) ) THEN
  323. INFO = -3
  324. ELSE IF( N.LT.0 ) THEN
  325. INFO = -5
  326. ELSE IF( LDH.LT.MAX( 1, N ) ) THEN
  327. INFO = -7
  328. ELSE IF( LDVL.LT.1 .OR. ( LEFTV .AND. LDVL.LT.N ) ) THEN
  329. INFO = -10
  330. ELSE IF( LDVR.LT.1 .OR. ( RIGHTV .AND. LDVR.LT.N ) ) THEN
  331. INFO = -12
  332. ELSE IF( MM.LT.M ) THEN
  333. INFO = -13
  334. END IF
  335. IF( INFO.NE.0 ) THEN
  336. CALL XERBLA( 'ZHSEIN', -INFO )
  337. RETURN
  338. END IF
  339. *
  340. * Quick return if possible.
  341. *
  342. IF( N.EQ.0 )
  343. $ RETURN
  344. *
  345. * Set machine-dependent constants.
  346. *
  347. UNFL = DLAMCH( 'Safe minimum' )
  348. ULP = DLAMCH( 'Precision' )
  349. SMLNUM = UNFL*( N / ULP )
  350. *
  351. LDWORK = N
  352. *
  353. KL = 1
  354. KLN = 0
  355. IF( FROMQR ) THEN
  356. KR = 0
  357. ELSE
  358. KR = N
  359. END IF
  360. KS = 1
  361. *
  362. DO 100 K = 1, N
  363. IF( SELECT( K ) ) THEN
  364. *
  365. * Compute eigenvector(s) corresponding to W(K).
  366. *
  367. IF( FROMQR ) THEN
  368. *
  369. * If affiliation of eigenvalues is known, check whether
  370. * the matrix splits.
  371. *
  372. * Determine KL and KR such that 1 <= KL <= K <= KR <= N
  373. * and H(KL,KL-1) and H(KR+1,KR) are zero (or KL = 1 or
  374. * KR = N).
  375. *
  376. * Then inverse iteration can be performed with the
  377. * submatrix H(KL:N,KL:N) for a left eigenvector, and with
  378. * the submatrix H(1:KR,1:KR) for a right eigenvector.
  379. *
  380. DO 20 I = K, KL + 1, -1
  381. IF( H( I, I-1 ).EQ.ZERO )
  382. $ GO TO 30
  383. 20 CONTINUE
  384. 30 CONTINUE
  385. KL = I
  386. IF( K.GT.KR ) THEN
  387. DO 40 I = K, N - 1
  388. IF( H( I+1, I ).EQ.ZERO )
  389. $ GO TO 50
  390. 40 CONTINUE
  391. 50 CONTINUE
  392. KR = I
  393. END IF
  394. END IF
  395. *
  396. IF( KL.NE.KLN ) THEN
  397. KLN = KL
  398. *
  399. * Compute infinity-norm of submatrix H(KL:KR,KL:KR) if it
  400. * has not ben computed before.
  401. *
  402. HNORM = ZLANHS( 'I', KR-KL+1, H( KL, KL ), LDH, RWORK )
  403. IF( DISNAN( HNORM ) ) THEN
  404. INFO = -6
  405. RETURN
  406. ELSE IF( HNORM.GT.RZERO ) THEN
  407. EPS3 = HNORM*ULP
  408. ELSE
  409. EPS3 = SMLNUM
  410. END IF
  411. END IF
  412. *
  413. * Perturb eigenvalue if it is close to any previous
  414. * selected eigenvalues affiliated to the submatrix
  415. * H(KL:KR,KL:KR). Close roots are modified by EPS3.
  416. *
  417. WK = W( K )
  418. 60 CONTINUE
  419. DO 70 I = K - 1, KL, -1
  420. IF( SELECT( I ) .AND. CABS1( W( I )-WK ).LT.EPS3 ) THEN
  421. WK = WK + EPS3
  422. GO TO 60
  423. END IF
  424. 70 CONTINUE
  425. W( K ) = WK
  426. *
  427. IF( LEFTV ) THEN
  428. *
  429. * Compute left eigenvector.
  430. *
  431. CALL ZLAEIN( .FALSE., NOINIT, N-KL+1, H( KL, KL ), LDH,
  432. $ WK, VL( KL, KS ), WORK, LDWORK, RWORK, EPS3,
  433. $ SMLNUM, IINFO )
  434. IF( IINFO.GT.0 ) THEN
  435. INFO = INFO + 1
  436. IFAILL( KS ) = K
  437. ELSE
  438. IFAILL( KS ) = 0
  439. END IF
  440. DO 80 I = 1, KL - 1
  441. VL( I, KS ) = ZERO
  442. 80 CONTINUE
  443. END IF
  444. IF( RIGHTV ) THEN
  445. *
  446. * Compute right eigenvector.
  447. *
  448. CALL ZLAEIN( .TRUE., NOINIT, KR, H, LDH, WK, VR( 1, KS ),
  449. $ WORK, LDWORK, RWORK, EPS3, SMLNUM, IINFO )
  450. IF( IINFO.GT.0 ) THEN
  451. INFO = INFO + 1
  452. IFAILR( KS ) = K
  453. ELSE
  454. IFAILR( KS ) = 0
  455. END IF
  456. DO 90 I = KR + 1, N
  457. VR( I, KS ) = ZERO
  458. 90 CONTINUE
  459. END IF
  460. KS = KS + 1
  461. END IF
  462. 100 CONTINUE
  463. *
  464. RETURN
  465. *
  466. * End of ZHSEIN
  467. *
  468. END