/* init.c */
#include "../SubMtx.h"
#define MYDEBUG 0
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------
return the number of bytes needed for an object of this size
created -- 98may01, cca
------------------------------------------------------------
*/
int
SubMtx_nbytesNeeded (
int type,
int mode,
int nrow,
int ncol,
int nent
) {
int nbytes, ndouble, nint ;
/*
---------------
check the input
---------------
*/
if ( nrow <= 0 || ncol <= 0 || nent < 0 ) {
fprintf(stderr,
"\n fatal error in SubMtx_nbytesNeeded(%d,%d,%d,%d,%d)"
"\n bad input\n", type, mode, nrow, ncol, nent) ;
exit(-1) ;
}
switch ( type ) {
case SPOOLES_REAL :
case SPOOLES_COMPLEX :
break ;
default :
fprintf(stderr,
"\n fatal error in SubMtx_nbytesNeeded(%d,%d,%d,%d,%d)"
"\n bad type\n", type, mode, nrow, ncol, nent) ;
exit(-1) ;
}
switch ( mode ) {
case SUBMTX_DENSE_ROWS :
case SUBMTX_DENSE_COLUMNS :
case SUBMTX_SPARSE_ROWS :
case SUBMTX_SPARSE_COLUMNS :
case SUBMTX_SPARSE_TRIPLES :
case SUBMTX_DENSE_SUBROWS :
case SUBMTX_DENSE_SUBCOLUMNS :
case SUBMTX_DIAGONAL :
case SUBMTX_BLOCK_DIAGONAL_SYM :
case SUBMTX_BLOCK_DIAGONAL_HERM :
break ;
default :
fprintf(stderr,
"\n fatal error in SubMtx_nbytesNeeded(%d,%d,%d,%d,%d)"
"\n bad mode\n", type, mode, nrow, ncol, nent) ;
exit(-1) ;
}
/*
--------------------------------------------
determine the number of integers and doubles
--------------------------------------------
*/
nint = 7 + nrow + ncol ;
if ( type == SPOOLES_REAL ) {
ndouble = nent ;
} else if ( type == SPOOLES_COMPLEX ) {
ndouble = 2*nent ;
}
switch ( mode ) {
case SUBMTX_SPARSE_ROWS :
nint += nrow + nent ;
break ;
case SUBMTX_SPARSE_COLUMNS :
nint += ncol + nent ;
break ;
case SUBMTX_SPARSE_TRIPLES :
nint += 2*nent ;
break ;
case SUBMTX_DENSE_SUBROWS :
nint += 2*nrow ;
break ;
case SUBMTX_DENSE_SUBCOLUMNS :
nint += 2*ncol ;
break ;
case SUBMTX_DIAGONAL :
break ;
case SUBMTX_BLOCK_DIAGONAL_SYM :
case SUBMTX_BLOCK_DIAGONAL_HERM :
nint += ncol ;
break ;
default :
break ;
}
/*
-----------------------------
determine the number of bytes
-----------------------------
*/
if ( sizeof(int) == sizeof(double) ) {
nbytes = nint*sizeof(int) + ndouble*sizeof(double) ;
} else if ( 2*sizeof(int) == sizeof(double) ) {
nbytes = ((nint + 1)/2 + ndouble)*sizeof(double) ;
} else {
fprintf(stderr, "\n error in SubMtx_nbytesNeeded(%d,%d)"
"\n sizeof(int) = %d, sizeof(double) = %d",
nrow, ncol, sizeof(int), sizeof(double)) ;
exit(-1) ;
}
return(nbytes) ; }
/*--------------------------------------------------------------------*/
/*
------------------------------------
return the number of bytes in use in
the workspace owned by this object
created -- 98may01, cca
------------------------------------
*/
int
SubMtx_nbytesInUse (
SubMtx *mtx
) {
if ( mtx == NULL ) {
fprintf(stderr, "\n fatal error in SubMtx_nbytesInUse(%p)"
"\n bad input\n", mtx) ;
exit(-1) ;
}
return(sizeof(double)*DV_size(&mtx->wrkDV)) ; }
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------
return a pointer to the workspace owned by this object
created -- 98may01, cca
------------------------------------------------------
*/
void *
SubMtx_workspace (
SubMtx *mtx
) {
if ( mtx == NULL ) {
fprintf(stderr, "\n fatal error in SubMtx_workspace(%p)"
"\n bad input\n", mtx) ;
exit(-1) ;
}
return((void *)DV_entries(&mtx->wrkDV)) ; }
/*--------------------------------------------------------------------*/
/*
----------------------------------------------------------------
return the number of bytes in the workspace owned by this object
created -- 98may01, cca
----------------------------------------------------------------
*/
int
SubMtx_nbytesInWorkspace (
SubMtx *mtx
) {
if ( mtx == NULL ) {
fprintf(stderr, "\n fatal error in SubMtx_nbytesInWorkspace(%p)"
"\n bad input\n", mtx) ;
exit(-1) ;
}
return(sizeof(double)*DV_maxsize(&mtx->wrkDV)) ; }
/*--------------------------------------------------------------------*/
/*
-------------------------------------------------------------
set the number of bytes in the workspace owned by this object
created -- 98may01, cca
-------------------------------------------------------------
*/
void
SubMtx_setNbytesInWorkspace (
SubMtx *mtx,
int nbytes
) {
if ( mtx == NULL ) {
fprintf(stderr,
"\n fatal error in SubMtx_setNbytesInWorkspace(%p)"
"\n bad input\n", mtx) ;
exit(-1) ;
}
DV_setSize(&mtx->wrkDV, nbytes/sizeof(double)) ;
return ; }
/*--------------------------------------------------------------------*/
/*
---------------------------------------
purpose -- set the fields of the object
created -- 98may01, cca
---------------------------------------
*/
void
SubMtx_setFields (
SubMtx *mtx,
int type,
int mode,
int rowid,
int colid,
int nrow,
int ncol,
int nent
) {
double *dbuffer ;
int nint ;
int *ibuffer ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL ) {
fprintf(stderr, "\n fatal error in SubMtx_setFields()"
"\n mtx is NULL\n") ;
exit(-1) ;
}
if ( nrow <= 0 ) {
fprintf(stderr, "\n fatal error in SubMtx_setFields()"
"\n nrow = %d <= 0\n", nrow) ;
exit(-1) ;
}
if ( ncol <= 0 ) {
fprintf(stderr, "\n fatal error in SubMtx_setFields()"
"\n ncol = %d <= 0\n", ncol) ;
exit(-1) ;
}
if ( nrow <= 0 ) {
fprintf(stderr, "\n fatal error in SubMtx_setFields()"
"\n nent = %d <= 0\n", nent) ;
exit(-1) ;
}
switch ( type ) {
case SPOOLES_REAL :
case SPOOLES_COMPLEX :
break ;
default :
fprintf(stderr, "\n fatal error in SubMtx_setFields()"
"\n invalid type %d", type) ;
exit(-1) ;
}
switch ( mode ) {
case SUBMTX_DENSE_ROWS :
case SUBMTX_DENSE_COLUMNS :
case SUBMTX_DIAGONAL :
case SUBMTX_SPARSE_ROWS :
case SUBMTX_SPARSE_COLUMNS :
case SUBMTX_SPARSE_TRIPLES :
case SUBMTX_DENSE_SUBROWS :
case SUBMTX_DENSE_SUBCOLUMNS :
case SUBMTX_BLOCK_DIAGONAL_SYM :
case SUBMTX_BLOCK_DIAGONAL_HERM :
break ;
default :
fprintf(stderr, "\n fatal error in SubMtx_setFields()"
"\n invalid mode %d", mode) ;
exit(-1) ;
}
dbuffer = DV_entries(&mtx->wrkDV) ;
ibuffer = (int *) dbuffer ;
/*
---------------------
set the scalar fields
---------------------
*/
mtx->type = ibuffer[0] = type ;
mtx->mode = ibuffer[1] = mode ;
mtx->rowid = ibuffer[2] = rowid ;
mtx->colid = ibuffer[3] = colid ;
mtx->nrow = ibuffer[4] = nrow ;
mtx->ncol = ibuffer[5] = ncol ;
mtx->nent = ibuffer[6] = nent ;
switch ( mode ) {
case SUBMTX_DENSE_ROWS :
case SUBMTX_DENSE_COLUMNS :
case SUBMTX_DIAGONAL :
nint = 7 + mtx->nrow + mtx->ncol ;
break ;
case SUBMTX_SPARSE_ROWS :
nint = 7 + mtx->nrow + mtx->ncol + mtx->nrow + mtx->nent ;
break ;
case SUBMTX_SPARSE_COLUMNS :
nint = 7 + mtx->nrow + mtx->ncol + mtx->ncol + mtx->nent ;
break ;
case SUBMTX_SPARSE_TRIPLES :
nint = 7 + mtx->nrow + mtx->ncol + mtx->nent + mtx->nent ;
break ;
case SUBMTX_DENSE_SUBROWS :
nint = 7 + mtx->nrow + mtx->ncol + mtx->nrow + mtx->nrow ;
break ;
case SUBMTX_DENSE_SUBCOLUMNS :
nint = 7 + mtx->nrow + mtx->ncol + mtx->ncol + mtx->ncol ;
break ;
case SUBMTX_BLOCK_DIAGONAL_SYM :
case SUBMTX_BLOCK_DIAGONAL_HERM :
nint = 7 + mtx->nrow + mtx->ncol + mtx->nrow ;
break ;
}
if ( sizeof(int) == sizeof(double) ) {
mtx->entries = dbuffer + nint ;
} else if ( 2*sizeof(int) == sizeof(double) ) {
mtx->entries = dbuffer + (nint+1)/2 ;
}
return ; }
/*--------------------------------------------------------------------*/
/*
----------------------------
purpose -- basic initializer
created -- 98may01, cca
----------------------------
*/
void
SubMtx_init (
SubMtx *mtx,
int type,
int mode,
int rowid,
int colid,
int nrow,
int ncol,
int nent
) {
int nbytes ;
int *colind, *rowind ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL ) {
fprintf(stderr, "\n fatal error in SubMtx_init()"
"\n mtx is NULL\n") ;
exit(-1) ;
}
if ( nrow <= 0 ) {
fprintf(stderr, "\n fatal error in SubMtx_init()"
"\n nrow = %d <= 0\n", nrow) ;
exit(-1) ;
}
if ( ncol <= 0 ) {
fprintf(stderr, "\n fatal error in SubMtx_init()"
"\n ncol = %d <= 0\n", ncol) ;
exit(-1) ;
}
if ( nrow <= 0 ) {
fprintf(stderr, "\n fatal error in SubMtx_init()"
"\n nent = %d <= 0\n", nent) ;
exit(-1) ;
}
switch ( type ) {
case SPOOLES_REAL :
case SPOOLES_COMPLEX :
break ;
default :
fprintf(stderr, "\n fatal error in SubMtx_init()"
"\n invalid type %d", type) ;
exit(-1) ;
}
switch ( mode ) {
case SUBMTX_DENSE_ROWS :
case SUBMTX_DENSE_COLUMNS :
case SUBMTX_DIAGONAL :
case SUBMTX_SPARSE_ROWS :
case SUBMTX_SPARSE_COLUMNS :
case SUBMTX_SPARSE_TRIPLES :
case SUBMTX_DENSE_SUBROWS :
case SUBMTX_DENSE_SUBCOLUMNS :
case SUBMTX_BLOCK_DIAGONAL_SYM :
case SUBMTX_BLOCK_DIAGONAL_HERM :
break ;
default :
fprintf(stderr, "\n fatal error in SubMtx_init()"
"\n invalid mode %d", mode) ;
exit(-1) ;
}
/*
-------------------------------------------------------
get and set the number of bytes needed in the workspace
-------------------------------------------------------
*/
nbytes = SubMtx_nbytesNeeded(type, mode, nrow, ncol, nent) ;
SubMtx_setNbytesInWorkspace(mtx, nbytes) ;
DVzero(nbytes/sizeof(double), (double *) SubMtx_workspace(mtx)) ;
/*
--------------
set the fields
--------------
*/
SubMtx_setFields(mtx, type, mode, rowid, colid, nrow, ncol, nent) ;
SubMtx_rowIndices(mtx, &nrow, &rowind) ;
IVramp(nrow, rowind, 0, 1) ;
SubMtx_columnIndices(mtx, &ncol, &colind) ;
IVramp(ncol, colind, 0, 1) ;
return ; }
/*--------------------------------------------------------------------*/
/*
---------------------------------------------------------
purpose -- initialize the object from its working storage
used when the object is a MPI message
created -- 98may01, cca
---------------------------------------------------------
*/
void
SubMtx_initFromBuffer (
SubMtx *mtx
) {
int *ibuffer ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL ) {
fprintf(stderr, "\n fatal error in SubMtx_initFromBuffer(%p)"
"\n bad input\n", mtx) ;
exit(-1) ;
}
ibuffer = (int *) DV_entries(&mtx->wrkDV) ;
SubMtx_setFields(mtx, ibuffer[0], ibuffer[1], ibuffer[2],
ibuffer[3], ibuffer[4], ibuffer[5], ibuffer[6]) ;
return ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1