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.

dtrevc3.f 49 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304
  1. *> \brief \b DTREVC3
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download DTREVC3 + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dtrevc3.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dtrevc3.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dtrevc3.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * SUBROUTINE DTREVC3( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL,
  22. * VR, LDVR, MM, M, WORK, LWORK, INFO )
  23. *
  24. * .. Scalar Arguments ..
  25. * CHARACTER HOWMNY, SIDE
  26. * INTEGER INFO, LDT, LDVL, LDVR, LWORK, M, MM, N
  27. * ..
  28. * .. Array Arguments ..
  29. * LOGICAL SELECT( * )
  30. * DOUBLE PRECISION T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
  31. * $ WORK( * )
  32. * ..
  33. *
  34. *
  35. *> \par Purpose:
  36. * =============
  37. *>
  38. *> \verbatim
  39. *>
  40. *> DTREVC3 computes some or all of the right and/or left eigenvectors of
  41. *> a real upper quasi-triangular matrix T.
  42. *> Matrices of this type are produced by the Schur factorization of
  43. *> a real general matrix: A = Q*T*Q**T, as computed by DHSEQR.
  44. *>
  45. *> The right eigenvector x and the left eigenvector y of T corresponding
  46. *> to an eigenvalue w are defined by:
  47. *>
  48. *> T*x = w*x, (y**T)*T = w*(y**T)
  49. *>
  50. *> where y**T denotes the transpose of the vector y.
  51. *> The eigenvalues are not input to this routine, but are read directly
  52. *> from the diagonal blocks of T.
  53. *>
  54. *> This routine returns the matrices X and/or Y of right and left
  55. *> eigenvectors of T, or the products Q*X and/or Q*Y, where Q is an
  56. *> input matrix. If Q is the orthogonal factor that reduces a matrix
  57. *> A to Schur form T, then Q*X and Q*Y are the matrices of right and
  58. *> left eigenvectors of A.
  59. *>
  60. *> This uses a Level 3 BLAS version of the back transformation.
  61. *> \endverbatim
  62. *
  63. * Arguments:
  64. * ==========
  65. *
  66. *> \param[in] SIDE
  67. *> \verbatim
  68. *> SIDE is CHARACTER*1
  69. *> = 'R': compute right eigenvectors only;
  70. *> = 'L': compute left eigenvectors only;
  71. *> = 'B': compute both right and left eigenvectors.
  72. *> \endverbatim
  73. *>
  74. *> \param[in] HOWMNY
  75. *> \verbatim
  76. *> HOWMNY is CHARACTER*1
  77. *> = 'A': compute all right and/or left eigenvectors;
  78. *> = 'B': compute all right and/or left eigenvectors,
  79. *> backtransformed by the matrices in VR and/or VL;
  80. *> = 'S': compute selected right and/or left eigenvectors,
  81. *> as indicated by the logical array SELECT.
  82. *> \endverbatim
  83. *>
  84. *> \param[in,out] SELECT
  85. *> \verbatim
  86. *> SELECT is LOGICAL array, dimension (N)
  87. *> If HOWMNY = 'S', SELECT specifies the eigenvectors to be
  88. *> computed.
  89. *> If w(j) is a real eigenvalue, the corresponding real
  90. *> eigenvector is computed if SELECT(j) is .TRUE..
  91. *> If w(j) and w(j+1) are the real and imaginary parts of a
  92. *> complex eigenvalue, the corresponding complex eigenvector is
  93. *> computed if either SELECT(j) or SELECT(j+1) is .TRUE., and
  94. *> on exit SELECT(j) is set to .TRUE. and SELECT(j+1) is set to
  95. *> .FALSE..
  96. *> Not referenced if HOWMNY = 'A' or 'B'.
  97. *> \endverbatim
  98. *>
  99. *> \param[in] N
  100. *> \verbatim
  101. *> N is INTEGER
  102. *> The order of the matrix T. N >= 0.
  103. *> \endverbatim
  104. *>
  105. *> \param[in] T
  106. *> \verbatim
  107. *> T is DOUBLE PRECISION array, dimension (LDT,N)
  108. *> The upper quasi-triangular matrix T in Schur canonical form.
  109. *> \endverbatim
  110. *>
  111. *> \param[in] LDT
  112. *> \verbatim
  113. *> LDT is INTEGER
  114. *> The leading dimension of the array T. LDT >= max(1,N).
  115. *> \endverbatim
  116. *>
  117. *> \param[in,out] VL
  118. *> \verbatim
  119. *> VL is DOUBLE PRECISION array, dimension (LDVL,MM)
  120. *> On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must
  121. *> contain an N-by-N matrix Q (usually the orthogonal matrix Q
  122. *> of Schur vectors returned by DHSEQR).
  123. *> On exit, if SIDE = 'L' or 'B', VL contains:
  124. *> if HOWMNY = 'A', the matrix Y of left eigenvectors of T;
  125. *> if HOWMNY = 'B', the matrix Q*Y;
  126. *> if HOWMNY = 'S', the left eigenvectors of T specified by
  127. *> SELECT, stored consecutively in the columns
  128. *> of VL, in the same order as their
  129. *> eigenvalues.
  130. *> A complex eigenvector corresponding to a complex eigenvalue
  131. *> is stored in two consecutive columns, the first holding the
  132. *> real part, and the second the imaginary part.
  133. *> Not referenced if SIDE = 'R'.
  134. *> \endverbatim
  135. *>
  136. *> \param[in] LDVL
  137. *> \verbatim
  138. *> LDVL is INTEGER
  139. *> The leading dimension of the array VL.
  140. *> LDVL >= 1, and if SIDE = 'L' or 'B', LDVL >= N.
  141. *> \endverbatim
  142. *>
  143. *> \param[in,out] VR
  144. *> \verbatim
  145. *> VR is DOUBLE PRECISION array, dimension (LDVR,MM)
  146. *> On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must
  147. *> contain an N-by-N matrix Q (usually the orthogonal matrix Q
  148. *> of Schur vectors returned by DHSEQR).
  149. *> On exit, if SIDE = 'R' or 'B', VR contains:
  150. *> if HOWMNY = 'A', the matrix X of right eigenvectors of T;
  151. *> if HOWMNY = 'B', the matrix Q*X;
  152. *> if HOWMNY = 'S', the right eigenvectors of T specified by
  153. *> SELECT, stored consecutively in the columns
  154. *> of VR, in the same order as their
  155. *> eigenvalues.
  156. *> A complex eigenvector corresponding to a complex eigenvalue
  157. *> is stored in two consecutive columns, the first holding the
  158. *> real part and the second the imaginary part.
  159. *> Not referenced if SIDE = 'L'.
  160. *> \endverbatim
  161. *>
  162. *> \param[in] LDVR
  163. *> \verbatim
  164. *> LDVR is INTEGER
  165. *> The leading dimension of the array VR.
  166. *> LDVR >= 1, and if SIDE = 'R' or 'B', LDVR >= N.
  167. *> \endverbatim
  168. *>
  169. *> \param[in] MM
  170. *> \verbatim
  171. *> MM is INTEGER
  172. *> The number of columns in the arrays VL and/or VR. MM >= M.
  173. *> \endverbatim
  174. *>
  175. *> \param[out] M
  176. *> \verbatim
  177. *> M is INTEGER
  178. *> The number of columns in the arrays VL and/or VR actually
  179. *> used to store the eigenvectors.
  180. *> If HOWMNY = 'A' or 'B', M is set to N.
  181. *> Each selected real eigenvector occupies one column and each
  182. *> selected complex eigenvector occupies two columns.
  183. *> \endverbatim
  184. *>
  185. *> \param[out] WORK
  186. *> \verbatim
  187. *> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
  188. *> \endverbatim
  189. *>
  190. *> \param[in] LWORK
  191. *> \verbatim
  192. *> LWORK is INTEGER
  193. *> The dimension of array WORK. LWORK >= max(1,3*N).
  194. *> For optimum performance, LWORK >= N + 2*N*NB, where NB is
  195. *> the optimal blocksize.
  196. *>
  197. *> If LWORK = -1, then a workspace query is assumed; the routine
  198. *> only calculates the optimal size of the WORK array, returns
  199. *> this value as the first entry of the WORK array, and no error
  200. *> message related to LWORK is issued by XERBLA.
  201. *> \endverbatim
  202. *>
  203. *> \param[out] INFO
  204. *> \verbatim
  205. *> INFO is INTEGER
  206. *> = 0: successful exit
  207. *> < 0: if INFO = -i, the i-th argument had an illegal value
  208. *> \endverbatim
  209. *
  210. * Authors:
  211. * ========
  212. *
  213. *> \author Univ. of Tennessee
  214. *> \author Univ. of California Berkeley
  215. *> \author Univ. of Colorado Denver
  216. *> \author NAG Ltd.
  217. *
  218. *> \date November 2017
  219. *
  220. * @precisions fortran d -> s
  221. *
  222. *> \ingroup doubleOTHERcomputational
  223. *
  224. *> \par Further Details:
  225. * =====================
  226. *>
  227. *> \verbatim
  228. *>
  229. *> The algorithm used in this program is basically backward (forward)
  230. *> substitution, with scaling to make the the code robust against
  231. *> possible overflow.
  232. *>
  233. *> Each eigenvector is normalized so that the element of largest
  234. *> magnitude has magnitude 1; here the magnitude of a complex number
  235. *> (x,y) is taken to be |x| + |y|.
  236. *> \endverbatim
  237. *>
  238. * =====================================================================
  239. SUBROUTINE DTREVC3( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL,
  240. $ VR, LDVR, MM, M, WORK, LWORK, INFO )
  241. IMPLICIT NONE
  242. *
  243. * -- LAPACK computational routine (version 3.8.0) --
  244. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  245. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  246. * November 2017
  247. *
  248. * .. Scalar Arguments ..
  249. CHARACTER HOWMNY, SIDE
  250. INTEGER INFO, LDT, LDVL, LDVR, LWORK, M, MM, N
  251. * ..
  252. * .. Array Arguments ..
  253. LOGICAL SELECT( * )
  254. DOUBLE PRECISION T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
  255. $ WORK( * )
  256. * ..
  257. *
  258. * =====================================================================
  259. *
  260. * .. Parameters ..
  261. DOUBLE PRECISION ZERO, ONE
  262. PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
  263. INTEGER NBMIN, NBMAX
  264. PARAMETER ( NBMIN = 8, NBMAX = 128 )
  265. * ..
  266. * .. Local Scalars ..
  267. LOGICAL ALLV, BOTHV, LEFTV, LQUERY, OVER, PAIR,
  268. $ RIGHTV, SOMEV
  269. INTEGER I, IERR, II, IP, IS, J, J1, J2, JNXT, K, KI,
  270. $ IV, MAXWRK, NB, KI2
  271. DOUBLE PRECISION BETA, BIGNUM, EMAX, OVFL, REC, REMAX, SCALE,
  272. $ SMIN, SMLNUM, ULP, UNFL, VCRIT, VMAX, WI, WR,
  273. $ XNORM
  274. * ..
  275. * .. External Functions ..
  276. LOGICAL LSAME
  277. INTEGER IDAMAX, ILAENV
  278. DOUBLE PRECISION DDOT, DLAMCH
  279. EXTERNAL LSAME, IDAMAX, ILAENV, DDOT, DLAMCH
  280. * ..
  281. * .. External Subroutines ..
  282. EXTERNAL DAXPY, DCOPY, DGEMV, DLALN2, DSCAL, XERBLA,
  283. $ DGEMM, DLASET, DLABAD, DLACPY
  284. * ..
  285. * .. Intrinsic Functions ..
  286. INTRINSIC ABS, MAX, SQRT
  287. * ..
  288. * .. Local Arrays ..
  289. DOUBLE PRECISION X( 2, 2 )
  290. INTEGER ISCOMPLEX( NBMAX )
  291. * ..
  292. * .. Executable Statements ..
  293. *
  294. * Decode and test the input parameters
  295. *
  296. BOTHV = LSAME( SIDE, 'B' )
  297. RIGHTV = LSAME( SIDE, 'R' ) .OR. BOTHV
  298. LEFTV = LSAME( SIDE, 'L' ) .OR. BOTHV
  299. *
  300. ALLV = LSAME( HOWMNY, 'A' )
  301. OVER = LSAME( HOWMNY, 'B' )
  302. SOMEV = LSAME( HOWMNY, 'S' )
  303. *
  304. INFO = 0
  305. NB = ILAENV( 1, 'DTREVC', SIDE // HOWMNY, N, -1, -1, -1 )
  306. MAXWRK = N + 2*N*NB
  307. WORK(1) = MAXWRK
  308. LQUERY = ( LWORK.EQ.-1 )
  309. IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
  310. INFO = -1
  311. ELSE IF( .NOT.ALLV .AND. .NOT.OVER .AND. .NOT.SOMEV ) THEN
  312. INFO = -2
  313. ELSE IF( N.LT.0 ) THEN
  314. INFO = -4
  315. ELSE IF( LDT.LT.MAX( 1, N ) ) THEN
  316. INFO = -6
  317. ELSE IF( LDVL.LT.1 .OR. ( LEFTV .AND. LDVL.LT.N ) ) THEN
  318. INFO = -8
  319. ELSE IF( LDVR.LT.1 .OR. ( RIGHTV .AND. LDVR.LT.N ) ) THEN
  320. INFO = -10
  321. ELSE IF( LWORK.LT.MAX( 1, 3*N ) .AND. .NOT.LQUERY ) THEN
  322. INFO = -14
  323. ELSE
  324. *
  325. * Set M to the number of columns required to store the selected
  326. * eigenvectors, standardize the array SELECT if necessary, and
  327. * test MM.
  328. *
  329. IF( SOMEV ) THEN
  330. M = 0
  331. PAIR = .FALSE.
  332. DO 10 J = 1, N
  333. IF( PAIR ) THEN
  334. PAIR = .FALSE.
  335. SELECT( J ) = .FALSE.
  336. ELSE
  337. IF( J.LT.N ) THEN
  338. IF( T( J+1, J ).EQ.ZERO ) THEN
  339. IF( SELECT( J ) )
  340. $ M = M + 1
  341. ELSE
  342. PAIR = .TRUE.
  343. IF( SELECT( J ) .OR. SELECT( J+1 ) ) THEN
  344. SELECT( J ) = .TRUE.
  345. M = M + 2
  346. END IF
  347. END IF
  348. ELSE
  349. IF( SELECT( N ) )
  350. $ M = M + 1
  351. END IF
  352. END IF
  353. 10 CONTINUE
  354. ELSE
  355. M = N
  356. END IF
  357. *
  358. IF( MM.LT.M ) THEN
  359. INFO = -11
  360. END IF
  361. END IF
  362. IF( INFO.NE.0 ) THEN
  363. CALL XERBLA( 'DTREVC3', -INFO )
  364. RETURN
  365. ELSE IF( LQUERY ) THEN
  366. RETURN
  367. END IF
  368. *
  369. * Quick return if possible.
  370. *
  371. IF( N.EQ.0 )
  372. $ RETURN
  373. *
  374. * Use blocked version of back-transformation if sufficient workspace.
  375. * Zero-out the workspace to avoid potential NaN propagation.
  376. *
  377. IF( OVER .AND. LWORK .GE. N + 2*N*NBMIN ) THEN
  378. NB = (LWORK - N) / (2*N)
  379. NB = MIN( NB, NBMAX )
  380. CALL DLASET( 'F', N, 1+2*NB, ZERO, ZERO, WORK, N )
  381. ELSE
  382. NB = 1
  383. END IF
  384. *
  385. * Set the constants to control overflow.
  386. *
  387. UNFL = DLAMCH( 'Safe minimum' )
  388. OVFL = ONE / UNFL
  389. CALL DLABAD( UNFL, OVFL )
  390. ULP = DLAMCH( 'Precision' )
  391. SMLNUM = UNFL*( N / ULP )
  392. BIGNUM = ( ONE-ULP ) / SMLNUM
  393. *
  394. * Compute 1-norm of each column of strictly upper triangular
  395. * part of T to control overflow in triangular solver.
  396. *
  397. WORK( 1 ) = ZERO
  398. DO 30 J = 2, N
  399. WORK( J ) = ZERO
  400. DO 20 I = 1, J - 1
  401. WORK( J ) = WORK( J ) + ABS( T( I, J ) )
  402. 20 CONTINUE
  403. 30 CONTINUE
  404. *
  405. * Index IP is used to specify the real or complex eigenvalue:
  406. * IP = 0, real eigenvalue,
  407. * 1, first of conjugate complex pair: (wr,wi)
  408. * -1, second of conjugate complex pair: (wr,wi)
  409. * ISCOMPLEX array stores IP for each column in current block.
  410. *
  411. IF( RIGHTV ) THEN
  412. *
  413. * ============================================================
  414. * Compute right eigenvectors.
  415. *
  416. * IV is index of column in current block.
  417. * For complex right vector, uses IV-1 for real part and IV for complex part.
  418. * Non-blocked version always uses IV=2;
  419. * blocked version starts with IV=NB, goes down to 1 or 2.
  420. * (Note the "0-th" column is used for 1-norms computed above.)
  421. IV = 2
  422. IF( NB.GT.2 ) THEN
  423. IV = NB
  424. END IF
  425. IP = 0
  426. IS = M
  427. DO 140 KI = N, 1, -1
  428. IF( IP.EQ.-1 ) THEN
  429. * previous iteration (ki+1) was second of conjugate pair,
  430. * so this ki is first of conjugate pair; skip to end of loop
  431. IP = 1
  432. GO TO 140
  433. ELSE IF( KI.EQ.1 ) THEN
  434. * last column, so this ki must be real eigenvalue
  435. IP = 0
  436. ELSE IF( T( KI, KI-1 ).EQ.ZERO ) THEN
  437. * zero on sub-diagonal, so this ki is real eigenvalue
  438. IP = 0
  439. ELSE
  440. * non-zero on sub-diagonal, so this ki is second of conjugate pair
  441. IP = -1
  442. END IF
  443. IF( SOMEV ) THEN
  444. IF( IP.EQ.0 ) THEN
  445. IF( .NOT.SELECT( KI ) )
  446. $ GO TO 140
  447. ELSE
  448. IF( .NOT.SELECT( KI-1 ) )
  449. $ GO TO 140
  450. END IF
  451. END IF
  452. *
  453. * Compute the KI-th eigenvalue (WR,WI).
  454. *
  455. WR = T( KI, KI )
  456. WI = ZERO
  457. IF( IP.NE.0 )
  458. $ WI = SQRT( ABS( T( KI, KI-1 ) ) )*
  459. $ SQRT( ABS( T( KI-1, KI ) ) )
  460. SMIN = MAX( ULP*( ABS( WR )+ABS( WI ) ), SMLNUM )
  461. *
  462. IF( IP.EQ.0 ) THEN
  463. *
  464. * --------------------------------------------------------
  465. * Real right eigenvector
  466. *
  467. WORK( KI + IV*N ) = ONE
  468. *
  469. * Form right-hand side.
  470. *
  471. DO 50 K = 1, KI - 1
  472. WORK( K + IV*N ) = -T( K, KI )
  473. 50 CONTINUE
  474. *
  475. * Solve upper quasi-triangular system:
  476. * [ T(1:KI-1,1:KI-1) - WR ]*X = SCALE*WORK.
  477. *
  478. JNXT = KI - 1
  479. DO 60 J = KI - 1, 1, -1
  480. IF( J.GT.JNXT )
  481. $ GO TO 60
  482. J1 = J
  483. J2 = J
  484. JNXT = J - 1
  485. IF( J.GT.1 ) THEN
  486. IF( T( J, J-1 ).NE.ZERO ) THEN
  487. J1 = J - 1
  488. JNXT = J - 2
  489. END IF
  490. END IF
  491. *
  492. IF( J1.EQ.J2 ) THEN
  493. *
  494. * 1-by-1 diagonal block
  495. *
  496. CALL DLALN2( .FALSE., 1, 1, SMIN, ONE, T( J, J ),
  497. $ LDT, ONE, ONE, WORK( J+IV*N ), N, WR,
  498. $ ZERO, X, 2, SCALE, XNORM, IERR )
  499. *
  500. * Scale X(1,1) to avoid overflow when updating
  501. * the right-hand side.
  502. *
  503. IF( XNORM.GT.ONE ) THEN
  504. IF( WORK( J ).GT.BIGNUM / XNORM ) THEN
  505. X( 1, 1 ) = X( 1, 1 ) / XNORM
  506. SCALE = SCALE / XNORM
  507. END IF
  508. END IF
  509. *
  510. * Scale if necessary
  511. *
  512. IF( SCALE.NE.ONE )
  513. $ CALL DSCAL( KI, SCALE, WORK( 1+IV*N ), 1 )
  514. WORK( J+IV*N ) = X( 1, 1 )
  515. *
  516. * Update right-hand side
  517. *
  518. CALL DAXPY( J-1, -X( 1, 1 ), T( 1, J ), 1,
  519. $ WORK( 1+IV*N ), 1 )
  520. *
  521. ELSE
  522. *
  523. * 2-by-2 diagonal block
  524. *
  525. CALL DLALN2( .FALSE., 2, 1, SMIN, ONE,
  526. $ T( J-1, J-1 ), LDT, ONE, ONE,
  527. $ WORK( J-1+IV*N ), N, WR, ZERO, X, 2,
  528. $ SCALE, XNORM, IERR )
  529. *
  530. * Scale X(1,1) and X(2,1) to avoid overflow when
  531. * updating the right-hand side.
  532. *
  533. IF( XNORM.GT.ONE ) THEN
  534. BETA = MAX( WORK( J-1 ), WORK( J ) )
  535. IF( BETA.GT.BIGNUM / XNORM ) THEN
  536. X( 1, 1 ) = X( 1, 1 ) / XNORM
  537. X( 2, 1 ) = X( 2, 1 ) / XNORM
  538. SCALE = SCALE / XNORM
  539. END IF
  540. END IF
  541. *
  542. * Scale if necessary
  543. *
  544. IF( SCALE.NE.ONE )
  545. $ CALL DSCAL( KI, SCALE, WORK( 1+IV*N ), 1 )
  546. WORK( J-1+IV*N ) = X( 1, 1 )
  547. WORK( J +IV*N ) = X( 2, 1 )
  548. *
  549. * Update right-hand side
  550. *
  551. CALL DAXPY( J-2, -X( 1, 1 ), T( 1, J-1 ), 1,
  552. $ WORK( 1+IV*N ), 1 )
  553. CALL DAXPY( J-2, -X( 2, 1 ), T( 1, J ), 1,
  554. $ WORK( 1+IV*N ), 1 )
  555. END IF
  556. 60 CONTINUE
  557. *
  558. * Copy the vector x or Q*x to VR and normalize.
  559. *
  560. IF( .NOT.OVER ) THEN
  561. * ------------------------------
  562. * no back-transform: copy x to VR and normalize.
  563. CALL DCOPY( KI, WORK( 1 + IV*N ), 1, VR( 1, IS ), 1 )
  564. *
  565. II = IDAMAX( KI, VR( 1, IS ), 1 )
  566. REMAX = ONE / ABS( VR( II, IS ) )
  567. CALL DSCAL( KI, REMAX, VR( 1, IS ), 1 )
  568. *
  569. DO 70 K = KI + 1, N
  570. VR( K, IS ) = ZERO
  571. 70 CONTINUE
  572. *
  573. ELSE IF( NB.EQ.1 ) THEN
  574. * ------------------------------
  575. * version 1: back-transform each vector with GEMV, Q*x.
  576. IF( KI.GT.1 )
  577. $ CALL DGEMV( 'N', N, KI-1, ONE, VR, LDVR,
  578. $ WORK( 1 + IV*N ), 1, WORK( KI + IV*N ),
  579. $ VR( 1, KI ), 1 )
  580. *
  581. II = IDAMAX( N, VR( 1, KI ), 1 )
  582. REMAX = ONE / ABS( VR( II, KI ) )
  583. CALL DSCAL( N, REMAX, VR( 1, KI ), 1 )
  584. *
  585. ELSE
  586. * ------------------------------
  587. * version 2: back-transform block of vectors with GEMM
  588. * zero out below vector
  589. DO K = KI + 1, N
  590. WORK( K + IV*N ) = ZERO
  591. END DO
  592. ISCOMPLEX( IV ) = IP
  593. * back-transform and normalization is done below
  594. END IF
  595. ELSE
  596. *
  597. * --------------------------------------------------------
  598. * Complex right eigenvector.
  599. *
  600. * Initial solve
  601. * [ ( T(KI-1,KI-1) T(KI-1,KI) ) - (WR + I*WI) ]*X = 0.
  602. * [ ( T(KI, KI-1) T(KI, KI) ) ]
  603. *
  604. IF( ABS( T( KI-1, KI ) ).GE.ABS( T( KI, KI-1 ) ) ) THEN
  605. WORK( KI-1 + (IV-1)*N ) = ONE
  606. WORK( KI + (IV )*N ) = WI / T( KI-1, KI )
  607. ELSE
  608. WORK( KI-1 + (IV-1)*N ) = -WI / T( KI, KI-1 )
  609. WORK( KI + (IV )*N ) = ONE
  610. END IF
  611. WORK( KI + (IV-1)*N ) = ZERO
  612. WORK( KI-1 + (IV )*N ) = ZERO
  613. *
  614. * Form right-hand side.
  615. *
  616. DO 80 K = 1, KI - 2
  617. WORK( K+(IV-1)*N ) = -WORK( KI-1+(IV-1)*N )*T(K,KI-1)
  618. WORK( K+(IV )*N ) = -WORK( KI +(IV )*N )*T(K,KI )
  619. 80 CONTINUE
  620. *
  621. * Solve upper quasi-triangular system:
  622. * [ T(1:KI-2,1:KI-2) - (WR+i*WI) ]*X = SCALE*(WORK+i*WORK2)
  623. *
  624. JNXT = KI - 2
  625. DO 90 J = KI - 2, 1, -1
  626. IF( J.GT.JNXT )
  627. $ GO TO 90
  628. J1 = J
  629. J2 = J
  630. JNXT = J - 1
  631. IF( J.GT.1 ) THEN
  632. IF( T( J, J-1 ).NE.ZERO ) THEN
  633. J1 = J - 1
  634. JNXT = J - 2
  635. END IF
  636. END IF
  637. *
  638. IF( J1.EQ.J2 ) THEN
  639. *
  640. * 1-by-1 diagonal block
  641. *
  642. CALL DLALN2( .FALSE., 1, 2, SMIN, ONE, T( J, J ),
  643. $ LDT, ONE, ONE, WORK( J+(IV-1)*N ), N,
  644. $ WR, WI, X, 2, SCALE, XNORM, IERR )
  645. *
  646. * Scale X(1,1) and X(1,2) to avoid overflow when
  647. * updating the right-hand side.
  648. *
  649. IF( XNORM.GT.ONE ) THEN
  650. IF( WORK( J ).GT.BIGNUM / XNORM ) THEN
  651. X( 1, 1 ) = X( 1, 1 ) / XNORM
  652. X( 1, 2 ) = X( 1, 2 ) / XNORM
  653. SCALE = SCALE / XNORM
  654. END IF
  655. END IF
  656. *
  657. * Scale if necessary
  658. *
  659. IF( SCALE.NE.ONE ) THEN
  660. CALL DSCAL( KI, SCALE, WORK( 1+(IV-1)*N ), 1 )
  661. CALL DSCAL( KI, SCALE, WORK( 1+(IV )*N ), 1 )
  662. END IF
  663. WORK( J+(IV-1)*N ) = X( 1, 1 )
  664. WORK( J+(IV )*N ) = X( 1, 2 )
  665. *
  666. * Update the right-hand side
  667. *
  668. CALL DAXPY( J-1, -X( 1, 1 ), T( 1, J ), 1,
  669. $ WORK( 1+(IV-1)*N ), 1 )
  670. CALL DAXPY( J-1, -X( 1, 2 ), T( 1, J ), 1,
  671. $ WORK( 1+(IV )*N ), 1 )
  672. *
  673. ELSE
  674. *
  675. * 2-by-2 diagonal block
  676. *
  677. CALL DLALN2( .FALSE., 2, 2, SMIN, ONE,
  678. $ T( J-1, J-1 ), LDT, ONE, ONE,
  679. $ WORK( J-1+(IV-1)*N ), N, WR, WI, X, 2,
  680. $ SCALE, XNORM, IERR )
  681. *
  682. * Scale X to avoid overflow when updating
  683. * the right-hand side.
  684. *
  685. IF( XNORM.GT.ONE ) THEN
  686. BETA = MAX( WORK( J-1 ), WORK( J ) )
  687. IF( BETA.GT.BIGNUM / XNORM ) THEN
  688. REC = ONE / XNORM
  689. X( 1, 1 ) = X( 1, 1 )*REC
  690. X( 1, 2 ) = X( 1, 2 )*REC
  691. X( 2, 1 ) = X( 2, 1 )*REC
  692. X( 2, 2 ) = X( 2, 2 )*REC
  693. SCALE = SCALE*REC
  694. END IF
  695. END IF
  696. *
  697. * Scale if necessary
  698. *
  699. IF( SCALE.NE.ONE ) THEN
  700. CALL DSCAL( KI, SCALE, WORK( 1+(IV-1)*N ), 1 )
  701. CALL DSCAL( KI, SCALE, WORK( 1+(IV )*N ), 1 )
  702. END IF
  703. WORK( J-1+(IV-1)*N ) = X( 1, 1 )
  704. WORK( J +(IV-1)*N ) = X( 2, 1 )
  705. WORK( J-1+(IV )*N ) = X( 1, 2 )
  706. WORK( J +(IV )*N ) = X( 2, 2 )
  707. *
  708. * Update the right-hand side
  709. *
  710. CALL DAXPY( J-2, -X( 1, 1 ), T( 1, J-1 ), 1,
  711. $ WORK( 1+(IV-1)*N ), 1 )
  712. CALL DAXPY( J-2, -X( 2, 1 ), T( 1, J ), 1,
  713. $ WORK( 1+(IV-1)*N ), 1 )
  714. CALL DAXPY( J-2, -X( 1, 2 ), T( 1, J-1 ), 1,
  715. $ WORK( 1+(IV )*N ), 1 )
  716. CALL DAXPY( J-2, -X( 2, 2 ), T( 1, J ), 1,
  717. $ WORK( 1+(IV )*N ), 1 )
  718. END IF
  719. 90 CONTINUE
  720. *
  721. * Copy the vector x or Q*x to VR and normalize.
  722. *
  723. IF( .NOT.OVER ) THEN
  724. * ------------------------------
  725. * no back-transform: copy x to VR and normalize.
  726. CALL DCOPY( KI, WORK( 1+(IV-1)*N ), 1, VR(1,IS-1), 1 )
  727. CALL DCOPY( KI, WORK( 1+(IV )*N ), 1, VR(1,IS ), 1 )
  728. *
  729. EMAX = ZERO
  730. DO 100 K = 1, KI
  731. EMAX = MAX( EMAX, ABS( VR( K, IS-1 ) )+
  732. $ ABS( VR( K, IS ) ) )
  733. 100 CONTINUE
  734. REMAX = ONE / EMAX
  735. CALL DSCAL( KI, REMAX, VR( 1, IS-1 ), 1 )
  736. CALL DSCAL( KI, REMAX, VR( 1, IS ), 1 )
  737. *
  738. DO 110 K = KI + 1, N
  739. VR( K, IS-1 ) = ZERO
  740. VR( K, IS ) = ZERO
  741. 110 CONTINUE
  742. *
  743. ELSE IF( NB.EQ.1 ) THEN
  744. * ------------------------------
  745. * version 1: back-transform each vector with GEMV, Q*x.
  746. IF( KI.GT.2 ) THEN
  747. CALL DGEMV( 'N', N, KI-2, ONE, VR, LDVR,
  748. $ WORK( 1 + (IV-1)*N ), 1,
  749. $ WORK( KI-1 + (IV-1)*N ), VR(1,KI-1), 1)
  750. CALL DGEMV( 'N', N, KI-2, ONE, VR, LDVR,
  751. $ WORK( 1 + (IV)*N ), 1,
  752. $ WORK( KI + (IV)*N ), VR( 1, KI ), 1 )
  753. ELSE
  754. CALL DSCAL( N, WORK(KI-1+(IV-1)*N), VR(1,KI-1), 1)
  755. CALL DSCAL( N, WORK(KI +(IV )*N), VR(1,KI ), 1)
  756. END IF
  757. *
  758. EMAX = ZERO
  759. DO 120 K = 1, N
  760. EMAX = MAX( EMAX, ABS( VR( K, KI-1 ) )+
  761. $ ABS( VR( K, KI ) ) )
  762. 120 CONTINUE
  763. REMAX = ONE / EMAX
  764. CALL DSCAL( N, REMAX, VR( 1, KI-1 ), 1 )
  765. CALL DSCAL( N, REMAX, VR( 1, KI ), 1 )
  766. *
  767. ELSE
  768. * ------------------------------
  769. * version 2: back-transform block of vectors with GEMM
  770. * zero out below vector
  771. DO K = KI + 1, N
  772. WORK( K + (IV-1)*N ) = ZERO
  773. WORK( K + (IV )*N ) = ZERO
  774. END DO
  775. ISCOMPLEX( IV-1 ) = -IP
  776. ISCOMPLEX( IV ) = IP
  777. IV = IV - 1
  778. * back-transform and normalization is done below
  779. END IF
  780. END IF
  781. IF( NB.GT.1 ) THEN
  782. * --------------------------------------------------------
  783. * Blocked version of back-transform
  784. * For complex case, KI2 includes both vectors (KI-1 and KI)
  785. IF( IP.EQ.0 ) THEN
  786. KI2 = KI
  787. ELSE
  788. KI2 = KI - 1
  789. END IF
  790. * Columns IV:NB of work are valid vectors.
  791. * When the number of vectors stored reaches NB-1 or NB,
  792. * or if this was last vector, do the GEMM
  793. IF( (IV.LE.2) .OR. (KI2.EQ.1) ) THEN
  794. CALL DGEMM( 'N', 'N', N, NB-IV+1, KI2+NB-IV, ONE,
  795. $ VR, LDVR,
  796. $ WORK( 1 + (IV)*N ), N,
  797. $ ZERO,
  798. $ WORK( 1 + (NB+IV)*N ), N )
  799. * normalize vectors
  800. DO K = IV, NB
  801. IF( ISCOMPLEX(K).EQ.0 ) THEN
  802. * real eigenvector
  803. II = IDAMAX( N, WORK( 1 + (NB+K)*N ), 1 )
  804. REMAX = ONE / ABS( WORK( II + (NB+K)*N ) )
  805. ELSE IF( ISCOMPLEX(K).EQ.1 ) THEN
  806. * first eigenvector of conjugate pair
  807. EMAX = ZERO
  808. DO II = 1, N
  809. EMAX = MAX( EMAX,
  810. $ ABS( WORK( II + (NB+K )*N ) )+
  811. $ ABS( WORK( II + (NB+K+1)*N ) ) )
  812. END DO
  813. REMAX = ONE / EMAX
  814. * else if ISCOMPLEX(K).EQ.-1
  815. * second eigenvector of conjugate pair
  816. * reuse same REMAX as previous K
  817. END IF
  818. CALL DSCAL( N, REMAX, WORK( 1 + (NB+K)*N ), 1 )
  819. END DO
  820. CALL DLACPY( 'F', N, NB-IV+1,
  821. $ WORK( 1 + (NB+IV)*N ), N,
  822. $ VR( 1, KI2 ), LDVR )
  823. IV = NB
  824. ELSE
  825. IV = IV - 1
  826. END IF
  827. END IF ! blocked back-transform
  828. *
  829. IS = IS - 1
  830. IF( IP.NE.0 )
  831. $ IS = IS - 1
  832. 140 CONTINUE
  833. END IF
  834. IF( LEFTV ) THEN
  835. *
  836. * ============================================================
  837. * Compute left eigenvectors.
  838. *
  839. * IV is index of column in current block.
  840. * For complex left vector, uses IV for real part and IV+1 for complex part.
  841. * Non-blocked version always uses IV=1;
  842. * blocked version starts with IV=1, goes up to NB-1 or NB.
  843. * (Note the "0-th" column is used for 1-norms computed above.)
  844. IV = 1
  845. IP = 0
  846. IS = 1
  847. DO 260 KI = 1, N
  848. IF( IP.EQ.1 ) THEN
  849. * previous iteration (ki-1) was first of conjugate pair,
  850. * so this ki is second of conjugate pair; skip to end of loop
  851. IP = -1
  852. GO TO 260
  853. ELSE IF( KI.EQ.N ) THEN
  854. * last column, so this ki must be real eigenvalue
  855. IP = 0
  856. ELSE IF( T( KI+1, KI ).EQ.ZERO ) THEN
  857. * zero on sub-diagonal, so this ki is real eigenvalue
  858. IP = 0
  859. ELSE
  860. * non-zero on sub-diagonal, so this ki is first of conjugate pair
  861. IP = 1
  862. END IF
  863. *
  864. IF( SOMEV ) THEN
  865. IF( .NOT.SELECT( KI ) )
  866. $ GO TO 260
  867. END IF
  868. *
  869. * Compute the KI-th eigenvalue (WR,WI).
  870. *
  871. WR = T( KI, KI )
  872. WI = ZERO
  873. IF( IP.NE.0 )
  874. $ WI = SQRT( ABS( T( KI, KI+1 ) ) )*
  875. $ SQRT( ABS( T( KI+1, KI ) ) )
  876. SMIN = MAX( ULP*( ABS( WR )+ABS( WI ) ), SMLNUM )
  877. *
  878. IF( IP.EQ.0 ) THEN
  879. *
  880. * --------------------------------------------------------
  881. * Real left eigenvector
  882. *
  883. WORK( KI + IV*N ) = ONE
  884. *
  885. * Form right-hand side.
  886. *
  887. DO 160 K = KI + 1, N
  888. WORK( K + IV*N ) = -T( KI, K )
  889. 160 CONTINUE
  890. *
  891. * Solve transposed quasi-triangular system:
  892. * [ T(KI+1:N,KI+1:N) - WR ]**T * X = SCALE*WORK
  893. *
  894. VMAX = ONE
  895. VCRIT = BIGNUM
  896. *
  897. JNXT = KI + 1
  898. DO 170 J = KI + 1, N
  899. IF( J.LT.JNXT )
  900. $ GO TO 170
  901. J1 = J
  902. J2 = J
  903. JNXT = J + 1
  904. IF( J.LT.N ) THEN
  905. IF( T( J+1, J ).NE.ZERO ) THEN
  906. J2 = J + 1
  907. JNXT = J + 2
  908. END IF
  909. END IF
  910. *
  911. IF( J1.EQ.J2 ) THEN
  912. *
  913. * 1-by-1 diagonal block
  914. *
  915. * Scale if necessary to avoid overflow when forming
  916. * the right-hand side.
  917. *
  918. IF( WORK( J ).GT.VCRIT ) THEN
  919. REC = ONE / VMAX
  920. CALL DSCAL( N-KI+1, REC, WORK( KI+IV*N ), 1 )
  921. VMAX = ONE
  922. VCRIT = BIGNUM
  923. END IF
  924. *
  925. WORK( J+IV*N ) = WORK( J+IV*N ) -
  926. $ DDOT( J-KI-1, T( KI+1, J ), 1,
  927. $ WORK( KI+1+IV*N ), 1 )
  928. *
  929. * Solve [ T(J,J) - WR ]**T * X = WORK
  930. *
  931. CALL DLALN2( .FALSE., 1, 1, SMIN, ONE, T( J, J ),
  932. $ LDT, ONE, ONE, WORK( J+IV*N ), N, WR,
  933. $ ZERO, X, 2, SCALE, XNORM, IERR )
  934. *
  935. * Scale if necessary
  936. *
  937. IF( SCALE.NE.ONE )
  938. $ CALL DSCAL( N-KI+1, SCALE, WORK( KI+IV*N ), 1 )
  939. WORK( J+IV*N ) = X( 1, 1 )
  940. VMAX = MAX( ABS( WORK( J+IV*N ) ), VMAX )
  941. VCRIT = BIGNUM / VMAX
  942. *
  943. ELSE
  944. *
  945. * 2-by-2 diagonal block
  946. *
  947. * Scale if necessary to avoid overflow when forming
  948. * the right-hand side.
  949. *
  950. BETA = MAX( WORK( J ), WORK( J+1 ) )
  951. IF( BETA.GT.VCRIT ) THEN
  952. REC = ONE / VMAX
  953. CALL DSCAL( N-KI+1, REC, WORK( KI+IV*N ), 1 )
  954. VMAX = ONE
  955. VCRIT = BIGNUM
  956. END IF
  957. *
  958. WORK( J+IV*N ) = WORK( J+IV*N ) -
  959. $ DDOT( J-KI-1, T( KI+1, J ), 1,
  960. $ WORK( KI+1+IV*N ), 1 )
  961. *
  962. WORK( J+1+IV*N ) = WORK( J+1+IV*N ) -
  963. $ DDOT( J-KI-1, T( KI+1, J+1 ), 1,
  964. $ WORK( KI+1+IV*N ), 1 )
  965. *
  966. * Solve
  967. * [ T(J,J)-WR T(J,J+1) ]**T * X = SCALE*( WORK1 )
  968. * [ T(J+1,J) T(J+1,J+1)-WR ] ( WORK2 )
  969. *
  970. CALL DLALN2( .TRUE., 2, 1, SMIN, ONE, T( J, J ),
  971. $ LDT, ONE, ONE, WORK( J+IV*N ), N, WR,
  972. $ ZERO, X, 2, SCALE, XNORM, IERR )
  973. *
  974. * Scale if necessary
  975. *
  976. IF( SCALE.NE.ONE )
  977. $ CALL DSCAL( N-KI+1, SCALE, WORK( KI+IV*N ), 1 )
  978. WORK( J +IV*N ) = X( 1, 1 )
  979. WORK( J+1+IV*N ) = X( 2, 1 )
  980. *
  981. VMAX = MAX( ABS( WORK( J +IV*N ) ),
  982. $ ABS( WORK( J+1+IV*N ) ), VMAX )
  983. VCRIT = BIGNUM / VMAX
  984. *
  985. END IF
  986. 170 CONTINUE
  987. *
  988. * Copy the vector x or Q*x to VL and normalize.
  989. *
  990. IF( .NOT.OVER ) THEN
  991. * ------------------------------
  992. * no back-transform: copy x to VL and normalize.
  993. CALL DCOPY( N-KI+1, WORK( KI + IV*N ), 1,
  994. $ VL( KI, IS ), 1 )
  995. *
  996. II = IDAMAX( N-KI+1, VL( KI, IS ), 1 ) + KI - 1
  997. REMAX = ONE / ABS( VL( II, IS ) )
  998. CALL DSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
  999. *
  1000. DO 180 K = 1, KI - 1
  1001. VL( K, IS ) = ZERO
  1002. 180 CONTINUE
  1003. *
  1004. ELSE IF( NB.EQ.1 ) THEN
  1005. * ------------------------------
  1006. * version 1: back-transform each vector with GEMV, Q*x.
  1007. IF( KI.LT.N )
  1008. $ CALL DGEMV( 'N', N, N-KI, ONE,
  1009. $ VL( 1, KI+1 ), LDVL,
  1010. $ WORK( KI+1 + IV*N ), 1,
  1011. $ WORK( KI + IV*N ), VL( 1, KI ), 1 )
  1012. *
  1013. II = IDAMAX( N, VL( 1, KI ), 1 )
  1014. REMAX = ONE / ABS( VL( II, KI ) )
  1015. CALL DSCAL( N, REMAX, VL( 1, KI ), 1 )
  1016. *
  1017. ELSE
  1018. * ------------------------------
  1019. * version 2: back-transform block of vectors with GEMM
  1020. * zero out above vector
  1021. * could go from KI-NV+1 to KI-1
  1022. DO K = 1, KI - 1
  1023. WORK( K + IV*N ) = ZERO
  1024. END DO
  1025. ISCOMPLEX( IV ) = IP
  1026. * back-transform and normalization is done below
  1027. END IF
  1028. ELSE
  1029. *
  1030. * --------------------------------------------------------
  1031. * Complex left eigenvector.
  1032. *
  1033. * Initial solve:
  1034. * [ ( T(KI,KI) T(KI,KI+1) )**T - (WR - I* WI) ]*X = 0.
  1035. * [ ( T(KI+1,KI) T(KI+1,KI+1) ) ]
  1036. *
  1037. IF( ABS( T( KI, KI+1 ) ).GE.ABS( T( KI+1, KI ) ) ) THEN
  1038. WORK( KI + (IV )*N ) = WI / T( KI, KI+1 )
  1039. WORK( KI+1 + (IV+1)*N ) = ONE
  1040. ELSE
  1041. WORK( KI + (IV )*N ) = ONE
  1042. WORK( KI+1 + (IV+1)*N ) = -WI / T( KI+1, KI )
  1043. END IF
  1044. WORK( KI+1 + (IV )*N ) = ZERO
  1045. WORK( KI + (IV+1)*N ) = ZERO
  1046. *
  1047. * Form right-hand side.
  1048. *
  1049. DO 190 K = KI + 2, N
  1050. WORK( K+(IV )*N ) = -WORK( KI +(IV )*N )*T(KI, K)
  1051. WORK( K+(IV+1)*N ) = -WORK( KI+1+(IV+1)*N )*T(KI+1,K)
  1052. 190 CONTINUE
  1053. *
  1054. * Solve transposed quasi-triangular system:
  1055. * [ T(KI+2:N,KI+2:N)**T - (WR-i*WI) ]*X = WORK1+i*WORK2
  1056. *
  1057. VMAX = ONE
  1058. VCRIT = BIGNUM
  1059. *
  1060. JNXT = KI + 2
  1061. DO 200 J = KI + 2, N
  1062. IF( J.LT.JNXT )
  1063. $ GO TO 200
  1064. J1 = J
  1065. J2 = J
  1066. JNXT = J + 1
  1067. IF( J.LT.N ) THEN
  1068. IF( T( J+1, J ).NE.ZERO ) THEN
  1069. J2 = J + 1
  1070. JNXT = J + 2
  1071. END IF
  1072. END IF
  1073. *
  1074. IF( J1.EQ.J2 ) THEN
  1075. *
  1076. * 1-by-1 diagonal block
  1077. *
  1078. * Scale if necessary to avoid overflow when
  1079. * forming the right-hand side elements.
  1080. *
  1081. IF( WORK( J ).GT.VCRIT ) THEN
  1082. REC = ONE / VMAX
  1083. CALL DSCAL( N-KI+1, REC, WORK(KI+(IV )*N), 1 )
  1084. CALL DSCAL( N-KI+1, REC, WORK(KI+(IV+1)*N), 1 )
  1085. VMAX = ONE
  1086. VCRIT = BIGNUM
  1087. END IF
  1088. *
  1089. WORK( J+(IV )*N ) = WORK( J+(IV)*N ) -
  1090. $ DDOT( J-KI-2, T( KI+2, J ), 1,
  1091. $ WORK( KI+2+(IV)*N ), 1 )
  1092. WORK( J+(IV+1)*N ) = WORK( J+(IV+1)*N ) -
  1093. $ DDOT( J-KI-2, T( KI+2, J ), 1,
  1094. $ WORK( KI+2+(IV+1)*N ), 1 )
  1095. *
  1096. * Solve [ T(J,J)-(WR-i*WI) ]*(X11+i*X12)= WK+I*WK2
  1097. *
  1098. CALL DLALN2( .FALSE., 1, 2, SMIN, ONE, T( J, J ),
  1099. $ LDT, ONE, ONE, WORK( J+IV*N ), N, WR,
  1100. $ -WI, X, 2, SCALE, XNORM, IERR )
  1101. *
  1102. * Scale if necessary
  1103. *
  1104. IF( SCALE.NE.ONE ) THEN
  1105. CALL DSCAL( N-KI+1, SCALE, WORK(KI+(IV )*N), 1)
  1106. CALL DSCAL( N-KI+1, SCALE, WORK(KI+(IV+1)*N), 1)
  1107. END IF
  1108. WORK( J+(IV )*N ) = X( 1, 1 )
  1109. WORK( J+(IV+1)*N ) = X( 1, 2 )
  1110. VMAX = MAX( ABS( WORK( J+(IV )*N ) ),
  1111. $ ABS( WORK( J+(IV+1)*N ) ), VMAX )
  1112. VCRIT = BIGNUM / VMAX
  1113. *
  1114. ELSE
  1115. *
  1116. * 2-by-2 diagonal block
  1117. *
  1118. * Scale if necessary to avoid overflow when forming
  1119. * the right-hand side elements.
  1120. *
  1121. BETA = MAX( WORK( J ), WORK( J+1 ) )
  1122. IF( BETA.GT.VCRIT ) THEN
  1123. REC = ONE / VMAX
  1124. CALL DSCAL( N-KI+1, REC, WORK(KI+(IV )*N), 1 )
  1125. CALL DSCAL( N-KI+1, REC, WORK(KI+(IV+1)*N), 1 )
  1126. VMAX = ONE
  1127. VCRIT = BIGNUM
  1128. END IF
  1129. *
  1130. WORK( J +(IV )*N ) = WORK( J+(IV)*N ) -
  1131. $ DDOT( J-KI-2, T( KI+2, J ), 1,
  1132. $ WORK( KI+2+(IV)*N ), 1 )
  1133. *
  1134. WORK( J +(IV+1)*N ) = WORK( J+(IV+1)*N ) -
  1135. $ DDOT( J-KI-2, T( KI+2, J ), 1,
  1136. $ WORK( KI+2+(IV+1)*N ), 1 )
  1137. *
  1138. WORK( J+1+(IV )*N ) = WORK( J+1+(IV)*N ) -
  1139. $ DDOT( J-KI-2, T( KI+2, J+1 ), 1,
  1140. $ WORK( KI+2+(IV)*N ), 1 )
  1141. *
  1142. WORK( J+1+(IV+1)*N ) = WORK( J+1+(IV+1)*N ) -
  1143. $ DDOT( J-KI-2, T( KI+2, J+1 ), 1,
  1144. $ WORK( KI+2+(IV+1)*N ), 1 )
  1145. *
  1146. * Solve 2-by-2 complex linear equation
  1147. * [ (T(j,j) T(j,j+1) )**T - (wr-i*wi)*I ]*X = SCALE*B
  1148. * [ (T(j+1,j) T(j+1,j+1)) ]
  1149. *
  1150. CALL DLALN2( .TRUE., 2, 2, SMIN, ONE, T( J, J ),
  1151. $ LDT, ONE, ONE, WORK( J+IV*N ), N, WR,
  1152. $ -WI, X, 2, SCALE, XNORM, IERR )
  1153. *
  1154. * Scale if necessary
  1155. *
  1156. IF( SCALE.NE.ONE ) THEN
  1157. CALL DSCAL( N-KI+1, SCALE, WORK(KI+(IV )*N), 1)
  1158. CALL DSCAL( N-KI+1, SCALE, WORK(KI+(IV+1)*N), 1)
  1159. END IF
  1160. WORK( J +(IV )*N ) = X( 1, 1 )
  1161. WORK( J +(IV+1)*N ) = X( 1, 2 )
  1162. WORK( J+1+(IV )*N ) = X( 2, 1 )
  1163. WORK( J+1+(IV+1)*N ) = X( 2, 2 )
  1164. VMAX = MAX( ABS( X( 1, 1 ) ), ABS( X( 1, 2 ) ),
  1165. $ ABS( X( 2, 1 ) ), ABS( X( 2, 2 ) ),
  1166. $ VMAX )
  1167. VCRIT = BIGNUM / VMAX
  1168. *
  1169. END IF
  1170. 200 CONTINUE
  1171. *
  1172. * Copy the vector x or Q*x to VL and normalize.
  1173. *
  1174. IF( .NOT.OVER ) THEN
  1175. * ------------------------------
  1176. * no back-transform: copy x to VL and normalize.
  1177. CALL DCOPY( N-KI+1, WORK( KI + (IV )*N ), 1,
  1178. $ VL( KI, IS ), 1 )
  1179. CALL DCOPY( N-KI+1, WORK( KI + (IV+1)*N ), 1,
  1180. $ VL( KI, IS+1 ), 1 )
  1181. *
  1182. EMAX = ZERO
  1183. DO 220 K = KI, N
  1184. EMAX = MAX( EMAX, ABS( VL( K, IS ) )+
  1185. $ ABS( VL( K, IS+1 ) ) )
  1186. 220 CONTINUE
  1187. REMAX = ONE / EMAX
  1188. CALL DSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
  1189. CALL DSCAL( N-KI+1, REMAX, VL( KI, IS+1 ), 1 )
  1190. *
  1191. DO 230 K = 1, KI - 1
  1192. VL( K, IS ) = ZERO
  1193. VL( K, IS+1 ) = ZERO
  1194. 230 CONTINUE
  1195. *
  1196. ELSE IF( NB.EQ.1 ) THEN
  1197. * ------------------------------
  1198. * version 1: back-transform each vector with GEMV, Q*x.
  1199. IF( KI.LT.N-1 ) THEN
  1200. CALL DGEMV( 'N', N, N-KI-1, ONE,
  1201. $ VL( 1, KI+2 ), LDVL,
  1202. $ WORK( KI+2 + (IV)*N ), 1,
  1203. $ WORK( KI + (IV)*N ),
  1204. $ VL( 1, KI ), 1 )
  1205. CALL DGEMV( 'N', N, N-KI-1, ONE,
  1206. $ VL( 1, KI+2 ), LDVL,
  1207. $ WORK( KI+2 + (IV+1)*N ), 1,
  1208. $ WORK( KI+1 + (IV+1)*N ),
  1209. $ VL( 1, KI+1 ), 1 )
  1210. ELSE
  1211. CALL DSCAL( N, WORK(KI+ (IV )*N), VL(1, KI ), 1)
  1212. CALL DSCAL( N, WORK(KI+1+(IV+1)*N), VL(1, KI+1), 1)
  1213. END IF
  1214. *
  1215. EMAX = ZERO
  1216. DO 240 K = 1, N
  1217. EMAX = MAX( EMAX, ABS( VL( K, KI ) )+
  1218. $ ABS( VL( K, KI+1 ) ) )
  1219. 240 CONTINUE
  1220. REMAX = ONE / EMAX
  1221. CALL DSCAL( N, REMAX, VL( 1, KI ), 1 )
  1222. CALL DSCAL( N, REMAX, VL( 1, KI+1 ), 1 )
  1223. *
  1224. ELSE
  1225. * ------------------------------
  1226. * version 2: back-transform block of vectors with GEMM
  1227. * zero out above vector
  1228. * could go from KI-NV+1 to KI-1
  1229. DO K = 1, KI - 1
  1230. WORK( K + (IV )*N ) = ZERO
  1231. WORK( K + (IV+1)*N ) = ZERO
  1232. END DO
  1233. ISCOMPLEX( IV ) = IP
  1234. ISCOMPLEX( IV+1 ) = -IP
  1235. IV = IV + 1
  1236. * back-transform and normalization is done below
  1237. END IF
  1238. END IF
  1239. IF( NB.GT.1 ) THEN
  1240. * --------------------------------------------------------
  1241. * Blocked version of back-transform
  1242. * For complex case, KI2 includes both vectors (KI and KI+1)
  1243. IF( IP.EQ.0 ) THEN
  1244. KI2 = KI
  1245. ELSE
  1246. KI2 = KI + 1
  1247. END IF
  1248. * Columns 1:IV of work are valid vectors.
  1249. * When the number of vectors stored reaches NB-1 or NB,
  1250. * or if this was last vector, do the GEMM
  1251. IF( (IV.GE.NB-1) .OR. (KI2.EQ.N) ) THEN
  1252. CALL DGEMM( 'N', 'N', N, IV, N-KI2+IV, ONE,
  1253. $ VL( 1, KI2-IV+1 ), LDVL,
  1254. $ WORK( KI2-IV+1 + (1)*N ), N,
  1255. $ ZERO,
  1256. $ WORK( 1 + (NB+1)*N ), N )
  1257. * normalize vectors
  1258. DO K = 1, IV
  1259. IF( ISCOMPLEX(K).EQ.0) THEN
  1260. * real eigenvector
  1261. II = IDAMAX( N, WORK( 1 + (NB+K)*N ), 1 )
  1262. REMAX = ONE / ABS( WORK( II + (NB+K)*N ) )
  1263. ELSE IF( ISCOMPLEX(K).EQ.1) THEN
  1264. * first eigenvector of conjugate pair
  1265. EMAX = ZERO
  1266. DO II = 1, N
  1267. EMAX = MAX( EMAX,
  1268. $ ABS( WORK( II + (NB+K )*N ) )+
  1269. $ ABS( WORK( II + (NB+K+1)*N ) ) )
  1270. END DO
  1271. REMAX = ONE / EMAX
  1272. * else if ISCOMPLEX(K).EQ.-1
  1273. * second eigenvector of conjugate pair
  1274. * reuse same REMAX as previous K
  1275. END IF
  1276. CALL DSCAL( N, REMAX, WORK( 1 + (NB+K)*N ), 1 )
  1277. END DO
  1278. CALL DLACPY( 'F', N, IV,
  1279. $ WORK( 1 + (NB+1)*N ), N,
  1280. $ VL( 1, KI2-IV+1 ), LDVL )
  1281. IV = 1
  1282. ELSE
  1283. IV = IV + 1
  1284. END IF
  1285. END IF ! blocked back-transform
  1286. *
  1287. IS = IS + 1
  1288. IF( IP.NE.0 )
  1289. $ IS = IS + 1
  1290. 260 CONTINUE
  1291. END IF
  1292. *
  1293. RETURN
  1294. *
  1295. * End of DTREVC3
  1296. *
  1297. END