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.

chbtrd.f 22 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. *> \brief \b CHBTRD
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download CHBTRD + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/chbtrd.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/chbtrd.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/chbtrd.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * SUBROUTINE CHBTRD( VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ,
  22. * WORK, INFO )
  23. *
  24. * .. Scalar Arguments ..
  25. * CHARACTER UPLO, VECT
  26. * INTEGER INFO, KD, LDAB, LDQ, N
  27. * ..
  28. * .. Array Arguments ..
  29. * REAL D( * ), E( * )
  30. * COMPLEX AB( LDAB, * ), Q( LDQ, * ), WORK( * )
  31. * ..
  32. *
  33. *
  34. *> \par Purpose:
  35. * =============
  36. *>
  37. *> \verbatim
  38. *>
  39. *> CHBTRD reduces a complex Hermitian band matrix A to real symmetric
  40. *> tridiagonal form T by a unitary similarity transformation:
  41. *> Q**H * A * Q = T.
  42. *> \endverbatim
  43. *
  44. * Arguments:
  45. * ==========
  46. *
  47. *> \param[in] VECT
  48. *> \verbatim
  49. *> VECT is CHARACTER*1
  50. *> = 'N': do not form Q;
  51. *> = 'V': form Q;
  52. *> = 'U': update a matrix X, by forming X*Q.
  53. *> \endverbatim
  54. *>
  55. *> \param[in] UPLO
  56. *> \verbatim
  57. *> UPLO is CHARACTER*1
  58. *> = 'U': Upper triangle of A is stored;
  59. *> = 'L': Lower triangle of A is stored.
  60. *> \endverbatim
  61. *>
  62. *> \param[in] N
  63. *> \verbatim
  64. *> N is INTEGER
  65. *> The order of the matrix A. N >= 0.
  66. *> \endverbatim
  67. *>
  68. *> \param[in] KD
  69. *> \verbatim
  70. *> KD is INTEGER
  71. *> The number of superdiagonals of the matrix A if UPLO = 'U',
  72. *> or the number of subdiagonals if UPLO = 'L'. KD >= 0.
  73. *> \endverbatim
  74. *>
  75. *> \param[in,out] AB
  76. *> \verbatim
  77. *> AB is COMPLEX array, dimension (LDAB,N)
  78. *> On entry, the upper or lower triangle of the Hermitian band
  79. *> matrix A, stored in the first KD+1 rows of the array. The
  80. *> j-th column of A is stored in the j-th column of the array AB
  81. *> as follows:
  82. *> if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
  83. *> if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd).
  84. *> On exit, the diagonal elements of AB are overwritten by the
  85. *> diagonal elements of the tridiagonal matrix T; if KD > 0, the
  86. *> elements on the first superdiagonal (if UPLO = 'U') or the
  87. *> first subdiagonal (if UPLO = 'L') are overwritten by the
  88. *> off-diagonal elements of T; the rest of AB is overwritten by
  89. *> values generated during the reduction.
  90. *> \endverbatim
  91. *>
  92. *> \param[in] LDAB
  93. *> \verbatim
  94. *> LDAB is INTEGER
  95. *> The leading dimension of the array AB. LDAB >= KD+1.
  96. *> \endverbatim
  97. *>
  98. *> \param[out] D
  99. *> \verbatim
  100. *> D is REAL array, dimension (N)
  101. *> The diagonal elements of the tridiagonal matrix T.
  102. *> \endverbatim
  103. *>
  104. *> \param[out] E
  105. *> \verbatim
  106. *> E is REAL array, dimension (N-1)
  107. *> The off-diagonal elements of the tridiagonal matrix T:
  108. *> E(i) = T(i,i+1) if UPLO = 'U'; E(i) = T(i+1,i) if UPLO = 'L'.
  109. *> \endverbatim
  110. *>
  111. *> \param[in,out] Q
  112. *> \verbatim
  113. *> Q is COMPLEX array, dimension (LDQ,N)
  114. *> On entry, if VECT = 'U', then Q must contain an N-by-N
  115. *> matrix X; if VECT = 'N' or 'V', then Q need not be set.
  116. *>
  117. *> On exit:
  118. *> if VECT = 'V', Q contains the N-by-N unitary matrix Q;
  119. *> if VECT = 'U', Q contains the product X*Q;
  120. *> if VECT = 'N', the array Q is not referenced.
  121. *> \endverbatim
  122. *>
  123. *> \param[in] LDQ
  124. *> \verbatim
  125. *> LDQ is INTEGER
  126. *> The leading dimension of the array Q.
  127. *> LDQ >= 1, and LDQ >= N if VECT = 'V' or 'U'.
  128. *> \endverbatim
  129. *>
  130. *> \param[out] WORK
  131. *> \verbatim
  132. *> WORK is COMPLEX array, dimension (N)
  133. *> \endverbatim
  134. *>
  135. *> \param[out] INFO
  136. *> \verbatim
  137. *> INFO is INTEGER
  138. *> = 0: successful exit
  139. *> < 0: if INFO = -i, the i-th argument had an illegal value
  140. *> \endverbatim
  141. *
  142. * Authors:
  143. * ========
  144. *
  145. *> \author Univ. of Tennessee
  146. *> \author Univ. of California Berkeley
  147. *> \author Univ. of Colorado Denver
  148. *> \author NAG Ltd.
  149. *
  150. *> \date November 2011
  151. *
  152. *> \ingroup complexOTHERcomputational
  153. *
  154. *> \par Further Details:
  155. * =====================
  156. *>
  157. *> \verbatim
  158. *>
  159. *> Modified by Linda Kaufman, Bell Labs.
  160. *> \endverbatim
  161. *>
  162. * =====================================================================
  163. SUBROUTINE CHBTRD( VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ,
  164. $ WORK, INFO )
  165. *
  166. * -- LAPACK computational routine (version 3.4.0) --
  167. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  168. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  169. * November 2011
  170. *
  171. * .. Scalar Arguments ..
  172. CHARACTER UPLO, VECT
  173. INTEGER INFO, KD, LDAB, LDQ, N
  174. * ..
  175. * .. Array Arguments ..
  176. REAL D( * ), E( * )
  177. COMPLEX AB( LDAB, * ), Q( LDQ, * ), WORK( * )
  178. * ..
  179. *
  180. * =====================================================================
  181. *
  182. * .. Parameters ..
  183. REAL ZERO
  184. PARAMETER ( ZERO = 0.0E+0 )
  185. COMPLEX CZERO, CONE
  186. PARAMETER ( CZERO = ( 0.0E+0, 0.0E+0 ),
  187. $ CONE = ( 1.0E+0, 0.0E+0 ) )
  188. * ..
  189. * .. Local Scalars ..
  190. LOGICAL INITQ, UPPER, WANTQ
  191. INTEGER I, I2, IBL, INCA, INCX, IQAEND, IQB, IQEND, J,
  192. $ J1, J1END, J1INC, J2, JEND, JIN, JINC, K, KD1,
  193. $ KDM1, KDN, L, LAST, LEND, NQ, NR, NRT
  194. REAL ABST
  195. COMPLEX T, TEMP
  196. * ..
  197. * .. External Subroutines ..
  198. EXTERNAL CLACGV, CLAR2V, CLARGV, CLARTG, CLARTV, CLASET,
  199. $ CROT, CSCAL, XERBLA
  200. * ..
  201. * .. Intrinsic Functions ..
  202. INTRINSIC ABS, CONJG, MAX, MIN, REAL
  203. * ..
  204. * .. External Functions ..
  205. LOGICAL LSAME
  206. EXTERNAL LSAME
  207. * ..
  208. * .. Executable Statements ..
  209. *
  210. * Test the input parameters
  211. *
  212. INITQ = LSAME( VECT, 'V' )
  213. WANTQ = INITQ .OR. LSAME( VECT, 'U' )
  214. UPPER = LSAME( UPLO, 'U' )
  215. KD1 = KD + 1
  216. KDM1 = KD - 1
  217. INCX = LDAB - 1
  218. IQEND = 1
  219. *
  220. INFO = 0
  221. IF( .NOT.WANTQ .AND. .NOT.LSAME( VECT, 'N' ) ) THEN
  222. INFO = -1
  223. ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
  224. INFO = -2
  225. ELSE IF( N.LT.0 ) THEN
  226. INFO = -3
  227. ELSE IF( KD.LT.0 ) THEN
  228. INFO = -4
  229. ELSE IF( LDAB.LT.KD1 ) THEN
  230. INFO = -6
  231. ELSE IF( LDQ.LT.MAX( 1, N ) .AND. WANTQ ) THEN
  232. INFO = -10
  233. END IF
  234. IF( INFO.NE.0 ) THEN
  235. CALL XERBLA( 'CHBTRD', -INFO )
  236. RETURN
  237. END IF
  238. *
  239. * Quick return if possible
  240. *
  241. IF( N.EQ.0 )
  242. $ RETURN
  243. *
  244. * Initialize Q to the unit matrix, if needed
  245. *
  246. IF( INITQ )
  247. $ CALL CLASET( 'Full', N, N, CZERO, CONE, Q, LDQ )
  248. *
  249. * Wherever possible, plane rotations are generated and applied in
  250. * vector operations of length NR over the index set J1:J2:KD1.
  251. *
  252. * The real cosines and complex sines of the plane rotations are
  253. * stored in the arrays D and WORK.
  254. *
  255. INCA = KD1*LDAB
  256. KDN = MIN( N-1, KD )
  257. IF( UPPER ) THEN
  258. *
  259. IF( KD.GT.1 ) THEN
  260. *
  261. * Reduce to complex Hermitian tridiagonal form, working with
  262. * the upper triangle
  263. *
  264. NR = 0
  265. J1 = KDN + 2
  266. J2 = 1
  267. *
  268. AB( KD1, 1 ) = REAL( AB( KD1, 1 ) )
  269. DO 90 I = 1, N - 2
  270. *
  271. * Reduce i-th row of matrix to tridiagonal form
  272. *
  273. DO 80 K = KDN + 1, 2, -1
  274. J1 = J1 + KDN
  275. J2 = J2 + KDN
  276. *
  277. IF( NR.GT.0 ) THEN
  278. *
  279. * generate plane rotations to annihilate nonzero
  280. * elements which have been created outside the band
  281. *
  282. CALL CLARGV( NR, AB( 1, J1-1 ), INCA, WORK( J1 ),
  283. $ KD1, D( J1 ), KD1 )
  284. *
  285. * apply rotations from the right
  286. *
  287. *
  288. * Dependent on the the number of diagonals either
  289. * CLARTV or CROT is used
  290. *
  291. IF( NR.GE.2*KD-1 ) THEN
  292. DO 10 L = 1, KD - 1
  293. CALL CLARTV( NR, AB( L+1, J1-1 ), INCA,
  294. $ AB( L, J1 ), INCA, D( J1 ),
  295. $ WORK( J1 ), KD1 )
  296. 10 CONTINUE
  297. *
  298. ELSE
  299. JEND = J1 + ( NR-1 )*KD1
  300. DO 20 JINC = J1, JEND, KD1
  301. CALL CROT( KDM1, AB( 2, JINC-1 ), 1,
  302. $ AB( 1, JINC ), 1, D( JINC ),
  303. $ WORK( JINC ) )
  304. 20 CONTINUE
  305. END IF
  306. END IF
  307. *
  308. *
  309. IF( K.GT.2 ) THEN
  310. IF( K.LE.N-I+1 ) THEN
  311. *
  312. * generate plane rotation to annihilate a(i,i+k-1)
  313. * within the band
  314. *
  315. CALL CLARTG( AB( KD-K+3, I+K-2 ),
  316. $ AB( KD-K+2, I+K-1 ), D( I+K-1 ),
  317. $ WORK( I+K-1 ), TEMP )
  318. AB( KD-K+3, I+K-2 ) = TEMP
  319. *
  320. * apply rotation from the right
  321. *
  322. CALL CROT( K-3, AB( KD-K+4, I+K-2 ), 1,
  323. $ AB( KD-K+3, I+K-1 ), 1, D( I+K-1 ),
  324. $ WORK( I+K-1 ) )
  325. END IF
  326. NR = NR + 1
  327. J1 = J1 - KDN - 1
  328. END IF
  329. *
  330. * apply plane rotations from both sides to diagonal
  331. * blocks
  332. *
  333. IF( NR.GT.0 )
  334. $ CALL CLAR2V( NR, AB( KD1, J1-1 ), AB( KD1, J1 ),
  335. $ AB( KD, J1 ), INCA, D( J1 ),
  336. $ WORK( J1 ), KD1 )
  337. *
  338. * apply plane rotations from the left
  339. *
  340. IF( NR.GT.0 ) THEN
  341. CALL CLACGV( NR, WORK( J1 ), KD1 )
  342. IF( 2*KD-1.LT.NR ) THEN
  343. *
  344. * Dependent on the the number of diagonals either
  345. * CLARTV or CROT is used
  346. *
  347. DO 30 L = 1, KD - 1
  348. IF( J2+L.GT.N ) THEN
  349. NRT = NR - 1
  350. ELSE
  351. NRT = NR
  352. END IF
  353. IF( NRT.GT.0 )
  354. $ CALL CLARTV( NRT, AB( KD-L, J1+L ), INCA,
  355. $ AB( KD-L+1, J1+L ), INCA,
  356. $ D( J1 ), WORK( J1 ), KD1 )
  357. 30 CONTINUE
  358. ELSE
  359. J1END = J1 + KD1*( NR-2 )
  360. IF( J1END.GE.J1 ) THEN
  361. DO 40 JIN = J1, J1END, KD1
  362. CALL CROT( KD-1, AB( KD-1, JIN+1 ), INCX,
  363. $ AB( KD, JIN+1 ), INCX,
  364. $ D( JIN ), WORK( JIN ) )
  365. 40 CONTINUE
  366. END IF
  367. LEND = MIN( KDM1, N-J2 )
  368. LAST = J1END + KD1
  369. IF( LEND.GT.0 )
  370. $ CALL CROT( LEND, AB( KD-1, LAST+1 ), INCX,
  371. $ AB( KD, LAST+1 ), INCX, D( LAST ),
  372. $ WORK( LAST ) )
  373. END IF
  374. END IF
  375. *
  376. IF( WANTQ ) THEN
  377. *
  378. * accumulate product of plane rotations in Q
  379. *
  380. IF( INITQ ) THEN
  381. *
  382. * take advantage of the fact that Q was
  383. * initially the Identity matrix
  384. *
  385. IQEND = MAX( IQEND, J2 )
  386. I2 = MAX( 0, K-3 )
  387. IQAEND = 1 + I*KD
  388. IF( K.EQ.2 )
  389. $ IQAEND = IQAEND + KD
  390. IQAEND = MIN( IQAEND, IQEND )
  391. DO 50 J = J1, J2, KD1
  392. IBL = I - I2 / KDM1
  393. I2 = I2 + 1
  394. IQB = MAX( 1, J-IBL )
  395. NQ = 1 + IQAEND - IQB
  396. IQAEND = MIN( IQAEND+KD, IQEND )
  397. CALL CROT( NQ, Q( IQB, J-1 ), 1, Q( IQB, J ),
  398. $ 1, D( J ), CONJG( WORK( J ) ) )
  399. 50 CONTINUE
  400. ELSE
  401. *
  402. DO 60 J = J1, J2, KD1
  403. CALL CROT( N, Q( 1, J-1 ), 1, Q( 1, J ), 1,
  404. $ D( J ), CONJG( WORK( J ) ) )
  405. 60 CONTINUE
  406. END IF
  407. *
  408. END IF
  409. *
  410. IF( J2+KDN.GT.N ) THEN
  411. *
  412. * adjust J2 to keep within the bounds of the matrix
  413. *
  414. NR = NR - 1
  415. J2 = J2 - KDN - 1
  416. END IF
  417. *
  418. DO 70 J = J1, J2, KD1
  419. *
  420. * create nonzero element a(j-1,j+kd) outside the band
  421. * and store it in WORK
  422. *
  423. WORK( J+KD ) = WORK( J )*AB( 1, J+KD )
  424. AB( 1, J+KD ) = D( J )*AB( 1, J+KD )
  425. 70 CONTINUE
  426. 80 CONTINUE
  427. 90 CONTINUE
  428. END IF
  429. *
  430. IF( KD.GT.0 ) THEN
  431. *
  432. * make off-diagonal elements real and copy them to E
  433. *
  434. DO 100 I = 1, N - 1
  435. T = AB( KD, I+1 )
  436. ABST = ABS( T )
  437. AB( KD, I+1 ) = ABST
  438. E( I ) = ABST
  439. IF( ABST.NE.ZERO ) THEN
  440. T = T / ABST
  441. ELSE
  442. T = CONE
  443. END IF
  444. IF( I.LT.N-1 )
  445. $ AB( KD, I+2 ) = AB( KD, I+2 )*T
  446. IF( WANTQ ) THEN
  447. CALL CSCAL( N, CONJG( T ), Q( 1, I+1 ), 1 )
  448. END IF
  449. 100 CONTINUE
  450. ELSE
  451. *
  452. * set E to zero if original matrix was diagonal
  453. *
  454. DO 110 I = 1, N - 1
  455. E( I ) = ZERO
  456. 110 CONTINUE
  457. END IF
  458. *
  459. * copy diagonal elements to D
  460. *
  461. DO 120 I = 1, N
  462. D( I ) = AB( KD1, I )
  463. 120 CONTINUE
  464. *
  465. ELSE
  466. *
  467. IF( KD.GT.1 ) THEN
  468. *
  469. * Reduce to complex Hermitian tridiagonal form, working with
  470. * the lower triangle
  471. *
  472. NR = 0
  473. J1 = KDN + 2
  474. J2 = 1
  475. *
  476. AB( 1, 1 ) = REAL( AB( 1, 1 ) )
  477. DO 210 I = 1, N - 2
  478. *
  479. * Reduce i-th column of matrix to tridiagonal form
  480. *
  481. DO 200 K = KDN + 1, 2, -1
  482. J1 = J1 + KDN
  483. J2 = J2 + KDN
  484. *
  485. IF( NR.GT.0 ) THEN
  486. *
  487. * generate plane rotations to annihilate nonzero
  488. * elements which have been created outside the band
  489. *
  490. CALL CLARGV( NR, AB( KD1, J1-KD1 ), INCA,
  491. $ WORK( J1 ), KD1, D( J1 ), KD1 )
  492. *
  493. * apply plane rotations from one side
  494. *
  495. *
  496. * Dependent on the the number of diagonals either
  497. * CLARTV or CROT is used
  498. *
  499. IF( NR.GT.2*KD-1 ) THEN
  500. DO 130 L = 1, KD - 1
  501. CALL CLARTV( NR, AB( KD1-L, J1-KD1+L ), INCA,
  502. $ AB( KD1-L+1, J1-KD1+L ), INCA,
  503. $ D( J1 ), WORK( J1 ), KD1 )
  504. 130 CONTINUE
  505. ELSE
  506. JEND = J1 + KD1*( NR-1 )
  507. DO 140 JINC = J1, JEND, KD1
  508. CALL CROT( KDM1, AB( KD, JINC-KD ), INCX,
  509. $ AB( KD1, JINC-KD ), INCX,
  510. $ D( JINC ), WORK( JINC ) )
  511. 140 CONTINUE
  512. END IF
  513. *
  514. END IF
  515. *
  516. IF( K.GT.2 ) THEN
  517. IF( K.LE.N-I+1 ) THEN
  518. *
  519. * generate plane rotation to annihilate a(i+k-1,i)
  520. * within the band
  521. *
  522. CALL CLARTG( AB( K-1, I ), AB( K, I ),
  523. $ D( I+K-1 ), WORK( I+K-1 ), TEMP )
  524. AB( K-1, I ) = TEMP
  525. *
  526. * apply rotation from the left
  527. *
  528. CALL CROT( K-3, AB( K-2, I+1 ), LDAB-1,
  529. $ AB( K-1, I+1 ), LDAB-1, D( I+K-1 ),
  530. $ WORK( I+K-1 ) )
  531. END IF
  532. NR = NR + 1
  533. J1 = J1 - KDN - 1
  534. END IF
  535. *
  536. * apply plane rotations from both sides to diagonal
  537. * blocks
  538. *
  539. IF( NR.GT.0 )
  540. $ CALL CLAR2V( NR, AB( 1, J1-1 ), AB( 1, J1 ),
  541. $ AB( 2, J1-1 ), INCA, D( J1 ),
  542. $ WORK( J1 ), KD1 )
  543. *
  544. * apply plane rotations from the right
  545. *
  546. *
  547. * Dependent on the the number of diagonals either
  548. * CLARTV or CROT is used
  549. *
  550. IF( NR.GT.0 ) THEN
  551. CALL CLACGV( NR, WORK( J1 ), KD1 )
  552. IF( NR.GT.2*KD-1 ) THEN
  553. DO 150 L = 1, KD - 1
  554. IF( J2+L.GT.N ) THEN
  555. NRT = NR - 1
  556. ELSE
  557. NRT = NR
  558. END IF
  559. IF( NRT.GT.0 )
  560. $ CALL CLARTV( NRT, AB( L+2, J1-1 ), INCA,
  561. $ AB( L+1, J1 ), INCA, D( J1 ),
  562. $ WORK( J1 ), KD1 )
  563. 150 CONTINUE
  564. ELSE
  565. J1END = J1 + KD1*( NR-2 )
  566. IF( J1END.GE.J1 ) THEN
  567. DO 160 J1INC = J1, J1END, KD1
  568. CALL CROT( KDM1, AB( 3, J1INC-1 ), 1,
  569. $ AB( 2, J1INC ), 1, D( J1INC ),
  570. $ WORK( J1INC ) )
  571. 160 CONTINUE
  572. END IF
  573. LEND = MIN( KDM1, N-J2 )
  574. LAST = J1END + KD1
  575. IF( LEND.GT.0 )
  576. $ CALL CROT( LEND, AB( 3, LAST-1 ), 1,
  577. $ AB( 2, LAST ), 1, D( LAST ),
  578. $ WORK( LAST ) )
  579. END IF
  580. END IF
  581. *
  582. *
  583. *
  584. IF( WANTQ ) THEN
  585. *
  586. * accumulate product of plane rotations in Q
  587. *
  588. IF( INITQ ) THEN
  589. *
  590. * take advantage of the fact that Q was
  591. * initially the Identity matrix
  592. *
  593. IQEND = MAX( IQEND, J2 )
  594. I2 = MAX( 0, K-3 )
  595. IQAEND = 1 + I*KD
  596. IF( K.EQ.2 )
  597. $ IQAEND = IQAEND + KD
  598. IQAEND = MIN( IQAEND, IQEND )
  599. DO 170 J = J1, J2, KD1
  600. IBL = I - I2 / KDM1
  601. I2 = I2 + 1
  602. IQB = MAX( 1, J-IBL )
  603. NQ = 1 + IQAEND - IQB
  604. IQAEND = MIN( IQAEND+KD, IQEND )
  605. CALL CROT( NQ, Q( IQB, J-1 ), 1, Q( IQB, J ),
  606. $ 1, D( J ), WORK( J ) )
  607. 170 CONTINUE
  608. ELSE
  609. *
  610. DO 180 J = J1, J2, KD1
  611. CALL CROT( N, Q( 1, J-1 ), 1, Q( 1, J ), 1,
  612. $ D( J ), WORK( J ) )
  613. 180 CONTINUE
  614. END IF
  615. END IF
  616. *
  617. IF( J2+KDN.GT.N ) THEN
  618. *
  619. * adjust J2 to keep within the bounds of the matrix
  620. *
  621. NR = NR - 1
  622. J2 = J2 - KDN - 1
  623. END IF
  624. *
  625. DO 190 J = J1, J2, KD1
  626. *
  627. * create nonzero element a(j+kd,j-1) outside the
  628. * band and store it in WORK
  629. *
  630. WORK( J+KD ) = WORK( J )*AB( KD1, J )
  631. AB( KD1, J ) = D( J )*AB( KD1, J )
  632. 190 CONTINUE
  633. 200 CONTINUE
  634. 210 CONTINUE
  635. END IF
  636. *
  637. IF( KD.GT.0 ) THEN
  638. *
  639. * make off-diagonal elements real and copy them to E
  640. *
  641. DO 220 I = 1, N - 1
  642. T = AB( 2, I )
  643. ABST = ABS( T )
  644. AB( 2, I ) = ABST
  645. E( I ) = ABST
  646. IF( ABST.NE.ZERO ) THEN
  647. T = T / ABST
  648. ELSE
  649. T = CONE
  650. END IF
  651. IF( I.LT.N-1 )
  652. $ AB( 2, I+1 ) = AB( 2, I+1 )*T
  653. IF( WANTQ ) THEN
  654. CALL CSCAL( N, T, Q( 1, I+1 ), 1 )
  655. END IF
  656. 220 CONTINUE
  657. ELSE
  658. *
  659. * set E to zero if original matrix was diagonal
  660. *
  661. DO 230 I = 1, N - 1
  662. E( I ) = ZERO
  663. 230 CONTINUE
  664. END IF
  665. *
  666. * copy diagonal elements to D
  667. *
  668. DO 240 I = 1, N
  669. D( I ) = AB( 1, I )
  670. 240 CONTINUE
  671. END IF
  672. *
  673. RETURN
  674. *
  675. * End of CHBTRD
  676. *
  677. END