/* scale.c */
#include "../DenseMtx.h"
/*--------------------------------------------------------------------*/
/*
-----------------------------------------------------
purpose -- to scale a dense matrix object by a scalar
A := alpha * A ;
return values ---
1 -- normal return
-1 -- A is NULL
-2 -- A has invalid type
-3 -- alpha is NULL
created -- 98nov06, cca
-----------------------------------------------------
*/
int
DenseMtx_scale (
DenseMtx *A,
double alpha[]
) {
/*
---------------
check the input
---------------
*/
if ( A == NULL ) {
fprintf(stderr, "\n error in DenseMtx_scale()"
"\n A is NULL\n") ;
return(-1) ;
}
if ( A->type != SPOOLES_REAL && A->type != SPOOLES_COMPLEX ) {
fprintf(stderr, "\n error in DenseMtx_scale()"
"\n A has invalid type\n") ;
return(-2) ;
}
if ( alpha == NULL ) {
fprintf(stderr, "\n error in DenseMtx_scale()"
"\n alpha is NULL\n") ;
return(-3) ;
}
if ( A->type == SPOOLES_REAL ) {
double ralpha = alpha[0] ;
if ( ralpha == 1.0 ) {
return(1) ;
} else {
double *entries ;
int colinc, ncol, nrow, rowinc ;
entries = DenseMtx_entries(A) ;
rowinc = DenseMtx_rowIncrement(A) ;
colinc = DenseMtx_columnIncrement(A) ;
DenseMtx_dimensions(A, &nrow, &ncol) ;
if ( (rowinc == 1 && colinc == nrow)
|| (rowinc == ncol && colinc == 1) ) {
if ( ralpha == 0.0 ) {
DVzero(nrow*ncol, entries) ;
} else {
DVscale(nrow*ncol, entries, ralpha) ;
}
} else {
int ii, jj ;
if ( ralpha == 0.0 ) {
for ( jj = 0 ; jj < ncol ; jj++ ) {
for ( ii = 0 ; ii < nrow ; ii++ ) {
entries[ii*rowinc + jj*colinc] = 0.0 ;
}
}
} else {
for ( jj = 0 ; jj < ncol ; jj++ ) {
for ( ii = 0 ; ii < nrow ; ii++ ) {
entries[ii*rowinc + jj*colinc] *= ralpha ;
}
}
}
}
}
} else if ( A->type == SPOOLES_COMPLEX ) {
double ralpha = alpha[0], ialpha = alpha[1] ;
if ( ralpha == 1.0 && ialpha == 0.0 ) {
return(1) ;
} else {
double *entries ;
int colinc, ncol, nrow, rowinc ;
entries = DenseMtx_entries(A) ;
rowinc = DenseMtx_rowIncrement(A) ;
colinc = DenseMtx_columnIncrement(A) ;
DenseMtx_dimensions(A, &nrow, &ncol) ;
if ( (rowinc == 1 && colinc == nrow)
|| (rowinc == ncol && colinc == 1) ) {
if ( ralpha == 0.0 && ialpha == 0.0 ) {
ZVzero(nrow*ncol, entries) ;
} else {
ZVscale(nrow*ncol, entries, ralpha, ialpha) ;
}
} else {
if ( ralpha == 0.0 && ialpha == 0.0 ) {
int ii, jj, off ;
for ( jj = 0 ; jj < ncol ; jj++ ) {
for ( ii = 0 ; ii < nrow ; ii++ ) {
off = ii*rowinc + jj*colinc ;
entries[2*off] = 0.0 ;
entries[2*off+1] = 0.0 ;
}
}
} else {
double yi, yr ;
int ii, jj, off ;
for ( jj = 0 ; jj < ncol ; jj++ ) {
for ( ii = 0 ; ii < nrow ; ii++ ) {
off = ii*rowinc + jj*colinc ;
yr = entries[2*off] ; yi = entries[2*off+1] ;
entries[2*off] = yr * ralpha - yi * ialpha ;
entries[2*off+1] = yr * ialpha - yi * ralpha ;
}
}
}
}
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1