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.
59 lines
2.3 KiB
59 lines
2.3 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
|
|
*/
|
|
|
|
#include "structs.h"
|
|
|
|
/* Combine goals of collections of processors for next division. */
|
|
void merge_goals(double * goal, /* desired set sizes */
|
|
double * merged_goal, /* sizes of sets at this partition level */
|
|
struct set_info *set_info, /* information about all sets */
|
|
int * subsets, /* set numbers of processors to merge */
|
|
int nsets, /* number of sets created by this division */
|
|
int ndims_tot, /* total number of dimensions in the hypercube */
|
|
int cube_or_mesh, /* 0=> hypercube, d=> d-dimensional mesh */
|
|
int mesh_dims[3], /* shape of mesh */
|
|
double vwgt_sum /* actual sum of vertex weights */
|
|
)
|
|
{
|
|
struct set_info *set; /* set of processors still clumped together */
|
|
double total_goal; /* total of desired goals */
|
|
int index; /* x, y or z location of a processor */
|
|
int i, x, y, z; /* loop counters */
|
|
|
|
total_goal = 0;
|
|
for (i = 0; i < nsets; i++) {
|
|
set = &(set_info[subsets[i]]);
|
|
merged_goal[i] = 0;
|
|
|
|
if (cube_or_mesh > 0) { /* Mesh architecture. */
|
|
for (x = set->low[0]; x < set->low[0] + set->span[0]; x++) {
|
|
for (y = set->low[1]; y < set->low[1] + set->span[1]; y++) {
|
|
for (z = set->low[2]; z < set->low[2] + set->span[2]; z++) {
|
|
index = z * mesh_dims[0] * mesh_dims[1] + y * mesh_dims[0] + x;
|
|
merged_goal[i] += goal[index];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
else if (cube_or_mesh == 0) { /* Hypercube architecture. */
|
|
x = 1 << (ndims_tot - set->ndims);
|
|
y = 1 << ndims_tot;
|
|
for (z = set->setnum; z < y; z += x) {
|
|
merged_goal[i] += goal[z];
|
|
}
|
|
}
|
|
|
|
total_goal += merged_goal[i];
|
|
}
|
|
|
|
/* Now scale goals to reflect actual weight of vertices available. */
|
|
for (i = 0; i < nsets; i++) {
|
|
merged_goal[i] = (merged_goal[i] / total_goal) * vwgt_sum;
|
|
}
|
|
}
|
|
|