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.

slarrk.f 6.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. *> \brief \b SLARRK computes one eigenvalue of a symmetric tridiagonal matrix T to suitable accuracy.
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download SLARRK + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slarrk.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slarrk.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slarrk.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * SUBROUTINE SLARRK( N, IW, GL, GU,
  22. * D, E2, PIVMIN, RELTOL, W, WERR, INFO)
  23. *
  24. * .. Scalar Arguments ..
  25. * INTEGER INFO, IW, N
  26. * REAL PIVMIN, RELTOL, GL, GU, W, WERR
  27. * ..
  28. * .. Array Arguments ..
  29. * REAL D( * ), E2( * )
  30. * ..
  31. *
  32. *
  33. *> \par Purpose:
  34. * =============
  35. *>
  36. *> \verbatim
  37. *>
  38. *> SLARRK computes one eigenvalue of a symmetric tridiagonal
  39. *> matrix T to suitable accuracy. This is an auxiliary code to be
  40. *> called from SSTEMR.
  41. *>
  42. *> To avoid overflow, the matrix must be scaled so that its
  43. *> largest element is no greater than overflow**(1/2) * underflow**(1/4) in absolute value, and for greatest
  44. *> accuracy, it should not be much smaller than that.
  45. *>
  46. *> See W. Kahan "Accurate Eigenvalues of a Symmetric Tridiagonal
  47. *> Matrix", Report CS41, Computer Science Dept., Stanford
  48. *> University, July 21, 1966.
  49. *> \endverbatim
  50. *
  51. * Arguments:
  52. * ==========
  53. *
  54. *> \param[in] N
  55. *> \verbatim
  56. *> N is INTEGER
  57. *> The order of the tridiagonal matrix T. N >= 0.
  58. *> \endverbatim
  59. *>
  60. *> \param[in] IW
  61. *> \verbatim
  62. *> IW is INTEGER
  63. *> The index of the eigenvalues to be returned.
  64. *> \endverbatim
  65. *>
  66. *> \param[in] GL
  67. *> \verbatim
  68. *> GL is REAL
  69. *> \endverbatim
  70. *>
  71. *> \param[in] GU
  72. *> \verbatim
  73. *> GU is REAL
  74. *> An upper and a lower bound on the eigenvalue.
  75. *> \endverbatim
  76. *>
  77. *> \param[in] D
  78. *> \verbatim
  79. *> D is REAL array, dimension (N)
  80. *> The n diagonal elements of the tridiagonal matrix T.
  81. *> \endverbatim
  82. *>
  83. *> \param[in] E2
  84. *> \verbatim
  85. *> E2 is REAL array, dimension (N-1)
  86. *> The (n-1) squared off-diagonal elements of the tridiagonal matrix T.
  87. *> \endverbatim
  88. *>
  89. *> \param[in] PIVMIN
  90. *> \verbatim
  91. *> PIVMIN is REAL
  92. *> The minimum pivot allowed in the Sturm sequence for T.
  93. *> \endverbatim
  94. *>
  95. *> \param[in] RELTOL
  96. *> \verbatim
  97. *> RELTOL is REAL
  98. *> The minimum relative width of an interval. When an interval
  99. *> is narrower than RELTOL times the larger (in
  100. *> magnitude) endpoint, then it is considered to be
  101. *> sufficiently small, i.e., converged. Note: this should
  102. *> always be at least radix*machine epsilon.
  103. *> \endverbatim
  104. *>
  105. *> \param[out] W
  106. *> \verbatim
  107. *> W is REAL
  108. *> \endverbatim
  109. *>
  110. *> \param[out] WERR
  111. *> \verbatim
  112. *> WERR is REAL
  113. *> The error bound on the corresponding eigenvalue approximation
  114. *> in W.
  115. *> \endverbatim
  116. *>
  117. *> \param[out] INFO
  118. *> \verbatim
  119. *> INFO is INTEGER
  120. *> = 0: Eigenvalue converged
  121. *> = -1: Eigenvalue did NOT converge
  122. *> \endverbatim
  123. *
  124. *> \par Internal Parameters:
  125. * =========================
  126. *>
  127. *> \verbatim
  128. *> FUDGE REAL , default = 2
  129. *> A "fudge factor" to widen the Gershgorin intervals.
  130. *> \endverbatim
  131. *
  132. * Authors:
  133. * ========
  134. *
  135. *> \author Univ. of Tennessee
  136. *> \author Univ. of California Berkeley
  137. *> \author Univ. of Colorado Denver
  138. *> \author NAG Ltd.
  139. *
  140. *> \date September 2012
  141. *
  142. *> \ingroup auxOTHERauxiliary
  143. *
  144. * =====================================================================
  145. SUBROUTINE SLARRK( N, IW, GL, GU,
  146. $ D, E2, PIVMIN, RELTOL, W, WERR, INFO)
  147. *
  148. * -- LAPACK auxiliary routine (version 3.4.2) --
  149. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  150. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  151. * September 2012
  152. *
  153. * .. Scalar Arguments ..
  154. INTEGER INFO, IW, N
  155. REAL PIVMIN, RELTOL, GL, GU, W, WERR
  156. * ..
  157. * .. Array Arguments ..
  158. REAL D( * ), E2( * )
  159. * ..
  160. *
  161. * =====================================================================
  162. *
  163. * .. Parameters ..
  164. REAL FUDGE, HALF, TWO, ZERO
  165. PARAMETER ( HALF = 0.5E0, TWO = 2.0E0,
  166. $ FUDGE = TWO, ZERO = 0.0E0 )
  167. * ..
  168. * .. Local Scalars ..
  169. INTEGER I, IT, ITMAX, NEGCNT
  170. REAL ATOLI, EPS, LEFT, MID, RIGHT, RTOLI, TMP1,
  171. $ TMP2, TNORM
  172. * ..
  173. * .. External Functions ..
  174. REAL SLAMCH
  175. EXTERNAL SLAMCH
  176. * ..
  177. * .. Intrinsic Functions ..
  178. INTRINSIC ABS, INT, LOG, MAX
  179. * ..
  180. * .. Executable Statements ..
  181. *
  182. * Get machine constants
  183. EPS = SLAMCH( 'P' )
  184. TNORM = MAX( ABS( GL ), ABS( GU ) )
  185. RTOLI = RELTOL
  186. ATOLI = FUDGE*TWO*PIVMIN
  187. ITMAX = INT( ( LOG( TNORM+PIVMIN )-LOG( PIVMIN ) ) /
  188. $ LOG( TWO ) ) + 2
  189. INFO = -1
  190. LEFT = GL - FUDGE*TNORM*EPS*N - FUDGE*TWO*PIVMIN
  191. RIGHT = GU + FUDGE*TNORM*EPS*N + FUDGE*TWO*PIVMIN
  192. IT = 0
  193. 10 CONTINUE
  194. *
  195. * Check if interval converged or maximum number of iterations reached
  196. *
  197. TMP1 = ABS( RIGHT - LEFT )
  198. TMP2 = MAX( ABS(RIGHT), ABS(LEFT) )
  199. IF( TMP1.LT.MAX( ATOLI, PIVMIN, RTOLI*TMP2 ) ) THEN
  200. INFO = 0
  201. GOTO 30
  202. ENDIF
  203. IF(IT.GT.ITMAX)
  204. $ GOTO 30
  205. *
  206. * Count number of negative pivots for mid-point
  207. *
  208. IT = IT + 1
  209. MID = HALF * (LEFT + RIGHT)
  210. NEGCNT = 0
  211. TMP1 = D( 1 ) - MID
  212. IF( ABS( TMP1 ).LT.PIVMIN )
  213. $ TMP1 = -PIVMIN
  214. IF( TMP1.LE.ZERO )
  215. $ NEGCNT = NEGCNT + 1
  216. *
  217. DO 20 I = 2, N
  218. TMP1 = D( I ) - E2( I-1 ) / TMP1 - MID
  219. IF( ABS( TMP1 ).LT.PIVMIN )
  220. $ TMP1 = -PIVMIN
  221. IF( TMP1.LE.ZERO )
  222. $ NEGCNT = NEGCNT + 1
  223. 20 CONTINUE
  224. IF(NEGCNT.GE.IW) THEN
  225. RIGHT = MID
  226. ELSE
  227. LEFT = MID
  228. ENDIF
  229. GOTO 10
  230. 30 CONTINUE
  231. *
  232. * Converged or maximum number of iterations reached
  233. *
  234. W = HALF * (LEFT + RIGHT)
  235. WERR = HALF * ABS( RIGHT - LEFT )
  236. RETURN
  237. *
  238. * End of SLARRK
  239. *
  240. END