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