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.
194 lines
7.4 KiB
194 lines
7.4 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 "chaco.h"
|
|
#include "defs.h"
|
|
#include "params.h"
|
|
#include "smalloc.h"
|
|
#include <stdio.h>
|
|
|
|
int main(void)
|
|
{
|
|
extern int Using_Main; /* is main routine being called? */
|
|
extern char *Graph_File_Name; /* name of graph input file */
|
|
extern char *Geometry_File_Name; /* name of coordinate input file */
|
|
extern char *Assign_In_File_Name; /* name of assignment input input file */
|
|
extern char *PARAMS_FILENAME; /* name of file with parameter updates */
|
|
extern double EIGEN_TOLERANCE; /* tolerance for eigen calculations */
|
|
extern int OUTPUT_ASSIGN; /* whether to write assignment to file */
|
|
extern int DEBUG_MEMORY; /* debug memory allocation and freeing? */
|
|
extern int DEBUG_TRACE; /* trace main execution path */
|
|
extern int DEBUG_PARAMS; /* debug flag for reading parameters */
|
|
extern long RANDOM_SEED; /* seed for random number generators */
|
|
extern int ECHO; /* controls amount of output */
|
|
extern int PROMPT; /* prompt for input or not? */
|
|
extern int PRINT_HEADERS; /* print lines for output sections? */
|
|
extern int MATCH_TYPE; /* matching routine to call */
|
|
extern double input_time; /* times data file input */
|
|
extern double start_time; /* time partitioning starts */
|
|
FILE *fin; /* input file */
|
|
FILE *fingeom; /* geometry input file (for inertial method) */
|
|
FILE *finassign; /* assignment file if reading in */
|
|
FILE *params_file; /* file with parameter value updates */
|
|
double *goal; /* desired set sizes */
|
|
float *x, *y, *z; /* coordinates for inertial method */
|
|
int *start; /* start of edge list for each vertex */
|
|
int *adjacency; /* edge list data */
|
|
float *ewgts; /* weights for all edges */
|
|
int *vwgts; /* weights for all vertices */
|
|
int global_method; /* global partitioning method */
|
|
int local_method; /* local partitioning method */
|
|
int *assignment; /* set number of each vtx (length nvtxs+1) */
|
|
double eigtol; /* tolerance in eigenvector calculation */
|
|
int nvtxs; /* number of vertices in graph */
|
|
int ndims; /* dimension of recursive partitioning */
|
|
int architecture; /* 0 => hypercube, d => d-dimensional mesh */
|
|
int ndims_tot; /* total number of cube dimensions to divide */
|
|
int mesh_dims[3]; /* dimensions of mesh of processors */
|
|
long seed; /* for random graph mutations */
|
|
int rqi_flag; /* use RQI/Symmlq eigensolver? */
|
|
int vmax; /* if so, how many vertices to coarsen down to? */
|
|
int igeom; /* geometry dimension if inertial method */
|
|
char graphname[NAME_LENGTH]; /* name of graph input file */
|
|
char geomname[NAME_LENGTH]; /* name of geometry input file */
|
|
char inassignname[NAME_LENGTH]; /* assignment input file name */
|
|
char outassignname[NAME_LENGTH]; /* assignment output file name */
|
|
char outfilename[NAME_LENGTH]; /* name of output file */
|
|
char *outassignptr; /* name or null pointer for output assignment */
|
|
char *outfileptr; /* name or null pointer for output file */
|
|
int another; /* run another problem? */
|
|
double time; /* timing marker */
|
|
int flag; /* return code from input routines */
|
|
double seconds(void); /* returns elapsed time in seconds */
|
|
int affirm();
|
|
int input_graph(), input_geom();
|
|
void input_queries(), read_params(), clear_timing();
|
|
|
|
/*malloc_debug(2);*/
|
|
|
|
if (DEBUG_TRACE > 0) {
|
|
printf("<Entering main>\n");
|
|
}
|
|
|
|
if (PRINT_HEADERS) {
|
|
printf("\n Chaco 2.0\n");
|
|
printf(" Sandia National Laboratories\n\n");
|
|
}
|
|
|
|
Using_Main = TRUE;
|
|
another = TRUE;
|
|
params_file = fopen(PARAMS_FILENAME, "r");
|
|
if (params_file == NULL && DEBUG_PARAMS > 1) {
|
|
printf("Parameter file `%s' not found; using default parameters.\n", PARAMS_FILENAME);
|
|
}
|
|
|
|
while (another) {
|
|
|
|
start_time = time = seconds(void);
|
|
|
|
x = y = z = NULL;
|
|
goal = NULL;
|
|
assignment = NULL;
|
|
|
|
read_params(params_file);
|
|
|
|
input_queries(&fin, &fingeom, &finassign, graphname, geomname, inassignname, outassignname,
|
|
outfilename, &architecture, &ndims_tot, mesh_dims, &global_method, &local_method,
|
|
&rqi_flag, &vmax, &ndims);
|
|
|
|
if (global_method == 7)
|
|
Assign_In_File_Name = inassignname;
|
|
else
|
|
Assign_In_File_Name = NULL;
|
|
|
|
if (OUTPUT_ASSIGN > 0)
|
|
outassignptr = outassignname;
|
|
else
|
|
outassignptr = NULL;
|
|
|
|
if (ECHO < 0)
|
|
outfileptr = outfilename;
|
|
else
|
|
outfileptr = NULL;
|
|
|
|
flag = input_graph(fin, graphname, &start, &adjacency, &nvtxs, &vwgts, &ewgts);
|
|
if (flag) {
|
|
sfree(ewgts);
|
|
sfree(vwgts);
|
|
sfree(adjacency);
|
|
sfree(start);
|
|
goto skip;
|
|
}
|
|
|
|
Graph_File_Name = graphname;
|
|
|
|
assignment = smalloc(nvtxs * sizeof(int));
|
|
if (global_method == 7) {
|
|
flag = input_assign(finassign, inassignname, nvtxs, assignment);
|
|
if (flag)
|
|
goto skip;
|
|
Assign_In_File_Name = inassignname;
|
|
}
|
|
|
|
if (global_method == 3 ||
|
|
(MATCH_TYPE == 5 && (global_method == 1 || (global_method == 2 && rqi_flag)))) {
|
|
/* Read in geometry data. */
|
|
flag = input_geom(fingeom, geomname, nvtxs, &igeom, &x, &y, &z);
|
|
if (flag)
|
|
goto skip;
|
|
Geometry_File_Name = geomname;
|
|
}
|
|
else {
|
|
x = y = z = NULL;
|
|
}
|
|
|
|
input_time += seconds() - time;
|
|
|
|
eigtol = EIGEN_TOLERANCE;
|
|
seed = RANDOM_SEED;
|
|
|
|
INTER_FACE(nvtxs, start, adjacency, vwgts, ewgts, x, y, z, outassignptr, outfileptr, assignment,
|
|
architecture, ndims_tot, mesh_dims, goal, global_method, local_method, rqi_flag,
|
|
vmax, ndims, eigtol, seed);
|
|
|
|
skip:
|
|
if (global_method == 3) {
|
|
if (z != NULL)
|
|
sfree(z);
|
|
if (y != NULL)
|
|
sfree(y);
|
|
if (x != NULL)
|
|
sfree(x);
|
|
}
|
|
sfree(assignment);
|
|
|
|
if (DEBUG_MEMORY > 0) {
|
|
printf("\n");
|
|
}
|
|
|
|
if (PROMPT) {
|
|
another = affirm("\nRun Another Problem");
|
|
}
|
|
else {
|
|
another = affirm("");
|
|
}
|
|
if (another) {
|
|
clear_timing();
|
|
printf("\n------------------------------------------------\n\n");
|
|
fflush(stdout);
|
|
}
|
|
}
|
|
if (params_file != NULL)
|
|
fclose(params_file);
|
|
|
|
if (DEBUG_TRACE > 1) {
|
|
printf("<Leaving main>\n");
|
|
}
|
|
|
|
return (0);
|
|
}
|
|
|