C_LAPACK: Fixes to make it compile with MSVC (#3605)
[platform/upstream/openblas.git] / lapack-netlib / SRC / zhbgst.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 /* Table of constant values */
514
515 static doublecomplex c_b1 = {0.,0.};
516 static doublecomplex c_b2 = {1.,0.};
517 static integer c__1 = 1;
518
519 /* > \brief \b ZHBGST */
520
521 /*  =========== DOCUMENTATION =========== */
522
523 /* Online html documentation available at */
524 /*            http://www.netlib.org/lapack/explore-html/ */
525
526 /* > \htmlonly */
527 /* > Download ZHBGST + dependencies */
528 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zhbgst.
529 f"> */
530 /* > [TGZ]</a> */
531 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zhbgst.
532 f"> */
533 /* > [ZIP]</a> */
534 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zhbgst.
535 f"> */
536 /* > [TXT]</a> */
537 /* > \endhtmlonly */
538
539 /*  Definition: */
540 /*  =========== */
541
542 /*       SUBROUTINE ZHBGST( VECT, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, X, */
543 /*                          LDX, WORK, RWORK, INFO ) */
544
545 /*       CHARACTER          UPLO, VECT */
546 /*       INTEGER            INFO, KA, KB, LDAB, LDBB, LDX, N */
547 /*       DOUBLE PRECISION   RWORK( * ) */
548 /*       COMPLEX*16         AB( LDAB, * ), BB( LDBB, * ), WORK( * ), */
549 /*      $                   X( LDX, * ) */
550
551
552 /* > \par Purpose: */
553 /*  ============= */
554 /* > */
555 /* > \verbatim */
556 /* > */
557 /* > ZHBGST reduces a complex Hermitian-definite banded generalized */
558 /* > eigenproblem  A*x = lambda*B*x  to standard form  C*y = lambda*y, */
559 /* > such that C has the same bandwidth as A. */
560 /* > */
561 /* > B must have been previously factorized as S**H*S by ZPBSTF, using a */
562 /* > split Cholesky factorization. A is overwritten by C = X**H*A*X, where */
563 /* > X = S**(-1)*Q and Q is a unitary matrix chosen to preserve the */
564 /* > bandwidth of A. */
565 /* > \endverbatim */
566
567 /*  Arguments: */
568 /*  ========== */
569
570 /* > \param[in] VECT */
571 /* > \verbatim */
572 /* >          VECT is CHARACTER*1 */
573 /* >          = 'N':  do not form the transformation matrix X; */
574 /* >          = 'V':  form X. */
575 /* > \endverbatim */
576 /* > */
577 /* > \param[in] UPLO */
578 /* > \verbatim */
579 /* >          UPLO is CHARACTER*1 */
580 /* >          = 'U':  Upper triangle of A is stored; */
581 /* >          = 'L':  Lower triangle of A is stored. */
582 /* > \endverbatim */
583 /* > */
584 /* > \param[in] N */
585 /* > \verbatim */
586 /* >          N is INTEGER */
587 /* >          The order of the matrices A and B.  N >= 0. */
588 /* > \endverbatim */
589 /* > */
590 /* > \param[in] KA */
591 /* > \verbatim */
592 /* >          KA is INTEGER */
593 /* >          The number of superdiagonals of the matrix A if UPLO = 'U', */
594 /* >          or the number of subdiagonals if UPLO = 'L'.  KA >= 0. */
595 /* > \endverbatim */
596 /* > */
597 /* > \param[in] KB */
598 /* > \verbatim */
599 /* >          KB is INTEGER */
600 /* >          The number of superdiagonals of the matrix B if UPLO = 'U', */
601 /* >          or the number of subdiagonals if UPLO = 'L'.  KA >= KB >= 0. */
602 /* > \endverbatim */
603 /* > */
604 /* > \param[in,out] AB */
605 /* > \verbatim */
606 /* >          AB is COMPLEX*16 array, dimension (LDAB,N) */
607 /* >          On entry, the upper or lower triangle of the Hermitian band */
608 /* >          matrix A, stored in the first ka+1 rows of the array.  The */
609 /* >          j-th column of A is stored in the j-th column of the array AB */
610 /* >          as follows: */
611 /* >          if UPLO = 'U', AB(ka+1+i-j,j) = A(i,j) for f2cmax(1,j-ka)<=i<=j; */
612 /* >          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=f2cmin(n,j+ka). */
613 /* > */
614 /* >          On exit, the transformed matrix X**H*A*X, stored in the same */
615 /* >          format as A. */
616 /* > \endverbatim */
617 /* > */
618 /* > \param[in] LDAB */
619 /* > \verbatim */
620 /* >          LDAB is INTEGER */
621 /* >          The leading dimension of the array AB.  LDAB >= KA+1. */
622 /* > \endverbatim */
623 /* > */
624 /* > \param[in] BB */
625 /* > \verbatim */
626 /* >          BB is COMPLEX*16 array, dimension (LDBB,N) */
627 /* >          The banded factor S from the split Cholesky factorization of */
628 /* >          B, as returned by ZPBSTF, stored in the first kb+1 rows of */
629 /* >          the array. */
630 /* > \endverbatim */
631 /* > */
632 /* > \param[in] LDBB */
633 /* > \verbatim */
634 /* >          LDBB is INTEGER */
635 /* >          The leading dimension of the array BB.  LDBB >= KB+1. */
636 /* > \endverbatim */
637 /* > */
638 /* > \param[out] X */
639 /* > \verbatim */
640 /* >          X is COMPLEX*16 array, dimension (LDX,N) */
641 /* >          If VECT = 'V', the n-by-n matrix X. */
642 /* >          If VECT = 'N', the array X is not referenced. */
643 /* > \endverbatim */
644 /* > */
645 /* > \param[in] LDX */
646 /* > \verbatim */
647 /* >          LDX is INTEGER */
648 /* >          The leading dimension of the array X. */
649 /* >          LDX >= f2cmax(1,N) if VECT = 'V'; LDX >= 1 otherwise. */
650 /* > \endverbatim */
651 /* > */
652 /* > \param[out] WORK */
653 /* > \verbatim */
654 /* >          WORK is COMPLEX*16 array, dimension (N) */
655 /* > \endverbatim */
656 /* > */
657 /* > \param[out] RWORK */
658 /* > \verbatim */
659 /* >          RWORK is DOUBLE PRECISION array, dimension (N) */
660 /* > \endverbatim */
661 /* > */
662 /* > \param[out] INFO */
663 /* > \verbatim */
664 /* >          INFO is INTEGER */
665 /* >          = 0:  successful exit */
666 /* >          < 0:  if INFO = -i, the i-th argument had an illegal value. */
667 /* > \endverbatim */
668
669 /*  Authors: */
670 /*  ======== */
671
672 /* > \author Univ. of Tennessee */
673 /* > \author Univ. of California Berkeley */
674 /* > \author Univ. of Colorado Denver */
675 /* > \author NAG Ltd. */
676
677 /* > \date December 2016 */
678
679 /* > \ingroup complex16OTHERcomputational */
680
681 /*  ===================================================================== */
682 /* Subroutine */ int zhbgst_(char *vect, char *uplo, integer *n, integer *ka, 
683         integer *kb, doublecomplex *ab, integer *ldab, doublecomplex *bb, 
684         integer *ldbb, doublecomplex *x, integer *ldx, doublecomplex *work, 
685         doublereal *rwork, integer *info)
686 {
687     /* System generated locals */
688     integer ab_dim1, ab_offset, bb_dim1, bb_offset, x_dim1, x_offset, i__1, 
689             i__2, i__3, i__4, i__5, i__6, i__7, i__8;
690     doublereal d__1;
691     doublecomplex z__1, z__2, z__3, z__4, z__5, z__6, z__7, z__8, z__9, z__10;
692
693     /* Local variables */
694     integer inca;
695     extern /* Subroutine */ int zrot_(integer *, doublecomplex *, integer *, 
696             doublecomplex *, integer *, doublereal *, doublecomplex *);
697     integer i__, j, k, l, m;
698     doublecomplex t;
699     extern logical lsame_(char *, char *);
700     extern /* Subroutine */ int zgerc_(integer *, integer *, doublecomplex *, 
701             doublecomplex *, integer *, doublecomplex *, integer *, 
702             doublecomplex *, integer *);
703     integer i0, i1;
704     logical upper;
705     integer i2, j1, j2;
706     extern /* Subroutine */ int zgeru_(integer *, integer *, doublecomplex *, 
707             doublecomplex *, integer *, doublecomplex *, integer *, 
708             doublecomplex *, integer *);
709     logical wantx;
710     extern /* Subroutine */ int zlar2v_(integer *, doublecomplex *, 
711             doublecomplex *, doublecomplex *, integer *, doublereal *, 
712             doublecomplex *, integer *);
713     doublecomplex ra;
714     integer nr, nx;
715     extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), zdscal_(
716             integer *, doublereal *, doublecomplex *, integer *);
717     logical update;
718     extern /* Subroutine */ int zlacgv_(integer *, doublecomplex *, integer *)
719             ;
720     integer ka1, kb1;
721     extern /* Subroutine */ int zlaset_(char *, integer *, integer *, 
722             doublecomplex *, doublecomplex *, doublecomplex *, integer *), zlartg_(doublecomplex *, doublecomplex *, doublereal *, 
723             doublecomplex *, doublecomplex *);
724     doublecomplex ra1;
725     extern /* Subroutine */ int zlargv_(integer *, doublecomplex *, integer *,
726              doublecomplex *, integer *, doublereal *, integer *);
727     integer j1t, j2t;
728     extern /* Subroutine */ int zlartv_(integer *, doublecomplex *, integer *,
729              doublecomplex *, integer *, doublereal *, doublecomplex *, 
730             integer *);
731     doublereal bii;
732     integer kbt, nrt;
733
734
735 /*  -- LAPACK computational routine (version 3.7.0) -- */
736 /*  -- LAPACK is a software package provided by Univ. of Tennessee,    -- */
737 /*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
738 /*     December 2016 */
739
740
741 /*  ===================================================================== */
742
743
744 /*     Test the input parameters */
745
746     /* Parameter adjustments */
747     ab_dim1 = *ldab;
748     ab_offset = 1 + ab_dim1 * 1;
749     ab -= ab_offset;
750     bb_dim1 = *ldbb;
751     bb_offset = 1 + bb_dim1 * 1;
752     bb -= bb_offset;
753     x_dim1 = *ldx;
754     x_offset = 1 + x_dim1 * 1;
755     x -= x_offset;
756     --work;
757     --rwork;
758
759     /* Function Body */
760     wantx = lsame_(vect, "V");
761     upper = lsame_(uplo, "U");
762     ka1 = *ka + 1;
763     kb1 = *kb + 1;
764     *info = 0;
765     if (! wantx && ! lsame_(vect, "N")) {
766         *info = -1;
767     } else if (! upper && ! lsame_(uplo, "L")) {
768         *info = -2;
769     } else if (*n < 0) {
770         *info = -3;
771     } else if (*ka < 0) {
772         *info = -4;
773     } else if (*kb < 0 || *kb > *ka) {
774         *info = -5;
775     } else if (*ldab < *ka + 1) {
776         *info = -7;
777     } else if (*ldbb < *kb + 1) {
778         *info = -9;
779     } else if (*ldx < 1 || wantx && *ldx < f2cmax(1,*n)) {
780         *info = -11;
781     }
782     if (*info != 0) {
783         i__1 = -(*info);
784         xerbla_("ZHBGST", &i__1, (ftnlen)6);
785         return 0;
786     }
787
788 /*     Quick return if possible */
789
790     if (*n == 0) {
791         return 0;
792     }
793
794     inca = *ldab * ka1;
795
796 /*     Initialize X to the unit matrix, if needed */
797
798     if (wantx) {
799         zlaset_("Full", n, n, &c_b1, &c_b2, &x[x_offset], ldx);
800     }
801
802 /*     Set M to the splitting point m. It must be the same value as is */
803 /*     used in ZPBSTF. The chosen value allows the arrays WORK and RWORK */
804 /*     to be of dimension (N). */
805
806     m = (*n + *kb) / 2;
807
808 /*     The routine works in two phases, corresponding to the two halves */
809 /*     of the split Cholesky factorization of B as S**H*S where */
810
811 /*     S = ( U    ) */
812 /*         ( M  L ) */
813
814 /*     with U upper triangular of order m, and L lower triangular of */
815 /*     order n-m. S has the same bandwidth as B. */
816
817 /*     S is treated as a product of elementary matrices: */
818
819 /*     S = S(m)*S(m-1)*...*S(2)*S(1)*S(m+1)*S(m+2)*...*S(n-1)*S(n) */
820
821 /*     where S(i) is determined by the i-th row of S. */
822
823 /*     In phase 1, the index i takes the values n, n-1, ... , m+1; */
824 /*     in phase 2, it takes the values 1, 2, ... , m. */
825
826 /*     For each value of i, the current matrix A is updated by forming */
827 /*     inv(S(i))**H*A*inv(S(i)). This creates a triangular bulge outside */
828 /*     the band of A. The bulge is then pushed down toward the bottom of */
829 /*     A in phase 1, and up toward the top of A in phase 2, by applying */
830 /*     plane rotations. */
831
832 /*     There are kb*(kb+1)/2 elements in the bulge, but at most 2*kb-1 */
833 /*     of them are linearly independent, so annihilating a bulge requires */
834 /*     only 2*kb-1 plane rotations. The rotations are divided into a 1st */
835 /*     set of kb-1 rotations, and a 2nd set of kb rotations. */
836
837 /*     Wherever possible, rotations are generated and applied in vector */
838 /*     operations of length NR between the indices J1 and J2 (sometimes */
839 /*     replaced by modified values NRT, J1T or J2T). */
840
841 /*     The real cosines and complex sines of the rotations are stored in */
842 /*     the arrays RWORK and WORK, those of the 1st set in elements */
843 /*     2:m-kb-1, and those of the 2nd set in elements m-kb+1:n. */
844
845 /*     The bulges are not formed explicitly; nonzero elements outside the */
846 /*     band are created only when they are required for generating new */
847 /*     rotations; they are stored in the array WORK, in positions where */
848 /*     they are later overwritten by the sines of the rotations which */
849 /*     annihilate them. */
850
851 /*     **************************** Phase 1 ***************************** */
852
853 /*     The logical structure of this phase is: */
854
855 /*     UPDATE = .TRUE. */
856 /*     DO I = N, M + 1, -1 */
857 /*        use S(i) to update A and create a new bulge */
858 /*        apply rotations to push all bulges KA positions downward */
859 /*     END DO */
860 /*     UPDATE = .FALSE. */
861 /*     DO I = M + KA + 1, N - 1 */
862 /*        apply rotations to push all bulges KA positions downward */
863 /*     END DO */
864
865 /*     To avoid duplicating code, the two loops are merged. */
866
867     update = TRUE_;
868     i__ = *n + 1;
869 L10:
870     if (update) {
871         --i__;
872 /* Computing MIN */
873         i__1 = *kb, i__2 = i__ - 1;
874         kbt = f2cmin(i__1,i__2);
875         i0 = i__ - 1;
876 /* Computing MIN */
877         i__1 = *n, i__2 = i__ + *ka;
878         i1 = f2cmin(i__1,i__2);
879         i2 = i__ - kbt + ka1;
880         if (i__ < m + 1) {
881             update = FALSE_;
882             ++i__;
883             i0 = m;
884             if (*ka == 0) {
885                 goto L480;
886             }
887             goto L10;
888         }
889     } else {
890         i__ += *ka;
891         if (i__ > *n - 1) {
892             goto L480;
893         }
894     }
895
896     if (upper) {
897
898 /*        Transform A, working with the upper triangle */
899
900         if (update) {
901
902 /*           Form  inv(S(i))**H * A * inv(S(i)) */
903
904             i__1 = kb1 + i__ * bb_dim1;
905             bii = bb[i__1].r;
906             i__1 = ka1 + i__ * ab_dim1;
907             i__2 = ka1 + i__ * ab_dim1;
908             d__1 = ab[i__2].r / bii / bii;
909             ab[i__1].r = d__1, ab[i__1].i = 0.;
910             i__1 = i1;
911             for (j = i__ + 1; j <= i__1; ++j) {
912                 i__2 = i__ - j + ka1 + j * ab_dim1;
913                 i__3 = i__ - j + ka1 + j * ab_dim1;
914                 z__1.r = ab[i__3].r / bii, z__1.i = ab[i__3].i / bii;
915                 ab[i__2].r = z__1.r, ab[i__2].i = z__1.i;
916 /* L20: */
917             }
918 /* Computing MAX */
919             i__1 = 1, i__2 = i__ - *ka;
920             i__3 = i__ - 1;
921             for (j = f2cmax(i__1,i__2); j <= i__3; ++j) {
922                 i__1 = j - i__ + ka1 + i__ * ab_dim1;
923                 i__2 = j - i__ + ka1 + i__ * ab_dim1;
924                 z__1.r = ab[i__2].r / bii, z__1.i = ab[i__2].i / bii;
925                 ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
926 /* L30: */
927             }
928             i__3 = i__ - 1;
929             for (k = i__ - kbt; k <= i__3; ++k) {
930                 i__1 = k;
931                 for (j = i__ - kbt; j <= i__1; ++j) {
932                     i__2 = j - k + ka1 + k * ab_dim1;
933                     i__4 = j - k + ka1 + k * ab_dim1;
934                     i__5 = j - i__ + kb1 + i__ * bb_dim1;
935                     d_cnjg(&z__5, &ab[k - i__ + ka1 + i__ * ab_dim1]);
936                     z__4.r = bb[i__5].r * z__5.r - bb[i__5].i * z__5.i, 
937                             z__4.i = bb[i__5].r * z__5.i + bb[i__5].i * 
938                             z__5.r;
939                     z__3.r = ab[i__4].r - z__4.r, z__3.i = ab[i__4].i - 
940                             z__4.i;
941                     d_cnjg(&z__7, &bb[k - i__ + kb1 + i__ * bb_dim1]);
942                     i__6 = j - i__ + ka1 + i__ * ab_dim1;
943                     z__6.r = z__7.r * ab[i__6].r - z__7.i * ab[i__6].i, 
944                             z__6.i = z__7.r * ab[i__6].i + z__7.i * ab[i__6]
945                             .r;
946                     z__2.r = z__3.r - z__6.r, z__2.i = z__3.i - z__6.i;
947                     i__7 = ka1 + i__ * ab_dim1;
948                     d__1 = ab[i__7].r;
949                     i__8 = j - i__ + kb1 + i__ * bb_dim1;
950                     z__9.r = d__1 * bb[i__8].r, z__9.i = d__1 * bb[i__8].i;
951                     d_cnjg(&z__10, &bb[k - i__ + kb1 + i__ * bb_dim1]);
952                     z__8.r = z__9.r * z__10.r - z__9.i * z__10.i, z__8.i = 
953                             z__9.r * z__10.i + z__9.i * z__10.r;
954                     z__1.r = z__2.r + z__8.r, z__1.i = z__2.i + z__8.i;
955                     ab[i__2].r = z__1.r, ab[i__2].i = z__1.i;
956 /* L40: */
957                 }
958 /* Computing MAX */
959                 i__1 = 1, i__2 = i__ - *ka;
960                 i__4 = i__ - kbt - 1;
961                 for (j = f2cmax(i__1,i__2); j <= i__4; ++j) {
962                     i__1 = j - k + ka1 + k * ab_dim1;
963                     i__2 = j - k + ka1 + k * ab_dim1;
964                     d_cnjg(&z__3, &bb[k - i__ + kb1 + i__ * bb_dim1]);
965                     i__5 = j - i__ + ka1 + i__ * ab_dim1;
966                     z__2.r = z__3.r * ab[i__5].r - z__3.i * ab[i__5].i, 
967                             z__2.i = z__3.r * ab[i__5].i + z__3.i * ab[i__5]
968                             .r;
969                     z__1.r = ab[i__2].r - z__2.r, z__1.i = ab[i__2].i - 
970                             z__2.i;
971                     ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
972 /* L50: */
973                 }
974 /* L60: */
975             }
976             i__3 = i1;
977             for (j = i__; j <= i__3; ++j) {
978 /* Computing MAX */
979                 i__4 = j - *ka, i__1 = i__ - kbt;
980                 i__2 = i__ - 1;
981                 for (k = f2cmax(i__4,i__1); k <= i__2; ++k) {
982                     i__4 = k - j + ka1 + j * ab_dim1;
983                     i__1 = k - j + ka1 + j * ab_dim1;
984                     i__5 = k - i__ + kb1 + i__ * bb_dim1;
985                     i__6 = i__ - j + ka1 + j * ab_dim1;
986                     z__2.r = bb[i__5].r * ab[i__6].r - bb[i__5].i * ab[i__6]
987                             .i, z__2.i = bb[i__5].r * ab[i__6].i + bb[i__5].i 
988                             * ab[i__6].r;
989                     z__1.r = ab[i__1].r - z__2.r, z__1.i = ab[i__1].i - 
990                             z__2.i;
991                     ab[i__4].r = z__1.r, ab[i__4].i = z__1.i;
992 /* L70: */
993                 }
994 /* L80: */
995             }
996
997             if (wantx) {
998
999 /*              post-multiply X by inv(S(i)) */
1000
1001                 i__3 = *n - m;
1002                 d__1 = 1. / bii;
1003                 zdscal_(&i__3, &d__1, &x[m + 1 + i__ * x_dim1], &c__1);
1004                 if (kbt > 0) {
1005                     i__3 = *n - m;
1006                     z__1.r = -1., z__1.i = 0.;
1007                     zgerc_(&i__3, &kbt, &z__1, &x[m + 1 + i__ * x_dim1], &
1008                             c__1, &bb[kb1 - kbt + i__ * bb_dim1], &c__1, &x[m 
1009                             + 1 + (i__ - kbt) * x_dim1], ldx);
1010                 }
1011             }
1012
1013 /*           store a(i,i1) in RA1 for use in next loop over K */
1014
1015             i__3 = i__ - i1 + ka1 + i1 * ab_dim1;
1016             ra1.r = ab[i__3].r, ra1.i = ab[i__3].i;
1017         }
1018
1019 /*        Generate and apply vectors of rotations to chase all the */
1020 /*        existing bulges KA positions down toward the bottom of the */
1021 /*        band */
1022
1023         i__3 = *kb - 1;
1024         for (k = 1; k <= i__3; ++k) {
1025             if (update) {
1026
1027 /*              Determine the rotations which would annihilate the bulge */
1028 /*              which has in theory just been created */
1029
1030                 if (i__ - k + *ka < *n && i__ - k > 1) {
1031
1032 /*                 generate rotation to annihilate a(i,i-k+ka+1) */
1033
1034                     zlartg_(&ab[k + 1 + (i__ - k + *ka) * ab_dim1], &ra1, &
1035                             rwork[i__ - k + *ka - m], &work[i__ - k + *ka - m]
1036                             , &ra);
1037
1038 /*                 create nonzero element a(i-k,i-k+ka+1) outside the */
1039 /*                 band and store it in WORK(i-k) */
1040
1041                     i__2 = kb1 - k + i__ * bb_dim1;
1042                     z__2.r = -bb[i__2].r, z__2.i = -bb[i__2].i;
1043                     z__1.r = z__2.r * ra1.r - z__2.i * ra1.i, z__1.i = z__2.r 
1044                             * ra1.i + z__2.i * ra1.r;
1045                     t.r = z__1.r, t.i = z__1.i;
1046                     i__2 = i__ - k;
1047                     i__4 = i__ - k + *ka - m;
1048                     z__2.r = rwork[i__4] * t.r, z__2.i = rwork[i__4] * t.i;
1049                     d_cnjg(&z__4, &work[i__ - k + *ka - m]);
1050                     i__1 = (i__ - k + *ka) * ab_dim1 + 1;
1051                     z__3.r = z__4.r * ab[i__1].r - z__4.i * ab[i__1].i, 
1052                             z__3.i = z__4.r * ab[i__1].i + z__4.i * ab[i__1]
1053                             .r;
1054                     z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i;
1055                     work[i__2].r = z__1.r, work[i__2].i = z__1.i;
1056                     i__2 = (i__ - k + *ka) * ab_dim1 + 1;
1057                     i__4 = i__ - k + *ka - m;
1058                     z__2.r = work[i__4].r * t.r - work[i__4].i * t.i, z__2.i =
1059                              work[i__4].r * t.i + work[i__4].i * t.r;
1060                     i__1 = i__ - k + *ka - m;
1061                     i__5 = (i__ - k + *ka) * ab_dim1 + 1;
1062                     z__3.r = rwork[i__1] * ab[i__5].r, z__3.i = rwork[i__1] * 
1063                             ab[i__5].i;
1064                     z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i;
1065                     ab[i__2].r = z__1.r, ab[i__2].i = z__1.i;
1066                     ra1.r = ra.r, ra1.i = ra.i;
1067                 }
1068             }
1069 /* Computing MAX */
1070             i__2 = 1, i__4 = k - i0 + 2;
1071             j2 = i__ - k - 1 + f2cmax(i__2,i__4) * ka1;
1072             nr = (*n - j2 + *ka) / ka1;
1073             j1 = j2 + (nr - 1) * ka1;
1074             if (update) {
1075 /* Computing MAX */
1076                 i__2 = j2, i__4 = i__ + (*ka << 1) - k + 1;
1077                 j2t = f2cmax(i__2,i__4);
1078             } else {
1079                 j2t = j2;
1080             }
1081             nrt = (*n - j2t + *ka) / ka1;
1082             i__2 = j1;
1083             i__4 = ka1;
1084             for (j = j2t; i__4 < 0 ? j >= i__2 : j <= i__2; j += i__4) {
1085
1086 /*              create nonzero element a(j-ka,j+1) outside the band */
1087 /*              and store it in WORK(j-m) */
1088
1089                 i__1 = j - m;
1090                 i__5 = j - m;
1091                 i__6 = (j + 1) * ab_dim1 + 1;
1092                 z__1.r = work[i__5].r * ab[i__6].r - work[i__5].i * ab[i__6]
1093                         .i, z__1.i = work[i__5].r * ab[i__6].i + work[i__5].i 
1094                         * ab[i__6].r;
1095                 work[i__1].r = z__1.r, work[i__1].i = z__1.i;
1096                 i__1 = (j + 1) * ab_dim1 + 1;
1097                 i__5 = j - m;
1098                 i__6 = (j + 1) * ab_dim1 + 1;
1099                 z__1.r = rwork[i__5] * ab[i__6].r, z__1.i = rwork[i__5] * ab[
1100                         i__6].i;
1101                 ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
1102 /* L90: */
1103             }
1104
1105 /*           generate rotations in 1st set to annihilate elements which */
1106 /*           have been created outside the band */
1107
1108             if (nrt > 0) {
1109                 zlargv_(&nrt, &ab[j2t * ab_dim1 + 1], &inca, &work[j2t - m], &
1110                         ka1, &rwork[j2t - m], &ka1);
1111             }
1112             if (nr > 0) {
1113
1114 /*              apply rotations in 1st set from the right */
1115
1116                 i__4 = *ka - 1;
1117                 for (l = 1; l <= i__4; ++l) {
1118                     zlartv_(&nr, &ab[ka1 - l + j2 * ab_dim1], &inca, &ab[*ka 
1119                             - l + (j2 + 1) * ab_dim1], &inca, &rwork[j2 - m], 
1120                             &work[j2 - m], &ka1);
1121 /* L100: */
1122                 }
1123
1124 /*              apply rotations in 1st set from both sides to diagonal */
1125 /*              blocks */
1126
1127                 zlar2v_(&nr, &ab[ka1 + j2 * ab_dim1], &ab[ka1 + (j2 + 1) * 
1128                         ab_dim1], &ab[*ka + (j2 + 1) * ab_dim1], &inca, &
1129                         rwork[j2 - m], &work[j2 - m], &ka1);
1130
1131                 zlacgv_(&nr, &work[j2 - m], &ka1);
1132             }
1133
1134 /*           start applying rotations in 1st set from the left */
1135
1136             i__4 = *kb - k + 1;
1137             for (l = *ka - 1; l >= i__4; --l) {
1138                 nrt = (*n - j2 + l) / ka1;
1139                 if (nrt > 0) {
1140                     zlartv_(&nrt, &ab[l + (j2 + ka1 - l) * ab_dim1], &inca, &
1141                             ab[l + 1 + (j2 + ka1 - l) * ab_dim1], &inca, &
1142                             rwork[j2 - m], &work[j2 - m], &ka1);
1143                 }
1144 /* L110: */
1145             }
1146
1147             if (wantx) {
1148
1149 /*              post-multiply X by product of rotations in 1st set */
1150
1151                 i__4 = j1;
1152                 i__2 = ka1;
1153                 for (j = j2; i__2 < 0 ? j >= i__4 : j <= i__4; j += i__2) {
1154                     i__1 = *n - m;
1155                     d_cnjg(&z__1, &work[j - m]);
1156                     zrot_(&i__1, &x[m + 1 + j * x_dim1], &c__1, &x[m + 1 + (j 
1157                             + 1) * x_dim1], &c__1, &rwork[j - m], &z__1);
1158 /* L120: */
1159                 }
1160             }
1161 /* L130: */
1162         }
1163
1164         if (update) {
1165             if (i2 <= *n && kbt > 0) {
1166
1167 /*              create nonzero element a(i-kbt,i-kbt+ka+1) outside the */
1168 /*              band and store it in WORK(i-kbt) */
1169
1170                 i__3 = i__ - kbt;
1171                 i__2 = kb1 - kbt + i__ * bb_dim1;
1172                 z__2.r = -bb[i__2].r, z__2.i = -bb[i__2].i;
1173                 z__1.r = z__2.r * ra1.r - z__2.i * ra1.i, z__1.i = z__2.r * 
1174                         ra1.i + z__2.i * ra1.r;
1175                 work[i__3].r = z__1.r, work[i__3].i = z__1.i;
1176             }
1177         }
1178
1179         for (k = *kb; k >= 1; --k) {
1180             if (update) {
1181 /* Computing MAX */
1182                 i__3 = 2, i__2 = k - i0 + 1;
1183                 j2 = i__ - k - 1 + f2cmax(i__3,i__2) * ka1;
1184             } else {
1185 /* Computing MAX */
1186                 i__3 = 1, i__2 = k - i0 + 1;
1187                 j2 = i__ - k - 1 + f2cmax(i__3,i__2) * ka1;
1188             }
1189
1190 /*           finish applying rotations in 2nd set from the left */
1191
1192             for (l = *kb - k; l >= 1; --l) {
1193                 nrt = (*n - j2 + *ka + l) / ka1;
1194                 if (nrt > 0) {
1195                     zlartv_(&nrt, &ab[l + (j2 - l + 1) * ab_dim1], &inca, &ab[
1196                             l + 1 + (j2 - l + 1) * ab_dim1], &inca, &rwork[j2 
1197                             - *ka], &work[j2 - *ka], &ka1);
1198                 }
1199 /* L140: */
1200             }
1201             nr = (*n - j2 + *ka) / ka1;
1202             j1 = j2 + (nr - 1) * ka1;
1203             i__3 = j2;
1204             i__2 = -ka1;
1205             for (j = j1; i__2 < 0 ? j >= i__3 : j <= i__3; j += i__2) {
1206                 i__4 = j;
1207                 i__1 = j - *ka;
1208                 work[i__4].r = work[i__1].r, work[i__4].i = work[i__1].i;
1209                 rwork[j] = rwork[j - *ka];
1210 /* L150: */
1211             }
1212             i__2 = j1;
1213             i__3 = ka1;
1214             for (j = j2; i__3 < 0 ? j >= i__2 : j <= i__2; j += i__3) {
1215
1216 /*              create nonzero element a(j-ka,j+1) outside the band */
1217 /*              and store it in WORK(j) */
1218
1219                 i__4 = j;
1220                 i__1 = j;
1221                 i__5 = (j + 1) * ab_dim1 + 1;
1222                 z__1.r = work[i__1].r * ab[i__5].r - work[i__1].i * ab[i__5]
1223                         .i, z__1.i = work[i__1].r * ab[i__5].i + work[i__1].i 
1224                         * ab[i__5].r;
1225                 work[i__4].r = z__1.r, work[i__4].i = z__1.i;
1226                 i__4 = (j + 1) * ab_dim1 + 1;
1227                 i__1 = j;
1228                 i__5 = (j + 1) * ab_dim1 + 1;
1229                 z__1.r = rwork[i__1] * ab[i__5].r, z__1.i = rwork[i__1] * ab[
1230                         i__5].i;
1231                 ab[i__4].r = z__1.r, ab[i__4].i = z__1.i;
1232 /* L160: */
1233             }
1234             if (update) {
1235                 if (i__ - k < *n - *ka && k <= kbt) {
1236                     i__3 = i__ - k + *ka;
1237                     i__2 = i__ - k;
1238                     work[i__3].r = work[i__2].r, work[i__3].i = work[i__2].i;
1239                 }
1240             }
1241 /* L170: */
1242         }
1243
1244         for (k = *kb; k >= 1; --k) {
1245 /* Computing MAX */
1246             i__3 = 1, i__2 = k - i0 + 1;
1247             j2 = i__ - k - 1 + f2cmax(i__3,i__2) * ka1;
1248             nr = (*n - j2 + *ka) / ka1;
1249             j1 = j2 + (nr - 1) * ka1;
1250             if (nr > 0) {
1251
1252 /*              generate rotations in 2nd set to annihilate elements */
1253 /*              which have been created outside the band */
1254
1255                 zlargv_(&nr, &ab[j2 * ab_dim1 + 1], &inca, &work[j2], &ka1, &
1256                         rwork[j2], &ka1);
1257
1258 /*              apply rotations in 2nd set from the right */
1259
1260                 i__3 = *ka - 1;
1261                 for (l = 1; l <= i__3; ++l) {
1262                     zlartv_(&nr, &ab[ka1 - l + j2 * ab_dim1], &inca, &ab[*ka 
1263                             - l + (j2 + 1) * ab_dim1], &inca, &rwork[j2], &
1264                             work[j2], &ka1);
1265 /* L180: */
1266                 }
1267
1268 /*              apply rotations in 2nd set from both sides to diagonal */
1269 /*              blocks */
1270
1271                 zlar2v_(&nr, &ab[ka1 + j2 * ab_dim1], &ab[ka1 + (j2 + 1) * 
1272                         ab_dim1], &ab[*ka + (j2 + 1) * ab_dim1], &inca, &
1273                         rwork[j2], &work[j2], &ka1);
1274
1275                 zlacgv_(&nr, &work[j2], &ka1);
1276             }
1277
1278 /*           start applying rotations in 2nd set from the left */
1279
1280             i__3 = *kb - k + 1;
1281             for (l = *ka - 1; l >= i__3; --l) {
1282                 nrt = (*n - j2 + l) / ka1;
1283                 if (nrt > 0) {
1284                     zlartv_(&nrt, &ab[l + (j2 + ka1 - l) * ab_dim1], &inca, &
1285                             ab[l + 1 + (j2 + ka1 - l) * ab_dim1], &inca, &
1286                             rwork[j2], &work[j2], &ka1);
1287                 }
1288 /* L190: */
1289             }
1290
1291             if (wantx) {
1292
1293 /*              post-multiply X by product of rotations in 2nd set */
1294
1295                 i__3 = j1;
1296                 i__2 = ka1;
1297                 for (j = j2; i__2 < 0 ? j >= i__3 : j <= i__3; j += i__2) {
1298                     i__4 = *n - m;
1299                     d_cnjg(&z__1, &work[j]);
1300                     zrot_(&i__4, &x[m + 1 + j * x_dim1], &c__1, &x[m + 1 + (j 
1301                             + 1) * x_dim1], &c__1, &rwork[j], &z__1);
1302 /* L200: */
1303                 }
1304             }
1305 /* L210: */
1306         }
1307
1308         i__2 = *kb - 1;
1309         for (k = 1; k <= i__2; ++k) {
1310 /* Computing MAX */
1311             i__3 = 1, i__4 = k - i0 + 2;
1312             j2 = i__ - k - 1 + f2cmax(i__3,i__4) * ka1;
1313
1314 /*           finish applying rotations in 1st set from the left */
1315
1316             for (l = *kb - k; l >= 1; --l) {
1317                 nrt = (*n - j2 + l) / ka1;
1318                 if (nrt > 0) {
1319                     zlartv_(&nrt, &ab[l + (j2 + ka1 - l) * ab_dim1], &inca, &
1320                             ab[l + 1 + (j2 + ka1 - l) * ab_dim1], &inca, &
1321                             rwork[j2 - m], &work[j2 - m], &ka1);
1322                 }
1323 /* L220: */
1324             }
1325 /* L230: */
1326         }
1327
1328         if (*kb > 1) {
1329             i__2 = j2 + *ka;
1330             for (j = *n - 1; j >= i__2; --j) {
1331                 rwork[j - m] = rwork[j - *ka - m];
1332                 i__3 = j - m;
1333                 i__4 = j - *ka - m;
1334                 work[i__3].r = work[i__4].r, work[i__3].i = work[i__4].i;
1335 /* L240: */
1336             }
1337         }
1338
1339     } else {
1340
1341 /*        Transform A, working with the lower triangle */
1342
1343         if (update) {
1344
1345 /*           Form  inv(S(i))**H * A * inv(S(i)) */
1346
1347             i__2 = i__ * bb_dim1 + 1;
1348             bii = bb[i__2].r;
1349             i__2 = i__ * ab_dim1 + 1;
1350             i__3 = i__ * ab_dim1 + 1;
1351             d__1 = ab[i__3].r / bii / bii;
1352             ab[i__2].r = d__1, ab[i__2].i = 0.;
1353             i__2 = i1;
1354             for (j = i__ + 1; j <= i__2; ++j) {
1355                 i__3 = j - i__ + 1 + i__ * ab_dim1;
1356                 i__4 = j - i__ + 1 + i__ * ab_dim1;
1357                 z__1.r = ab[i__4].r / bii, z__1.i = ab[i__4].i / bii;
1358                 ab[i__3].r = z__1.r, ab[i__3].i = z__1.i;
1359 /* L250: */
1360             }
1361 /* Computing MAX */
1362             i__2 = 1, i__3 = i__ - *ka;
1363             i__4 = i__ - 1;
1364             for (j = f2cmax(i__2,i__3); j <= i__4; ++j) {
1365                 i__2 = i__ - j + 1 + j * ab_dim1;
1366                 i__3 = i__ - j + 1 + j * ab_dim1;
1367                 z__1.r = ab[i__3].r / bii, z__1.i = ab[i__3].i / bii;
1368                 ab[i__2].r = z__1.r, ab[i__2].i = z__1.i;
1369 /* L260: */
1370             }
1371             i__4 = i__ - 1;
1372             for (k = i__ - kbt; k <= i__4; ++k) {
1373                 i__2 = k;
1374                 for (j = i__ - kbt; j <= i__2; ++j) {
1375                     i__3 = k - j + 1 + j * ab_dim1;
1376                     i__1 = k - j + 1 + j * ab_dim1;
1377                     i__5 = i__ - j + 1 + j * bb_dim1;
1378                     d_cnjg(&z__5, &ab[i__ - k + 1 + k * ab_dim1]);
1379                     z__4.r = bb[i__5].r * z__5.r - bb[i__5].i * z__5.i, 
1380                             z__4.i = bb[i__5].r * z__5.i + bb[i__5].i * 
1381                             z__5.r;
1382                     z__3.r = ab[i__1].r - z__4.r, z__3.i = ab[i__1].i - 
1383                             z__4.i;
1384                     d_cnjg(&z__7, &bb[i__ - k + 1 + k * bb_dim1]);
1385                     i__6 = i__ - j + 1 + j * ab_dim1;
1386                     z__6.r = z__7.r * ab[i__6].r - z__7.i * ab[i__6].i, 
1387                             z__6.i = z__7.r * ab[i__6].i + z__7.i * ab[i__6]
1388                             .r;
1389                     z__2.r = z__3.r - z__6.r, z__2.i = z__3.i - z__6.i;
1390                     i__7 = i__ * ab_dim1 + 1;
1391                     d__1 = ab[i__7].r;
1392                     i__8 = i__ - j + 1 + j * bb_dim1;
1393                     z__9.r = d__1 * bb[i__8].r, z__9.i = d__1 * bb[i__8].i;
1394                     d_cnjg(&z__10, &bb[i__ - k + 1 + k * bb_dim1]);
1395                     z__8.r = z__9.r * z__10.r - z__9.i * z__10.i, z__8.i = 
1396                             z__9.r * z__10.i + z__9.i * z__10.r;
1397                     z__1.r = z__2.r + z__8.r, z__1.i = z__2.i + z__8.i;
1398                     ab[i__3].r = z__1.r, ab[i__3].i = z__1.i;
1399 /* L270: */
1400                 }
1401 /* Computing MAX */
1402                 i__2 = 1, i__3 = i__ - *ka;
1403                 i__1 = i__ - kbt - 1;
1404                 for (j = f2cmax(i__2,i__3); j <= i__1; ++j) {
1405                     i__2 = k - j + 1 + j * ab_dim1;
1406                     i__3 = k - j + 1 + j * ab_dim1;
1407                     d_cnjg(&z__3, &bb[i__ - k + 1 + k * bb_dim1]);
1408                     i__5 = i__ - j + 1 + j * ab_dim1;
1409                     z__2.r = z__3.r * ab[i__5].r - z__3.i * ab[i__5].i, 
1410                             z__2.i = z__3.r * ab[i__5].i + z__3.i * ab[i__5]
1411                             .r;
1412                     z__1.r = ab[i__3].r - z__2.r, z__1.i = ab[i__3].i - 
1413                             z__2.i;
1414                     ab[i__2].r = z__1.r, ab[i__2].i = z__1.i;
1415 /* L280: */
1416                 }
1417 /* L290: */
1418             }
1419             i__4 = i1;
1420             for (j = i__; j <= i__4; ++j) {
1421 /* Computing MAX */
1422                 i__1 = j - *ka, i__2 = i__ - kbt;
1423                 i__3 = i__ - 1;
1424                 for (k = f2cmax(i__1,i__2); k <= i__3; ++k) {
1425                     i__1 = j - k + 1 + k * ab_dim1;
1426                     i__2 = j - k + 1 + k * ab_dim1;
1427                     i__5 = i__ - k + 1 + k * bb_dim1;
1428                     i__6 = j - i__ + 1 + i__ * ab_dim1;
1429                     z__2.r = bb[i__5].r * ab[i__6].r - bb[i__5].i * ab[i__6]
1430                             .i, z__2.i = bb[i__5].r * ab[i__6].i + bb[i__5].i 
1431                             * ab[i__6].r;
1432                     z__1.r = ab[i__2].r - z__2.r, z__1.i = ab[i__2].i - 
1433                             z__2.i;
1434                     ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
1435 /* L300: */
1436                 }
1437 /* L310: */
1438             }
1439
1440             if (wantx) {
1441
1442 /*              post-multiply X by inv(S(i)) */
1443
1444                 i__4 = *n - m;
1445                 d__1 = 1. / bii;
1446                 zdscal_(&i__4, &d__1, &x[m + 1 + i__ * x_dim1], &c__1);
1447                 if (kbt > 0) {
1448                     i__4 = *n - m;
1449                     z__1.r = -1., z__1.i = 0.;
1450                     i__3 = *ldbb - 1;
1451                     zgeru_(&i__4, &kbt, &z__1, &x[m + 1 + i__ * x_dim1], &
1452                             c__1, &bb[kbt + 1 + (i__ - kbt) * bb_dim1], &i__3,
1453                              &x[m + 1 + (i__ - kbt) * x_dim1], ldx);
1454                 }
1455             }
1456
1457 /*           store a(i1,i) in RA1 for use in next loop over K */
1458
1459             i__4 = i1 - i__ + 1 + i__ * ab_dim1;
1460             ra1.r = ab[i__4].r, ra1.i = ab[i__4].i;
1461         }
1462
1463 /*        Generate and apply vectors of rotations to chase all the */
1464 /*        existing bulges KA positions down toward the bottom of the */
1465 /*        band */
1466
1467         i__4 = *kb - 1;
1468         for (k = 1; k <= i__4; ++k) {
1469             if (update) {
1470
1471 /*              Determine the rotations which would annihilate the bulge */
1472 /*              which has in theory just been created */
1473
1474                 if (i__ - k + *ka < *n && i__ - k > 1) {
1475
1476 /*                 generate rotation to annihilate a(i-k+ka+1,i) */
1477
1478                     zlartg_(&ab[ka1 - k + i__ * ab_dim1], &ra1, &rwork[i__ - 
1479                             k + *ka - m], &work[i__ - k + *ka - m], &ra);
1480
1481 /*                 create nonzero element a(i-k+ka+1,i-k) outside the */
1482 /*                 band and store it in WORK(i-k) */
1483
1484                     i__3 = k + 1 + (i__ - k) * bb_dim1;
1485                     z__2.r = -bb[i__3].r, z__2.i = -bb[i__3].i;
1486                     z__1.r = z__2.r * ra1.r - z__2.i * ra1.i, z__1.i = z__2.r 
1487                             * ra1.i + z__2.i * ra1.r;
1488                     t.r = z__1.r, t.i = z__1.i;
1489                     i__3 = i__ - k;
1490                     i__1 = i__ - k + *ka - m;
1491                     z__2.r = rwork[i__1] * t.r, z__2.i = rwork[i__1] * t.i;
1492                     d_cnjg(&z__4, &work[i__ - k + *ka - m]);
1493                     i__2 = ka1 + (i__ - k) * ab_dim1;
1494                     z__3.r = z__4.r * ab[i__2].r - z__4.i * ab[i__2].i, 
1495                             z__3.i = z__4.r * ab[i__2].i + z__4.i * ab[i__2]
1496                             .r;
1497                     z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i;
1498                     work[i__3].r = z__1.r, work[i__3].i = z__1.i;
1499                     i__3 = ka1 + (i__ - k) * ab_dim1;
1500                     i__1 = i__ - k + *ka - m;
1501                     z__2.r = work[i__1].r * t.r - work[i__1].i * t.i, z__2.i =
1502                              work[i__1].r * t.i + work[i__1].i * t.r;
1503                     i__2 = i__ - k + *ka - m;
1504                     i__5 = ka1 + (i__ - k) * ab_dim1;
1505                     z__3.r = rwork[i__2] * ab[i__5].r, z__3.i = rwork[i__2] * 
1506                             ab[i__5].i;
1507                     z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i;
1508                     ab[i__3].r = z__1.r, ab[i__3].i = z__1.i;
1509                     ra1.r = ra.r, ra1.i = ra.i;
1510                 }
1511             }
1512 /* Computing MAX */
1513             i__3 = 1, i__1 = k - i0 + 2;
1514             j2 = i__ - k - 1 + f2cmax(i__3,i__1) * ka1;
1515             nr = (*n - j2 + *ka) / ka1;
1516             j1 = j2 + (nr - 1) * ka1;
1517             if (update) {
1518 /* Computing MAX */
1519                 i__3 = j2, i__1 = i__ + (*ka << 1) - k + 1;
1520                 j2t = f2cmax(i__3,i__1);
1521             } else {
1522                 j2t = j2;
1523             }
1524             nrt = (*n - j2t + *ka) / ka1;
1525             i__3 = j1;
1526             i__1 = ka1;
1527             for (j = j2t; i__1 < 0 ? j >= i__3 : j <= i__3; j += i__1) {
1528
1529 /*              create nonzero element a(j+1,j-ka) outside the band */
1530 /*              and store it in WORK(j-m) */
1531
1532                 i__2 = j - m;
1533                 i__5 = j - m;
1534                 i__6 = ka1 + (j - *ka + 1) * ab_dim1;
1535                 z__1.r = work[i__5].r * ab[i__6].r - work[i__5].i * ab[i__6]
1536                         .i, z__1.i = work[i__5].r * ab[i__6].i + work[i__5].i 
1537                         * ab[i__6].r;
1538                 work[i__2].r = z__1.r, work[i__2].i = z__1.i;
1539                 i__2 = ka1 + (j - *ka + 1) * ab_dim1;
1540                 i__5 = j - m;
1541                 i__6 = ka1 + (j - *ka + 1) * ab_dim1;
1542                 z__1.r = rwork[i__5] * ab[i__6].r, z__1.i = rwork[i__5] * ab[
1543                         i__6].i;
1544                 ab[i__2].r = z__1.r, ab[i__2].i = z__1.i;
1545 /* L320: */
1546             }
1547
1548 /*           generate rotations in 1st set to annihilate elements which */
1549 /*           have been created outside the band */
1550
1551             if (nrt > 0) {
1552                 zlargv_(&nrt, &ab[ka1 + (j2t - *ka) * ab_dim1], &inca, &work[
1553                         j2t - m], &ka1, &rwork[j2t - m], &ka1);
1554             }
1555             if (nr > 0) {
1556
1557 /*              apply rotations in 1st set from the left */
1558
1559                 i__1 = *ka - 1;
1560                 for (l = 1; l <= i__1; ++l) {
1561                     zlartv_(&nr, &ab[l + 1 + (j2 - l) * ab_dim1], &inca, &ab[
1562                             l + 2 + (j2 - l) * ab_dim1], &inca, &rwork[j2 - m]
1563                             , &work[j2 - m], &ka1);
1564 /* L330: */
1565                 }
1566
1567 /*              apply rotations in 1st set from both sides to diagonal */
1568 /*              blocks */
1569
1570                 zlar2v_(&nr, &ab[j2 * ab_dim1 + 1], &ab[(j2 + 1) * ab_dim1 + 
1571                         1], &ab[j2 * ab_dim1 + 2], &inca, &rwork[j2 - m], &
1572                         work[j2 - m], &ka1);
1573
1574                 zlacgv_(&nr, &work[j2 - m], &ka1);
1575             }
1576
1577 /*           start applying rotations in 1st set from the right */
1578
1579             i__1 = *kb - k + 1;
1580             for (l = *ka - 1; l >= i__1; --l) {
1581                 nrt = (*n - j2 + l) / ka1;
1582                 if (nrt > 0) {
1583                     zlartv_(&nrt, &ab[ka1 - l + 1 + j2 * ab_dim1], &inca, &ab[
1584                             ka1 - l + (j2 + 1) * ab_dim1], &inca, &rwork[j2 - 
1585                             m], &work[j2 - m], &ka1);
1586                 }
1587 /* L340: */
1588             }
1589
1590             if (wantx) {
1591
1592 /*              post-multiply X by product of rotations in 1st set */
1593
1594                 i__1 = j1;
1595                 i__3 = ka1;
1596                 for (j = j2; i__3 < 0 ? j >= i__1 : j <= i__1; j += i__3) {
1597                     i__2 = *n - m;
1598                     zrot_(&i__2, &x[m + 1 + j * x_dim1], &c__1, &x[m + 1 + (j 
1599                             + 1) * x_dim1], &c__1, &rwork[j - m], &work[j - m]
1600                             );
1601 /* L350: */
1602                 }
1603             }
1604 /* L360: */
1605         }
1606
1607         if (update) {
1608             if (i2 <= *n && kbt > 0) {
1609
1610 /*              create nonzero element a(i-kbt+ka+1,i-kbt) outside the */
1611 /*              band and store it in WORK(i-kbt) */
1612
1613                 i__4 = i__ - kbt;
1614                 i__3 = kbt + 1 + (i__ - kbt) * bb_dim1;
1615                 z__2.r = -bb[i__3].r, z__2.i = -bb[i__3].i;
1616                 z__1.r = z__2.r * ra1.r - z__2.i * ra1.i, z__1.i = z__2.r * 
1617                         ra1.i + z__2.i * ra1.r;
1618                 work[i__4].r = z__1.r, work[i__4].i = z__1.i;
1619             }
1620         }
1621
1622         for (k = *kb; k >= 1; --k) {
1623             if (update) {
1624 /* Computing MAX */
1625                 i__4 = 2, i__3 = k - i0 + 1;
1626                 j2 = i__ - k - 1 + f2cmax(i__4,i__3) * ka1;
1627             } else {
1628 /* Computing MAX */
1629                 i__4 = 1, i__3 = k - i0 + 1;
1630                 j2 = i__ - k - 1 + f2cmax(i__4,i__3) * ka1;
1631             }
1632
1633 /*           finish applying rotations in 2nd set from the right */
1634
1635             for (l = *kb - k; l >= 1; --l) {
1636                 nrt = (*n - j2 + *ka + l) / ka1;
1637                 if (nrt > 0) {
1638                     zlartv_(&nrt, &ab[ka1 - l + 1 + (j2 - *ka) * ab_dim1], &
1639                             inca, &ab[ka1 - l + (j2 - *ka + 1) * ab_dim1], &
1640                             inca, &rwork[j2 - *ka], &work[j2 - *ka], &ka1);
1641                 }
1642 /* L370: */
1643             }
1644             nr = (*n - j2 + *ka) / ka1;
1645             j1 = j2 + (nr - 1) * ka1;
1646             i__4 = j2;
1647             i__3 = -ka1;
1648             for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) {
1649                 i__1 = j;
1650                 i__2 = j - *ka;
1651                 work[i__1].r = work[i__2].r, work[i__1].i = work[i__2].i;
1652                 rwork[j] = rwork[j - *ka];
1653 /* L380: */
1654             }
1655             i__3 = j1;
1656             i__4 = ka1;
1657             for (j = j2; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) {
1658
1659 /*              create nonzero element a(j+1,j-ka) outside the band */
1660 /*              and store it in WORK(j) */
1661
1662                 i__1 = j;
1663                 i__2 = j;
1664                 i__5 = ka1 + (j - *ka + 1) * ab_dim1;
1665                 z__1.r = work[i__2].r * ab[i__5].r - work[i__2].i * ab[i__5]
1666                         .i, z__1.i = work[i__2].r * ab[i__5].i + work[i__2].i 
1667                         * ab[i__5].r;
1668                 work[i__1].r = z__1.r, work[i__1].i = z__1.i;
1669                 i__1 = ka1 + (j - *ka + 1) * ab_dim1;
1670                 i__2 = j;
1671                 i__5 = ka1 + (j - *ka + 1) * ab_dim1;
1672                 z__1.r = rwork[i__2] * ab[i__5].r, z__1.i = rwork[i__2] * ab[
1673                         i__5].i;
1674                 ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
1675 /* L390: */
1676             }
1677             if (update) {
1678                 if (i__ - k < *n - *ka && k <= kbt) {
1679                     i__4 = i__ - k + *ka;
1680                     i__3 = i__ - k;
1681                     work[i__4].r = work[i__3].r, work[i__4].i = work[i__3].i;
1682                 }
1683             }
1684 /* L400: */
1685         }
1686
1687         for (k = *kb; k >= 1; --k) {
1688 /* Computing MAX */
1689             i__4 = 1, i__3 = k - i0 + 1;
1690             j2 = i__ - k - 1 + f2cmax(i__4,i__3) * ka1;
1691             nr = (*n - j2 + *ka) / ka1;
1692             j1 = j2 + (nr - 1) * ka1;
1693             if (nr > 0) {
1694
1695 /*              generate rotations in 2nd set to annihilate elements */
1696 /*              which have been created outside the band */
1697
1698                 zlargv_(&nr, &ab[ka1 + (j2 - *ka) * ab_dim1], &inca, &work[j2]
1699                         , &ka1, &rwork[j2], &ka1);
1700
1701 /*              apply rotations in 2nd set from the left */
1702
1703                 i__4 = *ka - 1;
1704                 for (l = 1; l <= i__4; ++l) {
1705                     zlartv_(&nr, &ab[l + 1 + (j2 - l) * ab_dim1], &inca, &ab[
1706                             l + 2 + (j2 - l) * ab_dim1], &inca, &rwork[j2], &
1707                             work[j2], &ka1);
1708 /* L410: */
1709                 }
1710
1711 /*              apply rotations in 2nd set from both sides to diagonal */
1712 /*              blocks */
1713
1714                 zlar2v_(&nr, &ab[j2 * ab_dim1 + 1], &ab[(j2 + 1) * ab_dim1 + 
1715                         1], &ab[j2 * ab_dim1 + 2], &inca, &rwork[j2], &work[
1716                         j2], &ka1);
1717
1718                 zlacgv_(&nr, &work[j2], &ka1);
1719             }
1720
1721 /*           start applying rotations in 2nd set from the right */
1722
1723             i__4 = *kb - k + 1;
1724             for (l = *ka - 1; l >= i__4; --l) {
1725                 nrt = (*n - j2 + l) / ka1;
1726                 if (nrt > 0) {
1727                     zlartv_(&nrt, &ab[ka1 - l + 1 + j2 * ab_dim1], &inca, &ab[
1728                             ka1 - l + (j2 + 1) * ab_dim1], &inca, &rwork[j2], 
1729                             &work[j2], &ka1);
1730                 }
1731 /* L420: */
1732             }
1733
1734             if (wantx) {
1735
1736 /*              post-multiply X by product of rotations in 2nd set */
1737
1738                 i__4 = j1;
1739                 i__3 = ka1;
1740                 for (j = j2; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) {
1741                     i__1 = *n - m;
1742                     zrot_(&i__1, &x[m + 1 + j * x_dim1], &c__1, &x[m + 1 + (j 
1743                             + 1) * x_dim1], &c__1, &rwork[j], &work[j]);
1744 /* L430: */
1745                 }
1746             }
1747 /* L440: */
1748         }
1749
1750         i__3 = *kb - 1;
1751         for (k = 1; k <= i__3; ++k) {
1752 /* Computing MAX */
1753             i__4 = 1, i__1 = k - i0 + 2;
1754             j2 = i__ - k - 1 + f2cmax(i__4,i__1) * ka1;
1755
1756 /*           finish applying rotations in 1st set from the right */
1757
1758             for (l = *kb - k; l >= 1; --l) {
1759                 nrt = (*n - j2 + l) / ka1;
1760                 if (nrt > 0) {
1761                     zlartv_(&nrt, &ab[ka1 - l + 1 + j2 * ab_dim1], &inca, &ab[
1762                             ka1 - l + (j2 + 1) * ab_dim1], &inca, &rwork[j2 - 
1763                             m], &work[j2 - m], &ka1);
1764                 }
1765 /* L450: */
1766             }
1767 /* L460: */
1768         }
1769
1770         if (*kb > 1) {
1771             i__3 = j2 + *ka;
1772             for (j = *n - 1; j >= i__3; --j) {
1773                 rwork[j - m] = rwork[j - *ka - m];
1774                 i__4 = j - m;
1775                 i__1 = j - *ka - m;
1776                 work[i__4].r = work[i__1].r, work[i__4].i = work[i__1].i;
1777 /* L470: */
1778             }
1779         }
1780
1781     }
1782
1783     goto L10;
1784
1785 L480:
1786
1787 /*     **************************** Phase 2 ***************************** */
1788
1789 /*     The logical structure of this phase is: */
1790
1791 /*     UPDATE = .TRUE. */
1792 /*     DO I = 1, M */
1793 /*        use S(i) to update A and create a new bulge */
1794 /*        apply rotations to push all bulges KA positions upward */
1795 /*     END DO */
1796 /*     UPDATE = .FALSE. */
1797 /*     DO I = M - KA - 1, 2, -1 */
1798 /*        apply rotations to push all bulges KA positions upward */
1799 /*     END DO */
1800
1801 /*     To avoid duplicating code, the two loops are merged. */
1802
1803     update = TRUE_;
1804     i__ = 0;
1805 L490:
1806     if (update) {
1807         ++i__;
1808 /* Computing MIN */
1809         i__3 = *kb, i__4 = m - i__;
1810         kbt = f2cmin(i__3,i__4);
1811         i0 = i__ + 1;
1812 /* Computing MAX */
1813         i__3 = 1, i__4 = i__ - *ka;
1814         i1 = f2cmax(i__3,i__4);
1815         i2 = i__ + kbt - ka1;
1816         if (i__ > m) {
1817             update = FALSE_;
1818             --i__;
1819             i0 = m + 1;
1820             if (*ka == 0) {
1821                 return 0;
1822             }
1823             goto L490;
1824         }
1825     } else {
1826         i__ -= *ka;
1827         if (i__ < 2) {
1828             return 0;
1829         }
1830     }
1831
1832     if (i__ < m - kbt) {
1833         nx = m;
1834     } else {
1835         nx = *n;
1836     }
1837
1838     if (upper) {
1839
1840 /*        Transform A, working with the upper triangle */
1841
1842         if (update) {
1843
1844 /*           Form  inv(S(i))**H * A * inv(S(i)) */
1845
1846             i__3 = kb1 + i__ * bb_dim1;
1847             bii = bb[i__3].r;
1848             i__3 = ka1 + i__ * ab_dim1;
1849             i__4 = ka1 + i__ * ab_dim1;
1850             d__1 = ab[i__4].r / bii / bii;
1851             ab[i__3].r = d__1, ab[i__3].i = 0.;
1852             i__3 = i__ - 1;
1853             for (j = i1; j <= i__3; ++j) {
1854                 i__4 = j - i__ + ka1 + i__ * ab_dim1;
1855                 i__1 = j - i__ + ka1 + i__ * ab_dim1;
1856                 z__1.r = ab[i__1].r / bii, z__1.i = ab[i__1].i / bii;
1857                 ab[i__4].r = z__1.r, ab[i__4].i = z__1.i;
1858 /* L500: */
1859             }
1860 /* Computing MIN */
1861             i__4 = *n, i__1 = i__ + *ka;
1862             i__3 = f2cmin(i__4,i__1);
1863             for (j = i__ + 1; j <= i__3; ++j) {
1864                 i__4 = i__ - j + ka1 + j * ab_dim1;
1865                 i__1 = i__ - j + ka1 + j * ab_dim1;
1866                 z__1.r = ab[i__1].r / bii, z__1.i = ab[i__1].i / bii;
1867                 ab[i__4].r = z__1.r, ab[i__4].i = z__1.i;
1868 /* L510: */
1869             }
1870             i__3 = i__ + kbt;
1871             for (k = i__ + 1; k <= i__3; ++k) {
1872                 i__4 = i__ + kbt;
1873                 for (j = k; j <= i__4; ++j) {
1874                     i__1 = k - j + ka1 + j * ab_dim1;
1875                     i__2 = k - j + ka1 + j * ab_dim1;
1876                     i__5 = i__ - j + kb1 + j * bb_dim1;
1877                     d_cnjg(&z__5, &ab[i__ - k + ka1 + k * ab_dim1]);
1878                     z__4.r = bb[i__5].r * z__5.r - bb[i__5].i * z__5.i, 
1879                             z__4.i = bb[i__5].r * z__5.i + bb[i__5].i * 
1880                             z__5.r;
1881                     z__3.r = ab[i__2].r - z__4.r, z__3.i = ab[i__2].i - 
1882                             z__4.i;
1883                     d_cnjg(&z__7, &bb[i__ - k + kb1 + k * bb_dim1]);
1884                     i__6 = i__ - j + ka1 + j * ab_dim1;
1885                     z__6.r = z__7.r * ab[i__6].r - z__7.i * ab[i__6].i, 
1886                             z__6.i = z__7.r * ab[i__6].i + z__7.i * ab[i__6]
1887                             .r;
1888                     z__2.r = z__3.r - z__6.r, z__2.i = z__3.i - z__6.i;
1889                     i__7 = ka1 + i__ * ab_dim1;
1890                     d__1 = ab[i__7].r;
1891                     i__8 = i__ - j + kb1 + j * bb_dim1;
1892                     z__9.r = d__1 * bb[i__8].r, z__9.i = d__1 * bb[i__8].i;
1893                     d_cnjg(&z__10, &bb[i__ - k + kb1 + k * bb_dim1]);
1894                     z__8.r = z__9.r * z__10.r - z__9.i * z__10.i, z__8.i = 
1895                             z__9.r * z__10.i + z__9.i * z__10.r;
1896                     z__1.r = z__2.r + z__8.r, z__1.i = z__2.i + z__8.i;
1897                     ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
1898 /* L520: */
1899                 }
1900 /* Computing MIN */
1901                 i__1 = *n, i__2 = i__ + *ka;
1902                 i__4 = f2cmin(i__1,i__2);
1903                 for (j = i__ + kbt + 1; j <= i__4; ++j) {
1904                     i__1 = k - j + ka1 + j * ab_dim1;
1905                     i__2 = k - j + ka1 + j * ab_dim1;
1906                     d_cnjg(&z__3, &bb[i__ - k + kb1 + k * bb_dim1]);
1907                     i__5 = i__ - j + ka1 + j * ab_dim1;
1908                     z__2.r = z__3.r * ab[i__5].r - z__3.i * ab[i__5].i, 
1909                             z__2.i = z__3.r * ab[i__5].i + z__3.i * ab[i__5]
1910                             .r;
1911                     z__1.r = ab[i__2].r - z__2.r, z__1.i = ab[i__2].i - 
1912                             z__2.i;
1913                     ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
1914 /* L530: */
1915                 }
1916 /* L540: */
1917             }
1918             i__3 = i__;
1919             for (j = i1; j <= i__3; ++j) {
1920 /* Computing MIN */
1921                 i__1 = j + *ka, i__2 = i__ + kbt;
1922                 i__4 = f2cmin(i__1,i__2);
1923                 for (k = i__ + 1; k <= i__4; ++k) {
1924                     i__1 = j - k + ka1 + k * ab_dim1;
1925                     i__2 = j - k + ka1 + k * ab_dim1;
1926                     i__5 = i__ - k + kb1 + k * bb_dim1;
1927                     i__6 = j - i__ + ka1 + i__ * ab_dim1;
1928                     z__2.r = bb[i__5].r * ab[i__6].r - bb[i__5].i * ab[i__6]
1929                             .i, z__2.i = bb[i__5].r * ab[i__6].i + bb[i__5].i 
1930                             * ab[i__6].r;
1931                     z__1.r = ab[i__2].r - z__2.r, z__1.i = ab[i__2].i - 
1932                             z__2.i;
1933                     ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
1934 /* L550: */
1935                 }
1936 /* L560: */
1937             }
1938
1939             if (wantx) {
1940
1941 /*              post-multiply X by inv(S(i)) */
1942
1943                 d__1 = 1. / bii;
1944                 zdscal_(&nx, &d__1, &x[i__ * x_dim1 + 1], &c__1);
1945                 if (kbt > 0) {
1946                     z__1.r = -1., z__1.i = 0.;
1947                     i__3 = *ldbb - 1;
1948                     zgeru_(&nx, &kbt, &z__1, &x[i__ * x_dim1 + 1], &c__1, &bb[
1949                             *kb + (i__ + 1) * bb_dim1], &i__3, &x[(i__ + 1) * 
1950                             x_dim1 + 1], ldx);
1951                 }
1952             }
1953
1954 /*           store a(i1,i) in RA1 for use in next loop over K */
1955
1956             i__3 = i1 - i__ + ka1 + i__ * ab_dim1;
1957             ra1.r = ab[i__3].r, ra1.i = ab[i__3].i;
1958         }
1959
1960 /*        Generate and apply vectors of rotations to chase all the */
1961 /*        existing bulges KA positions up toward the top of the band */
1962
1963         i__3 = *kb - 1;
1964         for (k = 1; k <= i__3; ++k) {
1965             if (update) {
1966
1967 /*              Determine the rotations which would annihilate the bulge */
1968 /*              which has in theory just been created */
1969
1970                 if (i__ + k - ka1 > 0 && i__ + k < m) {
1971
1972 /*                 generate rotation to annihilate a(i+k-ka-1,i) */
1973
1974                     zlartg_(&ab[k + 1 + i__ * ab_dim1], &ra1, &rwork[i__ + k 
1975                             - *ka], &work[i__ + k - *ka], &ra);
1976
1977 /*                 create nonzero element a(i+k-ka-1,i+k) outside the */
1978 /*                 band and store it in WORK(m-kb+i+k) */
1979
1980                     i__4 = kb1 - k + (i__ + k) * bb_dim1;
1981                     z__2.r = -bb[i__4].r, z__2.i = -bb[i__4].i;
1982                     z__1.r = z__2.r * ra1.r - z__2.i * ra1.i, z__1.i = z__2.r 
1983                             * ra1.i + z__2.i * ra1.r;
1984                     t.r = z__1.r, t.i = z__1.i;
1985                     i__4 = m - *kb + i__ + k;
1986                     i__1 = i__ + k - *ka;
1987                     z__2.r = rwork[i__1] * t.r, z__2.i = rwork[i__1] * t.i;
1988                     d_cnjg(&z__4, &work[i__ + k - *ka]);
1989                     i__2 = (i__ + k) * ab_dim1 + 1;
1990                     z__3.r = z__4.r * ab[i__2].r - z__4.i * ab[i__2].i, 
1991                             z__3.i = z__4.r * ab[i__2].i + z__4.i * ab[i__2]
1992                             .r;
1993                     z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i;
1994                     work[i__4].r = z__1.r, work[i__4].i = z__1.i;
1995                     i__4 = (i__ + k) * ab_dim1 + 1;
1996                     i__1 = i__ + k - *ka;
1997                     z__2.r = work[i__1].r * t.r - work[i__1].i * t.i, z__2.i =
1998                              work[i__1].r * t.i + work[i__1].i * t.r;
1999                     i__2 = i__ + k - *ka;
2000                     i__5 = (i__ + k) * ab_dim1 + 1;
2001                     z__3.r = rwork[i__2] * ab[i__5].r, z__3.i = rwork[i__2] * 
2002                             ab[i__5].i;
2003                     z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i;
2004                     ab[i__4].r = z__1.r, ab[i__4].i = z__1.i;
2005                     ra1.r = ra.r, ra1.i = ra.i;
2006                 }
2007             }
2008 /* Computing MAX */
2009             i__4 = 1, i__1 = k + i0 - m + 1;
2010             j2 = i__ + k + 1 - f2cmax(i__4,i__1) * ka1;
2011             nr = (j2 + *ka - 1) / ka1;
2012             j1 = j2 - (nr - 1) * ka1;
2013             if (update) {
2014 /* Computing MIN */
2015                 i__4 = j2, i__1 = i__ - (*ka << 1) + k - 1;
2016                 j2t = f2cmin(i__4,i__1);
2017             } else {
2018                 j2t = j2;
2019             }
2020             nrt = (j2t + *ka - 1) / ka1;
2021             i__4 = j2t;
2022             i__1 = ka1;
2023             for (j = j1; i__1 < 0 ? j >= i__4 : j <= i__4; j += i__1) {
2024
2025 /*              create nonzero element a(j-1,j+ka) outside the band */
2026 /*              and store it in WORK(j) */
2027
2028                 i__2 = j;
2029                 i__5 = j;
2030                 i__6 = (j + *ka - 1) * ab_dim1 + 1;
2031                 z__1.r = work[i__5].r * ab[i__6].r - work[i__5].i * ab[i__6]
2032                         .i, z__1.i = work[i__5].r * ab[i__6].i + work[i__5].i 
2033                         * ab[i__6].r;
2034                 work[i__2].r = z__1.r, work[i__2].i = z__1.i;
2035                 i__2 = (j + *ka - 1) * ab_dim1 + 1;
2036                 i__5 = j;
2037                 i__6 = (j + *ka - 1) * ab_dim1 + 1;
2038                 z__1.r = rwork[i__5] * ab[i__6].r, z__1.i = rwork[i__5] * ab[
2039                         i__6].i;
2040                 ab[i__2].r = z__1.r, ab[i__2].i = z__1.i;
2041 /* L570: */
2042             }
2043
2044 /*           generate rotations in 1st set to annihilate elements which */
2045 /*           have been created outside the band */
2046
2047             if (nrt > 0) {
2048                 zlargv_(&nrt, &ab[(j1 + *ka) * ab_dim1 + 1], &inca, &work[j1],
2049                          &ka1, &rwork[j1], &ka1);
2050             }
2051             if (nr > 0) {
2052
2053 /*              apply rotations in 1st set from the left */
2054
2055                 i__1 = *ka - 1;
2056                 for (l = 1; l <= i__1; ++l) {
2057                     zlartv_(&nr, &ab[ka1 - l + (j1 + l) * ab_dim1], &inca, &
2058                             ab[*ka - l + (j1 + l) * ab_dim1], &inca, &rwork[
2059                             j1], &work[j1], &ka1);
2060 /* L580: */
2061                 }
2062
2063 /*              apply rotations in 1st set from both sides to diagonal */
2064 /*              blocks */
2065
2066                 zlar2v_(&nr, &ab[ka1 + j1 * ab_dim1], &ab[ka1 + (j1 - 1) * 
2067                         ab_dim1], &ab[*ka + j1 * ab_dim1], &inca, &rwork[j1], 
2068                         &work[j1], &ka1);
2069
2070                 zlacgv_(&nr, &work[j1], &ka1);
2071             }
2072
2073 /*           start applying rotations in 1st set from the right */
2074
2075             i__1 = *kb - k + 1;
2076             for (l = *ka - 1; l >= i__1; --l) {
2077                 nrt = (j2 + l - 1) / ka1;
2078                 j1t = j2 - (nrt - 1) * ka1;
2079                 if (nrt > 0) {
2080                     zlartv_(&nrt, &ab[l + j1t * ab_dim1], &inca, &ab[l + 1 + (
2081                             j1t - 1) * ab_dim1], &inca, &rwork[j1t], &work[
2082                             j1t], &ka1);
2083                 }
2084 /* L590: */
2085             }
2086
2087             if (wantx) {
2088
2089 /*              post-multiply X by product of rotations in 1st set */
2090
2091                 i__1 = j2;
2092                 i__4 = ka1;
2093                 for (j = j1; i__4 < 0 ? j >= i__1 : j <= i__1; j += i__4) {
2094                     zrot_(&nx, &x[j * x_dim1 + 1], &c__1, &x[(j - 1) * x_dim1 
2095                             + 1], &c__1, &rwork[j], &work[j]);
2096 /* L600: */
2097                 }
2098             }
2099 /* L610: */
2100         }
2101
2102         if (update) {
2103             if (i2 > 0 && kbt > 0) {
2104
2105 /*              create nonzero element a(i+kbt-ka-1,i+kbt) outside the */
2106 /*              band and store it in WORK(m-kb+i+kbt) */
2107
2108                 i__3 = m - *kb + i__ + kbt;
2109                 i__4 = kb1 - kbt + (i__ + kbt) * bb_dim1;
2110                 z__2.r = -bb[i__4].r, z__2.i = -bb[i__4].i;
2111                 z__1.r = z__2.r * ra1.r - z__2.i * ra1.i, z__1.i = z__2.r * 
2112                         ra1.i + z__2.i * ra1.r;
2113                 work[i__3].r = z__1.r, work[i__3].i = z__1.i;
2114             }
2115         }
2116
2117         for (k = *kb; k >= 1; --k) {
2118             if (update) {
2119 /* Computing MAX */
2120                 i__3 = 2, i__4 = k + i0 - m;
2121                 j2 = i__ + k + 1 - f2cmax(i__3,i__4) * ka1;
2122             } else {
2123 /* Computing MAX */
2124                 i__3 = 1, i__4 = k + i0 - m;
2125                 j2 = i__ + k + 1 - f2cmax(i__3,i__4) * ka1;
2126             }
2127
2128 /*           finish applying rotations in 2nd set from the right */
2129
2130             for (l = *kb - k; l >= 1; --l) {
2131                 nrt = (j2 + *ka + l - 1) / ka1;
2132                 j1t = j2 - (nrt - 1) * ka1;
2133                 if (nrt > 0) {
2134                     zlartv_(&nrt, &ab[l + (j1t + *ka) * ab_dim1], &inca, &ab[
2135                             l + 1 + (j1t + *ka - 1) * ab_dim1], &inca, &rwork[
2136                             m - *kb + j1t + *ka], &work[m - *kb + j1t + *ka], 
2137                             &ka1);
2138                 }
2139 /* L620: */
2140             }
2141             nr = (j2 + *ka - 1) / ka1;
2142             j1 = j2 - (nr - 1) * ka1;
2143             i__3 = j2;
2144             i__4 = ka1;
2145             for (j = j1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) {
2146                 i__1 = m - *kb + j;
2147                 i__2 = m - *kb + j + *ka;
2148                 work[i__1].r = work[i__2].r, work[i__1].i = work[i__2].i;
2149                 rwork[m - *kb + j] = rwork[m - *kb + j + *ka];
2150 /* L630: */
2151             }
2152             i__4 = j2;
2153             i__3 = ka1;
2154             for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) {
2155
2156 /*              create nonzero element a(j-1,j+ka) outside the band */
2157 /*              and store it in WORK(m-kb+j) */
2158
2159                 i__1 = m - *kb + j;
2160                 i__2 = m - *kb + j;
2161                 i__5 = (j + *ka - 1) * ab_dim1 + 1;
2162                 z__1.r = work[i__2].r * ab[i__5].r - work[i__2].i * ab[i__5]
2163                         .i, z__1.i = work[i__2].r * ab[i__5].i + work[i__2].i 
2164                         * ab[i__5].r;
2165                 work[i__1].r = z__1.r, work[i__1].i = z__1.i;
2166                 i__1 = (j + *ka - 1) * ab_dim1 + 1;
2167                 i__2 = m - *kb + j;
2168                 i__5 = (j + *ka - 1) * ab_dim1 + 1;
2169                 z__1.r = rwork[i__2] * ab[i__5].r, z__1.i = rwork[i__2] * ab[
2170                         i__5].i;
2171                 ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
2172 /* L640: */
2173             }
2174             if (update) {
2175                 if (i__ + k > ka1 && k <= kbt) {
2176                     i__3 = m - *kb + i__ + k - *ka;
2177                     i__4 = m - *kb + i__ + k;
2178                     work[i__3].r = work[i__4].r, work[i__3].i = work[i__4].i;
2179                 }
2180             }
2181 /* L650: */
2182         }
2183
2184         for (k = *kb; k >= 1; --k) {
2185 /* Computing MAX */
2186             i__3 = 1, i__4 = k + i0 - m;
2187             j2 = i__ + k + 1 - f2cmax(i__3,i__4) * ka1;
2188             nr = (j2 + *ka - 1) / ka1;
2189             j1 = j2 - (nr - 1) * ka1;
2190             if (nr > 0) {
2191
2192 /*              generate rotations in 2nd set to annihilate elements */
2193 /*              which have been created outside the band */
2194
2195                 zlargv_(&nr, &ab[(j1 + *ka) * ab_dim1 + 1], &inca, &work[m - *
2196                         kb + j1], &ka1, &rwork[m - *kb + j1], &ka1);
2197
2198 /*              apply rotations in 2nd set from the left */
2199
2200                 i__3 = *ka - 1;
2201                 for (l = 1; l <= i__3; ++l) {
2202                     zlartv_(&nr, &ab[ka1 - l + (j1 + l) * ab_dim1], &inca, &
2203                             ab[*ka - l + (j1 + l) * ab_dim1], &inca, &rwork[m 
2204                             - *kb + j1], &work[m - *kb + j1], &ka1);
2205 /* L660: */
2206                 }
2207
2208 /*              apply rotations in 2nd set from both sides to diagonal */
2209 /*              blocks */
2210
2211                 zlar2v_(&nr, &ab[ka1 + j1 * ab_dim1], &ab[ka1 + (j1 - 1) * 
2212                         ab_dim1], &ab[*ka + j1 * ab_dim1], &inca, &rwork[m - *
2213                         kb + j1], &work[m - *kb + j1], &ka1);
2214
2215                 zlacgv_(&nr, &work[m - *kb + j1], &ka1);
2216             }
2217
2218 /*           start applying rotations in 2nd set from the right */
2219
2220             i__3 = *kb - k + 1;
2221             for (l = *ka - 1; l >= i__3; --l) {
2222                 nrt = (j2 + l - 1) / ka1;
2223                 j1t = j2 - (nrt - 1) * ka1;
2224                 if (nrt > 0) {
2225                     zlartv_(&nrt, &ab[l + j1t * ab_dim1], &inca, &ab[l + 1 + (
2226                             j1t - 1) * ab_dim1], &inca, &rwork[m - *kb + j1t],
2227                              &work[m - *kb + j1t], &ka1);
2228                 }
2229 /* L670: */
2230             }
2231
2232             if (wantx) {
2233
2234 /*              post-multiply X by product of rotations in 2nd set */
2235
2236                 i__3 = j2;
2237                 i__4 = ka1;
2238                 for (j = j1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) {
2239                     zrot_(&nx, &x[j * x_dim1 + 1], &c__1, &x[(j - 1) * x_dim1 
2240                             + 1], &c__1, &rwork[m - *kb + j], &work[m - *kb + 
2241                             j]);
2242 /* L680: */
2243                 }
2244             }
2245 /* L690: */
2246         }
2247
2248         i__4 = *kb - 1;
2249         for (k = 1; k <= i__4; ++k) {
2250 /* Computing MAX */
2251             i__3 = 1, i__1 = k + i0 - m + 1;
2252             j2 = i__ + k + 1 - f2cmax(i__3,i__1) * ka1;
2253
2254 /*           finish applying rotations in 1st set from the right */
2255
2256             for (l = *kb - k; l >= 1; --l) {
2257                 nrt = (j2 + l - 1) / ka1;
2258                 j1t = j2 - (nrt - 1) * ka1;
2259                 if (nrt > 0) {
2260                     zlartv_(&nrt, &ab[l + j1t * ab_dim1], &inca, &ab[l + 1 + (
2261                             j1t - 1) * ab_dim1], &inca, &rwork[j1t], &work[
2262                             j1t], &ka1);
2263                 }
2264 /* L700: */
2265             }
2266 /* L710: */
2267         }
2268
2269         if (*kb > 1) {
2270             i__4 = i2 - *ka;
2271             for (j = 2; j <= i__4; ++j) {
2272                 rwork[j] = rwork[j + *ka];
2273                 i__3 = j;
2274                 i__1 = j + *ka;
2275                 work[i__3].r = work[i__1].r, work[i__3].i = work[i__1].i;
2276 /* L720: */
2277             }
2278         }
2279
2280     } else {
2281
2282 /*        Transform A, working with the lower triangle */
2283
2284         if (update) {
2285
2286 /*           Form  inv(S(i))**H * A * inv(S(i)) */
2287
2288             i__4 = i__ * bb_dim1 + 1;
2289             bii = bb[i__4].r;
2290             i__4 = i__ * ab_dim1 + 1;
2291             i__3 = i__ * ab_dim1 + 1;
2292             d__1 = ab[i__3].r / bii / bii;
2293             ab[i__4].r = d__1, ab[i__4].i = 0.;
2294             i__4 = i__ - 1;
2295             for (j = i1; j <= i__4; ++j) {
2296                 i__3 = i__ - j + 1 + j * ab_dim1;
2297                 i__1 = i__ - j + 1 + j * ab_dim1;
2298                 z__1.r = ab[i__1].r / bii, z__1.i = ab[i__1].i / bii;
2299                 ab[i__3].r = z__1.r, ab[i__3].i = z__1.i;
2300 /* L730: */
2301             }
2302 /* Computing MIN */
2303             i__3 = *n, i__1 = i__ + *ka;
2304             i__4 = f2cmin(i__3,i__1);
2305             for (j = i__ + 1; j <= i__4; ++j) {
2306                 i__3 = j - i__ + 1 + i__ * ab_dim1;
2307                 i__1 = j - i__ + 1 + i__ * ab_dim1;
2308                 z__1.r = ab[i__1].r / bii, z__1.i = ab[i__1].i / bii;
2309                 ab[i__3].r = z__1.r, ab[i__3].i = z__1.i;
2310 /* L740: */
2311             }
2312             i__4 = i__ + kbt;
2313             for (k = i__ + 1; k <= i__4; ++k) {
2314                 i__3 = i__ + kbt;
2315                 for (j = k; j <= i__3; ++j) {
2316                     i__1 = j - k + 1 + k * ab_dim1;
2317                     i__2 = j - k + 1 + k * ab_dim1;
2318                     i__5 = j - i__ + 1 + i__ * bb_dim1;
2319                     d_cnjg(&z__5, &ab[k - i__ + 1 + i__ * ab_dim1]);
2320                     z__4.r = bb[i__5].r * z__5.r - bb[i__5].i * z__5.i, 
2321                             z__4.i = bb[i__5].r * z__5.i + bb[i__5].i * 
2322                             z__5.r;
2323                     z__3.r = ab[i__2].r - z__4.r, z__3.i = ab[i__2].i - 
2324                             z__4.i;
2325                     d_cnjg(&z__7, &bb[k - i__ + 1 + i__ * bb_dim1]);
2326                     i__6 = j - i__ + 1 + i__ * ab_dim1;
2327                     z__6.r = z__7.r * ab[i__6].r - z__7.i * ab[i__6].i, 
2328                             z__6.i = z__7.r * ab[i__6].i + z__7.i * ab[i__6]
2329                             .r;
2330                     z__2.r = z__3.r - z__6.r, z__2.i = z__3.i - z__6.i;
2331                     i__7 = i__ * ab_dim1 + 1;
2332                     d__1 = ab[i__7].r;
2333                     i__8 = j - i__ + 1 + i__ * bb_dim1;
2334                     z__9.r = d__1 * bb[i__8].r, z__9.i = d__1 * bb[i__8].i;
2335                     d_cnjg(&z__10, &bb[k - i__ + 1 + i__ * bb_dim1]);
2336                     z__8.r = z__9.r * z__10.r - z__9.i * z__10.i, z__8.i = 
2337                             z__9.r * z__10.i + z__9.i * z__10.r;
2338                     z__1.r = z__2.r + z__8.r, z__1.i = z__2.i + z__8.i;
2339                     ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
2340 /* L750: */
2341                 }
2342 /* Computing MIN */
2343                 i__1 = *n, i__2 = i__ + *ka;
2344                 i__3 = f2cmin(i__1,i__2);
2345                 for (j = i__ + kbt + 1; j <= i__3; ++j) {
2346                     i__1 = j - k + 1 + k * ab_dim1;
2347                     i__2 = j - k + 1 + k * ab_dim1;
2348                     d_cnjg(&z__3, &bb[k - i__ + 1 + i__ * bb_dim1]);
2349                     i__5 = j - i__ + 1 + i__ * ab_dim1;
2350                     z__2.r = z__3.r * ab[i__5].r - z__3.i * ab[i__5].i, 
2351                             z__2.i = z__3.r * ab[i__5].i + z__3.i * ab[i__5]
2352                             .r;
2353                     z__1.r = ab[i__2].r - z__2.r, z__1.i = ab[i__2].i - 
2354                             z__2.i;
2355                     ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
2356 /* L760: */
2357                 }
2358 /* L770: */
2359             }
2360             i__4 = i__;
2361             for (j = i1; j <= i__4; ++j) {
2362 /* Computing MIN */
2363                 i__1 = j + *ka, i__2 = i__ + kbt;
2364                 i__3 = f2cmin(i__1,i__2);
2365                 for (k = i__ + 1; k <= i__3; ++k) {
2366                     i__1 = k - j + 1 + j * ab_dim1;
2367                     i__2 = k - j + 1 + j * ab_dim1;
2368                     i__5 = k - i__ + 1 + i__ * bb_dim1;
2369                     i__6 = i__ - j + 1 + j * ab_dim1;
2370                     z__2.r = bb[i__5].r * ab[i__6].r - bb[i__5].i * ab[i__6]
2371                             .i, z__2.i = bb[i__5].r * ab[i__6].i + bb[i__5].i 
2372                             * ab[i__6].r;
2373                     z__1.r = ab[i__2].r - z__2.r, z__1.i = ab[i__2].i - 
2374                             z__2.i;
2375                     ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
2376 /* L780: */
2377                 }
2378 /* L790: */
2379             }
2380
2381             if (wantx) {
2382
2383 /*              post-multiply X by inv(S(i)) */
2384
2385                 d__1 = 1. / bii;
2386                 zdscal_(&nx, &d__1, &x[i__ * x_dim1 + 1], &c__1);
2387                 if (kbt > 0) {
2388                     z__1.r = -1., z__1.i = 0.;
2389                     zgerc_(&nx, &kbt, &z__1, &x[i__ * x_dim1 + 1], &c__1, &bb[
2390                             i__ * bb_dim1 + 2], &c__1, &x[(i__ + 1) * x_dim1 
2391                             + 1], ldx);
2392                 }
2393             }
2394
2395 /*           store a(i,i1) in RA1 for use in next loop over K */
2396
2397             i__4 = i__ - i1 + 1 + i1 * ab_dim1;
2398             ra1.r = ab[i__4].r, ra1.i = ab[i__4].i;
2399         }
2400
2401 /*        Generate and apply vectors of rotations to chase all the */
2402 /*        existing bulges KA positions up toward the top of the band */
2403
2404         i__4 = *kb - 1;
2405         for (k = 1; k <= i__4; ++k) {
2406             if (update) {
2407
2408 /*              Determine the rotations which would annihilate the bulge */
2409 /*              which has in theory just been created */
2410
2411                 if (i__ + k - ka1 > 0 && i__ + k < m) {
2412
2413 /*                 generate rotation to annihilate a(i,i+k-ka-1) */
2414
2415                     zlartg_(&ab[ka1 - k + (i__ + k - *ka) * ab_dim1], &ra1, &
2416                             rwork[i__ + k - *ka], &work[i__ + k - *ka], &ra);
2417
2418 /*                 create nonzero element a(i+k,i+k-ka-1) outside the */
2419 /*                 band and store it in WORK(m-kb+i+k) */
2420
2421                     i__3 = k + 1 + i__ * bb_dim1;
2422                     z__2.r = -bb[i__3].r, z__2.i = -bb[i__3].i;
2423                     z__1.r = z__2.r * ra1.r - z__2.i * ra1.i, z__1.i = z__2.r 
2424                             * ra1.i + z__2.i * ra1.r;
2425                     t.r = z__1.r, t.i = z__1.i;
2426                     i__3 = m - *kb + i__ + k;
2427                     i__1 = i__ + k - *ka;
2428                     z__2.r = rwork[i__1] * t.r, z__2.i = rwork[i__1] * t.i;
2429                     d_cnjg(&z__4, &work[i__ + k - *ka]);
2430                     i__2 = ka1 + (i__ + k - *ka) * ab_dim1;
2431                     z__3.r = z__4.r * ab[i__2].r - z__4.i * ab[i__2].i, 
2432                             z__3.i = z__4.r * ab[i__2].i + z__4.i * ab[i__2]
2433                             .r;
2434                     z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i;
2435                     work[i__3].r = z__1.r, work[i__3].i = z__1.i;
2436                     i__3 = ka1 + (i__ + k - *ka) * ab_dim1;
2437                     i__1 = i__ + k - *ka;
2438                     z__2.r = work[i__1].r * t.r - work[i__1].i * t.i, z__2.i =
2439                              work[i__1].r * t.i + work[i__1].i * t.r;
2440                     i__2 = i__ + k - *ka;
2441                     i__5 = ka1 + (i__ + k - *ka) * ab_dim1;
2442                     z__3.r = rwork[i__2] * ab[i__5].r, z__3.i = rwork[i__2] * 
2443                             ab[i__5].i;
2444                     z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i;
2445                     ab[i__3].r = z__1.r, ab[i__3].i = z__1.i;
2446                     ra1.r = ra.r, ra1.i = ra.i;
2447                 }
2448             }
2449 /* Computing MAX */
2450             i__3 = 1, i__1 = k + i0 - m + 1;
2451             j2 = i__ + k + 1 - f2cmax(i__3,i__1) * ka1;
2452             nr = (j2 + *ka - 1) / ka1;
2453             j1 = j2 - (nr - 1) * ka1;
2454             if (update) {
2455 /* Computing MIN */
2456                 i__3 = j2, i__1 = i__ - (*ka << 1) + k - 1;
2457                 j2t = f2cmin(i__3,i__1);
2458             } else {
2459                 j2t = j2;
2460             }
2461             nrt = (j2t + *ka - 1) / ka1;
2462             i__3 = j2t;
2463             i__1 = ka1;
2464             for (j = j1; i__1 < 0 ? j >= i__3 : j <= i__3; j += i__1) {
2465
2466 /*              create nonzero element a(j+ka,j-1) outside the band */
2467 /*              and store it in WORK(j) */
2468
2469                 i__2 = j;
2470                 i__5 = j;
2471                 i__6 = ka1 + (j - 1) * ab_dim1;
2472                 z__1.r = work[i__5].r * ab[i__6].r - work[i__5].i * ab[i__6]
2473                         .i, z__1.i = work[i__5].r * ab[i__6].i + work[i__5].i 
2474                         * ab[i__6].r;
2475                 work[i__2].r = z__1.r, work[i__2].i = z__1.i;
2476                 i__2 = ka1 + (j - 1) * ab_dim1;
2477                 i__5 = j;
2478                 i__6 = ka1 + (j - 1) * ab_dim1;
2479                 z__1.r = rwork[i__5] * ab[i__6].r, z__1.i = rwork[i__5] * ab[
2480                         i__6].i;
2481                 ab[i__2].r = z__1.r, ab[i__2].i = z__1.i;
2482 /* L800: */
2483             }
2484
2485 /*           generate rotations in 1st set to annihilate elements which */
2486 /*           have been created outside the band */
2487
2488             if (nrt > 0) {
2489                 zlargv_(&nrt, &ab[ka1 + j1 * ab_dim1], &inca, &work[j1], &ka1,
2490                          &rwork[j1], &ka1);
2491             }
2492             if (nr > 0) {
2493
2494 /*              apply rotations in 1st set from the right */
2495
2496                 i__1 = *ka - 1;
2497                 for (l = 1; l <= i__1; ++l) {
2498                     zlartv_(&nr, &ab[l + 1 + j1 * ab_dim1], &inca, &ab[l + 2 
2499                             + (j1 - 1) * ab_dim1], &inca, &rwork[j1], &work[
2500                             j1], &ka1);
2501 /* L810: */
2502                 }
2503
2504 /*              apply rotations in 1st set from both sides to diagonal */
2505 /*              blocks */
2506
2507                 zlar2v_(&nr, &ab[j1 * ab_dim1 + 1], &ab[(j1 - 1) * ab_dim1 + 
2508                         1], &ab[(j1 - 1) * ab_dim1 + 2], &inca, &rwork[j1], &
2509                         work[j1], &ka1);
2510
2511                 zlacgv_(&nr, &work[j1], &ka1);
2512             }
2513
2514 /*           start applying rotations in 1st set from the left */
2515
2516             i__1 = *kb - k + 1;
2517             for (l = *ka - 1; l >= i__1; --l) {
2518                 nrt = (j2 + l - 1) / ka1;
2519                 j1t = j2 - (nrt - 1) * ka1;
2520                 if (nrt > 0) {
2521                     zlartv_(&nrt, &ab[ka1 - l + 1 + (j1t - ka1 + l) * ab_dim1]
2522                             , &inca, &ab[ka1 - l + (j1t - ka1 + l) * ab_dim1],
2523                              &inca, &rwork[j1t], &work[j1t], &ka1);
2524                 }
2525 /* L820: */
2526             }
2527
2528             if (wantx) {
2529
2530 /*              post-multiply X by product of rotations in 1st set */
2531
2532                 i__1 = j2;
2533                 i__3 = ka1;
2534                 for (j = j1; i__3 < 0 ? j >= i__1 : j <= i__1; j += i__3) {
2535                     d_cnjg(&z__1, &work[j]);
2536                     zrot_(&nx, &x[j * x_dim1 + 1], &c__1, &x[(j - 1) * x_dim1 
2537                             + 1], &c__1, &rwork[j], &z__1);
2538 /* L830: */
2539                 }
2540             }
2541 /* L840: */
2542         }
2543
2544         if (update) {
2545             if (i2 > 0 && kbt > 0) {
2546
2547 /*              create nonzero element a(i+kbt,i+kbt-ka-1) outside the */
2548 /*              band and store it in WORK(m-kb+i+kbt) */
2549
2550                 i__4 = m - *kb + i__ + kbt;
2551                 i__3 = kbt + 1 + i__ * bb_dim1;
2552                 z__2.r = -bb[i__3].r, z__2.i = -bb[i__3].i;
2553                 z__1.r = z__2.r * ra1.r - z__2.i * ra1.i, z__1.i = z__2.r * 
2554                         ra1.i + z__2.i * ra1.r;
2555                 work[i__4].r = z__1.r, work[i__4].i = z__1.i;
2556             }
2557         }
2558
2559         for (k = *kb; k >= 1; --k) {
2560             if (update) {
2561 /* Computing MAX */
2562                 i__4 = 2, i__3 = k + i0 - m;
2563                 j2 = i__ + k + 1 - f2cmax(i__4,i__3) * ka1;
2564             } else {
2565 /* Computing MAX */
2566                 i__4 = 1, i__3 = k + i0 - m;
2567                 j2 = i__ + k + 1 - f2cmax(i__4,i__3) * ka1;
2568             }
2569
2570 /*           finish applying rotations in 2nd set from the left */
2571
2572             for (l = *kb - k; l >= 1; --l) {
2573                 nrt = (j2 + *ka + l - 1) / ka1;
2574                 j1t = j2 - (nrt - 1) * ka1;
2575                 if (nrt > 0) {
2576                     zlartv_(&nrt, &ab[ka1 - l + 1 + (j1t + l - 1) * ab_dim1], 
2577                             &inca, &ab[ka1 - l + (j1t + l - 1) * ab_dim1], &
2578                             inca, &rwork[m - *kb + j1t + *ka], &work[m - *kb 
2579                             + j1t + *ka], &ka1);
2580                 }
2581 /* L850: */
2582             }
2583             nr = (j2 + *ka - 1) / ka1;
2584             j1 = j2 - (nr - 1) * ka1;
2585             i__4 = j2;
2586             i__3 = ka1;
2587             for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) {
2588                 i__1 = m - *kb + j;
2589                 i__2 = m - *kb + j + *ka;
2590                 work[i__1].r = work[i__2].r, work[i__1].i = work[i__2].i;
2591                 rwork[m - *kb + j] = rwork[m - *kb + j + *ka];
2592 /* L860: */
2593             }
2594             i__3 = j2;
2595             i__4 = ka1;
2596             for (j = j1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) {
2597
2598 /*              create nonzero element a(j+ka,j-1) outside the band */
2599 /*              and store it in WORK(m-kb+j) */
2600
2601                 i__1 = m - *kb + j;
2602                 i__2 = m - *kb + j;
2603                 i__5 = ka1 + (j - 1) * ab_dim1;
2604                 z__1.r = work[i__2].r * ab[i__5].r - work[i__2].i * ab[i__5]
2605                         .i, z__1.i = work[i__2].r * ab[i__5].i + work[i__2].i 
2606                         * ab[i__5].r;
2607                 work[i__1].r = z__1.r, work[i__1].i = z__1.i;
2608                 i__1 = ka1 + (j - 1) * ab_dim1;
2609                 i__2 = m - *kb + j;
2610                 i__5 = ka1 + (j - 1) * ab_dim1;
2611                 z__1.r = rwork[i__2] * ab[i__5].r, z__1.i = rwork[i__2] * ab[
2612                         i__5].i;
2613                 ab[i__1].r = z__1.r, ab[i__1].i = z__1.i;
2614 /* L870: */
2615             }
2616             if (update) {
2617                 if (i__ + k > ka1 && k <= kbt) {
2618                     i__4 = m - *kb + i__ + k - *ka;
2619                     i__3 = m - *kb + i__ + k;
2620                     work[i__4].r = work[i__3].r, work[i__4].i = work[i__3].i;
2621                 }
2622             }
2623 /* L880: */
2624         }
2625
2626         for (k = *kb; k >= 1; --k) {
2627 /* Computing MAX */
2628             i__4 = 1, i__3 = k + i0 - m;
2629             j2 = i__ + k + 1 - f2cmax(i__4,i__3) * ka1;
2630             nr = (j2 + *ka - 1) / ka1;
2631             j1 = j2 - (nr - 1) * ka1;
2632             if (nr > 0) {
2633
2634 /*              generate rotations in 2nd set to annihilate elements */
2635 /*              which have been created outside the band */
2636
2637                 zlargv_(&nr, &ab[ka1 + j1 * ab_dim1], &inca, &work[m - *kb + 
2638                         j1], &ka1, &rwork[m - *kb + j1], &ka1);
2639
2640 /*              apply rotations in 2nd set from the right */
2641
2642                 i__4 = *ka - 1;
2643                 for (l = 1; l <= i__4; ++l) {
2644                     zlartv_(&nr, &ab[l + 1 + j1 * ab_dim1], &inca, &ab[l + 2 
2645                             + (j1 - 1) * ab_dim1], &inca, &rwork[m - *kb + j1]
2646                             , &work[m - *kb + j1], &ka1);
2647 /* L890: */
2648                 }
2649
2650 /*              apply rotations in 2nd set from both sides to diagonal */
2651 /*              blocks */
2652
2653                 zlar2v_(&nr, &ab[j1 * ab_dim1 + 1], &ab[(j1 - 1) * ab_dim1 + 
2654                         1], &ab[(j1 - 1) * ab_dim1 + 2], &inca, &rwork[m - *
2655                         kb + j1], &work[m - *kb + j1], &ka1);
2656
2657                 zlacgv_(&nr, &work[m - *kb + j1], &ka1);
2658             }
2659
2660 /*           start applying rotations in 2nd set from the left */
2661
2662             i__4 = *kb - k + 1;
2663             for (l = *ka - 1; l >= i__4; --l) {
2664                 nrt = (j2 + l - 1) / ka1;
2665                 j1t = j2 - (nrt - 1) * ka1;
2666                 if (nrt > 0) {
2667                     zlartv_(&nrt, &ab[ka1 - l + 1 + (j1t - ka1 + l) * ab_dim1]
2668                             , &inca, &ab[ka1 - l + (j1t - ka1 + l) * ab_dim1],
2669                              &inca, &rwork[m - *kb + j1t], &work[m - *kb + 
2670                             j1t], &ka1);
2671                 }
2672 /* L900: */
2673             }
2674
2675             if (wantx) {
2676
2677 /*              post-multiply X by product of rotations in 2nd set */
2678
2679                 i__4 = j2;
2680                 i__3 = ka1;
2681                 for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) {
2682                     d_cnjg(&z__1, &work[m - *kb + j]);
2683                     zrot_(&nx, &x[j * x_dim1 + 1], &c__1, &x[(j - 1) * x_dim1 
2684                             + 1], &c__1, &rwork[m - *kb + j], &z__1);
2685 /* L910: */
2686                 }
2687             }
2688 /* L920: */
2689         }
2690
2691         i__3 = *kb - 1;
2692         for (k = 1; k <= i__3; ++k) {
2693 /* Computing MAX */
2694             i__4 = 1, i__1 = k + i0 - m + 1;
2695             j2 = i__ + k + 1 - f2cmax(i__4,i__1) * ka1;
2696
2697 /*           finish applying rotations in 1st set from the left */
2698
2699             for (l = *kb - k; l >= 1; --l) {
2700                 nrt = (j2 + l - 1) / ka1;
2701                 j1t = j2 - (nrt - 1) * ka1;
2702                 if (nrt > 0) {
2703                     zlartv_(&nrt, &ab[ka1 - l + 1 + (j1t - ka1 + l) * ab_dim1]
2704                             , &inca, &ab[ka1 - l + (j1t - ka1 + l) * ab_dim1],
2705                              &inca, &rwork[j1t], &work[j1t], &ka1);
2706                 }
2707 /* L930: */
2708             }
2709 /* L940: */
2710         }
2711
2712         if (*kb > 1) {
2713             i__3 = i2 - *ka;
2714             for (j = 2; j <= i__3; ++j) {
2715                 rwork[j] = rwork[j + *ka];
2716                 i__4 = j;
2717                 i__1 = j + *ka;
2718                 work[i__4].r = work[i__1].r, work[i__4].i = work[i__1].i;
2719 /* L950: */
2720             }
2721         }
2722
2723     }
2724
2725     goto L490;
2726
2727 /*     End of ZHBGST */
2728
2729 } /* zhbgst_ */
2730