/* IO.c */
#include "../SolveMap.h"
static const char *suffixb = ".solvemapb" ;
static const char *suffixf = ".solvemapf" ;
/*--------------------------------------------------------------------*/
/*
-----------------------------------------------------
purpose -- to read in an SolveMap object from a file
input --
fn -- filename, must be *.solvemapb or *.solvemapf
return value -- 1 if success, 0 if failure
created -- 98apr09, cca
-----------------------------------------------------
*/
int
SolveMap_readFromFile (
SolveMap *solvemap,
char *fn
) {
FILE *fp ;
int fnlength, rc, sulength ;
/*
---------------
check the input
---------------
*/
if ( solvemap == NULL || fn == NULL ) {
fprintf(stderr,
"\n error in SolveMap_readFromFile(%p,%s), file %s, line %d"
"\n bad input\n", solvemap, fn, __FILE__, __LINE__) ;
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 SolveMap_readFromFile(%p,%s)"
"\n unable to open file %s", solvemap, fn, fn) ;
rc = 0 ;
} else {
rc = SolveMap_readFromBinaryFile(solvemap, fp) ;
fclose(fp) ;
}
} else if ( strcmp(&fn[fnlength-sulength], suffixf) == 0 ) {
if ( (fp = fopen(fn, "r")) == NULL ) {
fprintf(stderr, "\n error in SolveMap_readFromFile(%p,%s)"
"\n unable to open file %s", solvemap, fn, fn) ;
rc = 0 ;
} else {
rc = SolveMap_readFromFormattedFile(solvemap, fp) ;
fclose(fp) ;
}
} else {
fprintf(stderr, "\n error in SolveMap_readFromFile(%p,%s)"
"\n bad SolveMap file name %s,"
"\n must end in %s (binary) or %s (formatted)\n",
solvemap, fn, fn, suffixb, suffixf) ;
rc = 0 ;
}
} else {
fprintf(stderr, "\n error in SolveMap_readFromFile(%p,%s)"
"\n bad SolveMap file name %s,"
"\n must end in %s (binary) or %s (formatted)\n",
solvemap, fn, fn, suffixb, suffixf) ;
rc = 0 ;
}
return(rc) ; }
/*--------------------------------------------------------------------*/
/*
-----------------------------------------------------------
purpose -- to read an SolveMap object from a formatted file
return value -- 1 if success, 0 if failure
created -- 98apr09, cca
-----------------------------------------------------------
*/
int
SolveMap_readFromFormattedFile (
SolveMap *solvemap,
FILE *fp
) {
int nblockLower, nblockUpper, nfront, nproc, rc, symmetryflag ;
int itemp[5] ;
/*
---------------
check the input
---------------
*/
if ( solvemap == NULL || fp == NULL ) {
fprintf(stderr, "\n error in SolveMap_readFromFormattedFile(%p,%p)"
"\n bad input\n", solvemap, fp) ;
return(0) ;
}
/*
---------------------
clear the data fields
---------------------
*/
SolveMap_clearData(solvemap) ;
/*
-----------------------------------------------------
read in the five scalar parameters
symmetryflag, nfront, nproc, nblockUpper, nblockLower
-----------------------------------------------------
*/
if ( (rc = IVfscanf(fp, 5, itemp)) != 5 ) {
fprintf(stderr, "\n error in SolveMap_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n", solvemap, fp, rc, 5) ;
return(0) ;
}
symmetryflag = itemp[0] ;
nfront = itemp[1] ;
nproc = itemp[2] ;
nblockUpper = itemp[3] ;
nblockLower = itemp[4] ;
/*
---------------------
initialize the object
---------------------
*/
SolveMap_init(solvemap, symmetryflag, nfront, nproc,
nblockUpper, nblockLower) ;
/*
---------------------------
read in the owners[] vector
---------------------------
*/
if ( (rc = IVfscanf(fp, nfront, solvemap->owners)) != nfront ) {
fprintf(stderr, "\n error in SolveMap_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n", solvemap, fp, rc, nfront) ;
return(0) ;
}
if ( nblockUpper > 0 ) {
/*
--------------------------------
read in the rowidsUpper[] vector
--------------------------------
*/
if ( (rc = IVfscanf(fp, nblockUpper, solvemap->rowidsUpper))
!= nblockUpper ) {
fprintf(stderr,
"\n error in SolveMap_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n",
solvemap, fp, rc, nblockUpper) ;
return(0) ;
}
/*
--------------------------------
read in the colidsUpper[] vector
--------------------------------
*/
if ( (rc = IVfscanf(fp, nblockUpper, solvemap->colidsUpper))
!= nblockUpper ) {
fprintf(stderr,
"\n error in SolveMap_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n",
solvemap, fp, rc, nblockUpper) ;
return(0) ;
}
/*
-----------------------------
read in the mapUpper[] vector
-----------------------------
*/
if ( (rc = IVfscanf(fp, nblockUpper, solvemap->mapUpper))
!= nblockUpper ) {
fprintf(stderr,
"\n error in SolveMap_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n",
solvemap, fp, rc, nblockUpper) ;
return(0) ;
}
}
if ( symmetryflag == 2 && nblockLower > 0 ) {
/*
--------------------------------
read in the rowidsLower[] vector
--------------------------------
*/
if ( (rc = IVfscanf(fp, nblockLower, solvemap->rowidsLower))
!= nblockLower ) {
fprintf(stderr,
"\n error in SolveMap_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n",
solvemap, fp, rc, nblockLower) ;
return(0) ;
}
/*
--------------------------------
read in the colidsLower[] vector
--------------------------------
*/
if ( (rc = IVfscanf(fp, nblockLower, solvemap->colidsLower))
!= nblockLower ) {
fprintf(stderr,
"\n error in SolveMap_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n",
solvemap, fp, rc, nblockLower) ;
return(0) ;
}
/*
-----------------------------
read in the mapLower[] vector
-----------------------------
*/
if ( (rc = IVfscanf(fp, nblockLower, solvemap->mapLower))
!= nblockLower ) {
fprintf(stderr,
"\n error in SolveMap_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n",
solvemap, fp, rc, nblockLower) ;
return(0) ;
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
---------------------------------------------------------
purpose -- to read an SolveMap object from a binary file
return value -- 1 if success, 0 if failure
created -- 98apr09, cca
---------------------------------------------------------
*/
int
SolveMap_readFromBinaryFile (
SolveMap *solvemap,
FILE *fp
) {
int nblockLower, nblockUpper, nfront, nproc, rc, symmetryflag ;
int itemp[5] ;
/*
---------------
check the input
---------------
*/
if ( solvemap == NULL || fp == NULL ) {
fprintf(stderr, "\n fatal error in SolveMap_readFromBinaryFile(%p,%p)"
"\n bad input\n", solvemap, fp) ;
return(0) ;
}
/*
---------------------
clear the data fields
---------------------
*/
SolveMap_clearData(solvemap) ;
/*
-----------------------------------------------------
read in the five scalar parameters
symmetryflag, nfront, nproc, nblockUpper, nblockLower
-----------------------------------------------------
*/
if ( (rc = fread((void *) itemp, sizeof(int), 5, fp)) != 5 ) {
fprintf(stderr, "\n error in SolveMap_readFromBinaryFile(%p,%p)"
"\n itemp(3) : %d items of %d read\n", solvemap, fp, rc, 5) ;
return(0) ;
}
symmetryflag = itemp[0] ;
nfront = itemp[1] ;
nproc = itemp[2] ;
nblockUpper = itemp[3] ;
nblockLower = itemp[4] ;
/*
---------------------
initialize the object
---------------------
*/
SolveMap_init(solvemap, symmetryflag, nfront, nproc,
nblockUpper, nblockLower) ;
/*
---------------------------
read in the owners[] vector
---------------------------
*/
fread((void *) solvemap->owners, sizeof(int), nfront, fp) ;
if ( rc != nfront ) {
fprintf(stderr, "\n error in SolveMap_readFromBinaryFile(%p,%p)"
"\n %d items of %d read\n", solvemap, fp, rc, nfront) ;
return(0) ;
}
if ( nblockUpper > 0 ) {
/*
--------------------------------
read in the rowidsUpper[] vector
--------------------------------
*/
fread((void *) solvemap->rowidsUpper, sizeof(int), nblockUpper, fp) ;
if ( rc != nblockUpper ) {
fprintf(stderr,
"\n error in SolveMap_readFromBinaryFile(%p,%p)"
"\n %d items of %d read\n",
solvemap, fp, rc, nblockUpper) ;
return(0) ;
}
/*
--------------------------------
read in the colidsUpper[] vector
--------------------------------
*/
fread((void *) solvemap->colidsUpper, sizeof(int), nblockUpper, fp) ;
if ( rc != nblockUpper ) {
fprintf(stderr,
"\n error in SolveMap_readFromBinaryFile(%p,%p)"
"\n %d items of %d read\n",
solvemap, fp, rc, nblockUpper) ;
return(0) ;
}
/*
-----------------------------
read in the mapUpper[] vector
-----------------------------
*/
fread((void *) solvemap->mapUpper, sizeof(int), nblockUpper, fp) ;
if ( rc != nblockUpper ) {
fprintf(stderr,
"\n error in SolveMap_readFromBinaryFile(%p,%p)"
"\n %d items of %d read\n",
solvemap, fp, rc, nblockUpper) ;
return(0) ;
}
}
if ( symmetryflag == 2 && nblockLower > 0 ) {
/*
--------------------------------
read in the rowidsLower[] vector
--------------------------------
*/
fread((void *) solvemap->rowidsLower, sizeof(int), nblockLower, fp) ;
if ( rc != nblockLower ) {
fprintf(stderr,
"\n error in SolveMap_readFromBinaryFile(%p,%p)"
"\n %d items of %d read\n",
solvemap, fp, rc, nblockLower) ;
return(0) ;
}
/*
--------------------------------
read in the colidsLower[] vector
--------------------------------
*/
fread((void *) solvemap->colidsLower, sizeof(int), nblockLower, fp) ;
if ( rc != nblockLower ) {
fprintf(stderr,
"\n error in SolveMap_readFromBinaryFile(%p,%p)"
"\n %d items of %d read\n",
solvemap, fp, rc, nblockLower) ;
return(0) ;
}
/*
-----------------------------
read in the mapLower[] vector
-----------------------------
*/
fread((void *) solvemap->mapLower, sizeof(int), nblockLower, fp) ;
if ( rc != nblockLower ) {
fprintf(stderr,
"\n error in SolveMap_readFromBinaryFile(%p,%p)"
"\n %d items of %d read\n",
solvemap, fp, rc, nblockLower) ;
return(0) ;
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
------------------------------------------------
purpose -- to write an SolveMap object to a file
input --
fn -- filename
*.solvemapb -- binary
*.solvemapf -- formatted
anything else -- for human eye
return value -- 1 if success, 0 otherwise
created -- 98apr09, cca
------------------------------------------------
*/
int
SolveMap_writeToFile (
SolveMap *solvemap,
char *fn
) {
FILE *fp ;
int fnlength, rc, sulength ;
/*
---------------
check the input
---------------
*/
if ( solvemap == NULL || fn == NULL ) {
fprintf(stderr, "\n fatal error in SolveMap_writeToFile(%p,%s)"
"\n bad input\n", solvemap, fn) ;
}
/*
------------------
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 SolveMap_writeToFile(%p,%s)"
"\n unable to open file %s", solvemap, fn, fn) ;
rc = 0 ;
} else {
rc = SolveMap_writeToBinaryFile(solvemap, fp) ;
fclose(fp) ;
}
} else if ( strcmp(&fn[fnlength-sulength], suffixf) == 0 ) {
if ( (fp = fopen(fn, "w")) == NULL ) {
fprintf(stderr, "\n error in SolveMap_writeToFile(%p,%s)"
"\n unable to open file %s", solvemap, fn, fn) ;
rc = 0 ;
} else {
rc = SolveMap_writeToFormattedFile(solvemap, fp) ;
fclose(fp) ;
}
} else {
if ( (fp = fopen(fn, "a")) == NULL ) {
fprintf(stderr, "\n error in SolveMap_writeToFile(%p,%s)"
"\n unable to open file %s", solvemap, fn, fn) ;
rc = 0 ;
} else {
rc = SolveMap_writeForHumanEye(solvemap, fp) ;
fclose(fp) ;
}
}
} else {
if ( (fp = fopen(fn, "a")) == NULL ) {
fprintf(stderr, "\n error in SolveMap_writeToFile(%p,%s)"
"\n unable to open file %s", solvemap, fn, fn) ;
rc = 0 ;
} else {
rc = SolveMap_writeForHumanEye(solvemap, fp) ;
fclose(fp) ;
}
}
return(rc) ; }
/*--------------------------------------------------------------------*/
/*
-----------------------------------------------------
purpose -- to write an SolveMap object to a formatted file
return value -- 1 if success, 0 otherwise
created -- 98apr09, cca
-----------------------------------------------------
*/
int
SolveMap_writeToFormattedFile (
SolveMap *solvemap,
FILE *fp
) {
int ierr, rc ;
/*
---------------
check the input
---------------
*/
if ( solvemap == NULL || fp == NULL ) {
fprintf(stderr,
"\n fatal error in SolveMap_writeToFormattedFile(%p,%p)"
"\n bad input\n", solvemap, fp) ;
exit(-1) ;
}
/*
------------------------------------
write out the five scalar parameters
------------------------------------
*/
rc = fprintf(fp, "\n %d %d %d %d %d",
solvemap->symmetryflag,
solvemap->nfront,
solvemap->nproc,
solvemap->nblockUpper,
solvemap->nblockLower) ;
if ( rc < 0 ) {
fprintf(stderr,
"\n fatal error in SolveMap_writeToFormattedFile(%p,%p)"
"\n rc = %d, return from first fprintf\n",
solvemap, fp, rc) ;
return(0) ;
}
if ( solvemap->nfront > 0 ) {
IVfp80(fp, solvemap->nfront, solvemap->owners, 80, &ierr) ;
if ( ierr < 0 ) {
fprintf(stderr,
"\n fatal error in SolveMap_writeToFormattedFile(%p,%p)"
"\n ierr = %d, return from owners[] IVfp80\n",
solvemap, fp, ierr) ;
return(0) ;
}
}
if ( solvemap->nblockUpper > 0 ) {
IVfp80(fp, solvemap->nblockUpper, solvemap->rowidsUpper, 80, &ierr) ;
if ( ierr < 0 ) {
fprintf(stderr,
"\n fatal error in SolveMap_writeToFormattedFile(%p,%p)"
"\n ierr = %d, return from rowidsUpper[] IVfp80\n",
solvemap, fp, ierr) ;
return(0) ;
}
IVfp80(fp, solvemap->nblockUpper, solvemap->colidsUpper, 80, &ierr) ;
if ( ierr < 0 ) {
fprintf(stderr,
"\n fatal error in SolveMap_writeToFormattedFile(%p,%p)"
"\n ierr = %d, return from colidsUpper[] IVfp80\n",
solvemap, fp, ierr) ;
return(0) ;
}
IVfp80(fp, solvemap->nblockUpper, solvemap->mapUpper, 80, &ierr) ;
if ( ierr < 0 ) {
fprintf(stderr,
"\n fatal error in SolveMap_writeToFormattedFile(%p,%p)"
"\n ierr = %d, return from mapUpper[] IVfp80\n",
solvemap, fp, ierr) ;
return(0) ;
}
}
if ( solvemap->symmetryflag == 2 && solvemap->nblockLower > 0 ) {
IVfp80(fp, solvemap->nblockLower, solvemap->rowidsLower, 80, &ierr) ;
if ( ierr < 0 ) {
fprintf(stderr,
"\n fatal error in SolveMap_writeToFormattedFile(%p,%p)"
"\n ierr = %d, return from rowidsLower[] IVfp80\n",
solvemap, fp, ierr) ;
return(0) ;
}
IVfp80(fp, solvemap->nblockLower, solvemap->colidsLower, 80, &ierr) ;
if ( ierr < 0 ) {
fprintf(stderr,
"\n fatal error in SolveMap_writeToFormattedFile(%p,%p)"
"\n ierr = %d, return from colidsLower[] IVfp80\n",
solvemap, fp, ierr) ;
return(0) ;
}
IVfp80(fp, solvemap->nblockLower, solvemap->mapLower, 80, &ierr) ;
if ( ierr < 0 ) {
fprintf(stderr,
"\n fatal error in SolveMap_writeToFormattedFile(%p,%p)"
"\n ierr = %d, return from mapLower[] IVfp80\n",
solvemap, fp, ierr) ;
return(0) ;
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
--------------------------------------------------
purpose -- to write an SolveMap object to a binary file
return value -- 1 if success, 0 otherwise
created -- 98apr09, cca
--------------------------------------------------
*/
int
SolveMap_writeToBinaryFile (
SolveMap *solvemap,
FILE *fp
) {
int rc ;
int itemp[5] ;
/*
---------------
check the input
---------------
*/
if ( solvemap == NULL || fp == NULL ) {
fprintf(stderr, "\n fatal error in SolveMap_writeToBinaryFile(%p,%p)"
"\n bad input\n", solvemap, fp) ;
exit(-1) ;
}
itemp[0] = solvemap->symmetryflag ;
itemp[1] = solvemap->nfront ;
itemp[2] = solvemap->nproc ;
itemp[2] = solvemap->nblockUpper ;
itemp[2] = solvemap->nblockLower ;
rc = fwrite((void *) itemp, sizeof(int), 5, fp) ;
if ( rc != 5 ) {
fprintf(stderr, "\n error in SolveMap_writeToBinaryFile(%p,%p)"
"\n %d of %d scalar items written\n", solvemap, fp, rc, 5) ;
return(0) ;
}
rc = fwrite((void *) solvemap->owners, sizeof(int),
solvemap->nfront, fp) ;
if ( rc != solvemap->nfront ) {
fprintf(stderr, "\n error in SolveMap_writeToBinaryFile(%p,%p)"
"\n owners: %d of %d items written\n",
solvemap, fp, rc, solvemap->nfront) ;
return(0) ;
}
if ( solvemap->nblockUpper > 0 ) {
rc = fwrite((void *) solvemap->rowidsUpper, sizeof(int),
solvemap->nblockUpper, fp) ;
if ( rc != solvemap->nfront ) {
fprintf(stderr, "\n error in SolveMap_writeToBinaryFile(%p,%p)"
"\n owners: %d of %d items written\n",
solvemap, fp, rc, solvemap->nblockUpper) ;
return(0) ;
}
rc = fwrite((void *) solvemap->colidsUpper, sizeof(int),
solvemap->nblockUpper, fp) ;
if ( rc != solvemap->nfront ) {
fprintf(stderr, "\n error in SolveMap_writeToBinaryFile(%p,%p)"
"\n owners: %d of %d items written\n",
solvemap, fp, rc, solvemap->nblockUpper) ;
return(0) ;
}
rc = fwrite((void *) solvemap->mapUpper, sizeof(int),
solvemap->nblockUpper, fp) ;
if ( rc != solvemap->nfront ) {
fprintf(stderr, "\n error in SolveMap_writeToBinaryFile(%p,%p)"
"\n owners: %d of %d items written\n",
solvemap, fp, rc, solvemap->nblockUpper) ;
return(0) ;
}
}
if ( solvemap->symmetryflag == 2 && solvemap->nblockLower > 0 ) {
rc = fwrite((void *) solvemap->rowidsLower, sizeof(int),
solvemap->nblockLower, fp) ;
if ( rc != solvemap->nfront ) {
fprintf(stderr, "\n error in SolveMap_writeToBinaryFile(%p,%p)"
"\n owners: %d of %d items written\n",
solvemap, fp, rc, solvemap->nblockLower) ;
return(0) ;
}
rc = fwrite((void *) solvemap->colidsLower, sizeof(int),
solvemap->nblockLower, fp) ;
if ( rc != solvemap->nfront ) {
fprintf(stderr, "\n error in SolveMap_writeToBinaryFile(%p,%p)"
"\n owners: %d of %d items written\n",
solvemap, fp, rc, solvemap->nblockLower) ;
return(0) ;
}
rc = fwrite((void *) solvemap->mapLower, sizeof(int),
solvemap->nblockLower, fp) ;
if ( rc != solvemap->nfront ) {
fprintf(stderr, "\n error in SolveMap_writeToBinaryFile(%p,%p)"
"\n owners: %d of %d items written\n",
solvemap, fp, rc, solvemap->nblockLower) ;
return(0) ;
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------
purpose -- to write an SolveMap object for a human eye
return value -- 1 if success, 0 otherwise
created -- 98apr09, cca
------------------------------------------------------
*/
int
SolveMap_writeForHumanEye (
SolveMap *solvemap,
FILE *fp
) {
int ierr, kk, rc ;
if ( solvemap == NULL || fp == NULL ) {
fprintf(stderr, "\n fatal error in SolveMap_writeForHumanEye(%p,%p)"
"\n bad input\n", solvemap, fp) ;
exit(-1) ;
}
if ( (rc = SolveMap_writeStats(solvemap, fp)) == 0 ) {
fprintf(stderr, "\n fatal error in SolveMap_writeForHumanEye(%p,%p)"
"\n rc = %d, return from SolveMap_writeStats(%p,%p)\n",
solvemap, fp, rc, solvemap, fp) ;
return(0) ;
}
fprintf(fp, "\n\n front owners map") ;
IVfp80(fp, solvemap->nfront, solvemap->owners, 80, &ierr) ;
if ( solvemap->nblockUpper > 0 ) {
fprintf(fp, "\n\n upper block map") ;
for ( kk = 0 ; kk < solvemap->nblockUpper ; kk++ ) {
fprintf(fp, "\n block(%d,%d) owned by process %d",
solvemap->rowidsUpper[kk], solvemap->colidsUpper[kk],
solvemap->mapUpper[kk]) ;
}
}
if ( solvemap->symmetryflag == 2 && solvemap->nblockLower > 0 ) {
fprintf(fp, "\n\n lower block map") ;
for ( kk = 0 ; kk < solvemap->nblockLower ; kk++ ) {
fprintf(fp, "\n block(%d,%d) owned by process %d",
solvemap->rowidsLower[kk], solvemap->colidsLower[kk],
solvemap->mapLower[kk]) ;
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
--------------------------------------------------------------
purpose -- to write out the statistics for the SolveMap object
return value -- 1 if success, 0 otherwise
created -- 98apr09, cca
--------------------------------------------------------------
*/
int
SolveMap_writeStats (
SolveMap *solvemap,
FILE *fp
) {
/*
---------------
check the input
---------------
*/
if ( solvemap == NULL || fp == NULL ) {
fprintf(stderr, "\n error in SolveMap_writeStats(%p,%p)"
"\n bad input\n", solvemap, fp) ;
exit(-1) ;
}
fprintf(fp, "\n SolveMap : submatrix solve object :") ;
if ( solvemap->symmetryflag < 2 ) {
fprintf(fp, "\n matrix is symmetric") ;
} else {
fprintf(fp, "\n matrix is nonsymmetric") ;
}
fprintf(fp,
"\n %d fronts, %d processes, %d upper blocks, %d lower blocks",
solvemap->nfront, solvemap->nproc,
solvemap->nblockUpper, solvemap->nblockLower) ;
return(1) ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1