69
69
/************************************/
71
/*+ This routine parses the given
74
*** - 0 : if string successfully scanned.
79
SCOTCH_stratDgraphMap (
80
SCOTCH_Strat * const stratptr,
81
const char * const string)
83
if (*((Strat **) stratptr) != NULL)
84
stratExit (*((Strat **) stratptr));
86
if ((*((Strat **) stratptr) = stratInit (&kdgraphmapststratab, string)) == NULL) {
87
errorPrint ("SCOTCH_stratDgraphMap: error in parallel mapping strategy");
94
71
/*+ This routine initializes an API opaque
95
72
*** mapping with respect to the given source
96
73
*** graph and the locations of output parameters.
167
144
Kdmapping mapmappdat; /* Initial mapping domain */
168
145
const Strat * mapstratptr; /* Pointer to mapping strategy */
169
146
LibDmapping * restrict srcmappptr;
172
if (*((Strat **) stratptr) == NULL) /* Set default mapping strategy if necessary */
173
*((Strat **) stratptr) = stratInit (&kdgraphmapststratab, "r{sep=m{asc=b{bnd=q{strat=f},org=q{strat=f}},low=q{strat=m{type=h,vert=80,low=h{pass=10}f{bal=0.0005,move=80},asc=b{bnd=d{dif=1,rem=1,pass=40}f{bal=0.005,move=80},org=f{bal=0.005,move=80}}}|m{type=h,vert=80,low=h{pass=10}f{bal=0.0005,move=80},asc=b{bnd=d{dif=1,rem=1,pass=40}f{bal=0.005,move=80},org=f{bal=0.005,move=80}}}},seq=q{strat=m{type=h,vert=80,low=h{pass=10}f{bal=0.0005,move=80},asc=b{bnd=d{dif=1,rem=1,pass=40}f{bal=0.005,move=80},org=f{bal=0.005,move=80}}}|m{type=h,vert=80,low=h{pass=10}f{bal=0.0005,move=80},asc=b{bnd=d{dif=1,rem=1,pass=40}f{bal=0.005,move=80},org=f{bal=0.005,move=80}}}}},seq=r{job=t,map=t,poli=S,sep=m{type=h,vert=80,low=h{pass=10}f{bal=0.0005,move=80},asc=b{bnd=d{dif=1,rem=1,pass=40}f{bal=0.005,move=80},org=f{bal=0.005,move=80}}}|m{type=h,vert=80,low=h{pass=10}f{bal=0.0005,move=80},asc=b{bnd=d{dif=1,rem=1,pass=40}f{bal=0.005,move=80},org=f{bal=0.005,move=80}}}}}");
150
srcgrafptr = (Dgraph *) grafptr;
151
srcmappptr = (LibDmapping *) mappptr;
153
#ifdef SCOTCH_DEBUG_DGRAPH2
154
if (dgraphCheck (srcgrafptr) != 0) {
155
errorPrint ("SCOTCH_dgraphMapCompute: invalid input graph");
158
#endif /* SCOTCH_DEBUG_DGRAPH2 */
160
if (*((Strat **) stratptr) == NULL) { /* Set default mapping strategy if necessary */
163
archDomFrst (&srcmappptr->m.archdat, &archdomnorg);
164
SCOTCH_stratDgraphMapBuild (stratptr, SCOTCH_STRATQUALITY, srcgrafptr->procglbnbr, archDomSize (&srcmappptr->m.archdat, &archdomnorg), 0.01);
174
166
mapstratptr = *((Strat **) stratptr);
175
167
if (mapstratptr->tabl != &kdgraphmapststratab) {
176
168
errorPrint ("SCOTCH_dgraphMapCompute: not a parallel graph mapping strategy");
180
srcmappptr = (LibDmapping *) mappptr;
181
if (kdgraphInit (&mapgrafdat, (Dgraph *) grafptr, &srcmappptr->m) != 0)
172
if (kdgraphInit (&mapgrafdat, srcgrafptr, &srcmappptr->m) != 0)
183
174
mapmappdat.mappptr = &srcmappptr->m;
236
/*+ This routine parses the given
237
*** mapping strategy.
239
*** - 0 : if string successfully scanned.
244
SCOTCH_stratDgraphMap (
245
SCOTCH_Strat * const stratptr,
246
const char * const string)
248
if (*((Strat **) stratptr) != NULL)
249
stratExit (*((Strat **) stratptr));
251
if ((*((Strat **) stratptr) = stratInit (&kdgraphmapststratab, string)) == NULL) {
252
errorPrint ("SCOTCH_stratDgraphMap: error in parallel mapping strategy");
259
/*+ This routine provides predefined
260
*** mapping strategies.
262
*** - 0 : if string successfully initialized.
267
SCOTCH_stratDgraphMapBuild (
268
SCOTCH_Strat * const stratptr, /*+ Strategy to create +*/
269
const SCOTCH_Num flagval, /*+ Desired characteristics +*/
270
const SCOTCH_Num procnbr, /*+ Number of processes for running +*/
271
const SCOTCH_Num partnbr, /*+ Number of expected parts/size +*/
272
const double balrat) /*+ Desired imbalance ratio +*/
274
char bufftab[8192]; /* Should be enough */
288
for (parttmp = partnbr, blogval = 1; parttmp != 0; parttmp >>= 1, blogval ++) ; /* Get log2 of number of parts */
290
vertnbr = MAX (2000 * procnbr, 10000);
291
vertnbr = MIN (vertnbr, 100000);
292
sprintf (verttab, GNUMSTRING, vertnbr);
294
blogtmp = 1.0 / (double) blogval; /* Taylor development of (1 + balrat) ^ (1 / blogval) */
295
bbalval = (balrat * blogtmp) * (1.0 + (blogtmp - 1.0) * (balrat * 0.5 * (1.0 + (blogtmp - 2.0) * balrat / 3.0)));
296
sprintf (bbaltab, "%lf", bbalval);
298
strcpy (bufftab, "r{sep=m{vert=<VERT>,asc=b{bnd=<DIFP><MUCE><EXAP>,org=<MUCE><EXAP>},low=q{strat=(m{type=h,vert=80,low=h{pass=10}f{bal=<BBAL>,move=80},asc=b{bnd=<DIFS>f{bal=<BBAL>,move=80},org=f{bal=<BBAL>,move=80}}}|m{type=h,vert=80,low=h{pass=10}f{bal=<BBAL>,move=80},asc=b{bnd=<DIFS>f{bal=<BBAL>,move=80},org=f{bal=<BBAL>,move=80}}})<EXAS>},seq=q{strat=(m{type=h,vert=80,low=h{pass=10}f{bal=<BBAL>,move=80},asc=b{bnd=<DIFS>f{bal=<BBAL>,move=80},org=f{bal=<BBAL>,move=80}}}|m{type=h,vert=80,low=h{pass=10}f{bal=<BBAL>,move=80},asc=b{bnd=<DIFS>f{bal=<BBAL>,move=80},org=f{bal=<BBAL>,move=80}}})<EXAS>}},seq=r{sep=(m{type=h,vert=80,low=h{pass=10}f{bal=<BBAL>,move=80},asc=b{bnd=<DIFS>f{bal=<BBAL>,move=80},org=f{bal=<BBAL>,move=80}}}|m{type=h,vert=80,low=h{pass=10}f{bal=<BBAL>,move=80},asc=b{bnd=<DIFS>f{bal=<BBAL>,move=80},org=f{bal=<BBAL>,move=80}}})<EXAS>}}");
300
muceptr = "/(edge<1000000)?q{strat=f};"; /* Multi-centralization */
301
exapptr = "x{bal=<BBAL>}"; /* Parallel exactifier */
303
if ((flagval & SCOTCH_STRATBALANCE) != 0) {
304
exapptr = "x{bal=0}";
305
exasptr = "f{bal=0}";
310
if ((flagval & SCOTCH_STRATSAFETY) != 0) {
315
difpptr = "(d{dif=1,rem=1,pass=40}|)";
316
difsptr = "(d{dif=1,rem=1,pass=40}|)";
319
stringSubst (bufftab, "<MUCE>", muceptr);
320
stringSubst (bufftab, "<EXAP>", exapptr);
321
stringSubst (bufftab, "<EXAS>", exasptr);
322
stringSubst (bufftab, "<DIFP>", difpptr);
323
stringSubst (bufftab, "<DIFS>", difsptr);
324
stringSubst (bufftab, "<BBAL>", bbaltab);
325
stringSubst (bufftab, "<VERT>", verttab);
327
if (SCOTCH_stratDgraphMap (stratptr, bufftab) != 0) {
328
errorPrint ("SCOTCH_stratDgraphMapBuild: error in parallel mapping strategy");