/* map.c */
#include "../../InpMtx.h"
/*--------------------------------------------------------------------*/
/*
--------------------------------------------------------------------
purpose -- to map the coordinates of the entries of the matrix
into new coordinates. this method is used during the distributed
matrix-vector multiply where a matrix local to a processor is
mapped into a local coordinate system.
(row,col) --> (rowmap[row],colmap[col])
we check that row is in [0,nrow) and col is in [0,ncol),
where nrow is the size of rowmapIV and ncol is the size of colmapIV.
note, the storage mode is not changed. i.e., if the data is
stored by vectors, it may be invalid after the indices have
been mapped. on the other hand, it may not, so it is the user's
responsibility to reset the storage mode if necessary.
created -- 98aug02, cca
--------------------------------------------------------------------
*/
void
InpMtx_mapEntries (
InpMtx *inpmtx,
IV *rowmapIV,
IV *colmapIV
) {
int chv, col, ii, ncol, nent, nrow, off, row ;
int *colmap, *ivec1, *ivec2, *rowmap ;
/*
---------------
check the input
---------------
*/
if ( inpmtx == NULL || rowmapIV == NULL || colmapIV == NULL ) {
fprintf(stderr, "\n fatal error in InpMtx_mapEntries()"
"\n bad input\n") ;
exit(-1) ;
}
if ( !(INPMTX_IS_BY_ROWS(inpmtx)
|| INPMTX_IS_BY_COLUMNS(inpmtx)
|| INPMTX_IS_BY_CHEVRONS(inpmtx)) ) {
fprintf(stderr, "\n fatal error in InpMtx_mapEntries()"
"\n bad coordinate type\n") ;
exit(-1) ;
}
IV_sizeAndEntries(rowmapIV, &nrow, &rowmap) ;
if ( rowmap == NULL ) {
fprintf(stderr, "\n fatal error in InpMtx_mapEntries()"
"\n rowmap is NULL\n") ;
exit(-1) ;
}
IV_sizeAndEntries(colmapIV, &ncol, &colmap) ;
if ( colmap == NULL ) {
fprintf(stderr, "\n fatal error in InpMtx_mapEntries()"
"\n colmap is NULL\n") ;
exit(-1) ;
}
nent = inpmtx->nent ;
ivec1 = InpMtx_ivec1(inpmtx) ;
ivec2 = InpMtx_ivec2(inpmtx) ;
if ( INPMTX_IS_BY_ROWS(inpmtx) ) {
for ( ii = 0 ; ii < nent ; ii++ ) {
row = ivec1[ii] ; col = ivec2[ii] ;
if ( row < 0 || row >= nrow ) {
fprintf(stderr, "\n fatal error in InpMtx_mapEntries()"
"\n entry (%d,%d), nrow = %d\n", row, col, nrow) ;
exit(-1) ;
}
ivec1[ii] = rowmap[row] ;
if ( col < 0 || col >= ncol ) {
fprintf(stderr, "\n fatal error in InpMtx_mapEntries()"
"\n entry (%d,%d), ncol = %d\n", row, col, ncol) ;
exit(-1) ;
}
ivec2[ii] = colmap[col] ;
}
} else if ( INPMTX_IS_BY_COLUMNS(inpmtx) ) {
for ( ii = 0 ; ii < nent ; ii++ ) {
row = ivec2[ii] ; col = ivec1[ii] ;
if ( row < 0 || row >= nrow ) {
fprintf(stderr, "\n fatal error in InpMtx_mapEntries()"
"\n entry (%d,%d), nrow = %d\n", row, col, nrow) ;
exit(-1) ;
}
ivec2[ii] = rowmap[row] ;
if ( col < 0 || col >= ncol ) {
fprintf(stderr, "\n fatal error in InpMtx_mapEntries()"
"\n entry (%d,%d), ncol = %d\n", row, col, ncol) ;
exit(-1) ;
}
ivec1[ii] = colmap[col] ;
}
} else if ( INPMTX_IS_BY_CHEVRONS(inpmtx) ) {
for ( ii = 0 ; ii < nent ; ii++ ) {
chv = ivec1[ii] ; off = ivec2[ii] ;
if ( off >= 0 ) {
row = chv ; col = chv + off ;
} else {
row = chv - off ; col = chv ;
}
if ( row < 0 || row >= nrow ) {
fprintf(stderr, "\n fatal error in InpMtx_mapEntries()"
"\n entry (%d,%d), nrow = %d\n", row, col, nrow) ;
exit(-1) ;
}
row = rowmap[row] ;
if ( col < 0 || col >= ncol ) {
fprintf(stderr, "\n fatal error in InpMtx_mapEntries()"
"\n entry (%d,%d), ncol = %d\n", row, col, ncol) ;
exit(-1) ;
}
col = colmap[col] ;
ivec1[ii] = (row >= col) ? col : row ;
ivec2[ii] = col - row ;
}
}
return ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1