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.
68 lines
2.4 KiB
68 lines
2.4 KiB
/*
|
|
* Copyright(C) 1999-2020, 2022, 2023 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"
|
|
#include <stdio.h> // for printf
|
|
|
|
int PROJECTION_AXIS = 0; /* axis to flatten geometry */
|
|
/* => long regions, good for SnRad */
|
|
|
|
void inertial(struct vtx_data **graph, /* graph data structure */
|
|
int nvtxs, /* number of vtxs in graph */
|
|
int cube_or_mesh, /* 0 => hypercube, d => d-dimensional mesh */
|
|
int nsets, /* number of sets to cut into */
|
|
int igeom, /* 1, 2 or 3 dimensional geometry? */
|
|
float **coords, /* x, y and z coordinates of vertices */
|
|
int *sets, /* set each vertex gets assigned to */
|
|
double *goal, /* desired set sizes */
|
|
int using_vwgts /* are vertex weights being used? */
|
|
)
|
|
{
|
|
extern int DEBUG_TRACE; /* trace the execution of the code */
|
|
extern int PROJECTION_AXIS; /* axis to project out geometry */
|
|
extern double inertial_time; /* time spend in inertial calculations */
|
|
double time; /* timing parameter */
|
|
float *inert_coords[3]; /* coord arrays passed down */
|
|
int i, j; /* loop counters */
|
|
|
|
time = seconds();
|
|
|
|
if (DEBUG_TRACE > 0) {
|
|
printf("<Entering inertial, nvtxs = %d>\n", nvtxs);
|
|
}
|
|
|
|
if (PROJECTION_AXIS == 0) {
|
|
for (i = 0; i < igeom; i++) {
|
|
inert_coords[i] = coords[i];
|
|
}
|
|
}
|
|
|
|
else { /* project out an axis to get long regions */
|
|
j = 0;
|
|
for (i = 0; i < igeom; i++) {
|
|
if (PROJECTION_AXIS != i + 1) {
|
|
inert_coords[j] = coords[i];
|
|
j++;
|
|
}
|
|
}
|
|
--igeom;
|
|
}
|
|
|
|
if (igeom == 1) {
|
|
inertial1d(graph, nvtxs, cube_or_mesh, nsets, inert_coords[0], sets, goal, using_vwgts);
|
|
}
|
|
else if (igeom == 2) {
|
|
inertial2d(graph, nvtxs, cube_or_mesh, nsets, inert_coords[0], inert_coords[1], sets, goal,
|
|
using_vwgts);
|
|
}
|
|
else if (igeom == 3) {
|
|
inertial3d(graph, nvtxs, cube_or_mesh, nsets, inert_coords[0], inert_coords[1], inert_coords[2],
|
|
sets, goal, using_vwgts);
|
|
}
|
|
inertial_time += seconds() - time;
|
|
}
|
|
|