source: issm/trunk/src/mex/Scotch/Scotch.cpp@ 4711

Last change on this file since 4711 was 4711, checked in by Eric.Larour, 15 years ago

Changed THISFUNCTION to FUNCT
took out free statements, which the memory manager will take care of.

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