C_LAPACK: Fixes to make it compile with MSVC (#3605)
[platform/upstream/openblas.git] / lapack-netlib / SRC / dlaed4.c
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 static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;}
49 static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;}
50 static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;}
51 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 int logical;
56 typedef short int shortlogical;
57 typedef char logical1;
58 typedef char integer1;
59
60 #define TRUE_ (1)
61 #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 #define abs(x) ((x) >= 0 ? (x) : -(x))
180 #define dabs(x) (fabs(x))
181 #define f2cmin(a,b) ((a) <= (b) ? (a) : (b))
182 #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 #define F2C_proc_par_types 1
264 #ifdef __cplusplus
265 typedef logical (*L_fp)(...);
266 #else
267 typedef logical (*L_fp)();
268 #endif
269
270 static float spow_ui(float x, integer n) {
271         float pow=1.0; unsigned long int u;
272         if(n != 0) {
273                 if(n < 0) n = -n, x = 1/x;
274                 for(u = n; ; ) {
275                         if(u & 01) pow *= x;
276                         if(u >>= 1) x *= x;
277                         else break;
278                 }
279         }
280         return pow;
281 }
282 static double dpow_ui(double x, integer n) {
283         double pow=1.0; unsigned long int u;
284         if(n != 0) {
285                 if(n < 0) n = -n, x = 1/x;
286                 for(u = n; ; ) {
287                         if(u & 01) pow *= x;
288                         if(u >>= 1) x *= x;
289                         else break;
290                 }
291         }
292         return pow;
293 }
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 static _Complex float cpow_ui(_Complex float x, integer n) {
310         _Complex float pow=1.0; unsigned long int u;
311         if(n != 0) {
312                 if(n < 0) n = -n, x = 1/x;
313                 for(u = n; ; ) {
314                         if(u & 01) pow *= x;
315                         if(u >>= 1) x *= x;
316                         else break;
317                 }
318         }
319         return pow;
320 }
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 static _Complex double zpow_ui(_Complex double x, integer n) {
338         _Complex double pow=1.0; unsigned long int u;
339         if(n != 0) {
340                 if(n < 0) n = -n, x = 1/x;
341                 for(u = n; ; ) {
342                         if(u & 01) pow *= x;
343                         if(u >>= 1) x *= x;
344                         else break;
345                 }
346         }
347         return pow;
348 }
349 #endif
350 static integer pow_ii(integer x, integer n) {
351         integer pow; unsigned long int u;
352         if (n <= 0) {
353                 if (n == 0 || x == 1) pow = 1;
354                 else if (x != -1) pow = x == 0 ? 1/x : 0;
355                 else n = -n;
356         }
357         if ((n > 0) || !(n == 0 || x == 1 || x != -1)) {
358                 u = n;
359                 for(pow = 1; ; ) {
360                         if(u & 01) pow *= x;
361                         if(u >>= 1) x *= x;
362                         else break;
363                 }
364         }
365         return pow;
366 }
367 static integer dmaxloc_(double *w, integer s, integer e, integer *n)
368 {
369         double m; integer i, mi;
370         for(m=w[s-1], mi=s, i=s+1; i<=e; i++)
371                 if (w[i-1]>m) mi=i ,m=w[i-1];
372         return mi-s+1;
373 }
374 static integer smaxloc_(float *w, integer s, integer e, integer *n)
375 {
376         float m; integer i, mi;
377         for(m=w[s-1], mi=s, i=s+1; i<=e; i++)
378                 if (w[i-1]>m) mi=i ,m=w[i-1];
379         return mi-s+1;
380 }
381 static inline void cdotc_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) {
382         integer n = *n_, incx = *incx_, incy = *incy_, i;
383 #ifdef _MSC_VER
384         _Fcomplex zdotc = {0.0, 0.0};
385         if (incx == 1 && incy == 1) {
386                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
387                         zdotc._Val[0] += conjf(Cf(&x[i]))._Val[0] * Cf(&y[i])._Val[0];
388                         zdotc._Val[1] += conjf(Cf(&x[i]))._Val[1] * Cf(&y[i])._Val[1];
389                 }
390         } else {
391                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
392                         zdotc._Val[0] += conjf(Cf(&x[i*incx]))._Val[0] * Cf(&y[i*incy])._Val[0];
393                         zdotc._Val[1] += conjf(Cf(&x[i*incx]))._Val[1] * Cf(&y[i*incy])._Val[1];
394                 }
395         }
396         pCf(z) = zdotc;
397 }
398 #else
399         _Complex float zdotc = 0.0;
400         if (incx == 1 && incy == 1) {
401                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
402                         zdotc += conjf(Cf(&x[i])) * Cf(&y[i]);
403                 }
404         } else {
405                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
406                         zdotc += conjf(Cf(&x[i*incx])) * Cf(&y[i*incy]);
407                 }
408         }
409         pCf(z) = zdotc;
410 }
411 #endif
412 static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) {
413         integer n = *n_, incx = *incx_, incy = *incy_, i;
414 #ifdef _MSC_VER
415         _Dcomplex zdotc = {0.0, 0.0};
416         if (incx == 1 && incy == 1) {
417                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
418                         zdotc._Val[0] += conj(Cd(&x[i]))._Val[0] * Cd(&y[i])._Val[0];
419                         zdotc._Val[1] += conj(Cd(&x[i]))._Val[1] * Cd(&y[i])._Val[1];
420                 }
421         } else {
422                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
423                         zdotc._Val[0] += conj(Cd(&x[i*incx]))._Val[0] * Cd(&y[i*incy])._Val[0];
424                         zdotc._Val[1] += conj(Cd(&x[i*incx]))._Val[1] * Cd(&y[i*incy])._Val[1];
425                 }
426         }
427         pCd(z) = zdotc;
428 }
429 #else
430         _Complex double zdotc = 0.0;
431         if (incx == 1 && incy == 1) {
432                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
433                         zdotc += conj(Cd(&x[i])) * Cd(&y[i]);
434                 }
435         } else {
436                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
437                         zdotc += conj(Cd(&x[i*incx])) * Cd(&y[i*incy]);
438                 }
439         }
440         pCd(z) = zdotc;
441 }
442 #endif  
443 static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) {
444         integer n = *n_, incx = *incx_, incy = *incy_, i;
445 #ifdef _MSC_VER
446         _Fcomplex zdotc = {0.0, 0.0};
447         if (incx == 1 && incy == 1) {
448                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
449                         zdotc._Val[0] += Cf(&x[i])._Val[0] * Cf(&y[i])._Val[0];
450                         zdotc._Val[1] += Cf(&x[i])._Val[1] * Cf(&y[i])._Val[1];
451                 }
452         } else {
453                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
454                         zdotc._Val[0] += Cf(&x[i*incx])._Val[0] * Cf(&y[i*incy])._Val[0];
455                         zdotc._Val[1] += Cf(&x[i*incx])._Val[1] * Cf(&y[i*incy])._Val[1];
456                 }
457         }
458         pCf(z) = zdotc;
459 }
460 #else
461         _Complex float zdotc = 0.0;
462         if (incx == 1 && incy == 1) {
463                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
464                         zdotc += Cf(&x[i]) * Cf(&y[i]);
465                 }
466         } else {
467                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
468                         zdotc += Cf(&x[i*incx]) * Cf(&y[i*incy]);
469                 }
470         }
471         pCf(z) = zdotc;
472 }
473 #endif
474 static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) {
475         integer n = *n_, incx = *incx_, incy = *incy_, i;
476 #ifdef _MSC_VER
477         _Dcomplex zdotc = {0.0, 0.0};
478         if (incx == 1 && incy == 1) {
479                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
480                         zdotc._Val[0] += Cd(&x[i])._Val[0] * Cd(&y[i])._Val[0];
481                         zdotc._Val[1] += Cd(&x[i])._Val[1] * Cd(&y[i])._Val[1];
482                 }
483         } else {
484                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
485                         zdotc._Val[0] += Cd(&x[i*incx])._Val[0] * Cd(&y[i*incy])._Val[0];
486                         zdotc._Val[1] += Cd(&x[i*incx])._Val[1] * Cd(&y[i*incy])._Val[1];
487                 }
488         }
489         pCd(z) = zdotc;
490 }
491 #else
492         _Complex double zdotc = 0.0;
493         if (incx == 1 && incy == 1) {
494                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
495                         zdotc += Cd(&x[i]) * Cd(&y[i]);
496                 }
497         } else {
498                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
499                         zdotc += Cd(&x[i*incx]) * Cd(&y[i*incy]);
500                 }
501         }
502         pCd(z) = zdotc;
503 }
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 /* > \brief \b DLAED4 used by sstedc. Finds a single root of the secular equation. */
514
515 /*  =========== DOCUMENTATION =========== */
516
517 /* Online html documentation available at */
518 /*            http://www.netlib.org/lapack/explore-html/ */
519
520 /* > \htmlonly */
521 /* > Download DLAED4 + dependencies */
522 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlaed4.
523 f"> */
524 /* > [TGZ]</a> */
525 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlaed4.
526 f"> */
527 /* > [ZIP]</a> */
528 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlaed4.
529 f"> */
530 /* > [TXT]</a> */
531 /* > \endhtmlonly */
532
533 /*  Definition: */
534 /*  =========== */
535
536 /*       SUBROUTINE DLAED4( N, I, D, Z, DELTA, RHO, DLAM, INFO ) */
537
538 /*       INTEGER            I, INFO, N */
539 /*       DOUBLE PRECISION   DLAM, RHO */
540 /*       DOUBLE PRECISION   D( * ), DELTA( * ), Z( * ) */
541
542
543 /* > \par Purpose: */
544 /*  ============= */
545 /* > */
546 /* > \verbatim */
547 /* > */
548 /* > This subroutine computes the I-th updated eigenvalue of a symmetric */
549 /* > rank-one modification to a diagonal matrix whose elements are */
550 /* > given in the array d, and that */
551 /* > */
552 /* >            D(i) < D(j)  for  i < j */
553 /* > */
554 /* > and that RHO > 0.  This is arranged by the calling routine, and is */
555 /* > no loss in generality.  The rank-one modified system is thus */
556 /* > */
557 /* >            diag( D )  +  RHO * Z * Z_transpose. */
558 /* > */
559 /* > where we assume the Euclidean norm of Z is 1. */
560 /* > */
561 /* > The method consists of approximating the rational functions in the */
562 /* > secular equation by simpler interpolating rational functions. */
563 /* > \endverbatim */
564
565 /*  Arguments: */
566 /*  ========== */
567
568 /* > \param[in] N */
569 /* > \verbatim */
570 /* >          N is INTEGER */
571 /* >         The length of all arrays. */
572 /* > \endverbatim */
573 /* > */
574 /* > \param[in] I */
575 /* > \verbatim */
576 /* >          I is INTEGER */
577 /* >         The index of the eigenvalue to be computed.  1 <= I <= N. */
578 /* > \endverbatim */
579 /* > */
580 /* > \param[in] D */
581 /* > \verbatim */
582 /* >          D is DOUBLE PRECISION array, dimension (N) */
583 /* >         The original eigenvalues.  It is assumed that they are in */
584 /* >         order, D(I) < D(J)  for I < J. */
585 /* > \endverbatim */
586 /* > */
587 /* > \param[in] Z */
588 /* > \verbatim */
589 /* >          Z is DOUBLE PRECISION array, dimension (N) */
590 /* >         The components of the updating vector. */
591 /* > \endverbatim */
592 /* > */
593 /* > \param[out] DELTA */
594 /* > \verbatim */
595 /* >          DELTA is DOUBLE PRECISION array, dimension (N) */
596 /* >         If N > 2, DELTA contains (D(j) - lambda_I) in its  j-th */
597 /* >         component.  If N = 1, then DELTA(1) = 1. If N = 2, see DLAED5 */
598 /* >         for detail. The vector DELTA contains the information necessary */
599 /* >         to construct the eigenvectors by DLAED3 and DLAED9. */
600 /* > \endverbatim */
601 /* > */
602 /* > \param[in] RHO */
603 /* > \verbatim */
604 /* >          RHO is DOUBLE PRECISION */
605 /* >         The scalar in the symmetric updating formula. */
606 /* > \endverbatim */
607 /* > */
608 /* > \param[out] DLAM */
609 /* > \verbatim */
610 /* >          DLAM is DOUBLE PRECISION */
611 /* >         The computed lambda_I, the I-th updated eigenvalue. */
612 /* > \endverbatim */
613 /* > */
614 /* > \param[out] INFO */
615 /* > \verbatim */
616 /* >          INFO is INTEGER */
617 /* >         = 0:  successful exit */
618 /* >         > 0:  if INFO = 1, the updating process failed. */
619 /* > \endverbatim */
620
621 /* > \par Internal Parameters: */
622 /*  ========================= */
623 /* > */
624 /* > \verbatim */
625 /* >  Logical variable ORGATI (origin-at-i?) is used for distinguishing */
626 /* >  whether D(i) or D(i+1) is treated as the origin. */
627 /* > */
628 /* >            ORGATI = .true.    origin at i */
629 /* >            ORGATI = .false.   origin at i+1 */
630 /* > */
631 /* >   Logical variable SWTCH3 (switch-for-3-poles?) is for noting */
632 /* >   if we are working with THREE poles! */
633 /* > */
634 /* >   MAXIT is the maximum number of iterations allowed for each */
635 /* >   eigenvalue. */
636 /* > \endverbatim */
637
638 /*  Authors: */
639 /*  ======== */
640
641 /* > \author Univ. of Tennessee */
642 /* > \author Univ. of California Berkeley */
643 /* > \author Univ. of Colorado Denver */
644 /* > \author NAG Ltd. */
645
646 /* > \date December 2016 */
647
648 /* > \ingroup auxOTHERcomputational */
649
650 /* > \par Contributors: */
651 /*  ================== */
652 /* > */
653 /* >     Ren-Cang Li, Computer Science Division, University of California */
654 /* >     at Berkeley, USA */
655 /* > */
656 /*  ===================================================================== */
657 /* Subroutine */ int dlaed4_(integer *n, integer *i__, doublereal *d__, 
658         doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam,
659          integer *info)
660 {
661     /* System generated locals */
662     integer i__1;
663     doublereal d__1;
664
665     /* Local variables */
666     doublereal dphi, dpsi;
667     integer iter;
668     doublereal temp, prew, temp1, a, b, c__;
669     integer j;
670     doublereal w, dltlb, dltub, midpt;
671     integer niter;
672     logical swtch;
673     extern /* Subroutine */ int dlaed5_(integer *, doublereal *, doublereal *,
674              doublereal *, doublereal *, doublereal *), dlaed6_(integer *, 
675             logical *, doublereal *, doublereal *, doublereal *, doublereal *,
676              doublereal *, integer *);
677     logical swtch3;
678     integer ii;
679     extern doublereal dlamch_(char *);
680     doublereal dw, zz[3];
681     logical orgati;
682     doublereal erretm, rhoinv;
683     integer ip1;
684     doublereal del, eta, phi, eps, tau, psi;
685     integer iim1, iip1;
686
687
688 /*  -- LAPACK computational routine (version 3.7.0) -- */
689 /*  -- LAPACK is a software package provided by Univ. of Tennessee,    -- */
690 /*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
691 /*     December 2016 */
692
693
694 /*  ===================================================================== */
695
696
697 /*     Since this routine is called in an inner loop, we do no argument */
698 /*     checking. */
699
700 /*     Quick return for N=1 and 2. */
701
702     /* Parameter adjustments */
703     --delta;
704     --z__;
705     --d__;
706
707     /* Function Body */
708     *info = 0;
709     if (*n == 1) {
710
711 /*         Presumably, I=1 upon entry */
712
713         *dlam = d__[1] + *rho * z__[1] * z__[1];
714         delta[1] = 1.;
715         return 0;
716     }
717     if (*n == 2) {
718         dlaed5_(i__, &d__[1], &z__[1], &delta[1], rho, dlam);
719         return 0;
720     }
721
722 /*     Compute machine epsilon */
723
724     eps = dlamch_("Epsilon");
725     rhoinv = 1. / *rho;
726
727 /*     The case I = N */
728
729     if (*i__ == *n) {
730
731 /*        Initialize some basic variables */
732
733         ii = *n - 1;
734         niter = 1;
735
736 /*        Calculate initial guess */
737
738         midpt = *rho / 2.;
739
740 /*        If ||Z||_2 is not one, then TEMP should be set to */
741 /*        RHO * ||Z||_2^2 / TWO */
742
743         i__1 = *n;
744         for (j = 1; j <= i__1; ++j) {
745             delta[j] = d__[j] - d__[*i__] - midpt;
746 /* L10: */
747         }
748
749         psi = 0.;
750         i__1 = *n - 2;
751         for (j = 1; j <= i__1; ++j) {
752             psi += z__[j] * z__[j] / delta[j];
753 /* L20: */
754         }
755
756         c__ = rhoinv + psi;
757         w = c__ + z__[ii] * z__[ii] / delta[ii] + z__[*n] * z__[*n] / delta[*
758                 n];
759
760         if (w <= 0.) {
761             temp = z__[*n - 1] * z__[*n - 1] / (d__[*n] - d__[*n - 1] + *rho) 
762                     + z__[*n] * z__[*n] / *rho;
763             if (c__ <= temp) {
764                 tau = *rho;
765             } else {
766                 del = d__[*n] - d__[*n - 1];
767                 a = -c__ * del + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n]
768                         ;
769                 b = z__[*n] * z__[*n] * del;
770                 if (a < 0.) {
771                     tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a);
772                 } else {
773                     tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.);
774                 }
775             }
776
777 /*           It can be proved that */
778 /*               D(N)+RHO/2 <= LAMBDA(N) < D(N)+TAU <= D(N)+RHO */
779
780             dltlb = midpt;
781             dltub = *rho;
782         } else {
783             del = d__[*n] - d__[*n - 1];
784             a = -c__ * del + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n];
785             b = z__[*n] * z__[*n] * del;
786             if (a < 0.) {
787                 tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a);
788             } else {
789                 tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.);
790             }
791
792 /*           It can be proved that */
793 /*               D(N) < D(N)+TAU < LAMBDA(N) < D(N)+RHO/2 */
794
795             dltlb = 0.;
796             dltub = midpt;
797         }
798
799         i__1 = *n;
800         for (j = 1; j <= i__1; ++j) {
801             delta[j] = d__[j] - d__[*i__] - tau;
802 /* L30: */
803         }
804
805 /*        Evaluate PSI and the derivative DPSI */
806
807         dpsi = 0.;
808         psi = 0.;
809         erretm = 0.;
810         i__1 = ii;
811         for (j = 1; j <= i__1; ++j) {
812             temp = z__[j] / delta[j];
813             psi += z__[j] * temp;
814             dpsi += temp * temp;
815             erretm += psi;
816 /* L40: */
817         }
818         erretm = abs(erretm);
819
820 /*        Evaluate PHI and the derivative DPHI */
821
822         temp = z__[*n] / delta[*n];
823         phi = z__[*n] * temp;
824         dphi = temp * temp;
825         erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi 
826                 + dphi);
827
828         w = rhoinv + phi + psi;
829
830 /*        Test for convergence */
831
832         if (abs(w) <= eps * erretm) {
833             *dlam = d__[*i__] + tau;
834             goto L250;
835         }
836
837         if (w <= 0.) {
838             dltlb = f2cmax(dltlb,tau);
839         } else {
840             dltub = f2cmin(dltub,tau);
841         }
842
843 /*        Calculate the new step */
844
845         ++niter;
846         c__ = w - delta[*n - 1] * dpsi - delta[*n] * dphi;
847         a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * (
848                 dpsi + dphi);
849         b = delta[*n - 1] * delta[*n] * w;
850         if (c__ < 0.) {
851             c__ = abs(c__);
852         }
853         if (c__ == 0.) {
854 /*          ETA = B/A */
855 /*           ETA = RHO - TAU */
856             eta = dltub - tau;
857         } else if (a >= 0.) {
858             eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ 
859                     * 2.);
860         } else {
861             eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))
862                     );
863         }
864
865 /*        Note, eta should be positive if w is negative, and */
866 /*        eta should be negative otherwise. However, */
867 /*        if for some reason caused by roundoff, eta*w > 0, */
868 /*        we simply use one Newton step instead. This way */
869 /*        will guarantee eta*w < 0. */
870
871         if (w * eta > 0.) {
872             eta = -w / (dpsi + dphi);
873         }
874         temp = tau + eta;
875         if (temp > dltub || temp < dltlb) {
876             if (w < 0.) {
877                 eta = (dltub - tau) / 2.;
878             } else {
879                 eta = (dltlb - tau) / 2.;
880             }
881         }
882         i__1 = *n;
883         for (j = 1; j <= i__1; ++j) {
884             delta[j] -= eta;
885 /* L50: */
886         }
887
888         tau += eta;
889
890 /*        Evaluate PSI and the derivative DPSI */
891
892         dpsi = 0.;
893         psi = 0.;
894         erretm = 0.;
895         i__1 = ii;
896         for (j = 1; j <= i__1; ++j) {
897             temp = z__[j] / delta[j];
898             psi += z__[j] * temp;
899             dpsi += temp * temp;
900             erretm += psi;
901 /* L60: */
902         }
903         erretm = abs(erretm);
904
905 /*        Evaluate PHI and the derivative DPHI */
906
907         temp = z__[*n] / delta[*n];
908         phi = z__[*n] * temp;
909         dphi = temp * temp;
910         erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi 
911                 + dphi);
912
913         w = rhoinv + phi + psi;
914
915 /*        Main loop to update the values of the array   DELTA */
916
917         iter = niter + 1;
918
919         for (niter = iter; niter <= 30; ++niter) {
920
921 /*           Test for convergence */
922
923             if (abs(w) <= eps * erretm) {
924                 *dlam = d__[*i__] + tau;
925                 goto L250;
926             }
927
928             if (w <= 0.) {
929                 dltlb = f2cmax(dltlb,tau);
930             } else {
931                 dltub = f2cmin(dltub,tau);
932             }
933
934 /*           Calculate the new step */
935
936             c__ = w - delta[*n - 1] * dpsi - delta[*n] * dphi;
937             a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * 
938                     (dpsi + dphi);
939             b = delta[*n - 1] * delta[*n] * w;
940             if (a >= 0.) {
941                 eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (
942                         c__ * 2.);
943             } else {
944                 eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(
945                         d__1))));
946             }
947
948 /*           Note, eta should be positive if w is negative, and */
949 /*           eta should be negative otherwise. However, */
950 /*           if for some reason caused by roundoff, eta*w > 0, */
951 /*           we simply use one Newton step instead. This way */
952 /*           will guarantee eta*w < 0. */
953
954             if (w * eta > 0.) {
955                 eta = -w / (dpsi + dphi);
956             }
957             temp = tau + eta;
958             if (temp > dltub || temp < dltlb) {
959                 if (w < 0.) {
960                     eta = (dltub - tau) / 2.;
961                 } else {
962                     eta = (dltlb - tau) / 2.;
963                 }
964             }
965             i__1 = *n;
966             for (j = 1; j <= i__1; ++j) {
967                 delta[j] -= eta;
968 /* L70: */
969             }
970
971             tau += eta;
972
973 /*           Evaluate PSI and the derivative DPSI */
974
975             dpsi = 0.;
976             psi = 0.;
977             erretm = 0.;
978             i__1 = ii;
979             for (j = 1; j <= i__1; ++j) {
980                 temp = z__[j] / delta[j];
981                 psi += z__[j] * temp;
982                 dpsi += temp * temp;
983                 erretm += psi;
984 /* L80: */
985             }
986             erretm = abs(erretm);
987
988 /*           Evaluate PHI and the derivative DPHI */
989
990             temp = z__[*n] / delta[*n];
991             phi = z__[*n] * temp;
992             dphi = temp * temp;
993             erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (
994                     dpsi + dphi);
995
996             w = rhoinv + phi + psi;
997 /* L90: */
998         }
999
1000 /*        Return with INFO = 1, NITER = MAXIT and not converged */
1001
1002         *info = 1;
1003         *dlam = d__[*i__] + tau;
1004         goto L250;
1005
1006 /*        End for the case I = N */
1007
1008     } else {
1009
1010 /*        The case for I < N */
1011
1012         niter = 1;
1013         ip1 = *i__ + 1;
1014
1015 /*        Calculate initial guess */
1016
1017         del = d__[ip1] - d__[*i__];
1018         midpt = del / 2.;
1019         i__1 = *n;
1020         for (j = 1; j <= i__1; ++j) {
1021             delta[j] = d__[j] - d__[*i__] - midpt;
1022 /* L100: */
1023         }
1024
1025         psi = 0.;
1026         i__1 = *i__ - 1;
1027         for (j = 1; j <= i__1; ++j) {
1028             psi += z__[j] * z__[j] / delta[j];
1029 /* L110: */
1030         }
1031
1032         phi = 0.;
1033         i__1 = *i__ + 2;
1034         for (j = *n; j >= i__1; --j) {
1035             phi += z__[j] * z__[j] / delta[j];
1036 /* L120: */
1037         }
1038         c__ = rhoinv + psi + phi;
1039         w = c__ + z__[*i__] * z__[*i__] / delta[*i__] + z__[ip1] * z__[ip1] / 
1040                 delta[ip1];
1041
1042         if (w > 0.) {
1043
1044 /*           d(i)< the ith eigenvalue < (d(i)+d(i+1))/2 */
1045
1046 /*           We choose d(i) as origin. */
1047
1048             orgati = TRUE_;
1049             a = c__ * del + z__[*i__] * z__[*i__] + z__[ip1] * z__[ip1];
1050             b = z__[*i__] * z__[*i__] * del;
1051             if (a > 0.) {
1052                 tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(
1053                         d__1))));
1054             } else {
1055                 tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (
1056                         c__ * 2.);
1057             }
1058             dltlb = 0.;
1059             dltub = midpt;
1060         } else {
1061
1062 /*           (d(i)+d(i+1))/2 <= the ith eigenvalue < d(i+1) */
1063
1064 /*           We choose d(i+1) as origin. */
1065
1066             orgati = FALSE_;
1067             a = c__ * del - z__[*i__] * z__[*i__] - z__[ip1] * z__[ip1];
1068             b = z__[ip1] * z__[ip1] * del;
1069             if (a < 0.) {
1070                 tau = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs(
1071                         d__1))));
1072             } else {
1073                 tau = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / 
1074                         (c__ * 2.);
1075             }
1076             dltlb = -midpt;
1077             dltub = 0.;
1078         }
1079
1080         if (orgati) {
1081             i__1 = *n;
1082             for (j = 1; j <= i__1; ++j) {
1083                 delta[j] = d__[j] - d__[*i__] - tau;
1084 /* L130: */
1085             }
1086         } else {
1087             i__1 = *n;
1088             for (j = 1; j <= i__1; ++j) {
1089                 delta[j] = d__[j] - d__[ip1] - tau;
1090 /* L140: */
1091             }
1092         }
1093         if (orgati) {
1094             ii = *i__;
1095         } else {
1096             ii = *i__ + 1;
1097         }
1098         iim1 = ii - 1;
1099         iip1 = ii + 1;
1100
1101 /*        Evaluate PSI and the derivative DPSI */
1102
1103         dpsi = 0.;
1104         psi = 0.;
1105         erretm = 0.;
1106         i__1 = iim1;
1107         for (j = 1; j <= i__1; ++j) {
1108             temp = z__[j] / delta[j];
1109             psi += z__[j] * temp;
1110             dpsi += temp * temp;
1111             erretm += psi;
1112 /* L150: */
1113         }
1114         erretm = abs(erretm);
1115
1116 /*        Evaluate PHI and the derivative DPHI */
1117
1118         dphi = 0.;
1119         phi = 0.;
1120         i__1 = iip1;
1121         for (j = *n; j >= i__1; --j) {
1122             temp = z__[j] / delta[j];
1123             phi += z__[j] * temp;
1124             dphi += temp * temp;
1125             erretm += phi;
1126 /* L160: */
1127         }
1128
1129         w = rhoinv + phi + psi;
1130
1131 /*        W is the value of the secular function with */
1132 /*        its ii-th element removed. */
1133
1134         swtch3 = FALSE_;
1135         if (orgati) {
1136             if (w < 0.) {
1137                 swtch3 = TRUE_;
1138             }
1139         } else {
1140             if (w > 0.) {
1141                 swtch3 = TRUE_;
1142             }
1143         }
1144         if (ii == 1 || ii == *n) {
1145             swtch3 = FALSE_;
1146         }
1147
1148         temp = z__[ii] / delta[ii];
1149         dw = dpsi + dphi + temp * temp;
1150         temp = z__[ii] * temp;
1151         w += temp;
1152         erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + 
1153                 abs(tau) * dw;
1154
1155 /*        Test for convergence */
1156
1157         if (abs(w) <= eps * erretm) {
1158             if (orgati) {
1159                 *dlam = d__[*i__] + tau;
1160             } else {
1161                 *dlam = d__[ip1] + tau;
1162             }
1163             goto L250;
1164         }
1165
1166         if (w <= 0.) {
1167             dltlb = f2cmax(dltlb,tau);
1168         } else {
1169             dltub = f2cmin(dltub,tau);
1170         }
1171
1172 /*        Calculate the new step */
1173
1174         ++niter;
1175         if (! swtch3) {
1176             if (orgati) {
1177 /* Computing 2nd power */
1178                 d__1 = z__[*i__] / delta[*i__];
1179                 c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * (d__1 * 
1180                         d__1);
1181             } else {
1182 /* Computing 2nd power */
1183                 d__1 = z__[ip1] / delta[ip1];
1184                 c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * (d__1 * 
1185                         d__1);
1186             }
1187             a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] * 
1188                     dw;
1189             b = delta[*i__] * delta[ip1] * w;
1190             if (c__ == 0.) {
1191                 if (a == 0.) {
1192                     if (orgati) {
1193                         a = z__[*i__] * z__[*i__] + delta[ip1] * delta[ip1] * 
1194                                 (dpsi + dphi);
1195                     } else {
1196                         a = z__[ip1] * z__[ip1] + delta[*i__] * delta[*i__] * 
1197                                 (dpsi + dphi);
1198                     }
1199                 }
1200                 eta = b / a;
1201             } else if (a <= 0.) {
1202                 eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (
1203                         c__ * 2.);
1204             } else {
1205                 eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(
1206                         d__1))));
1207             }
1208         } else {
1209
1210 /*           Interpolation using THREE most relevant poles */
1211
1212             temp = rhoinv + psi + phi;
1213             if (orgati) {
1214                 temp1 = z__[iim1] / delta[iim1];
1215                 temp1 *= temp1;
1216                 c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] - d__[
1217                         iip1]) * temp1;
1218                 zz[0] = z__[iim1] * z__[iim1];
1219                 zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + dphi);
1220             } else {
1221                 temp1 = z__[iip1] / delta[iip1];
1222                 temp1 *= temp1;
1223                 c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] - d__[
1224                         iim1]) * temp1;
1225                 zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - temp1));
1226                 zz[2] = z__[iip1] * z__[iip1];
1227             }
1228             zz[1] = z__[ii] * z__[ii];
1229             dlaed6_(&niter, &orgati, &c__, &delta[iim1], zz, &w, &eta, info);
1230             if (*info != 0) {
1231                 goto L250;
1232             }
1233         }
1234
1235 /*        Note, eta should be positive if w is negative, and */
1236 /*        eta should be negative otherwise. However, */
1237 /*        if for some reason caused by roundoff, eta*w > 0, */
1238 /*        we simply use one Newton step instead. This way */
1239 /*        will guarantee eta*w < 0. */
1240
1241         if (w * eta >= 0.) {
1242             eta = -w / dw;
1243         }
1244         temp = tau + eta;
1245         if (temp > dltub || temp < dltlb) {
1246             if (w < 0.) {
1247                 eta = (dltub - tau) / 2.;
1248             } else {
1249                 eta = (dltlb - tau) / 2.;
1250             }
1251         }
1252
1253         prew = w;
1254
1255         i__1 = *n;
1256         for (j = 1; j <= i__1; ++j) {
1257             delta[j] -= eta;
1258 /* L180: */
1259         }
1260
1261 /*        Evaluate PSI and the derivative DPSI */
1262
1263         dpsi = 0.;
1264         psi = 0.;
1265         erretm = 0.;
1266         i__1 = iim1;
1267         for (j = 1; j <= i__1; ++j) {
1268             temp = z__[j] / delta[j];
1269             psi += z__[j] * temp;
1270             dpsi += temp * temp;
1271             erretm += psi;
1272 /* L190: */
1273         }
1274         erretm = abs(erretm);
1275
1276 /*        Evaluate PHI and the derivative DPHI */
1277
1278         dphi = 0.;
1279         phi = 0.;
1280         i__1 = iip1;
1281         for (j = *n; j >= i__1; --j) {
1282             temp = z__[j] / delta[j];
1283             phi += z__[j] * temp;
1284             dphi += temp * temp;
1285             erretm += phi;
1286 /* L200: */
1287         }
1288
1289         temp = z__[ii] / delta[ii];
1290         dw = dpsi + dphi + temp * temp;
1291         temp = z__[ii] * temp;
1292         w = rhoinv + phi + psi + temp;
1293         erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + (
1294                 d__1 = tau + eta, abs(d__1)) * dw;
1295
1296         swtch = FALSE_;
1297         if (orgati) {
1298             if (-w > abs(prew) / 10.) {
1299                 swtch = TRUE_;
1300             }
1301         } else {
1302             if (w > abs(prew) / 10.) {
1303                 swtch = TRUE_;
1304             }
1305         }
1306
1307         tau += eta;
1308
1309 /*        Main loop to update the values of the array   DELTA */
1310
1311         iter = niter + 1;
1312
1313         for (niter = iter; niter <= 30; ++niter) {
1314
1315 /*           Test for convergence */
1316
1317             if (abs(w) <= eps * erretm) {
1318                 if (orgati) {
1319                     *dlam = d__[*i__] + tau;
1320                 } else {
1321                     *dlam = d__[ip1] + tau;
1322                 }
1323                 goto L250;
1324             }
1325
1326             if (w <= 0.) {
1327                 dltlb = f2cmax(dltlb,tau);
1328             } else {
1329                 dltub = f2cmin(dltub,tau);
1330             }
1331
1332 /*           Calculate the new step */
1333
1334             if (! swtch3) {
1335                 if (! swtch) {
1336                     if (orgati) {
1337 /* Computing 2nd power */
1338                         d__1 = z__[*i__] / delta[*i__];
1339                         c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * (
1340                                 d__1 * d__1);
1341                     } else {
1342 /* Computing 2nd power */
1343                         d__1 = z__[ip1] / delta[ip1];
1344                         c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * 
1345                                 (d__1 * d__1);
1346                     }
1347                 } else {
1348                     temp = z__[ii] / delta[ii];
1349                     if (orgati) {
1350                         dpsi += temp * temp;
1351                     } else {
1352                         dphi += temp * temp;
1353                     }
1354                     c__ = w - delta[*i__] * dpsi - delta[ip1] * dphi;
1355                 }
1356                 a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] 
1357                         * dw;
1358                 b = delta[*i__] * delta[ip1] * w;
1359                 if (c__ == 0.) {
1360                     if (a == 0.) {
1361                         if (! swtch) {
1362                             if (orgati) {
1363                                 a = z__[*i__] * z__[*i__] + delta[ip1] * 
1364                                         delta[ip1] * (dpsi + dphi);
1365                             } else {
1366                                 a = z__[ip1] * z__[ip1] + delta[*i__] * delta[
1367                                         *i__] * (dpsi + dphi);
1368                             }
1369                         } else {
1370                             a = delta[*i__] * delta[*i__] * dpsi + delta[ip1] 
1371                                     * delta[ip1] * dphi;
1372                         }
1373                     }
1374                     eta = b / a;
1375                 } else if (a <= 0.) {
1376                     eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))))
1377                              / (c__ * 2.);
1378                 } else {
1379                     eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, 
1380                             abs(d__1))));
1381                 }
1382             } else {
1383
1384 /*              Interpolation using THREE most relevant poles */
1385
1386                 temp = rhoinv + psi + phi;
1387                 if (swtch) {
1388                     c__ = temp - delta[iim1] * dpsi - delta[iip1] * dphi;
1389                     zz[0] = delta[iim1] * delta[iim1] * dpsi;
1390                     zz[2] = delta[iip1] * delta[iip1] * dphi;
1391                 } else {
1392                     if (orgati) {
1393                         temp1 = z__[iim1] / delta[iim1];
1394                         temp1 *= temp1;
1395                         c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] 
1396                                 - d__[iip1]) * temp1;
1397                         zz[0] = z__[iim1] * z__[iim1];
1398                         zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + 
1399                                 dphi);
1400                     } else {
1401                         temp1 = z__[iip1] / delta[iip1];
1402                         temp1 *= temp1;
1403                         c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] 
1404                                 - d__[iim1]) * temp1;
1405                         zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - 
1406                                 temp1));
1407                         zz[2] = z__[iip1] * z__[iip1];
1408                     }
1409                 }
1410                 dlaed6_(&niter, &orgati, &c__, &delta[iim1], zz, &w, &eta, 
1411                         info);
1412                 if (*info != 0) {
1413                     goto L250;
1414                 }
1415             }
1416
1417 /*           Note, eta should be positive if w is negative, and */
1418 /*           eta should be negative otherwise. However, */
1419 /*           if for some reason caused by roundoff, eta*w > 0, */
1420 /*           we simply use one Newton step instead. This way */
1421 /*           will guarantee eta*w < 0. */
1422
1423             if (w * eta >= 0.) {
1424                 eta = -w / dw;
1425             }
1426             temp = tau + eta;
1427             if (temp > dltub || temp < dltlb) {
1428                 if (w < 0.) {
1429                     eta = (dltub - tau) / 2.;
1430                 } else {
1431                     eta = (dltlb - tau) / 2.;
1432                 }
1433             }
1434
1435             i__1 = *n;
1436             for (j = 1; j <= i__1; ++j) {
1437                 delta[j] -= eta;
1438 /* L210: */
1439             }
1440
1441             tau += eta;
1442             prew = w;
1443
1444 /*           Evaluate PSI and the derivative DPSI */
1445
1446             dpsi = 0.;
1447             psi = 0.;
1448             erretm = 0.;
1449             i__1 = iim1;
1450             for (j = 1; j <= i__1; ++j) {
1451                 temp = z__[j] / delta[j];
1452                 psi += z__[j] * temp;
1453                 dpsi += temp * temp;
1454                 erretm += psi;
1455 /* L220: */
1456             }
1457             erretm = abs(erretm);
1458
1459 /*           Evaluate PHI and the derivative DPHI */
1460
1461             dphi = 0.;
1462             phi = 0.;
1463             i__1 = iip1;
1464             for (j = *n; j >= i__1; --j) {
1465                 temp = z__[j] / delta[j];
1466                 phi += z__[j] * temp;
1467                 dphi += temp * temp;
1468                 erretm += phi;
1469 /* L230: */
1470             }
1471
1472             temp = z__[ii] / delta[ii];
1473             dw = dpsi + dphi + temp * temp;
1474             temp = z__[ii] * temp;
1475             w = rhoinv + phi + psi + temp;
1476             erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. 
1477                     + abs(tau) * dw;
1478             if (w * prew > 0. && abs(w) > abs(prew) / 10.) {
1479                 swtch = ! swtch;
1480             }
1481
1482 /* L240: */
1483         }
1484
1485 /*        Return with INFO = 1, NITER = MAXIT and not converged */
1486
1487         *info = 1;
1488         if (orgati) {
1489             *dlam = d__[*i__] + tau;
1490         } else {
1491             *dlam = d__[ip1] + tau;
1492         }
1493
1494     }
1495
1496 L250:
1497
1498     return 0;
1499
1500 /*     End of DLAED4 */
1501
1502 } /* dlaed4_ */
1503