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.

sstect.f 4.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. *> \brief \b SSTECT
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. * Definition:
  9. * ===========
  10. *
  11. * SUBROUTINE SSTECT( N, A, B, SHIFT, NUM )
  12. *
  13. * .. Scalar Arguments ..
  14. * INTEGER N, NUM
  15. * REAL SHIFT
  16. * ..
  17. * .. Array Arguments ..
  18. * REAL A( * ), B( * )
  19. * ..
  20. *
  21. *
  22. *> \par Purpose:
  23. * =============
  24. *>
  25. *> \verbatim
  26. *>
  27. *> SSTECT counts the number NUM of eigenvalues of a tridiagonal
  28. *> matrix T which are less than or equal to SHIFT. T has
  29. *> diagonal entries A(1), ... , A(N), and offdiagonal entries
  30. *> B(1), ..., B(N-1).
  31. *> See W. Kahan "Accurate Eigenvalues of a Symmetric Tridiagonal
  32. *> Matrix", Report CS41, Computer Science Dept., Stanford
  33. *> University, July 21, 1966
  34. *> \endverbatim
  35. *
  36. * Arguments:
  37. * ==========
  38. *
  39. *> \param[in] N
  40. *> \verbatim
  41. *> N is INTEGER
  42. *> The dimension of the tridiagonal matrix T.
  43. *> \endverbatim
  44. *>
  45. *> \param[in] A
  46. *> \verbatim
  47. *> A is REAL array, dimension (N)
  48. *> The diagonal entries of the tridiagonal matrix T.
  49. *> \endverbatim
  50. *>
  51. *> \param[in] B
  52. *> \verbatim
  53. *> B is REAL array, dimension (N-1)
  54. *> The offdiagonal entries of the tridiagonal matrix T.
  55. *> \endverbatim
  56. *>
  57. *> \param[in] SHIFT
  58. *> \verbatim
  59. *> SHIFT is REAL
  60. *> The shift, used as described under Purpose.
  61. *> \endverbatim
  62. *>
  63. *> \param[out] NUM
  64. *> \verbatim
  65. *> NUM is INTEGER
  66. *> The number of eigenvalues of T less than or equal
  67. *> to SHIFT.
  68. *> \endverbatim
  69. *
  70. * Authors:
  71. * ========
  72. *
  73. *> \author Univ. of Tennessee
  74. *> \author Univ. of California Berkeley
  75. *> \author Univ. of Colorado Denver
  76. *> \author NAG Ltd.
  77. *
  78. *> \date November 2011
  79. *
  80. *> \ingroup single_eig
  81. *
  82. * =====================================================================
  83. SUBROUTINE SSTECT( N, A, B, SHIFT, NUM )
  84. *
  85. * -- LAPACK test routine (version 3.4.0) --
  86. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  87. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  88. * November 2011
  89. *
  90. * .. Scalar Arguments ..
  91. INTEGER N, NUM
  92. REAL SHIFT
  93. * ..
  94. * .. Array Arguments ..
  95. REAL A( * ), B( * )
  96. * ..
  97. *
  98. * =====================================================================
  99. *
  100. * .. Parameters ..
  101. REAL ZERO, ONE, THREE
  102. PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0, THREE = 3.0E0 )
  103. * ..
  104. * .. Local Scalars ..
  105. INTEGER I
  106. REAL M1, M2, MX, OVFL, SOV, SSHIFT, SSUN, SUN, TMP,
  107. $ TOM, U, UNFL
  108. * ..
  109. * .. External Functions ..
  110. REAL SLAMCH
  111. EXTERNAL SLAMCH
  112. * ..
  113. * .. Intrinsic Functions ..
  114. INTRINSIC ABS, MAX, SQRT
  115. * ..
  116. * .. Executable Statements ..
  117. *
  118. * Get machine constants
  119. *
  120. UNFL = SLAMCH( 'Safe minimum' )
  121. OVFL = SLAMCH( 'Overflow' )
  122. *
  123. * Find largest entry
  124. *
  125. MX = ABS( A( 1 ) )
  126. DO 10 I = 1, N - 1
  127. MX = MAX( MX, ABS( A( I+1 ) ), ABS( B( I ) ) )
  128. 10 CONTINUE
  129. *
  130. * Handle easy cases, including zero matrix
  131. *
  132. IF( SHIFT.GE.THREE*MX ) THEN
  133. NUM = N
  134. RETURN
  135. END IF
  136. IF( SHIFT.LT.-THREE*MX ) THEN
  137. NUM = 0
  138. RETURN
  139. END IF
  140. *
  141. * Compute scale factors as in Kahan's report
  142. * At this point, MX .NE. 0 so we can divide by it
  143. *
  144. SUN = SQRT( UNFL )
  145. SSUN = SQRT( SUN )
  146. SOV = SQRT( OVFL )
  147. TOM = SSUN*SOV
  148. IF( MX.LE.ONE ) THEN
  149. M1 = ONE / MX
  150. M2 = TOM
  151. ELSE
  152. M1 = ONE
  153. M2 = TOM / MX
  154. END IF
  155. *
  156. * Begin counting
  157. *
  158. NUM = 0
  159. SSHIFT = ( SHIFT*M1 )*M2
  160. U = ( A( 1 )*M1 )*M2 - SSHIFT
  161. IF( U.LE.SUN ) THEN
  162. IF( U.LE.ZERO ) THEN
  163. NUM = NUM + 1
  164. IF( U.GT.-SUN )
  165. $ U = -SUN
  166. ELSE
  167. U = SUN
  168. END IF
  169. END IF
  170. DO 20 I = 2, N
  171. TMP = ( B( I-1 )*M1 )*M2
  172. U = ( ( A( I )*M1 )*M2-TMP*( TMP / U ) ) - SSHIFT
  173. IF( U.LE.SUN ) THEN
  174. IF( U.LE.ZERO ) THEN
  175. NUM = NUM + 1
  176. IF( U.GT.-SUN )
  177. $ U = -SUN
  178. ELSE
  179. U = SUN
  180. END IF
  181. END IF
  182. 20 CONTINUE
  183. RETURN
  184. *
  185. * End of SSTECT
  186. *
  187. END