Ice Sheet System Model  4.18
Code documentation
Scotch.cpp
Go to the documentation of this file.
1 /*\file Scotch.c
2  *\brief: Scotch partitioner mex module
3  */
4 
5 #ifdef HAVE_CONFIG_H
6 #include "config.h"
7 #else
8 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
9 #endif
10 #include "./Scotch.h"
11 
12 void GmapUsage(void){/*{{{*/
13  mexPrintf("\n");
14  mexPrintf("Usage: [maptab]=Scotch(adjmat,vertlb,vertwt,edgewt,archtyp,archpar,\n");
15  mexPrintf(" Scotch-specific parameters);\n");
16  mexPrintf("\n");
17 }/*}}}*/
18 void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
19 
20  #ifndef _HAVE_SCOTCH_ //only works if scotch library has been compiled in.
21  _error_("Scotch not available! Cannot carry out Scotch partitioning!");
22  #else
23 
24  int argcm;
25  char **argvm=NULL;
26  int nvert =0,nedge2=0,napar =0;
27  mwIndex *ir=NULL,*jc=NULL;
28  int *adjir=NULL,*adjjc=NULL;
29  double *vld=NULL,*vwd=NULL,*ewd=NULL,*apd=NULL;
30  int *vli=NULL,*vwi=NULL,*ewi=NULL,*api=NULL;
31  char *archtyp=NULL;
32  int (*maptabi)[2]=NULL;
33  double* maptabd=NULL;
34  int i,j,k,imi=0,imo=0,isi=0,ierr;
35 
36  /* Check for proper number of arguments */
37 
38  if (nrhs == 0 && nlhs == 0) {
39  GmapUsage();
40  return;
41  }
42  else if (nrhs < 6 || nlhs > 1) {
43  GmapUsage();
44  mexErrMsgTxt(" ");
45  }
46 
47 /* load matlab argument list and convert to integer (note that converting here
48  and in the x-layer is inefficient, but it makes the x-layer more general) */
49 
50  argvm = (char **) calloc(nrhs,sizeof(char *));
51 
52  if (!(mxIsNumeric(prhs[imi]) &&
53  (mxGetM(prhs[imi]) == 1 && mxGetN(prhs[imi]) == 1))) {
54  argvm[isi] = (char *) calloc(4+1,sizeof(char));
55  strcpy(argvm[isi],"gmap");
56  mexPrintf("%s -- Using \"%s\" entry point.\n",
57  __FUNCT__,argvm[isi]);
58  isi++;
59  }
60  else {
61  argvm[isi] = (char *) calloc(5+1,sizeof(char));
62  strcpy(argvm[isi],"gpart");
63  mexPrintf("%s -- Using \"%s\" entry point.\n",
64  __FUNCT__,argvm[isi]);
65  isi++;
66 
67  argvm[isi] = (char *) calloc(17,sizeof(char));
68  sprintf(argvm[isi],"%d",(int)mxGetScalar(prhs[imi]));
69  mexPrintf("%s -- Number of parts is %s.\n",
70  __FUNCT__,argvm[isi]);
71  isi++;
72  imi++;
73  }
74 
75  if (!mxIsNumeric(prhs[imi]) || (!mxIsEmpty(prhs[imi]) && !mxIsSparse(prhs[imi]))) {
76  mexPrintf("%s -- Adjacency matrix must be numeric and sparse.\n",__FUNCT__);
77  mexErrMsgTxt(" ");
78  }
79  else {
80  nvert =mxGetM(prhs[imi]);
81  nedge2=mxGetNzmax(prhs[imi]);
82  if (mxGetNzmax(prhs[imi])) {
83  ir =mxGetIr(prhs[imi]);
84  adjir = (int *) malloc(mxGetNzmax(prhs[imi])*sizeof(int));
85  for (i=0; i<mxGetNzmax(prhs[imi]); i++)
86  adjir[i]=(int)ir[i];
87  }
88  if (mxGetN(prhs[imi])) {
89  jc =mxGetJc(prhs[imi]);
90  adjjc = (int *) malloc((mxGetN(prhs[imi])+1)*sizeof(int));
91  for (i=0; i<(mxGetN(prhs[imi])+1); i++)
92  adjjc[i]=(int)jc[i];
93  }
94  mexPrintf("%s -- Adjacency matrix is of size %d by %d with %d non-zeroes.\n",
95  __FUNCT__,mxGetM(prhs[imi]),mxGetN(prhs[imi]),mxGetNzmax(prhs[imi]));
96  }
97  imi++;
98 
99  if (!mxIsNumeric(prhs[imi])) {
100  mexPrintf("%s -- Vertex label vector must be numeric.\n",__FUNCT__);
101  mexErrMsgTxt(" ");
102  }
103  else {
104  if (mxGetM(prhs[imi])*mxGetN(prhs[imi])) {
105  vld=mxGetPr(prhs[imi]);
106  vli = (int *) malloc(mxGetM(prhs[imi])*mxGetN(prhs[imi])*sizeof(int));
107  for (i=0; i<mxGetM(prhs[imi])*mxGetN(prhs[imi]); i++)
108  vli[i]=(int)vld[i];
109  }
110  mexPrintf("%s -- Vertex label vector is of size %d by %d.\n",
111  __FUNCT__,mxGetM(prhs[imi]),mxGetN(prhs[imi]));
112  }
113  imi++;
114 
115  if (!mxIsNumeric(prhs[imi])) {
116  mexPrintf("%s -- Vertex weight vector must be numeric.\n",__FUNCT__);
117  mexErrMsgTxt(" ");
118  }
119  else {
120  if (mxGetM(prhs[imi])*mxGetN(prhs[imi])) {
121  vwd=mxGetPr(prhs[imi]);
122  vwi = (int *) malloc(mxGetM(prhs[imi])*mxGetN(prhs[imi])*sizeof(int));
123  for (i=0; i<mxGetM(prhs[imi])*mxGetN(prhs[imi]); i++)
124  vwi[i]=(int)vwd[i];
125  }
126  mexPrintf("%s -- Vertex weight vector is of size %d by %d.\n",
127  __FUNCT__,mxGetM(prhs[imi]),mxGetN(prhs[imi]));
128  }
129  imi++;
130 
131  if (!mxIsNumeric(prhs[imi]) || (!mxIsEmpty(prhs[imi]) && !mxIsSparse(prhs[imi]))) {
132  mexPrintf("%s -- Edge weight matrix must be numeric and sparse.\n",__FUNCT__);
133  mexErrMsgTxt(" ");
134  }
135  else {
136  if (mxGetM(prhs[imi])) {
137  ewd=mxGetPr(prhs[imi]);
138  ewi = (int *) malloc(mxGetM(prhs[imi])*sizeof(int));
139  for (i=0; i<mxGetNzmax(prhs[imi]); i++)
140  ewi[i]=(int)ewd[i];
141  }
142  mexPrintf("%s -- Edge weight matrix is of size %d by %d with %d non-zeroes.\n",
143  __FUNCT__,mxGetM(prhs[imi]),mxGetN(prhs[imi]),mxGetNzmax(prhs[imi]));
144  }
145  imi++;
146 
147  if (!((strlen (argvm[0]) >= 5) &&
148  (strncmp (argvm[0] + strlen (argvm[0]) - 5, "gpart", 5) == 0))) {
149  if (!mxIsChar(prhs[imi])) {
150  mexPrintf("%s -- Architecture type must be character.\n",__FUNCT__);
151  mexErrMsgTxt(" ");
152  }
153  else {
154  if (mxGetM(prhs[imi])*mxGetN(prhs[imi])) {
155  archtyp = (char *) calloc(mxGetM(prhs[imi])*mxGetN(prhs[imi])+1,sizeof(char));
156  mxGetString(prhs[imi],archtyp,mxGetM(prhs[imi])*mxGetN(prhs[imi])+1);
157  }
158  mexPrintf("%s -- Architecture type is \"%s\".\n",
159  __FUNCT__,archtyp);
160  }
161  imi++;
162 
163  if (!mxIsNumeric(prhs[imi])) {
164  mexPrintf("%s -- Architecture parameter vector must be numeric.\n",__FUNCT__);
165  mexErrMsgTxt(" ");
166  }
167  else {
168  napar =mxGetM(prhs[imi])*mxGetN(prhs[imi]);
169  if (mxGetM(prhs[imi])*mxGetN(prhs[imi])) {
170  apd=mxGetPr(prhs[imi]);
171  api = (int *) malloc(mxGetM(prhs[imi])*mxGetN(prhs[imi])*sizeof(int));
172  for (i=0; i<mxGetM(prhs[imi])*mxGetN(prhs[imi]); i++)
173  api[i]=(int)apd[i];
174  }
175  mexPrintf("%s -- Architecture parameter vector is of size %d by %d.\n",
176  __FUNCT__,mxGetM(prhs[imi]),mxGetN(prhs[imi]));
177  }
178  imi++;
179  }
180 
181  while (imi < nrhs) {
182  if (!mxIsChar(prhs[imi])) {
183  mexPrintf("%s -- prhs[%d] must be character.\n",__FUNCT__,imi);
184  mexErrMsgTxt(" ");
185  }
186  else {
187  argvm[isi] = (char *) calloc(mxGetM(prhs[imi])*mxGetN(prhs[imi])+1,sizeof(char));
188  mxGetString(prhs[imi],argvm[isi],mxGetM(prhs[imi])*mxGetN(prhs[imi])+1);
189  }
190  isi++;
191  imi++;
192  }
193  argcm=isi;
194  mexPrintf("argcm=%d\n",argcm);
195  for (i=0; i<argcm; i++)
196  mexPrintf("argvm[%d]=\"%s\"\n",i,argvm[i]);
197 
198  /* Do the actual computations in a subroutine */
199 
200  mexPrintf("Gmapx:\n");
201  ierr=gmapx(&maptabi,
202  argcm,
203  argvm,
204  nvert,
205  nedge2,
206  adjir,
207  adjjc,
208  vli,
209  vwi,
210  ewi,
211  archtyp,
212  napar,
213  api);
214  mexPrintf("%s -- Error %d from Gmapx.\n",__FUNCT__,ierr);
215 
216 /* for (i=0; i<nvert; i++)
217  mexPrintf("maptabi[%d][0]=%d, maptabi[%d][1]=%d\n",
218  i,maptabi[i][0],i,maptabi[i][1]); */
219 
220  /* Create matrices for the return arguments */
221 
222  if (maptabi) {
223  plhs[imo]=mxCreateDoubleMatrix(nvert, 2, mxREAL);
224  maptabd = mxGetPr(plhs[imo]);
225  k=0;
226  for (j=0; j<2; j++)
227  for (i=0; i<nvert; i++)
228  maptabd[k++]=(double)maptabi[i][j];
229  //free(maptabi);
230  }
231  else {
232  plhs[imo]=mxCreateDoubleMatrix(0, 2, mxREAL);
233  }
234  imo++;
235 
236  /*if (argvm)
237  for (i=argcm-1; i>=0; i--)
238  free(argvm[i]);
239  if (api) free(api);
240  if (archtyp) free(archtyp);
241  if (ewi) free(ewi);
242  if (vwi) free(vwi);
243  if (vli) free(vli);
244  if (adjjc) free(adjjc);
245  if (adjir) free(adjir);*/
246 
247  return;
248 #endif //#ifndef _HAVE_SCOTCH_
249 }
Scotch.h
header file for Scotch module.
gmapx
int gmapx(int(**pmaptabi)[2], int argcm, char *argvm[], int nvi, int ne2i, int *ir, int *jc, int *vli, int *vwi, int *ewi, char archtyp[], int nai, int *api)
Definition: Scotchx.cpp:71
__FUNCT__
#define __FUNCT__
Definition: Chacox.h:43
GmapUsage
void GmapUsage(void)
Definition: Scotch.cpp:12
mexFunction
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
Definition: Scotch.cpp:18
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49