C_LAPACK: Fixes to make it compile with MSVC (#3605)
[platform/upstream/openblas.git] / lapack-netlib / SRC / dlasd4.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 DLASD4 computes the square root of the i-th updated eigenvalue of a positive symmetric rank-one
514  modification to a positive diagonal matrix. Used by dbdsdc. */
515
516 /*  =========== DOCUMENTATION =========== */
517
518 /* Online html documentation available at */
519 /*            http://www.netlib.org/lapack/explore-html/ */
520
521 /* > \htmlonly */
522 /* > Download DLASD4 + dependencies */
523 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlasd4.
524 f"> */
525 /* > [TGZ]</a> */
526 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlasd4.
527 f"> */
528 /* > [ZIP]</a> */
529 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlasd4.
530 f"> */
531 /* > [TXT]</a> */
532 /* > \endhtmlonly */
533
534 /*  Definition: */
535 /*  =========== */
536
537 /*       SUBROUTINE DLASD4( N, I, D, Z, DELTA, RHO, SIGMA, WORK, INFO ) */
538
539 /*       INTEGER            I, INFO, N */
540 /*       DOUBLE PRECISION   RHO, SIGMA */
541 /*       DOUBLE PRECISION   D( * ), DELTA( * ), WORK( * ), Z( * ) */
542
543
544 /* > \par Purpose: */
545 /*  ============= */
546 /* > */
547 /* > \verbatim */
548 /* > */
549 /* > This subroutine computes the square root of the I-th updated */
550 /* > eigenvalue of a positive symmetric rank-one modification to */
551 /* > a positive diagonal matrix whose entries are given as the squares */
552 /* > of the corresponding entries in the array d, and that */
553 /* > */
554 /* >        0 <= D(i) < D(j)  for  i < j */
555 /* > */
556 /* > and that RHO > 0. This is arranged by the calling routine, and is */
557 /* > no loss in generality.  The rank-one modified system is thus */
558 /* > */
559 /* >        diag( D ) * diag( D ) +  RHO * Z * Z_transpose. */
560 /* > */
561 /* > where we assume the Euclidean norm of Z is 1. */
562 /* > */
563 /* > The method consists of approximating the rational functions in the */
564 /* > secular equation by simpler interpolating rational functions. */
565 /* > \endverbatim */
566
567 /*  Arguments: */
568 /*  ========== */
569
570 /* > \param[in] N */
571 /* > \verbatim */
572 /* >          N is INTEGER */
573 /* >         The length of all arrays. */
574 /* > \endverbatim */
575 /* > */
576 /* > \param[in] I */
577 /* > \verbatim */
578 /* >          I is INTEGER */
579 /* >         The index of the eigenvalue to be computed.  1 <= I <= N. */
580 /* > \endverbatim */
581 /* > */
582 /* > \param[in] D */
583 /* > \verbatim */
584 /* >          D is DOUBLE PRECISION array, dimension ( N ) */
585 /* >         The original eigenvalues.  It is assumed that they are in */
586 /* >         order, 0 <= D(I) < D(J)  for I < J. */
587 /* > \endverbatim */
588 /* > */
589 /* > \param[in] Z */
590 /* > \verbatim */
591 /* >          Z is DOUBLE PRECISION array, dimension ( N ) */
592 /* >         The components of the updating vector. */
593 /* > \endverbatim */
594 /* > */
595 /* > \param[out] DELTA */
596 /* > \verbatim */
597 /* >          DELTA is DOUBLE PRECISION array, dimension ( N ) */
598 /* >         If N .ne. 1, DELTA contains (D(j) - sigma_I) in its  j-th */
599 /* >         component.  If N = 1, then DELTA(1) = 1.  The vector DELTA */
600 /* >         contains the information necessary to construct the */
601 /* >         (singular) eigenvectors. */
602 /* > \endverbatim */
603 /* > */
604 /* > \param[in] RHO */
605 /* > \verbatim */
606 /* >          RHO is DOUBLE PRECISION */
607 /* >         The scalar in the symmetric updating formula. */
608 /* > \endverbatim */
609 /* > */
610 /* > \param[out] SIGMA */
611 /* > \verbatim */
612 /* >          SIGMA is DOUBLE PRECISION */
613 /* >         The computed sigma_I, the I-th updated eigenvalue. */
614 /* > \endverbatim */
615 /* > */
616 /* > \param[out] WORK */
617 /* > \verbatim */
618 /* >          WORK is DOUBLE PRECISION array, dimension ( N ) */
619 /* >         If N .ne. 1, WORK contains (D(j) + sigma_I) in its  j-th */
620 /* >         component.  If N = 1, then WORK( 1 ) = 1. */
621 /* > \endverbatim */
622 /* > */
623 /* > \param[out] INFO */
624 /* > \verbatim */
625 /* >          INFO is INTEGER */
626 /* >         = 0:  successful exit */
627 /* >         > 0:  if INFO = 1, the updating process failed. */
628 /* > \endverbatim */
629
630 /* > \par Internal Parameters: */
631 /*  ========================= */
632 /* > */
633 /* > \verbatim */
634 /* >  Logical variable ORGATI (origin-at-i?) is used for distinguishing */
635 /* >  whether D(i) or D(i+1) is treated as the origin. */
636 /* > */
637 /* >            ORGATI = .true.    origin at i */
638 /* >            ORGATI = .false.   origin at i+1 */
639 /* > */
640 /* >  Logical variable SWTCH3 (switch-for-3-poles?) is for noting */
641 /* >  if we are working with THREE poles! */
642 /* > */
643 /* >  MAXIT is the maximum number of iterations allowed for each */
644 /* >  eigenvalue. */
645 /* > \endverbatim */
646
647 /*  Authors: */
648 /*  ======== */
649
650 /* > \author Univ. of Tennessee */
651 /* > \author Univ. of California Berkeley */
652 /* > \author Univ. of Colorado Denver */
653 /* > \author NAG Ltd. */
654
655 /* > \date December 2016 */
656
657 /* > \ingroup OTHERauxiliary */
658
659 /* > \par Contributors: */
660 /*  ================== */
661 /* > */
662 /* >     Ren-Cang Li, Computer Science Division, University of California */
663 /* >     at Berkeley, USA */
664 /* > */
665 /*  ===================================================================== */
666 /* Subroutine */ int dlasd4_(integer *n, integer *i__, doublereal *d__, 
667         doublereal *z__, doublereal *delta, doublereal *rho, doublereal *
668         sigma, doublereal *work, integer *info)
669 {
670     /* System generated locals */
671     integer i__1;
672     doublereal d__1;
673
674     /* Local variables */
675     doublereal dphi, sglb, dpsi, sgub;
676     integer iter;
677     doublereal temp, prew, temp1, temp2, a, b, c__;
678     integer j;
679     doublereal w, dtiim, delsq, dtiip;
680     integer niter;
681     doublereal dtisq;
682     logical swtch;
683     doublereal dtnsq;
684     extern /* Subroutine */ int dlaed6_(integer *, logical *, doublereal *, 
685             doublereal *, doublereal *, doublereal *, doublereal *, integer *)
686             , dlasd5_(integer *, doublereal *, doublereal *, doublereal *, 
687             doublereal *, doublereal *, doublereal *);
688     doublereal delsq2, dd[3], dtnsq1;
689     logical swtch3;
690     integer ii;
691     extern doublereal dlamch_(char *);
692     doublereal dw, zz[3];
693     logical orgati;
694     doublereal erretm, dtipsq, rhoinv;
695     integer ip1;
696     doublereal sq2, eta, phi, eps, tau, psi;
697     logical geomavg;
698     integer iim1, iip1;
699     doublereal tau2;
700
701
702 /*  -- LAPACK auxiliary routine (version 3.7.0) -- */
703 /*  -- LAPACK is a software package provided by Univ. of Tennessee,    -- */
704 /*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
705 /*     December 2016 */
706
707
708 /*  ===================================================================== */
709
710
711 /*     Since this routine is called in an inner loop, we do no argument */
712 /*     checking. */
713
714 /*     Quick return for N=1 and 2. */
715
716     /* Parameter adjustments */
717     --work;
718     --delta;
719     --z__;
720     --d__;
721
722     /* Function Body */
723     *info = 0;
724     if (*n == 1) {
725
726 /*        Presumably, I=1 upon entry */
727
728         *sigma = sqrt(d__[1] * d__[1] + *rho * z__[1] * z__[1]);
729         delta[1] = 1.;
730         work[1] = 1.;
731         return 0;
732     }
733     if (*n == 2) {
734         dlasd5_(i__, &d__[1], &z__[1], &delta[1], rho, sigma, &work[1]);
735         return 0;
736     }
737
738 /*     Compute machine epsilon */
739
740     eps = dlamch_("Epsilon");
741     rhoinv = 1. / *rho;
742     tau2 = 0.;
743
744 /*     The case I = N */
745
746     if (*i__ == *n) {
747
748 /*        Initialize some basic variables */
749
750         ii = *n - 1;
751         niter = 1;
752
753 /*        Calculate initial guess */
754
755         temp = *rho / 2.;
756
757 /*        If ||Z||_2 is not one, then TEMP should be set to */
758 /*        RHO * ||Z||_2^2 / TWO */
759
760         temp1 = temp / (d__[*n] + sqrt(d__[*n] * d__[*n] + temp));
761         i__1 = *n;
762         for (j = 1; j <= i__1; ++j) {
763             work[j] = d__[j] + d__[*n] + temp1;
764             delta[j] = d__[j] - d__[*n] - temp1;
765 /* L10: */
766         }
767
768         psi = 0.;
769         i__1 = *n - 2;
770         for (j = 1; j <= i__1; ++j) {
771             psi += z__[j] * z__[j] / (delta[j] * work[j]);
772 /* L20: */
773         }
774
775         c__ = rhoinv + psi;
776         w = c__ + z__[ii] * z__[ii] / (delta[ii] * work[ii]) + z__[*n] * z__[*
777                 n] / (delta[*n] * work[*n]);
778
779         if (w <= 0.) {
780             temp1 = sqrt(d__[*n] * d__[*n] + *rho);
781             temp = z__[*n - 1] * z__[*n - 1] / ((d__[*n - 1] + temp1) * (d__[*
782                     n] - d__[*n - 1] + *rho / (d__[*n] + temp1))) + z__[*n] * 
783                     z__[*n] / *rho;
784
785 /*           The following TAU2 is to approximate */
786 /*           SIGMA_n^2 - D( N )*D( N ) */
787
788             if (c__ <= temp) {
789                 tau = *rho;
790             } else {
791                 delsq = (d__[*n] - d__[*n - 1]) * (d__[*n] + d__[*n - 1]);
792                 a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*
793                         n];
794                 b = z__[*n] * z__[*n] * delsq;
795                 if (a < 0.) {
796                     tau2 = b * 2. / (sqrt(a * a + b * 4. * c__) - a);
797                 } else {
798                     tau2 = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.);
799                 }
800                 tau = tau2 / (d__[*n] + sqrt(d__[*n] * d__[*n] + tau2));
801             }
802
803 /*           It can be proved that */
804 /*               D(N)^2+RHO/2 <= SIGMA_n^2 < D(N)^2+TAU2 <= D(N)^2+RHO */
805
806         } else {
807             delsq = (d__[*n] - d__[*n - 1]) * (d__[*n] + d__[*n - 1]);
808             a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n];
809             b = z__[*n] * z__[*n] * delsq;
810
811 /*           The following TAU2 is to approximate */
812 /*           SIGMA_n^2 - D( N )*D( N ) */
813
814             if (a < 0.) {
815                 tau2 = b * 2. / (sqrt(a * a + b * 4. * c__) - a);
816             } else {
817                 tau2 = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.);
818             }
819             tau = tau2 / (d__[*n] + sqrt(d__[*n] * d__[*n] + tau2));
820
821 /*           It can be proved that */
822 /*           D(N)^2 < D(N)^2+TAU2 < SIGMA(N)^2 < D(N)^2+RHO/2 */
823
824         }
825
826 /*        The following TAU is to approximate SIGMA_n - D( N ) */
827
828 /*         TAU = TAU2 / ( D( N )+SQRT( D( N )*D( N )+TAU2 ) ) */
829
830         *sigma = d__[*n] + tau;
831         i__1 = *n;
832         for (j = 1; j <= i__1; ++j) {
833             delta[j] = d__[j] - d__[*n] - tau;
834             work[j] = d__[j] + d__[*n] + tau;
835 /* L30: */
836         }
837
838 /*        Evaluate PSI and the derivative DPSI */
839
840         dpsi = 0.;
841         psi = 0.;
842         erretm = 0.;
843         i__1 = ii;
844         for (j = 1; j <= i__1; ++j) {
845             temp = z__[j] / (delta[j] * work[j]);
846             psi += z__[j] * temp;
847             dpsi += temp * temp;
848             erretm += psi;
849 /* L40: */
850         }
851         erretm = abs(erretm);
852
853 /*        Evaluate PHI and the derivative DPHI */
854
855         temp = z__[*n] / (delta[*n] * work[*n]);
856         phi = z__[*n] * temp;
857         dphi = temp * temp;
858         erretm = (-phi - psi) * 8. + erretm - phi + rhoinv;
859 /*    $          + ABS( TAU2 )*( DPSI+DPHI ) */
860
861         w = rhoinv + phi + psi;
862
863 /*        Test for convergence */
864
865         if (abs(w) <= eps * erretm) {
866             goto L240;
867         }
868
869 /*        Calculate the new step */
870
871         ++niter;
872         dtnsq1 = work[*n - 1] * delta[*n - 1];
873         dtnsq = work[*n] * delta[*n];
874         c__ = w - dtnsq1 * dpsi - dtnsq * dphi;
875         a = (dtnsq + dtnsq1) * w - dtnsq * dtnsq1 * (dpsi + dphi);
876         b = dtnsq * dtnsq1 * w;
877         if (c__ < 0.) {
878             c__ = abs(c__);
879         }
880         if (c__ == 0.) {
881             eta = *rho - *sigma * *sigma;
882         } else if (a >= 0.) {
883             eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ 
884                     * 2.);
885         } else {
886             eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))
887                     );
888         }
889
890 /*        Note, eta should be positive if w is negative, and */
891 /*        eta should be negative otherwise. However, */
892 /*        if for some reason caused by roundoff, eta*w > 0, */
893 /*        we simply use one Newton step instead. This way */
894 /*        will guarantee eta*w < 0. */
895
896         if (w * eta > 0.) {
897             eta = -w / (dpsi + dphi);
898         }
899         temp = eta - dtnsq;
900         if (temp > *rho) {
901             eta = *rho + dtnsq;
902         }
903
904         eta /= *sigma + sqrt(eta + *sigma * *sigma);
905         tau += eta;
906         *sigma += eta;
907
908         i__1 = *n;
909         for (j = 1; j <= i__1; ++j) {
910             delta[j] -= eta;
911             work[j] += eta;
912 /* L50: */
913         }
914
915 /*        Evaluate PSI and the derivative DPSI */
916
917         dpsi = 0.;
918         psi = 0.;
919         erretm = 0.;
920         i__1 = ii;
921         for (j = 1; j <= i__1; ++j) {
922             temp = z__[j] / (work[j] * delta[j]);
923             psi += z__[j] * temp;
924             dpsi += temp * temp;
925             erretm += psi;
926 /* L60: */
927         }
928         erretm = abs(erretm);
929
930 /*        Evaluate PHI and the derivative DPHI */
931
932         tau2 = work[*n] * delta[*n];
933         temp = z__[*n] / tau2;
934         phi = z__[*n] * temp;
935         dphi = temp * temp;
936         erretm = (-phi - psi) * 8. + erretm - phi + rhoinv;
937 /*    $          + ABS( TAU2 )*( DPSI+DPHI ) */
938
939         w = rhoinv + phi + psi;
940
941 /*        Main loop to update the values of the array   DELTA */
942
943         iter = niter + 1;
944
945         for (niter = iter; niter <= 400; ++niter) {
946
947 /*           Test for convergence */
948
949             if (abs(w) <= eps * erretm) {
950                 goto L240;
951             }
952
953 /*           Calculate the new step */
954
955             dtnsq1 = work[*n - 1] * delta[*n - 1];
956             dtnsq = work[*n] * delta[*n];
957             c__ = w - dtnsq1 * dpsi - dtnsq * dphi;
958             a = (dtnsq + dtnsq1) * w - dtnsq1 * dtnsq * (dpsi + dphi);
959             b = dtnsq1 * dtnsq * w;
960             if (a >= 0.) {
961                 eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (
962                         c__ * 2.);
963             } else {
964                 eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(
965                         d__1))));
966             }
967
968 /*           Note, eta should be positive if w is negative, and */
969 /*           eta should be negative otherwise. However, */
970 /*           if for some reason caused by roundoff, eta*w > 0, */
971 /*           we simply use one Newton step instead. This way */
972 /*           will guarantee eta*w < 0. */
973
974             if (w * eta > 0.) {
975                 eta = -w / (dpsi + dphi);
976             }
977             temp = eta - dtnsq;
978             if (temp <= 0.) {
979                 eta /= 2.;
980             }
981
982             eta /= *sigma + sqrt(eta + *sigma * *sigma);
983             tau += eta;
984             *sigma += eta;
985
986             i__1 = *n;
987             for (j = 1; j <= i__1; ++j) {
988                 delta[j] -= eta;
989                 work[j] += eta;
990 /* L70: */
991             }
992
993 /*           Evaluate PSI and the derivative DPSI */
994
995             dpsi = 0.;
996             psi = 0.;
997             erretm = 0.;
998             i__1 = ii;
999             for (j = 1; j <= i__1; ++j) {
1000                 temp = z__[j] / (work[j] * delta[j]);
1001                 psi += z__[j] * temp;
1002                 dpsi += temp * temp;
1003                 erretm += psi;
1004 /* L80: */
1005             }
1006             erretm = abs(erretm);
1007
1008 /*           Evaluate PHI and the derivative DPHI */
1009
1010             tau2 = work[*n] * delta[*n];
1011             temp = z__[*n] / tau2;
1012             phi = z__[*n] * temp;
1013             dphi = temp * temp;
1014             erretm = (-phi - psi) * 8. + erretm - phi + rhoinv;
1015 /*    $             + ABS( TAU2 )*( DPSI+DPHI ) */
1016
1017             w = rhoinv + phi + psi;
1018 /* L90: */
1019         }
1020
1021 /*        Return with INFO = 1, NITER = MAXIT and not converged */
1022
1023         *info = 1;
1024         goto L240;
1025
1026 /*        End for the case I = N */
1027
1028     } else {
1029
1030 /*        The case for I < N */
1031
1032         niter = 1;
1033         ip1 = *i__ + 1;
1034
1035 /*        Calculate initial guess */
1036
1037         delsq = (d__[ip1] - d__[*i__]) * (d__[ip1] + d__[*i__]);
1038         delsq2 = delsq / 2.;
1039         sq2 = sqrt((d__[*i__] * d__[*i__] + d__[ip1] * d__[ip1]) / 2.);
1040         temp = delsq2 / (d__[*i__] + sq2);
1041         i__1 = *n;
1042         for (j = 1; j <= i__1; ++j) {
1043             work[j] = d__[j] + d__[*i__] + temp;
1044             delta[j] = d__[j] - d__[*i__] - temp;
1045 /* L100: */
1046         }
1047
1048         psi = 0.;
1049         i__1 = *i__ - 1;
1050         for (j = 1; j <= i__1; ++j) {
1051             psi += z__[j] * z__[j] / (work[j] * delta[j]);
1052 /* L110: */
1053         }
1054
1055         phi = 0.;
1056         i__1 = *i__ + 2;
1057         for (j = *n; j >= i__1; --j) {
1058             phi += z__[j] * z__[j] / (work[j] * delta[j]);
1059 /* L120: */
1060         }
1061         c__ = rhoinv + psi + phi;
1062         w = c__ + z__[*i__] * z__[*i__] / (work[*i__] * delta[*i__]) + z__[
1063                 ip1] * z__[ip1] / (work[ip1] * delta[ip1]);
1064
1065         geomavg = FALSE_;
1066         if (w > 0.) {
1067
1068 /*           d(i)^2 < the ith sigma^2 < (d(i)^2+d(i+1)^2)/2 */
1069
1070 /*           We choose d(i) as origin. */
1071
1072             orgati = TRUE_;
1073             ii = *i__;
1074             sglb = 0.;
1075             sgub = delsq2 / (d__[*i__] + sq2);
1076             a = c__ * delsq + z__[*i__] * z__[*i__] + z__[ip1] * z__[ip1];
1077             b = z__[*i__] * z__[*i__] * delsq;
1078             if (a > 0.) {
1079                 tau2 = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(
1080                         d__1))));
1081             } else {
1082                 tau2 = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / 
1083                         (c__ * 2.);
1084             }
1085
1086 /*           TAU2 now is an estimation of SIGMA^2 - D( I )^2. The */
1087 /*           following, however, is the corresponding estimation of */
1088 /*           SIGMA - D( I ). */
1089
1090             tau = tau2 / (d__[*i__] + sqrt(d__[*i__] * d__[*i__] + tau2));
1091             temp = sqrt(eps);
1092             if (d__[*i__] <= temp * d__[ip1] && (d__1 = z__[*i__], abs(d__1)) 
1093                     <= temp && d__[*i__] > 0.) {
1094 /* Computing MIN */
1095                 d__1 = d__[*i__] * 10.;
1096                 tau = f2cmin(d__1,sgub);
1097                 geomavg = TRUE_;
1098             }
1099         } else {
1100
1101 /*           (d(i)^2+d(i+1)^2)/2 <= the ith sigma^2 < d(i+1)^2/2 */
1102
1103 /*           We choose d(i+1) as origin. */
1104
1105             orgati = FALSE_;
1106             ii = ip1;
1107             sglb = -delsq2 / (d__[ii] + sq2);
1108             sgub = 0.;
1109             a = c__ * delsq - z__[*i__] * z__[*i__] - z__[ip1] * z__[ip1];
1110             b = z__[ip1] * z__[ip1] * delsq;
1111             if (a < 0.) {
1112                 tau2 = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs(
1113                         d__1))));
1114             } else {
1115                 tau2 = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) /
1116                          (c__ * 2.);
1117             }
1118
1119 /*           TAU2 now is an estimation of SIGMA^2 - D( IP1 )^2. The */
1120 /*           following, however, is the corresponding estimation of */
1121 /*           SIGMA - D( IP1 ). */
1122
1123             tau = tau2 / (d__[ip1] + sqrt((d__1 = d__[ip1] * d__[ip1] + tau2, 
1124                     abs(d__1))));
1125         }
1126
1127         *sigma = d__[ii] + tau;
1128         i__1 = *n;
1129         for (j = 1; j <= i__1; ++j) {
1130             work[j] = d__[j] + d__[ii] + tau;
1131             delta[j] = d__[j] - d__[ii] - tau;
1132 /* L130: */
1133         }
1134         iim1 = ii - 1;
1135         iip1 = ii + 1;
1136
1137 /*        Evaluate PSI and the derivative DPSI */
1138
1139         dpsi = 0.;
1140         psi = 0.;
1141         erretm = 0.;
1142         i__1 = iim1;
1143         for (j = 1; j <= i__1; ++j) {
1144             temp = z__[j] / (work[j] * delta[j]);
1145             psi += z__[j] * temp;
1146             dpsi += temp * temp;
1147             erretm += psi;
1148 /* L150: */
1149         }
1150         erretm = abs(erretm);
1151
1152 /*        Evaluate PHI and the derivative DPHI */
1153
1154         dphi = 0.;
1155         phi = 0.;
1156         i__1 = iip1;
1157         for (j = *n; j >= i__1; --j) {
1158             temp = z__[j] / (work[j] * delta[j]);
1159             phi += z__[j] * temp;
1160             dphi += temp * temp;
1161             erretm += phi;
1162 /* L160: */
1163         }
1164
1165         w = rhoinv + phi + psi;
1166
1167 /*        W is the value of the secular function with */
1168 /*        its ii-th element removed. */
1169
1170         swtch3 = FALSE_;
1171         if (orgati) {
1172             if (w < 0.) {
1173                 swtch3 = TRUE_;
1174             }
1175         } else {
1176             if (w > 0.) {
1177                 swtch3 = TRUE_;
1178             }
1179         }
1180         if (ii == 1 || ii == *n) {
1181             swtch3 = FALSE_;
1182         }
1183
1184         temp = z__[ii] / (work[ii] * delta[ii]);
1185         dw = dpsi + dphi + temp * temp;
1186         temp = z__[ii] * temp;
1187         w += temp;
1188         erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.;
1189 /*    $          + ABS( TAU2 )*DW */
1190
1191 /*        Test for convergence */
1192
1193         if (abs(w) <= eps * erretm) {
1194             goto L240;
1195         }
1196
1197         if (w <= 0.) {
1198             sglb = f2cmax(sglb,tau);
1199         } else {
1200             sgub = f2cmin(sgub,tau);
1201         }
1202
1203 /*        Calculate the new step */
1204
1205         ++niter;
1206         if (! swtch3) {
1207             dtipsq = work[ip1] * delta[ip1];
1208             dtisq = work[*i__] * delta[*i__];
1209             if (orgati) {
1210 /* Computing 2nd power */
1211                 d__1 = z__[*i__] / dtisq;
1212                 c__ = w - dtipsq * dw + delsq * (d__1 * d__1);
1213             } else {
1214 /* Computing 2nd power */
1215                 d__1 = z__[ip1] / dtipsq;
1216                 c__ = w - dtisq * dw - delsq * (d__1 * d__1);
1217             }
1218             a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw;
1219             b = dtipsq * dtisq * w;
1220             if (c__ == 0.) {
1221                 if (a == 0.) {
1222                     if (orgati) {
1223                         a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (dpsi + 
1224                                 dphi);
1225                     } else {
1226                         a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + 
1227                                 dphi);
1228                     }
1229                 }
1230                 eta = b / a;
1231             } else if (a <= 0.) {
1232                 eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (
1233                         c__ * 2.);
1234             } else {
1235                 eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(
1236                         d__1))));
1237             }
1238         } else {
1239
1240 /*           Interpolation using THREE most relevant poles */
1241
1242             dtiim = work[iim1] * delta[iim1];
1243             dtiip = work[iip1] * delta[iip1];
1244             temp = rhoinv + psi + phi;
1245             if (orgati) {
1246                 temp1 = z__[iim1] / dtiim;
1247                 temp1 *= temp1;
1248                 c__ = temp - dtiip * (dpsi + dphi) - (d__[iim1] - d__[iip1]) *
1249                          (d__[iim1] + d__[iip1]) * temp1;
1250                 zz[0] = z__[iim1] * z__[iim1];
1251                 if (dpsi < temp1) {
1252                     zz[2] = dtiip * dtiip * dphi;
1253                 } else {
1254                     zz[2] = dtiip * dtiip * (dpsi - temp1 + dphi);
1255                 }
1256             } else {
1257                 temp1 = z__[iip1] / dtiip;
1258                 temp1 *= temp1;
1259                 c__ = temp - dtiim * (dpsi + dphi) - (d__[iip1] - d__[iim1]) *
1260                          (d__[iim1] + d__[iip1]) * temp1;
1261                 if (dphi < temp1) {
1262                     zz[0] = dtiim * dtiim * dpsi;
1263                 } else {
1264                     zz[0] = dtiim * dtiim * (dpsi + (dphi - temp1));
1265                 }
1266                 zz[2] = z__[iip1] * z__[iip1];
1267             }
1268             zz[1] = z__[ii] * z__[ii];
1269             dd[0] = dtiim;
1270             dd[1] = delta[ii] * work[ii];
1271             dd[2] = dtiip;
1272             dlaed6_(&niter, &orgati, &c__, dd, zz, &w, &eta, info);
1273
1274             if (*info != 0) {
1275
1276 /*              If INFO is not 0, i.e., DLAED6 failed, switch back */
1277 /*              to 2 pole interpolation. */
1278
1279                 swtch3 = FALSE_;
1280                 *info = 0;
1281                 dtipsq = work[ip1] * delta[ip1];
1282                 dtisq = work[*i__] * delta[*i__];
1283                 if (orgati) {
1284 /* Computing 2nd power */
1285                     d__1 = z__[*i__] / dtisq;
1286                     c__ = w - dtipsq * dw + delsq * (d__1 * d__1);
1287                 } else {
1288 /* Computing 2nd power */
1289                     d__1 = z__[ip1] / dtipsq;
1290                     c__ = w - dtisq * dw - delsq * (d__1 * d__1);
1291                 }
1292                 a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw;
1293                 b = dtipsq * dtisq * w;
1294                 if (c__ == 0.) {
1295                     if (a == 0.) {
1296                         if (orgati) {
1297                             a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (
1298                                     dpsi + dphi);
1299                         } else {
1300                             a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + 
1301                                     dphi);
1302                         }
1303                     }
1304                     eta = b / a;
1305                 } else if (a <= 0.) {
1306                     eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))))
1307                              / (c__ * 2.);
1308                 } else {
1309                     eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, 
1310                             abs(d__1))));
1311                 }
1312             }
1313         }
1314
1315 /*        Note, eta should be positive if w is negative, and */
1316 /*        eta should be negative otherwise. However, */
1317 /*        if for some reason caused by roundoff, eta*w > 0, */
1318 /*        we simply use one Newton step instead. This way */
1319 /*        will guarantee eta*w < 0. */
1320
1321         if (w * eta >= 0.) {
1322             eta = -w / dw;
1323         }
1324
1325         eta /= *sigma + sqrt(*sigma * *sigma + eta);
1326         temp = tau + eta;
1327         if (temp > sgub || temp < sglb) {
1328             if (w < 0.) {
1329                 eta = (sgub - tau) / 2.;
1330             } else {
1331                 eta = (sglb - tau) / 2.;
1332             }
1333             if (geomavg) {
1334                 if (w < 0.) {
1335                     if (tau > 0.) {
1336                         eta = sqrt(sgub * tau) - tau;
1337                     }
1338                 } else {
1339                     if (sglb > 0.) {
1340                         eta = sqrt(sglb * tau) - tau;
1341                     }
1342                 }
1343             }
1344         }
1345
1346         prew = w;
1347
1348         tau += eta;
1349         *sigma += eta;
1350
1351         i__1 = *n;
1352         for (j = 1; j <= i__1; ++j) {
1353             work[j] += eta;
1354             delta[j] -= eta;
1355 /* L170: */
1356         }
1357
1358 /*        Evaluate PSI and the derivative DPSI */
1359
1360         dpsi = 0.;
1361         psi = 0.;
1362         erretm = 0.;
1363         i__1 = iim1;
1364         for (j = 1; j <= i__1; ++j) {
1365             temp = z__[j] / (work[j] * delta[j]);
1366             psi += z__[j] * temp;
1367             dpsi += temp * temp;
1368             erretm += psi;
1369 /* L180: */
1370         }
1371         erretm = abs(erretm);
1372
1373 /*        Evaluate PHI and the derivative DPHI */
1374
1375         dphi = 0.;
1376         phi = 0.;
1377         i__1 = iip1;
1378         for (j = *n; j >= i__1; --j) {
1379             temp = z__[j] / (work[j] * delta[j]);
1380             phi += z__[j] * temp;
1381             dphi += temp * temp;
1382             erretm += phi;
1383 /* L190: */
1384         }
1385
1386         tau2 = work[ii] * delta[ii];
1387         temp = z__[ii] / tau2;
1388         dw = dpsi + dphi + temp * temp;
1389         temp = z__[ii] * temp;
1390         w = rhoinv + phi + psi + temp;
1391         erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.;
1392 /*    $          + ABS( TAU2 )*DW */
1393
1394         swtch = FALSE_;
1395         if (orgati) {
1396             if (-w > abs(prew) / 10.) {
1397                 swtch = TRUE_;
1398             }
1399         } else {
1400             if (w > abs(prew) / 10.) {
1401                 swtch = TRUE_;
1402             }
1403         }
1404
1405 /*        Main loop to update the values of the array   DELTA and WORK */
1406
1407         iter = niter + 1;
1408
1409         for (niter = iter; niter <= 400; ++niter) {
1410
1411 /*           Test for convergence */
1412
1413             if (abs(w) <= eps * erretm) {
1414 /*     $          .OR. (SGUB-SGLB).LE.EIGHT*ABS(SGUB+SGLB) ) THEN */
1415                 goto L240;
1416             }
1417
1418             if (w <= 0.) {
1419                 sglb = f2cmax(sglb,tau);
1420             } else {
1421                 sgub = f2cmin(sgub,tau);
1422             }
1423
1424 /*           Calculate the new step */
1425
1426             if (! swtch3) {
1427                 dtipsq = work[ip1] * delta[ip1];
1428                 dtisq = work[*i__] * delta[*i__];
1429                 if (! swtch) {
1430                     if (orgati) {
1431 /* Computing 2nd power */
1432                         d__1 = z__[*i__] / dtisq;
1433                         c__ = w - dtipsq * dw + delsq * (d__1 * d__1);
1434                     } else {
1435 /* Computing 2nd power */
1436                         d__1 = z__[ip1] / dtipsq;
1437                         c__ = w - dtisq * dw - delsq * (d__1 * d__1);
1438                     }
1439                 } else {
1440                     temp = z__[ii] / (work[ii] * delta[ii]);
1441                     if (orgati) {
1442                         dpsi += temp * temp;
1443                     } else {
1444                         dphi += temp * temp;
1445                     }
1446                     c__ = w - dtisq * dpsi - dtipsq * dphi;
1447                 }
1448                 a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw;
1449                 b = dtipsq * dtisq * w;
1450                 if (c__ == 0.) {
1451                     if (a == 0.) {
1452                         if (! swtch) {
1453                             if (orgati) {
1454                                 a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * 
1455                                         (dpsi + dphi);
1456                             } else {
1457                                 a = z__[ip1] * z__[ip1] + dtisq * dtisq * (
1458                                         dpsi + dphi);
1459                             }
1460                         } else {
1461                             a = dtisq * dtisq * dpsi + dtipsq * dtipsq * dphi;
1462                         }
1463                     }
1464                     eta = b / a;
1465                 } else if (a <= 0.) {
1466                     eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))))
1467                              / (c__ * 2.);
1468                 } else {
1469                     eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, 
1470                             abs(d__1))));
1471                 }
1472             } else {
1473
1474 /*              Interpolation using THREE most relevant poles */
1475
1476                 dtiim = work[iim1] * delta[iim1];
1477                 dtiip = work[iip1] * delta[iip1];
1478                 temp = rhoinv + psi + phi;
1479                 if (swtch) {
1480                     c__ = temp - dtiim * dpsi - dtiip * dphi;
1481                     zz[0] = dtiim * dtiim * dpsi;
1482                     zz[2] = dtiip * dtiip * dphi;
1483                 } else {
1484                     if (orgati) {
1485                         temp1 = z__[iim1] / dtiim;
1486                         temp1 *= temp1;
1487                         temp2 = (d__[iim1] - d__[iip1]) * (d__[iim1] + d__[
1488                                 iip1]) * temp1;
1489                         c__ = temp - dtiip * (dpsi + dphi) - temp2;
1490                         zz[0] = z__[iim1] * z__[iim1];
1491                         if (dpsi < temp1) {
1492                             zz[2] = dtiip * dtiip * dphi;
1493                         } else {
1494                             zz[2] = dtiip * dtiip * (dpsi - temp1 + dphi);
1495                         }
1496                     } else {
1497                         temp1 = z__[iip1] / dtiip;
1498                         temp1 *= temp1;
1499                         temp2 = (d__[iip1] - d__[iim1]) * (d__[iim1] + d__[
1500                                 iip1]) * temp1;
1501                         c__ = temp - dtiim * (dpsi + dphi) - temp2;
1502                         if (dphi < temp1) {
1503                             zz[0] = dtiim * dtiim * dpsi;
1504                         } else {
1505                             zz[0] = dtiim * dtiim * (dpsi + (dphi - temp1));
1506                         }
1507                         zz[2] = z__[iip1] * z__[iip1];
1508                     }
1509                 }
1510                 dd[0] = dtiim;
1511                 dd[1] = delta[ii] * work[ii];
1512                 dd[2] = dtiip;
1513                 dlaed6_(&niter, &orgati, &c__, dd, zz, &w, &eta, info);
1514
1515                 if (*info != 0) {
1516
1517 /*                 If INFO is not 0, i.e., DLAED6 failed, switch */
1518 /*                 back to two pole interpolation */
1519
1520                     swtch3 = FALSE_;
1521                     *info = 0;
1522                     dtipsq = work[ip1] * delta[ip1];
1523                     dtisq = work[*i__] * delta[*i__];
1524                     if (! swtch) {
1525                         if (orgati) {
1526 /* Computing 2nd power */
1527                             d__1 = z__[*i__] / dtisq;
1528                             c__ = w - dtipsq * dw + delsq * (d__1 * d__1);
1529                         } else {
1530 /* Computing 2nd power */
1531                             d__1 = z__[ip1] / dtipsq;
1532                             c__ = w - dtisq * dw - delsq * (d__1 * d__1);
1533                         }
1534                     } else {
1535                         temp = z__[ii] / (work[ii] * delta[ii]);
1536                         if (orgati) {
1537                             dpsi += temp * temp;
1538                         } else {
1539                             dphi += temp * temp;
1540                         }
1541                         c__ = w - dtisq * dpsi - dtipsq * dphi;
1542                     }
1543                     a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw;
1544                     b = dtipsq * dtisq * w;
1545                     if (c__ == 0.) {
1546                         if (a == 0.) {
1547                             if (! swtch) {
1548                                 if (orgati) {
1549                                     a = z__[*i__] * z__[*i__] + dtipsq * 
1550                                             dtipsq * (dpsi + dphi);
1551                                 } else {
1552                                     a = z__[ip1] * z__[ip1] + dtisq * dtisq * 
1553                                             (dpsi + dphi);
1554                                 }
1555                             } else {
1556                                 a = dtisq * dtisq * dpsi + dtipsq * dtipsq * 
1557                                         dphi;
1558                             }
1559                         }
1560                         eta = b / a;
1561                     } else if (a <= 0.) {
1562                         eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(
1563                                 d__1)))) / (c__ * 2.);
1564                     } else {
1565                         eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__,
1566                                  abs(d__1))));
1567                     }
1568                 }
1569             }
1570
1571 /*           Note, eta should be positive if w is negative, and */
1572 /*           eta should be negative otherwise. However, */
1573 /*           if for some reason caused by roundoff, eta*w > 0, */
1574 /*           we simply use one Newton step instead. This way */
1575 /*           will guarantee eta*w < 0. */
1576
1577             if (w * eta >= 0.) {
1578                 eta = -w / dw;
1579             }
1580
1581             eta /= *sigma + sqrt(*sigma * *sigma + eta);
1582             temp = tau + eta;
1583             if (temp > sgub || temp < sglb) {
1584                 if (w < 0.) {
1585                     eta = (sgub - tau) / 2.;
1586                 } else {
1587                     eta = (sglb - tau) / 2.;
1588                 }
1589                 if (geomavg) {
1590                     if (w < 0.) {
1591                         if (tau > 0.) {
1592                             eta = sqrt(sgub * tau) - tau;
1593                         }
1594                     } else {
1595                         if (sglb > 0.) {
1596                             eta = sqrt(sglb * tau) - tau;
1597                         }
1598                     }
1599                 }
1600             }
1601
1602             prew = w;
1603
1604             tau += eta;
1605             *sigma += eta;
1606
1607             i__1 = *n;
1608             for (j = 1; j <= i__1; ++j) {
1609                 work[j] += eta;
1610                 delta[j] -= eta;
1611 /* L200: */
1612             }
1613
1614 /*           Evaluate PSI and the derivative DPSI */
1615
1616             dpsi = 0.;
1617             psi = 0.;
1618             erretm = 0.;
1619             i__1 = iim1;
1620             for (j = 1; j <= i__1; ++j) {
1621                 temp = z__[j] / (work[j] * delta[j]);
1622                 psi += z__[j] * temp;
1623                 dpsi += temp * temp;
1624                 erretm += psi;
1625 /* L210: */
1626             }
1627             erretm = abs(erretm);
1628
1629 /*           Evaluate PHI and the derivative DPHI */
1630
1631             dphi = 0.;
1632             phi = 0.;
1633             i__1 = iip1;
1634             for (j = *n; j >= i__1; --j) {
1635                 temp = z__[j] / (work[j] * delta[j]);
1636                 phi += z__[j] * temp;
1637                 dphi += temp * temp;
1638                 erretm += phi;
1639 /* L220: */
1640             }
1641
1642             tau2 = work[ii] * delta[ii];
1643             temp = z__[ii] / tau2;
1644             dw = dpsi + dphi + temp * temp;
1645             temp = z__[ii] * temp;
1646             w = rhoinv + phi + psi + temp;
1647             erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.;
1648 /*    $             + ABS( TAU2 )*DW */
1649
1650             if (w * prew > 0. && abs(w) > abs(prew) / 10.) {
1651                 swtch = ! swtch;
1652             }
1653
1654 /* L230: */
1655         }
1656
1657 /*        Return with INFO = 1, NITER = MAXIT and not converged */
1658
1659         *info = 1;
1660
1661     }
1662
1663 L240:
1664     return 0;
1665
1666 /*     End of DLASD4 */
1667
1668 } /* dlasd4_ */
1669