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