/* IO.c */
#include "../DenseMtx.h"
static const char *suffixb = ".densemtxb" ;
static const char *suffixf = ".densemtxf" ;
/*--------------------------------------------------------------------*/
/*
-----------------------------------------------------------
purpose -- to read in the object from a file
input --
fn -- filename, must be *.densemtxb or *.densemtxf
return value -- 1 if success, 0 if failure
created -- 98aug13
-----------------------------------------------------------
*/
int
DenseMtx_readFromFile (
DenseMtx *mtx,
char *fn
) {
FILE *fp ;
int fnlength, rc = 0, sulength ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL || fn == NULL ) {
fprintf(stderr, "\n error in DenseMtx_readFromFile(%p,%s)"
"\n bad input", mtx, fn) ;
return(0) ;
}
/*
-------------
read the file
-------------
*/
fnlength = strlen(fn) ;
sulength = strlen(suffixb) ;
if ( fnlength > sulength ) {
if ( strcmp(&fn[fnlength-sulength], suffixb) == 0 ) {
if ( (fp = fopen(fn, "rb")) == NULL ) {
fprintf(stderr, "\n error in DenseMtx_readFromFile()"
"\n unable to open file %s", fn) ;
} else {
rc = DenseMtx_readFromBinaryFile(mtx, fp) ;
fclose(fp) ;
}
} else if ( strcmp(&fn[fnlength-sulength], suffixf) == 0 ) {
if ( (fp = fopen(fn, "r")) == NULL ) {
fprintf(stderr, "\n error in DenseMtx_readFromFile()"
"\n unable to open file %s", fn) ;
} else {
rc = DenseMtx_readFromFormattedFile(mtx, fp) ;
fclose(fp) ;
}
} else {
fprintf(stderr, "\n error in DenseMtx_readFromFile()"
"\n bad DenseMtx file name %s,"
"\n must end in %s (binary) or %s (formatted)\n",
fn, suffixb, suffixf) ;
rc = 0 ;
}
} else {
fprintf(stderr,
"\n error in DenseMtx_readFromFile()"
"\n bad DenseMtx file name %s,"
"\n must end in %s (binary) or %s (formatted)\n",
fn, suffixb, suffixf) ;
rc = 0 ;
}
return(rc) ; }
/*--------------------------------------------------------------------*/
/*
--------------------------------------------------
purpose -- to read an object from a formatted file
return value -- 1 if success, 0 if failure
created -- 98aug13
--------------------------------------------------
*/
int
DenseMtx_readFromFormattedFile (
DenseMtx *mtx,
FILE *fp
) {
int rc, size ;
int itemp[7] ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL || fp == NULL ) {
fprintf(stderr, "\n error in DenseMtx_readFromFormattedFile(%p,%p)"
"\n bad input", mtx, fp) ;
return(0) ;
}
/*
---------------------
clear the data fields
---------------------
*/
DenseMtx_clearData(mtx) ;
/*
--------------------------------------------
read in the seven scalar parameters:
type, rowid, colid, nrow, ncol, inc1, inc2
--------------------------------------------
*/
if ( (rc = IVfscanf(fp, 7, itemp)) != 7 ) {
fprintf(stderr, "\n error in DenseMtx_readFromFormattedFile()"
"\n %d items of %d read\n", rc, 7) ;
return(0) ;
}
/*
---------------------
initialize the object
---------------------
*/
DenseMtx_init(mtx, itemp[0], itemp[1], itemp[2],
itemp[3], itemp[4], itemp[5], itemp[6]) ;
/*
---------------------------
read in the rowind[] vector
---------------------------
*/
if ( (size = mtx->nrow) > 0 ) {
if ( (rc = IVfscanf(fp, size, mtx->rowind)) != size ) {
fprintf(stderr, "\n error in DenseMtx_readFromFormattedFile()"
"\n %d items of %d read for rowind\n", rc, size) ;
return(0) ;
}
}
/*
---------------------------
read in the colind[] vector
---------------------------
*/
if ( (size = mtx->ncol) > 0 ) {
if ( (rc = IVfscanf(fp, size, mtx->colind)) != size ) {
fprintf(stderr, "\n error in DenseMtx_readFromFormattedFile()"
"\n %d items of %d read for colind\n", rc, size) ;
return(0) ;
}
}
/*
----------------------------
read in the entries[] vector
----------------------------
*/
if ( (size = mtx->nrow*mtx->ncol) > 0 ) {
if ( DENSEMTX_IS_REAL(mtx) ) {
if ( (rc = DVfscanf(fp, size, mtx->entries)) != size ) {
fprintf(stderr, "\n error in DenseMtx_readFromFormattedFile()"
"\n %d items of %d read for entries\n", rc, size) ;
return(0) ;
}
} else if ( DENSEMTX_IS_COMPLEX(mtx) ) {
if ( (rc = DVfscanf(fp, 2*size, mtx->entries)) != 2*size ) {
fprintf(stderr, "\n error in DenseMtx_readFromFormattedFile()"
"\n %d items of %d read for entries\n", rc, 2*size) ;
return(0) ;
}
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
-----------------------------------------------
purpose -- to read an object from a binary file
return value -- 1 if success, 0 if failure
created -- 98aug13
-----------------------------------------------
*/
int
DenseMtx_readFromBinaryFile (
DenseMtx *mtx,
FILE *fp
) {
int rc, size ;
int itemp[7] ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL || fp == NULL ) {
fprintf(stderr,
"\n fatal error in DenseMtx_readFromBinaryFile(%p,%p)"
"\n bad input", mtx, fp) ;
return(0) ;
}
/*
---------------------
clear the data fields
---------------------
*/
DenseMtx_clearData(mtx) ;
/*
--------------------------------------------
read in the seven scalar parameters:
type, rowid, colid, nrow, ncol, inc1, inc2
--------------------------------------------
*/
if ( (rc = fread((char *) itemp, sizeof(int), 7, fp)) != 7 ) {
fprintf(stderr, "\n error in DenseMtx_readFromBinaryFile()"
"\n %d items of %d read\n", rc, 7) ;
return(0) ;
}
/*
---------------------
initialize the object
---------------------
*/
DenseMtx_init(mtx, itemp[0], itemp[1], itemp[2],
itemp[3], itemp[4], itemp[5], itemp[6]) ;
/*
---------------------------
read in the rowind[] vector
---------------------------
*/
if ( (size = mtx->nrow) > 0 ) {
if ( (rc = fread(mtx->rowind, sizeof(int), size, fp)) != size ) {
fprintf(stderr, "\n error in DenseMtx_readFromBinaryFile()"
"\n %d items of %d read for rowind[]\n", rc, size) ;
return(0) ;
}
}
/*
---------------------------
read in the colind[] vector
---------------------------
*/
if ( (size = mtx->ncol) > 0 ) {
if ( (rc = fread(mtx->colind, sizeof(int), size, fp)) != size ) {
fprintf(stderr, "\n error in DenseMtx_readFromBinaryFile()"
"\n %d items of %d read for colind[]\n", rc, size) ;
return(0) ;
}
}
/*
----------------------------
read in the entries[] vector
----------------------------
*/
if ( (size = mtx->nrow*mtx->ncol) > 0 ) {
if ( DENSEMTX_IS_REAL(mtx) ) {
rc = fread(mtx->entries, sizeof(double), size, fp) ;
if ( rc != size ) {
fprintf(stderr, "\n error in DenseMtx_readFromBinaryFile()"
"\n %d items of %d read for entries\n", rc, size) ;
return(0) ;
}
} else if ( DENSEMTX_IS_COMPLEX(mtx) ) {
rc = fread(mtx->entries, sizeof(double), 2*size, fp) ;
if ( rc != 2*size ) {
fprintf(stderr, "\n error in DenseMtx_readFromBinaryFile()"
"\n %d items of %d read for entries\n", rc, 2*size) ;
return(0) ;
}
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
---------------------------------------
purpose -- to write an object to a file
input --
fn -- filename
*.densemtxb -- binary
*.densemtxf -- formatted
anything else -- for human eye
error return --
1 -- normal return
-1 -- mtx is NULL
-2 -- fn is NULL
-3 -- unable to open file
created -- 98aug13
---------------------------------------
*/
int
DenseMtx_writeToFile (
DenseMtx *mtx,
char *fn
) {
FILE *fp ;
int fnlength, sulength ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeToFile(%p,%s)"
"\n mtx is NULL", mtx, fn) ;
return(-1) ;
}
if ( fn == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeToFile(%p,%s)"
"\n fn is NULL", mtx, fn) ;
return(-2) ;
}
/*
------------------
write out the file
------------------
*/
fnlength = strlen(fn) ;
sulength = strlen(suffixb) ;
if ( fnlength > sulength ) {
if ( strcmp(&fn[fnlength-sulength], suffixb) == 0 ) {
if ( (fp = fopen(fn, "wb")) == NULL ) {
fprintf(stderr, "\n error in DenseMtx_writeToFile()"
"\n unable to open file %s", fn) ;
return(-3) ;
} else {
DenseMtx_writeToBinaryFile(mtx, fp) ;
fclose(fp) ;
}
} else if ( strcmp(&fn[fnlength-sulength], suffixf) == 0 ) {
if ( (fp = fopen(fn, "w")) == NULL ) {
fprintf(stderr, "\n error in DenseMtx_writeToFile()"
"\n unable to open file %s", fn) ;
return(-3) ;
} else {
DenseMtx_writeToFormattedFile(mtx, fp) ;
fclose(fp) ;
}
} else {
if ( (fp = fopen(fn, "a")) == NULL ) {
fprintf(stderr, "\n error in DenseMtx_writeToFile()"
"\n unable to open file %s", fn) ;
return(-3) ;
} else {
DenseMtx_writeForHumanEye(mtx, fp) ;
fclose(fp) ;
}
}
} else {
if ( (fp = fopen(fn, "a")) == NULL ) {
fprintf(stderr, "\n error in DenseMtx_writeToFile()"
"\n unable to open file %s", fn) ;
return(-3) ;
} else {
DenseMtx_writeForHumanEye(mtx, fp) ;
fclose(fp) ;
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
-------------------------------------------------
purpose -- to write an object to a formatted file
return value --
1 -- normal return
-1 -- mtx is NULL
-2 -- fn is NULL
created -- 98aug13
-------------------------------------------------
*/
int
DenseMtx_writeToFormattedFile (
DenseMtx *mtx,
FILE *fp
) {
int size ;
if ( mtx == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeToFormattedFile()"
"\n mtx is NULL") ;
return(-1) ;
}
if ( fp == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeToFormattedFile()"
"\n fp is NULL") ;
return(-2) ;
}
fprintf(fp, "\n %d %d %d %d %d %d %d",
mtx->type, mtx->rowid, mtx->colid,
mtx->nrow, mtx->ncol, mtx->inc1, mtx->inc2) ;
if ( (size = mtx->nrow) > 0 && mtx->rowind != NULL ) {
IVfprintf(fp, size, mtx->rowind) ;
}
if ( (size = mtx->ncol) > 0 && mtx->colind != NULL ) {
IVfprintf(fp, size, mtx->colind) ;
}
if ( (size = mtx->nrow*mtx->ncol) > 0 && mtx->entries != NULL ) {
if ( DENSEMTX_IS_REAL(mtx) ) {
DVfprintf(fp, size, mtx->entries) ;
} else if ( DENSEMTX_IS_COMPLEX(mtx) ) {
DVfprintf(fp, 2*size, mtx->entries) ;
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
--------------------------------------------------------
purpose -- to write an adjacency object to a binary file
return value --
1 -- normal return
-1 -- mtx is NULL
-2 -- fn is NULL
created -- 98aug13
--------------------------------------------------------
*/
int
DenseMtx_writeToBinaryFile (
DenseMtx *mtx,
FILE *fp
) {
int size ;
if ( mtx == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeToBinaryFile()"
"\n mtx is NULL") ;
return(-1) ;
}
if ( fp == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeToBinaryFile()"
"\n fp is NULL") ;
return(-2) ;
}
fwrite((void *) &mtx->type, sizeof(int), 1, fp) ;
fwrite((void *) &mtx->rowid, sizeof(int), 1, fp) ;
fwrite((void *) &mtx->colid, sizeof(int), 1, fp) ;
fwrite((void *) &mtx->nrow, sizeof(int), 1, fp) ;
fwrite((void *) &mtx->ncol, sizeof(int), 1, fp) ;
fwrite((void *) &mtx->inc1, sizeof(int), 1, fp) ;
fwrite((void *) &mtx->inc2, sizeof(int), 1, fp) ;
if ( (size = mtx->nrow) > 0 && mtx->rowind != NULL ) {
fwrite((void *) mtx->rowind, sizeof(int), size, fp) ;
}
if ( (size = mtx->ncol) > 0 && mtx->colind != NULL ) {
fwrite((void *) mtx->colind, sizeof(int), size, fp) ;
}
if ( (size = mtx->nrow*mtx->ncol) > 0 && mtx->entries != NULL ) {
if ( DENSEMTX_IS_REAL(mtx) ) {
fwrite((void *) mtx->entries, sizeof(double), size, fp) ;
} else if ( DENSEMTX_IS_COMPLEX(mtx) ) {
fwrite((void *) mtx->entries, sizeof(double), 2*size, fp) ;
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
-----------------------------------------------------
purpose -- to write the object's statistics to a file
in human readable form
return value --
1 -- normal return
-1 -- mtx is NULL
-2 -- fp is NULL
created -- 98may02, cca
-----------------------------------------------------
*/
int
DenseMtx_writeStats (
DenseMtx *mtx,
FILE *fp
) {
/*
---------------
check the input
---------------
*/
if ( mtx == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeStats()"
"\n mtx is NULL") ;
return(-1) ;
}
if ( fp == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeStats()"
"\n fp is NULL") ;
return(-2) ;
}
fprintf(fp, "\n DenseMtx object at address %p", mtx) ;
switch ( mtx->type ) {
case SPOOLES_REAL :
fprintf(fp, ", real entries") ;
break ;
case SPOOLES_COMPLEX :
fprintf(fp, ", complex entries") ;
break ;
default :
fprintf(fp, ", unknown entries type") ;
break ;
}
fprintf(fp, "\n row id = %d, col id = %d"
"\n nrow = %d, ncol = %d, inc1 = %d, inc2 = %d",
mtx->rowid, mtx->colid,
mtx->nrow, mtx->ncol, mtx->inc1, mtx->inc2) ;
fprintf(fp, "\n rowind = %p, colind = %p, entries = %p",
mtx->rowind, mtx->colind, mtx->entries) ;
fprintf(fp, ", base = %p", DV_entries(&mtx->wrkDV)) ;
fprintf(fp,
"\n rowind - base = %d, colind - base = %d, entries - base = %d",
mtx->rowind - (int *) DV_entries(&mtx->wrkDV),
mtx->colind - (int *) DV_entries(&mtx->wrkDV),
mtx->entries - DV_entries(&mtx->wrkDV)) ;
return(1) ; }
/*--------------------------------------------------------------------*/
/*
----------------------------------------
purpose -- to write the object to a file
in human readable form
return value --
1 -- normal return
-1 -- mtx is NULL
-2 -- fp is NULL
created -- 98may02, cca
----------------------------------------
*/
int
DenseMtx_writeForHumanEye (
DenseMtx *mtx,
FILE *fp
) {
A2 a2 ;
int ierr, ncol, nrow ;
int *colind, *rowind ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeForHumanEye()"
"\n mtx is NULL\n") ;
return(-1) ;
}
if ( fp == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeForHumanEye()"
"\n mtx is NULL\n") ;
return(-2) ;
}
DenseMtx_writeStats(mtx, fp) ;
DenseMtx_rowIndices(mtx, &nrow, &rowind) ;
if ( nrow > 0 && rowind != NULL ) {
fprintf(fp, "\n mtx's row indices at %p", rowind) ;
IVfp80(fp, nrow, rowind, 80, &ierr) ;
}
DenseMtx_columnIndices(mtx, &ncol, &colind) ;
if ( ncol > 0 && colind != NULL ) {
fprintf(fp, "\n mtx's column indices at %p", colind) ;
IVfp80(fp, ncol, colind, 80, &ierr) ;
}
if ( nrow > 0 && ncol > 0 ) {
A2_setDefaultFields(&a2) ;
DenseMtx_setA2(mtx, &a2) ;
A2_writeForHumanEye(&a2, fp) ;
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
-----------------------------------------------
purpose -- to write the object to a matlab file
return value --
1 -- normal return
-1 -- mtx is NULL
-2 -- mtx is NULL
-3 -- fp is NULL
created -- 98may02, cca
-----------------------------------------------
*/
int
DenseMtx_writeForMatlab (
DenseMtx *mtx,
char *mtxname,
FILE *fp
) {
double *entries ;
int inc1, inc2, irow, jcol, ncol, nrow ;
int *colind, *rowind ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeForMatlab()"
"\n mtx is NULL\n") ;
return(-1) ;
}
if ( mtxname == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeForMatlab()"
"\n mtxname is NULL\n") ;
return(-2) ;
}
if ( fp == NULL ) {
fprintf(stderr, "\n fatal error in DenseMtx_writeForMatlab()"
"\n fp is NULL\n") ;
return(-3) ;
}
DenseMtx_rowIndices(mtx, &nrow, &rowind) ;
DenseMtx_columnIndices(mtx, &ncol, &colind) ;
DenseMtx_dimensions(mtx, &nrow, &ncol) ;
inc1 = DenseMtx_rowIncrement(mtx) ;
inc2 = DenseMtx_columnIncrement(mtx) ;
entries = DenseMtx_entries(mtx) ;
if ( DENSEMTX_IS_REAL(mtx) ) {
for ( jcol = 0 ; jcol < ncol ; jcol++ ) {
for ( irow = 0 ; irow < nrow ; irow++ ) {
fprintf(fp, "\n %s(%d,%d) = %24.16e ;",
mtxname, rowind[irow]+1, colind[jcol]+1,
entries[irow*inc1+jcol*inc2]) ;
}
}
} else if ( DENSEMTX_IS_COMPLEX(mtx) ) {
for ( jcol = 0 ; jcol < ncol ; jcol++ ) {
for ( irow = 0 ; irow < nrow ; irow++ ) {
fprintf(fp, "\n %s(%d,%d) = %24.16e + %24.16e*i ;",
mtxname, rowind[irow]+1, colind[jcol]+1,
entries[2*(irow*inc1+jcol*inc2)],
entries[2*(irow*inc1+jcol*inc2)+1]) ;
}
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1