/* This software was developed by Bruce Hendrickson and Robert Leland   *
 * at Sandia National Laboratories under US Department of Energy        *
 * contract DE-AC04-76DP00789 and is copyrighted by Sandia Corporation. */

/* Use same ratios as original goals, but adjust based on set sizes. */
/* Note: mesh stuff only works for division into two sets. */

void      make_subgoal(goal, subgoal, nsets, cube_or_mesh, nsets_tot,
		                 mesh_dims, set, sub_vwgt_sum)
double   *goal;			/* goals for sets */
double   *subgoal;		/* goals for subset of sets */
int       nsets;		/* number of subsets in one partition */
int       cube_or_mesh;		/* 0=> hypercube, d=> d-dimensional mesh */
int       nsets_tot;		/* total number of sets to divide into */
int       mesh_dims[3];		/* shape of mesh */
int       set;			/* which set am I in? */
double    sub_vwgt_sum;		/* sum of subgraph vertex weights */
{
    double    tweight;		/* total weight among all subgoals */
    double    ratio;		/* scaling factor */
    int       index;		/* x, y or z location of a processor */
    int       sub_nsets;	/* largest number of processors in submesh */
    int       xstart, xwidth;	/* parameters describing submesh */
    int       i, j, x;		/* loop counters */

    if (!cube_or_mesh) {	/* First do hypercube case. */
	tweight = 0;
	for (j = 0, i = set; i < nsets_tot; i += nsets, j++) {
	    subgoal[j] = goal[i];
	    tweight += goal[i];
	}
	sub_nsets = nsets_tot / nsets;
    }

    else {
	if (set == 0) {
	    xstart = 0;
	    xwidth = mesh_dims[0] - mesh_dims[0] / 2;
	}
	else {
	    xwidth = mesh_dims[0] / 2;
	    xstart = mesh_dims[0] - mesh_dims[0] / 2;
	}
	i = 0;
	tweight = 0;
	index = xstart;
	for (x = xstart; x < xstart + xwidth; x++) {
	    subgoal[i] = goal[index++];
	    tweight += subgoal[i++];
	}
	sub_nsets = xwidth;
    }

    ratio = sub_vwgt_sum / tweight;
    for (i = 0; i < sub_nsets; i++) {
	subgoal[i] *= ratio;
    }
}


syntax highlighted by Code2HTML, v. 0.9.1