/* IO.c */
#include "../A2.h"
static const char *suffixb = ".a2b" ;
static const char *suffixf = ".a2f" ;
/*--------------------------------------------------------------------*/
/*
--------------------------------------------
purpose -- to read in the object from a file
input --
fn -- filename, must be *.a2b or *.a2f
return value -- 1 if success, 0 if failure
created -- 98may01, cca
--------------------------------------------
*/
int
A2_readFromFile (
A2 *mtx,
char *fn
) {
FILE *fp ;
int fnlength, rc = 0, sulength ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL || fn == NULL ) {
fprintf(stderr, "\n error in A2_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 A2_readFromFile(%s)"
"\n unable to open file %s", fn, fn) ;
} else {
rc = A2_readFromBinaryFile(mtx, fp) ;
fclose(fp) ;
}
} else if ( strcmp(&fn[fnlength-sulength], suffixf) == 0 ) {
if ( (fp = fopen(fn, "r")) == NULL ) {
fprintf(stderr, "\n error in A2_readFromFile(%s)"
"\n unable to open file %s", fn, fn) ;
} else {
rc = A2_readFromFormattedFile(mtx, fp) ;
fclose(fp) ;
}
} else {
fprintf(stderr, "\n error in A2_readFromFile(%s)"
"\n bad A2 file name %s,"
"\n must end in %s (binary) or %s (formatted)\n",
fn, fn, suffixb, suffixf) ;
rc = 0 ;
}
} else {
fprintf(stderr, "\n error in A2_readFromFile(%s)"
"\n bad A2 file name %s,"
"\n must end in %s (binary) or %s (formatted)\n",
fn, 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 -- 98may01, cca
--------------------------------------------------
*/
int
A2_readFromFormattedFile (
A2 *mtx,
FILE *fp
) {
int rc, size ;
int itemp[5] ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL || fp == NULL ) {
fprintf(stderr, "\n error in A2_readFromFormattedFile(%p,%p)"
"\n bad input", mtx, fp) ;
return(0) ;
}
/*
---------------------
clear the data fields
---------------------
*/
A2_clearData(mtx) ;
/*
-----------------------------------------------------------
read in the five scalar parameters: type n1, n2, inc1, inc2
-----------------------------------------------------------
*/
if ( (rc = IVfscanf(fp, 5, itemp)) != 5 ) {
fprintf(stderr, "\n error in A2_readFromFormattedFile()"
"\n %d items of %d read\n", rc, 5) ;
return(0) ;
}
/*
---------------------
initialize the object
---------------------
*/
A2_init(mtx, itemp[0], itemp[1], itemp[2], itemp[3], itemp[4], NULL) ;
/*
----------------------------
read in the entries[] vector
----------------------------
*/
if ( (size = 1 + (mtx->n1-1)*mtx->inc1 + (mtx->n2-1)*mtx->inc2) > 0 ) {
if ( A2_IS_REAL(mtx) ) {
if ( (rc = DVfscanf(fp, size, mtx->entries)) != size ) {
fprintf(stderr, "\n error in A2_readFromFormattedFile"
"\n %d items of %d read\n", rc, size) ;
return(0) ;
}
} else if ( A2_IS_COMPLEX(mtx) ) {
if ( (rc = DVfscanf(fp, 2*size, mtx->entries)) != 2*size ) {
fprintf(stderr, "\n error in A2_readFromFormattedFile"
"\n %d items of %d read\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 -- 98may01, cca
-----------------------------------------------
*/
int
A2_readFromBinaryFile (
A2 *mtx,
FILE *fp
) {
int rc, size ;
int itemp[5] ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL || fp == NULL ) {
fprintf(stderr, "\n fatal error in A2_readFromBinaryFile(%p,%p)"
"\n bad input", mtx, fp) ;
return(0) ;
}
/*
---------------------
clear the data fields
---------------------
*/
A2_clearData(mtx) ;
/*
------------------------------------------------------------
read in the five scalar parameters: type, n1, n2, inc1, inc2
------------------------------------------------------------
*/
if ( (rc = fread((char *) itemp, sizeof(int), 5, fp)) != 5 ) {
fprintf(stderr, "\n error in A2_readFromBinaryFile"
"\n %d items of %d read\n", rc, 5) ;
return(0) ;
}
fprintf(stdout, "\n itemp = {%d, %d, %d, %d, %d}",
itemp[0], itemp[1], itemp[2], itemp[3], itemp[4]) ;
fflush(stdout) ;
/*
---------------------
initialize the object
---------------------
*/
A2_init(mtx, itemp[0], itemp[1], itemp[2], itemp[3], itemp[4], NULL) ;
/*
----------------------------
read in the entries[] vector
----------------------------
*/
if ( (size = 1 + (mtx->n1-1)*mtx->inc1 + (mtx->n2-1)*mtx->inc2) > 0 ) {
if ( A2_IS_REAL(mtx) ) {
if ( (rc = fread(mtx->entries, sizeof(double), size, fp))
!= size ) {
fprintf(stderr, "\n error in A2_readFromBinaryFile"
"\n %d items of %d read\n", rc, size) ;
return(0) ;
}
} else if ( A2_IS_COMPLEX(mtx) ) {
if ( (rc = fread(mtx->entries, sizeof(double), 2*size, fp))
!= 2*size ) {
fprintf(stderr, "\n error in A2_readFromBinaryFile"
"\n %d items of %d read\n", rc, 2*size) ;
return(0) ;
}
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
---------------------------------------
purpose -- to write an object to a file
input --
fn -- filename
*.a2b -- binary
*.a2f -- formatted
anything else -- for human eye
created -- 98may01, cca
---------------------------------------
*/
void
A2_writeToFile (
A2 *mtx,
char *fn
) {
FILE *fp ;
int fnlength, sulength ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL || fn == NULL ) {
fprintf(stderr, "\n fatal error in A2_writeToFile(%p,%s)"
"\n bad input", mtx, 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 A2_writeToFile()"
"\n unable to open file %s", fn) ;
} else {
A2_writeToBinaryFile(mtx, fp) ;
fclose(fp) ;
}
} else if ( strcmp(&fn[fnlength-sulength], suffixf) == 0 ) {
if ( (fp = fopen(fn, "w")) == NULL ) {
fprintf(stderr, "\n error in A2_writeToFile()"
"\n unable to open file %s", fn) ;
} else {
A2_writeToFormattedFile(mtx, fp) ;
fclose(fp) ;
}
} else {
if ( (fp = fopen(fn, "a")) == NULL ) {
fprintf(stderr, "\n error in A2_writeToFile()"
"\n unable to open file %s", fn) ;
} else {
A2_writeForHumanEye(mtx, fp) ;
fclose(fp) ;
}
}
} else {
if ( (fp = fopen(fn, "a")) == NULL ) {
fprintf(stderr, "\n error in A2_writeToFile"
"\n unable to open file %s", fn) ;
} else {
A2_writeForHumanEye(mtx, fp) ;
fclose(fp) ;
}
}
return ; }
/*--------------------------------------------------------------------*/
/*
-------------------------------------------------
purpose -- to write an object to a formatted file
created -- 98may01, cca
-------------------------------------------------
*/
void
A2_writeToFormattedFile (
A2 *mtx,
FILE *fp
) {
int size ;
if ( mtx == NULL || fp == NULL ) {
return ;
}
fprintf(fp, "\n %d %d %d %d %d",
mtx->type, mtx->n1, mtx->n2, mtx->inc1, mtx->inc2) ;
if ( (size = 1 + (mtx->n1-1)*mtx->inc1 + (mtx->n2-1)*mtx->inc2) > 0
&& mtx->entries != NULL ) {
if ( A2_IS_REAL(mtx) ) {
DVfprintf(fp, size, mtx->entries) ;
} else if ( A2_IS_COMPLEX(mtx) ) {
DVfprintf(fp, 2*size, mtx->entries) ;
}
}
return ; }
/*--------------------------------------------------------------------*/
/*
--------------------------------------------------------
purpose -- to write an adjacency object to a binary file
created -- 98may01, cca
--------------------------------------------------------
*/
void
A2_writeToBinaryFile (
A2 *mtx,
FILE *fp
) {
int size ;
if ( fp == NULL ) {
return ;
}
fwrite((void *) &mtx->type, sizeof(int), 1, fp) ;
fwrite((void *) &mtx->n1, sizeof(int), 1, fp) ;
fwrite((void *) &mtx->n2, sizeof(int), 1, fp) ;
fwrite((void *) &mtx->inc1, sizeof(int), 1, fp) ;
fwrite((void *) &mtx->inc2, sizeof(int), 1, fp) ;
if ( (size = 1 + (mtx->n1-1)*mtx->inc1 + (mtx->n2-1)*mtx->inc2) > 0
&& mtx->entries != NULL ) {
if ( A2_IS_REAL(mtx) ) {
fwrite((void *) &mtx->entries, sizeof(double), size, fp) ;
} else if ( A2_IS_COMPLEX(mtx) ) {
fwrite((void *) &mtx->entries, sizeof(double), 2*size, fp) ;
}
}
return ; }
/*--------------------------------------------------------------------*/
/*
----------------------------------------------
purpose -- to write the object for a human eye
created -- 98may01, cca
----------------------------------------------
*/
void
A2_writeForHumanEye (
A2 *mtx,
FILE *fp
) {
int i, j, jfirst, jlast, loc ;
if ( mtx == NULL || fp == NULL ) {
fprintf(stderr, "\n fatal error in A2_writeForHumanEye(%p,%p)"
"\n bad input\n", mtx, fp) ;
exit(-1) ;
}
A2_writeStats(mtx, fp) ;
if ( A2_IS_REAL(mtx) ) {
for ( jfirst = 0 ; jfirst < mtx->n2 ; jfirst += 4 ) {
jlast = jfirst + 3 ;
if ( jlast >= mtx->n2 ) {
jlast = mtx->n2 - 1 ;
}
fprintf(fp, "\n ") ;
for ( j = jfirst ; j <= jlast ; j++ ) {
fprintf(fp, "%19d", j) ;
}
for ( i = 0 ; i < mtx->n1 ; i++ ) {
fprintf(fp, "\n%4d", i) ;
for ( j = jfirst ; j <= jlast ; j++ ) {
fprintf(fp, "%19.11e",
mtx->entries[i*mtx->inc1 + j*mtx->inc2]) ;
}
}
}
} else if ( A2_IS_COMPLEX(mtx) ) {
for ( jfirst = 0 ; jfirst < mtx->n2 ; jfirst += 2 ) {
jlast = jfirst + 1 ;
if ( jlast >= mtx->n2 ) {
jlast = mtx->n2 - 1 ;
}
fprintf(fp, "\n ") ;
for ( j = jfirst ; j <= jlast ; j++ ) {
fprintf(fp, "%36d", j) ;
}
for ( i = 0 ; i < mtx->n1 ; i++ ) {
fprintf(fp, "\n%4d", i) ;
for ( j = jfirst ; j <= jlast ; j++ ) {
loc = 2*(i*mtx->inc1 + j*mtx->inc2) ;
fprintf(fp, " (%16.9e,%16.9e*i)",
mtx->entries[loc], mtx->entries[loc+1]) ;
}
}
}
}
return ; }
/*--------------------------------------------------------------------*/
/*
--------------------------------------
purpose -- to write out the statistics
created -- 98may01, cca
--------------------------------------
*/
void
A2_writeStats (
A2 *mtx,
FILE *fp
) {
if ( mtx == NULL || fp == NULL ) {
fprintf(stderr, "\n fatal error in A2_writeStats(%p,%p)"
"\n bad input\n", mtx, fp) ;
exit(-1) ;
}
if ( A2_IS_REAL(mtx) ) {
fprintf(fp, "\n A2 : double 2D array object :") ;
} else if ( A2_IS_COMPLEX(mtx) ) {
fprintf(fp, "\n A2 : double complex 2D array object :") ;
}
fprintf(fp,
"\n %d x %d matrix, inc1 = %d, inc2 = %d,"
"\n nowned = %d, %d entries allocated, occupies %d bytes"
"\n entries = %p, maxabs = %20.12e",
mtx->n1, mtx->n2, mtx->inc1, mtx->inc2, mtx->nowned,
mtx->n1*mtx->n2,
A2_sizeOf(mtx), mtx->entries, A2_maxabs(mtx)) ;
return ; }
/*--------------------------------------------------------------------*/
/*
-----------------------------------------------
purpose -- to write the matrix in matlab format
created -- 98may01, cca
-----------------------------------------------
*/
void
A2_writeForMatlab (
A2 *mtx,
char *mtxname,
FILE *fp
) {
int irow, jcol, ncol, nrow ;
if ( mtx == NULL || mtxname == NULL || fp == NULL ) {
fprintf(stderr, "\n fatal error in A2_writeForMatlab(%p,%p,%p)"
"\n bad input\n", mtx, mtxname, fp) ;
exit(-1) ;
}
nrow = A2_nrow(mtx) ;
ncol = A2_ncol(mtx) ;
for ( irow = 0 ; irow < nrow ; irow++ ) {
for ( jcol = 0 ; jcol < ncol ; jcol++ ) {
if ( A2_IS_REAL(mtx) ) {
double value ;
A2_realEntry(mtx, irow, jcol, &value) ;
fprintf(fp, "\n %s(%d,%d) = %24.16e ;",
mtxname, irow+1, jcol+1, value) ;
} else if ( A2_IS_COMPLEX(mtx) ) {
double imag, real ;
A2_complexEntry(mtx, irow, jcol, &real, &imag) ;
fprintf(fp, "\n %s(%d,%d) = %24.16e + %24.16e*i ;",
mtxname, irow+1, jcol+1, real, imag) ;
}
}
}
return ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1