86 #ifdef _HAVE_SCOTCH_ //only works if Scotch library has been compiled in.
92 SCOTCH_Mapping mapdat;
96 SCOTCH_Num* adjir =NULL;
97 SCOTCH_Num* adjjc =NULL;
98 SCOTCH_Num* vertlab=NULL;
99 SCOTCH_Num* vertwgt=NULL;
100 SCOTCH_Num* edgewgt=NULL;
102 SCOTCH_Num* archpar=NULL;
103 SCOTCH_Num (*maptab)[2]=NULL;
104 int (*maptabi)[2]=NULL;
115 for (i=0; i<C_FILENBR; i++) {
116 C_fileTab[i].name =
"-";
117 C_fileTab[i].pntr = NULL;
119 C_fileTab[i].mode =
"r";
121 C_fileTab[i].mode =
"w";
126 nvert =(SCOTCH_Num)nvi;
127 nedge2=(SCOTCH_Num)ne2i;
130 adjir = (SCOTCH_Num *) malloc(nedge2*
sizeof(SCOTCH_Num));
131 for (i=0; i<nedge2; i++)
132 adjir[i]=(SCOTCH_Num)ir[i];
133 adjjc = (SCOTCH_Num *) malloc((nvert+1)*
sizeof(SCOTCH_Num));
134 for (i=0; i<(nvert+1); i++)
135 adjjc[i]=(SCOTCH_Num)jc[i];
139 vertlab = (SCOTCH_Num *) malloc(nvert*
sizeof(SCOTCH_Num));
140 for (i=0; i<nvert; i++)
141 vertlab[i]=(SCOTCH_Num)vli[i];
145 vertwgt = (SCOTCH_Num *) malloc(nvert*
sizeof(SCOTCH_Num));
146 for (i=0; i<nvert; i++)
147 vertwgt[i]=(SCOTCH_Num)vwi[i];
151 edgewgt = (SCOTCH_Num *) malloc(nedge2*
sizeof(SCOTCH_Num));
152 for (i=0; i<nedge2; i++)
153 edgewgt[i]=(SCOTCH_Num)ewi[i];
156 napar =(SCOTCH_Num)nai;
159 archpar = (SCOTCH_Num *) malloc(nai*
sizeof(SCOTCH_Num));
160 for (i=0; i<nai; i++)
161 archpar[i]=(SCOTCH_Num)api[i];
166 flagval = C_FLAGNONE;
167 i = strlen (argvm[0]);
168 if ((i >= 5) && (strncmp (argvm[0] + i - 5,
"gpart", 5) == 0)) {
169 flagval |= C_FLAGPART;
177 intRandResetStatic ();
180 if ((argcm >= 2) && (argvm[1][0] ==
'?')) {
181 usagePrint (stdout, C_usageList);
186 SCOTCH_stratInit (&stradat);
188 for (i = 0; i < C_FILENBR; i ++)
189 C_fileTab[i].pntr = (C_fileTab[i].mode[0] ==
'r') ? stdin : stdout;
190 for (i = 1; i < argcm; i ++) {
191 if ((argvm[i][0] !=
'-') || (argvm[i][1] ==
'\0') || (argvm[i][1] ==
'.')) {
192 if (C_paraNum < C_paraNbr) {
193 if ((C_partNbr = atoi (argvm[i])) < 1)
194 errorPrint (
"main: invalid number of parts (\"%s\")", argvm[i]);
198 if (C_fileNum < C_fileNbr)
199 C_fileTab[C_fileNum ++].name = argvm[i];
201 errorPrint (
"main: too many file names given");
204 switch (argvm[i][1]) {
207 usagePrint (stdout, C_usageList);
211 SCOTCH_stratExit (&stradat);
212 SCOTCH_stratInit (&stradat);
213 SCOTCH_stratGraphMap (&stradat, &argvm[i][2]);
217 for (j = 2; argvm[i][j] !=
'\0'; j ++) {
218 switch (argvm[i][j]) {
228 errorPrint (
"main: invalid source graph option (\"%c\")", argvm[i][j]);
233 fprintf (stderr,
"gmap/gpart, version %s - F. Pellegrini\n", SCOTCH_VERSION);
234 fprintf (stderr,
"Copyright 2004,2007,2008 ENSEIRB, INRIA & CNRS, France\n");
235 fprintf (stderr,
"This software is libre/free software under CeCILL-C -- see the user's manual for more information\n");
238 for (j = 2; argvm[i][j] !=
'\0'; j ++) {
239 switch (argvm[i][j]) {
242 flagval |= C_FLAGVERBMAP;
246 flagval |= C_FLAGVERBSTR;
250 flagval |= C_FLAGVERBTIM;
253 errorPrint (
"main: unprocessed parameter \"%c\" in \"%s\"", argvm[i][j], argvm[i]);
258 errorPrint (
"main: unprocessed option (\"%s\")", argvm[i]);
262 if ((flagval && C_FLAGPART) != 0) {
263 C_fileTab[3].name = C_fileTab[2].name;
264 C_fileTab[2].name = C_fileTab[1].name;
265 C_fileTab[1].name =
"-";
268 fileBlockOpen (C_fileTab, C_FILENBR);
270 clockInit (&runtime[0]);
271 clockStart (&runtime[0]);
273 SCOTCH_graphInit (&grafdat);
274 SCOTCH_graphLoad (&grafdat, C_filepntrsrcinp, -1, grafflag, nvert, nedge2, adjir, adjjc, vertlab, vertwgt, edgewgt);
276 SCOTCH_archInit (&archdat);
277 if ((flagval & C_FLAGPART) != 0)
278 SCOTCH_archCmplt (&archdat, C_partNbr);
280 SCOTCH_archLoad (&archdat, C_filepntrtgtinp, archtyp, napar, archpar);
282 clockStop (&runtime[0]);
283 clockInit (&runtime[1]);
284 clockStart (&runtime[1]);
286 SCOTCH_graphMapInit (&grafdat, &mapdat, &archdat, NULL);
287 SCOTCH_graphMapCompute (&grafdat, &mapdat, &stradat);
289 clockStop (&runtime[1]);
290 clockStart (&runtime[0]);
292 SCOTCH_graphMapSave (&nvert, &maptab, &grafdat, &mapdat, C_filepntrmapout);
297 *pmaptabi = (int (*)[2]) malloc(nvert*2*
sizeof(
int));
300 for (i=0; i<nvert; i++)
301 maptabi[i][j]=(
int)maptab[i][j];
305 clockStop (&runtime[0]);
307 if (flagval && C_FLAGVERBSTR) {
308 fprintf (C_filepntrlogout,
"S\tStrat=");
309 SCOTCH_stratSave (&stradat, C_filepntrlogout);
310 putc (
'\n', C_filepntrlogout);
312 if (flagval && C_FLAGVERBTIM) {
313 fprintf (C_filepntrlogout,
"T\tMapping\t\t%g\nT\tI/O\t\t%g\nT\tTotal\t\t%g\n",
314 (
double) clockVal (&runtime[1]),
315 (
double) clockVal (&runtime[0]),
316 (
double) clockVal (&runtime[0]) +
317 (
double) clockVal (&runtime[1]));
319 if (flagval && C_FLAGVERBMAP)
320 SCOTCH_graphMapView (&grafdat, &mapdat, C_filepntrlogout);
322 fileBlockClose (C_fileTab, C_FILENBR);
324 SCOTCH_graphMapExit (&grafdat, &mapdat);
325 SCOTCH_graphExit (&grafdat);
326 SCOTCH_stratExit (&stradat);
327 SCOTCH_archExit (&archdat);
329 if (archpar) free(archpar);
330 if (edgewgt) free(edgewgt);
331 if (vertwgt) free(vertwgt);
332 if (vertlab) free(vertlab);
333 if (adjjc) free(adjjc);
334 if (adjir) free(adjir);
336 #ifdef COMMON_PTHREAD
337 pthread_exit ((
void *) 0);
341 #else //#ifdef _HAVE_SCOTCH_