1 *> \brief \b DLASQ5 computes one dqds transform in ping-pong form. Used by sbdsqr and sstegr.
3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
9 *> Download DLASQ5 + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlasq5.f">
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlasq5.f">
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlasq5.f">
21 * SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, SIGMA, DMIN, DMIN1, DMIN2, DN,
22 * DNM1, DNM2, IEEE, EPS )
24 * .. Scalar Arguments ..
27 * DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU, SIGMA, EPS
29 * .. Array Arguments ..
30 * DOUBLE PRECISION Z( * )
39 *> DLASQ5 computes one dqds transform in ping-pong form, one
40 *> version for IEEE machines another for non IEEE machines.
60 *> Z is DOUBLE PRECISION array, dimension ( 4*N )
61 *> Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
68 *> PP=0 for ping, PP=1 for pong.
73 *> TAU is DOUBLE PRECISION
79 *> SIGMA is DOUBLE PRECISION
80 *> This is the accumulated shift up to this step.
85 *> DMIN is DOUBLE PRECISION
86 *> Minimum value of d.
91 *> DMIN1 is DOUBLE PRECISION
92 *> Minimum value of d, excluding D( N0 ).
97 *> DMIN2 is DOUBLE PRECISION
98 *> Minimum value of d, excluding D( N0 ) and D( N0-1 ).
103 *> DN is DOUBLE PRECISION
104 *> d(N0), the last value of d.
109 *> DNM1 is DOUBLE PRECISION
115 *> DNM2 is DOUBLE PRECISION
122 *> Flag for IEEE or non IEEE arithmetic.
127 *> EPS is DOUBLE PRECISION
128 *> This is the value of epsilon used.
134 *> \author Univ. of Tennessee
135 *> \author Univ. of California Berkeley
136 *> \author Univ. of Colorado Denver
139 *> \date September 2012
141 *> \ingroup auxOTHERcomputational
143 * =====================================================================
144 SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, SIGMA, DMIN, DMIN1, DMIN2,
145 $ DN, DNM1, DNM2, IEEE, EPS )
147 * -- LAPACK computational routine (version 3.4.2) --
148 * -- LAPACK is a software package provided by Univ. of Tennessee, --
149 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
152 * .. Scalar Arguments ..
155 DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU,
158 * .. Array Arguments ..
159 DOUBLE PRECISION Z( * )
162 * =====================================================================
165 DOUBLE PRECISION ZERO, HALF
166 PARAMETER ( ZERO = 0.0D0, HALF = 0.5 )
168 * .. Local Scalars ..
170 DOUBLE PRECISION D, EMIN, TEMP, DTHRESH
172 * .. Intrinsic Functions ..
175 * .. Executable Statements ..
178 IF( ( N0-I0-1 ).LE.0 )
181 DTHRESH = EPS*(SIGMA+TAU)
182 IF( TAU.LT.DTHRESH*HALF ) TAU = ZERO
183 IF( TAU.NE.ZERO ) THEN
192 * Code for IEEE arithmetic.
195 DO 10 J4 = 4*I0, 4*( N0-3 ), 4
196 Z( J4-2 ) = D + Z( J4-1 )
197 TEMP = Z( J4+1 ) / Z( J4-2 )
199 DMIN = MIN( DMIN, D )
200 Z( J4 ) = Z( J4-1 )*TEMP
201 EMIN = MIN( Z( J4 ), EMIN )
204 DO 20 J4 = 4*I0, 4*( N0-3 ), 4
205 Z( J4-3 ) = D + Z( J4 )
206 TEMP = Z( J4+2 ) / Z( J4-3 )
208 DMIN = MIN( DMIN, D )
209 Z( J4-1 ) = Z( J4 )*TEMP
210 EMIN = MIN( Z( J4-1 ), EMIN )
215 * Unroll last two steps.
221 Z( J4-2 ) = DNM2 + Z( J4P2 )
222 Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
223 DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
224 DMIN = MIN( DMIN, DNM1 )
229 Z( J4-2 ) = DNM1 + Z( J4P2 )
230 Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
231 DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
232 DMIN = MIN( DMIN, DN )
236 * Code for non IEEE arithmetic.
239 DO 30 J4 = 4*I0, 4*( N0-3 ), 4
240 Z( J4-2 ) = D + Z( J4-1 )
244 Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
245 D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU
247 DMIN = MIN( DMIN, D )
248 EMIN = MIN( EMIN, Z( J4 ) )
251 DO 40 J4 = 4*I0, 4*( N0-3 ), 4
252 Z( J4-3 ) = D + Z( J4 )
256 Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
257 D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU
259 DMIN = MIN( DMIN, D )
260 EMIN = MIN( EMIN, Z( J4-1 ) )
264 * Unroll last two steps.
270 Z( J4-2 ) = DNM2 + Z( J4P2 )
271 IF( DNM2.LT.ZERO ) THEN
274 Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
275 DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
277 DMIN = MIN( DMIN, DNM1 )
282 Z( J4-2 ) = DNM1 + Z( J4P2 )
283 IF( DNM1.LT.ZERO ) THEN
286 Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
287 DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
289 DMIN = MIN( DMIN, DN )
293 * This is the version that sets d's to zero if they are small enough
301 * Code for IEEE arithmetic.
305 DO 50 J4 = 4*I0, 4*( N0-3 ), 4
306 Z( J4-2 ) = D + Z( J4-1 )
307 TEMP = Z( J4+1 ) / Z( J4-2 )
309 IF( D.LT.DTHRESH ) D = ZERO
310 DMIN = MIN( DMIN, D )
311 Z( J4 ) = Z( J4-1 )*TEMP
312 EMIN = MIN( Z( J4 ), EMIN )
315 DO 60 J4 = 4*I0, 4*( N0-3 ), 4
316 Z( J4-3 ) = D + Z( J4 )
317 TEMP = Z( J4+2 ) / Z( J4-3 )
319 IF( D.LT.DTHRESH ) D = ZERO
320 DMIN = MIN( DMIN, D )
321 Z( J4-1 ) = Z( J4 )*TEMP
322 EMIN = MIN( Z( J4-1 ), EMIN )
326 * Unroll last two steps.
332 Z( J4-2 ) = DNM2 + Z( J4P2 )
333 Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
334 DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
335 DMIN = MIN( DMIN, DNM1 )
340 Z( J4-2 ) = DNM1 + Z( J4P2 )
341 Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
342 DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
343 DMIN = MIN( DMIN, DN )
347 * Code for non IEEE arithmetic.
350 DO 70 J4 = 4*I0, 4*( N0-3 ), 4
351 Z( J4-2 ) = D + Z( J4-1 )
355 Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
356 D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU
358 IF( D.LT.DTHRESH) D = ZERO
359 DMIN = MIN( DMIN, D )
360 EMIN = MIN( EMIN, Z( J4 ) )
363 DO 80 J4 = 4*I0, 4*( N0-3 ), 4
364 Z( J4-3 ) = D + Z( J4 )
368 Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
369 D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU
371 IF( D.LT.DTHRESH) D = ZERO
372 DMIN = MIN( DMIN, D )
373 EMIN = MIN( EMIN, Z( J4-1 ) )
377 * Unroll last two steps.
383 Z( J4-2 ) = DNM2 + Z( J4P2 )
384 IF( DNM2.LT.ZERO ) THEN
387 Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
388 DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
390 DMIN = MIN( DMIN, DNM1 )
395 Z( J4-2 ) = DNM1 + Z( J4P2 )
396 IF( DNM1.LT.ZERO ) THEN
399 Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
400 DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
402 DMIN = MIN( DMIN, DN )