/*
From tam@dragonfly.wri.com Wed Apr 24 15:48:31 1991
Return-Path:
Date: Wed, 24 Apr 91 17:48:43 CDT
From: tam@dragonfly.wri.com
To: whitbeck@sanjuan.wrc.unr.edu
*/
void daxpy( n, da, dx, incx, dy, incy )
double da, *dx, *dy;
int n, incx, incy;
/*
Purpose : To compute
dy = da * dx + dy
--- Input ---
n : number of elements in input vector(s)
da : double scalar multiplier
dx : double vector with n+1 elements, dx[0] is not used
incx : storage spacing between elements of dx
dy : double vector with n+1 elements, dy[0] is not used
incy : storage spacing between elements of dy
--- Output ---
dy = da * dx + dy, unchanged if n <= 0
For i = 0 to n-1, replace dy[ly+i*incy] with
da*dx[lx+i*incx] + dy[ly+i*incy], where lx = 1
if incx >= 0, else lx = (-incx)*(n-1)+1 and ly is
defined in a similar way using incy.
*/
{
int ix, iy, i, m;
if ( n < 0 || da == 0. )
return;
/* Code for nonequal or nonpositive increments. */
if ( incx != incy || incx < 1 ) {
ix = 1;
iy = 1;
if ( incx < 0 )
ix = ( -n + 1 ) * incx + 1;
if ( incy < 0 )
iy = ( -n + 1 ) * incy + 1;
for ( i = 1 ; i <= n ; i++ ) {
dy[iy] = dy[iy] + da * dx[ix];
ix = ix + incx;
iy = iy + incy;
}
return;
}
/* Code for both increments equal to 1. */
/* Clean-up loop so remaining vector length is a multiple of 4. */
if ( incx == 1 ) {
m = n % 4;
if ( m != 0 ) {
for ( i = 1 ; i <= m ; i++ )
dy[i] = dy[i] + da * dx[i];
if ( n < 4 )
return;
}
for ( i = m + 1 ; i <= n ; i = i + 4 ) {
dy[i] = dy[i] + da * dx[i];
dy[i+1] = dy[i+1] + da * dx[i+1];
dy[i+2] = dy[i+2] + da * dx[i+2];
dy[i+3] = dy[i+3] + da * dx[i+3];
}
return;
}
/* Code for equal, positive, nonunit increments. */
for ( i = 1 ; i <= n * incx ; i = i + incx )
dy[i] = da * dx[i] + dy[i];
return;
}
|