19#include <unordered_map>
25#if defined(_WIN32) && !defined(__MINGW32__)
27#define strcasecmp _stricmp
28#define strncasecmp _strnicmp
42 using ErrorHandler = std::function<void(
const std::ostringstream &)>;
60 case SplitType::TOPOLOGY:
return out <<
"TOPOLOGY";
break;
61 case SplitType::ELEMENT_BLOCK:
return out <<
"ELEMENT_BLOCK";
break;
62 case SplitType::NO_SPLIT:
return out <<
"NO_SPLIT";
break;
63 default:
return out <<
"INVALID";
break;
65 return out <<
"INVALID[" << (unsigned)t <<
"]";
68 template <
typename EntityId>
using SidesetDataType = std::pair<EntityId, int>;
70 template <
typename EntityId,
typename Topology>
struct SidesetData;
77 ErrorHandler errorHandler = [](
const std::ostringstream &errmsg) {
85 ErrorHandler errorHandler = [](
const std::ostringstream &errmsg) {
109 std::ostringstream errmsg;
119 std::vector<SideBlockInfo> infoVec;
123 const std::string &sideBlockName = iter->first;
125 infoVec.push_back(info);
133 std::vector<size_t> indexForProc;
134 indexForProc.reserve(index.size());
136 for (
size_t elemPairIndex : index) {
138 indexForProc.push_back(elemPairIndex);
142 indexForProc.resize(indexForProc.size());
152 const SplitData &splitData = iter->second;
172 for (
size_t i = 0; i < sideset.
data.size(); ++i) {
174 EntityId elemId = elemSidePair.first;
176 auto iter =
bound_search(elementData.begin(), elementData.end(), elemId,
178 if (iter == elementData.end()) {
179 std::ostringstream errmsg;
180 errmsg <<
"Error! Sideset with id: " << sideset.
id <<
" and name: " << sideset.
name
181 <<
" has reference to invalid element '" << elemId <<
"'.";
194 std::ostringstream errmsg;
195 errmsg <<
"Sideset with name: " <<
m_sidesetName <<
" is referencing an invalid index "
200 return iter->second == proc;
223 splitData.
index.push_back(index);
247 for (
size_t index = 0; index < sideset.
data.size(); ++index) {
249 EntityId elemId = elemSidePair.first;
250 int side = elemSidePair.second;
252 auto iter =
bound_search(elementData.begin(), elementData.end(), elemId,
254 if (iter == elementData.end()) {
255 std::ostringstream errmsg;
256 errmsg <<
"Error! Sideset with id: " << sideset.
id <<
" and name: " << sideset.
name
257 <<
" has reference to invalid element '" << elemId <<
"'.";
261 std::string key = criterion(sideset, *iter, side);
272 return "SURFACE_" + elemData.topology.
name() +
"_" +
273 elemData.topology.side_topology_name(side) +
"_" + std::to_string(sideSet.
id);
275 return sideSet.
name +
"_" + elemData.topology.
name() +
"_" +
276 elemData.topology.side_topology_name(side);
288 return "SURFACE_" + elemData.partName +
"_" +
289 elemData.topology.side_topology_name(side) +
"_" + std::to_string(sideSet.
id);
291 return sideSet.
name +
"_" + elemData.partName +
"_" +
292 elemData.topology.side_topology_name(side);
301 std::vector<size_t> splitIndex(sideset.
data.size());
302 std::iota(std::begin(splitIndex), std::end(splitIndex), 0);
305 splitData.
index = splitIndex;
unsigned side_topology_num_nodes(unsigned side) const
Definition Iotm_TextMeshTopologyMapping.h:122
const std::string name() const
Definition Iotm_TextMeshTopologyMapping.h:71
std::string side_topology_name(unsigned side) const
Definition Iotm_TextMeshTopologyMapping.h:106
void split_by_no_split(const SidesetData< EntityId, Topology > &sideset, const std::vector< ElementData< EntityId, Topology > > &)
Definition Iotm_TextMeshSidesetSplitter.h:298
std::string m_sidesetName
Definition Iotm_TextMeshSidesetSplitter.h:314
SideBlockInfo get_side_block_info(const std::string &name) const
Definition Iotm_TextMeshSidesetSplitter.h:146
void split(const SidesetData< EntityId, Topology > &sideset, const std::vector< ElementData< EntityId, Topology > > &elementData)
Definition Iotm_TextMeshSidesetSplitter.h:93
SplitType m_splitType
Definition Iotm_TextMeshSidesetSplitter.h:313
SplitType get_split_type() const
Definition Iotm_TextMeshSidesetSplitter.h:165
std::function< std::string(const SidesetData< EntityId, Topology > &sideset, const ElementData< EntityId, Topology > &elemData, int side)> Criterion
Definition Iotm_TextMeshSidesetSplitter.h:239
SidesetSplitter()
Definition Iotm_TextMeshSidesetSplitter.h:83
SidesetSplitter(SplitType splitType)
Definition Iotm_TextMeshSidesetSplitter.h:75
bool is_index_local_to_proc(size_t elemPairIndex, int proc) const
Definition Iotm_TextMeshSidesetSplitter.h:189
ErrorHandler m_errorHandler
Definition Iotm_TextMeshSidesetSplitter.h:318
void set_split_type(SplitType inputSplitType)
Definition Iotm_TextMeshSidesetSplitter.h:166
void split_by_criterion(const SidesetData< EntityId, Topology > &sideset, const std::vector< ElementData< EntityId, Topology > > &elementData, Criterion criterion)
Definition Iotm_TextMeshSidesetSplitter.h:243
void split_by_topology(const SidesetData< EntityId, Topology > &sideset, const std::vector< ElementData< EntityId, Topology > > &elementData)
Definition Iotm_TextMeshSidesetSplitter.h:266
std::vector< size_t > get_indices_local_to_proc(const std::vector< size_t > &index, int proc) const
Definition Iotm_TextMeshSidesetSplitter.h:130
void split_by_element_block(const SidesetData< EntityId, Topology > &sideset, const std::vector< ElementData< EntityId, Topology > > &elementData)
Definition Iotm_TextMeshSidesetSplitter.h:282
std::vector< SideBlockInfo > get_side_block_info() const
Definition Iotm_TextMeshSidesetSplitter.h:117
void build_index_proc_map(const SidesetData< EntityId, Topology > &sideset, const std::vector< ElementData< EntityId, Topology > > &elementData)
Definition Iotm_TextMeshSidesetSplitter.h:169
void set_error_handler(ErrorHandler errorHandler)
Definition Iotm_TextMeshSidesetSplitter.h:91
std::unordered_map< size_t, int > m_indexProcMap
Definition Iotm_TextMeshSidesetSplitter.h:316
std::unordered_map< std::string, SplitData > m_splitMap
Definition Iotm_TextMeshSidesetSplitter.h:317
void fill_split_data(std::string key, size_t index, const ElementData< EntityId, Topology > &elemData, int side)
Definition Iotm_TextMeshSidesetSplitter.h:216
Definition Iotm_TextMeshAdjacencyGraph.h:39
ForwardIt bound_search(ForwardIt first, ForwardIt last, const T &value)
Definition Iotm_TextMeshFuncs.h:46
void convert_to_uppercase(std::string &str)
Definition Iotm_TextMeshFuncs.h:96
std::function< void(const std::ostringstream &)> ErrorHandler
Definition Iotm_TextMeshAdjacencyGraph.h:41
std::ostream & operator<<(std::ostream &out, const AssemblyType &t)
Definition Iotm_TextMeshAssembly.h:40
std::pair< EntityId, int > SidesetDataType
Definition Iotm_TextMeshSideset.h:39
void default_error_handler(const std::ostringstream &message)
Definition Iotm_TextMeshFuncs.h:40
SplitType
Definition Iotm_TextMeshSidesetSplitter.h:55
@ INVALID_SPLIT
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
text_mesh::SidesetData< EntityId, Topology > SidesetData
Definition Iotm_TextMesh.h:38
int64_t EntityId
Definition Iotm_TextMesh.h:33
Definition Iotm_TextMeshDataTypes.h:287
Definition Iotm_TextMeshDataTypes.h:276
Topology topology
Definition Iotm_TextMeshDataTypes.h:279
std::string partName
Definition Iotm_TextMeshDataTypes.h:281
std::string name
Definition Iotm_TextMeshEntityGroup.h:49
unsigned id
Definition Iotm_TextMeshEntityGroup.h:48
std::vector< DataType > data
Definition Iotm_TextMeshEntityGroup.h:51
Definition Iotm_TextMeshSidesetSplitter.h:45
unsigned numNodesPerSide
Definition Iotm_TextMeshSidesetSplitter.h:52
std::string elementTopology
Definition Iotm_TextMeshSidesetSplitter.h:49
std::string parentName
Definition Iotm_TextMeshSidesetSplitter.h:47
std::vector< size_t > sideIndex
Definition Iotm_TextMeshSidesetSplitter.h:51
std::string sideTopology
Definition Iotm_TextMeshSidesetSplitter.h:48
std::string touchingBlock
Definition Iotm_TextMeshSidesetSplitter.h:50
std::string name
Definition Iotm_TextMeshSidesetSplitter.h:46
Definition Iotm_TextMeshSideset.h:43
bool has_default_exodus_name() const
Definition Iotm_TextMeshSideset.h:87
Definition Iotm_TextMeshSidesetSplitter.h:204
std::string touchingBlock
Definition Iotm_TextMeshSidesetSplitter.h:207
SplitData()
Definition Iotm_TextMeshSidesetSplitter.h:213
int sideNodeCount
Definition Iotm_TextMeshSidesetSplitter.h:210
std::string sideTopology
Definition Iotm_TextMeshSidesetSplitter.h:209
std::string sidesetName
Definition Iotm_TextMeshSidesetSplitter.h:206
bool metaDataSet
Definition Iotm_TextMeshSidesetSplitter.h:205
std::vector< size_t > index
Definition Iotm_TextMeshSidesetSplitter.h:211
std::string elemTopology
Definition Iotm_TextMeshSidesetSplitter.h:208