/* mkNaturalFactorMtx.c */
#include "../InpMtx.h"
#include "../../EGraph.h"
#include "../../Coords.h"
#include "../../Drand.h"
#include "../../timings.h"
/*--------------------------------------------------------------------*/
/*
---------------------------------------------------------------
create a natural factor matrix.
for a n1 x n2 grid there are (n1-1)*(n2-1) elements
and four rows per element, so the matrix is
4*(n1-1)*(n2-1) x n1*n2
for a n1 x n2 x n3 grid there are (n1-1)*(n2-1)*(n3-1) elements
and eight rows per element, so the matrix is
8*(n1-1)*(n2-1)*(n3-1) x n1*n2*n3
created -- 97sep19, cca
---------------------------------------------------------------
*/
void
main ( int argc, char *argv[] )
{
char *outFileName ;
InpMtx *inpmtx ;
double *entries ;
double t1, t2 ;
Drand *drand ;
EGraph *egraph ;
FILE *msgFile ;
int ielem, irow, jrow, msglvl, nelem, nvtx, n1, n2, n3, seed, size ;
int *indices ;
/*
---------------
check the input
---------------
*/
if ( argc != 8 ) {
fprintf(stdout,
"\n\n usage : %s msglvl msgFile n1 n2 n3 seed outFile "
"\n msglvl -- message level"
"\n msgFile -- message file"
"\n n1 -- number of grid points in the first direction"
"\n n2 -- number of grid points in the second direction"
"\n n3 -- number of grid points in the third direction"
"\n seed -- random number seed"
"\n outFile -- file to contain the InpMtx object"
"\n must be *.dinpmtxb or *.dinpmtxf"
"\n", argv[0]) ;
return ;
}
msglvl = atoi(argv[1]) ;
if ( strcmp(argv[2], "stdout") == 0 ) {
msgFile = stdout ;
} else if ( (msgFile = fopen(argv[2], "a")) == NULL ) {
fprintf(stderr, "\n fatal error in %s"
"\n unable to open file %s\n",
argv[0], argv[2]) ;
return ;
}
n1 = atoi(argv[3]) ;
n2 = atoi(argv[4]) ;
n3 = atoi(argv[5]) ;
seed = atoi(argv[6]) ;
outFileName = argv[7] ;
/*
--------------
echo the input
--------------
*/
fprintf(msgFile, "\n input to %s"
"\n msglvl = %d"
"\n msgFile = %s"
"\n n1 = %d"
"\n n2 = %d"
"\n n3 = %d"
"\n seed = %d"
"\n outFile = %s"
"\n",
argv[0], msglvl, argv[2], n1, n2, n3, seed, outFileName) ;
fflush(msgFile) ;
/*
------------------------
create the EGraph object
------------------------
*/
MARKTIME(t1) ;
if ( n3 == 1 ) {
egraph = EGraph_make9P(n1, n2, 1) ;
entries = DVinit(4, 0.0) ;
} else {
egraph = EGraph_make27P(n1, n2, n3, 1) ;
entries = DVinit(8, 0.0) ;
}
MARKTIME(t2) ;
fprintf(msgFile, "\n CPU %9.5f : create egraph ", t2 - t1) ;
if ( msglvl > 2 ) {
EGraph_writeForHumanEye(egraph, msgFile) ;
fflush(msgFile) ;
}
nvtx = egraph->nvtx ;
nelem = egraph->nelem ;
/*
-------------------------------
create the random number object
-------------------------------
*/
drand = Drand_new() ;
Drand_init(drand) ;
Drand_setUniform(drand, -1.0, 1.0) ;
Drand_setSeed(drand, seed) ;
/*
-------------------------
create the InpMtx object
-------------------------
*/
MARKTIME(t1) ;
inpmtx = InpMtx_new() ;
InpMtx_init(inpmtx, INPMTX_BY_ROWS, SPOOLES_REAL, 0, 0) ;
MARKTIME(t2) ;
fprintf(msgFile, "\n CPU %9.5f : initialize the InpMtx object",
t2 - t1) ;
if ( msglvl > 1 ) {
fprintf(msgFile, "\n InpMtx after initialization") ;
InpMtx_writeForHumanEye(inpmtx, msgFile) ;
}
for ( ielem = 0, jrow = 0 ; ielem < nelem ; ielem++ ) {
IVL_listAndSize(egraph->adjIVL, ielem, &size, &indices) ;
if ( n3 == 1 ) {
for ( irow = 0 ; irow < 4 ; irow++, jrow++ ) {
Drand_fillDvector(drand, size, entries) ;
InpMtx_inputRealRow(inpmtx, jrow, size, indices, entries) ;
}
} else {
for ( irow = 0 ; irow < 8 ; irow++, jrow++ ) {
Drand_fillDvector(drand, size, entries) ;
InpMtx_inputRealRow(inpmtx, jrow, size, indices, entries) ;
}
}
}
if ( msglvl > 2 ) {
fprintf(msgFile, "\n\n InpMtx object for a %d x %d x %d grid",
n1, n2, n3) ;
InpMtx_writeForHumanEye(inpmtx, msgFile) ;
fflush(msgFile) ;
}
/*
-------------------------------------------------
optionally write out the InpMtx object to a file
-------------------------------------------------
*/
if ( strcmp(outFileName, "none") != 0 ) {
InpMtx_writeToFile(inpmtx, outFileName) ;
}
/*
----------------
free the objects
----------------
*/
EGraph_free(egraph) ;
InpMtx_free(inpmtx) ;
Drand_free(drand) ;
DVfree(entries) ;
fprintf(msgFile, "\n") ;
return ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1