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.

slarrj.f 11 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. *> \brief \b SLARRJ performs refinement of the initial estimates of the eigenvalues of the matrix T.
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download SLARRJ + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slarrj.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slarrj.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slarrj.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * SUBROUTINE SLARRJ( N, D, E2, IFIRST, ILAST,
  22. * RTOL, OFFSET, W, WERR, WORK, IWORK,
  23. * PIVMIN, SPDIAM, INFO )
  24. *
  25. * .. Scalar Arguments ..
  26. * INTEGER IFIRST, ILAST, INFO, N, OFFSET
  27. * REAL PIVMIN, RTOL, SPDIAM
  28. * ..
  29. * .. Array Arguments ..
  30. * INTEGER IWORK( * )
  31. * REAL D( * ), E2( * ), W( * ),
  32. * $ WERR( * ), WORK( * )
  33. * ..
  34. *
  35. *
  36. *> \par Purpose:
  37. * =============
  38. *>
  39. *> \verbatim
  40. *>
  41. *> Given the initial eigenvalue approximations of T, SLARRJ
  42. *> does bisection to refine the eigenvalues of T,
  43. *> W( IFIRST-OFFSET ) through W( ILAST-OFFSET ), to more accuracy. Initial
  44. *> guesses for these eigenvalues are input in W, the corresponding estimate
  45. *> of the error in these guesses in WERR. During bisection, intervals
  46. *> [left, right] are maintained by storing their mid-points and
  47. *> semi-widths in the arrays W and WERR respectively.
  48. *> \endverbatim
  49. *
  50. * Arguments:
  51. * ==========
  52. *
  53. *> \param[in] N
  54. *> \verbatim
  55. *> N is INTEGER
  56. *> The order of the matrix.
  57. *> \endverbatim
  58. *>
  59. *> \param[in] D
  60. *> \verbatim
  61. *> D is REAL array, dimension (N)
  62. *> The N diagonal elements of T.
  63. *> \endverbatim
  64. *>
  65. *> \param[in] E2
  66. *> \verbatim
  67. *> E2 is REAL array, dimension (N-1)
  68. *> The Squares of the (N-1) subdiagonal elements of T.
  69. *> \endverbatim
  70. *>
  71. *> \param[in] IFIRST
  72. *> \verbatim
  73. *> IFIRST is INTEGER
  74. *> The index of the first eigenvalue to be computed.
  75. *> \endverbatim
  76. *>
  77. *> \param[in] ILAST
  78. *> \verbatim
  79. *> ILAST is INTEGER
  80. *> The index of the last eigenvalue to be computed.
  81. *> \endverbatim
  82. *>
  83. *> \param[in] RTOL
  84. *> \verbatim
  85. *> RTOL is REAL
  86. *> Tolerance for the convergence of the bisection intervals.
  87. *> An interval [LEFT,RIGHT] has converged if
  88. *> RIGHT-LEFT.LT.RTOL*MAX(|LEFT|,|RIGHT|).
  89. *> \endverbatim
  90. *>
  91. *> \param[in] OFFSET
  92. *> \verbatim
  93. *> OFFSET is INTEGER
  94. *> Offset for the arrays W and WERR, i.e., the IFIRST-OFFSET
  95. *> through ILAST-OFFSET elements of these arrays are to be used.
  96. *> \endverbatim
  97. *>
  98. *> \param[in,out] W
  99. *> \verbatim
  100. *> W is REAL array, dimension (N)
  101. *> On input, W( IFIRST-OFFSET ) through W( ILAST-OFFSET ) are
  102. *> estimates of the eigenvalues of L D L^T indexed IFIRST through
  103. *> ILAST.
  104. *> On output, these estimates are refined.
  105. *> \endverbatim
  106. *>
  107. *> \param[in,out] WERR
  108. *> \verbatim
  109. *> WERR is REAL array, dimension (N)
  110. *> On input, WERR( IFIRST-OFFSET ) through WERR( ILAST-OFFSET ) are
  111. *> the errors in the estimates of the corresponding elements in W.
  112. *> On output, these errors are refined.
  113. *> \endverbatim
  114. *>
  115. *> \param[out] WORK
  116. *> \verbatim
  117. *> WORK is REAL array, dimension (2*N)
  118. *> Workspace.
  119. *> \endverbatim
  120. *>
  121. *> \param[out] IWORK
  122. *> \verbatim
  123. *> IWORK is INTEGER array, dimension (2*N)
  124. *> Workspace.
  125. *> \endverbatim
  126. *>
  127. *> \param[in] PIVMIN
  128. *> \verbatim
  129. *> PIVMIN is REAL
  130. *> The minimum pivot in the Sturm sequence for T.
  131. *> \endverbatim
  132. *>
  133. *> \param[in] SPDIAM
  134. *> \verbatim
  135. *> SPDIAM is REAL
  136. *> The spectral diameter of T.
  137. *> \endverbatim
  138. *>
  139. *> \param[out] INFO
  140. *> \verbatim
  141. *> INFO is INTEGER
  142. *> Error flag.
  143. *> \endverbatim
  144. *
  145. * Authors:
  146. * ========
  147. *
  148. *> \author Univ. of Tennessee
  149. *> \author Univ. of California Berkeley
  150. *> \author Univ. of Colorado Denver
  151. *> \author NAG Ltd.
  152. *
  153. *> \date September 2012
  154. *
  155. *> \ingroup auxOTHERauxiliary
  156. *
  157. *> \par Contributors:
  158. * ==================
  159. *>
  160. *> Beresford Parlett, University of California, Berkeley, USA \n
  161. *> Jim Demmel, University of California, Berkeley, USA \n
  162. *> Inderjit Dhillon, University of Texas, Austin, USA \n
  163. *> Osni Marques, LBNL/NERSC, USA \n
  164. *> Christof Voemel, University of California, Berkeley, USA
  165. *
  166. * =====================================================================
  167. SUBROUTINE SLARRJ( N, D, E2, IFIRST, ILAST,
  168. $ RTOL, OFFSET, W, WERR, WORK, IWORK,
  169. $ PIVMIN, SPDIAM, INFO )
  170. *
  171. * -- LAPACK auxiliary routine (version 3.4.2) --
  172. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  173. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  174. * September 2012
  175. *
  176. * .. Scalar Arguments ..
  177. INTEGER IFIRST, ILAST, INFO, N, OFFSET
  178. REAL PIVMIN, RTOL, SPDIAM
  179. * ..
  180. * .. Array Arguments ..
  181. INTEGER IWORK( * )
  182. REAL D( * ), E2( * ), W( * ),
  183. $ WERR( * ), WORK( * )
  184. * ..
  185. *
  186. * =====================================================================
  187. *
  188. * .. Parameters ..
  189. REAL ZERO, ONE, TWO, HALF
  190. PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0,
  191. $ HALF = 0.5E0 )
  192. INTEGER MAXITR
  193. * ..
  194. * .. Local Scalars ..
  195. INTEGER CNT, I, I1, I2, II, ITER, J, K, NEXT, NINT,
  196. $ OLNINT, P, PREV, SAVI1
  197. REAL DPLUS, FAC, LEFT, MID, RIGHT, S, TMP, WIDTH
  198. *
  199. * ..
  200. * .. Intrinsic Functions ..
  201. INTRINSIC ABS, MAX
  202. * ..
  203. * .. Executable Statements ..
  204. *
  205. INFO = 0
  206. *
  207. MAXITR = INT( ( LOG( SPDIAM+PIVMIN )-LOG( PIVMIN ) ) /
  208. $ LOG( TWO ) ) + 2
  209. *
  210. * Initialize unconverged intervals in [ WORK(2*I-1), WORK(2*I) ].
  211. * The Sturm Count, Count( WORK(2*I-1) ) is arranged to be I-1, while
  212. * Count( WORK(2*I) ) is stored in IWORK( 2*I ). The integer IWORK( 2*I-1 )
  213. * for an unconverged interval is set to the index of the next unconverged
  214. * interval, and is -1 or 0 for a converged interval. Thus a linked
  215. * list of unconverged intervals is set up.
  216. *
  217. I1 = IFIRST
  218. I2 = ILAST
  219. * The number of unconverged intervals
  220. NINT = 0
  221. * The last unconverged interval found
  222. PREV = 0
  223. DO 75 I = I1, I2
  224. K = 2*I
  225. II = I - OFFSET
  226. LEFT = W( II ) - WERR( II )
  227. MID = W(II)
  228. RIGHT = W( II ) + WERR( II )
  229. WIDTH = RIGHT - MID
  230. TMP = MAX( ABS( LEFT ), ABS( RIGHT ) )
  231. * The following test prevents the test of converged intervals
  232. IF( WIDTH.LT.RTOL*TMP ) THEN
  233. * This interval has already converged and does not need refinement.
  234. * (Note that the gaps might change through refining the
  235. * eigenvalues, however, they can only get bigger.)
  236. * Remove it from the list.
  237. IWORK( K-1 ) = -1
  238. * Make sure that I1 always points to the first unconverged interval
  239. IF((I.EQ.I1).AND.(I.LT.I2)) I1 = I + 1
  240. IF((PREV.GE.I1).AND.(I.LE.I2)) IWORK( 2*PREV-1 ) = I + 1
  241. ELSE
  242. * unconverged interval found
  243. PREV = I
  244. * Make sure that [LEFT,RIGHT] contains the desired eigenvalue
  245. *
  246. * Do while( CNT(LEFT).GT.I-1 )
  247. *
  248. FAC = ONE
  249. 20 CONTINUE
  250. CNT = 0
  251. S = LEFT
  252. DPLUS = D( 1 ) - S
  253. IF( DPLUS.LT.ZERO ) CNT = CNT + 1
  254. DO 30 J = 2, N
  255. DPLUS = D( J ) - S - E2( J-1 )/DPLUS
  256. IF( DPLUS.LT.ZERO ) CNT = CNT + 1
  257. 30 CONTINUE
  258. IF( CNT.GT.I-1 ) THEN
  259. LEFT = LEFT - WERR( II )*FAC
  260. FAC = TWO*FAC
  261. GO TO 20
  262. END IF
  263. *
  264. * Do while( CNT(RIGHT).LT.I )
  265. *
  266. FAC = ONE
  267. 50 CONTINUE
  268. CNT = 0
  269. S = RIGHT
  270. DPLUS = D( 1 ) - S
  271. IF( DPLUS.LT.ZERO ) CNT = CNT + 1
  272. DO 60 J = 2, N
  273. DPLUS = D( J ) - S - E2( J-1 )/DPLUS
  274. IF( DPLUS.LT.ZERO ) CNT = CNT + 1
  275. 60 CONTINUE
  276. IF( CNT.LT.I ) THEN
  277. RIGHT = RIGHT + WERR( II )*FAC
  278. FAC = TWO*FAC
  279. GO TO 50
  280. END IF
  281. NINT = NINT + 1
  282. IWORK( K-1 ) = I + 1
  283. IWORK( K ) = CNT
  284. END IF
  285. WORK( K-1 ) = LEFT
  286. WORK( K ) = RIGHT
  287. 75 CONTINUE
  288. SAVI1 = I1
  289. *
  290. * Do while( NINT.GT.0 ), i.e. there are still unconverged intervals
  291. * and while (ITER.LT.MAXITR)
  292. *
  293. ITER = 0
  294. 80 CONTINUE
  295. PREV = I1 - 1
  296. I = I1
  297. OLNINT = NINT
  298. DO 100 P = 1, OLNINT
  299. K = 2*I
  300. II = I - OFFSET
  301. NEXT = IWORK( K-1 )
  302. LEFT = WORK( K-1 )
  303. RIGHT = WORK( K )
  304. MID = HALF*( LEFT + RIGHT )
  305. * semiwidth of interval
  306. WIDTH = RIGHT - MID
  307. TMP = MAX( ABS( LEFT ), ABS( RIGHT ) )
  308. IF( ( WIDTH.LT.RTOL*TMP ) .OR.
  309. $ (ITER.EQ.MAXITR) )THEN
  310. * reduce number of unconverged intervals
  311. NINT = NINT - 1
  312. * Mark interval as converged.
  313. IWORK( K-1 ) = 0
  314. IF( I1.EQ.I ) THEN
  315. I1 = NEXT
  316. ELSE
  317. * Prev holds the last unconverged interval previously examined
  318. IF(PREV.GE.I1) IWORK( 2*PREV-1 ) = NEXT
  319. END IF
  320. I = NEXT
  321. GO TO 100
  322. END IF
  323. PREV = I
  324. *
  325. * Perform one bisection step
  326. *
  327. CNT = 0
  328. S = MID
  329. DPLUS = D( 1 ) - S
  330. IF( DPLUS.LT.ZERO ) CNT = CNT + 1
  331. DO 90 J = 2, N
  332. DPLUS = D( J ) - S - E2( J-1 )/DPLUS
  333. IF( DPLUS.LT.ZERO ) CNT = CNT + 1
  334. 90 CONTINUE
  335. IF( CNT.LE.I-1 ) THEN
  336. WORK( K-1 ) = MID
  337. ELSE
  338. WORK( K ) = MID
  339. END IF
  340. I = NEXT
  341. 100 CONTINUE
  342. ITER = ITER + 1
  343. * do another loop if there are still unconverged intervals
  344. * However, in the last iteration, all intervals are accepted
  345. * since this is the best we can do.
  346. IF( ( NINT.GT.0 ).AND.(ITER.LE.MAXITR) ) GO TO 80
  347. *
  348. *
  349. * At this point, all the intervals have converged
  350. DO 110 I = SAVI1, ILAST
  351. K = 2*I
  352. II = I - OFFSET
  353. * All intervals marked by '0' have been refined.
  354. IF( IWORK( K-1 ).EQ.0 ) THEN
  355. W( II ) = HALF*( WORK( K-1 )+WORK( K ) )
  356. WERR( II ) = WORK( K ) - W( II )
  357. END IF
  358. 110 CONTINUE
  359. *
  360. RETURN
  361. *
  362. * End of SLARRJ
  363. *
  364. END