1 /* ./src_f77/dsbgst.f -- translated by f2c (version 20030320).
2    You must link the resulting object file with the libraries:
3 	-lf2c -lm   (in that order)
4 */
5 
6 #include <punc/vf2c.h>
7 
8 /* Table of constant values */
9 
10 static doublereal c_b8 = 0.;
11 static doublereal c_b9 = 1.;
12 static integer c__1 = 1;
13 static doublereal c_b20 = -1.;
14 
dsbgst_(char * vect,char * uplo,integer * n,integer * ka,integer * kb,doublereal * ab,integer * ldab,doublereal * bb,integer * ldbb,doublereal * x,integer * ldx,doublereal * work,integer * info,ftnlen vect_len,ftnlen uplo_len)15 /* Subroutine */ int dsbgst_(char *vect, char *uplo, integer *n, integer *ka,
16 	integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer *
17 	ldbb, doublereal *x, integer *ldx, doublereal *work, integer *info,
18 	ftnlen vect_len, ftnlen uplo_len)
19 {
20     /* System generated locals */
21     integer ab_dim1, ab_offset, bb_dim1, bb_offset, x_dim1, x_offset, i__1,
22 	    i__2, i__3, i__4;
23     doublereal d__1;
24 
25     /* Local variables */
26     static integer i__, j, k, l, m;
27     static doublereal t;
28     static integer i0, i1, i2, j1, j2;
29     static doublereal ra;
30     static integer nr, nx, ka1, kb1;
31     static doublereal ra1;
32     static integer j1t, j2t;
33     static doublereal bii;
34     static integer kbt, nrt, inca;
35     extern /* Subroutine */ int dger_(integer *, integer *, doublereal *,
36 	    doublereal *, integer *, doublereal *, integer *, doublereal *,
37 	    integer *), drot_(integer *, doublereal *, integer *, doublereal *
38 	    , integer *, doublereal *, doublereal *), dscal_(integer *,
39 	    doublereal *, doublereal *, integer *);
40     extern logical lsame_(char *, char *, ftnlen, ftnlen);
41     static logical upper, wantx;
42     extern /* Subroutine */ int dlar2v_(integer *, doublereal *, doublereal *,
43 	     doublereal *, integer *, doublereal *, doublereal *, integer *),
44 	    dlaset_(char *, integer *, integer *, doublereal *, doublereal *,
45 	    doublereal *, integer *, ftnlen), dlartg_(doublereal *,
46 	    doublereal *, doublereal *, doublereal *, doublereal *), xerbla_(
47 	    char *, integer *, ftnlen), dlargv_(integer *, doublereal *,
48 	    integer *, doublereal *, integer *, doublereal *, integer *);
49     static logical update;
50     extern /* Subroutine */ int dlartv_(integer *, doublereal *, integer *,
51 	    doublereal *, integer *, doublereal *, doublereal *, integer *);
52 
53 
54 /*  -- LAPACK routine (version 3.0) -- */
55 /*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */
56 /*     Courant Institute, Argonne National Lab, and Rice University */
57 /*     June 30, 1999 */
58 
59 /*     .. Scalar Arguments .. */
60 /*     .. */
61 /*     .. Array Arguments .. */
62 /*     .. */
63 
64 /*  Purpose */
65 /*  ======= */
66 
67 /*  DSBGST reduces a real symmetric-definite banded generalized */
68 /*  eigenproblem  A*x = lambda*B*x  to standard form  C*y = lambda*y, */
69 /*  such that C has the same bandwidth as A. */
70 
71 /*  B must have been previously factorized as S**T*S by DPBSTF, using a */
72 /*  split Cholesky factorization. A is overwritten by C = X**T*A*X, where */
73 /*  X = S**(-1)*Q and Q is an orthogonal matrix chosen to preserve the */
74 /*  bandwidth of A. */
75 
76 /*  Arguments */
77 /*  ========= */
78 
79 /*  VECT    (input) CHARACTER*1 */
80 /*          = 'N':  do not form the transformation matrix X; */
81 /*          = 'V':  form X. */
82 
83 /*  UPLO    (input) CHARACTER*1 */
84 /*          = 'U':  Upper triangle of A is stored; */
85 /*          = 'L':  Lower triangle of A is stored. */
86 
87 /*  N       (input) INTEGER */
88 /*          The order of the matrices A and B.  N >= 0. */
89 
90 /*  KA      (input) INTEGER */
91 /*          The number of superdiagonals of the matrix A if UPLO = 'U', */
92 /*          or the number of subdiagonals if UPLO = 'L'.  KA >= 0. */
93 
94 /*  KB      (input) INTEGER */
95 /*          The number of superdiagonals of the matrix B if UPLO = 'U', */
96 /*          or the number of subdiagonals if UPLO = 'L'.  KA >= KB >= 0. */
97 
98 /*  AB      (input/output) DOUBLE PRECISION array, dimension (LDAB,N) */
99 /*          On entry, the upper or lower triangle of the symmetric band */
100 /*          matrix A, stored in the first ka+1 rows of the array.  The */
101 /*          j-th column of A is stored in the j-th column of the array AB */
102 /*          as follows: */
103 /*          if UPLO = 'U', AB(ka+1+i-j,j) = A(i,j) for max(1,j-ka)<=i<=j; */
104 /*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+ka). */
105 
106 /*          On exit, the transformed matrix X**T*A*X, stored in the same */
107 /*          format as A. */
108 
109 /*  LDAB    (input) INTEGER */
110 /*          The leading dimension of the array AB.  LDAB >= KA+1. */
111 
112 /*  BB      (input) DOUBLE PRECISION array, dimension (LDBB,N) */
113 /*          The banded factor S from the split Cholesky factorization of */
114 /*          B, as returned by DPBSTF, stored in the first KB+1 rows of */
115 /*          the array. */
116 
117 /*  LDBB    (input) INTEGER */
118 /*          The leading dimension of the array BB.  LDBB >= KB+1. */
119 
120 /*  X       (output) DOUBLE PRECISION array, dimension (LDX,N) */
121 /*          If VECT = 'V', the n-by-n matrix X. */
122 /*          If VECT = 'N', the array X is not referenced. */
123 
124 /*  LDX     (input) INTEGER */
125 /*          The leading dimension of the array X. */
126 /*          LDX >= max(1,N) if VECT = 'V'; LDX >= 1 otherwise. */
127 
128 /*  WORK    (workspace) DOUBLE PRECISION array, dimension (2*N) */
129 
130 /*  INFO    (output) INTEGER */
131 /*          = 0:  successful exit */
132 /*          < 0:  if INFO = -i, the i-th argument had an illegal value. */
133 
134 /*  ===================================================================== */
135 
136 /*     .. Parameters .. */
137 /*     .. */
138 /*     .. Local Scalars .. */
139 /*     .. */
140 /*     .. External Functions .. */
141 /*     .. */
142 /*     .. External Subroutines .. */
143 /*     .. */
144 /*     .. Intrinsic Functions .. */
145 /*     .. */
146 /*     .. Executable Statements .. */
147 
148 /*     Test the input parameters */
149 
150     /* Parameter adjustments */
151     ab_dim1 = *ldab;
152     ab_offset = 1 + ab_dim1;
153     ab -= ab_offset;
154     bb_dim1 = *ldbb;
155     bb_offset = 1 + bb_dim1;
156     bb -= bb_offset;
157     x_dim1 = *ldx;
158     x_offset = 1 + x_dim1;
159     x -= x_offset;
160     --work;
161 
162     /* Function Body */
163     wantx = lsame_(vect, "V", (ftnlen)1, (ftnlen)1);
164     upper = lsame_(uplo, "U", (ftnlen)1, (ftnlen)1);
165     ka1 = *ka + 1;
166     kb1 = *kb + 1;
167     *info = 0;
168     if (! wantx && ! lsame_(vect, "N", (ftnlen)1, (ftnlen)1)) {
169 	*info = -1;
170     } else if (! upper && ! lsame_(uplo, "L", (ftnlen)1, (ftnlen)1)) {
171 	*info = -2;
172     } else if (*n < 0) {
173 	*info = -3;
174     } else if (*ka < 0) {
175 	*info = -4;
176     } else if (*kb < 0) {
177 	*info = -5;
178     } else if (*ldab < *ka + 1) {
179 	*info = -7;
180     } else if (*ldbb < *kb + 1) {
181 	*info = -9;
182     } else if (*ldx < 1 || wantx && *ldx < max(1,*n)) {
183 	*info = -11;
184     }
185     if (*info != 0) {
186 	i__1 = -(*info);
187 	xerbla_("DSBGST", &i__1, (ftnlen)6);
188 	return 0;
189     }
190 
191 /*     Quick return if possible */
192 
193     if (*n == 0) {
194 	return 0;
195     }
196 
197     inca = *ldab * ka1;
198 
199 /*     Initialize X to the unit matrix, if needed */
200 
201     if (wantx) {
202 	dlaset_("Full", n, n, &c_b8, &c_b9, &x[x_offset], ldx, (ftnlen)4);
203     }
204 
205 /*     Set M to the splitting point m. It must be the same value as is */
206 /*     used in DPBSTF. The chosen value allows the arrays WORK and RWORK */
207 /*     to be of dimension (N). */
208 
209     m = (*n + *kb) / 2;
210 
211 /*     The routine works in two phases, corresponding to the two halves */
212 /*     of the split Cholesky factorization of B as S**T*S where */
213 
214 /*     S = ( U    ) */
215 /*         ( M  L ) */
216 
217 /*     with U upper triangular of order m, and L lower triangular of */
218 /*     order n-m. S has the same bandwidth as B. */
219 
220 /*     S is treated as a product of elementary matrices: */
221 
222 /*     S = S(m)*S(m-1)*...*S(2)*S(1)*S(m+1)*S(m+2)*...*S(n-1)*S(n) */
223 
224 /*     where S(i) is determined by the i-th row of S. */
225 
226 /*     In phase 1, the index i takes the values n, n-1, ... , m+1; */
227 /*     in phase 2, it takes the values 1, 2, ... , m. */
228 
229 /*     For each value of i, the current matrix A is updated by forming */
230 /*     inv(S(i))**T*A*inv(S(i)). This creates a triangular bulge outside */
231 /*     the band of A. The bulge is then pushed down toward the bottom of */
232 /*     A in phase 1, and up toward the top of A in phase 2, by applying */
233 /*     plane rotations. */
234 
235 /*     There are kb*(kb+1)/2 elements in the bulge, but at most 2*kb-1 */
236 /*     of them are linearly independent, so annihilating a bulge requires */
237 /*     only 2*kb-1 plane rotations. The rotations are divided into a 1st */
238 /*     set of kb-1 rotations, and a 2nd set of kb rotations. */
239 
240 /*     Wherever possible, rotations are generated and applied in vector */
241 /*     operations of length NR between the indices J1 and J2 (sometimes */
242 /*     replaced by modified values NRT, J1T or J2T). */
243 
244 /*     The cosines and sines of the rotations are stored in the array */
245 /*     WORK. The cosines of the 1st set of rotations are stored in */
246 /*     elements n+2:n+m-kb-1 and the sines of the 1st set in elements */
247 /*     2:m-kb-1; the cosines of the 2nd set are stored in elements */
248 /*     n+m-kb+1:2*n and the sines of the second set in elements m-kb+1:n. */
249 
250 /*     The bulges are not formed explicitly; nonzero elements outside the */
251 /*     band are created only when they are required for generating new */
252 /*     rotations; they are stored in the array WORK, in positions where */
253 /*     they are later overwritten by the sines of the rotations which */
254 /*     annihilate them. */
255 
256 /*     **************************** Phase 1 ***************************** */
257 
258 /*     The logical structure of this phase is: */
259 
260 /*     UPDATE = .TRUE. */
261 /*     DO I = N, M + 1, -1 */
262 /*        use S(i) to update A and create a new bulge */
263 /*        apply rotations to push all bulges KA positions downward */
264 /*     END DO */
265 /*     UPDATE = .FALSE. */
266 /*     DO I = M + KA + 1, N - 1 */
267 /*        apply rotations to push all bulges KA positions downward */
268 /*     END DO */
269 
270 /*     To avoid duplicating code, the two loops are merged. */
271 
272     update = TRUE_;
273     i__ = *n + 1;
274 L10:
275     if (update) {
276 	--i__;
277 /* Computing MIN */
278 	i__1 = *kb, i__2 = i__ - 1;
279 	kbt = min(i__1,i__2);
280 	i0 = i__ - 1;
281 /* Computing MIN */
282 	i__1 = *n, i__2 = i__ + *ka;
283 	i1 = min(i__1,i__2);
284 	i2 = i__ - kbt + ka1;
285 	if (i__ < m + 1) {
286 	    update = FALSE_;
287 	    ++i__;
288 	    i0 = m;
289 	    if (*ka == 0) {
290 		goto L480;
291 	    }
292 	    goto L10;
293 	}
294     } else {
295 	i__ += *ka;
296 	if (i__ > *n - 1) {
297 	    goto L480;
298 	}
299     }
300 
301     if (upper) {
302 
303 /*        Transform A, working with the upper triangle */
304 
305 	if (update) {
306 
307 /*           Form  inv(S(i))**T * A * inv(S(i)) */
308 
309 	    bii = bb[kb1 + i__ * bb_dim1];
310 	    i__1 = i1;
311 	    for (j = i__; j <= i__1; ++j) {
312 		ab[i__ - j + ka1 + j * ab_dim1] /= bii;
313 /* L20: */
314 	    }
315 /* Computing MAX */
316 	    i__1 = 1, i__2 = i__ - *ka;
317 	    i__3 = i__;
318 	    for (j = max(i__1,i__2); j <= i__3; ++j) {
319 		ab[j - i__ + ka1 + i__ * ab_dim1] /= bii;
320 /* L30: */
321 	    }
322 	    i__3 = i__ - 1;
323 	    for (k = i__ - kbt; k <= i__3; ++k) {
324 		i__1 = k;
325 		for (j = i__ - kbt; j <= i__1; ++j) {
326 		    ab[j - k + ka1 + k * ab_dim1] = ab[j - k + ka1 + k *
327 			    ab_dim1] - bb[j - i__ + kb1 + i__ * bb_dim1] * ab[
328 			    k - i__ + ka1 + i__ * ab_dim1] - bb[k - i__ + kb1
329 			    + i__ * bb_dim1] * ab[j - i__ + ka1 + i__ *
330 			    ab_dim1] + ab[ka1 + i__ * ab_dim1] * bb[j - i__ +
331 			    kb1 + i__ * bb_dim1] * bb[k - i__ + kb1 + i__ *
332 			    bb_dim1];
333 /* L40: */
334 		}
335 /* Computing MAX */
336 		i__1 = 1, i__2 = i__ - *ka;
337 		i__4 = i__ - kbt - 1;
338 		for (j = max(i__1,i__2); j <= i__4; ++j) {
339 		    ab[j - k + ka1 + k * ab_dim1] -= bb[k - i__ + kb1 + i__ *
340 			    bb_dim1] * ab[j - i__ + ka1 + i__ * ab_dim1];
341 /* L50: */
342 		}
343 /* L60: */
344 	    }
345 	    i__3 = i1;
346 	    for (j = i__; j <= i__3; ++j) {
347 /* Computing MAX */
348 		i__4 = j - *ka, i__1 = i__ - kbt;
349 		i__2 = i__ - 1;
350 		for (k = max(i__4,i__1); k <= i__2; ++k) {
351 		    ab[k - j + ka1 + j * ab_dim1] -= bb[k - i__ + kb1 + i__ *
352 			    bb_dim1] * ab[i__ - j + ka1 + j * ab_dim1];
353 /* L70: */
354 		}
355 /* L80: */
356 	    }
357 
358 	    if (wantx) {
359 
360 /*              post-multiply X by inv(S(i)) */
361 
362 		i__3 = *n - m;
363 		d__1 = 1. / bii;
364 		dscal_(&i__3, &d__1, &x[m + 1 + i__ * x_dim1], &c__1);
365 		if (kbt > 0) {
366 		    i__3 = *n - m;
367 		    dger_(&i__3, &kbt, &c_b20, &x[m + 1 + i__ * x_dim1], &
368 			    c__1, &bb[kb1 - kbt + i__ * bb_dim1], &c__1, &x[m
369 			    + 1 + (i__ - kbt) * x_dim1], ldx);
370 		}
371 	    }
372 
373 /*           store a(i,i1) in RA1 for use in next loop over K */
374 
375 	    ra1 = ab[i__ - i1 + ka1 + i1 * ab_dim1];
376 	}
377 
378 /*        Generate and apply vectors of rotations to chase all the */
379 /*        existing bulges KA positions down toward the bottom of the */
380 /*        band */
381 
382 	i__3 = *kb - 1;
383 	for (k = 1; k <= i__3; ++k) {
384 	    if (update) {
385 
386 /*              Determine the rotations which would annihilate the bulge */
387 /*              which has in theory just been created */
388 
389 		if (i__ - k + *ka < *n && i__ - k > 1) {
390 
391 /*                 generate rotation to annihilate a(i,i-k+ka+1) */
392 
393 		    dlartg_(&ab[k + 1 + (i__ - k + *ka) * ab_dim1], &ra1, &
394 			    work[*n + i__ - k + *ka - m], &work[i__ - k + *ka
395 			    - m], &ra);
396 
397 /*                 create nonzero element a(i-k,i-k+ka+1) outside the */
398 /*                 band and store it in WORK(i-k) */
399 
400 		    t = -bb[kb1 - k + i__ * bb_dim1] * ra1;
401 		    work[i__ - k] = work[*n + i__ - k + *ka - m] * t - work[
402 			    i__ - k + *ka - m] * ab[(i__ - k + *ka) * ab_dim1
403 			    + 1];
404 		    ab[(i__ - k + *ka) * ab_dim1 + 1] = work[i__ - k + *ka -
405 			    m] * t + work[*n + i__ - k + *ka - m] * ab[(i__ -
406 			    k + *ka) * ab_dim1 + 1];
407 		    ra1 = ra;
408 		}
409 	    }
410 /* Computing MAX */
411 	    i__2 = 1, i__4 = k - i0 + 2;
412 	    j2 = i__ - k - 1 + max(i__2,i__4) * ka1;
413 	    nr = (*n - j2 + *ka) / ka1;
414 	    j1 = j2 + (nr - 1) * ka1;
415 	    if (update) {
416 /* Computing MAX */
417 		i__2 = j2, i__4 = i__ + (*ka << 1) - k + 1;
418 		j2t = max(i__2,i__4);
419 	    } else {
420 		j2t = j2;
421 	    }
422 	    nrt = (*n - j2t + *ka) / ka1;
423 	    i__2 = j1;
424 	    i__4 = ka1;
425 	    for (j = j2t; i__4 < 0 ? j >= i__2 : j <= i__2; j += i__4) {
426 
427 /*              create nonzero element a(j-ka,j+1) outside the band */
428 /*              and store it in WORK(j-m) */
429 
430 		work[j - m] *= ab[(j + 1) * ab_dim1 + 1];
431 		ab[(j + 1) * ab_dim1 + 1] = work[*n + j - m] * ab[(j + 1) *
432 			ab_dim1 + 1];
433 /* L90: */
434 	    }
435 
436 /*           generate rotations in 1st set to annihilate elements which */
437 /*           have been created outside the band */
438 
439 	    if (nrt > 0) {
440 		dlargv_(&nrt, &ab[j2t * ab_dim1 + 1], &inca, &work[j2t - m], &
441 			ka1, &work[*n + j2t - m], &ka1);
442 	    }
443 	    if (nr > 0) {
444 
445 /*              apply rotations in 1st set from the right */
446 
447 		i__4 = *ka - 1;
448 		for (l = 1; l <= i__4; ++l) {
449 		    dlartv_(&nr, &ab[ka1 - l + j2 * ab_dim1], &inca, &ab[*ka
450 			    - l + (j2 + 1) * ab_dim1], &inca, &work[*n + j2 -
451 			    m], &work[j2 - m], &ka1);
452 /* L100: */
453 		}
454 
455 /*              apply rotations in 1st set from both sides to diagonal */
456 /*              blocks */
457 
458 		dlar2v_(&nr, &ab[ka1 + j2 * ab_dim1], &ab[ka1 + (j2 + 1) *
459 			ab_dim1], &ab[*ka + (j2 + 1) * ab_dim1], &inca, &work[
460 			*n + j2 - m], &work[j2 - m], &ka1);
461 
462 	    }
463 
464 /*           start applying rotations in 1st set from the left */
465 
466 	    i__4 = *kb - k + 1;
467 	    for (l = *ka - 1; l >= i__4; --l) {
468 		nrt = (*n - j2 + l) / ka1;
469 		if (nrt > 0) {
470 		    dlartv_(&nrt, &ab[l + (j2 + ka1 - l) * ab_dim1], &inca, &
471 			    ab[l + 1 + (j2 + ka1 - l) * ab_dim1], &inca, &
472 			    work[*n + j2 - m], &work[j2 - m], &ka1);
473 		}
474 /* L110: */
475 	    }
476 
477 	    if (wantx) {
478 
479 /*              post-multiply X by product of rotations in 1st set */
480 
481 		i__4 = j1;
482 		i__2 = ka1;
483 		for (j = j2; i__2 < 0 ? j >= i__4 : j <= i__4; j += i__2) {
484 		    i__1 = *n - m;
485 		    drot_(&i__1, &x[m + 1 + j * x_dim1], &c__1, &x[m + 1 + (j
486 			    + 1) * x_dim1], &c__1, &work[*n + j - m], &work[j
487 			    - m]);
488 /* L120: */
489 		}
490 	    }
491 /* L130: */
492 	}
493 
494 	if (update) {
495 	    if (i2 <= *n && kbt > 0) {
496 
497 /*              create nonzero element a(i-kbt,i-kbt+ka+1) outside the */
498 /*              band and store it in WORK(i-kbt) */
499 
500 		work[i__ - kbt] = -bb[kb1 - kbt + i__ * bb_dim1] * ra1;
501 	    }
502 	}
503 
504 	for (k = *kb; k >= 1; --k) {
505 	    if (update) {
506 /* Computing MAX */
507 		i__3 = 2, i__2 = k - i0 + 1;
508 		j2 = i__ - k - 1 + max(i__3,i__2) * ka1;
509 	    } else {
510 /* Computing MAX */
511 		i__3 = 1, i__2 = k - i0 + 1;
512 		j2 = i__ - k - 1 + max(i__3,i__2) * ka1;
513 	    }
514 
515 /*           finish applying rotations in 2nd set from the left */
516 
517 	    for (l = *kb - k; l >= 1; --l) {
518 		nrt = (*n - j2 + *ka + l) / ka1;
519 		if (nrt > 0) {
520 		    dlartv_(&nrt, &ab[l + (j2 - l + 1) * ab_dim1], &inca, &ab[
521 			    l + 1 + (j2 - l + 1) * ab_dim1], &inca, &work[*n
522 			    + j2 - *ka], &work[j2 - *ka], &ka1);
523 		}
524 /* L140: */
525 	    }
526 	    nr = (*n - j2 + *ka) / ka1;
527 	    j1 = j2 + (nr - 1) * ka1;
528 	    i__3 = j2;
529 	    i__2 = -ka1;
530 	    for (j = j1; i__2 < 0 ? j >= i__3 : j <= i__3; j += i__2) {
531 		work[j] = work[j - *ka];
532 		work[*n + j] = work[*n + j - *ka];
533 /* L150: */
534 	    }
535 	    i__2 = j1;
536 	    i__3 = ka1;
537 	    for (j = j2; i__3 < 0 ? j >= i__2 : j <= i__2; j += i__3) {
538 
539 /*              create nonzero element a(j-ka,j+1) outside the band */
540 /*              and store it in WORK(j) */
541 
542 		work[j] *= ab[(j + 1) * ab_dim1 + 1];
543 		ab[(j + 1) * ab_dim1 + 1] = work[*n + j] * ab[(j + 1) *
544 			ab_dim1 + 1];
545 /* L160: */
546 	    }
547 	    if (update) {
548 		if (i__ - k < *n - *ka && k <= kbt) {
549 		    work[i__ - k + *ka] = work[i__ - k];
550 		}
551 	    }
552 /* L170: */
553 	}
554 
555 	for (k = *kb; k >= 1; --k) {
556 /* Computing MAX */
557 	    i__3 = 1, i__2 = k - i0 + 1;
558 	    j2 = i__ - k - 1 + max(i__3,i__2) * ka1;
559 	    nr = (*n - j2 + *ka) / ka1;
560 	    j1 = j2 + (nr - 1) * ka1;
561 	    if (nr > 0) {
562 
563 /*              generate rotations in 2nd set to annihilate elements */
564 /*              which have been created outside the band */
565 
566 		dlargv_(&nr, &ab[j2 * ab_dim1 + 1], &inca, &work[j2], &ka1, &
567 			work[*n + j2], &ka1);
568 
569 /*              apply rotations in 2nd set from the right */
570 
571 		i__3 = *ka - 1;
572 		for (l = 1; l <= i__3; ++l) {
573 		    dlartv_(&nr, &ab[ka1 - l + j2 * ab_dim1], &inca, &ab[*ka
574 			    - l + (j2 + 1) * ab_dim1], &inca, &work[*n + j2],
575 			    &work[j2], &ka1);
576 /* L180: */
577 		}
578 
579 /*              apply rotations in 2nd set from both sides to diagonal */
580 /*              blocks */
581 
582 		dlar2v_(&nr, &ab[ka1 + j2 * ab_dim1], &ab[ka1 + (j2 + 1) *
583 			ab_dim1], &ab[*ka + (j2 + 1) * ab_dim1], &inca, &work[
584 			*n + j2], &work[j2], &ka1);
585 
586 	    }
587 
588 /*           start applying rotations in 2nd set from the left */
589 
590 	    i__3 = *kb - k + 1;
591 	    for (l = *ka - 1; l >= i__3; --l) {
592 		nrt = (*n - j2 + l) / ka1;
593 		if (nrt > 0) {
594 		    dlartv_(&nrt, &ab[l + (j2 + ka1 - l) * ab_dim1], &inca, &
595 			    ab[l + 1 + (j2 + ka1 - l) * ab_dim1], &inca, &
596 			    work[*n + j2], &work[j2], &ka1);
597 		}
598 /* L190: */
599 	    }
600 
601 	    if (wantx) {
602 
603 /*              post-multiply X by product of rotations in 2nd set */
604 
605 		i__3 = j1;
606 		i__2 = ka1;
607 		for (j = j2; i__2 < 0 ? j >= i__3 : j <= i__3; j += i__2) {
608 		    i__4 = *n - m;
609 		    drot_(&i__4, &x[m + 1 + j * x_dim1], &c__1, &x[m + 1 + (j
610 			    + 1) * x_dim1], &c__1, &work[*n + j], &work[j]);
611 /* L200: */
612 		}
613 	    }
614 /* L210: */
615 	}
616 
617 	i__2 = *kb - 1;
618 	for (k = 1; k <= i__2; ++k) {
619 /* Computing MAX */
620 	    i__3 = 1, i__4 = k - i0 + 2;
621 	    j2 = i__ - k - 1 + max(i__3,i__4) * ka1;
622 
623 /*           finish applying rotations in 1st set from the left */
624 
625 	    for (l = *kb - k; l >= 1; --l) {
626 		nrt = (*n - j2 + l) / ka1;
627 		if (nrt > 0) {
628 		    dlartv_(&nrt, &ab[l + (j2 + ka1 - l) * ab_dim1], &inca, &
629 			    ab[l + 1 + (j2 + ka1 - l) * ab_dim1], &inca, &
630 			    work[*n + j2 - m], &work[j2 - m], &ka1);
631 		}
632 /* L220: */
633 	    }
634 /* L230: */
635 	}
636 
637 	if (*kb > 1) {
638 	    i__2 = i__ - *kb + (*ka << 1) + 1;
639 	    for (j = *n - 1; j >= i__2; --j) {
640 		work[*n + j - m] = work[*n + j - *ka - m];
641 		work[j - m] = work[j - *ka - m];
642 /* L240: */
643 	    }
644 	}
645 
646     } else {
647 
648 /*        Transform A, working with the lower triangle */
649 
650 	if (update) {
651 
652 /*           Form  inv(S(i))**T * A * inv(S(i)) */
653 
654 	    bii = bb[i__ * bb_dim1 + 1];
655 	    i__2 = i1;
656 	    for (j = i__; j <= i__2; ++j) {
657 		ab[j - i__ + 1 + i__ * ab_dim1] /= bii;
658 /* L250: */
659 	    }
660 /* Computing MAX */
661 	    i__2 = 1, i__3 = i__ - *ka;
662 	    i__4 = i__;
663 	    for (j = max(i__2,i__3); j <= i__4; ++j) {
664 		ab[i__ - j + 1 + j * ab_dim1] /= bii;
665 /* L260: */
666 	    }
667 	    i__4 = i__ - 1;
668 	    for (k = i__ - kbt; k <= i__4; ++k) {
669 		i__2 = k;
670 		for (j = i__ - kbt; j <= i__2; ++j) {
671 		    ab[k - j + 1 + j * ab_dim1] = ab[k - j + 1 + j * ab_dim1]
672 			    - bb[i__ - j + 1 + j * bb_dim1] * ab[i__ - k + 1
673 			    + k * ab_dim1] - bb[i__ - k + 1 + k * bb_dim1] *
674 			    ab[i__ - j + 1 + j * ab_dim1] + ab[i__ * ab_dim1
675 			    + 1] * bb[i__ - j + 1 + j * bb_dim1] * bb[i__ - k
676 			    + 1 + k * bb_dim1];
677 /* L270: */
678 		}
679 /* Computing MAX */
680 		i__2 = 1, i__3 = i__ - *ka;
681 		i__1 = i__ - kbt - 1;
682 		for (j = max(i__2,i__3); j <= i__1; ++j) {
683 		    ab[k - j + 1 + j * ab_dim1] -= bb[i__ - k + 1 + k *
684 			    bb_dim1] * ab[i__ - j + 1 + j * ab_dim1];
685 /* L280: */
686 		}
687 /* L290: */
688 	    }
689 	    i__4 = i1;
690 	    for (j = i__; j <= i__4; ++j) {
691 /* Computing MAX */
692 		i__1 = j - *ka, i__2 = i__ - kbt;
693 		i__3 = i__ - 1;
694 		for (k = max(i__1,i__2); k <= i__3; ++k) {
695 		    ab[j - k + 1 + k * ab_dim1] -= bb[i__ - k + 1 + k *
696 			    bb_dim1] * ab[j - i__ + 1 + i__ * ab_dim1];
697 /* L300: */
698 		}
699 /* L310: */
700 	    }
701 
702 	    if (wantx) {
703 
704 /*              post-multiply X by inv(S(i)) */
705 
706 		i__4 = *n - m;
707 		d__1 = 1. / bii;
708 		dscal_(&i__4, &d__1, &x[m + 1 + i__ * x_dim1], &c__1);
709 		if (kbt > 0) {
710 		    i__4 = *n - m;
711 		    i__3 = *ldbb - 1;
712 		    dger_(&i__4, &kbt, &c_b20, &x[m + 1 + i__ * x_dim1], &
713 			    c__1, &bb[kbt + 1 + (i__ - kbt) * bb_dim1], &i__3,
714 			     &x[m + 1 + (i__ - kbt) * x_dim1], ldx);
715 		}
716 	    }
717 
718 /*           store a(i1,i) in RA1 for use in next loop over K */
719 
720 	    ra1 = ab[i1 - i__ + 1 + i__ * ab_dim1];
721 	}
722 
723 /*        Generate and apply vectors of rotations to chase all the */
724 /*        existing bulges KA positions down toward the bottom of the */
725 /*        band */
726 
727 	i__4 = *kb - 1;
728 	for (k = 1; k <= i__4; ++k) {
729 	    if (update) {
730 
731 /*              Determine the rotations which would annihilate the bulge */
732 /*              which has in theory just been created */
733 
734 		if (i__ - k + *ka < *n && i__ - k > 1) {
735 
736 /*                 generate rotation to annihilate a(i-k+ka+1,i) */
737 
738 		    dlartg_(&ab[ka1 - k + i__ * ab_dim1], &ra1, &work[*n +
739 			    i__ - k + *ka - m], &work[i__ - k + *ka - m], &ra)
740 			    ;
741 
742 /*                 create nonzero element a(i-k+ka+1,i-k) outside the */
743 /*                 band and store it in WORK(i-k) */
744 
745 		    t = -bb[k + 1 + (i__ - k) * bb_dim1] * ra1;
746 		    work[i__ - k] = work[*n + i__ - k + *ka - m] * t - work[
747 			    i__ - k + *ka - m] * ab[ka1 + (i__ - k) * ab_dim1]
748 			    ;
749 		    ab[ka1 + (i__ - k) * ab_dim1] = work[i__ - k + *ka - m] *
750 			    t + work[*n + i__ - k + *ka - m] * ab[ka1 + (i__
751 			    - k) * ab_dim1];
752 		    ra1 = ra;
753 		}
754 	    }
755 /* Computing MAX */
756 	    i__3 = 1, i__1 = k - i0 + 2;
757 	    j2 = i__ - k - 1 + max(i__3,i__1) * ka1;
758 	    nr = (*n - j2 + *ka) / ka1;
759 	    j1 = j2 + (nr - 1) * ka1;
760 	    if (update) {
761 /* Computing MAX */
762 		i__3 = j2, i__1 = i__ + (*ka << 1) - k + 1;
763 		j2t = max(i__3,i__1);
764 	    } else {
765 		j2t = j2;
766 	    }
767 	    nrt = (*n - j2t + *ka) / ka1;
768 	    i__3 = j1;
769 	    i__1 = ka1;
770 	    for (j = j2t; i__1 < 0 ? j >= i__3 : j <= i__3; j += i__1) {
771 
772 /*              create nonzero element a(j+1,j-ka) outside the band */
773 /*              and store it in WORK(j-m) */
774 
775 		work[j - m] *= ab[ka1 + (j - *ka + 1) * ab_dim1];
776 		ab[ka1 + (j - *ka + 1) * ab_dim1] = work[*n + j - m] * ab[ka1
777 			+ (j - *ka + 1) * ab_dim1];
778 /* L320: */
779 	    }
780 
781 /*           generate rotations in 1st set to annihilate elements which */
782 /*           have been created outside the band */
783 
784 	    if (nrt > 0) {
785 		dlargv_(&nrt, &ab[ka1 + (j2t - *ka) * ab_dim1], &inca, &work[
786 			j2t - m], &ka1, &work[*n + j2t - m], &ka1);
787 	    }
788 	    if (nr > 0) {
789 
790 /*              apply rotations in 1st set from the left */
791 
792 		i__1 = *ka - 1;
793 		for (l = 1; l <= i__1; ++l) {
794 		    dlartv_(&nr, &ab[l + 1 + (j2 - l) * ab_dim1], &inca, &ab[
795 			    l + 2 + (j2 - l) * ab_dim1], &inca, &work[*n + j2
796 			    - m], &work[j2 - m], &ka1);
797 /* L330: */
798 		}
799 
800 /*              apply rotations in 1st set from both sides to diagonal */
801 /*              blocks */
802 
803 		dlar2v_(&nr, &ab[j2 * ab_dim1 + 1], &ab[(j2 + 1) * ab_dim1 +
804 			1], &ab[j2 * ab_dim1 + 2], &inca, &work[*n + j2 - m],
805 			&work[j2 - m], &ka1);
806 
807 	    }
808 
809 /*           start applying rotations in 1st set from the right */
810 
811 	    i__1 = *kb - k + 1;
812 	    for (l = *ka - 1; l >= i__1; --l) {
813 		nrt = (*n - j2 + l) / ka1;
814 		if (nrt > 0) {
815 		    dlartv_(&nrt, &ab[ka1 - l + 1 + j2 * ab_dim1], &inca, &ab[
816 			    ka1 - l + (j2 + 1) * ab_dim1], &inca, &work[*n +
817 			    j2 - m], &work[j2 - m], &ka1);
818 		}
819 /* L340: */
820 	    }
821 
822 	    if (wantx) {
823 
824 /*              post-multiply X by product of rotations in 1st set */
825 
826 		i__1 = j1;
827 		i__3 = ka1;
828 		for (j = j2; i__3 < 0 ? j >= i__1 : j <= i__1; j += i__3) {
829 		    i__2 = *n - m;
830 		    drot_(&i__2, &x[m + 1 + j * x_dim1], &c__1, &x[m + 1 + (j
831 			    + 1) * x_dim1], &c__1, &work[*n + j - m], &work[j
832 			    - m]);
833 /* L350: */
834 		}
835 	    }
836 /* L360: */
837 	}
838 
839 	if (update) {
840 	    if (i2 <= *n && kbt > 0) {
841 
842 /*              create nonzero element a(i-kbt+ka+1,i-kbt) outside the */
843 /*              band and store it in WORK(i-kbt) */
844 
845 		work[i__ - kbt] = -bb[kbt + 1 + (i__ - kbt) * bb_dim1] * ra1;
846 	    }
847 	}
848 
849 	for (k = *kb; k >= 1; --k) {
850 	    if (update) {
851 /* Computing MAX */
852 		i__4 = 2, i__3 = k - i0 + 1;
853 		j2 = i__ - k - 1 + max(i__4,i__3) * ka1;
854 	    } else {
855 /* Computing MAX */
856 		i__4 = 1, i__3 = k - i0 + 1;
857 		j2 = i__ - k - 1 + max(i__4,i__3) * ka1;
858 	    }
859 
860 /*           finish applying rotations in 2nd set from the right */
861 
862 	    for (l = *kb - k; l >= 1; --l) {
863 		nrt = (*n - j2 + *ka + l) / ka1;
864 		if (nrt > 0) {
865 		    dlartv_(&nrt, &ab[ka1 - l + 1 + (j2 - *ka) * ab_dim1], &
866 			    inca, &ab[ka1 - l + (j2 - *ka + 1) * ab_dim1], &
867 			    inca, &work[*n + j2 - *ka], &work[j2 - *ka], &ka1)
868 			    ;
869 		}
870 /* L370: */
871 	    }
872 	    nr = (*n - j2 + *ka) / ka1;
873 	    j1 = j2 + (nr - 1) * ka1;
874 	    i__4 = j2;
875 	    i__3 = -ka1;
876 	    for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) {
877 		work[j] = work[j - *ka];
878 		work[*n + j] = work[*n + j - *ka];
879 /* L380: */
880 	    }
881 	    i__3 = j1;
882 	    i__4 = ka1;
883 	    for (j = j2; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) {
884 
885 /*              create nonzero element a(j+1,j-ka) outside the band */
886 /*              and store it in WORK(j) */
887 
888 		work[j] *= ab[ka1 + (j - *ka + 1) * ab_dim1];
889 		ab[ka1 + (j - *ka + 1) * ab_dim1] = work[*n + j] * ab[ka1 + (
890 			j - *ka + 1) * ab_dim1];
891 /* L390: */
892 	    }
893 	    if (update) {
894 		if (i__ - k < *n - *ka && k <= kbt) {
895 		    work[i__ - k + *ka] = work[i__ - k];
896 		}
897 	    }
898 /* L400: */
899 	}
900 
901 	for (k = *kb; k >= 1; --k) {
902 /* Computing MAX */
903 	    i__4 = 1, i__3 = k - i0 + 1;
904 	    j2 = i__ - k - 1 + max(i__4,i__3) * ka1;
905 	    nr = (*n - j2 + *ka) / ka1;
906 	    j1 = j2 + (nr - 1) * ka1;
907 	    if (nr > 0) {
908 
909 /*              generate rotations in 2nd set to annihilate elements */
910 /*              which have been created outside the band */
911 
912 		dlargv_(&nr, &ab[ka1 + (j2 - *ka) * ab_dim1], &inca, &work[j2]
913 			, &ka1, &work[*n + j2], &ka1);
914 
915 /*              apply rotations in 2nd set from the left */
916 
917 		i__4 = *ka - 1;
918 		for (l = 1; l <= i__4; ++l) {
919 		    dlartv_(&nr, &ab[l + 1 + (j2 - l) * ab_dim1], &inca, &ab[
920 			    l + 2 + (j2 - l) * ab_dim1], &inca, &work[*n + j2]
921 			    , &work[j2], &ka1);
922 /* L410: */
923 		}
924 
925 /*              apply rotations in 2nd set from both sides to diagonal */
926 /*              blocks */
927 
928 		dlar2v_(&nr, &ab[j2 * ab_dim1 + 1], &ab[(j2 + 1) * ab_dim1 +
929 			1], &ab[j2 * ab_dim1 + 2], &inca, &work[*n + j2], &
930 			work[j2], &ka1);
931 
932 	    }
933 
934 /*           start applying rotations in 2nd set from the right */
935 
936 	    i__4 = *kb - k + 1;
937 	    for (l = *ka - 1; l >= i__4; --l) {
938 		nrt = (*n - j2 + l) / ka1;
939 		if (nrt > 0) {
940 		    dlartv_(&nrt, &ab[ka1 - l + 1 + j2 * ab_dim1], &inca, &ab[
941 			    ka1 - l + (j2 + 1) * ab_dim1], &inca, &work[*n +
942 			    j2], &work[j2], &ka1);
943 		}
944 /* L420: */
945 	    }
946 
947 	    if (wantx) {
948 
949 /*              post-multiply X by product of rotations in 2nd set */
950 
951 		i__4 = j1;
952 		i__3 = ka1;
953 		for (j = j2; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) {
954 		    i__1 = *n - m;
955 		    drot_(&i__1, &x[m + 1 + j * x_dim1], &c__1, &x[m + 1 + (j
956 			    + 1) * x_dim1], &c__1, &work[*n + j], &work[j]);
957 /* L430: */
958 		}
959 	    }
960 /* L440: */
961 	}
962 
963 	i__3 = *kb - 1;
964 	for (k = 1; k <= i__3; ++k) {
965 /* Computing MAX */
966 	    i__4 = 1, i__1 = k - i0 + 2;
967 	    j2 = i__ - k - 1 + max(i__4,i__1) * ka1;
968 
969 /*           finish applying rotations in 1st set from the right */
970 
971 	    for (l = *kb - k; l >= 1; --l) {
972 		nrt = (*n - j2 + l) / ka1;
973 		if (nrt > 0) {
974 		    dlartv_(&nrt, &ab[ka1 - l + 1 + j2 * ab_dim1], &inca, &ab[
975 			    ka1 - l + (j2 + 1) * ab_dim1], &inca, &work[*n +
976 			    j2 - m], &work[j2 - m], &ka1);
977 		}
978 /* L450: */
979 	    }
980 /* L460: */
981 	}
982 
983 	if (*kb > 1) {
984 	    i__3 = i__ - *kb + (*ka << 1) + 1;
985 	    for (j = *n - 1; j >= i__3; --j) {
986 		work[*n + j - m] = work[*n + j - *ka - m];
987 		work[j - m] = work[j - *ka - m];
988 /* L470: */
989 	    }
990 	}
991 
992     }
993 
994     goto L10;
995 
996 L480:
997 
998 /*     **************************** Phase 2 ***************************** */
999 
1000 /*     The logical structure of this phase is: */
1001 
1002 /*     UPDATE = .TRUE. */
1003 /*     DO I = 1, M */
1004 /*        use S(i) to update A and create a new bulge */
1005 /*        apply rotations to push all bulges KA positions upward */
1006 /*     END DO */
1007 /*     UPDATE = .FALSE. */
1008 /*     DO I = M - KA - 1, 2, -1 */
1009 /*        apply rotations to push all bulges KA positions upward */
1010 /*     END DO */
1011 
1012 /*     To avoid duplicating code, the two loops are merged. */
1013 
1014     update = TRUE_;
1015     i__ = 0;
1016 L490:
1017     if (update) {
1018 	++i__;
1019 /* Computing MIN */
1020 	i__3 = *kb, i__4 = m - i__;
1021 	kbt = min(i__3,i__4);
1022 	i0 = i__ + 1;
1023 /* Computing MAX */
1024 	i__3 = 1, i__4 = i__ - *ka;
1025 	i1 = max(i__3,i__4);
1026 	i2 = i__ + kbt - ka1;
1027 	if (i__ > m) {
1028 	    update = FALSE_;
1029 	    --i__;
1030 	    i0 = m + 1;
1031 	    if (*ka == 0) {
1032 		return 0;
1033 	    }
1034 	    goto L490;
1035 	}
1036     } else {
1037 	i__ -= *ka;
1038 	if (i__ < 2) {
1039 	    return 0;
1040 	}
1041     }
1042 
1043     if (i__ < m - kbt) {
1044 	nx = m;
1045     } else {
1046 	nx = *n;
1047     }
1048 
1049     if (upper) {
1050 
1051 /*        Transform A, working with the upper triangle */
1052 
1053 	if (update) {
1054 
1055 /*           Form  inv(S(i))**T * A * inv(S(i)) */
1056 
1057 	    bii = bb[kb1 + i__ * bb_dim1];
1058 	    i__3 = i__;
1059 	    for (j = i1; j <= i__3; ++j) {
1060 		ab[j - i__ + ka1 + i__ * ab_dim1] /= bii;
1061 /* L500: */
1062 	    }
1063 /* Computing MIN */
1064 	    i__4 = *n, i__1 = i__ + *ka;
1065 	    i__3 = min(i__4,i__1);
1066 	    for (j = i__; j <= i__3; ++j) {
1067 		ab[i__ - j + ka1 + j * ab_dim1] /= bii;
1068 /* L510: */
1069 	    }
1070 	    i__3 = i__ + kbt;
1071 	    for (k = i__ + 1; k <= i__3; ++k) {
1072 		i__4 = i__ + kbt;
1073 		for (j = k; j <= i__4; ++j) {
1074 		    ab[k - j + ka1 + j * ab_dim1] = ab[k - j + ka1 + j *
1075 			    ab_dim1] - bb[i__ - j + kb1 + j * bb_dim1] * ab[
1076 			    i__ - k + ka1 + k * ab_dim1] - bb[i__ - k + kb1 +
1077 			    k * bb_dim1] * ab[i__ - j + ka1 + j * ab_dim1] +
1078 			    ab[ka1 + i__ * ab_dim1] * bb[i__ - j + kb1 + j *
1079 			    bb_dim1] * bb[i__ - k + kb1 + k * bb_dim1];
1080 /* L520: */
1081 		}
1082 /* Computing MIN */
1083 		i__1 = *n, i__2 = i__ + *ka;
1084 		i__4 = min(i__1,i__2);
1085 		for (j = i__ + kbt + 1; j <= i__4; ++j) {
1086 		    ab[k - j + ka1 + j * ab_dim1] -= bb[i__ - k + kb1 + k *
1087 			    bb_dim1] * ab[i__ - j + ka1 + j * ab_dim1];
1088 /* L530: */
1089 		}
1090 /* L540: */
1091 	    }
1092 	    i__3 = i__;
1093 	    for (j = i1; j <= i__3; ++j) {
1094 /* Computing MIN */
1095 		i__1 = j + *ka, i__2 = i__ + kbt;
1096 		i__4 = min(i__1,i__2);
1097 		for (k = i__ + 1; k <= i__4; ++k) {
1098 		    ab[j - k + ka1 + k * ab_dim1] -= bb[i__ - k + kb1 + k *
1099 			    bb_dim1] * ab[j - i__ + ka1 + i__ * ab_dim1];
1100 /* L550: */
1101 		}
1102 /* L560: */
1103 	    }
1104 
1105 	    if (wantx) {
1106 
1107 /*              post-multiply X by inv(S(i)) */
1108 
1109 		d__1 = 1. / bii;
1110 		dscal_(&nx, &d__1, &x[i__ * x_dim1 + 1], &c__1);
1111 		if (kbt > 0) {
1112 		    i__3 = *ldbb - 1;
1113 		    dger_(&nx, &kbt, &c_b20, &x[i__ * x_dim1 + 1], &c__1, &bb[
1114 			    *kb + (i__ + 1) * bb_dim1], &i__3, &x[(i__ + 1) *
1115 			    x_dim1 + 1], ldx);
1116 		}
1117 	    }
1118 
1119 /*           store a(i1,i) in RA1 for use in next loop over K */
1120 
1121 	    ra1 = ab[i1 - i__ + ka1 + i__ * ab_dim1];
1122 	}
1123 
1124 /*        Generate and apply vectors of rotations to chase all the */
1125 /*        existing bulges KA positions up toward the top of the band */
1126 
1127 	i__3 = *kb - 1;
1128 	for (k = 1; k <= i__3; ++k) {
1129 	    if (update) {
1130 
1131 /*              Determine the rotations which would annihilate the bulge */
1132 /*              which has in theory just been created */
1133 
1134 		if (i__ + k - ka1 > 0 && i__ + k < m) {
1135 
1136 /*                 generate rotation to annihilate a(i+k-ka-1,i) */
1137 
1138 		    dlartg_(&ab[k + 1 + i__ * ab_dim1], &ra1, &work[*n + i__
1139 			    + k - *ka], &work[i__ + k - *ka], &ra);
1140 
1141 /*                 create nonzero element a(i+k-ka-1,i+k) outside the */
1142 /*                 band and store it in WORK(m-kb+i+k) */
1143 
1144 		    t = -bb[kb1 - k + (i__ + k) * bb_dim1] * ra1;
1145 		    work[m - *kb + i__ + k] = work[*n + i__ + k - *ka] * t -
1146 			    work[i__ + k - *ka] * ab[(i__ + k) * ab_dim1 + 1];
1147 		    ab[(i__ + k) * ab_dim1 + 1] = work[i__ + k - *ka] * t +
1148 			    work[*n + i__ + k - *ka] * ab[(i__ + k) * ab_dim1
1149 			    + 1];
1150 		    ra1 = ra;
1151 		}
1152 	    }
1153 /* Computing MAX */
1154 	    i__4 = 1, i__1 = k + i0 - m + 1;
1155 	    j2 = i__ + k + 1 - max(i__4,i__1) * ka1;
1156 	    nr = (j2 + *ka - 1) / ka1;
1157 	    j1 = j2 - (nr - 1) * ka1;
1158 	    if (update) {
1159 /* Computing MIN */
1160 		i__4 = j2, i__1 = i__ - (*ka << 1) + k - 1;
1161 		j2t = min(i__4,i__1);
1162 	    } else {
1163 		j2t = j2;
1164 	    }
1165 	    nrt = (j2t + *ka - 1) / ka1;
1166 	    i__4 = j2t;
1167 	    i__1 = ka1;
1168 	    for (j = j1; i__1 < 0 ? j >= i__4 : j <= i__4; j += i__1) {
1169 
1170 /*              create nonzero element a(j-1,j+ka) outside the band */
1171 /*              and store it in WORK(j) */
1172 
1173 		work[j] *= ab[(j + *ka - 1) * ab_dim1 + 1];
1174 		ab[(j + *ka - 1) * ab_dim1 + 1] = work[*n + j] * ab[(j + *ka
1175 			- 1) * ab_dim1 + 1];
1176 /* L570: */
1177 	    }
1178 
1179 /*           generate rotations in 1st set to annihilate elements which */
1180 /*           have been created outside the band */
1181 
1182 	    if (nrt > 0) {
1183 		dlargv_(&nrt, &ab[(j1 + *ka) * ab_dim1 + 1], &inca, &work[j1],
1184 			 &ka1, &work[*n + j1], &ka1);
1185 	    }
1186 	    if (nr > 0) {
1187 
1188 /*              apply rotations in 1st set from the left */
1189 
1190 		i__1 = *ka - 1;
1191 		for (l = 1; l <= i__1; ++l) {
1192 		    dlartv_(&nr, &ab[ka1 - l + (j1 + l) * ab_dim1], &inca, &
1193 			    ab[*ka - l + (j1 + l) * ab_dim1], &inca, &work[*n
1194 			    + j1], &work[j1], &ka1);
1195 /* L580: */
1196 		}
1197 
1198 /*              apply rotations in 1st set from both sides to diagonal */
1199 /*              blocks */
1200 
1201 		dlar2v_(&nr, &ab[ka1 + j1 * ab_dim1], &ab[ka1 + (j1 - 1) *
1202 			ab_dim1], &ab[*ka + j1 * ab_dim1], &inca, &work[*n +
1203 			j1], &work[j1], &ka1);
1204 
1205 	    }
1206 
1207 /*           start applying rotations in 1st set from the right */
1208 
1209 	    i__1 = *kb - k + 1;
1210 	    for (l = *ka - 1; l >= i__1; --l) {
1211 		nrt = (j2 + l - 1) / ka1;
1212 		j1t = j2 - (nrt - 1) * ka1;
1213 		if (nrt > 0) {
1214 		    dlartv_(&nrt, &ab[l + j1t * ab_dim1], &inca, &ab[l + 1 + (
1215 			    j1t - 1) * ab_dim1], &inca, &work[*n + j1t], &
1216 			    work[j1t], &ka1);
1217 		}
1218 /* L590: */
1219 	    }
1220 
1221 	    if (wantx) {
1222 
1223 /*              post-multiply X by product of rotations in 1st set */
1224 
1225 		i__1 = j2;
1226 		i__4 = ka1;
1227 		for (j = j1; i__4 < 0 ? j >= i__1 : j <= i__1; j += i__4) {
1228 		    drot_(&nx, &x[j * x_dim1 + 1], &c__1, &x[(j - 1) * x_dim1
1229 			    + 1], &c__1, &work[*n + j], &work[j]);
1230 /* L600: */
1231 		}
1232 	    }
1233 /* L610: */
1234 	}
1235 
1236 	if (update) {
1237 	    if (i2 > 0 && kbt > 0) {
1238 
1239 /*              create nonzero element a(i+kbt-ka-1,i+kbt) outside the */
1240 /*              band and store it in WORK(m-kb+i+kbt) */
1241 
1242 		work[m - *kb + i__ + kbt] = -bb[kb1 - kbt + (i__ + kbt) *
1243 			bb_dim1] * ra1;
1244 	    }
1245 	}
1246 
1247 	for (k = *kb; k >= 1; --k) {
1248 	    if (update) {
1249 /* Computing MAX */
1250 		i__3 = 2, i__4 = k + i0 - m;
1251 		j2 = i__ + k + 1 - max(i__3,i__4) * ka1;
1252 	    } else {
1253 /* Computing MAX */
1254 		i__3 = 1, i__4 = k + i0 - m;
1255 		j2 = i__ + k + 1 - max(i__3,i__4) * ka1;
1256 	    }
1257 
1258 /*           finish applying rotations in 2nd set from the right */
1259 
1260 	    for (l = *kb - k; l >= 1; --l) {
1261 		nrt = (j2 + *ka + l - 1) / ka1;
1262 		j1t = j2 - (nrt - 1) * ka1;
1263 		if (nrt > 0) {
1264 		    dlartv_(&nrt, &ab[l + (j1t + *ka) * ab_dim1], &inca, &ab[
1265 			    l + 1 + (j1t + *ka - 1) * ab_dim1], &inca, &work[*
1266 			    n + m - *kb + j1t + *ka], &work[m - *kb + j1t + *
1267 			    ka], &ka1);
1268 		}
1269 /* L620: */
1270 	    }
1271 	    nr = (j2 + *ka - 1) / ka1;
1272 	    j1 = j2 - (nr - 1) * ka1;
1273 	    i__3 = j2;
1274 	    i__4 = ka1;
1275 	    for (j = j1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) {
1276 		work[m - *kb + j] = work[m - *kb + j + *ka];
1277 		work[*n + m - *kb + j] = work[*n + m - *kb + j + *ka];
1278 /* L630: */
1279 	    }
1280 	    i__4 = j2;
1281 	    i__3 = ka1;
1282 	    for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) {
1283 
1284 /*              create nonzero element a(j-1,j+ka) outside the band */
1285 /*              and store it in WORK(m-kb+j) */
1286 
1287 		work[m - *kb + j] *= ab[(j + *ka - 1) * ab_dim1 + 1];
1288 		ab[(j + *ka - 1) * ab_dim1 + 1] = work[*n + m - *kb + j] * ab[
1289 			(j + *ka - 1) * ab_dim1 + 1];
1290 /* L640: */
1291 	    }
1292 	    if (update) {
1293 		if (i__ + k > ka1 && k <= kbt) {
1294 		    work[m - *kb + i__ + k - *ka] = work[m - *kb + i__ + k];
1295 		}
1296 	    }
1297 /* L650: */
1298 	}
1299 
1300 	for (k = *kb; k >= 1; --k) {
1301 /* Computing MAX */
1302 	    i__3 = 1, i__4 = k + i0 - m;
1303 	    j2 = i__ + k + 1 - max(i__3,i__4) * ka1;
1304 	    nr = (j2 + *ka - 1) / ka1;
1305 	    j1 = j2 - (nr - 1) * ka1;
1306 	    if (nr > 0) {
1307 
1308 /*              generate rotations in 2nd set to annihilate elements */
1309 /*              which have been created outside the band */
1310 
1311 		dlargv_(&nr, &ab[(j1 + *ka) * ab_dim1 + 1], &inca, &work[m - *
1312 			kb + j1], &ka1, &work[*n + m - *kb + j1], &ka1);
1313 
1314 /*              apply rotations in 2nd set from the left */
1315 
1316 		i__3 = *ka - 1;
1317 		for (l = 1; l <= i__3; ++l) {
1318 		    dlartv_(&nr, &ab[ka1 - l + (j1 + l) * ab_dim1], &inca, &
1319 			    ab[*ka - l + (j1 + l) * ab_dim1], &inca, &work[*n
1320 			    + m - *kb + j1], &work[m - *kb + j1], &ka1);
1321 /* L660: */
1322 		}
1323 
1324 /*              apply rotations in 2nd set from both sides to diagonal */
1325 /*              blocks */
1326 
1327 		dlar2v_(&nr, &ab[ka1 + j1 * ab_dim1], &ab[ka1 + (j1 - 1) *
1328 			ab_dim1], &ab[*ka + j1 * ab_dim1], &inca, &work[*n +
1329 			m - *kb + j1], &work[m - *kb + j1], &ka1);
1330 
1331 	    }
1332 
1333 /*           start applying rotations in 2nd set from the right */
1334 
1335 	    i__3 = *kb - k + 1;
1336 	    for (l = *ka - 1; l >= i__3; --l) {
1337 		nrt = (j2 + l - 1) / ka1;
1338 		j1t = j2 - (nrt - 1) * ka1;
1339 		if (nrt > 0) {
1340 		    dlartv_(&nrt, &ab[l + j1t * ab_dim1], &inca, &ab[l + 1 + (
1341 			    j1t - 1) * ab_dim1], &inca, &work[*n + m - *kb +
1342 			    j1t], &work[m - *kb + j1t], &ka1);
1343 		}
1344 /* L670: */
1345 	    }
1346 
1347 	    if (wantx) {
1348 
1349 /*              post-multiply X by product of rotations in 2nd set */
1350 
1351 		i__3 = j2;
1352 		i__4 = ka1;
1353 		for (j = j1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) {
1354 		    drot_(&nx, &x[j * x_dim1 + 1], &c__1, &x[(j - 1) * x_dim1
1355 			    + 1], &c__1, &work[*n + m - *kb + j], &work[m - *
1356 			    kb + j]);
1357 /* L680: */
1358 		}
1359 	    }
1360 /* L690: */
1361 	}
1362 
1363 	i__4 = *kb - 1;
1364 	for (k = 1; k <= i__4; ++k) {
1365 /* Computing MAX */
1366 	    i__3 = 1, i__1 = k + i0 - m + 1;
1367 	    j2 = i__ + k + 1 - max(i__3,i__1) * ka1;
1368 
1369 /*           finish applying rotations in 1st set from the right */
1370 
1371 	    for (l = *kb - k; l >= 1; --l) {
1372 		nrt = (j2 + l - 1) / ka1;
1373 		j1t = j2 - (nrt - 1) * ka1;
1374 		if (nrt > 0) {
1375 		    dlartv_(&nrt, &ab[l + j1t * ab_dim1], &inca, &ab[l + 1 + (
1376 			    j1t - 1) * ab_dim1], &inca, &work[*n + j1t], &
1377 			    work[j1t], &ka1);
1378 		}
1379 /* L700: */
1380 	    }
1381 /* L710: */
1382 	}
1383 
1384 	if (*kb > 1) {
1385 /* Computing MIN */
1386 	    i__3 = i__ + *kb;
1387 	    i__4 = min(i__3,m) - (*ka << 1) - 1;
1388 	    for (j = 2; j <= i__4; ++j) {
1389 		work[*n + j] = work[*n + j + *ka];
1390 		work[j] = work[j + *ka];
1391 /* L720: */
1392 	    }
1393 	}
1394 
1395     } else {
1396 
1397 /*        Transform A, working with the lower triangle */
1398 
1399 	if (update) {
1400 
1401 /*           Form  inv(S(i))**T * A * inv(S(i)) */
1402 
1403 	    bii = bb[i__ * bb_dim1 + 1];
1404 	    i__4 = i__;
1405 	    for (j = i1; j <= i__4; ++j) {
1406 		ab[i__ - j + 1 + j * ab_dim1] /= bii;
1407 /* L730: */
1408 	    }
1409 /* Computing MIN */
1410 	    i__3 = *n, i__1 = i__ + *ka;
1411 	    i__4 = min(i__3,i__1);
1412 	    for (j = i__; j <= i__4; ++j) {
1413 		ab[j - i__ + 1 + i__ * ab_dim1] /= bii;
1414 /* L740: */
1415 	    }
1416 	    i__4 = i__ + kbt;
1417 	    for (k = i__ + 1; k <= i__4; ++k) {
1418 		i__3 = i__ + kbt;
1419 		for (j = k; j <= i__3; ++j) {
1420 		    ab[j - k + 1 + k * ab_dim1] = ab[j - k + 1 + k * ab_dim1]
1421 			    - bb[j - i__ + 1 + i__ * bb_dim1] * ab[k - i__ +
1422 			    1 + i__ * ab_dim1] - bb[k - i__ + 1 + i__ *
1423 			    bb_dim1] * ab[j - i__ + 1 + i__ * ab_dim1] + ab[
1424 			    i__ * ab_dim1 + 1] * bb[j - i__ + 1 + i__ *
1425 			    bb_dim1] * bb[k - i__ + 1 + i__ * bb_dim1];
1426 /* L750: */
1427 		}
1428 /* Computing MIN */
1429 		i__1 = *n, i__2 = i__ + *ka;
1430 		i__3 = min(i__1,i__2);
1431 		for (j = i__ + kbt + 1; j <= i__3; ++j) {
1432 		    ab[j - k + 1 + k * ab_dim1] -= bb[k - i__ + 1 + i__ *
1433 			    bb_dim1] * ab[j - i__ + 1 + i__ * ab_dim1];
1434 /* L760: */
1435 		}
1436 /* L770: */
1437 	    }
1438 	    i__4 = i__;
1439 	    for (j = i1; j <= i__4; ++j) {
1440 /* Computing MIN */
1441 		i__1 = j + *ka, i__2 = i__ + kbt;
1442 		i__3 = min(i__1,i__2);
1443 		for (k = i__ + 1; k <= i__3; ++k) {
1444 		    ab[k - j + 1 + j * ab_dim1] -= bb[k - i__ + 1 + i__ *
1445 			    bb_dim1] * ab[i__ - j + 1 + j * ab_dim1];
1446 /* L780: */
1447 		}
1448 /* L790: */
1449 	    }
1450 
1451 	    if (wantx) {
1452 
1453 /*              post-multiply X by inv(S(i)) */
1454 
1455 		d__1 = 1. / bii;
1456 		dscal_(&nx, &d__1, &x[i__ * x_dim1 + 1], &c__1);
1457 		if (kbt > 0) {
1458 		    dger_(&nx, &kbt, &c_b20, &x[i__ * x_dim1 + 1], &c__1, &bb[
1459 			    i__ * bb_dim1 + 2], &c__1, &x[(i__ + 1) * x_dim1
1460 			    + 1], ldx);
1461 		}
1462 	    }
1463 
1464 /*           store a(i,i1) in RA1 for use in next loop over K */
1465 
1466 	    ra1 = ab[i__ - i1 + 1 + i1 * ab_dim1];
1467 	}
1468 
1469 /*        Generate and apply vectors of rotations to chase all the */
1470 /*        existing bulges KA positions up toward the top of the band */
1471 
1472 	i__4 = *kb - 1;
1473 	for (k = 1; k <= i__4; ++k) {
1474 	    if (update) {
1475 
1476 /*              Determine the rotations which would annihilate the bulge */
1477 /*              which has in theory just been created */
1478 
1479 		if (i__ + k - ka1 > 0 && i__ + k < m) {
1480 
1481 /*                 generate rotation to annihilate a(i,i+k-ka-1) */
1482 
1483 		    dlartg_(&ab[ka1 - k + (i__ + k - *ka) * ab_dim1], &ra1, &
1484 			    work[*n + i__ + k - *ka], &work[i__ + k - *ka], &
1485 			    ra);
1486 
1487 /*                 create nonzero element a(i+k,i+k-ka-1) outside the */
1488 /*                 band and store it in WORK(m-kb+i+k) */
1489 
1490 		    t = -bb[k + 1 + i__ * bb_dim1] * ra1;
1491 		    work[m - *kb + i__ + k] = work[*n + i__ + k - *ka] * t -
1492 			    work[i__ + k - *ka] * ab[ka1 + (i__ + k - *ka) *
1493 			    ab_dim1];
1494 		    ab[ka1 + (i__ + k - *ka) * ab_dim1] = work[i__ + k - *ka]
1495 			    * t + work[*n + i__ + k - *ka] * ab[ka1 + (i__ +
1496 			    k - *ka) * ab_dim1];
1497 		    ra1 = ra;
1498 		}
1499 	    }
1500 /* Computing MAX */
1501 	    i__3 = 1, i__1 = k + i0 - m + 1;
1502 	    j2 = i__ + k + 1 - max(i__3,i__1) * ka1;
1503 	    nr = (j2 + *ka - 1) / ka1;
1504 	    j1 = j2 - (nr - 1) * ka1;
1505 	    if (update) {
1506 /* Computing MIN */
1507 		i__3 = j2, i__1 = i__ - (*ka << 1) + k - 1;
1508 		j2t = min(i__3,i__1);
1509 	    } else {
1510 		j2t = j2;
1511 	    }
1512 	    nrt = (j2t + *ka - 1) / ka1;
1513 	    i__3 = j2t;
1514 	    i__1 = ka1;
1515 	    for (j = j1; i__1 < 0 ? j >= i__3 : j <= i__3; j += i__1) {
1516 
1517 /*              create nonzero element a(j+ka,j-1) outside the band */
1518 /*              and store it in WORK(j) */
1519 
1520 		work[j] *= ab[ka1 + (j - 1) * ab_dim1];
1521 		ab[ka1 + (j - 1) * ab_dim1] = work[*n + j] * ab[ka1 + (j - 1)
1522 			* ab_dim1];
1523 /* L800: */
1524 	    }
1525 
1526 /*           generate rotations in 1st set to annihilate elements which */
1527 /*           have been created outside the band */
1528 
1529 	    if (nrt > 0) {
1530 		dlargv_(&nrt, &ab[ka1 + j1 * ab_dim1], &inca, &work[j1], &ka1,
1531 			 &work[*n + j1], &ka1);
1532 	    }
1533 	    if (nr > 0) {
1534 
1535 /*              apply rotations in 1st set from the right */
1536 
1537 		i__1 = *ka - 1;
1538 		for (l = 1; l <= i__1; ++l) {
1539 		    dlartv_(&nr, &ab[l + 1 + j1 * ab_dim1], &inca, &ab[l + 2
1540 			    + (j1 - 1) * ab_dim1], &inca, &work[*n + j1], &
1541 			    work[j1], &ka1);
1542 /* L810: */
1543 		}
1544 
1545 /*              apply rotations in 1st set from both sides to diagonal */
1546 /*              blocks */
1547 
1548 		dlar2v_(&nr, &ab[j1 * ab_dim1 + 1], &ab[(j1 - 1) * ab_dim1 +
1549 			1], &ab[(j1 - 1) * ab_dim1 + 2], &inca, &work[*n + j1]
1550 			, &work[j1], &ka1);
1551 
1552 	    }
1553 
1554 /*           start applying rotations in 1st set from the left */
1555 
1556 	    i__1 = *kb - k + 1;
1557 	    for (l = *ka - 1; l >= i__1; --l) {
1558 		nrt = (j2 + l - 1) / ka1;
1559 		j1t = j2 - (nrt - 1) * ka1;
1560 		if (nrt > 0) {
1561 		    dlartv_(&nrt, &ab[ka1 - l + 1 + (j1t - ka1 + l) * ab_dim1]
1562 			    , &inca, &ab[ka1 - l + (j1t - ka1 + l) * ab_dim1],
1563 			     &inca, &work[*n + j1t], &work[j1t], &ka1);
1564 		}
1565 /* L820: */
1566 	    }
1567 
1568 	    if (wantx) {
1569 
1570 /*              post-multiply X by product of rotations in 1st set */
1571 
1572 		i__1 = j2;
1573 		i__3 = ka1;
1574 		for (j = j1; i__3 < 0 ? j >= i__1 : j <= i__1; j += i__3) {
1575 		    drot_(&nx, &x[j * x_dim1 + 1], &c__1, &x[(j - 1) * x_dim1
1576 			    + 1], &c__1, &work[*n + j], &work[j]);
1577 /* L830: */
1578 		}
1579 	    }
1580 /* L840: */
1581 	}
1582 
1583 	if (update) {
1584 	    if (i2 > 0 && kbt > 0) {
1585 
1586 /*              create nonzero element a(i+kbt,i+kbt-ka-1) outside the */
1587 /*              band and store it in WORK(m-kb+i+kbt) */
1588 
1589 		work[m - *kb + i__ + kbt] = -bb[kbt + 1 + i__ * bb_dim1] *
1590 			ra1;
1591 	    }
1592 	}
1593 
1594 	for (k = *kb; k >= 1; --k) {
1595 	    if (update) {
1596 /* Computing MAX */
1597 		i__4 = 2, i__3 = k + i0 - m;
1598 		j2 = i__ + k + 1 - max(i__4,i__3) * ka1;
1599 	    } else {
1600 /* Computing MAX */
1601 		i__4 = 1, i__3 = k + i0 - m;
1602 		j2 = i__ + k + 1 - max(i__4,i__3) * ka1;
1603 	    }
1604 
1605 /*           finish applying rotations in 2nd set from the left */
1606 
1607 	    for (l = *kb - k; l >= 1; --l) {
1608 		nrt = (j2 + *ka + l - 1) / ka1;
1609 		j1t = j2 - (nrt - 1) * ka1;
1610 		if (nrt > 0) {
1611 		    dlartv_(&nrt, &ab[ka1 - l + 1 + (j1t + l - 1) * ab_dim1],
1612 			    &inca, &ab[ka1 - l + (j1t + l - 1) * ab_dim1], &
1613 			    inca, &work[*n + m - *kb + j1t + *ka], &work[m - *
1614 			    kb + j1t + *ka], &ka1);
1615 		}
1616 /* L850: */
1617 	    }
1618 	    nr = (j2 + *ka - 1) / ka1;
1619 	    j1 = j2 - (nr - 1) * ka1;
1620 	    i__4 = j2;
1621 	    i__3 = ka1;
1622 	    for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) {
1623 		work[m - *kb + j] = work[m - *kb + j + *ka];
1624 		work[*n + m - *kb + j] = work[*n + m - *kb + j + *ka];
1625 /* L860: */
1626 	    }
1627 	    i__3 = j2;
1628 	    i__4 = ka1;
1629 	    for (j = j1; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) {
1630 
1631 /*              create nonzero element a(j+ka,j-1) outside the band */
1632 /*              and store it in WORK(m-kb+j) */
1633 
1634 		work[m - *kb + j] *= ab[ka1 + (j - 1) * ab_dim1];
1635 		ab[ka1 + (j - 1) * ab_dim1] = work[*n + m - *kb + j] * ab[ka1
1636 			+ (j - 1) * ab_dim1];
1637 /* L870: */
1638 	    }
1639 	    if (update) {
1640 		if (i__ + k > ka1 && k <= kbt) {
1641 		    work[m - *kb + i__ + k - *ka] = work[m - *kb + i__ + k];
1642 		}
1643 	    }
1644 /* L880: */
1645 	}
1646 
1647 	for (k = *kb; k >= 1; --k) {
1648 /* Computing MAX */
1649 	    i__4 = 1, i__3 = k + i0 - m;
1650 	    j2 = i__ + k + 1 - max(i__4,i__3) * ka1;
1651 	    nr = (j2 + *ka - 1) / ka1;
1652 	    j1 = j2 - (nr - 1) * ka1;
1653 	    if (nr > 0) {
1654 
1655 /*              generate rotations in 2nd set to annihilate elements */
1656 /*              which have been created outside the band */
1657 
1658 		dlargv_(&nr, &ab[ka1 + j1 * ab_dim1], &inca, &work[m - *kb +
1659 			j1], &ka1, &work[*n + m - *kb + j1], &ka1);
1660 
1661 /*              apply rotations in 2nd set from the right */
1662 
1663 		i__4 = *ka - 1;
1664 		for (l = 1; l <= i__4; ++l) {
1665 		    dlartv_(&nr, &ab[l + 1 + j1 * ab_dim1], &inca, &ab[l + 2
1666 			    + (j1 - 1) * ab_dim1], &inca, &work[*n + m - *kb
1667 			    + j1], &work[m - *kb + j1], &ka1);
1668 /* L890: */
1669 		}
1670 
1671 /*              apply rotations in 2nd set from both sides to diagonal */
1672 /*              blocks */
1673 
1674 		dlar2v_(&nr, &ab[j1 * ab_dim1 + 1], &ab[(j1 - 1) * ab_dim1 +
1675 			1], &ab[(j1 - 1) * ab_dim1 + 2], &inca, &work[*n + m
1676 			- *kb + j1], &work[m - *kb + j1], &ka1);
1677 
1678 	    }
1679 
1680 /*           start applying rotations in 2nd set from the left */
1681 
1682 	    i__4 = *kb - k + 1;
1683 	    for (l = *ka - 1; l >= i__4; --l) {
1684 		nrt = (j2 + l - 1) / ka1;
1685 		j1t = j2 - (nrt - 1) * ka1;
1686 		if (nrt > 0) {
1687 		    dlartv_(&nrt, &ab[ka1 - l + 1 + (j1t - ka1 + l) * ab_dim1]
1688 			    , &inca, &ab[ka1 - l + (j1t - ka1 + l) * ab_dim1],
1689 			     &inca, &work[*n + m - *kb + j1t], &work[m - *kb
1690 			    + j1t], &ka1);
1691 		}
1692 /* L900: */
1693 	    }
1694 
1695 	    if (wantx) {
1696 
1697 /*              post-multiply X by product of rotations in 2nd set */
1698 
1699 		i__4 = j2;
1700 		i__3 = ka1;
1701 		for (j = j1; i__3 < 0 ? j >= i__4 : j <= i__4; j += i__3) {
1702 		    drot_(&nx, &x[j * x_dim1 + 1], &c__1, &x[(j - 1) * x_dim1
1703 			    + 1], &c__1, &work[*n + m - *kb + j], &work[m - *
1704 			    kb + j]);
1705 /* L910: */
1706 		}
1707 	    }
1708 /* L920: */
1709 	}
1710 
1711 	i__3 = *kb - 1;
1712 	for (k = 1; k <= i__3; ++k) {
1713 /* Computing MAX */
1714 	    i__4 = 1, i__1 = k + i0 - m + 1;
1715 	    j2 = i__ + k + 1 - max(i__4,i__1) * ka1;
1716 
1717 /*           finish applying rotations in 1st set from the left */
1718 
1719 	    for (l = *kb - k; l >= 1; --l) {
1720 		nrt = (j2 + l - 1) / ka1;
1721 		j1t = j2 - (nrt - 1) * ka1;
1722 		if (nrt > 0) {
1723 		    dlartv_(&nrt, &ab[ka1 - l + 1 + (j1t - ka1 + l) * ab_dim1]
1724 			    , &inca, &ab[ka1 - l + (j1t - ka1 + l) * ab_dim1],
1725 			     &inca, &work[*n + j1t], &work[j1t], &ka1);
1726 		}
1727 /* L930: */
1728 	    }
1729 /* L940: */
1730 	}
1731 
1732 	if (*kb > 1) {
1733 /* Computing MIN */
1734 	    i__4 = i__ + *kb;
1735 	    i__3 = min(i__4,m) - (*ka << 1) - 1;
1736 	    for (j = 2; j <= i__3; ++j) {
1737 		work[*n + j] = work[*n + j + *ka];
1738 		work[j] = work[j + *ka];
1739 /* L950: */
1740 	    }
1741 	}
1742 
1743     }
1744 
1745     goto L490;
1746 
1747 /*     End of DSBGST */
1748 
1749 } /* dsbgst_ */
1750 
1751