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.

274 lines
7.7 KiB

2 years ago
/*
* 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
*/
#pragma once
#include "elb_elem.h"
#include <cstdio>
#include <exodusII.h>
#include <string>
#include <vector>
#define ELB_VERSION "4.19"
#define UTIL_NAME "nem_slice"
#define ELB_FALSE 0
#define ELB_TRUE 1
/* Macro for maximum value */
#ifndef MAX
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#endif
/*
* Constants for memory allocation of graph structures. The smaller these
* values, the more memory-efficient the code will be. Larger values
* will likely speed execution and prevent swap thrashing.
*/
#define SURND_ALLOC 8
#define ADJ_ALLOC 8
#define MEM_CHUNK_SIZE 16 /* Value MUST be >= 2 */
#define MEM_GROWTH 1.5
#define MAX_INP_LINE 10240
#if (__cplusplus >= 201703L)
#define FALL_THROUGH [[fallthrough]]
#elif defined(__GNUC__) && __GNUC__ >= 7 && !__INTEL_COMPILER
#define FALL_THROUGH [[gnu::fallthrough]]
#else
#define FALL_THROUGH ((void)0)
#endif /* __GNUC__ >= 7 */
template <typename INT> void vec_free(std::vector<INT> &V)
{
V.clear();
V.shrink_to_fit();
}
/* Prototype for timing function */
extern double get_time();
/* Structure used for the description of the machine for which the
* load balance is to be constructed. */
struct Machine_Description
{
int type{-1};
int num_dims{-1};
int dim[3]{};
int num_boxes{-1}; /* added for cluster type machines */
int procs_per_box{-1}; /* added for cluster type machines, if there is only
one box, then this is the same as num_procs */
int num_procs{-1};
Machine_Description() { dim[0] = dim[1] = dim[2] = -1; }
};
/* Structure used for the description of what type of load balance is
* to be performed. */
template <typename INT> struct LB_Description
{
int type{-1};
int ignore_z{0};
int refine{-1};
int num_sects{-1};
int cnctd_dom{-1};
int outfile{-1};
std::string file{};
/* Calculated quantities */
int *vertex2proc{nullptr};
/* Nodal */
std::vector<std::vector<INT>> int_nodes{};
std::vector<std::vector<INT>> bor_nodes{};
std::vector<std::vector<INT>> ext_nodes{};
std::vector<std::vector<INT>> ext_procs{};
/* Elemental */
std::vector<std::vector<std::vector<INT>>> born_procs{};
std::vector<std::vector<INT>> int_elems{};
std::vector<std::vector<INT>> bor_elems{};
std::vector<std::vector<INT>> e_cmap_elems{};
std::vector<std::vector<INT>> e_cmap_sides{};
std::vector<std::vector<INT>> e_cmap_procs{};
std::vector<std::vector<INT>> e_cmap_neigh{};
LB_Description() = default;
};
/* Structure for the problem description. */
struct Problem_Description
{
int type{-1};
int read_coords{-1};
int coarse_flag{-1};
int alloc_graph{-1};
size_t num_vertices{0};
int vis_out{-1};
int skip_checks{-1}; /* put in to skip some error checks for some meshes */
int face_adj{-1}; /* true if using face definition of adjacencies */
int partial_adj{0}; /* true if allowing partial (3/4) of nodes to */
/* determine adjancencies */
int global_mech{-1}; /* true if looking for mechanisms in original mesh */
int local_mech{-1}; /* true if looking for mechanisms in subdivided mesh */
int find_cnt_domains{-1}; /* true if finding number of connected domains in a graph */
int mech_add_procs{-1}; /* adds processors in cases of mechanisms */
int dsd_add_procs{-1}; /* adds processors in cases of disconnected subdomains */
int no_sph{-1};
int fix_columns{0}; /* detect, fix vertical column partitioning */
char *groups{nullptr};
std::vector<int> group_no{};
int num_groups{-1};
int int64db{0}; /* integer types for output mesh database */
int int64api{0}; /* integer types for exodus api calls */
Problem_Description() = default;
};
/* Structure for parameters needed for the Eigensolver in Chaco */
struct Solver_Description
{
double tolerance{-1.0};
int rqi_flag{-1};
int vmax{-1};
Solver_Description() = default;
};
/* Structure used to store information about the weighting scheme, if
* any, that is to be used. */
template <typename INT> struct Weight_Description
{
int type{-1}; /* See weight type below for possible types */
int ow_read{0}; /* 1 if element block settings overwrite exodus file read */
std::string exo_filename{};
std::string exo_varname{};
int exo_tindx{-1};
int exo_vindx{-1};
/* Variable parameters */
int nvals{0};
/* vectors to hold element block weights */
std::vector<INT> elemblk{}; /* Id of element block */
std::vector<INT> elemblk_wgt{}; /* Weight of that element block */
/* vector to indicate if weight value has already been overwritten */
std::vector<INT> ow{};
std::vector<int> vertices{};
std::vector<float> edges{};
Weight_Description<INT>() = default;
};
/* Structure used to store information about the FEM mesh */
template <typename INT> struct Mesh_Description
{
size_t num_nodes{0};
size_t num_elems{0};
size_t num_dims{0};
size_t num_el_blks{0};
std::vector<INT> eb_cnts{};
std::vector<INT> eb_ids{};
std::vector<INT> eb_npe{};
std::vector<E_Type> eb_type{};
size_t num_node_sets{0};
size_t num_side_sets{0};
size_t max_np_elem{0};
size_t ns_list_len{0};
char title[MAX_LINE_LENGTH + 1]{};
std::vector<float> coords{};
std::vector<E_Type> elem_type{};
INT **connect;
Mesh_Description() : connect(nullptr) {}
};
/* Structure for handling meshes with spheres */
struct Sphere_Info
{
size_t num{0};
std::vector<int> adjust{};
std::vector<int> begin{};
std::vector<int> end{};
Sphere_Info() = default;
};
/* Structure used to store various information about the graph */
template <typename INT> struct Graph_Description
{
size_t nadj{0};
int max_nsur{0};
std::vector<INT> adj{};
std::vector<INT> start{};
std::vector<std::vector<INT>> sur_elem;
Graph_Description<INT>() = default;
};
/* Various constants */
#define NODAL 0
#define ELEMENTAL 1
#define UTIL_NAME "nem_slice"
/* Load balance types */
#define MULTIKL 0
#define SPECTRAL 1
#define INERTIAL 2
#define LINEAR 3
#define RANDOM 4
#define SCATTERED 5
#define INFILE 6
#define KL_REFINE 7
#define NO_REFINE 8
#define NUM_SECTS 9
#define CNCT_DOM 10
#define OUTFILE 11
#define ZPINCH 12
#define BRICK 13
#define ZOLTAN_RCB 14
#define ZOLTAN_RIB 15
#define ZOLTAN_HSFC 16
#define IGNORE_Z 17
/* Machine types */
#define MESH 0
#define HCUBE 1
#define HYPERCUBE 2
#define CLUSTER 3
/* Solver options */
#define TOLER 0
#define USE_RQI 1
#define VMAX 2
/* ISSUES options */
#define LOCAL_ISSUES 0
#define GLOBAL_ISSUES 1
/* Weighting options */
/*
* NOTE: the position of NO_WEIGHT, READ_EXO, EL_BLK, and EWGT_ON
* should not be changed. These are the possible values for the
* "type" variable in the Weight struct. They need to b 0, 1, 2, & 4
* to allow bit masking for the type. The other variables are not
* currently used in the type, but are needed since they appear
* on the command line.
*/
#define NO_WEIGHT 0
#define READ_EXO 1
#define EL_BLK 2
#define VAR_INDX 3
#define EDGE_WGT 4
#define TIME_INDX 5
#define VAR_NAME 6