3 /* Subroutine */ int dlasq4_(integer *i0, integer *n0, doublereal *z__,
4 integer *pp, integer *n0in, doublereal *dmin__, doublereal *dmin1,
5 doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2,
6 doublereal *tau, integer *ttype)
10 static doublereal g = 0.;
12 /* System generated locals */
14 doublereal d__1, d__2;
16 /* Builtin functions */
17 double sqrt(doublereal);
20 doublereal s, a2, b1, b2;
22 doublereal gam, gap1, gap2;
25 /* -- LAPACK auxiliary routine (version 3.1) -- */
26 /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
29 /* .. Scalar Arguments .. */
31 /* .. Array Arguments .. */
37 /* DLASQ4 computes an approximation TAU to the smallest eigenvalue */
38 /* using values of d from the previous transform. */
40 /* I0 (input) INTEGER */
43 /* N0 (input) INTEGER */
46 /* Z (input) DOUBLE PRECISION array, dimension ( 4*N ) */
47 /* Z holds the qd array. */
49 /* PP (input) INTEGER */
50 /* PP=0 for ping, PP=1 for pong. */
52 /* N0IN (input) INTEGER */
53 /* The value of N0 at start of EIGTEST. */
55 /* DMIN (input) DOUBLE PRECISION */
56 /* Minimum value of d. */
58 /* DMIN1 (input) DOUBLE PRECISION */
59 /* Minimum value of d, excluding D( N0 ). */
61 /* DMIN2 (input) DOUBLE PRECISION */
62 /* Minimum value of d, excluding D( N0 ) and D( N0-1 ). */
64 /* DN (input) DOUBLE PRECISION */
67 /* DN1 (input) DOUBLE PRECISION */
70 /* DN2 (input) DOUBLE PRECISION */
73 /* TAU (output) DOUBLE PRECISION */
74 /* This is the shift. */
76 /* TTYPE (output) INTEGER */
83 /* ===================================================================== */
85 /* .. Parameters .. */
87 /* .. Local Scalars .. */
89 /* .. Intrinsic Functions .. */
91 /* .. Save statement .. */
93 /* .. Data statement .. */
94 /* Parameter adjustments */
99 /* .. Executable Statements .. */
101 /* A negative DMIN forces the shift to take that absolute value */
102 /* TTYPE records the type of shift. */
110 nn = (*n0 << 2) + *pp;
113 /* No eigenvalues deflated. */
115 if (*dmin__ == *dn || *dmin__ == *dn1) {
117 b1 = sqrt(z__[nn - 3]) * sqrt(z__[nn - 5]);
118 b2 = sqrt(z__[nn - 7]) * sqrt(z__[nn - 9]);
119 a2 = z__[nn - 7] + z__[nn - 5];
123 if (*dmin__ == *dn && *dmin1 == *dn1) {
124 gap2 = *dmin2 - a2 - *dmin2 * .25;
125 if (gap2 > 0. && gap2 > b2) {
126 gap1 = a2 - *dn - b2 / gap2 * b2;
128 gap1 = a2 - *dn - (b1 + b2);
130 if (gap1 > 0. && gap1 > b1) {
132 d__1 = *dn - b1 / gap1 * b1, d__2 = *dmin__ * .5;
142 d__1 = s, d__2 = a2 - (b1 + b2);
146 d__1 = s, d__2 = *dmin__ * .333;
156 if (*dmin__ == *dn) {
159 if (z__[nn - 5] > z__[nn - 7]) {
162 b2 = z__[nn - 5] / z__[nn - 7];
165 np = nn - (*pp << 1);
168 if (z__[np - 4] > z__[np - 2]) {
171 a2 = z__[np - 4] / z__[np - 2];
172 if (z__[nn - 9] > z__[nn - 11]) {
175 b2 = z__[nn - 9] / z__[nn - 11];
179 /* Approximate contribution to norm squared from I < NN-1. */
182 i__1 = (*i0 << 2) - 1 + *pp;
183 for (i4 = np; i4 >= i__1; i4 += -4) {
188 if (z__[i4] > z__[i4 - 2]) {
191 b2 *= z__[i4] / z__[i4 - 2];
193 if (max(b2,b1) * 100. < a2 || .563 < a2) {
201 /* Rayleigh quotient residual bound. */
204 s = gam * (1. - sqrt(a2)) / (a2 + 1.);
207 } else if (*dmin__ == *dn2) {
214 /* Compute contribution to norm squared from I > NN-2. */
216 np = nn - (*pp << 1);
220 if (z__[np - 8] > b2 || z__[np - 4] > b1) {
223 a2 = z__[np - 8] / b2 * (z__[np - 4] / b1 + 1.);
225 /* Approximate contribution to norm squared from I < NN-2. */
228 b2 = z__[nn - 13] / z__[nn - 15];
230 i__1 = (*i0 << 2) - 1 + *pp;
231 for (i4 = nn - 17; i4 >= i__1; i4 += -4) {
236 if (z__[i4] > z__[i4 - 2]) {
239 b2 *= z__[i4] / z__[i4 - 2];
241 if (max(b2,b1) * 100. < a2 || .563 < a2) {
251 s = gam * (1. - sqrt(a2)) / (a2 + 1.);
255 /* Case 6, no information to guide us. */
258 g += (1. - g) * .333;
259 } else if (*ttype == -18) {
260 g = .083250000000000005;
268 } else if (*n0in == *n0 + 1) {
270 /* One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN. */
272 if (*dmin1 == *dn1 && *dmin2 == *dn2) {
278 if (z__[nn - 5] > z__[nn - 7]) {
281 b1 = z__[nn - 5] / z__[nn - 7];
286 i__1 = (*i0 << 2) - 1 + *pp;
287 for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) {
289 if (z__[i4] > z__[i4 - 2]) {
292 b1 *= z__[i4] / z__[i4 - 2];
294 if (max(b1,a2) * 100. < b2) {
300 b2 = sqrt(b2 * 1.05);
301 /* Computing 2nd power */
303 a2 = *dmin1 / (d__1 * d__1 + 1.);
304 gap2 = *dmin2 * .5 - a2;
305 if (gap2 > 0. && gap2 > b2 * a2) {
307 d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2);
311 d__1 = s, d__2 = a2 * (1. - b2 * 1.01);
320 if (*dmin1 == *dn1) {
326 } else if (*n0in == *n0 + 2) {
328 /* Two eigenvalues deflated. Use DMIN2, DN2 for DMIN and DN. */
330 /* Cases 10 and 11. */
332 if (*dmin2 == *dn2 && z__[nn - 5] * 2. < z__[nn - 7]) {
335 if (z__[nn - 5] > z__[nn - 7]) {
338 b1 = z__[nn - 5] / z__[nn - 7];
343 i__1 = (*i0 << 2) - 1 + *pp;
344 for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) {
345 if (z__[i4] > z__[i4 - 2]) {
348 b1 *= z__[i4] / z__[i4 - 2];
350 if (b1 * 100. < b2) {
356 b2 = sqrt(b2 * 1.05);
357 /* Computing 2nd power */
359 a2 = *dmin2 / (d__1 * d__1 + 1.);
360 gap2 = z__[nn - 7] + z__[nn - 9] - sqrt(z__[nn - 11]) * sqrt(z__[
362 if (gap2 > 0. && gap2 > b2 * a2) {
364 d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2);
368 d__1 = s, d__2 = a2 * (1. - b2 * 1.01);
375 } else if (*n0in > *n0 + 2) {
377 /* Case 12, more than two eigenvalues deflated. No information. */