/* split.c */
#include "../GPart.h"
#define MYDEBUG 0
/*--------------------------------------------------------------------*/
/*
--------------------------------------------
split the graph partition object into pieces
created -- 95nov29, cca
--------------------------------------------
*/
void
GPart_split (
GPart *gpart
) {
FILE *msgFile ;
GPart *gpartchild ;
Graph *g, *gchild ;
int domwght, icomp, ierr, msglvl, ncomp, nvtot, nvtx, sepwght ;
int *compids, *cweights, *map ;
/*
---------------
check the input
---------------
*/
if ( gpart == NULL || (g = gpart->g) == NULL ) {
fprintf(stderr, "\n fatal error in GPart_split(%p)"
"\n bad input\n", gpart) ;
exit(-1) ;
}
if ( gpart->fch != NULL ) {
fprintf(stderr, "\n fatal error in GPart_split(%p)"
"\n child(ren) exist, already split\n", gpart) ;
exit(-1) ;
}
msgFile = gpart->msgFile ;
msglvl = gpart->msglvl ;
/*
------------------------------
count the number of subgraphs
and fill the cweights[] vector
------------------------------
*/
nvtx = g->nvtx ;
GPart_setCweights(gpart) ;
ncomp = gpart->ncomp ;
cweights = IV_entries(&gpart->cweightsIV) ;
if ( msglvl > 1 ) {
fprintf(msgFile,
"\n\n inside GPart_split, %d components, cweights : ",
ncomp) ;
IV_fp80(&gpart->cweightsIV, msgFile, 25, &ierr) ;
}
if ( ncomp == 1 ) {
return ;
}
/*
-----------------------------------------
compute the weight of the components and
count the number of nontrivial components
-----------------------------------------
*/
sepwght = cweights[0] ;
domwght = 0 ;
for ( icomp = 1 ; icomp <= ncomp ; icomp++ ) {
domwght += cweights[icomp] ;
}
if ( msglvl > 1 ) {
fprintf(msgFile,
"\n separator weight = %d, weight of components = %d",
sepwght, domwght) ;
}
/*
------------------------------------------------------
for each component
create its subgraph with boundary
create a GPart object to contain the subgraph
and set as the child of the present GPart object
end for
------------------------------------------------------
*/
compids = IV_entries(&gpart->compidsIV) ;
for ( icomp = 1 ; icomp <= ncomp ; icomp++ ) {
gpartchild = GPart_new() ;
gchild = Graph_subGraph(g, icomp, compids, &map) ;
if ( msglvl > 3 ) {
fprintf(msgFile, "\n\n component %d", icomp) ;
fprintf(msgFile, "\n map to parent") ;
IVfp80(msgFile, gchild->nvtx + gchild->nvbnd, map, 80, &ierr) ;
Graph_writeForHumanEye(gchild, msgFile) ;
fflush(msgFile) ;
}
GPart_init(gpartchild, gchild) ;
nvtot = gpartchild->nvtx + gpartchild->nvbnd ;
IV_init2(&gpartchild->vtxMapIV, nvtot, nvtot, 1, map) ;
gpartchild->par = gpart ;
gpartchild->sib = gpart->fch ;
gpart->fch = gpartchild ;
gpartchild->msglvl = gpart->msglvl ;
gpartchild->msgFile = gpart->msgFile ;
}
return ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1