IOSS 2.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Iotm_TextMeshSideset.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
26#include "Iotm_TextMeshFuncs.h"
31
32// clang-format on
33// ####################### End Clang Header Tool Managed Headers ########################
34namespace Iotm {
35 namespace text_mesh {
36
37 using ErrorHandler = std::function<void(const std::ostringstream &)>;
38
39 template <typename EntityId> using SidesetDataType = std::pair<EntityId, int>;
40
41 template <typename EntityId, typename Topology>
42 struct SidesetData : public EntityGroupData<SidesetDataType<EntityId>>
43 {
46
47 void set_split_type(SplitType splitType) { m_sidesetSplitter.set_split_type(splitType); }
48 SplitType get_split_type() const { return m_sidesetSplitter.get_split_type(); }
49
50 void set_skin_blocks(const std::vector<std::string> &skinBlocks)
51 {
52 m_sidesetSkinner.set_skin_blocks(skinBlocks);
53 }
54
56 {
57 m_sidesetSkinner.set_error_handler(errorHandler);
58 m_sidesetSplitter.set_error_handler(errorHandler);
59 }
60
61 void split(const std::vector<ElementData<EntityId, Topology>> &elementData)
62 {
63 m_sidesetSplitter.split(*this, elementData);
64 }
65
67 {
68 m_sidesetSkinner.skin_blocks(textMeshData, BaseClass::data);
69 }
70
71 std::vector<size_t> get_sideblock_indices_local_to_proc(const SideBlockInfo &info,
72 int proc) const
73 {
74 return m_sidesetSplitter.get_indices_local_to_proc(info.sideIndex, proc);
75 }
76
77 SideBlockInfo get_side_block_info(const std::string &sideBlockName) const
78 {
79 return m_sidesetSplitter.get_side_block_info(sideBlockName);
80 }
81
82 std::vector<SideBlockInfo> get_side_block_info() const
83 {
84 return m_sidesetSplitter.get_side_block_info();
85 }
86
88 {
89 if (BaseClass::has_name()) {
90 std::pair<unsigned, bool> result = get_id_from_part_name(BaseClass::name, "SURFACE_");
91 return result.second;
92 }
93
94 return false;
95 }
96
99 };
100
101 template <typename EntityId, typename Topology>
102 class Sidesets : public EntityGroup<SidesetData<EntityId, Topology>>
103 {
104 public:
106
107 Sidesets() : BaseClass("SIDESET", "SURFACE_", {"BLOCK_", "NODELIST_", "ASSEMBLY_"}) {}
108
109 void set_error_handler(ErrorHandler errorHandler) override
110 {
111 BaseClass::set_error_handler(errorHandler);
112
114 sidesetData.set_error_handler(errorHandler);
115 }
116 }
117
119 {
121
123 sidesetData.skin_blocks(data);
124 sidesetData.split(data.elementDataVec);
125 }
126 }
127 };
128
129 template <typename EntityId> class SidesetParser
130 {
131 public:
133 {
134 ErrorHandler errorHandler = [](const std::ostringstream &errmsg) {
135 default_error_handler(errmsg);
136 };
137 set_error_handler(errorHandler);
138 }
139
140 void set_error_handler(ErrorHandler errorHandler) { m_errorHandler = errorHandler; }
141
142 std::string get_name() { return m_name; }
143
144 const std::vector<std::pair<EntityId, int>> &get_sideset_data() { return m_elemSidePairs; }
145
147
148 const std::vector<std::string> &get_skin_blocks() const { return m_skinnedBlocks; }
149
150 // Expected format for sideset string data is:
151 // "name=<name>; data=elem_1,side_1,elem_2,side_2,....,elem_n,side_n;
152 // split=<block|topology|none>; skin=<{block list}|all>;" Cannot specify skin and data at the
153 // same time
154 void parse(const std::string &parseData)
155 {
156 auto options = get_tokens(parseData, ";");
157
158 for (const auto &option : options) {
159 parse_option_group(option);
160 }
161 }
162
163 void verify_parse() const
164 {
165 if (!m_skinnedBlocks.empty() && !m_elemSidePairs.empty()) {
166 std::ostringstream errmsg;
167 errmsg << "Error! Sideset with name: " << m_name
168 << " is attempting to set element/side pair data *AND* use skinning.";
169 m_errorHandler(errmsg);
170 }
171 }
172
173 private:
174 void parse_option(std::string optionName, const std::string &optionValue)
175 {
176 convert_to_lowercase(optionName);
177
178 if (optionName == "name") {
179 parse_name(optionValue);
180 }
181 else if (optionName == "data") {
182 parse_element_side_pairs(optionValue);
183 }
184 else if (optionName == "split") {
185 parse_split_type(optionValue);
186 }
187 else if (optionName == "skin") {
188 parse_skin_blocks(optionValue);
189 }
190 else {
191 std::ostringstream errmsg;
192 errmsg << "Unrecognized sideset option: " << optionName;
193 m_errorHandler(errmsg);
194 }
195 }
196
197 void parse_option_group(const std::string &option)
198 {
199 if (!option.empty()) {
200 auto optionTokens = get_tokens(option, "=");
201
202 if (optionTokens.size() != 2) {
203 std::ostringstream errmsg;
204 errmsg << "Unrecognized sideset option: " << option;
205 m_errorHandler(errmsg);
206 }
207
208 parse_option(optionTokens[0], optionTokens[1]);
209 }
210 }
211
212 void parse_name(const std::string &data) { m_name = data; }
213
214 void parse_skin_blocks(const std::string &data) { m_skinnedBlocks = get_tokens(data, ","); }
215
216 void parse_element_side_pairs(const std::string &data)
217 {
218 auto sidesetData = get_tokens(data, ",");
219
220 if (sidesetData.size() % 2 != 0) {
221 std::ostringstream errmsg;
222 errmsg << "Unmatched element/ordinal pairs in sideset data: " << data;
223 m_errorHandler(errmsg);
224 }
225
226 for (unsigned i = 0; i < sidesetData.size(); i += 2) {
227 EntityId elem = std::stoull(sidesetData[i]);
228 int side = std::stoi(sidesetData[i + 1]);
229
230 if (side <= 0) {
231 std::ostringstream errmsg;
232 errmsg << "Invalid element/ordinal pair {" << sidesetData[i] << ","
233 << sidesetData[i + 1] << "}";
234 m_errorHandler(errmsg);
235 }
236
237 m_elemSidePairs.push_back(std::make_pair(elem, side));
238 }
239 }
240
241 void parse_split_type(std::string splitName)
242 {
243 convert_to_lowercase(splitName);
244
245 if (splitName == "none") {
247 }
248 else if (splitName == "block") {
250 }
251 else if (splitName == "topology") {
253 }
254 else {
255 std::ostringstream errmsg;
256 errmsg << "Unrecognized sideset split type: " << splitName;
257 m_errorHandler(errmsg);
258 }
259 }
260
261 std::vector<std::pair<EntityId, int>> m_elemSidePairs{};
262 std::string m_name{};
263 std::vector<std::string> m_skinnedBlocks{};
266 };
267
268 } // namespace text_mesh
269} // namespace Iotm
std::vector< SidesetData< EntityId, Topology > > m_groupDataVec
Definition Iotm_TextMeshEntityGroup.h:258
void finalize_parse()
Definition Iotm_TextMeshEntityGroup.h:93
virtual void set_error_handler(ErrorHandler errorHandler)
Definition Iotm_TextMeshEntityGroup.h:74
EntityGroup(const std::string &type, const std::string &namePrefix, const std::vector< std::string > &invalidNamePrefixes)
Definition Iotm_TextMeshEntityGroup.h:64
void verify_parse() const
Definition Iotm_TextMeshSideset.h:163
const std::vector< std::string > & get_skin_blocks() const
Definition Iotm_TextMeshSideset.h:148
std::vector< std::pair< EntityId, int > > m_elemSidePairs
Definition Iotm_TextMeshSideset.h:261
void parse(const std::string &parseData)
Definition Iotm_TextMeshSideset.h:154
std::string m_name
Definition Iotm_TextMeshSideset.h:262
ErrorHandler m_errorHandler
Definition Iotm_TextMeshSideset.h:265
void parse_skin_blocks(const std::string &data)
Definition Iotm_TextMeshSideset.h:214
void parse_option(std::string optionName, const std::string &optionValue)
Definition Iotm_TextMeshSideset.h:174
void set_error_handler(ErrorHandler errorHandler)
Definition Iotm_TextMeshSideset.h:140
void parse_split_type(std::string splitName)
Definition Iotm_TextMeshSideset.h:241
SplitType m_splitType
Definition Iotm_TextMeshSideset.h:264
void parse_option_group(const std::string &option)
Definition Iotm_TextMeshSideset.h:197
void parse_element_side_pairs(const std::string &data)
Definition Iotm_TextMeshSideset.h:216
SidesetParser()
Definition Iotm_TextMeshSideset.h:132
std::string get_name()
Definition Iotm_TextMeshSideset.h:142
void parse_name(const std::string &data)
Definition Iotm_TextMeshSideset.h:212
const std::vector< std::pair< EntityId, int > > & get_sideset_data()
Definition Iotm_TextMeshSideset.h:144
SplitType get_split_type()
Definition Iotm_TextMeshSideset.h:146
std::vector< std::string > m_skinnedBlocks
Definition Iotm_TextMeshSideset.h:263
Definition Iotm_TextMeshSidesetSkinner.h:47
Definition Iotm_TextMeshSidesetSplitter.h:73
EntityGroup< SidesetData< EntityId, Topology > > BaseClass
Definition Iotm_TextMeshSideset.h:105
void set_error_handler(ErrorHandler errorHandler) override
Definition Iotm_TextMeshSideset.h:109
void finalize_parse(const TextMeshData< EntityId, Topology > &data)
Definition Iotm_TextMeshSideset.h:118
Sidesets()
Definition Iotm_TextMeshSideset.h:107
Definition Iotm_TextMeshAdjacencyGraph.h:39
std::function< void(const std::ostringstream &)> ErrorHandler
Definition Iotm_TextMeshAdjacencyGraph.h:41
void convert_to_lowercase(std::string &str)
Definition Iotm_TextMeshFuncs.h:101
std::pair< EntityId, int > SidesetDataType
Definition Iotm_TextMeshSideset.h:39
std::vector< std::string > get_tokens(const std::string &str, const std::string &separators)
Definition Iotm_TextMeshFuncs.h:76
void default_error_handler(const std::ostringstream &message)
Definition Iotm_TextMeshFuncs.h:40
std::pair< unsigned, bool > get_id_from_part_name(const std::string &name, const std::string &prefix)
Definition Iotm_TextMeshFuncs.h:126
SplitType
Definition Iotm_TextMeshSidesetSplitter.h:55
@ TOPOLOGY
Definition Iotm_TextMeshSidesetSplitter.h:55
@ NO_SPLIT
Definition Iotm_TextMeshSidesetSplitter.h:55
@ ELEMENT_BLOCK
Definition Iotm_TextMeshSidesetSplitter.h:55
A namespace for the textmesh database format.
Definition Iotm_DatabaseIO.C:95
int64_t EntityId
Definition Iotm_TextMesh.h:33
Definition Iotm_TextMeshDataTypes.h:276
Definition Iotm_TextMeshEntityGroup.h:43
std::string name
Definition Iotm_TextMeshEntityGroup.h:49
std::vector< DataType > data
Definition Iotm_TextMeshEntityGroup.h:51
bool has_name() const
Definition Iotm_TextMeshEntityGroup.h:54
Definition Iotm_TextMeshSidesetSplitter.h:45
std::vector< size_t > sideIndex
Definition Iotm_TextMeshSidesetSplitter.h:51
Definition Iotm_TextMeshSideset.h:43
std::vector< size_t > get_sideblock_indices_local_to_proc(const SideBlockInfo &info, int proc) const
Definition Iotm_TextMeshSideset.h:71
SideBlockInfo get_side_block_info(const std::string &sideBlockName) const
Definition Iotm_TextMeshSideset.h:77
void split(const std::vector< ElementData< EntityId, Topology > > &elementData)
Definition Iotm_TextMeshSideset.h:61
SidesetSplitter< EntityId, Topology > m_sidesetSplitter
Definition Iotm_TextMeshSideset.h:98
void set_split_type(SplitType splitType)
Definition Iotm_TextMeshSideset.h:47
void set_skin_blocks(const std::vector< std::string > &skinBlocks)
Definition Iotm_TextMeshSideset.h:50
SidesetDataType< EntityId > DataType
Definition Iotm_TextMeshSideset.h:44
SplitType get_split_type() const
Definition Iotm_TextMeshSideset.h:48
EntityGroupData< SidesetDataType< EntityId > > BaseClass
Definition Iotm_TextMeshSideset.h:45
void set_error_handler(ErrorHandler errorHandler)
Definition Iotm_TextMeshSideset.h:55
std::vector< SideBlockInfo > get_side_block_info() const
Definition Iotm_TextMeshSideset.h:82
bool has_default_exodus_name() const
Definition Iotm_TextMeshSideset.h:87
void skin_blocks(const TextMeshData< EntityId, Topology > &textMeshData)
Definition Iotm_TextMeshSideset.h:66
SidesetSkinner< EntityId, Topology > m_sidesetSkinner
Definition Iotm_TextMeshSideset.h:97
Definition Iotm_TextMeshDataTypes.h:314