/*\file Scotch.c *\brief: Scotch partitioner mex module */ #ifdef HAVE_CONFIG_H #include "config.h" #else #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!" #endif #include "./Scotch.h" /******************************/ /* */ /* This is the main function. */ /* */ /******************************/ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { #ifndef _HAVE_SCOTCH_ //only works if scotch library has been compiled in. ISSMERROR(" Scotch not available! Cannot carry out Scotch partitioning!"); #else int argcm; char **argvm=NULL; int nvert =0,nedge2=0,napar =0; mwIndex *ir=NULL,*jc=NULL; int *adjir=NULL,*adjjc=NULL; double *vld=NULL,*vwd=NULL,*ewd=NULL,*apd=NULL; int *vli=NULL,*vwi=NULL,*ewi=NULL,*api=NULL; char *archtyp=NULL; int (*maptabi)[2]=NULL; double* maptabd=NULL; int i,j,k,imi=0,imo=0,isi=0,ierr; /* Check for proper number of arguments */ if (nrhs == 0 && nlhs == 0) { GmapUsage(); return; } else if (nrhs < 6 || nlhs > 1) { GmapUsage(); mexErrMsgTxt(" "); } /* load matlab argument list and convert to integer (note that converting here and in the x-layer is inefficient, but it makes the x-layer more general) */ argvm = (char **) calloc(nrhs,sizeof(char *)); if (!(mxIsNumeric(prhs[imi]) && (mxGetM(prhs[imi]) == 1 && mxGetN(prhs[imi]) == 1))) { argvm[isi] = (char *) calloc(4+1,sizeof(char)); strcpy(argvm[isi],"gmap"); mexPrintf("%s -- Using \"%s\" entry point.\n", __FUNCT__,argvm[isi]); isi++; } else { argvm[isi] = (char *) calloc(5+1,sizeof(char)); strcpy(argvm[isi],"gpart"); mexPrintf("%s -- Using \"%s\" entry point.\n", __FUNCT__,argvm[isi]); isi++; argvm[isi] = (char *) calloc(17,sizeof(char)); sprintf(argvm[isi],"%d",(int)mxGetScalar(prhs[imi])); mexPrintf("%s -- Number of parts is %s.\n", __FUNCT__,argvm[isi]); isi++; imi++; } if (!mxIsNumeric(prhs[imi]) || (!mxIsEmpty(prhs[imi]) && !mxIsSparse(prhs[imi]))) { mexPrintf("%s -- Adjacency matrix must be numeric and sparse.\n",__FUNCT__); mexErrMsgTxt(" "); } else { nvert =mxGetM(prhs[imi]); nedge2=mxGetNzmax(prhs[imi]); if (mxGetNzmax(prhs[imi])) { ir =mxGetIr(prhs[imi]); adjir = (int *) malloc(mxGetNzmax(prhs[imi])*sizeof(int)); for (i=0; i= 5) && (strncmp (argvm[0] + strlen (argvm[0]) - 5, "gpart", 5) == 0))) { if (!mxIsChar(prhs[imi])) { mexPrintf("%s -- Architecture type must be character.\n",__FUNCT__); mexErrMsgTxt(" "); } else { if (mxGetM(prhs[imi])*mxGetN(prhs[imi])) { archtyp = (char *) calloc(mxGetM(prhs[imi])*mxGetN(prhs[imi])+1,sizeof(char)); mxGetString(prhs[imi],archtyp,mxGetM(prhs[imi])*mxGetN(prhs[imi])+1); } mexPrintf("%s -- Architecture type is \"%s\".\n", __FUNCT__,archtyp); } imi++; if (!mxIsNumeric(prhs[imi])) { mexPrintf("%s -- Architecture parameter vector must be numeric.\n",__FUNCT__); mexErrMsgTxt(" "); } else { napar =mxGetM(prhs[imi])*mxGetN(prhs[imi]); if (mxGetM(prhs[imi])*mxGetN(prhs[imi])) { apd=mxGetPr(prhs[imi]); api = (int *) malloc(mxGetM(prhs[imi])*mxGetN(prhs[imi])*sizeof(int)); for (i=0; i=0; i--) free(argvm[i]); if (api) free(api); if (archtyp) free(archtyp); if (ewi) free(ewi); if (vwi) free(vwi); if (vli) free(vli); if (adjjc) free(adjjc); if (adjir) free(adjir);*/ return; #endif //#ifndef _HAVE_SCOTCH_ } void GmapUsage( void ) { mexPrintf("\n"); mexPrintf("Usage: [maptab]=Scotch(adjmat,vertlb,vertwt,edgewt,archtyp,archpar,\n"); mexPrintf(" Scotch-specific parameters);\n"); mexPrintf("\n"); return; }