Cloned SEACAS for EXODUS library with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

61 lines
2.0 KiB

/*
* Copyright(C) 1999-2020 National Technology & Engineering Solutions
* of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
* NTESS, the U.S. Government retains certain rights in this software.
*
* See packages/seacas/LICENSE for details
*/
/* 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(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;
}
}