LAPACK 3.12.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ dlarra()

subroutine dlarra ( integer  n,
double precision, dimension( * )  d,
double precision, dimension( * )  e,
double precision, dimension( * )  e2,
double precision  spltol,
double precision  tnrm,
integer  nsplit,
integer, dimension( * )  isplit,
integer  info 
)

DLARRA computes the splitting points with the specified threshold.

Download DLARRA + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 Compute the splitting points with threshold SPLTOL.
 DLARRA sets any "small" off-diagonal elements to zero.
Parameters
[in]N
          N is INTEGER
          The order of the matrix. N > 0.
[in]D
          D is DOUBLE PRECISION array, dimension (N)
          On entry, the N diagonal elements of the tridiagonal
          matrix T.
[in,out]E
          E is DOUBLE PRECISION array, dimension (N)
          On entry, the first (N-1) entries contain the subdiagonal
          elements of the tridiagonal matrix T; E(N) need not be set.
          On exit, the entries E( ISPLIT( I ) ), 1 <= I <= NSPLIT,
          are set to zero, the other entries of E are untouched.
[in,out]E2
          E2 is DOUBLE PRECISION array, dimension (N)
          On entry, the first (N-1) entries contain the SQUARES of the
          subdiagonal elements of the tridiagonal matrix T;
          E2(N) need not be set.
          On exit, the entries E2( ISPLIT( I ) ),
          1 <= I <= NSPLIT, have been set to zero
[in]SPLTOL
          SPLTOL is DOUBLE PRECISION
          The threshold for splitting. Two criteria can be used:
          SPLTOL<0 : criterion based on absolute off-diagonal value
          SPLTOL>0 : criterion that preserves relative accuracy
[in]TNRM
          TNRM is DOUBLE PRECISION
          The norm of the matrix.
[out]NSPLIT
          NSPLIT is INTEGER
          The number of blocks T splits into. 1 <= NSPLIT <= N.
[out]ISPLIT
          ISPLIT is INTEGER array, dimension (N)
          The splitting points, at which T breaks up into blocks.
          The first block consists of rows/columns 1 to ISPLIT(1),
          the second of rows/columns ISPLIT(1)+1 through ISPLIT(2),
          etc., and the NSPLIT-th consists of rows/columns
          ISPLIT(NSPLIT-1)+1 through ISPLIT(NSPLIT)=N.
[out]INFO
          INFO is INTEGER
          = 0:  successful exit
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Contributors:
Beresford Parlett, University of California, Berkeley, USA
Jim Demmel, University of California, Berkeley, USA
Inderjit Dhillon, University of Texas, Austin, USA
Osni Marques, LBNL/NERSC, USA
Christof Voemel, University of California, Berkeley, USA

Definition at line 134 of file dlarra.f.

136*
137* -- LAPACK auxiliary routine --
138* -- LAPACK is a software package provided by Univ. of Tennessee, --
139* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
140*
141* .. Scalar Arguments ..
142 INTEGER INFO, N, NSPLIT
143 DOUBLE PRECISION SPLTOL, TNRM
144* ..
145* .. Array Arguments ..
146 INTEGER ISPLIT( * )
147 DOUBLE PRECISION D( * ), E( * ), E2( * )
148* ..
149*
150* =====================================================================
151*
152* .. Parameters ..
153 DOUBLE PRECISION ZERO
154 parameter( zero = 0.0d0 )
155* ..
156* .. Local Scalars ..
157 INTEGER I
158 DOUBLE PRECISION EABS, TMP1
159
160* ..
161* .. Intrinsic Functions ..
162 INTRINSIC abs
163* ..
164* .. Executable Statements ..
165*
166 info = 0
167 nsplit = 1
168*
169* Quick return if possible
170*
171 IF( n.LE.0 ) THEN
172 RETURN
173 END IF
174*
175* Compute splitting points
176 IF(spltol.LT.zero) THEN
177* Criterion based on absolute off-diagonal value
178 tmp1 = abs(spltol)* tnrm
179 DO 9 i = 1, n-1
180 eabs = abs( e(i) )
181 IF( eabs .LE. tmp1) THEN
182 e(i) = zero
183 e2(i) = zero
184 isplit( nsplit ) = i
185 nsplit = nsplit + 1
186 END IF
187 9 CONTINUE
188 ELSE
189* Criterion that guarantees relative accuracy
190 DO 10 i = 1, n-1
191 eabs = abs( e(i) )
192 IF( eabs .LE. spltol * sqrt(abs(d(i)))*sqrt(abs(d(i+1))) )
193 $ THEN
194 e(i) = zero
195 e2(i) = zero
196 isplit( nsplit ) = i
197 nsplit = nsplit + 1
198 END IF
199 10 CONTINUE
200 ENDIF
201 isplit( nsplit ) = n
202
203 RETURN
204*
205* End of DLARRA
206*
Here is the caller graph for this function: