// Copyright(C) 1999-2022 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 "vtk_ioss_mangle.h" #include #include #include #include // for size_t #include // for int64_t #include // for exception #include // for GeneratedMesh #include // for string #include // for pair #include // for vector namespace Iogn { enum { INVALID = -1, NUMBER_OF_SURFACES = 2, SPATIAL_DIMENSION = 3, NUM_NODES_PER_QUAD_FACE = 4 }; struct SharedNode { SharedNode() = default; int nodeId{-1}; int procId{-1}; }; enum Topology { Beam2 = 2, Shell4 = 4, Hex8 = 8 }; inline std::string getTopologyName(Topology topology) { switch (topology) { case Shell4: return std::string(Ioss::Shell4::name); case Hex8: return std::string(Ioss::Hex8::name); case Beam2: return std::string(Ioss::Beam2::name); } throw std::exception(); } struct ExodusData { std::vector coordinates{}; const std::vector> elementBlockConnectivity; const std::vector globalNumberOfElementsInBlock{}; const std::vector localNumberOfElementsInBlock{}; const std::vector blockTopologicalData{}; const int globalNumberOfNodes{0}; const std::vector globalIdsOfLocalElements{}; const std::vector globalIdsOfLocalNodes{}; std::vector sharedNodes{}; // A sideset' is basically an exodus sideset. A // sideset has a list of elements and a corresponding local // element side (1-based) The side id is: side_id = // 10*element_id + local_side_number This assumes that all // sides in a sideset are boundary sides. std::vector> sidesetConnectivity; std::vector> sidesetTouchingBlocks; ExodusData() {} ExodusData(std::vector coords, std::vector> elemBlockConnectivity, std::vector globalNumOfElemsInBlock, std::vector localNumOfElemsInBlock, std::vector blockTopoData, int globalNumNodes, std::vector globalIdsOfLocalElems, std::vector globalIdsLocalNodes, std::vector> sidesetConn = std::vector>(), std::vector> sidesetBlocks = std::vector>()) : coordinates(std::move(coords)), elementBlockConnectivity(std::move(elemBlockConnectivity)), globalNumberOfElementsInBlock(std::move(globalNumOfElemsInBlock)), localNumberOfElementsInBlock(std::move(localNumOfElemsInBlock)), blockTopologicalData(std::move(blockTopoData)), globalNumberOfNodes(globalNumNodes), globalIdsOfLocalElements(std::move(globalIdsOfLocalElems)), globalIdsOfLocalNodes(std::move(globalIdsLocalNodes)), sidesetConnectivity(std::move(sidesetConn)), sidesetTouchingBlocks(std::move(sidesetBlocks)) { } }; struct DashSurfaceData { const std::vector coordinates{}; const std::vector surfaceAConnectivity{}; const std::vector surfaceBConnectivity{}; int globalNumberOfNodes{}; int globalNumberOfElements{}; int globalNumberOfElementsSurface1{}; int globalNumberOfElementsSurface2{}; std::vector globalIdsOfLocalElements{}; std::vector globalIdsOfLocalNodes{}; std::vector sharedNodes{}; DashSurfaceData(std::vector coords, std::vector connectivity1, std::vector connectivity2) : coordinates(std::move(coords)), surfaceAConnectivity(std::move(connectivity1)), surfaceBConnectivity(std::move(connectivity2)) { this->setSerialDefaults(); } private: void setSerialDefaults() { globalNumberOfNodes = coordinates.size() / SPATIAL_DIMENSION; globalNumberOfElementsSurface1 = surfaceBConnectivity.size() / NUM_NODES_PER_QUAD_FACE; globalNumberOfElementsSurface2 = surfaceAConnectivity.size() / NUM_NODES_PER_QUAD_FACE; globalNumberOfElements = globalNumberOfElementsSurface1 + globalNumberOfElementsSurface2; globalIdsOfLocalElements.resize(globalNumberOfElements); globalIdsOfLocalNodes.resize(globalNumberOfNodes); for (size_t i = 0; i < globalIdsOfLocalElements.size(); i++) { globalIdsOfLocalElements[i] = i + 1; } for (size_t i = 0; i < globalIdsOfLocalNodes.size(); i++) { globalIdsOfLocalNodes[i] = i + 1; } } }; class DashSurfaceMesh : public GeneratedMesh { public: explicit DashSurfaceMesh(DashSurfaceData &dashSurfaceData) : mDashSurfaceData(dashSurfaceData) { } ~DashSurfaceMesh() override = default; int64_t node_count() const override; int64_t node_count_proc() const override; int64_t element_count() const override; int64_t element_count(int64_t surfaceNumber) const override; int64_t element_count_proc() const override; int64_t element_count_proc(int64_t block_number) const override; int block_count() const override; int nodeset_count() const override; int64_t nodeset_node_count_proc(int64_t id) const override; int sideset_count() const override; int64_t sideset_side_count_proc(int64_t id) const override; int64_t communication_node_count_proc() const override; void coordinates(double *coord) const override; void coordinates(std::vector &coord) const override; void coordinates(int component, std::vector &xyz) const override; void coordinates(int component, double *xyz) const override; void coordinates(std::vector &x, std::vector &y, std::vector &z) const override; void connectivity(int64_t block_number, int *connect) const override; std::pair topology_type(int64_t block_number) const override; void sideset_elem_sides(int64_t setId, std::vector &elem_sides) const override; void nodeset_nodes(int64_t nset_id, std::vector &nodes) const override; void node_communication_map(std::vector &map, std::vector &proc) override; void node_map(std::vector &map) const override; void node_map(std::vector &map) const override; void element_map(int64_t block_number, std::vector &map) const override; void element_map(int64_t block_number, std::vector &map) const override; void element_map(std::vector &map) const override; void element_map(std::vector &map) const override; private: std::string get_sideset_topology() const override; DashSurfaceData mDashSurfaceData; }; class ExodusMesh : public GeneratedMesh { public: explicit ExodusMesh(const ExodusData &exodusData); ~ExodusMesh() override = default; int64_t node_count() const override; int64_t node_count_proc() const override; int64_t element_count() const override; int64_t element_count(int64_t blockNumber) const override; int64_t element_count_proc() const override; int64_t element_count_proc(int64_t blockNumber) const override; int block_count() const override; int nodeset_count() const override; int64_t nodeset_node_count_proc(int64_t id) const override; int sideset_count() const override; int64_t sideset_side_count_proc(int64_t id) const override; int64_t communication_node_count_proc() const override; void coordinates(double *coord) const override; void coordinates(std::vector &coord) const override; void coordinates(int component, std::vector &xyz) const override; void coordinates(int component, double *xyz) const override; void coordinates(std::vector &x, std::vector &y, std::vector &z) const override; void connectivity(int64_t blockNumber, int *connectivityForBlock) const override; std::pair topology_type(int64_t blockNumber) const override; void sideset_elem_sides(int64_t setId, std::vector &elem_sides) const override; std::vector sideset_touching_blocks(int64_t setId) const override; void nodeset_nodes(int64_t nset_id, std::vector &nodes) const override; void node_communication_map(std::vector &map, std::vector &proc) override; void node_map(std::vector &map) const override; void node_map(std::vector &map) const override; void element_map(int64_t blockNumber, std::vector &map) const override; void element_map(int64_t blockNumber, std::vector &map) const override; void element_map(std::vector &map) const override; void element_map(std::vector &map) const override; private: std::string get_sideset_topology() const override; int64_t mGlobalNumberOfElements; int64_t mLocalNumberOfElements; const ExodusData &mExodusData; std::vector mElementOffsetForBlock; }; } // namespace Iogn