135 PORD_INT count, u, v, i, istart, istop;
138 printf(
"\n#nodes %d (#domains %d, weight %d), #edges %d, totvwght %d\n",
140 printf(
"partition weights: S %d, B %d, W %d\n", dd->
cwght[
GRAY],
142 for (u = 0; u < G->
nvtx; u++)
144 printf(
"--- adjacency list of node %d (vtype %d, color %d, map %d\n",
147 istop = G->
xadj[u+1];
148 for (i = istart; i < istop; i++)
150 printf(
"%5d (vtype %2d, color %2d)", v, dd->
vtype[v], dd->
color[v]);
151 if ((++count % 3) == 0)
154 if ((count % 3) != 0)
164{
PORD_INT *xadj, *adjncy, *vwght, *vtype;
165 PORD_INT err, nvtx, ndom, domwght, dom, multi, u, v, i, istart, istop;
174 printf(
"checking domain decomposition (#nodes %d, #edges %d)\n",
178 for (u = 0; u < nvtx; u++)
180 if ((vtype[u] != 1) && (vtype[u] != 2))
181 { printf(
"ERROR: node %d is neither DOMAIN nor MULTISEC\n", u);
193 for (i = istart; i < istop; i++)
195 if (vtype[v] == 1) dom++;
196 if (vtype[v] == 2) multi++;
198 if ((vtype[u] == 1) && (dom > 0))
199 { printf(
"ERROR: domain %d is adjacent to other domain\n", u);
202 if ((vtype[u] == 2) && (dom < 2))
203 { printf(
"ERROR: less than 2 domains adjacent to multisec node %d\n", u);
206 if ((vtype[u] == 2) && (multi > 0))
207 { printf(
"ERROR: multisec %d is adjacent to other multisec nodes\n", u);
212 if ((ndom != dd->
ndom) || (domwght != dd->
domwght))
213 { printf(
"ERROR: number/size (%d/%d) of domains does not match with those in"
214 " domain decomp. (%d/%d)\n", ndom, domwght, dd->
ndom, dd->
domwght);
226 PORD_INT nvtx, u, v, w, i, j, jstart, jstop;
235 for (i = 0; i < nvtx; i++)
241 for (j = jstart; j < jstop; j++)
251 for (i = 0; i < nvtx; i++)
257 for (j = jstart; j < jstop; j++)
262 else if (v != rep[w])
281{
PORD_INT *xadj, *adjncy, *tmp, *queue;
283 PORD_INT i, istart, istop, j, jstart, jstop;
294 for (u = 0; u < nvtx; u++)
301 for (u = 0; u < nvtx; u++)
303 { qhead = 0; qtail = 1;
310 for (i = istart; i < istop; i++)
317 while (qhead != qtail)
318 { v = queue[qhead++];
321 for (i = istart; i < istop; i++)
327 for (j = jstart; j < jstop; j++)
329 if ((vtype[
x] == 1) && (tmp[rep[
x]] ==
flag))
337 {
for (j = jstart; j < jstop; j++)
339 if (vtype[
x] == 1) tmp[rep[
x]] =
flag;
356 for (u = 0; u < nvtx; u++)
359 free(tmp); free(queue);
368 PORD_INT *xadj, *adjncy, *vwght, *xadjdd, *adjncydd, *vwghtdd, *vtypedd;
369 PORD_INT *tmp, *bin, nvtx, nedges, nvtxdd, nedgesdd, ndom, domwght,
flag;
370 PORD_INT i, j, jstart, jstop, u, v, w;
383 for (u = 0; u < nvtx; u++)
392 xadjdd = dd->
G->
xadj;
400 for (u = 0; u < nvtx; u++)
412 nedgesdd = nvtxdd = 0;
414 for (u = 0; u < nvtx; u++)
416 { xadjdd[nvtxdd] = nedgesdd;
417 vtypedd[nvtxdd] = vtype[u];
425 vwghtdd[nvtxdd] += vwght[v];
428 for (j = jstart; j < jstop; j++)
430 if ((vtype[w] != vtype[u]) && (tmp[rep[w]] !=
flag))
431 { tmp[rep[w]] =
flag;
432 adjncydd[nedgesdd++] = rep[w];
438 if (vtypedd[nvtxdd] == 1)
440 domwght += vwghtdd[nvtxdd];
449 xadjdd[nvtxdd] = nedgesdd;
450 dd->
G->
nvtx = nvtxdd;
454 for (i = 0; i < nedgesdd; i++)
455 adjncydd[i] = map[adjncydd[i]];
456 for (u = 0; u < nvtxdd; u++)
464 free(tmp); free(bin);
474 PORD_INT *xadj, *adjncy, *vwght, *vtxlist, *vtype, *key, *rep;
475 PORD_INT nvtx, deg, u, i, istart, istop;
487 for (u = 0; u < nvtx; u++)
493 deg = istop - istart;
497 for (i = istart; i < istop; i++)
498 deg += vwght[adjncy[i]];
501 fprintf(stderr,
"\nError in function constructDomainDecomposition\n"
502 " unrecognized graph type %d\n", G->
type);
516 for (u = 0; u < nvtx; u++)
528 free(vtype); free(rep);
537{
PORD_INT *xadj, *adjncy, *vwght, *marker;
538 PORD_INT nvtx, nlist, k, weight, deg, u, v, w;
539 PORD_INT i, istart, istop, j, jstart, jstop;
546 nlist = nvtx - dd->
ndom;
550 for (k = 0; k < nlist; k++)
555 for (i = istart; i < istop; i++)
556 weight += vwght[adjncy[i]];
557 key[u] = weight / vwght[u];
562 for (k = 0; k < nlist; k++)
566 for (k = 0; k < nlist; k++)
572 for (i = istart; i < istop; i++)
576 for (j = jstart; j < jstop; j++)
589 for (k = 0; k < nlist; k++)
596 fprintf(stderr,
"\nError in internal function computePriorities\n"
597 " unrecognized node selection strategy %d\n", scoretype);
608 PORD_INT nvtx, nlist, keepon, u, v, w, k, i, istart, istop;
614 nlist = nvtx - dd->
ndom;
619 for (k = 0; k < nlist; k++)
624 for (i = istart; i < istop; i++)
633 for (i = istart; i < istop; i++)
643 for (k = 0; k < nlist; k++)
649 for (i = istart; i < istop; i++)
653 else if (v != rep[w])
672 PORD_INT nvtx, nlist,
flag, keepon, deg, chk, ulast, u, v, k, i, istart, istop;
678 nlist = nvtx - dd->
ndom;
688 for (u = 0; u < nvtx; u++)
697 for (k = 0; k < nlist; k++)
703 for (i = istart; i < istop; i++)
705 if (tmp[rep[v]] !=
flag)
706 { tmp[rep[v]] =
flag;
723 for (k = 0; k < nlist; k++)
732 for (i = istart; i < istop; i++)
733 tmp[rep[adjncy[i]]] =
flag;
738 if (key[u] != key[v])
743 for (i = istart; i < istop; i++)
744 if (tmp[rep[adjncy[i]]] !=
flag)
770 free(tmp); free(bin);
771 free(next); free(key);
780 PORD_INT *xadjdd1, *adjncydd1, *vwghtdd1, *vtypedd1, *mapdd1;
781 PORD_INT *xadjdd2, *adjncydd2, *vwghtdd2, *vtypedd2;
782 PORD_INT *tmp, *bin, nvtxdd1, nedgesdd1, nvtxdd2, nedgesdd2;
783 PORD_INT ndom, domwght,
flag, u, v, w, i, istart, istop;
785 nvtxdd1 = dd1->
G->
nvtx;
787 xadjdd1 = dd1->
G->
xadj;
790 vtypedd1 = dd1->
vtype;
798 for (u = 0; u < nvtxdd1; u++)
807 xadjdd2 = dd2->
G->
xadj;
810 vtypedd2 = dd2->
vtype;
815 for (u = 0; u < nvtxdd1; u++)
827 nvtxdd2 = nedgesdd2 = 0;
829 for (u = 0; u < nvtxdd1; u++)
831 { xadjdd2[nvtxdd2] = nedgesdd2;
832 vwghtdd2[nvtxdd2] = 0;
833 vtypedd2[nvtxdd2] = vtypedd1[u];
834 if (vtypedd2[nvtxdd2] == 3)
835 vtypedd2[nvtxdd2] = 1;
841 { mapdd1[v] = nvtxdd2;
842 vwghtdd2[nvtxdd2] += vwghtdd1[v];
843 if ((vtypedd1[v] == 1) || (vtypedd1[v] == 2))
844 { istart = xadjdd1[v];
845 istop = xadjdd1[v+1];
846 for (i = istart; i < istop; i++)
848 if (tmp[rep[w]] !=
flag)
849 { tmp[rep[w]] =
flag;
850 adjncydd2[nedgesdd2++] = rep[w];
857 if (vtypedd2[nvtxdd2] == 1)
859 domwght += vwghtdd2[nvtxdd2];
868 xadjdd2[nvtxdd2] = nedgesdd2;
869 dd2->
G->
nvtx = nvtxdd2;
873 for (i = 0; i < nedgesdd2; i++)
874 adjncydd2[i] = mapdd1[adjncydd2[i]];
875 for (u = 0; u < nvtxdd2; u++)
883 for (u = 0; u < nvtxdd1; u++)
884 if ((vtypedd1[u] == 3) || (vtypedd1[u] == 4))
890 free(tmp); free(bin);
903 nvtxdd1 = dd1->
G->
nvtx;
912 for (u = 0; u < nvtxdd1; u++)
913 {
if (dd1->
vtype[u] == 2)
914 msvtxlist[nlist++] = u;
domdec_t * initialDomainDecomposition(graph_t *G, PORD_INT *map, PORD_INT *vtype, PORD_INT *rep)
void freeDomainDecomposition(domdec_t *dd)
void buildInitialDomains(graph_t *G, PORD_INT *vtxlist, PORD_INT *vtype, PORD_INT *rep)
void shrinkDomainDecomposition(domdec_t *dd1, PORD_INT scoretype)
domdec_t * constructDomainDecomposition(graph_t *G, PORD_INT *map)
domdec_t * newDomainDecomposition(PORD_INT nvtx, PORD_INT nedges)
void mergeMultisecs(graph_t *G, PORD_INT *vtype, PORD_INT *rep)
domdec_t * coarserDomainDecomposition(domdec_t *dd1, PORD_INT *rep)
void printDomainDecomposition(domdec_t *dd)
void eliminateMultisecs(domdec_t *dd, PORD_INT *msvtxlist, PORD_INT *rep)
void checkDomainDecomposition(domdec_t *dd)
void computePriorities(domdec_t *dd, PORD_INT *msvtxlist, PORD_INT *key, PORD_INT scoretype)
void findIndMultisecs(domdec_t *dd, PORD_INT *msvtxlist, PORD_INT *rep)
#define mymalloc(ptr, nr, type)
graph_t * newGraph(PORD_INT, PORD_INT)
void freeGraph(graph_t *)
void distributionCounting(PORD_INT, PORD_INT *, PORD_INT *)
*fortran !University of Stuttgart All rights reserved Inc All rights reserved ! $COPYRIGHT$ !Additional copyrights may follow ! $HEADER$ !WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING !Do ***not ***copy this file to the directory where your Fortran !fortran application is compiled unless it is absolutely necessary !Most !modern Fortran compilers now support the I command line flag