int SCOTCH_stratGraphMapBuild ( SCOTCH_Strat * const stratptr, /*+ Strategy to create +*/ const SCOTCH_Num flagval, /*+ Desired characteristics +*/ const SCOTCH_Num partnbr, /*+ Number of expected parts/size +*/ const double balrat) /*+ Desired imbalance ratio +*/ { char bufftab[8192]; /* Should be enough */ char bbaltab[64]; double bbalval; Gunum parttmp; /* "Unsigned" so that ">>" will always insert "0"s */ int blogval; double blogtmp; char * difsptr; char * exasptr; for (parttmp = partnbr, blogval = 1; parttmp != 0; parttmp >>= 1, blogval ++) ; /* Get log2 of number of parts */ blogtmp = 1.0 / (double) blogval; /* Taylor development of (1 + balrat) ^ (1 / blogval) */ bbalval = (balrat * blogtmp) * (1.0 + (blogtmp - 1.0) * (balrat * 0.5 * (1.0 + (blogtmp - 2.0) * balrat / 3.0))); sprintf (bbaltab, "%lf", bbalval); strcpy (bufftab, "r{job=t,map=t,poli=S,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>}"); if ((flagval & SCOTCH_STRATBALANCE) != 0) exasptr = "f{bal=0}"; else exasptr = ""; if ((flagval & SCOTCH_STRATSAFETY) != 0) difsptr = ""; else difsptr = "(d{dif=1,rem=1,pass=40}|)"; stringSubst (bufftab, "<EXAS>", exasptr); stringSubst (bufftab, "<DIFS>", difsptr); stringSubst (bufftab, "<BBAL>", bbaltab); if (SCOTCH_stratGraphMap (stratptr, bufftab) != 0) { errorPrint ("SCOTCH_stratGraphMapBuild: error in sequential mapping strategy"); return (1); } return (0); }
int SCOTCH_stratGraphMapBuild ( SCOTCH_Strat * const stratptr, /*+ Strategy to create +*/ const SCOTCH_Num flagval, /*+ Desired characteristics +*/ const SCOTCH_Num partnbr, /*+ Number of expected parts +*/ const double kbalval) /*+ Desired imbalance ratio +*/ { char bufftab[8192]; /* Should be enough */ char kbaltab[32]; char bbaltab[32]; char * difsptr; char * exasptr; sprintf (kbaltab, "%lf", kbalval); sprintf (bbaltab, "%lf", kbalval); strcpy (bufftab, "r{job=t,map=t,poli=S,bal=<KBAL>,sep=(<BIPA>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>}"); stringSubst (bufftab, "<BIPA>", ((flagval & SCOTCH_STRATSPEED) != 0) ? "" : "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}}}|"); if ((flagval & SCOTCH_STRATBALANCE) != 0) exasptr = "f{bal=0}"; else exasptr = ""; if ((flagval & SCOTCH_STRATSAFETY) != 0) difsptr = ""; else difsptr = "(d{dif=1,rem=0,pass=40}|)"; stringSubst (bufftab, "<EXAS>", exasptr); stringSubst (bufftab, "<DIFS>", difsptr); stringSubst (bufftab, "<KBAL>", kbaltab); stringSubst (bufftab, "<BBAL>", kbaltab); if (SCOTCH_stratGraphMap (stratptr, bufftab) != 0) { errorPrint ("SCOTCH_stratGraphMapBuild: error in sequential mapping strategy"); return (1); } return (0); }
int SCOTCH_stratMeshOrderBuild ( SCOTCH_Strat * const stratptr, /*+ Strategy to create +*/ const SCOTCH_Num flagval, /*+ Desired characteristics +*/ const double balrat) /*+ Desired imbalance ratio +*/ { char bufftab[8192]; /* Should be enough */ char bbaltab[32]; strcpy (bufftab, "c{rat=0.7,cpr=n{sep=/(vnod>120)?m{vnod=100,low=h{pass=10},asc=f{bal=<BBAL>}}:;,ole=v{strat=d{cmin=0,cmax=10000000,frat=0}},ose=g},unc=n{sep=/(vnod>120)?m{vnod=100,low=h{pass=10},asc=f{bal=<BBAL>}}:;,ole=v{strat=d{cmin=0,cmax=10000000,frat=0}},ose=g}}"); sprintf (bbaltab, "%lf", balrat); stringSubst (bufftab, "<BBAL>", bbaltab); if (SCOTCH_stratMeshOrder (stratptr, bufftab) != 0) { errorPrint ("SCOTCH_stratMeshOrderBuild: error in sequential ordering strategy"); return (1); } return (0); }
int SCOTCH_stratGraphClusterBuild ( SCOTCH_Strat * const straptr, /*+ Strategy to create +*/ const SCOTCH_Num flagval, /*+ Desired characteristics +*/ const SCOTCH_Num pwgtval, /*+ Threshold part weight +*/ const double densval, /*+ Threshold density value +*/ const double bbalval) /*+ Maximum imbalance ratio +*/ { char bufftab[8192]; /* Should be enough */ char bbaltab[32]; char pwgttab[32]; char denstab[32]; char * difsptr; char * exasptr; sprintf (bbaltab, "%lf", bbalval); sprintf (denstab, "%lf", densval); sprintf (pwgttab, GNUMSTRING, pwgtval); strcpy (bufftab, "r{job=u,map=t,poli=L,sep=/((load><PWGT>)&!(edge>vert*<DENS>*(vert-1)))?(<BIPA>m{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>;}"); stringSubst (bufftab, "<BIPA>", ((flagval & SCOTCH_STRATSPEED) != 0) ? "" : "m{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}}}|"); if ((flagval & SCOTCH_STRATBALANCE) != 0) exasptr = "f{bal=0}"; else exasptr = ""; if ((flagval & SCOTCH_STRATSAFETY) != 0) difsptr = ""; else difsptr = "(d{pass=40}|)"; stringSubst (bufftab, "<EXAS>", exasptr); stringSubst (bufftab, "<DIFS>", difsptr); stringSubst (bufftab, "<BBAL>", bbaltab); stringSubst (bufftab, "<DENS>", denstab); stringSubst (bufftab, "<PWGT>", pwgttab); if (SCOTCH_stratGraphMap (straptr, bufftab) != 0) { errorPrint ("SCOTCH_stratGraphClusterBuild: error in sequential mapping strategy"); return (1); } return (0); }
int SCOTCH_stratDgraphOrderBuild ( SCOTCH_Strat * const stratptr, /*+ Strategy to create +*/ const SCOTCH_Num flagval, /*+ Desired characteristics +*/ const SCOTCH_Num procnbr, /*+ Number of processes for running +*/ const SCOTCH_Num levlnbr, /*+ Number of nested dissection levels +*/ const double balrat) /*+ Desired imbalance ratio +*/ { char bufftab[8192]; /* Should be enough */ char bbaltab[32]; char levltab[32]; char verttab[32]; Gnum vertnbr; char * tstpptr; char * tstsptr; char * oleaptr; char * osepptr; vertnbr = MAX (2000 * procnbr, 10000); vertnbr = MIN (vertnbr, 1000000); sprintf (bbaltab, "%lf", balrat); sprintf (levltab, GNUMSTRING, levlnbr); sprintf (verttab, GNUMSTRING, vertnbr); strcpy (bufftab, "n{sep=/(<TSTP>)?m{vert=<VERT>,asc=b{width=3,strat=q{strat=f}},low=q{strat=h},seq=q{strat=m{vert=120,low=h{pass=10},asc=b{width=3,bnd=f{bal=<BBAL>},org=h{pass=10}f{bal=<BBAL>}}}}};,ole=q{strat=n{sep=/(<TSTS>)?m{vert=120,low=h{pass=10},asc=b{width=3,bnd=f{bal=<BBAL>},org=h{pass=10}f{bal=<BBAL>}}};,ole=<OLEA>,ose=<OSEP>}},ose=s,osq=n{sep=/(<TSTS>)?m{vert=120,low=h{pass=10},asc=b{width=3,bnd=f{bal=<BBAL>},org=h{pass=10}f{bal=<BBAL>}}};,ole=<OLEA>,ose=<OSEP>}}"); switch (flagval & (SCOTCH_STRATLEVELMIN | SCOTCH_STRATLEVELMAX)) { case SCOTCH_STRATLEVELMIN : tstpptr = "0=0"; tstsptr = "(levl<<LEVL>)|(vert>240)"; break; case SCOTCH_STRATLEVELMAX : tstpptr = "(levl<<LEVL>)"; tstsptr = "(levl<<LEVL>)&(vert>240)"; break; case (SCOTCH_STRATLEVELMIN | SCOTCH_STRATLEVELMAX) : tstpptr = tstsptr = "levl<<LEVL>"; oleaptr = "s"; /* Simple ordering for leaves */ break; default : tstpptr = "0=0"; tstsptr = "vert>240"; break; } oleaptr = ((flagval & SCOTCH_STRATLEAFSIMPLE) != 0) ? "s" : "f{cmin=15,cmax=100000,frat=0.0}"; osepptr = ((flagval & SCOTCH_STRATSEPASIMPLE) != 0) ? "s" : "g"; stringSubst (bufftab, "<TSTP>", tstpptr); stringSubst (bufftab, "<TSTS>", tstsptr); stringSubst (bufftab, "<LEVL>", levltab); stringSubst (bufftab, "<OLEA>", oleaptr); stringSubst (bufftab, "<OSEP>", osepptr); stringSubst (bufftab, "<BBAL>", bbaltab); stringSubst (bufftab, "<VERT>", verttab); if (SCOTCH_stratDgraphOrder (stratptr, bufftab) != 0) { errorPrint ("SCOTCH_stratDgraphOrderBuild: error in parallel ordering strategy"); return (1); } return (0); }
int SCOTCH_stratDgraphMapBuild ( SCOTCH_Strat * const stratptr, /*+ Strategy to create +*/ const SCOTCH_Num flagval, /*+ Desired characteristics +*/ const SCOTCH_Num procnbr, /*+ Number of processes for running +*/ const SCOTCH_Num partnbr, /*+ Number of expected parts/size +*/ const double balrat) /*+ Desired imbalance ratio +*/ { char bufftab[8192]; /* Should be enough */ char bbaltab[32]; double bbalval; char verttab[32]; Gnum vertnbr; int parttmp; int blogval; double blogtmp; char * difpptr; char * difsptr; char * exapptr; char * exasptr; char * muceptr; for (parttmp = partnbr, blogval = 1; parttmp != 0; parttmp >>= 1, blogval ++) ; /* Get log2 of number of parts */ vertnbr = MAX (2000 * procnbr, 10000); vertnbr = MIN (vertnbr, 100000); sprintf (verttab, GNUMSTRING, vertnbr); blogtmp = 1.0 / (double) blogval; /* Taylor development of (1 + balrat) ^ (1 / blogval) */ bbalval = (balrat * blogtmp) * (1.0 + (blogtmp - 1.0) * (balrat * 0.5 * (1.0 + (blogtmp - 2.0) * balrat / 3.0))); sprintf (bbaltab, "%lf", bbalval); 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>}}"); muceptr = "/(edge<1000000)?q{strat=f};"; /* Multi-centralization */ exapptr = "x{bal=<BBAL>}"; /* Parallel exactifier */ if ((flagval & SCOTCH_STRATBALANCE) != 0) { exapptr = "x{bal=0}"; exasptr = "f{bal=0}"; } else exasptr = ""; if ((flagval & SCOTCH_STRATSAFETY) != 0) { difpptr = ""; difsptr = ""; } else { difpptr = "(d{dif=1,rem=1,pass=40}|)"; difsptr = "(d{dif=1,rem=1,pass=40}|)"; } stringSubst (bufftab, "<MUCE>", muceptr); stringSubst (bufftab, "<EXAP>", exapptr); stringSubst (bufftab, "<EXAS>", exasptr); stringSubst (bufftab, "<DIFP>", difpptr); stringSubst (bufftab, "<DIFS>", difsptr); stringSubst (bufftab, "<BBAL>", bbaltab); stringSubst (bufftab, "<VERT>", verttab); if (SCOTCH_stratDgraphMap (stratptr, bufftab) != 0) { errorPrint ("SCOTCH_stratDgraphMapBuild: error in parallel mapping strategy"); return (1); } return (0); }
int SCOTCH_stratGraphMapBuild ( SCOTCH_Strat * const straptr, /*+ Strategy to create +*/ const SCOTCH_Num flagval, /*+ Desired characteristics +*/ const SCOTCH_Num partnbr, /*+ Number of expected parts/size +*/ const double kbalval) /*+ Desired imbalance ratio +*/ { char bufftab[8192]; /* Should be enough */ char bbaltab[64]; char kbaltab[64]; char kmovtab[64]; char mvrttab[64]; Gunum parttmp; /* "Unsigned" so that ">>" will always insert "0"s */ const char * difkptr; const char * difsptr; const char * exasptr; const char * exaxptr; sprintf (bbaltab, "%lf", kbalval); sprintf (kbaltab, "%lf", kbalval); sprintf (kmovtab, GNUMSTRING, ((flagval & SCOTCH_STRATQUALITY) != 0) ? 200 : 80); sprintf (mvrttab, GNUMSTRING, MAX ((20 * partnbr), 10000)); strcpy (bufftab, ((flagval & SCOTCH_STRATRECURSIVE) != 0) ? "<RECU>" /* Use only the recursive bipartitioning framework */ : "m{vert=<MVRT>,low=<RECU>,asc=b{bnd=<DIFK>f{bal=<KBAL>,move=<KMOV>},org=f{bal=<KBAL>,move=<KMOV>}}}<EXAX>"); stringSubst (bufftab, "<RECU>", "r{job=t,map=t,poli=S,bal=<KBAL>,sep=<BSEP><EXAS>}"); stringSubst (bufftab, "<BSEP>", ((flagval & SCOTCH_STRATQUALITY) != 0) ? "<BSEQ>|<BSEQ>|<BSEQ>" : "<BSEQ>|<BSEQ>"); stringSubst (bufftab, "<BSEQ>", "m{vert=120,low=h{pass=10}f{bal=<BBAL>,move=120},asc=b{bnd=f{bal=<BBAL>,move=120},org=f{bal=<BBAL>,move=120}}}"); if ((flagval & SCOTCH_STRATSAFETY) != 0) difsptr = ""; else difsptr = "d{pass=40}"; difkptr = "d{pass=40}"; if ((flagval & SCOTCH_STRATBALANCE) != 0) { exasptr = "f{bal=<KBAL>}"; exaxptr = "x{bal=<KBAL>}f{bal=<KBAL>,move=<KMOV>}"; } else { exasptr = ""; exaxptr = ""; } stringSubst (bufftab, "<MVRT>", mvrttab); stringSubst (bufftab, "<EXAX>", exaxptr); stringSubst (bufftab, "<EXAS>", exasptr); stringSubst (bufftab, "<DIFS>", difsptr); stringSubst (bufftab, "<DIFK>", difkptr); stringSubst (bufftab, "<KMOV>", kmovtab); stringSubst (bufftab, "<KBAL>", kbaltab); stringSubst (bufftab, "<BBAL>", bbaltab); if (SCOTCH_stratGraphMap (straptr, bufftab) != 0) { errorPrint ("SCOTCH_stratGraphMapBuild: error in sequential mapping strategy"); return (1); } return (0); }