LAPACK 3.12.1
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  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 132 of file dlarra.f.

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