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.
123 lines
4.4 KiB
123 lines
4.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 "defs.h" // for FALSE
|
|
#include "smalloc.h" // for sfree
|
|
#include "structs.h" // for vtx_data
|
|
#include <stdio.h> // for printf, fprintf, FILE, NULL
|
|
|
|
/* Improve (weighted) vertex separator. Two sets are 0/1; separator = 2. */
|
|
|
|
int VERTEX_SEPARATOR = FALSE;
|
|
|
|
static void free_klv(
|
|
/* Free everything malloc'd for KLV. */
|
|
struct bilist **lbuckets, /* space for bucket sorts */
|
|
struct bilist **rbuckets, /* space for bucket sorts */
|
|
struct bilist *llistspace, /* space for all bidirectional elements */
|
|
struct bilist *rlistspace, /* space for all bidirectional elements */
|
|
int *ldvals, /* change in penalty for each possible move */
|
|
int *rdvals /* change in penalty for each possible move */
|
|
)
|
|
{
|
|
sfree(rlistspace);
|
|
sfree(llistspace);
|
|
sfree(rdvals);
|
|
sfree(ldvals);
|
|
sfree(rbuckets);
|
|
sfree(lbuckets);
|
|
}
|
|
|
|
void klvspiff(struct vtx_data **graph, /* list of graph info for each vertex */
|
|
int nvtxs, /* number of vertices in graph */
|
|
int *sets, /* local partitioning of vtxs */
|
|
double *goal, /* desired set sizes */
|
|
int max_dev, /* largest deviation from balance allowed */
|
|
int **bndy_list, /* list of vertices on boundary (0 ends) */
|
|
double *weights /* vertex weights in each set */
|
|
)
|
|
{
|
|
extern FILE *Output_File; /* output file or null */
|
|
extern int DEBUG_TRACE; /* debug flag for Kernighan-Lin */
|
|
extern int DEBUG_KL; /* debug flag for Kernighan-Lin */
|
|
extern double kl_total_time;
|
|
extern double kl_init_time;
|
|
extern double nway_kl_time;
|
|
struct bilist **lbuckets; /* space for bucket sorts for left moves */
|
|
struct bilist **rbuckets; /* space for bucket sorts for right moves */
|
|
struct bilist *llistspace; /* space for all left bidirectional elements */
|
|
struct bilist *rlistspace; /* space for all right bidirectional elements */
|
|
int *ldvals; /* change in penalty for each possible move */
|
|
int *rdvals; /* change in penalty for each possible move */
|
|
int *edges; /* loops through neighbor lists */
|
|
double time, time1; /* timing variables */
|
|
int dval; /* largest transition cost for a vertex */
|
|
int maxdval; /* largest transition cost for all vertices */
|
|
int error; /* out of space? */
|
|
int i, j; /* loop counters */
|
|
|
|
time = seconds();
|
|
|
|
if (DEBUG_TRACE > 0) {
|
|
printf("<Entering klvspiff, nvtxs = %d>\n", nvtxs);
|
|
}
|
|
|
|
/* Find largest possible change. */
|
|
maxdval = 0;
|
|
for (i = 1; i <= nvtxs; i++) {
|
|
if (graph[i]->vwgt > maxdval) {
|
|
maxdval = graph[i]->vwgt;
|
|
}
|
|
dval = -graph[i]->vwgt;
|
|
edges = graph[i]->edges;
|
|
for (j = graph[i]->nedges - 1; j; j--) {
|
|
dval += graph[*(++edges)]->vwgt;
|
|
}
|
|
if (dval > maxdval) {
|
|
maxdval = dval;
|
|
}
|
|
}
|
|
|
|
/* Allocate a bunch of space for KLV. */
|
|
time1 = seconds();
|
|
error =
|
|
klv_init(&lbuckets, &rbuckets, &llistspace, &rlistspace, &ldvals, &rdvals, nvtxs, maxdval);
|
|
kl_init_time += seconds() - time1;
|
|
|
|
if (!error) {
|
|
if (DEBUG_KL > 0) {
|
|
printf(" Before KLV: ");
|
|
countup_vtx_sep(graph, nvtxs, sets);
|
|
}
|
|
|
|
time1 = seconds();
|
|
error = nway_klv(graph, nvtxs, lbuckets, rbuckets, llistspace, rlistspace, ldvals, rdvals, sets,
|
|
maxdval, goal, max_dev, bndy_list, weights);
|
|
nway_kl_time += seconds() - time1;
|
|
|
|
if (DEBUG_KL > 1) {
|
|
printf(" After KLV: ");
|
|
countup_vtx_sep(graph, nvtxs, sets);
|
|
}
|
|
}
|
|
|
|
if (error) {
|
|
printf("\nWARNING: No space to perform KLV on graph with %d vertices.\n", nvtxs);
|
|
printf(" NO LOCAL REFINEMENT PERFORMED.\n\n");
|
|
|
|
if (Output_File != NULL) {
|
|
fprintf(Output_File, "\nWARNING: No space to perform KLV on graph with %d vertices.\n",
|
|
nvtxs);
|
|
fprintf(Output_File, " LOCAL REFINEMENT NOT PERFORMED.\n\n");
|
|
}
|
|
}
|
|
|
|
free_klv(lbuckets, rbuckets, llistspace, rlistspace, ldvals, rdvals);
|
|
|
|
kl_total_time += seconds() - time;
|
|
}
|
|
|