Coverage Report

Created: 2025-09-11 18:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/root/doris/contrib/openblas/lapack-netlib/SRC/slasq2.c
Line
Count
Source
1
#include <math.h>
2
#include <stdlib.h>
3
#include <string.h>
4
#include <stdio.h>
5
#include <complex.h>
6
#ifdef complex
7
#undef complex
8
#endif
9
#ifdef I
10
#undef I
11
#endif
12
13
#if defined(_WIN64)
14
typedef long long BLASLONG;
15
typedef unsigned long long BLASULONG;
16
#else
17
typedef long BLASLONG;
18
typedef unsigned long BLASULONG;
19
#endif
20
21
#ifdef LAPACK_ILP64
22
typedef BLASLONG blasint;
23
#if defined(_WIN64)
24
#define blasabs(x) llabs(x)
25
#else
26
#define blasabs(x) labs(x)
27
#endif
28
#else
29
typedef int blasint;
30
#define blasabs(x) abs(x)
31
#endif
32
33
typedef blasint integer;
34
35
typedef unsigned int uinteger;
36
typedef char *address;
37
typedef short int shortint;
38
typedef float real;
39
typedef double doublereal;
40
typedef struct { real r, i; } complex;
41
typedef struct { doublereal r, i; } doublecomplex;
42
#ifdef _MSC_VER
43
static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;}
44
static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;}
45
static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;}
46
static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;}
47
#else
48
0
static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;}
49
0
static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;}
50
0
static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;}
51
0
static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;}
52
#endif
53
#define pCf(z) (*_pCf(z))
54
#define pCd(z) (*_pCd(z))
55
typedef blasint logical;
56
57
typedef char logical1;
58
typedef char integer1;
59
60
#define TRUE_ (1)
61
0
#define FALSE_ (0)
62
63
/* Extern is for use with -E */
64
#ifndef Extern
65
#define Extern extern
66
#endif
67
68
/* I/O stuff */
69
70
typedef int flag;
71
typedef int ftnlen;
72
typedef int ftnint;
73
74
/*external read, write*/
75
typedef struct
76
{ flag cierr;
77
  ftnint ciunit;
78
  flag ciend;
79
  char *cifmt;
80
  ftnint cirec;
81
} cilist;
82
83
/*internal read, write*/
84
typedef struct
85
{ flag icierr;
86
  char *iciunit;
87
  flag iciend;
88
  char *icifmt;
89
  ftnint icirlen;
90
  ftnint icirnum;
91
} icilist;
92
93
/*open*/
94
typedef struct
95
{ flag oerr;
96
  ftnint ounit;
97
  char *ofnm;
98
  ftnlen ofnmlen;
99
  char *osta;
100
  char *oacc;
101
  char *ofm;
102
  ftnint orl;
103
  char *oblnk;
104
} olist;
105
106
/*close*/
107
typedef struct
108
{ flag cerr;
109
  ftnint cunit;
110
  char *csta;
111
} cllist;
112
113
/*rewind, backspace, endfile*/
114
typedef struct
115
{ flag aerr;
116
  ftnint aunit;
117
} alist;
118
119
/* inquire */
120
typedef struct
121
{ flag inerr;
122
  ftnint inunit;
123
  char *infile;
124
  ftnlen infilen;
125
  ftnint  *inex;  /*parameters in standard's order*/
126
  ftnint  *inopen;
127
  ftnint  *innum;
128
  ftnint  *innamed;
129
  char  *inname;
130
  ftnlen  innamlen;
131
  char  *inacc;
132
  ftnlen  inacclen;
133
  char  *inseq;
134
  ftnlen  inseqlen;
135
  char  *indir;
136
  ftnlen  indirlen;
137
  char  *infmt;
138
  ftnlen  infmtlen;
139
  char  *inform;
140
  ftnint  informlen;
141
  char  *inunf;
142
  ftnlen  inunflen;
143
  ftnint  *inrecl;
144
  ftnint  *innrec;
145
  char  *inblank;
146
  ftnlen  inblanklen;
147
} inlist;
148
149
#define VOID void
150
151
union Multitype { /* for multiple entry points */
152
  integer1 g;
153
  shortint h;
154
  integer i;
155
  /* longint j; */
156
  real r;
157
  doublereal d;
158
  complex c;
159
  doublecomplex z;
160
  };
161
162
typedef union Multitype Multitype;
163
164
struct Vardesc {  /* for Namelist */
165
  char *name;
166
  char *addr;
167
  ftnlen *dims;
168
  int  type;
169
  };
170
typedef struct Vardesc Vardesc;
171
172
struct Namelist {
173
  char *name;
174
  Vardesc **vars;
175
  int nvars;
176
  };
177
typedef struct Namelist Namelist;
178
179
0
#define abs(x) ((x) >= 0 ? (x) : -(x))
180
#define dabs(x) (fabs(x))
181
0
#define f2cmin(a,b) ((a) <= (b) ? (a) : (b))
182
0
#define f2cmax(a,b) ((a) >= (b) ? (a) : (b))
183
#define dmin(a,b) (f2cmin(a,b))
184
#define dmax(a,b) (f2cmax(a,b))
185
#define bit_test(a,b) ((a) >> (b) & 1)
186
#define bit_clear(a,b)  ((a) & ~((uinteger)1 << (b)))
187
#define bit_set(a,b)  ((a) |  ((uinteger)1 << (b)))
188
189
#define abort_() { sig_die("Fortran abort routine called", 1); }
190
#define c_abs(z) (cabsf(Cf(z)))
191
#define c_cos(R,Z) { pCf(R)=ccos(Cf(Z)); }
192
#ifdef _MSC_VER
193
#define c_div(c, a, b) {Cf(c)._Val[0] = (Cf(a)._Val[0]/Cf(b)._Val[0]); Cf(c)._Val[1]=(Cf(a)._Val[1]/Cf(b)._Val[1]);}
194
#define z_div(c, a, b) {Cd(c)._Val[0] = (Cd(a)._Val[0]/Cd(b)._Val[0]); Cd(c)._Val[1]=(Cd(a)._Val[1]/df(b)._Val[1]);}
195
#else
196
#define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);}
197
#define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);}
198
#endif
199
#define c_exp(R, Z) {pCf(R) = cexpf(Cf(Z));}
200
#define c_log(R, Z) {pCf(R) = clogf(Cf(Z));}
201
#define c_sin(R, Z) {pCf(R) = csinf(Cf(Z));}
202
//#define c_sqrt(R, Z) {*(R) = csqrtf(Cf(Z));}
203
#define c_sqrt(R, Z) {pCf(R) = csqrtf(Cf(Z));}
204
#define d_abs(x) (fabs(*(x)))
205
#define d_acos(x) (acos(*(x)))
206
#define d_asin(x) (asin(*(x)))
207
#define d_atan(x) (atan(*(x)))
208
#define d_atn2(x, y) (atan2(*(x),*(y)))
209
#define d_cnjg(R, Z) { pCd(R) = conj(Cd(Z)); }
210
#define r_cnjg(R, Z) { pCf(R) = conjf(Cf(Z)); }
211
#define d_cos(x) (cos(*(x)))
212
#define d_cosh(x) (cosh(*(x)))
213
#define d_dim(__a, __b) ( *(__a) > *(__b) ? *(__a) - *(__b) : 0.0 )
214
#define d_exp(x) (exp(*(x)))
215
#define d_imag(z) (cimag(Cd(z)))
216
#define r_imag(z) (cimagf(Cf(z)))
217
#define d_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x)))
218
#define r_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x)))
219
#define d_lg10(x) ( 0.43429448190325182765 * log(*(x)) )
220
#define r_lg10(x) ( 0.43429448190325182765 * log(*(x)) )
221
#define d_log(x) (log(*(x)))
222
#define d_mod(x, y) (fmod(*(x), *(y)))
223
#define u_nint(__x) ((__x)>=0 ? floor((__x) + .5) : -floor(.5 - (__x)))
224
#define d_nint(x) u_nint(*(x))
225
#define u_sign(__a,__b) ((__b) >= 0 ? ((__a) >= 0 ? (__a) : -(__a)) : -((__a) >= 0 ? (__a) : -(__a)))
226
#define d_sign(a,b) u_sign(*(a),*(b))
227
#define r_sign(a,b) u_sign(*(a),*(b))
228
#define d_sin(x) (sin(*(x)))
229
#define d_sinh(x) (sinh(*(x)))
230
#define d_sqrt(x) (sqrt(*(x)))
231
#define d_tan(x) (tan(*(x)))
232
#define d_tanh(x) (tanh(*(x)))
233
#define i_abs(x) abs(*(x))
234
#define i_dnnt(x) ((integer)u_nint(*(x)))
235
#define i_len(s, n) (n)
236
#define i_nint(x) ((integer)u_nint(*(x)))
237
#define i_sign(a,b) ((integer)u_sign((integer)*(a),(integer)*(b)))
238
#define pow_dd(ap, bp) ( pow(*(ap), *(bp)))
239
#define pow_si(B,E) spow_ui(*(B),*(E))
240
#define pow_ri(B,E) spow_ui(*(B),*(E))
241
#define pow_di(B,E) dpow_ui(*(B),*(E))
242
#define pow_zi(p, a, b) {pCd(p) = zpow_ui(Cd(a), *(b));}
243
#define pow_ci(p, a, b) {pCf(p) = cpow_ui(Cf(a), *(b));}
244
#define pow_zz(R,A,B) {pCd(R) = cpow(Cd(A),*(B));}
245
#define s_cat(lpp, rpp, rnp, np, llp) {   ftnlen i, nc, ll; char *f__rp, *lp;   ll = (llp); lp = (lpp);   for(i=0; i < (int)*(np); ++i) {           nc = ll;          if((rnp)[i] < nc) nc = (rnp)[i];          ll -= nc;           f__rp = (rpp)[i];           while(--nc >= 0) *lp++ = *(f__rp)++;         }  while(--ll >= 0) *lp++ = ' '; }
246
#define s_cmp(a,b,c,d) ((integer)strncmp((a),(b),f2cmin((c),(d))))
247
#define s_copy(A,B,C,D) { int __i,__m; for (__i=0, __m=f2cmin((C),(D)); __i<__m && (B)[__i] != 0; ++__i) (A)[__i] = (B)[__i]; }
248
#define sig_die(s, kill) { exit(1); }
249
#define s_stop(s, n) {exit(0);}
250
static char junk[] = "\n@(#)LIBF77 VERSION 19990503\n";
251
#define z_abs(z) (cabs(Cd(z)))
252
#define z_exp(R, Z) {pCd(R) = cexp(Cd(Z));}
253
#define z_sqrt(R, Z) {pCd(R) = csqrt(Cd(Z));}
254
#define myexit_() break;
255
#define mycycle() continue;
256
#define myceiling(w) {ceil(w)}
257
#define myhuge(w) {HUGE_VAL}
258
//#define mymaxloc_(w,s,e,n) {if (sizeof(*(w)) == sizeof(double)) dmaxloc_((w),*(s),*(e),n); else dmaxloc_((w),*(s),*(e),n);}
259
#define mymaxloc(w,s,e,n) {dmaxloc_(w,*(s),*(e),n)}
260
261
/* procedure parameter types for -A and -C++ */
262
263
264
#ifdef __cplusplus
265
typedef logical (*L_fp)(...);
266
#else
267
typedef logical (*L_fp)();
268
#endif
269
270
0
static float spow_ui(float x, integer n) {
271
0
  float pow=1.0; unsigned long int u;
272
0
  if(n != 0) {
273
0
    if(n < 0) n = -n, x = 1/x;
274
0
    for(u = n; ; ) {
275
0
      if(u & 01) pow *= x;
276
0
      if(u >>= 1) x *= x;
277
0
      else break;
278
0
    }
279
0
  }
280
0
  return pow;
281
0
}
282
0
static double dpow_ui(double x, integer n) {
283
0
  double pow=1.0; unsigned long int u;
284
0
  if(n != 0) {
285
0
    if(n < 0) n = -n, x = 1/x;
286
0
    for(u = n; ; ) {
287
0
      if(u & 01) pow *= x;
288
0
      if(u >>= 1) x *= x;
289
0
      else break;
290
0
    }
291
0
  }
292
0
  return pow;
293
0
}
294
#ifdef _MSC_VER
295
static _Fcomplex cpow_ui(complex x, integer n) {
296
  complex pow={1.0,0.0}; unsigned long int u;
297
    if(n != 0) {
298
    if(n < 0) n = -n, x.r = 1/x.r, x.i=1/x.i;
299
    for(u = n; ; ) {
300
      if(u & 01) pow.r *= x.r, pow.i *= x.i;
301
      if(u >>= 1) x.r *= x.r, x.i *= x.i;
302
      else break;
303
    }
304
  }
305
  _Fcomplex p={pow.r, pow.i};
306
  return p;
307
}
308
#else
309
0
static _Complex float cpow_ui(_Complex float x, integer n) {
310
0
  _Complex float pow=1.0; unsigned long int u;
311
0
  if(n != 0) {
312
0
    if(n < 0) n = -n, x = 1/x;
313
0
    for(u = n; ; ) {
314
0
      if(u & 01) pow *= x;
315
0
      if(u >>= 1) x *= x;
316
0
      else break;
317
0
    }
318
0
  }
319
0
  return pow;
320
0
}
321
#endif
322
#ifdef _MSC_VER
323
static _Dcomplex zpow_ui(_Dcomplex x, integer n) {
324
  _Dcomplex pow={1.0,0.0}; unsigned long int u;
325
  if(n != 0) {
326
    if(n < 0) n = -n, x._Val[0] = 1/x._Val[0], x._Val[1] =1/x._Val[1];
327
    for(u = n; ; ) {
328
      if(u & 01) pow._Val[0] *= x._Val[0], pow._Val[1] *= x._Val[1];
329
      if(u >>= 1) x._Val[0] *= x._Val[0], x._Val[1] *= x._Val[1];
330
      else break;
331
    }
332
  }
333
  _Dcomplex p = {pow._Val[0], pow._Val[1]};
334
  return p;
335
}
336
#else
337
0
static _Complex double zpow_ui(_Complex double x, integer n) {
338
0
  _Complex double pow=1.0; unsigned long int u;
339
0
  if(n != 0) {
340
0
    if(n < 0) n = -n, x = 1/x;
341
0
    for(u = n; ; ) {
342
0
      if(u & 01) pow *= x;
343
0
      if(u >>= 1) x *= x;
344
0
      else break;
345
0
    }
346
0
  }
347
0
  return pow;
348
0
}
349
#endif
350
0
static integer pow_ii(integer x, integer n) {
351
0
  integer pow; unsigned long int u;
352
0
  if (n <= 0) {
353
0
    if (n == 0 || x == 1) pow = 1;
354
0
    else if (x != -1) pow = x == 0 ? 1/x : 0;
355
0
    else n = -n;
356
0
  }
357
0
  if ((n > 0) || !(n == 0 || x == 1 || x != -1)) {
358
0
    u = n;
359
0
    for(pow = 1; ; ) {
360
0
      if(u & 01) pow *= x;
361
0
      if(u >>= 1) x *= x;
362
0
      else break;
363
0
    }
364
0
  }
365
0
  return pow;
366
0
}
367
static integer dmaxloc_(double *w, integer s, integer e, integer *n)
368
0
{
369
0
  double m; integer i, mi;
370
0
  for(m=w[s-1], mi=s, i=s+1; i<=e; i++)
371
0
    if (w[i-1]>m) mi=i ,m=w[i-1];
372
0
  return mi-s+1;
373
0
}
374
static integer smaxloc_(float *w, integer s, integer e, integer *n)
375
0
{
376
0
  float m; integer i, mi;
377
0
  for(m=w[s-1], mi=s, i=s+1; i<=e; i++)
378
0
    if (w[i-1]>m) mi=i ,m=w[i-1];
379
0
  return mi-s+1;
380
0
}
381
0
static inline void cdotc_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) {
382
0
  integer n = *n_, incx = *incx_, incy = *incy_, i;
383
0
#ifdef _MSC_VER
384
0
  _Fcomplex zdotc = {0.0, 0.0};
385
0
  if (incx == 1 && incy == 1) {
386
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
387
0
      zdotc._Val[0] += conjf(Cf(&x[i]))._Val[0] * Cf(&y[i])._Val[0];
388
0
      zdotc._Val[1] += conjf(Cf(&x[i]))._Val[1] * Cf(&y[i])._Val[1];
389
0
    }
390
0
  } else {
391
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
392
0
      zdotc._Val[0] += conjf(Cf(&x[i*incx]))._Val[0] * Cf(&y[i*incy])._Val[0];
393
0
      zdotc._Val[1] += conjf(Cf(&x[i*incx]))._Val[1] * Cf(&y[i*incy])._Val[1];
394
0
    }
395
0
  }
396
0
  pCf(z) = zdotc;
397
0
}
398
0
#else
399
0
  _Complex float zdotc = 0.0;
400
0
  if (incx == 1 && incy == 1) {
401
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
402
0
      zdotc += conjf(Cf(&x[i])) * Cf(&y[i]);
403
0
    }
404
0
  } else {
405
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
406
0
      zdotc += conjf(Cf(&x[i*incx])) * Cf(&y[i*incy]);
407
0
    }
408
0
  }
409
0
  pCf(z) = zdotc;
410
0
}
411
#endif
412
0
static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) {
413
0
  integer n = *n_, incx = *incx_, incy = *incy_, i;
414
0
#ifdef _MSC_VER
415
0
  _Dcomplex zdotc = {0.0, 0.0};
416
0
  if (incx == 1 && incy == 1) {
417
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
418
0
      zdotc._Val[0] += conj(Cd(&x[i]))._Val[0] * Cd(&y[i])._Val[0];
419
0
      zdotc._Val[1] += conj(Cd(&x[i]))._Val[1] * Cd(&y[i])._Val[1];
420
0
    }
421
0
  } else {
422
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
423
0
      zdotc._Val[0] += conj(Cd(&x[i*incx]))._Val[0] * Cd(&y[i*incy])._Val[0];
424
0
      zdotc._Val[1] += conj(Cd(&x[i*incx]))._Val[1] * Cd(&y[i*incy])._Val[1];
425
0
    }
426
0
  }
427
0
  pCd(z) = zdotc;
428
0
}
429
0
#else
430
0
  _Complex double zdotc = 0.0;
431
0
  if (incx == 1 && incy == 1) {
432
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
433
0
      zdotc += conj(Cd(&x[i])) * Cd(&y[i]);
434
0
    }
435
0
  } else {
436
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
437
0
      zdotc += conj(Cd(&x[i*incx])) * Cd(&y[i*incy]);
438
0
    }
439
0
  }
440
0
  pCd(z) = zdotc;
441
0
}
442
#endif  
443
0
static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) {
444
0
  integer n = *n_, incx = *incx_, incy = *incy_, i;
445
0
#ifdef _MSC_VER
446
0
  _Fcomplex zdotc = {0.0, 0.0};
447
0
  if (incx == 1 && incy == 1) {
448
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
449
0
      zdotc._Val[0] += Cf(&x[i])._Val[0] * Cf(&y[i])._Val[0];
450
0
      zdotc._Val[1] += Cf(&x[i])._Val[1] * Cf(&y[i])._Val[1];
451
0
    }
452
0
  } else {
453
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
454
0
      zdotc._Val[0] += Cf(&x[i*incx])._Val[0] * Cf(&y[i*incy])._Val[0];
455
0
      zdotc._Val[1] += Cf(&x[i*incx])._Val[1] * Cf(&y[i*incy])._Val[1];
456
0
    }
457
0
  }
458
0
  pCf(z) = zdotc;
459
0
}
460
0
#else
461
0
  _Complex float zdotc = 0.0;
462
0
  if (incx == 1 && incy == 1) {
463
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
464
0
      zdotc += Cf(&x[i]) * Cf(&y[i]);
465
0
    }
466
0
  } else {
467
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
468
0
      zdotc += Cf(&x[i*incx]) * Cf(&y[i*incy]);
469
0
    }
470
0
  }
471
0
  pCf(z) = zdotc;
472
0
}
473
#endif
474
0
static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) {
475
0
  integer n = *n_, incx = *incx_, incy = *incy_, i;
476
0
#ifdef _MSC_VER
477
0
  _Dcomplex zdotc = {0.0, 0.0};
478
0
  if (incx == 1 && incy == 1) {
479
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
480
0
      zdotc._Val[0] += Cd(&x[i])._Val[0] * Cd(&y[i])._Val[0];
481
0
      zdotc._Val[1] += Cd(&x[i])._Val[1] * Cd(&y[i])._Val[1];
482
0
    }
483
0
  } else {
484
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
485
0
      zdotc._Val[0] += Cd(&x[i*incx])._Val[0] * Cd(&y[i*incy])._Val[0];
486
0
      zdotc._Val[1] += Cd(&x[i*incx])._Val[1] * Cd(&y[i*incy])._Val[1];
487
0
    }
488
0
  }
489
0
  pCd(z) = zdotc;
490
0
}
491
0
#else
492
0
  _Complex double zdotc = 0.0;
493
0
  if (incx == 1 && incy == 1) {
494
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
495
0
      zdotc += Cd(&x[i]) * Cd(&y[i]);
496
0
    }
497
0
  } else {
498
0
    for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
499
0
      zdotc += Cd(&x[i*incx]) * Cd(&y[i*incy]);
500
0
    }
501
0
  }
502
0
  pCd(z) = zdotc;
503
0
}
504
#endif
505
/*  -- translated by f2c (version 20000121).
506
   You must link the resulting object file with the libraries:
507
  -lf2c -lm   (in that order)
508
*/
509
510
511
512
513
/* Table of constant values */
514
515
static integer c__1 = 1;
516
static integer c__2 = 2;
517
518
/* > \brief \b SLASQ2 computes all the eigenvalues of the symmetric positive definite tridiagonal matrix assoc
519
iated with the qd Array Z to high relative accuracy. Used by sbdsqr and sstegr. */
520
521
/*  =========== DOCUMENTATION =========== */
522
523
/* Online html documentation available at */
524
/*            http://www.netlib.org/lapack/explore-html/ */
525
526
/* > \htmlonly */
527
/* > Download SLASQ2 + dependencies */
528
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slasq2.
529
f"> */
530
/* > [TGZ]</a> */
531
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slasq2.
532
f"> */
533
/* > [ZIP]</a> */
534
/* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slasq2.
535
f"> */
536
/* > [TXT]</a> */
537
/* > \endhtmlonly */
538
539
/*  Definition: */
540
/*  =========== */
541
542
/*       SUBROUTINE SLASQ2( N, Z, INFO ) */
543
544
/*       INTEGER            INFO, N */
545
/*       REAL               Z( * ) */
546
547
548
/* > \par Purpose: */
549
/*  ============= */
550
/* > */
551
/* > \verbatim */
552
/* > */
553
/* > SLASQ2 computes all the eigenvalues of the symmetric positive */
554
/* > definite tridiagonal matrix associated with the qd array Z to high */
555
/* > relative accuracy are computed to high relative accuracy, in the */
556
/* > absence of denormalization, underflow and overflow. */
557
/* > */
558
/* > To see the relation of Z to the tridiagonal matrix, let L be a */
559
/* > unit lower bidiagonal matrix with subdiagonals Z(2,4,6,,..) and */
560
/* > let U be an upper bidiagonal matrix with 1's above and diagonal */
561
/* > Z(1,3,5,,..). The tridiagonal is L*U or, if you prefer, the */
562
/* > symmetric tridiagonal to which it is similar. */
563
/* > */
564
/* > Note : SLASQ2 defines a logical variable, IEEE, which is true */
565
/* > on machines which follow ieee-754 floating-point standard in their */
566
/* > handling of infinities and NaNs, and false otherwise. This variable */
567
/* > is passed to SLASQ3. */
568
/* > \endverbatim */
569
570
/*  Arguments: */
571
/*  ========== */
572
573
/* > \param[in] N */
574
/* > \verbatim */
575
/* >          N is INTEGER */
576
/* >        The number of rows and columns in the matrix. N >= 0. */
577
/* > \endverbatim */
578
/* > */
579
/* > \param[in,out] Z */
580
/* > \verbatim */
581
/* >          Z is REAL array, dimension ( 4*N ) */
582
/* >        On entry Z holds the qd array. On exit, entries 1 to N hold */
583
/* >        the eigenvalues in decreasing order, Z( 2*N+1 ) holds the */
584
/* >        trace, and Z( 2*N+2 ) holds the sum of the eigenvalues. If */
585
/* >        N > 2, then Z( 2*N+3 ) holds the iteration count, Z( 2*N+4 ) */
586
/* >        holds NDIVS/NIN^2, and Z( 2*N+5 ) holds the percentage of */
587
/* >        shifts that failed. */
588
/* > \endverbatim */
589
/* > */
590
/* > \param[out] INFO */
591
/* > \verbatim */
592
/* >          INFO is INTEGER */
593
/* >        = 0: successful exit */
594
/* >        < 0: if the i-th argument is a scalar and had an illegal */
595
/* >             value, then INFO = -i, if the i-th argument is an */
596
/* >             array and the j-entry had an illegal value, then */
597
/* >             INFO = -(i*100+j) */
598
/* >        > 0: the algorithm failed */
599
/* >              = 1, a split was marked by a positive value in E */
600
/* >              = 2, current block of Z not diagonalized after 100*N */
601
/* >                   iterations (in inner while loop).  On exit Z holds */
602
/* >                   a qd array with the same eigenvalues as the given Z. */
603
/* >              = 3, termination criterion of outer while loop not met */
604
/* >                   (program created more than N unreduced blocks) */
605
/* > \endverbatim */
606
607
/*  Authors: */
608
/*  ======== */
609
610
/* > \author Univ. of Tennessee */
611
/* > \author Univ. of California Berkeley */
612
/* > \author Univ. of Colorado Denver */
613
/* > \author NAG Ltd. */
614
615
/* > \date December 2016 */
616
617
/* > \ingroup auxOTHERcomputational */
618
619
/* > \par Further Details: */
620
/*  ===================== */
621
/* > */
622
/* > \verbatim */
623
/* > */
624
/* >  Local Variables: I0:N0 defines a current unreduced segment of Z. */
625
/* >  The shifts are accumulated in SIGMA. Iteration count is in ITER. */
626
/* >  Ping-pong is controlled by PP (alternates between 0 and 1). */
627
/* > \endverbatim */
628
/* > */
629
/*  ===================================================================== */
630
/* Subroutine */ void slasq2_(integer *n, real *z__, integer *info)
631
0
{
632
    /* System generated locals */
633
0
    integer i__1, i__2, i__3;
634
0
    real r__1, r__2;
635
636
    /* Local variables */
637
0
    logical ieee;
638
0
    integer nbig;
639
0
    real dmin__, emin, emax;
640
0
    integer kmin, ndiv, iter;
641
0
    real qmin, temp, qmax, zmax;
642
0
    integer splt;
643
0
    real dmin1, dmin2, d__, e, g;
644
0
    integer k;
645
0
    real s, t;
646
0
    integer nfail;
647
0
    real desig, trace, sigma;
648
0
    integer iinfo;
649
0
    real tempe, tempq;
650
0
    integer i0, i1, i4, n0, n1, ttype;
651
0
    extern /* Subroutine */ void slasq3_(integer *, integer *, real *, integer 
652
0
      *, real *, real *, real *, real *, integer *, integer *, integer *
653
0
      , logical *, integer *, real *, real *, real *, real *, real *, 
654
0
      real *, real *);
655
0
    real dn;
656
0
    integer pp;
657
0
    real deemin;
658
0
    extern real slamch_(char *);
659
0
    integer iwhila, iwhilb;
660
0
    real oldemn, safmin;
661
0
    extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen);
662
0
    real dn1, dn2;
663
0
    extern /* Subroutine */ void slasrt_(char *, integer *, real *, integer *);
664
0
    real dee, eps, tau, tol;
665
0
    integer ipn4;
666
0
    real tol2;
667
668
669
/*  -- LAPACK computational routine (version 3.7.0) -- */
670
/*  -- LAPACK is a software package provided by Univ. of Tennessee,    -- */
671
/*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
672
/*     December 2016 */
673
674
675
/*  ===================================================================== */
676
677
678
/*     Test the input arguments. */
679
/*     (in case SLASQ2 is not called by SLASQ1) */
680
681
    /* Parameter adjustments */
682
0
    --z__;
683
684
    /* Function Body */
685
0
    *info = 0;
686
0
    eps = slamch_("Precision");
687
0
    safmin = slamch_("Safe minimum");
688
0
    tol = eps * 100.f;
689
/* Computing 2nd power */
690
0
    r__1 = tol;
691
0
    tol2 = r__1 * r__1;
692
693
0
    if (*n < 0) {
694
0
  *info = -1;
695
0
  xerbla_("SLASQ2", &c__1, (ftnlen)6);
696
0
  return;
697
0
    } else if (*n == 0) {
698
0
  return;
699
0
    } else if (*n == 1) {
700
701
/*        1-by-1 case. */
702
703
0
  if (z__[1] < 0.f) {
704
0
      *info = -201;
705
0
      xerbla_("SLASQ2", &c__2, (ftnlen)6);
706
0
  }
707
0
  return;
708
0
    } else if (*n == 2) {
709
710
/*        2-by-2 case. */
711
712
0
  if (z__[1] < 0.f) {
713
0
      *info = -201;
714
0
      xerbla_("SLASQ2", &c__2, (ftnlen)6);
715
0
      return;
716
0
  } else if (z__[2] < 0.f) {
717
0
      *info = -202;
718
0
      xerbla_("SLASQ2", &c__2, (ftnlen)6);
719
0
      return;
720
0
  } else if (z__[3] < 0.f) {
721
0
      *info = -203;
722
0
      xerbla_("SLASQ2", &c__2, (ftnlen)6);
723
0
      return;
724
0
  } else if (z__[3] > z__[1]) {
725
0
      d__ = z__[3];
726
0
      z__[3] = z__[1];
727
0
      z__[1] = d__;
728
0
  }
729
0
  z__[5] = z__[1] + z__[2] + z__[3];
730
0
  if (z__[2] > z__[3] * tol2) {
731
0
      t = (z__[1] - z__[3] + z__[2]) * .5f;
732
0
      s = z__[3] * (z__[2] / t);
733
0
      if (s <= t) {
734
0
    s = z__[3] * (z__[2] / (t * (sqrt(s / t + 1.f) + 1.f)));
735
0
      } else {
736
0
    s = z__[3] * (z__[2] / (t + sqrt(t) * sqrt(t + s)));
737
0
      }
738
0
      t = z__[1] + (s + z__[2]);
739
0
      z__[3] *= z__[1] / t;
740
0
      z__[1] = t;
741
0
  }
742
0
  z__[2] = z__[3];
743
0
  z__[6] = z__[2] + z__[1];
744
0
  return;
745
0
    }
746
747
/*     Check for negative data and compute sums of q's and e's. */
748
749
0
    z__[*n * 2] = 0.f;
750
0
    emin = z__[2];
751
0
    qmax = 0.f;
752
0
    zmax = 0.f;
753
0
    d__ = 0.f;
754
0
    e = 0.f;
755
756
0
    i__1 = *n - 1 << 1;
757
0
    for (k = 1; k <= i__1; k += 2) {
758
0
  if (z__[k] < 0.f) {
759
0
      *info = -(k + 200);
760
0
      xerbla_("SLASQ2", &c__2, (ftnlen)6);
761
0
      return;
762
0
  } else if (z__[k + 1] < 0.f) {
763
0
      *info = -(k + 201);
764
0
      xerbla_("SLASQ2", &c__2, (ftnlen)6);
765
0
      return;
766
0
  }
767
0
  d__ += z__[k];
768
0
  e += z__[k + 1];
769
/* Computing MAX */
770
0
  r__1 = qmax, r__2 = z__[k];
771
0
  qmax = f2cmax(r__1,r__2);
772
/* Computing MIN */
773
0
  r__1 = emin, r__2 = z__[k + 1];
774
0
  emin = f2cmin(r__1,r__2);
775
/* Computing MAX */
776
0
  r__1 = f2cmax(qmax,zmax), r__2 = z__[k + 1];
777
0
  zmax = f2cmax(r__1,r__2);
778
/* L10: */
779
0
    }
780
0
    if (z__[(*n << 1) - 1] < 0.f) {
781
0
  *info = -((*n << 1) + 199);
782
0
  xerbla_("SLASQ2", &c__2, (ftnlen)6);
783
0
  return;
784
0
    }
785
0
    d__ += z__[(*n << 1) - 1];
786
/* Computing MAX */
787
0
    r__1 = qmax, r__2 = z__[(*n << 1) - 1];
788
0
    qmax = f2cmax(r__1,r__2);
789
0
    zmax = f2cmax(qmax,zmax);
790
791
/*     Check for diagonality. */
792
793
0
    if (e == 0.f) {
794
0
  i__1 = *n;
795
0
  for (k = 2; k <= i__1; ++k) {
796
0
      z__[k] = z__[(k << 1) - 1];
797
/* L20: */
798
0
  }
799
0
  slasrt_("D", n, &z__[1], &iinfo);
800
0
  z__[(*n << 1) - 1] = d__;
801
0
  return;
802
0
    }
803
804
0
    trace = d__ + e;
805
806
/*     Check for zero data. */
807
808
0
    if (trace == 0.f) {
809
0
  z__[(*n << 1) - 1] = 0.f;
810
0
  return;
811
0
    }
812
813
/*     Check whether the machine is IEEE conformable. */
814
815
/*     IEEE = ILAENV( 10, 'SLASQ2', 'N', 1, 2, 3, 4 ).EQ.1 .AND. */
816
/*    $       ILAENV( 11, 'SLASQ2', 'N', 1, 2, 3, 4 ).EQ.1 */
817
818
/*     [11/15/2008] The case IEEE=.TRUE. has a problem in single precision with */
819
/*     some the test matrices of type 16. The double precision code is fine. */
820
821
0
    ieee = FALSE_;
822
823
/*     Rearrange data for locality: Z=(q1,qq1,e1,ee1,q2,qq2,e2,ee2,...). */
824
825
0
    for (k = *n << 1; k >= 2; k += -2) {
826
0
  z__[k * 2] = 0.f;
827
0
  z__[(k << 1) - 1] = z__[k];
828
0
  z__[(k << 1) - 2] = 0.f;
829
0
  z__[(k << 1) - 3] = z__[k - 1];
830
/* L30: */
831
0
    }
832
833
0
    i0 = 1;
834
0
    n0 = *n;
835
836
/*     Reverse the qd-array, if warranted. */
837
838
0
    if (z__[(i0 << 2) - 3] * 1.5f < z__[(n0 << 2) - 3]) {
839
0
  ipn4 = i0 + n0 << 2;
840
0
  i__1 = i0 + n0 - 1 << 1;
841
0
  for (i4 = i0 << 2; i4 <= i__1; i4 += 4) {
842
0
      temp = z__[i4 - 3];
843
0
      z__[i4 - 3] = z__[ipn4 - i4 - 3];
844
0
      z__[ipn4 - i4 - 3] = temp;
845
0
      temp = z__[i4 - 1];
846
0
      z__[i4 - 1] = z__[ipn4 - i4 - 5];
847
0
      z__[ipn4 - i4 - 5] = temp;
848
/* L40: */
849
0
  }
850
0
    }
851
852
/*     Initial split checking via dqd and Li's test. */
853
854
0
    pp = 0;
855
856
0
    for (k = 1; k <= 2; ++k) {
857
858
0
  d__ = z__[(n0 << 2) + pp - 3];
859
0
  i__1 = (i0 << 2) + pp;
860
0
  for (i4 = (n0 - 1 << 2) + pp; i4 >= i__1; i4 += -4) {
861
0
      if (z__[i4 - 1] <= tol2 * d__) {
862
0
    z__[i4 - 1] = 0.f;
863
0
    d__ = z__[i4 - 3];
864
0
      } else {
865
0
    d__ = z__[i4 - 3] * (d__ / (d__ + z__[i4 - 1]));
866
0
      }
867
/* L50: */
868
0
  }
869
870
/*        dqd maps Z to ZZ plus Li's test. */
871
872
0
  emin = z__[(i0 << 2) + pp + 1];
873
0
  d__ = z__[(i0 << 2) + pp - 3];
874
0
  i__1 = (n0 - 1 << 2) + pp;
875
0
  for (i4 = (i0 << 2) + pp; i4 <= i__1; i4 += 4) {
876
0
      z__[i4 - (pp << 1) - 2] = d__ + z__[i4 - 1];
877
0
      if (z__[i4 - 1] <= tol2 * d__) {
878
0
    z__[i4 - 1] = 0.f;
879
0
    z__[i4 - (pp << 1) - 2] = d__;
880
0
    z__[i4 - (pp << 1)] = 0.f;
881
0
    d__ = z__[i4 + 1];
882
0
      } else if (safmin * z__[i4 + 1] < z__[i4 - (pp << 1) - 2] && 
883
0
        safmin * z__[i4 - (pp << 1) - 2] < z__[i4 + 1]) {
884
0
    temp = z__[i4 + 1] / z__[i4 - (pp << 1) - 2];
885
0
    z__[i4 - (pp << 1)] = z__[i4 - 1] * temp;
886
0
    d__ *= temp;
887
0
      } else {
888
0
    z__[i4 - (pp << 1)] = z__[i4 + 1] * (z__[i4 - 1] / z__[i4 - (
889
0
      pp << 1) - 2]);
890
0
    d__ = z__[i4 + 1] * (d__ / z__[i4 - (pp << 1) - 2]);
891
0
      }
892
/* Computing MIN */
893
0
      r__1 = emin, r__2 = z__[i4 - (pp << 1)];
894
0
      emin = f2cmin(r__1,r__2);
895
/* L60: */
896
0
  }
897
0
  z__[(n0 << 2) - pp - 2] = d__;
898
899
/*        Now find qmax. */
900
901
0
  qmax = z__[(i0 << 2) - pp - 2];
902
0
  i__1 = (n0 << 2) - pp - 2;
903
0
  for (i4 = (i0 << 2) - pp + 2; i4 <= i__1; i4 += 4) {
904
/* Computing MAX */
905
0
      r__1 = qmax, r__2 = z__[i4];
906
0
      qmax = f2cmax(r__1,r__2);
907
/* L70: */
908
0
  }
909
910
/*        Prepare for the next iteration on K. */
911
912
0
  pp = 1 - pp;
913
/* L80: */
914
0
    }
915
916
/*     Initialise variables to pass to SLASQ3. */
917
918
0
    ttype = 0;
919
0
    dmin1 = 0.f;
920
0
    dmin2 = 0.f;
921
0
    dn = 0.f;
922
0
    dn1 = 0.f;
923
0
    dn2 = 0.f;
924
0
    g = 0.f;
925
0
    tau = 0.f;
926
927
0
    iter = 2;
928
0
    nfail = 0;
929
0
    ndiv = n0 - i0 << 1;
930
931
0
    i__1 = *n + 1;
932
0
    for (iwhila = 1; iwhila <= i__1; ++iwhila) {
933
0
  if (n0 < 1) {
934
0
      goto L170;
935
0
  }
936
937
/*        While array unfinished do */
938
939
/*        E(N0) holds the value of SIGMA when submatrix in I0:N0 */
940
/*        splits from the rest of the array, but is negated. */
941
942
0
  desig = 0.f;
943
0
  if (n0 == *n) {
944
0
      sigma = 0.f;
945
0
  } else {
946
0
      sigma = -z__[(n0 << 2) - 1];
947
0
  }
948
0
  if (sigma < 0.f) {
949
0
      *info = 1;
950
0
      return;
951
0
  }
952
953
/*        Find last unreduced submatrix's top index I0, find QMAX and */
954
/*        EMIN. Find Gershgorin-type bound if Q's much greater than E's. */
955
956
0
  emax = 0.f;
957
0
  if (n0 > i0) {
958
0
      emin = (r__1 = z__[(n0 << 2) - 5], abs(r__1));
959
0
  } else {
960
0
      emin = 0.f;
961
0
  }
962
0
  qmin = z__[(n0 << 2) - 3];
963
0
  qmax = qmin;
964
0
  for (i4 = n0 << 2; i4 >= 8; i4 += -4) {
965
0
      if (z__[i4 - 5] <= 0.f) {
966
0
    goto L100;
967
0
      }
968
0
      if (qmin >= emax * 4.f) {
969
/* Computing MIN */
970
0
    r__1 = qmin, r__2 = z__[i4 - 3];
971
0
    qmin = f2cmin(r__1,r__2);
972
/* Computing MAX */
973
0
    r__1 = emax, r__2 = z__[i4 - 5];
974
0
    emax = f2cmax(r__1,r__2);
975
0
      }
976
/* Computing MAX */
977
0
      r__1 = qmax, r__2 = z__[i4 - 7] + z__[i4 - 5];
978
0
      qmax = f2cmax(r__1,r__2);
979
/* Computing MIN */
980
0
      r__1 = emin, r__2 = z__[i4 - 5];
981
0
      emin = f2cmin(r__1,r__2);
982
/* L90: */
983
0
  }
984
0
  i4 = 4;
985
986
0
L100:
987
0
  i0 = i4 / 4;
988
0
  pp = 0;
989
990
0
  if (n0 - i0 > 1) {
991
0
      dee = z__[(i0 << 2) - 3];
992
0
      deemin = dee;
993
0
      kmin = i0;
994
0
      i__2 = (n0 << 2) - 3;
995
0
      for (i4 = (i0 << 2) + 1; i4 <= i__2; i4 += 4) {
996
0
    dee = z__[i4] * (dee / (dee + z__[i4 - 2]));
997
0
    if (dee <= deemin) {
998
0
        deemin = dee;
999
0
        kmin = (i4 + 3) / 4;
1000
0
    }
1001
/* L110: */
1002
0
      }
1003
0
      if (kmin - i0 << 1 < n0 - kmin && deemin <= z__[(n0 << 2) - 3] * 
1004
0
        .5f) {
1005
0
    ipn4 = i0 + n0 << 2;
1006
0
    pp = 2;
1007
0
    i__2 = i0 + n0 - 1 << 1;
1008
0
    for (i4 = i0 << 2; i4 <= i__2; i4 += 4) {
1009
0
        temp = z__[i4 - 3];
1010
0
        z__[i4 - 3] = z__[ipn4 - i4 - 3];
1011
0
        z__[ipn4 - i4 - 3] = temp;
1012
0
        temp = z__[i4 - 2];
1013
0
        z__[i4 - 2] = z__[ipn4 - i4 - 2];
1014
0
        z__[ipn4 - i4 - 2] = temp;
1015
0
        temp = z__[i4 - 1];
1016
0
        z__[i4 - 1] = z__[ipn4 - i4 - 5];
1017
0
        z__[ipn4 - i4 - 5] = temp;
1018
0
        temp = z__[i4];
1019
0
        z__[i4] = z__[ipn4 - i4 - 4];
1020
0
        z__[ipn4 - i4 - 4] = temp;
1021
/* L120: */
1022
0
    }
1023
0
      }
1024
0
  }
1025
1026
/*        Put -(initial shift) into DMIN. */
1027
1028
/* Computing MAX */
1029
0
  r__1 = 0.f, r__2 = qmin - sqrt(qmin) * 2.f * sqrt(emax);
1030
0
  dmin__ = -f2cmax(r__1,r__2);
1031
1032
/*        Now I0:N0 is unreduced. */
1033
/*        PP = 0 for ping, PP = 1 for pong. */
1034
/*        PP = 2 indicates that flipping was applied to the Z array and */
1035
/*               and that the tests for deflation upon entry in SLASQ3 */
1036
/*               should not be performed. */
1037
1038
0
  nbig = (n0 - i0 + 1) * 100;
1039
0
  i__2 = nbig;
1040
0
  for (iwhilb = 1; iwhilb <= i__2; ++iwhilb) {
1041
0
      if (i0 > n0) {
1042
0
    goto L150;
1043
0
      }
1044
1045
/*           While submatrix unfinished take a good dqds step. */
1046
1047
0
      slasq3_(&i0, &n0, &z__[1], &pp, &dmin__, &sigma, &desig, &qmax, &
1048
0
        nfail, &iter, &ndiv, &ieee, &ttype, &dmin1, &dmin2, &dn, &
1049
0
        dn1, &dn2, &g, &tau);
1050
1051
0
      pp = 1 - pp;
1052
1053
/*           When EMIN is very small check for splits. */
1054
1055
0
      if (pp == 0 && n0 - i0 >= 3) {
1056
0
    if (z__[n0 * 4] <= tol2 * qmax || z__[(n0 << 2) - 1] <= tol2 *
1057
0
       sigma) {
1058
0
        splt = i0 - 1;
1059
0
        qmax = z__[(i0 << 2) - 3];
1060
0
        emin = z__[(i0 << 2) - 1];
1061
0
        oldemn = z__[i0 * 4];
1062
0
        i__3 = n0 - 3 << 2;
1063
0
        for (i4 = i0 << 2; i4 <= i__3; i4 += 4) {
1064
0
      if (z__[i4] <= tol2 * z__[i4 - 3] || z__[i4 - 1] <= 
1065
0
        tol2 * sigma) {
1066
0
          z__[i4 - 1] = -sigma;
1067
0
          splt = i4 / 4;
1068
0
          qmax = 0.f;
1069
0
          emin = z__[i4 + 3];
1070
0
          oldemn = z__[i4 + 4];
1071
0
      } else {
1072
/* Computing MAX */
1073
0
          r__1 = qmax, r__2 = z__[i4 + 1];
1074
0
          qmax = f2cmax(r__1,r__2);
1075
/* Computing MIN */
1076
0
          r__1 = emin, r__2 = z__[i4 - 1];
1077
0
          emin = f2cmin(r__1,r__2);
1078
/* Computing MIN */
1079
0
          r__1 = oldemn, r__2 = z__[i4];
1080
0
          oldemn = f2cmin(r__1,r__2);
1081
0
      }
1082
/* L130: */
1083
0
        }
1084
0
        z__[(n0 << 2) - 1] = emin;
1085
0
        z__[n0 * 4] = oldemn;
1086
0
        i0 = splt + 1;
1087
0
    }
1088
0
      }
1089
1090
/* L140: */
1091
0
  }
1092
1093
0
  *info = 2;
1094
1095
/*        Maximum number of iterations exceeded, restore the shift */
1096
/*        SIGMA and place the new d's and e's in a qd array. */
1097
/*        This might need to be done for several blocks */
1098
1099
0
  i1 = i0;
1100
0
  n1 = n0;
1101
0
L145:
1102
0
  tempq = z__[(i0 << 2) - 3];
1103
0
  z__[(i0 << 2) - 3] += sigma;
1104
0
  i__2 = n0;
1105
0
  for (k = i0 + 1; k <= i__2; ++k) {
1106
0
      tempe = z__[(k << 2) - 5];
1107
0
      z__[(k << 2) - 5] *= tempq / z__[(k << 2) - 7];
1108
0
      tempq = z__[(k << 2) - 3];
1109
0
      z__[(k << 2) - 3] = z__[(k << 2) - 3] + sigma + tempe - z__[(k << 
1110
0
        2) - 5];
1111
0
  }
1112
1113
/*        Prepare to do this on the previous block if there is one */
1114
1115
0
  if (i1 > 1) {
1116
0
      n1 = i1 - 1;
1117
0
      while(i1 >= 2 && z__[(i1 << 2) - 5] >= 0.f) {
1118
0
    --i1;
1119
0
      }
1120
0
      if (i1 >= 1) {
1121
0
    sigma = -z__[(n1 << 2) - 1];
1122
0
    goto L145;
1123
0
      }
1124
0
  }
1125
0
  i__2 = *n;
1126
0
  for (k = 1; k <= i__2; ++k) {
1127
0
      z__[(k << 1) - 1] = z__[(k << 2) - 3];
1128
1129
/*        Only the block 1..N0 is unfinished.  The rest of the e's */
1130
/*        must be essentially zero, although sometimes other data */
1131
/*        has been stored in them. */
1132
1133
0
      if (k < n0) {
1134
0
    z__[k * 2] = z__[(k << 2) - 1];
1135
0
      } else {
1136
0
    z__[k * 2] = 0.f;
1137
0
      }
1138
0
  }
1139
0
  return;
1140
1141
/*        end IWHILB */
1142
1143
0
L150:
1144
1145
/* L160: */
1146
0
  ;
1147
0
    }
1148
1149
0
    *info = 3;
1150
0
    return;
1151
1152
/*     end IWHILA */
1153
1154
0
L170:
1155
1156
/*     Move q's to the front. */
1157
1158
0
    i__1 = *n;
1159
0
    for (k = 2; k <= i__1; ++k) {
1160
0
  z__[k] = z__[(k << 2) - 3];
1161
/* L180: */
1162
0
    }
1163
1164
/*     Sort and compute sum of eigenvalues. */
1165
1166
0
    slasrt_("D", n, &z__[1], &iinfo);
1167
1168
0
    e = 0.f;
1169
0
    for (k = *n; k >= 1; --k) {
1170
0
  e += z__[k];
1171
/* L190: */
1172
0
    }
1173
1174
/*     Store trace, sum(eigenvalues) and information on performance. */
1175
1176
0
    z__[(*n << 1) + 1] = trace;
1177
0
    z__[(*n << 1) + 2] = e;
1178
0
    z__[(*n << 1) + 3] = (real) iter;
1179
/* Computing 2nd power */
1180
0
    i__1 = *n;
1181
0
    z__[(*n << 1) + 4] = (real) ndiv / (real) (i__1 * i__1);
1182
0
    z__[(*n << 1) + 5] = nfail * 100.f / (real) iter;
1183
0
    return;
1184
1185
/*     End of SLASQ2 */
1186
1187
0
} /* slasq2_ */
1188