19#include <unordered_map>
25#if defined(_WIN32) && !defined(__MINGW32__)
27#define strcasecmp _stricmp
28#define strncasecmp _strnicmp
41 using ErrorHandler = std::function<void(
const std::ostringstream &)>;
43 template <
typename EntityId,
typename Topology>
struct TextMeshData;
45 template <
typename EntityId,
typename Topology>
struct ElementData;
151 typename std::set<FaceConnection>::iterator lowerBound =
154 return (lowerBound !=
connections.end() && lowerBound->thisSide == thisSide);
160 typename std::set<FaceConnection>::iterator lowerBound =
163 return (lowerBound !=
connections.end() && lowerBound->thisSide == thisSide &&
164 lowerBound->thatElement == thatElem);
207 ErrorHandler errorHandler = [](
const std::ostringstream &errmsg) {
220 std::vector<size_t> localAndAuraElementIndex =
222 std::unordered_map<EntityId, std::set<size_t>> elementsForNode =
229 void dump(std::ostream &out = std::cout)
232 if (!iter.second.connections.empty()) {
233 out <<
"Element index: " << iter.first << std::endl;
235 for (
const auto &entry : iter.second.connections) {
236 out <<
"\tConnected on side: " << entry.thisSide
237 <<
" to element index: " << entry.thatElement <<
" and side: " << entry.thatSide
229 void dump(std::ostream &out = std::cout) {
…}
244 std::ostream &out = std::cout)
247 if (!iter.second.connections.empty()) {
248 out <<
"Element: " << elemDataVec[iter.first].identifier <<
" {"
249 << elemDataVec[iter.first].topology <<
"}" << std::endl;
251 for (
const auto &entry : iter.second.connections) {
252 out <<
"\tConnected on side: " << entry.thisSide
253 <<
" to element: " << elemDataVec[entry.thatElement].identifier <<
" {"
254 << elemDataVec[entry.thatElement].topology <<
"}" <<
" and side: " << entry.thatSide
265 std::ostringstream errmsg;
266 errmsg <<
"Could not find element index " << elemIndex;
275 typename std::unordered_map<size_t, FaceConnections>::const_iterator
begin()
const
275 typename std::unordered_map<size_t, FaceConnections>::const_iterator
begin()
const {
…}
279 typename std::unordered_map<size_t, FaceConnections>::const_iterator
end()
const
279 typename std::unordered_map<size_t, FaceConnections>::const_iterator
end()
const {
…}
290 bool operator()(
const std::string &lhs,
const std::string &rhs)
292 return (strcasecmp(lhs.c_str(), rhs.c_str()) < 0);
290 bool operator()(
const std::string &lhs,
const std::string &rhs) {
…}
311 const size_t elemIndex,
int side,
312 const std::unordered_map<
EntityId, std::set<size_t>> &elementsForNode)
314 std::set<size_t> neighbors;
315 std::vector<OrdinalType> sideNodeIndices =
320 if (!sideNodeIndices.empty()) {
321 EntityId firstSideNode = elementNodeIds[sideNodeIndices[0]];
322 neighbors = elementsForNode.at(firstSideNode);
325 for (
size_t i = 1; i < sideNodeIndices.size(); ++i) {
327 EntityId sideNode = elementNodeIds[sideNodeIndex];
328 const std::set<size_t> &sideNodeElementIndices = elementsForNode.at(sideNode);
330 std::set<size_t> intersection;
331 std::set_intersection(neighbors.begin(), neighbors.end(), sideNodeElementIndices.begin(),
332 sideNodeElementIndices.end(),
333 std::inserter(intersection, intersection.begin()));
335 neighbors = intersection;
343 std::vector<OrdinalType> sideNodeIndices =
345 std::vector<EntityId> sideNodes(sideNodeIndices.size());
348 for (
size_t i = 0; i < sideNodeIndices.size(); ++i) {
350 sideNodes[i] = elementNodeIds[sideNodeIndex];
358 std::vector<EntityId> sideNodes =
get_side_nodes(elemIndex, side);
359 std::sort(sideNodes.begin(), sideNodes.end());
366 size_t neighborElementIndex)
370 std::vector<EntityId> sideNodes =
373 for (
int otherSide = 1;
376 std::vector<EntityId> otherSideNodes =
378 if (sideNodes == otherSideNodes) {
386 size_t neighborElementIndex)
391 std::ostringstream errmsg;
392 errmsg <<
"Neighboring reciprocity check for elements "
401 const std::vector<EntityId> &permutedNodes,
402 const std::vector<OrdinalType> &permutationOrdinals)
404 const size_t numNodes = permutationOrdinals.size();
406 if ((numNodes > permutedNodes.size()) || (numNodes > controlNodes.size())) {
410 bool equivalent =
true;
411 for (
size_t i = 0; equivalent && i < numNodes; ++i) {
412 equivalent = controlNodes[permutationOrdinals[i]] == permutedNodes[i];
420 const std::vector<EntityId> &controlNodes,
421 const std::vector<EntityId> &permutedNodes,
425 bool equivalent =
false;
427 if (controlNodes.size() != permutedNodes.size())
428 return std::make_pair(equivalent, permutation);
431 std::ostringstream errmsg;
432 errmsg <<
"Invalid number of permutations to check: " << numPermutations;
436 std::vector<OrdinalType> permutationOrdinals;
448 return std::make_pair(equivalent, permutation);
452 const std::vector<EntityId> &controlNodes,
453 const std::vector<EntityId> &permutedNodes)
458 std::pair<bool, PermutationType>
460 const std::vector<EntityId> &permutedNodes)
469 std::vector<EntityId> thisNodes =
get_side_nodes(thisElem, thisSide);
470 std::vector<EntityId> thatNodes =
get_side_nodes(thatElem, thatSide);
473 std::pair<bool, PermutationType> result =
476 bool samePolarity = result.first;
490 int numSides = it->second.numSides;
491 if (side < 1 || side > numSides)
500 std::vector<FaceConnection> reciprocity;
505 int thatSide = connectionToThatElement.
thatSide;
514 connectionToThisElement)) {
515 reciprocity.push_back(connectionToThatElement);
527 if (!reciprocity.empty()) {
530 for (
const FaceConnection &connectionToThatElement : reciprocity) {
531 IndexType thatIndex = connectionToThatElement.thatElement;
532 int thatSide = connectionToThatElement.thatSide;
538 thisEntry.
remove(connectionToThatElement);
539 thatEntry.
remove(connectionToThisElement);
615 return topo2.is_shell();
660 const size_t thatElem = connectedElementIndex;
662 bool doConnect =
false;
663 bool breakConnection =
false;
669 breakConnection = doConnect;
676 breakConnection = doConnect;
685 if (breakConnection) {
712 std::ostringstream errmsg;
713 errmsg <<
"Invalid proc ownership for co-incident shells "
718 <<
" Co-incident shells must all exist on the same processor";
726 const std::unordered_map<
EntityId, std::set<size_t>> &elementsForNode)
728 int side = adjacency.
side;
730 std::set<size_t> elementIndicesConnectedToSide =
733 for (
size_t connectedElementIndex : elementIndicesConnectedToSide) {
742 const std::vector<size_t> &elementIndices,
743 const std::unordered_map<
EntityId, std::set<size_t>> &elementsForNode)
747 for (
size_t elementIndex : elementIndices) {
749 for (
int side = 1; side <= numSides; ++side) {
750 if (
m_indexGraph[elementIndex].sideReference[side - 1] == 0) {
760 for (
size_t elementIndex : elementIndices) {
766 std::unordered_map<EntityId, std::set<size_t>>
769 std::unordered_map<EntityId, std::set<size_t>> elementsForNode;
770 for (
size_t index : elementIndices) {
772 elementsForNode[nodeId].insert(index);
776 return elementsForNode;
780 const std::vector<std::string> &sortedSelectedBlocks)
782 if (sortedSelectedBlocks.empty())
787 return std::binary_search(sortedSelectedBlocks.begin(), sortedSelectedBlocks.end(),
792 const std::vector<std::string> &sortedSelectedBlocks,
int proc)
794 bool isGloballySelected = (
ANY_PROC == proc);
799 return isInSelectedBlocks && (isGloballySelected || isLocallySelected || hasLocalNode);
805 std::vector<size_t> localAndAuraElementIndex;
808 std::vector<std::string> sortedSelectedBlocks;
809 for (
const std::string &block : selectedBlocks) {
810 sortedSelectedBlocks.push_back(block);
812 std::sort(sortedSelectedBlocks.begin(), sortedSelectedBlocks.end(),
StringCaseCompLess());
816 localAndAuraElementIndex.push_back(i);
820 localAndAuraElementIndex.resize(localAndAuraElementIndex.size());
821 return localAndAuraElementIndex;
std::vector< Ordinal > side_topology_node_indices(unsigned side) const
Definition Iotm_TextMeshTopologyMapping.h:131
static constexpr Permutation InvalidPermutation
Definition Iotm_TextMeshTopologyMapping.h:39
uint8_t Permutation
Definition Iotm_TextMeshTopologyMapping.h:36
unsigned num_positive_permutations() const
Definition Iotm_TextMeshTopologyMapping.h:152
bool is_shell() const
Definition Iotm_TextMeshTopologyMapping.h:148
bool fill_permutation_indices(Permutation permutation, std::vector< Ordinal > &nodeOrdinalVector) const
Definition Iotm_TextMeshTopologyMapping.h:167
int num_face_sides() const
Definition Iotm_TextMeshTopologyMapping.h:83
uint16_t Ordinal
Definition Iotm_TextMeshTopologyMapping.h:35
unsigned num_permutations() const
Definition Iotm_TextMeshTopologyMapping.h:150
const TopologyMapEntry & side_topology(unsigned side) const
Definition Iotm_TextMeshTopologyMapping.h:115
void create_graph(int proc=ANY_PROC)
Definition Iotm_TextMeshAdjacencyGraph.h:215
size_t size() const
Definition Iotm_TextMeshAdjacencyGraph.h:273
void add_connection(CurrentAdjacency &adjacency, size_t connectedElementIndex, int otherSide)
Definition Iotm_TextMeshAdjacencyGraph.h:657
bool element_is_in_selected_blocks(const size_t elemIndex, const std::vector< std::string > &sortedSelectedBlocks)
Definition Iotm_TextMeshAdjacencyGraph.h:779
static constexpr int INVALID_SIDE
Definition Iotm_TextMeshAdjacencyGraph.h:97
virtual size_t get_num_elements() const =0
ErrorHandler m_errorHandler
Definition Iotm_TextMeshAdjacencyGraph.h:824
virtual const Topology & get_element_topology(const size_t elemIndex) const =0
bool is_shell_shell_connection(const size_t thisElem, const size_t thatElem)
Definition Iotm_TextMeshAdjacencyGraph.h:550
bool is_shell_solid_connection(const size_t thisElem, const size_t thatElem)
Definition Iotm_TextMeshAdjacencyGraph.h:562
void create_graph(const std::vector< std::string > &selectedBlocks, int proc=ANY_PROC)
Definition Iotm_TextMeshAdjacencyGraph.h:217
bool is_selected_element(const size_t elemIndex, const std::vector< std::string > &sortedSelectedBlocks, int proc)
Definition Iotm_TextMeshAdjacencyGraph.h:791
virtual const std::string & get_element_block_name(const size_t elemIndex) const =0
virtual ~SideAdjacencyGraph()=default
bool has_any_shell_connection_on_side(size_t thisIndex, int thisSide)
Definition Iotm_TextMeshAdjacencyGraph.h:612
void fill_sides_for_connected_element(CurrentAdjacency &adjacency, size_t neighborElementIndex)
Definition Iotm_TextMeshAdjacencyGraph.h:385
void break_reciprocal_connections(CurrentAdjacency &adjacency)
Definition Iotm_TextMeshAdjacencyGraph.h:523
void build_side_connectivity_graph(const std::vector< size_t > &elementIndices, const std::unordered_map< EntityId, std::set< size_t > > &elementsForNode)
Definition Iotm_TextMeshAdjacencyGraph.h:741
const FaceConnections & operator[](const IndexType elemIndex) const
Definition Iotm_TextMeshAdjacencyGraph.h:260
std::vector< FaceConnection > get_reciprocity(CurrentAdjacency &adjacency)
Definition Iotm_TextMeshAdjacencyGraph.h:498
bool has_same_polarity(const size_t thisElem, const int thisSide, const size_t thatElem, const int thatSide)
Definition Iotm_TextMeshAdjacencyGraph.h:466
std::pair< bool, PermutationType > get_permutation(const Topology &topology, const std::vector< EntityId > &controlNodes, const std::vector< EntityId > &permutedNodes, PermutationType numPermutations)
Definition Iotm_TextMeshAdjacencyGraph.h:419
void initialize_side_connectivity_graph(const std::vector< size_t > &elementIndices)
Definition Iotm_TextMeshAdjacencyGraph.h:758
virtual EntityId get_element_id(const size_t elemIndex) const =0
std::unordered_map< EntityId, std::set< size_t > > get_elements_for_node_map(const std::vector< size_t > &elementIndices)
Definition Iotm_TextMeshAdjacencyGraph.h:767
typename Topology::Ordinal OrdinalType
Definition Iotm_TextMeshAdjacencyGraph.h:285
std::vector< size_t > get_local_and_aura_elements(const std::vector< std::string > &selectedBlocks, int proc)
Definition Iotm_TextMeshAdjacencyGraph.h:803
virtual int get_element_proc(const size_t elemIndex) const =0
bool equivalent_node_permutation(const std::vector< EntityId > &controlNodes, const std::vector< EntityId > &permutedNodes, const std::vector< OrdinalType > &permutationOrdinals)
Definition Iotm_TextMeshAdjacencyGraph.h:400
void internal_fill_sides_for_connected_element(CurrentAdjacency &adjacency, size_t neighborElementIndex)
Definition Iotm_TextMeshAdjacencyGraph.h:365
bool has_solid_solid_connection_on_side(size_t thisIndex, int thisSide)
Definition Iotm_TextMeshAdjacencyGraph.h:648
bool is_shell_solid_connection(const Topology &thisElemTopology, const Topology &thatElemTopology)
Definition Iotm_TextMeshAdjacencyGraph.h:556
void enforce_coincident_shell_ownership(IndexType connectedElemIndex1, IndexType connectedElemIndex2)
Definition Iotm_TextMeshAdjacencyGraph.h:706
std::unordered_map< size_t, FaceConnections >::const_iterator end() const
Definition Iotm_TextMeshAdjacencyGraph.h:279
std::pair< bool, PermutationType > get_permutation(const Topology &topology, const std::vector< EntityId > &controlNodes, const std::vector< EntityId > &permutedNodes)
Definition Iotm_TextMeshAdjacencyGraph.h:451
bool has_solid_shell_connection_on_side(size_t thisIndex, int thisSide)
Definition Iotm_TextMeshAdjacencyGraph.h:639
int64_t IndexType
Definition Iotm_TextMeshAdjacencyGraph.h:94
void dump(std::ostream &out=std::cout)
Definition Iotm_TextMeshAdjacencyGraph.h:229
void dump(const std::vector< ElementData< EntityId, Topology > > &elemDataVec, std::ostream &out=std::cout)
Definition Iotm_TextMeshAdjacencyGraph.h:243
std::vector< EntityId > get_side_nodes(const size_t elemIndex, const int side)
Definition Iotm_TextMeshAdjacencyGraph.h:341
bool verify_entry(IndexType elemIndex, int side)
Definition Iotm_TextMeshAdjacencyGraph.h:481
bool is_solid_shell_connection(const size_t thisElem, const size_t thatElem)
Definition Iotm_TextMeshAdjacencyGraph.h:574
static constexpr IndexType INVALID_INDEX
Definition Iotm_TextMeshAdjacencyGraph.h:98
std::unordered_map< size_t, FaceConnections >::const_iterator begin() const
Definition Iotm_TextMeshAdjacencyGraph.h:275
std::pair< bool, PermutationType > get_positive_permutation(const Topology &topology, const std::vector< EntityId > &controlNodes, const std::vector< EntityId > &permutedNodes)
Definition Iotm_TextMeshAdjacencyGraph.h:459
std::function< bool(const Topology &topo1, const Topology &topo2)> Criterion
Definition Iotm_TextMeshAdjacencyGraph.h:592
bool is_solid_shell_connection(const Topology &thisElemTopology, const Topology &thatElemTopology)
Definition Iotm_TextMeshAdjacencyGraph.h:568
void process_side_connectivity(CurrentAdjacency &adjacency, const std::unordered_map< EntityId, std::set< size_t > > &elementsForNode)
Definition Iotm_TextMeshAdjacencyGraph.h:724
bool has_shell_shell_connection_on_side(size_t thisIndex, int thisSide)
Definition Iotm_TextMeshAdjacencyGraph.h:621
virtual bool element_has_any_node_on_proc(const size_t elemIndex, int proc) const =0
std::unordered_map< size_t, FaceConnections > m_indexGraph
Definition Iotm_TextMeshAdjacencyGraph.h:825
bool has_shell_solid_connection_on_side(size_t thisIndex, int thisSide)
Definition Iotm_TextMeshAdjacencyGraph.h:630
bool is_solid_solid_connection(const size_t thisElem, const size_t thatElem)
Definition Iotm_TextMeshAdjacencyGraph.h:586
typename Topology::Permutation PermutationType
Definition Iotm_TextMeshAdjacencyGraph.h:286
virtual const std::vector< EntityId > & get_element_node_ids(const size_t elemIndex) const =0
static constexpr int ANY_PROC
Definition Iotm_TextMeshAdjacencyGraph.h:96
void set_side_connectivity(CurrentAdjacency &adjacency, size_t connectedElementIndex)
Definition Iotm_TextMeshAdjacencyGraph.h:697
bool has_connection_type_on_side(size_t thisIndex, int thisSide, Criterion criterion)
Definition Iotm_TextMeshAdjacencyGraph.h:594
void set_error_handler(ErrorHandler errorHandler)
Definition Iotm_TextMeshAdjacencyGraph.h:227
bool is_shell_shell_connection(const Topology &thisElemTopology, const Topology &thatElemTopology)
Definition Iotm_TextMeshAdjacencyGraph.h:544
bool is_solid_solid_connection(const Topology &thisElemTopology, const Topology &thatElemTopology)
Definition Iotm_TextMeshAdjacencyGraph.h:580
std::vector< EntityId > get_sorted_side_nodes(const size_t elemIndex, const int side)
Definition Iotm_TextMeshAdjacencyGraph.h:356
std::set< size_t > get_element_indices_with_common_nodes_on_side(const size_t elemIndex, int side, const std::unordered_map< EntityId, std::set< size_t > > &elementsForNode)
Definition Iotm_TextMeshAdjacencyGraph.h:310
SideAdjacencyGraph()
Definition Iotm_TextMeshAdjacencyGraph.h:205
Definition Iotm_TextMeshAdjacencyGraph.h:39
std::function< void(const std::ostringstream &)> ErrorHandler
Definition Iotm_TextMeshAdjacencyGraph.h:41
void default_error_handler(const std::ostringstream &message)
Definition Iotm_TextMeshFuncs.h:40
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
Definition Iotm_TextMeshAdjacencyGraph.h:298
std::vector< int > connectedSides
Definition Iotm_TextMeshAdjacencyGraph.h:307
size_t elementIndex
Definition Iotm_TextMeshAdjacencyGraph.h:303
CurrentAdjacency(size_t elementIndex_, int side_)
Definition Iotm_TextMeshAdjacencyGraph.h:299
int side
Definition Iotm_TextMeshAdjacencyGraph.h:304
Definition Iotm_TextMeshAdjacencyGraph.h:101
bool operator==(const FaceConnection &rhs) const
Definition Iotm_TextMeshAdjacencyGraph.h:110
bool operator<(const FaceConnection &rhs) const
Definition Iotm_TextMeshAdjacencyGraph.h:122
bool operator!=(const FaceConnection &rhs) const
Definition Iotm_TextMeshAdjacencyGraph.h:116
int thisSide
Definition Iotm_TextMeshAdjacencyGraph.h:135
IndexType thatElement
Definition Iotm_TextMeshAdjacencyGraph.h:136
int thatSide
Definition Iotm_TextMeshAdjacencyGraph.h:137
FaceConnection()
Definition Iotm_TextMeshAdjacencyGraph.h:102
FaceConnection(int thisSide_, IndexType otherElement_, int otherSide_)
Definition Iotm_TextMeshAdjacencyGraph.h:105
Definition Iotm_TextMeshAdjacencyGraph.h:141
FaceConnections(unsigned numSides_)
Definition Iotm_TextMeshAdjacencyGraph.h:143
std::vector< int > sideReference
Definition Iotm_TextMeshAdjacencyGraph.h:190
bool has_any_connection(int thisSide, IndexType thatElem) const
Definition Iotm_TextMeshAdjacencyGraph.h:157
bool has_any_connection(int thisSide) const
Definition Iotm_TextMeshAdjacencyGraph.h:148
std::set< FaceConnection > connections
Definition Iotm_TextMeshAdjacencyGraph.h:194
FaceConnections()
Definition Iotm_TextMeshAdjacencyGraph.h:142
unsigned numSides
Definition Iotm_TextMeshAdjacencyGraph.h:186
void remove(const FaceConnection &connection)
Definition Iotm_TextMeshAdjacencyGraph.h:176
void add(const FaceConnection &connection)
Definition Iotm_TextMeshAdjacencyGraph.h:167
Definition Iotm_TextMeshAdjacencyGraph.h:289
bool operator()(const std::string &lhs, const std::string &rhs)
Definition Iotm_TextMeshAdjacencyGraph.h:290
Definition Iotm_TextMeshDataTypes.h:314