1 /* zgbmv.f -- translated by f2c (version 20061008).
2    You must link the resulting object file with libf2c:
3 	on Microsoft Windows system, link with libf2c.lib;
4 	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
5 	or, if you install libf2c.a in a standard place, with -lf2c -lm
6 	-- in that order, at the end of the command line, as in
7 		cc *.o -lf2c -lm
8 	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
9 
10 		http://www.netlib.org/f2c/libf2c.zip
11 */
12 
13 #include "f2c.h"
14 #include "blaswrap.h"
15 
zgbmv_(char * trans,integer * m,integer * n,integer * kl,integer * ku,doublecomplex * alpha,doublecomplex * a,integer * lda,doublecomplex * x,integer * incx,doublecomplex * beta,doublecomplex * y,integer * incy)16 /* Subroutine */ int zgbmv_(char *trans, integer *m, integer *n, integer *kl,
17 	integer *ku, doublecomplex *alpha, doublecomplex *a, integer *lda,
18 	doublecomplex *x, integer *incx, doublecomplex *beta, doublecomplex *
19 	y, integer *incy)
20 {
21     /* System generated locals */
22     integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5, i__6;
23     doublecomplex z__1, z__2, z__3;
24 
25     /* Builtin functions */
26     void d_cnjg(doublecomplex *, doublecomplex *);
27 
28     /* Local variables */
29     integer i__, j, k, ix, iy, jx, jy, kx, ky, kup1, info;
30     doublecomplex temp;
31     integer lenx, leny;
32     extern logical lsame_(char *, char *);
33     extern /* Subroutine */ int xerbla_(char *, integer *);
34     logical noconj;
35 
36 /*     .. Scalar Arguments .. */
37 /*     .. */
38 /*     .. Array Arguments .. */
39 /*     .. */
40 
41 /*  Purpose */
42 /*  ======= */
43 
44 /*  ZGBMV  performs one of the matrix-vector operations */
45 
46 /*     y := alpha*A*x + beta*y,   or   y := alpha*A'*x + beta*y,   or */
47 
48 /*     y := alpha*conjg( A' )*x + beta*y, */
49 
50 /*  where alpha and beta are scalars, x and y are vectors and A is an */
51 /*  m by n band matrix, with kl sub-diagonals and ku super-diagonals. */
52 
53 /*  Arguments */
54 /*  ========== */
55 
56 /*  TRANS  - CHARACTER*1. */
57 /*           On entry, TRANS specifies the operation to be performed as */
58 /*           follows: */
59 
60 /*              TRANS = 'N' or 'n'   y := alpha*A*x + beta*y. */
61 
62 /*              TRANS = 'T' or 't'   y := alpha*A'*x + beta*y. */
63 
64 /*              TRANS = 'C' or 'c'   y := alpha*conjg( A' )*x + beta*y. */
65 
66 /*           Unchanged on exit. */
67 
68 /*  M      - INTEGER. */
69 /*           On entry, M specifies the number of rows of the matrix A. */
70 /*           M must be at least zero. */
71 /*           Unchanged on exit. */
72 
73 /*  N      - INTEGER. */
74 /*           On entry, N specifies the number of columns of the matrix A. */
75 /*           N must be at least zero. */
76 /*           Unchanged on exit. */
77 
78 /*  KL     - INTEGER. */
79 /*           On entry, KL specifies the number of sub-diagonals of the */
80 /*           matrix A. KL must satisfy  0 .le. KL. */
81 /*           Unchanged on exit. */
82 
83 /*  KU     - INTEGER. */
84 /*           On entry, KU specifies the number of super-diagonals of the */
85 /*           matrix A. KU must satisfy  0 .le. KU. */
86 /*           Unchanged on exit. */
87 
88 /*  ALPHA  - COMPLEX*16      . */
89 /*           On entry, ALPHA specifies the scalar alpha. */
90 /*           Unchanged on exit. */
91 
92 /*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ). */
93 /*           Before entry, the leading ( kl + ku + 1 ) by n part of the */
94 /*           array A must contain the matrix of coefficients, supplied */
95 /*           column by column, with the leading diagonal of the matrix in */
96 /*           row ( ku + 1 ) of the array, the first super-diagonal */
97 /*           starting at position 2 in row ku, the first sub-diagonal */
98 /*           starting at position 1 in row ( ku + 2 ), and so on. */
99 /*           Elements in the array A that do not correspond to elements */
100 /*           in the band matrix (such as the top left ku by ku triangle) */
101 /*           are not referenced. */
102 /*           The following program segment will transfer a band matrix */
103 /*           from conventional full matrix storage to band storage: */
104 
105 /*                 DO 20, J = 1, N */
106 /*                    K = KU + 1 - J */
107 /*                    DO 10, I = MAX( 1, J - KU ), MIN( M, J + KL ) */
108 /*                       A( K + I, J ) = matrix( I, J ) */
109 /*              10    CONTINUE */
110 /*              20 CONTINUE */
111 
112 /*           Unchanged on exit. */
113 
114 /*  LDA    - INTEGER. */
115 /*           On entry, LDA specifies the first dimension of A as declared */
116 /*           in the calling (sub) program. LDA must be at least */
117 /*           ( kl + ku + 1 ). */
118 /*           Unchanged on exit. */
119 
120 /*  X      - COMPLEX*16       array of DIMENSION at least */
121 /*           ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' */
122 /*           and at least */
123 /*           ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. */
124 /*           Before entry, the incremented array X must contain the */
125 /*           vector x. */
126 /*           Unchanged on exit. */
127 
128 /*  INCX   - INTEGER. */
129 /*           On entry, INCX specifies the increment for the elements of */
130 /*           X. INCX must not be zero. */
131 /*           Unchanged on exit. */
132 
133 /*  BETA   - COMPLEX*16      . */
134 /*           On entry, BETA specifies the scalar beta. When BETA is */
135 /*           supplied as zero then Y need not be set on input. */
136 /*           Unchanged on exit. */
137 
138 /*  Y      - COMPLEX*16       array of DIMENSION at least */
139 /*           ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' */
140 /*           and at least */
141 /*           ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. */
142 /*           Before entry, the incremented array Y must contain the */
143 /*           vector y. On exit, Y is overwritten by the updated vector y. */
144 
145 
146 /*  INCY   - INTEGER. */
147 /*           On entry, INCY specifies the increment for the elements of */
148 /*           Y. INCY must not be zero. */
149 /*           Unchanged on exit. */
150 
151 
152 /*  Level 2 Blas routine. */
153 
154 /*  -- Written on 22-October-1986. */
155 /*     Jack Dongarra, Argonne National Lab. */
156 /*     Jeremy Du Croz, Nag Central Office. */
157 /*     Sven Hammarling, Nag Central Office. */
158 /*     Richard Hanson, Sandia National Labs. */
159 
160 
161 /*     .. Parameters .. */
162 /*     .. */
163 /*     .. Local Scalars .. */
164 /*     .. */
165 /*     .. External Functions .. */
166 /*     .. */
167 /*     .. External Subroutines .. */
168 /*     .. */
169 /*     .. Intrinsic Functions .. */
170 /*     .. */
171 
172 /*     Test the input parameters. */
173 
174     /* Parameter adjustments */
175     a_dim1 = *lda;
176     a_offset = 1 + a_dim1;
177     a -= a_offset;
178     --x;
179     --y;
180 
181     /* Function Body */
182     info = 0;
183     if (! lsame_(trans, "N") && ! lsame_(trans, "T") && ! lsame_(trans, "C")
184 	    ) {
185 	info = 1;
186     } else if (*m < 0) {
187 	info = 2;
188     } else if (*n < 0) {
189 	info = 3;
190     } else if (*kl < 0) {
191 	info = 4;
192     } else if (*ku < 0) {
193 	info = 5;
194     } else if (*lda < *kl + *ku + 1) {
195 	info = 8;
196     } else if (*incx == 0) {
197 	info = 10;
198     } else if (*incy == 0) {
199 	info = 13;
200     }
201     if (info != 0) {
202 	xerbla_("ZGBMV ", &info);
203 	return 0;
204     }
205 
206 /*     Quick return if possible. */
207 
208     if (*m == 0 || *n == 0 || alpha->r == 0. && alpha->i == 0. && (beta->r ==
209 	    1. && beta->i == 0.)) {
210 	return 0;
211     }
212 
213     noconj = lsame_(trans, "T");
214 
215 /*     Set  LENX  and  LENY, the lengths of the vectors x and y, and set */
216 /*     up the start points in  X  and  Y. */
217 
218     if (lsame_(trans, "N")) {
219 	lenx = *n;
220 	leny = *m;
221     } else {
222 	lenx = *m;
223 	leny = *n;
224     }
225     if (*incx > 0) {
226 	kx = 1;
227     } else {
228 	kx = 1 - (lenx - 1) * *incx;
229     }
230     if (*incy > 0) {
231 	ky = 1;
232     } else {
233 	ky = 1 - (leny - 1) * *incy;
234     }
235 
236 /*     Start the operations. In this version the elements of A are */
237 /*     accessed sequentially with one pass through the band part of A. */
238 
239 /*     First form  y := beta*y. */
240 
241     if (beta->r != 1. || beta->i != 0.) {
242 	if (*incy == 1) {
243 	    if (beta->r == 0. && beta->i == 0.) {
244 		i__1 = leny;
245 		for (i__ = 1; i__ <= i__1; ++i__) {
246 		    i__2 = i__;
247 		    y[i__2].r = 0., y[i__2].i = 0.;
248 /* L10: */
249 		}
250 	    } else {
251 		i__1 = leny;
252 		for (i__ = 1; i__ <= i__1; ++i__) {
253 		    i__2 = i__;
254 		    i__3 = i__;
255 		    z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i,
256 			    z__1.i = beta->r * y[i__3].i + beta->i * y[i__3]
257 			    .r;
258 		    y[i__2].r = z__1.r, y[i__2].i = z__1.i;
259 /* L20: */
260 		}
261 	    }
262 	} else {
263 	    iy = ky;
264 	    if (beta->r == 0. && beta->i == 0.) {
265 		i__1 = leny;
266 		for (i__ = 1; i__ <= i__1; ++i__) {
267 		    i__2 = iy;
268 		    y[i__2].r = 0., y[i__2].i = 0.;
269 		    iy += *incy;
270 /* L30: */
271 		}
272 	    } else {
273 		i__1 = leny;
274 		for (i__ = 1; i__ <= i__1; ++i__) {
275 		    i__2 = iy;
276 		    i__3 = iy;
277 		    z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i,
278 			    z__1.i = beta->r * y[i__3].i + beta->i * y[i__3]
279 			    .r;
280 		    y[i__2].r = z__1.r, y[i__2].i = z__1.i;
281 		    iy += *incy;
282 /* L40: */
283 		}
284 	    }
285 	}
286     }
287     if (alpha->r == 0. && alpha->i == 0.) {
288 	return 0;
289     }
290     kup1 = *ku + 1;
291     if (lsame_(trans, "N")) {
292 
293 /*        Form  y := alpha*A*x + y. */
294 
295 	jx = kx;
296 	if (*incy == 1) {
297 	    i__1 = *n;
298 	    for (j = 1; j <= i__1; ++j) {
299 		i__2 = jx;
300 		if (x[i__2].r != 0. || x[i__2].i != 0.) {
301 		    i__2 = jx;
302 		    z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i,
303 			    z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2]
304 			    .r;
305 		    temp.r = z__1.r, temp.i = z__1.i;
306 		    k = kup1 - j;
307 /* Computing MAX */
308 		    i__2 = 1, i__3 = j - *ku;
309 /* Computing MIN */
310 		    i__5 = *m, i__6 = j + *kl;
311 		    i__4 = min(i__5,i__6);
312 		    for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) {
313 			i__2 = i__;
314 			i__3 = i__;
315 			i__5 = k + i__ + j * a_dim1;
316 			z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i,
317 				z__2.i = temp.r * a[i__5].i + temp.i * a[i__5]
318 				.r;
319 			z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i +
320 				z__2.i;
321 			y[i__2].r = z__1.r, y[i__2].i = z__1.i;
322 /* L50: */
323 		    }
324 		}
325 		jx += *incx;
326 /* L60: */
327 	    }
328 	} else {
329 	    i__1 = *n;
330 	    for (j = 1; j <= i__1; ++j) {
331 		i__4 = jx;
332 		if (x[i__4].r != 0. || x[i__4].i != 0.) {
333 		    i__4 = jx;
334 		    z__1.r = alpha->r * x[i__4].r - alpha->i * x[i__4].i,
335 			    z__1.i = alpha->r * x[i__4].i + alpha->i * x[i__4]
336 			    .r;
337 		    temp.r = z__1.r, temp.i = z__1.i;
338 		    iy = ky;
339 		    k = kup1 - j;
340 /* Computing MAX */
341 		    i__4 = 1, i__2 = j - *ku;
342 /* Computing MIN */
343 		    i__5 = *m, i__6 = j + *kl;
344 		    i__3 = min(i__5,i__6);
345 		    for (i__ = max(i__4,i__2); i__ <= i__3; ++i__) {
346 			i__4 = iy;
347 			i__2 = iy;
348 			i__5 = k + i__ + j * a_dim1;
349 			z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i,
350 				z__2.i = temp.r * a[i__5].i + temp.i * a[i__5]
351 				.r;
352 			z__1.r = y[i__2].r + z__2.r, z__1.i = y[i__2].i +
353 				z__2.i;
354 			y[i__4].r = z__1.r, y[i__4].i = z__1.i;
355 			iy += *incy;
356 /* L70: */
357 		    }
358 		}
359 		jx += *incx;
360 		if (j > *ku) {
361 		    ky += *incy;
362 		}
363 /* L80: */
364 	    }
365 	}
366     } else {
367 
368 /*        Form  y := alpha*A'*x + y  or  y := alpha*conjg( A' )*x + y. */
369 
370 	jy = ky;
371 	if (*incx == 1) {
372 	    i__1 = *n;
373 	    for (j = 1; j <= i__1; ++j) {
374 		temp.r = 0., temp.i = 0.;
375 		k = kup1 - j;
376 		if (noconj) {
377 /* Computing MAX */
378 		    i__3 = 1, i__4 = j - *ku;
379 /* Computing MIN */
380 		    i__5 = *m, i__6 = j + *kl;
381 		    i__2 = min(i__5,i__6);
382 		    for (i__ = max(i__3,i__4); i__ <= i__2; ++i__) {
383 			i__3 = k + i__ + j * a_dim1;
384 			i__4 = i__;
385 			z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4]
386 				.i, z__2.i = a[i__3].r * x[i__4].i + a[i__3]
387 				.i * x[i__4].r;
388 			z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i;
389 			temp.r = z__1.r, temp.i = z__1.i;
390 /* L90: */
391 		    }
392 		} else {
393 /* Computing MAX */
394 		    i__2 = 1, i__3 = j - *ku;
395 /* Computing MIN */
396 		    i__5 = *m, i__6 = j + *kl;
397 		    i__4 = min(i__5,i__6);
398 		    for (i__ = max(i__2,i__3); i__ <= i__4; ++i__) {
399 			d_cnjg(&z__3, &a[k + i__ + j * a_dim1]);
400 			i__2 = i__;
401 			z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i,
402 				z__2.i = z__3.r * x[i__2].i + z__3.i * x[i__2]
403 				.r;
404 			z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i;
405 			temp.r = z__1.r, temp.i = z__1.i;
406 /* L100: */
407 		    }
408 		}
409 		i__4 = jy;
410 		i__2 = jy;
411 		z__2.r = alpha->r * temp.r - alpha->i * temp.i, z__2.i =
412 			alpha->r * temp.i + alpha->i * temp.r;
413 		z__1.r = y[i__2].r + z__2.r, z__1.i = y[i__2].i + z__2.i;
414 		y[i__4].r = z__1.r, y[i__4].i = z__1.i;
415 		jy += *incy;
416 /* L110: */
417 	    }
418 	} else {
419 	    i__1 = *n;
420 	    for (j = 1; j <= i__1; ++j) {
421 		temp.r = 0., temp.i = 0.;
422 		ix = kx;
423 		k = kup1 - j;
424 		if (noconj) {
425 /* Computing MAX */
426 		    i__4 = 1, i__2 = j - *ku;
427 /* Computing MIN */
428 		    i__5 = *m, i__6 = j + *kl;
429 		    i__3 = min(i__5,i__6);
430 		    for (i__ = max(i__4,i__2); i__ <= i__3; ++i__) {
431 			i__4 = k + i__ + j * a_dim1;
432 			i__2 = ix;
433 			z__2.r = a[i__4].r * x[i__2].r - a[i__4].i * x[i__2]
434 				.i, z__2.i = a[i__4].r * x[i__2].i + a[i__4]
435 				.i * x[i__2].r;
436 			z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i;
437 			temp.r = z__1.r, temp.i = z__1.i;
438 			ix += *incx;
439 /* L120: */
440 		    }
441 		} else {
442 /* Computing MAX */
443 		    i__3 = 1, i__4 = j - *ku;
444 /* Computing MIN */
445 		    i__5 = *m, i__6 = j + *kl;
446 		    i__2 = min(i__5,i__6);
447 		    for (i__ = max(i__3,i__4); i__ <= i__2; ++i__) {
448 			d_cnjg(&z__3, &a[k + i__ + j * a_dim1]);
449 			i__3 = ix;
450 			z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i,
451 				z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3]
452 				.r;
453 			z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i;
454 			temp.r = z__1.r, temp.i = z__1.i;
455 			ix += *incx;
456 /* L130: */
457 		    }
458 		}
459 		i__2 = jy;
460 		i__3 = jy;
461 		z__2.r = alpha->r * temp.r - alpha->i * temp.i, z__2.i =
462 			alpha->r * temp.i + alpha->i * temp.r;
463 		z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i;
464 		y[i__2].r = z__1.r, y[i__2].i = z__1.i;
465 		jy += *incy;
466 		if (j > *ku) {
467 		    kx += *incx;
468 		}
469 /* L140: */
470 	    }
471 	}
472     }
473 
474     return 0;
475 
476 /*     End of ZGBMV . */
477 
478 } /* zgbmv_ */
479