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.
 
 
 
 
 
 

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;
}
}