/* IO.c */
#include "../ILUMtx.h"
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*
---------------------------------------------------------------
purpose -- to write an ILUMtx object to a file in matlab format
return values ---
1 -- normal return
-1 -- mtx is NULL
-2 -- neqns <= 0
-3 -- bad type for mtx
-4 -- bad symmetryflag for mtx
-5 -- bad LstorageMode for mtx
-6 -- bad UstorageMode for mtx
-7 -- sizesL is NULL
-8 -- sizesU is NULL
-9 -- p_indL is NULL
-10 -- p_indU is NULL
-11 -- entD is NULL
-12 -- p_entL is NULL
-13 -- p_entU is NULL
-14 -- Lname is NULL
-15 -- Dname is NULL
-16 -- Uname is NULL
-17 -- fp is NULL
created -- 98oct03, cca
---------------------------------------------------------------
*/
int
ILUMtx_writeForMatlab (
ILUMtx *mtx,
char *Lname,
char *Dname,
char *Uname,
FILE *fp
) {
int ieqn, ii, neqns, size ;
int *ind, *sizesU, *sizesL ;
int **p_indL, **p_indU ;
double *ent, *entD ;
double **p_entL, **p_entU ;
/*
---------------
check the input
---------------
*/
if ( mtx == NULL ) {
fprintf(stderr,
"\n error in ILUMtx_writeForMatlab(), mtx is NULL\n") ;
return(-1) ;
}
if ( (neqns = mtx->neqns) <= 0 ) {
fprintf(stderr, "\n error in ILUM_writeForMatlab()"
"\n neqns = %d\n", neqns) ;
return(-2) ;
}
if ( !(ILUMTX_IS_REAL(mtx) || ILUMTX_IS_COMPLEX(mtx)) ) {
fprintf(stderr, "\n error in ILUM_writeForMatlab()"
"\n mtx type = %d\n", mtx->type) ;
return(-3) ;
}
if ( !(ILUMTX_IS_SYMMETRIC(mtx) || ILUMTX_IS_HERMITIAN(mtx)
|| ILUMTX_IS_NONSYMMETRIC(mtx)) ) {
fprintf(stderr, "\n error in ILUM_writeForMatlab()"
"\n mtx symmetry = %d\n", mtx->symmetryflag) ;
return(-4) ;
}
if ( !(ILUMTX_IS_L_BY_ROWS(mtx) || ILUMTX_IS_L_BY_COLUMNS(mtx)) ) {
fprintf(stderr, "\n error in ILUM_solveVector()"
"\n LstorageMode = %d\n", mtx->LstorageMode) ;
return(-5) ;
}
if ( !(ILUMTX_IS_U_BY_ROWS(mtx) || ILUMTX_IS_U_BY_COLUMNS(mtx)) ) {
fprintf(stderr, "\n error in ILUM_solveVector()"
"\n UstorageMode = %d\n", mtx->UstorageMode) ;
return(-6) ;
}
sizesU = mtx->sizesU ;
entD = mtx->entD ;
p_indU = mtx->p_indU ;
p_entU = mtx->p_entU ;
if ( ILUMTX_IS_SYMMETRIC(mtx) || ILUMTX_IS_HERMITIAN(mtx) ) {
sizesL = mtx->sizesU ;
p_indL = mtx->p_indU ;
p_entL = mtx->p_entU ;
} else {
sizesL = mtx->sizesL ;
p_indL = mtx->p_indL ;
p_entL = mtx->p_entL ;
}
if ( sizesL == NULL ) {
fprintf(stderr,
"\n error in ILUM_writeForMatlab(), sizesL = NULL\n") ;
return(-7) ;
}
if ( sizesU == NULL ) {
fprintf(stderr,
"\n error in ILUM_writeForMatlab(), sizesU = NULL\n") ;
return(-8) ;
}
if ( p_indL == NULL ) {
fprintf(stderr,
"\n error in ILUM_writeForMatlab(), p_indL = NULL\n") ;
return(-9) ;
}
if ( p_indU == NULL ) {
fprintf(stderr,
"\n error in ILUM_writeForMatlab(), p_indU = NULL\n") ;
return(-10) ;
}
if ( entD == NULL ) {
fprintf(stderr, "\n error in ILUM_writeForMatlab(), entD = NULL\n") ;
return(-11) ;
}
if ( p_entL == NULL ) {
fprintf(stderr,
"\n error in ILUM_writeForMatlab(), p_entL = NULL\n") ;
return(-12) ;
}
if ( p_entU == NULL ) {
fprintf(stderr,
"\n error in ILUM_writeForMatlab(), p_entU = NULL\n") ;
return(-13) ;
}
if ( Lname == NULL ) {
fprintf(stderr,
"\n error in ILUMtx_writeForMatlab(), Lname is NULL\n") ;
return(-14) ;
}
if ( Dname == NULL ) {
fprintf(stderr,
"\n error in ILUMtx_writeForMatlab(), Dname is NULL\n") ;
return(-15) ;
}
if ( Uname == NULL ) {
fprintf(stderr,
"\n error in ILUMtx_writeForMatlab(), Uname is NULL\n") ;
return(-16) ;
}
if ( fp == NULL ) {
fprintf(stderr,
"\n error in ILUMtx_writeForMatlab(), fp is NULL\n") ;
return(-17) ;
}
/*--------------------------------------------------------------------*/
/*
--------------------------
write out the entries in D
--------------------------
*/
fprintf(fp, "\n %s = zeros(%d,%d) ;", Dname, neqns, neqns) ;
if ( ILUMTX_IS_REAL(mtx) ) {
for ( ieqn = 0 ; ieqn < neqns ; ieqn++ ) {
fprintf(fp, "\n %s(%d,%d) = %24.16e ;",
Dname, ieqn + 1, ieqn + 1, entD[ieqn]) ;
}
} else if ( ILUMTX_IS_COMPLEX(mtx) ) {
for ( ieqn = 0 ; ieqn < neqns ; ieqn++ ) {
fprintf(fp, "\n %s(%d,%d) = %24.16e + i*%24.16e ;",
Dname, ieqn + 1, ieqn + 1, entD[2*ieqn], entD[2*ieqn+1]) ;
}
}
/*
--------------------------
write out the entries in U
--------------------------
*/
fprintf(fp, "\n %s = eye(%d,%d) ;", Uname, neqns, neqns) ;
if ( ILUMTX_IS_REAL(mtx) ) {
if ( ILUMTX_IS_U_BY_COLUMNS(mtx) ) {
for ( ieqn = 0 ; ieqn < neqns ; ieqn++ ) {
if ( (size = sizesU[ieqn]) > 0 ) {
ind = p_indU[ieqn] ;
ent = p_entU[ieqn] ;
for ( ii = 0 ; ii < size ; ii++ ) {
fprintf(fp, "\n %s(%d,%d) = %24.16e ;",
Uname, ind[ii] + 1, ieqn + 1, ent[ii]) ;
}
}
}
} else if ( ILUMTX_IS_U_BY_ROWS(mtx) ) {
for ( ieqn = 0 ; ieqn < neqns ; ieqn++ ) {
if ( (size = sizesU[ieqn]) > 0 ) {
ind = p_indU[ieqn] ;
ent = p_entU[ieqn] ;
for ( ii = 0 ; ii < size ; ii++ ) {
fprintf(fp, "\n %s(%d,%d) = %24.16e ;",
Uname, ieqn + 1, ind[ii] + 1, ent[ii]) ;
}
}
}
}
} else if ( ILUMTX_IS_COMPLEX(mtx) ) {
if ( ILUMTX_IS_U_BY_COLUMNS(mtx) ) {
for ( ieqn = 0 ; ieqn < neqns ; ieqn++ ) {
if ( (size = sizesU[ieqn]) > 0 ) {
ind = p_indU[ieqn] ;
ent = p_entU[ieqn] ;
for ( ii = 0 ; ii < size ; ii++ ) {
fprintf(fp, "\n %s(%d,%d) = %24.16e + i*%24.16e ;",
Uname, ind[ii] + 1, ieqn + 1,
ent[2*ii], ent[2*ii+1]) ;
}
}
}
} else if ( ILUMTX_IS_U_BY_ROWS(mtx) ) {
for ( ieqn = 0 ; ieqn < neqns ; ieqn++ ) {
if ( (size = sizesU[ieqn]) > 0 ) {
ind = p_indU[ieqn] ;
ent = p_entU[ieqn] ;
for ( ii = 0 ; ii < size ; ii++ ) {
fprintf(fp, "\n %s(%d,%d) = %24.16e + i*%24.16e ;",
Uname, ieqn + 1, ind[ii] + 1,
ent[2*ii], ent[2*ii+1]) ;
}
}
}
}
}
if ( ILUMTX_IS_SYMMETRIC(mtx) ) {
fprintf(fp, "\n %s = transpose(%s) ;", Lname, Uname) ;
} else if ( ILUMTX_IS_HERMITIAN(mtx) ) {
fprintf(fp, "\n %s = ctranspose(%s) ;", Lname, Uname) ;
} else if ( ILUMTX_IS_NONSYMMETRIC(mtx) ) {
/*
--------------------------
write out the entries in L
--------------------------
*/
fprintf(fp, "\n %s = eye(%d,%d) ;", Lname, neqns, neqns) ;
if ( ILUMTX_IS_REAL(mtx) ) {
if ( ILUMTX_IS_L_BY_COLUMNS(mtx) ) {
for ( ieqn = 0 ; ieqn < neqns ; ieqn++ ) {
if ( (size = sizesL[ieqn]) > 0 ) {
ind = p_indL[ieqn] ;
ent = p_entL[ieqn] ;
for ( ii = 0 ; ii < size ; ii++ ) {
fprintf(fp, "\n %s(%d,%d) = %24.16e ;",
Lname, ind[ii] + 1, ieqn + 1, ent[ii]) ;
}
}
}
} else if ( ILUMTX_IS_L_BY_ROWS(mtx) ) {
for ( ieqn = 0 ; ieqn < neqns ; ieqn++ ) {
if ( (size = sizesL[ieqn]) > 0 ) {
ind = p_indL[ieqn] ;
ent = p_entL[ieqn] ;
for ( ii = 0 ; ii < size ; ii++ ) {
fprintf(fp, "\n %s(%d,%d) = %24.16e ;",
Lname, ieqn + 1, ind[ii] + 1, ent[ii]) ;
}
}
}
}
} else if ( ILUMTX_IS_COMPLEX(mtx) ) {
if ( ILUMTX_IS_L_BY_COLUMNS(mtx) ) {
for ( ieqn = 0 ; ieqn < neqns ; ieqn++ ) {
if ( (size = sizesL[ieqn]) > 0 ) {
ind = p_indL[ieqn] ;
ent = p_entL[ieqn] ;
for ( ii = 0 ; ii < size ; ii++ ) {
fprintf(fp, "\n %s(%d,%d) = %24.16e + i*%24.16e ;",
Lname, ind[ii] + 1, ieqn + 1,
ent[2*ii], ent[2*ii+1]) ;
}
}
}
} else if ( ILUMTX_IS_L_BY_ROWS(mtx) ) {
for ( ieqn = 0 ; ieqn < neqns ; ieqn++ ) {
if ( (size = sizesL[ieqn]) > 0 ) {
ind = p_indL[ieqn] ;
ent = p_entL[ieqn] ;
for ( ii = 0 ; ii < size ; ii++ ) {
fprintf(fp, "\n %s(%d,%d) = %24.16e + i*%24.16e ;",
Lname, ieqn + 1, ind[ii] + 1,
ent[2*ii], ent[2*ii+1]) ;
}
}
}
}
}
}
return(1) ; }
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
syntax highlighted by Code2HTML, v. 0.9.1