IOSS 2.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Iotm_TextMeshSidesetSkinner.h
Go to the documentation of this file.
1// Copyright(C) 1999-2020, 2022 National Technology & Engineering Solutions
2// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
3// NTESS, the U.S. Government retains certain rights in this software.
4
5#pragma once
6
7// ####################### Start Clang Header Tool Managed Headers ########################
8// clang-format off
9#include <ctype.h> // for toupper
10#include <stddef.h> // for size_t
11#include <algorithm> // for remove, etc
12#include <iterator> // for insert_iterator
13#include <map>
14#include <set> // for set
15#include <sstream> // for operator<<, etc
16#include <string> // for basic_string, etc
17#include <utility> // for pair
18#include <vector> // for vector
19#include <unordered_map>
20#include <sstream> // for ostringstream
21#include <iostream>
22#include <functional>
23#include <stdexcept>
24#include <numeric>
25#if defined(_WIN32) && !defined(__MINGW32__)
26#include <string.h>
27#define strcasecmp _stricmp
28#define strncasecmp _strnicmp
29#else
30#include <strings.h>
31#endif
32
33#include "Iotm_TextMeshFuncs.h"
37
38// clang-format on
39// ####################### End Clang Header Tool Managed Headers ########################
40namespace Iotm {
41 namespace text_mesh {
42
43 using ErrorHandler = std::function<void(const std::ostringstream &)>;
44
45 template <typename EntityId, typename Topology>
46 class SidesetSkinner : public SideAdjacencyGraph<EntityId, Topology>
47 {
48 public:
50
51 SidesetSkinner() = default;
52
54
55 size_t get_num_elements() const override
56 {
57 assert(m_textMeshData != nullptr);
58 return m_textMeshData->elementDataVec.size();
59 }
60
61 int get_element_proc(const size_t elemIndex) const override
62 {
63 assert(m_textMeshData != nullptr);
64 const ElementData<EntityId, Topology> &elemData = m_textMeshData->elementDataVec[elemIndex];
65 return elemData.proc;
66 }
67
68 bool element_has_any_node_on_proc(const size_t elemIndex, int proc) const override
69 {
70 assert(m_textMeshData != nullptr);
71 const ElementData<EntityId, Topology> &elemData = m_textMeshData->elementDataVec[elemIndex];
72
73 for (const EntityId &nodeId : elemData.nodeIds) {
74 const std::set<int> &procsForNode = m_textMeshData->procs_for_node(nodeId);
75 if (procsForNode.count(proc) > 0) {
76 return true;
77 }
78 }
79
80 return false;
81 }
82
83 const std::string &get_element_block_name(const size_t elemIndex) const override
84 {
85 assert(m_textMeshData != nullptr);
86 const ElementData<EntityId, Topology> &elemData = m_textMeshData->elementDataVec[elemIndex];
87 return elemData.partName;
88 }
89
90 const std::vector<EntityId> &get_element_node_ids(const size_t elemIndex) const override
91 {
92 assert(m_textMeshData != nullptr);
93 const ElementData<EntityId, Topology> &elemData = m_textMeshData->elementDataVec[elemIndex];
94 return elemData.nodeIds;
95 }
96
97 const Topology &get_element_topology(const size_t elemIndex) const override
98 {
99 assert(m_textMeshData != nullptr);
100 const ElementData<EntityId, Topology> &elemData = m_textMeshData->elementDataVec[elemIndex];
101 return elemData.topology;
102 }
103
104 EntityId get_element_id(const size_t elemIndex) const override
105 {
106 assert(m_textMeshData != nullptr);
107 const ElementData<EntityId, Topology> &elemData = m_textMeshData->elementDataVec[elemIndex];
108 return elemData.identifier;
109 }
110
111 void set_skin_blocks(const std::vector<std::string> &skinBlocks)
112 {
113 m_skinBlocks = skinBlocks;
114 }
115
117 std::vector<std::pair<EntityId, int>> &elemSidePairs)
118 {
119 populate_skin_blocks(textMeshData.partIds);
120
121 if (!m_skinBlocks.empty()) {
122 set_text_mesh_data(textMeshData);
125
126 for (auto iter = BaseClass::begin(); iter != BaseClass::end(); iter++) {
127 size_t elemIndex = iter->first;
128 const auto &faceConnections = iter->second;
129
130 std::vector<bool> hasConnection(faceConnections.numSides, false);
131 for (const auto &connection : faceConnections.connections) {
132 hasConnection[connection.thisSide - 1] = true;
133 }
134
135 for (unsigned i = 0; i < faceConnections.numSides; i++) {
136 if (!hasConnection[i]) {
137 EntityId elemId = textMeshData.elementDataVec[elemIndex].identifier;
138 int side = i + 1;
139 elemSidePairs.push_back(std::make_pair(elemId, side));
140 }
141 }
142 }
143 }
144 }
145
146 private:
148 {
149 bool skinAll = false;
150 for (const std::string &block : m_skinBlocks) {
151 if (0 == strcasecmp("all", block.c_str())) {
152 skinAll = true;
153 break;
154 }
155 }
156
157 if (skinAll) {
158 m_skinBlocks = partIds.get_part_names();
159 }
160 }
161
163 {
164 m_textMeshData = &textMeshData;
165 }
166
168
170 std::vector<std::string> m_skinBlocks{};
171 };
172
173 } // namespace text_mesh
174} // namespace Iotm
Definition Iotm_TextMeshDataTypes.h:58
const std::vector< std::string > & get_part_names() const
Definition Iotm_TextMeshDataTypes.h:115
void create_graph(int proc=ANY_PROC)
Definition Iotm_TextMeshAdjacencyGraph.h:215
std::unordered_map< size_t, FaceConnections >::const_iterator end() const
Definition Iotm_TextMeshAdjacencyGraph.h:279
std::unordered_map< size_t, FaceConnections >::const_iterator begin() const
Definition Iotm_TextMeshAdjacencyGraph.h:275
SideAdjacencyGraph()
Definition Iotm_TextMeshAdjacencyGraph.h:205
~SidesetSkinner()
Definition Iotm_TextMeshSidesetSkinner.h:53
int get_element_proc(const size_t elemIndex) const override
Definition Iotm_TextMeshSidesetSkinner.h:61
void reset_text_mesh_data()
Definition Iotm_TextMeshSidesetSkinner.h:167
const TextMeshData< EntityId, Topology > * m_textMeshData
Definition Iotm_TextMeshSidesetSkinner.h:169
std::vector< std::string > m_skinBlocks
Definition Iotm_TextMeshSidesetSkinner.h:170
void populate_skin_blocks(const PartIdMapping &partIds)
Definition Iotm_TextMeshSidesetSkinner.h:147
const std::vector< EntityId > & get_element_node_ids(const size_t elemIndex) const override
Definition Iotm_TextMeshSidesetSkinner.h:90
EntityId get_element_id(const size_t elemIndex) const override
Definition Iotm_TextMeshSidesetSkinner.h:104
SideAdjacencyGraph< EntityId, Topology > BaseClass
Definition Iotm_TextMeshSidesetSkinner.h:49
const Topology & get_element_topology(const size_t elemIndex) const override
Definition Iotm_TextMeshSidesetSkinner.h:97
size_t get_num_elements() const override
Definition Iotm_TextMeshSidesetSkinner.h:55
void skin_blocks(const TextMeshData< EntityId, Topology > &textMeshData, std::vector< std::pair< EntityId, int > > &elemSidePairs)
Definition Iotm_TextMeshSidesetSkinner.h:116
void set_skin_blocks(const std::vector< std::string > &skinBlocks)
Definition Iotm_TextMeshSidesetSkinner.h:111
void set_text_mesh_data(const TextMeshData< EntityId, Topology > &textMeshData)
Definition Iotm_TextMeshSidesetSkinner.h:162
const std::string & get_element_block_name(const size_t elemIndex) const override
Definition Iotm_TextMeshSidesetSkinner.h:83
bool element_has_any_node_on_proc(const size_t elemIndex, int proc) const override
Definition Iotm_TextMeshSidesetSkinner.h:68
Definition Iotm_TextMeshAdjacencyGraph.h:39
std::function< void(const std::ostringstream &)> ErrorHandler
Definition Iotm_TextMeshAdjacencyGraph.h:41
A namespace for the textmesh database format.
Definition Iotm_DatabaseIO.C:95
TopologyMapEntry Topology
Definition Iotm_TextMesh.h:34
int64_t EntityId
Definition Iotm_TextMesh.h:33
Definition Iotm_TextMeshDataTypes.h:276
Topology topology
Definition Iotm_TextMeshDataTypes.h:279
std::string partName
Definition Iotm_TextMeshDataTypes.h:281
int proc
Definition Iotm_TextMeshDataTypes.h:277
EntityId identifier
Definition Iotm_TextMeshDataTypes.h:278
std::vector< EntityId > nodeIds
Definition Iotm_TextMeshDataTypes.h:280
Definition Iotm_TextMeshDataTypes.h:314
std::vector< ElementData< EntityId, Topology > > elementDataVec
Definition Iotm_TextMeshDataTypes.h:316
PartIdMapping partIds
Definition Iotm_TextMeshDataTypes.h:317