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.
 
 
 
 
 
 

131 lines
5.4 KiB

// Copyright(C) 2021, 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 <vector>
#include "Cell.h"
#include "Ioss_ParallelUtils.h"
#include "Ioss_Region.h"
#include "UnitCell.h"
#include "ZE_SystemInterface.h"
//! \file
//! `grid` stores the data for the tessellation of size `IxJ`
//! * gridI -- extent in I direction
//! * gridJ -- extend in J direction
//! * grid(i,j) -- return database information at i,j location
//! * grid(index) -- return database information at i,j location corresponding to `index`
//! * max number of element blocks in a unit_cell mesh
//! * range of x, y size of unit_cell mesh. (assumes unit_cell minx, miny == 0.0)
//! * Ti, Tj, Tk -- size of regular mesh on boundary of unit_cell (? may need the 3 `Tk` values for
//! padding)
//! * std::vector<Cell> m_grid -- contains database information...
class Grid
{
public:
//! Create an empty grid of size `extent_i` x `extent_j`. The output mesh will
//! be written to the exodus database in the Ioss::Region `region`
explicit Grid(SystemInterface &interFace);
void set_extent(size_t extent_i, size_t extent_j, size_t /* unused */);
UnitCellMap &unit_cells() { return m_unitCells; }
//! Return a reference to the Cell cell at location `(i,j)`.
//! Does not check that `i` and `j` are in bounds.
Cell &get_cell(size_t i, size_t j)
{
size_t idx = i * m_gridJ + j;
return m_grid[idx];
}
//! Return `I` extent of the grid / lattice
size_t II() const { return m_gridI; }
//! Return `J` extent of the grid / lattice
size_t JJ() const { return m_gridJ; }
//! Return total number of cells in the grid / lattice
size_t size() const { return m_gridI * m_gridJ; }
int parallel_size() const { return m_parallelSize; }
//! Set the rank that the should start processing and outputting (used for subcycling)
void set_start_rank(int start_rank) { m_startRank = start_rank; }
//! Determine if can keep all files open at all times,
//! or if we need to close some/all after access...
void handle_file_count();
//! Are nodes at the boundaries of the unit cells equivalenced.
bool equivalence_nodes() const { return m_equivalenceNodes; }
//! Create a Cell object referencing the UnitCell specified by `key` at location `(i,j)`
bool initialize(size_t i, size_t j, const std::string &key);
void add_unit_cell(const std::string &key, const std::string &unit_filename, bool ints32bit);
//! Specify the X and Y location of each grid cell in the overall grid space.
void set_coordinate_offsets();
//!
void generate_sidesets();
//! Once all Cell objects have been initialized, Determine the coordinate extents and
//! offsets of each cell, the size of the output mesh, the node and element id offsets
//! for each cell, the number of nodes and elements in the output mesh and initialize
//! the output mesh.
template <typename INT> void process(SystemInterface &interFace, INT /* dummy */);
void decompose(const std::string &method);
const Ioss::ParallelUtils &util() const { return m_pu; }
Ioss::Region *output_region(int rank = 0) { return m_outputRegions[rank].get(); }
bool minimize_open_files(Minimize type) { return (int)m_minimizeOpenFiles & int(type); }
unsigned int get_generated_sidesets() { return m_generatedSideSets; }
void set_sideset_names(const std::string &names);
std::array<std::string, 6> generated_surface_names{
{"min_i", "max_i", "min_j", "max_j", "min_k", "max_k"}};
private:
//! Output node coordinates and element block connectivities for the output mesh.
template <typename INT> void output_model(INT /*dummy*/);
void internal_process();
void create_output_regions(SystemInterface &interFace);
void categorize_processor_boundaries();
void output_nodal_coordinates(const Cell &cell);
template <typename INT>
void output_block_connectivity(Cell &cell, const std::vector<INT> &node_map);
template <typename INT>
void output_nodal_communication_map(Cell &cell, const std::vector<INT> &node_map);
template <typename INT> void output_element_map(Cell &cell, INT /*dummy*/);
template <typename INT> void output_node_map(const Cell &cell, INT /*dummy*/);
template <typename INT> void output_surfaces(Cell &cell, INT /*dummy*/);
template <typename INT> void output_generated_surfaces(Cell &cell, INT /*dummy*/);
UnitCellMap m_unitCells;
std::vector<std::unique_ptr<Ioss::Region>> m_outputRegions;
std::vector<Cell> m_grid{};
Ioss::ParallelUtils m_pu{};
size_t m_gridI{0};
size_t m_gridJ{0};
vector3d m_offset{0.0, 0.0, 0.0};
double m_scaleFactor{1.0};
int m_parallelSize{1}; //! Number of ranks to decompose for
int m_rankCount{1}; //! Number of ranks to process at a time.
int m_startRank{0}; //! Which rank to start outputting...
bool m_equivalenceNodes{true};
bool m_useInternalSidesets{true};
bool m_subCycle{false};
Minimize m_minimizeOpenFiles{Minimize::NONE}; // 1: Unit, 2: output, 3: all
unsigned int m_generatedSideSets{0};
};