3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE DSTECT( N, A, B, SHIFT, NUM )
13 * .. Scalar Arguments ..
15 * DOUBLE PRECISION SHIFT
17 * .. Array Arguments ..
18 * DOUBLE PRECISION A( * ), B( * )
27 *> DSTECT 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
31 *> See W. Kahan "Accurate Eigenvalues of a Symmetric Tridiagonal
32 *> Matrix", Report CS41, Computer Science Dept., Stanford
33 *> University, July 21, 1966
42 *> The dimension of the tridiagonal matrix T.
47 *> A is DOUBLE PRECISION array, dimension (N)
48 *> The diagonal entries of the tridiagonal matrix T.
53 *> B is DOUBLE PRECISION array, dimension (N-1)
54 *> The offdiagonal entries of the tridiagonal matrix T.
59 *> SHIFT is DOUBLE PRECISION
60 *> The shift, used as described under Purpose.
66 *> The number of eigenvalues of T less than or equal
73 *> \author Univ. of Tennessee
74 *> \author Univ. of California Berkeley
75 *> \author Univ. of Colorado Denver
78 *> \date November 2011
80 *> \ingroup double_eig
82 * =====================================================================
83 SUBROUTINE DSTECT( N, A, B, SHIFT, NUM )
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..--
90 * .. Scalar Arguments ..
92 DOUBLE PRECISION SHIFT
94 * .. Array Arguments ..
95 DOUBLE PRECISION A( * ), B( * )
98 * =====================================================================
101 DOUBLE PRECISION ZERO, ONE, THREE
102 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, THREE = 3.0D0 )
104 * .. Local Scalars ..
106 DOUBLE PRECISION M1, M2, MX, OVFL, SOV, SSHIFT, SSUN, SUN, TMP,
109 * .. External Functions ..
110 DOUBLE PRECISION DLAMCH
113 * .. Intrinsic Functions ..
114 INTRINSIC ABS, MAX, SQRT
116 * .. Executable Statements ..
118 * Get machine constants
120 UNFL = DLAMCH( 'Safe minimum' )
121 OVFL = DLAMCH( 'Overflow' )
127 MX = MAX( MX, ABS( A( I+1 ) ), ABS( B( I ) ) )
130 * Handle easy cases, including zero matrix
132 IF( SHIFT.GE.THREE*MX ) THEN
136 IF( SHIFT.LT.-THREE*MX ) THEN
141 * Compute scale factors as in Kahan's report
142 * At this point, MX .NE. 0 so we can divide by it
159 SSHIFT = ( SHIFT*M1 )*M2
160 U = ( A( 1 )*M1 )*M2 - SSHIFT
171 TMP = ( B( I-1 )*M1 )*M2
172 U = ( ( A( I )*M1 )*M2-TMP*( TMP / U ) ) - SSHIFT