/* setup.c */
#include "../Pencil.h"
#include "../../timings.h"
/*--------------------------------------------------------------------*/
/*
----------------------------------------------------------------
initialize the matrix pencil A + sigma*B
myid -- id of process, used in MPI implementation
if myid = 0 then
the pencil is loaded with the matrices read from the files
else
the pencil is loaded with the empty matrices
endif
symflag -- symmetry flag,
SPOOLES_SYMMETRIC -- symmetric
SPOOLES_HERMITIAN -- hermitian
SPOOLES_NONSYMMETRIC -- nonsymmetric
if symmetric or hermitian, drop entries in lower triangle
inpmtxAfile -- filename for A
sigma -- scaling factor
inpmtxBfile -- filename for B
randomflag -- random flag,
if 1 then fill with random numbers
drand -- random number generator
msglvl -- message level
msgFile -- message file
return value -- pointer to a Pencil object
created -- 98may02, cca
----------------------------------------------------------------
*/
Pencil *
Pencil_setup (
int myid,
int symflag,
char *inpmtxAfile,
double sigma[],
char *inpmtxBfile,
int randomflag,
Drand *drand,
int msglvl,
FILE *msgFile
) {
InpMtx *inpmtxA, *inpmtxB ;
double t1, t2 ;
Pencil *pencil ;
int rc ;
switch ( symflag ) {
case SPOOLES_SYMMETRIC :
case SPOOLES_HERMITIAN :
case SPOOLES_NONSYMMETRIC :
break ;
default :
fprintf(stderr, "\n fatal error in Pencil_setup()"
"\n bad symflag %d\n", symflag) ;
exit(-1) ;
break ;
}
if ( strcmp(inpmtxAfile, "none") != 0 ) {
/*
--------------------------
read in the InpMtx object
--------------------------
*/
inpmtxA = InpMtx_new() ;
if ( myid == 0 ) {
MARKTIME(t1) ;
rc = InpMtx_readFromFile(inpmtxA, inpmtxAfile) ;
MARKTIME(t2) ;
fprintf(msgFile,"\n CPU %8.3f : read in inpmtxA", t2 - t1) ;
if ( rc != 1 ) {
fprintf(msgFile,
"\n return value %d from InpMtx_readFromFile(%p,%s)",
rc, inpmtxA, inpmtxAfile) ;
exit(-1) ;
}
if ( symflag == SPOOLES_SYMMETRIC
|| symflag == SPOOLES_HERMITIAN ){
/*
----------------------------------------------------
symmetric matrix, drop entries in the lower triangle
----------------------------------------------------
*/
MARKTIME(t1) ;
InpMtx_dropLowerTriangle(inpmtxA) ;
InpMtx_changeStorageMode(inpmtxA, 1) ;
/*
------------------------------------
sort and compress the matrix entries
------------------------------------
*/
InpMtx_sortAndCompress(inpmtxA) ;
MARKTIME(t2) ;
fprintf(msgFile,"\n CPU %8.3f : initialize inpmtxA", t2 - t1) ;
}
if ( randomflag == 1 ) {
/*
-----------------------------------
fill the matrix with random numbers
-----------------------------------
*/
MARKTIME(t1) ;
if ( INPMTX_IS_REAL_ENTRIES(inpmtxA) ) {
Drand_fillDvector(drand, inpmtxA->nent,
DV_entries(&inpmtxA->dvecDV)) ;
} else if ( INPMTX_IS_COMPLEX_ENTRIES(inpmtxA) ) {
Drand_fillDvector(drand, 2*inpmtxA->nent,
DV_entries(&inpmtxA->dvecDV)) ;
}
MARKTIME(t2) ;
fprintf(msgFile,
"\n CPU %8.3f : fill inpmtxA with random numbers", t2 - t1) ;
} else if ( randomflag == -1 ) {
/*
-----------------------------
double one entry in magnitude
-----------------------------
*/
double *dvec = DV_entries(&inpmtxA->dvecDV) ;
if ( INPMTX_IS_REAL_ENTRIES(inpmtxA) ) {
dvec[0] *= 2 ;
} else if ( INPMTX_IS_COMPLEX_ENTRIES(inpmtxA) ) {
dvec[0] *= 2 ; dvec[1] *= 2 ;
}
}
}
/*
--------------------------------------
change the coordinate type to chevrons
and the storage mode to sorted triples
--------------------------------------
*/
MARKTIME(t1) ;
InpMtx_changeCoordType(inpmtxA, 3) ;
InpMtx_changeStorageMode(inpmtxA, 2) ;
MARKTIME(t2) ;
fprintf(msgFile,
"\n CPU %8.3f : change inpmtxA to chevrons", t2 - t1) ;
} else {
inpmtxA = NULL ;
}
if ( strcmp(inpmtxBfile, "none") != 0 ) {
/*
--------------------------
read in the InpMtx object
--------------------------
*/
inpmtxB = InpMtx_new() ;
if ( myid == 0 ) {
MARKTIME(t1) ;
rc = InpMtx_readFromFile(inpmtxB, inpmtxBfile) ;
MARKTIME(t2) ;
fprintf(msgFile,"\n CPU %8.3f : read in inpmtxB", t2 - t1) ;
if ( rc != 1 ) {
fprintf(msgFile,
"\n return value %d from InpMtx_readFromFile(%p,%s)",
rc, inpmtxB, inpmtxBfile) ;
exit(-1) ;
}
if ( symflag == SPOOLES_SYMMETRIC
|| symflag == SPOOLES_HERMITIAN ){
/*
----------------------------------------------------
symmetric matrix, drop entries in the lower triangle
----------------------------------------------------
*/
MARKTIME(t1) ;
InpMtx_dropLowerTriangle(inpmtxB) ;
InpMtx_changeStorageMode(inpmtxB, 1) ;
/*
------------------------------------
sort and compress the matrix entries
------------------------------------
*/
InpMtx_sortAndCompress(inpmtxB) ;
MARKTIME(t2) ;
fprintf(msgFile,"\n CPU %8.3f : initialize inpmtxB", t2 - t1) ;
}
if ( randomflag == 1 ) {
/*
-----------------------------------
fill the matrix with random numbers
-----------------------------------
*/
MARKTIME(t1) ;
if ( INPMTX_IS_REAL_ENTRIES(inpmtxA) ) {
Drand_fillDvector(drand, inpmtxB->nent,
DV_entries(&inpmtxB->dvecDV)) ;
} else if ( INPMTX_IS_COMPLEX_ENTRIES(inpmtxA) ) {
Drand_fillDvector(drand, 2*inpmtxB->nent,
DV_entries(&inpmtxB->dvecDV)) ;
}
MARKTIME(t2) ;
fprintf(msgFile,
"\n CPU %8.3f : fill inpmtxB with random numbers", t2 - t1) ;
} else if ( randomflag == -1 ) {
/*
-----------------------------
double one entry in magnitude
-----------------------------
*/
double *dvec = DV_entries(&inpmtxB->dvecDV) ;
if ( INPMTX_IS_REAL_ENTRIES(inpmtxA) ) {
dvec[0] *= 2 ;
} else if ( INPMTX_IS_COMPLEX_ENTRIES(inpmtxA) ) {
dvec[0] *= 2 ; dvec[1] *= 2 ;
}
}
}
/*
--------------------------------------
change the coordinate type to chevrons
and the storage mode to sorted triples
--------------------------------------
*/
MARKTIME(t1) ;
InpMtx_changeCoordType(inpmtxB, 3) ;
InpMtx_changeStorageMode(inpmtxB, 2) ;
MARKTIME(t2) ;
fprintf(msgFile,
"\n CPU %8.3f : change inpmtxB to chevrons", t2 - t1) ;
} else {
inpmtxB = NULL ;
}
/*
-----------------------------
initialize the Pencil object
-----------------------------
*/
if ( inpmtxA != NULL && inpmtxB != NULL ) {
if ( inpmtxA->inputMode != inpmtxB->inputMode ) {
fprintf(stderr, "\n fatal error in Pencil_setup()"
"\n inpmtxA->inputMode = %d, inpmtxB->inputMode = %d\n",
inpmtxA->inputMode, inpmtxB->inputMode) ;
exit(-1) ;
}
if ( INPMTX_IS_REAL_ENTRIES(inpmtxA) ) {
pencil = Pencil_new() ;
Pencil_init(pencil, SPOOLES_REAL, symflag,
inpmtxA, sigma, inpmtxB) ;
} else if ( INPMTX_IS_COMPLEX_ENTRIES(inpmtxA) ) {
pencil = Pencil_new() ;
Pencil_init(pencil, SPOOLES_COMPLEX, symflag,
inpmtxA, sigma, inpmtxB) ;
} else {
fprintf(stderr, "\n fatal error in Pencil_setup()"
"\n inpmtxA->inputMode = %d\n", inpmtxA->inputMode) ;
exit(-1) ;
}
} else if ( inpmtxA != NULL ) {
if ( INPMTX_IS_REAL_ENTRIES(inpmtxA) ) {
pencil = Pencil_new() ;
Pencil_init(pencil, SPOOLES_REAL, symflag,
inpmtxA, sigma, inpmtxB) ;
} else if ( INPMTX_IS_COMPLEX_ENTRIES(inpmtxA) ) {
pencil = Pencil_new() ;
Pencil_init(pencil, SPOOLES_COMPLEX, symflag,
inpmtxA, sigma, inpmtxB) ;
} else {
fprintf(stderr, "\n fatal error in Pencil_setup()"
"\n inpmtxA->inputMode = %d\n",
inpmtxA->inputMode) ;
exit(-1) ;
}
} else if ( inpmtxB != NULL ) {
if ( INPMTX_IS_REAL_ENTRIES(inpmtxB) ) {
pencil = Pencil_new() ;
Pencil_init(pencil, SPOOLES_REAL, symflag,
inpmtxA, sigma, inpmtxB) ;
} else if ( INPMTX_IS_COMPLEX_ENTRIES(inpmtxB) ) {
pencil = Pencil_new() ;
Pencil_init(pencil, SPOOLES_COMPLEX, symflag,
inpmtxA, sigma, inpmtxB) ;
} else {
fprintf(stderr, "\n fatal error in Pencil_setup()"
"\n inpmtxB->inputMode = %d\n", inpmtxB->inputMode) ;
exit(-1) ;
}
}
return(pencil) ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1