/* 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