Home | History | Annotate | Download | only in f2c
      1 /* chpmv.f -- translated by f2c (version 20100827).
      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 "datatypes.h"
     14 
     15 /* Subroutine */ int chpmv_(char *uplo, integer *n, complex *alpha, complex *
     16 	ap, complex *x, integer *incx, complex *beta, complex *y, integer *
     17 	incy, ftnlen uplo_len)
     18 {
     19     /* System generated locals */
     20     integer i__1, i__2, i__3, i__4, i__5;
     21     real r__1;
     22     complex q__1, q__2, q__3, q__4;
     23 
     24     /* Builtin functions */
     25     void r_cnjg(complex *, complex *);
     26 
     27     /* Local variables */
     28     integer i__, j, k, kk, ix, iy, jx, jy, kx, ky, info;
     29     complex temp1, temp2;
     30     extern logical lsame_(char *, char *, ftnlen, ftnlen);
     31     extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen);
     32 
     33 /*     .. Scalar Arguments .. */
     34 /*     .. */
     35 /*     .. Array Arguments .. */
     36 /*     .. */
     37 
     38 /*  Purpose */
     39 /*  ======= */
     40 
     41 /*  CHPMV  performs the matrix-vector operation */
     42 
     43 /*     y := alpha*A*x + beta*y, */
     44 
     45 /*  where alpha and beta are scalars, x and y are n element vectors and */
     46 /*  A is an n by n hermitian matrix, supplied in packed form. */
     47 
     48 /*  Arguments */
     49 /*  ========== */
     50 
     51 /*  UPLO   - CHARACTER*1. */
     52 /*           On entry, UPLO specifies whether the upper or lower */
     53 /*           triangular part of the matrix A is supplied in the packed */
     54 /*           array AP as follows: */
     55 
     56 /*              UPLO = 'U' or 'u'   The upper triangular part of A is */
     57 /*                                  supplied in AP. */
     58 
     59 /*              UPLO = 'L' or 'l'   The lower triangular part of A is */
     60 /*                                  supplied in AP. */
     61 
     62 /*           Unchanged on exit. */
     63 
     64 /*  N      - INTEGER. */
     65 /*           On entry, N specifies the order of the matrix A. */
     66 /*           N must be at least zero. */
     67 /*           Unchanged on exit. */
     68 
     69 /*  ALPHA  - COMPLEX         . */
     70 /*           On entry, ALPHA specifies the scalar alpha. */
     71 /*           Unchanged on exit. */
     72 
     73 /*  AP     - COMPLEX          array of DIMENSION at least */
     74 /*           ( ( n*( n + 1 ) )/2 ). */
     75 /*           Before entry with UPLO = 'U' or 'u', the array AP must */
     76 /*           contain the upper triangular part of the hermitian matrix */
     77 /*           packed sequentially, column by column, so that AP( 1 ) */
     78 /*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 ) */
     79 /*           and a( 2, 2 ) respectively, and so on. */
     80 /*           Before entry with UPLO = 'L' or 'l', the array AP must */
     81 /*           contain the lower triangular part of the hermitian matrix */
     82 /*           packed sequentially, column by column, so that AP( 1 ) */
     83 /*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 ) */
     84 /*           and a( 3, 1 ) respectively, and so on. */
     85 /*           Note that the imaginary parts of the diagonal elements need */
     86 /*           not be set and are assumed to be zero. */
     87 /*           Unchanged on exit. */
     88 
     89 /*  X      - COMPLEX          array of dimension at least */
     90 /*           ( 1 + ( n - 1 )*abs( INCX ) ). */
     91 /*           Before entry, the incremented array X must contain the n */
     92 /*           element vector x. */
     93 /*           Unchanged on exit. */
     94 
     95 /*  INCX   - INTEGER. */
     96 /*           On entry, INCX specifies the increment for the elements of */
     97 /*           X. INCX must not be zero. */
     98 /*           Unchanged on exit. */
     99 
    100 /*  BETA   - COMPLEX         . */
    101 /*           On entry, BETA specifies the scalar beta. When BETA is */
    102 /*           supplied as zero then Y need not be set on input. */
    103 /*           Unchanged on exit. */
    104 
    105 /*  Y      - COMPLEX          array of dimension at least */
    106 /*           ( 1 + ( n - 1 )*abs( INCY ) ). */
    107 /*           Before entry, the incremented array Y must contain the n */
    108 /*           element vector y. On exit, Y is overwritten by the updated */
    109 /*           vector y. */
    110 
    111 /*  INCY   - INTEGER. */
    112 /*           On entry, INCY specifies the increment for the elements of */
    113 /*           Y. INCY must not be zero. */
    114 /*           Unchanged on exit. */
    115 
    116 /*  Further Details */
    117 /*  =============== */
    118 
    119 /*  Level 2 Blas routine. */
    120 
    121 /*  -- Written on 22-October-1986. */
    122 /*     Jack Dongarra, Argonne National Lab. */
    123 /*     Jeremy Du Croz, Nag Central Office. */
    124 /*     Sven Hammarling, Nag Central Office. */
    125 /*     Richard Hanson, Sandia National Labs. */
    126 
    127 /*  ===================================================================== */
    128 
    129 /*     .. Parameters .. */
    130 /*     .. */
    131 /*     .. Local Scalars .. */
    132 /*     .. */
    133 /*     .. External Functions .. */
    134 /*     .. */
    135 /*     .. External Subroutines .. */
    136 /*     .. */
    137 /*     .. Intrinsic Functions .. */
    138 /*     .. */
    139 
    140 /*     Test the input parameters. */
    141 
    142     /* Parameter adjustments */
    143     --y;
    144     --x;
    145     --ap;
    146 
    147     /* Function Body */
    148     info = 0;
    149     if (! lsame_(uplo, "U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, "L", (
    150 	    ftnlen)1, (ftnlen)1)) {
    151 	info = 1;
    152     } else if (*n < 0) {
    153 	info = 2;
    154     } else if (*incx == 0) {
    155 	info = 6;
    156     } else if (*incy == 0) {
    157 	info = 9;
    158     }
    159     if (info != 0) {
    160 	xerbla_("CHPMV ", &info, (ftnlen)6);
    161 	return 0;
    162     }
    163 
    164 /*     Quick return if possible. */
    165 
    166     if (*n == 0 || (alpha->r == 0.f && alpha->i == 0.f && (beta->r == 1.f &&
    167                                                            beta->i == 0.f))) {
    168 	return 0;
    169     }
    170 
    171 /*     Set up the start points in  X  and  Y. */
    172 
    173     if (*incx > 0) {
    174 	kx = 1;
    175     } else {
    176 	kx = 1 - (*n - 1) * *incx;
    177     }
    178     if (*incy > 0) {
    179 	ky = 1;
    180     } else {
    181 	ky = 1 - (*n - 1) * *incy;
    182     }
    183 
    184 /*     Start the operations. In this version the elements of the array AP */
    185 /*     are accessed sequentially with one pass through AP. */
    186 
    187 /*     First form  y := beta*y. */
    188 
    189     if (beta->r != 1.f || beta->i != 0.f) {
    190 	if (*incy == 1) {
    191 	    if (beta->r == 0.f && beta->i == 0.f) {
    192 		i__1 = *n;
    193 		for (i__ = 1; i__ <= i__1; ++i__) {
    194 		    i__2 = i__;
    195 		    y[i__2].r = 0.f, y[i__2].i = 0.f;
    196 /* L10: */
    197 		}
    198 	    } else {
    199 		i__1 = *n;
    200 		for (i__ = 1; i__ <= i__1; ++i__) {
    201 		    i__2 = i__;
    202 		    i__3 = i__;
    203 		    q__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i,
    204 			    q__1.i = beta->r * y[i__3].i + beta->i * y[i__3]
    205 			    .r;
    206 		    y[i__2].r = q__1.r, y[i__2].i = q__1.i;
    207 /* L20: */
    208 		}
    209 	    }
    210 	} else {
    211 	    iy = ky;
    212 	    if (beta->r == 0.f && beta->i == 0.f) {
    213 		i__1 = *n;
    214 		for (i__ = 1; i__ <= i__1; ++i__) {
    215 		    i__2 = iy;
    216 		    y[i__2].r = 0.f, y[i__2].i = 0.f;
    217 		    iy += *incy;
    218 /* L30: */
    219 		}
    220 	    } else {
    221 		i__1 = *n;
    222 		for (i__ = 1; i__ <= i__1; ++i__) {
    223 		    i__2 = iy;
    224 		    i__3 = iy;
    225 		    q__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i,
    226 			    q__1.i = beta->r * y[i__3].i + beta->i * y[i__3]
    227 			    .r;
    228 		    y[i__2].r = q__1.r, y[i__2].i = q__1.i;
    229 		    iy += *incy;
    230 /* L40: */
    231 		}
    232 	    }
    233 	}
    234     }
    235     if (alpha->r == 0.f && alpha->i == 0.f) {
    236 	return 0;
    237     }
    238     kk = 1;
    239     if (lsame_(uplo, "U", (ftnlen)1, (ftnlen)1)) {
    240 
    241 /*        Form  y  when AP contains the upper triangle. */
    242 
    243 	if (*incx == 1 && *incy == 1) {
    244 	    i__1 = *n;
    245 	    for (j = 1; j <= i__1; ++j) {
    246 		i__2 = j;
    247 		q__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, q__1.i =
    248 			 alpha->r * x[i__2].i + alpha->i * x[i__2].r;
    249 		temp1.r = q__1.r, temp1.i = q__1.i;
    250 		temp2.r = 0.f, temp2.i = 0.f;
    251 		k = kk;
    252 		i__2 = j - 1;
    253 		for (i__ = 1; i__ <= i__2; ++i__) {
    254 		    i__3 = i__;
    255 		    i__4 = i__;
    256 		    i__5 = k;
    257 		    q__2.r = temp1.r * ap[i__5].r - temp1.i * ap[i__5].i,
    258 			    q__2.i = temp1.r * ap[i__5].i + temp1.i * ap[i__5]
    259 			    .r;
    260 		    q__1.r = y[i__4].r + q__2.r, q__1.i = y[i__4].i + q__2.i;
    261 		    y[i__3].r = q__1.r, y[i__3].i = q__1.i;
    262 		    r_cnjg(&q__3, &ap[k]);
    263 		    i__3 = i__;
    264 		    q__2.r = q__3.r * x[i__3].r - q__3.i * x[i__3].i, q__2.i =
    265 			     q__3.r * x[i__3].i + q__3.i * x[i__3].r;
    266 		    q__1.r = temp2.r + q__2.r, q__1.i = temp2.i + q__2.i;
    267 		    temp2.r = q__1.r, temp2.i = q__1.i;
    268 		    ++k;
    269 /* L50: */
    270 		}
    271 		i__2 = j;
    272 		i__3 = j;
    273 		i__4 = kk + j - 1;
    274 		r__1 = ap[i__4].r;
    275 		q__3.r = r__1 * temp1.r, q__3.i = r__1 * temp1.i;
    276 		q__2.r = y[i__3].r + q__3.r, q__2.i = y[i__3].i + q__3.i;
    277 		q__4.r = alpha->r * temp2.r - alpha->i * temp2.i, q__4.i =
    278 			alpha->r * temp2.i + alpha->i * temp2.r;
    279 		q__1.r = q__2.r + q__4.r, q__1.i = q__2.i + q__4.i;
    280 		y[i__2].r = q__1.r, y[i__2].i = q__1.i;
    281 		kk += j;
    282 /* L60: */
    283 	    }
    284 	} else {
    285 	    jx = kx;
    286 	    jy = ky;
    287 	    i__1 = *n;
    288 	    for (j = 1; j <= i__1; ++j) {
    289 		i__2 = jx;
    290 		q__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, q__1.i =
    291 			 alpha->r * x[i__2].i + alpha->i * x[i__2].r;
    292 		temp1.r = q__1.r, temp1.i = q__1.i;
    293 		temp2.r = 0.f, temp2.i = 0.f;
    294 		ix = kx;
    295 		iy = ky;
    296 		i__2 = kk + j - 2;
    297 		for (k = kk; k <= i__2; ++k) {
    298 		    i__3 = iy;
    299 		    i__4 = iy;
    300 		    i__5 = k;
    301 		    q__2.r = temp1.r * ap[i__5].r - temp1.i * ap[i__5].i,
    302 			    q__2.i = temp1.r * ap[i__5].i + temp1.i * ap[i__5]
    303 			    .r;
    304 		    q__1.r = y[i__4].r + q__2.r, q__1.i = y[i__4].i + q__2.i;
    305 		    y[i__3].r = q__1.r, y[i__3].i = q__1.i;
    306 		    r_cnjg(&q__3, &ap[k]);
    307 		    i__3 = ix;
    308 		    q__2.r = q__3.r * x[i__3].r - q__3.i * x[i__3].i, q__2.i =
    309 			     q__3.r * x[i__3].i + q__3.i * x[i__3].r;
    310 		    q__1.r = temp2.r + q__2.r, q__1.i = temp2.i + q__2.i;
    311 		    temp2.r = q__1.r, temp2.i = q__1.i;
    312 		    ix += *incx;
    313 		    iy += *incy;
    314 /* L70: */
    315 		}
    316 		i__2 = jy;
    317 		i__3 = jy;
    318 		i__4 = kk + j - 1;
    319 		r__1 = ap[i__4].r;
    320 		q__3.r = r__1 * temp1.r, q__3.i = r__1 * temp1.i;
    321 		q__2.r = y[i__3].r + q__3.r, q__2.i = y[i__3].i + q__3.i;
    322 		q__4.r = alpha->r * temp2.r - alpha->i * temp2.i, q__4.i =
    323 			alpha->r * temp2.i + alpha->i * temp2.r;
    324 		q__1.r = q__2.r + q__4.r, q__1.i = q__2.i + q__4.i;
    325 		y[i__2].r = q__1.r, y[i__2].i = q__1.i;
    326 		jx += *incx;
    327 		jy += *incy;
    328 		kk += j;
    329 /* L80: */
    330 	    }
    331 	}
    332     } else {
    333 
    334 /*        Form  y  when AP contains the lower triangle. */
    335 
    336 	if (*incx == 1 && *incy == 1) {
    337 	    i__1 = *n;
    338 	    for (j = 1; j <= i__1; ++j) {
    339 		i__2 = j;
    340 		q__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, q__1.i =
    341 			 alpha->r * x[i__2].i + alpha->i * x[i__2].r;
    342 		temp1.r = q__1.r, temp1.i = q__1.i;
    343 		temp2.r = 0.f, temp2.i = 0.f;
    344 		i__2 = j;
    345 		i__3 = j;
    346 		i__4 = kk;
    347 		r__1 = ap[i__4].r;
    348 		q__2.r = r__1 * temp1.r, q__2.i = r__1 * temp1.i;
    349 		q__1.r = y[i__3].r + q__2.r, q__1.i = y[i__3].i + q__2.i;
    350 		y[i__2].r = q__1.r, y[i__2].i = q__1.i;
    351 		k = kk + 1;
    352 		i__2 = *n;
    353 		for (i__ = j + 1; i__ <= i__2; ++i__) {
    354 		    i__3 = i__;
    355 		    i__4 = i__;
    356 		    i__5 = k;
    357 		    q__2.r = temp1.r * ap[i__5].r - temp1.i * ap[i__5].i,
    358 			    q__2.i = temp1.r * ap[i__5].i + temp1.i * ap[i__5]
    359 			    .r;
    360 		    q__1.r = y[i__4].r + q__2.r, q__1.i = y[i__4].i + q__2.i;
    361 		    y[i__3].r = q__1.r, y[i__3].i = q__1.i;
    362 		    r_cnjg(&q__3, &ap[k]);
    363 		    i__3 = i__;
    364 		    q__2.r = q__3.r * x[i__3].r - q__3.i * x[i__3].i, q__2.i =
    365 			     q__3.r * x[i__3].i + q__3.i * x[i__3].r;
    366 		    q__1.r = temp2.r + q__2.r, q__1.i = temp2.i + q__2.i;
    367 		    temp2.r = q__1.r, temp2.i = q__1.i;
    368 		    ++k;
    369 /* L90: */
    370 		}
    371 		i__2 = j;
    372 		i__3 = j;
    373 		q__2.r = alpha->r * temp2.r - alpha->i * temp2.i, q__2.i =
    374 			alpha->r * temp2.i + alpha->i * temp2.r;
    375 		q__1.r = y[i__3].r + q__2.r, q__1.i = y[i__3].i + q__2.i;
    376 		y[i__2].r = q__1.r, y[i__2].i = q__1.i;
    377 		kk += *n - j + 1;
    378 /* L100: */
    379 	    }
    380 	} else {
    381 	    jx = kx;
    382 	    jy = ky;
    383 	    i__1 = *n;
    384 	    for (j = 1; j <= i__1; ++j) {
    385 		i__2 = jx;
    386 		q__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, q__1.i =
    387 			 alpha->r * x[i__2].i + alpha->i * x[i__2].r;
    388 		temp1.r = q__1.r, temp1.i = q__1.i;
    389 		temp2.r = 0.f, temp2.i = 0.f;
    390 		i__2 = jy;
    391 		i__3 = jy;
    392 		i__4 = kk;
    393 		r__1 = ap[i__4].r;
    394 		q__2.r = r__1 * temp1.r, q__2.i = r__1 * temp1.i;
    395 		q__1.r = y[i__3].r + q__2.r, q__1.i = y[i__3].i + q__2.i;
    396 		y[i__2].r = q__1.r, y[i__2].i = q__1.i;
    397 		ix = jx;
    398 		iy = jy;
    399 		i__2 = kk + *n - j;
    400 		for (k = kk + 1; k <= i__2; ++k) {
    401 		    ix += *incx;
    402 		    iy += *incy;
    403 		    i__3 = iy;
    404 		    i__4 = iy;
    405 		    i__5 = k;
    406 		    q__2.r = temp1.r * ap[i__5].r - temp1.i * ap[i__5].i,
    407 			    q__2.i = temp1.r * ap[i__5].i + temp1.i * ap[i__5]
    408 			    .r;
    409 		    q__1.r = y[i__4].r + q__2.r, q__1.i = y[i__4].i + q__2.i;
    410 		    y[i__3].r = q__1.r, y[i__3].i = q__1.i;
    411 		    r_cnjg(&q__3, &ap[k]);
    412 		    i__3 = ix;
    413 		    q__2.r = q__3.r * x[i__3].r - q__3.i * x[i__3].i, q__2.i =
    414 			     q__3.r * x[i__3].i + q__3.i * x[i__3].r;
    415 		    q__1.r = temp2.r + q__2.r, q__1.i = temp2.i + q__2.i;
    416 		    temp2.r = q__1.r, temp2.i = q__1.i;
    417 /* L110: */
    418 		}
    419 		i__2 = jy;
    420 		i__3 = jy;
    421 		q__2.r = alpha->r * temp2.r - alpha->i * temp2.i, q__2.i =
    422 			alpha->r * temp2.i + alpha->i * temp2.r;
    423 		q__1.r = y[i__3].r + q__2.r, q__1.i = y[i__3].i + q__2.i;
    424 		y[i__2].r = q__1.r, y[i__2].i = q__1.i;
    425 		jx += *incx;
    426 		jy += *incy;
    427 		kk += *n - j + 1;
    428 /* L120: */
    429 	    }
    430 	}
    431     }
    432 
    433     return 0;
    434 
    435 /*     End of CHPMV . */
    436 
    437 } /* chpmv_ */
    438 
    439