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 ..
177
IF( ( N0-I0-1 ).LE.0 )
180
DTHRESH = EPS*(SIGMA+TAU)
181
IF( TAU.LT.DTHRESH*HALF ) TAU = ZERO
182
IF( TAU.NE.ZERO ) THEN
191
* Code for IEEE arithmetic.
194
DO 10 J4 = 4*I0, 4*( N0-3 ), 4
195
Z( J4-2 ) = D + Z( J4-1 )
196
TEMP = Z( J4+1 ) / Z( J4-2 )
198
DMIN = MIN( DMIN, D )
199
Z( J4 ) = Z( J4-1 )*TEMP
200
EMIN = MIN( Z( J4 ), EMIN )
203
DO 20 J4 = 4*I0, 4*( N0-3 ), 4
204
Z( J4-3 ) = D + Z( J4 )
205
TEMP = Z( J4+2 ) / Z( J4-3 )
207
DMIN = MIN( DMIN, D )
208
Z( J4-1 ) = Z( J4 )*TEMP
209
EMIN = MIN( Z( J4-1 ), EMIN )
213
* Unroll last two steps.
219
Z( J4-2 ) = DNM2 + Z( J4P2 )
220
Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
221
DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
222
DMIN = MIN( DMIN, DNM1 )
227
Z( J4-2 ) = DNM1 + Z( J4P2 )
228
Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
229
DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
230
DMIN = MIN( DMIN, DN )
234
* Code for non IEEE arithmetic.
237
DO 30 J4 = 4*I0, 4*( N0-3 ), 4
238
Z( J4-2 ) = D + Z( J4-1 )
242
Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
243
D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU
245
DMIN = MIN( DMIN, D )
246
EMIN = MIN( EMIN, Z( J4 ) )
249
DO 40 J4 = 4*I0, 4*( N0-3 ), 4
250
Z( J4-3 ) = D + Z( J4 )
254
Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
255
D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU
257
DMIN = MIN( DMIN, D )
258
EMIN = MIN( EMIN, Z( J4-1 ) )
262
* Unroll last two steps.
268
Z( J4-2 ) = DNM2 + Z( J4P2 )
269
IF( DNM2.LT.ZERO ) THEN
272
Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
273
DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
275
DMIN = MIN( DMIN, DNM1 )
280
Z( J4-2 ) = DNM1 + Z( J4P2 )
281
IF( DNM1.LT.ZERO ) THEN
284
Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
285
DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
287
DMIN = MIN( DMIN, DN )
291
* This is the version that sets d's to zero if they are small enough
299
* Code for IEEE arithmetic.
302
DO 50 J4 = 4*I0, 4*( N0-3 ), 4
303
Z( J4-2 ) = D + Z( J4-1 )
304
TEMP = Z( J4+1 ) / Z( J4-2 )
306
IF( D.LT.DTHRESH ) D = ZERO
307
DMIN = MIN( DMIN, D )
308
Z( J4 ) = Z( J4-1 )*TEMP
309
EMIN = MIN( Z( J4 ), EMIN )
312
DO 60 J4 = 4*I0, 4*( N0-3 ), 4
313
Z( J4-3 ) = D + Z( J4 )
314
TEMP = Z( J4+2 ) / Z( J4-3 )
316
IF( D.LT.DTHRESH ) D = ZERO
317
DMIN = MIN( DMIN, D )
318
Z( J4-1 ) = Z( J4 )*TEMP
319
EMIN = MIN( Z( J4-1 ), EMIN )
323
* Unroll last two steps.
329
Z( J4-2 ) = DNM2 + Z( J4P2 )
330
Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
331
DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
332
DMIN = MIN( DMIN, DNM1 )
337
Z( J4-2 ) = DNM1 + Z( J4P2 )
338
Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
339
DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
340
DMIN = MIN( DMIN, DN )
344
* Code for non IEEE arithmetic.
347
DO 70 J4 = 4*I0, 4*( N0-3 ), 4
348
Z( J4-2 ) = D + Z( J4-1 )
352
Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
353
D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU
355
IF( D.LT.DTHRESH) D = ZERO
356
DMIN = MIN( DMIN, D )
357
EMIN = MIN( EMIN, Z( J4 ) )
360
DO 80 J4 = 4*I0, 4*( N0-3 ), 4
361
Z( J4-3 ) = D + Z( J4 )
365
Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
366
D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU
368
IF( D.LT.DTHRESH) D = ZERO
369
DMIN = MIN( DMIN, D )
370
EMIN = MIN( EMIN, Z( J4-1 ) )
374
* Unroll last two steps.
380
Z( J4-2 ) = DNM2 + Z( J4P2 )
381
IF( DNM2.LT.ZERO ) THEN
384
Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
385
DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
387
DMIN = MIN( DMIN, DNM1 )
392
Z( J4-2 ) = DNM1 + Z( J4P2 )
393
IF( DNM1.LT.ZERO ) THEN
396
Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
397
DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
399
DMIN = MIN( DMIN, DN )