///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2015- Statoil ASA // Copyright (C) 2015- Ceetron Solutions AS // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at // for more details. // ///////////////////////////////////////////////////////////////////////////////// #pragma once #include #include #include class RigFemFaceComparator { public: RigFemFaceComparator() : m_minMainFaceNodeIdx(std::numeric_limits::max()), m_faceIdxToMinMainFaceNodeIdx(0) {} void setMainFace(const int* elmNodes, const int * localFaceIndices, int faceNodeCount) { m_canonizedMainFaceIdxes.resize(faceNodeCount); m_minMainFaceNodeIdx = std::numeric_limits::max(); m_faceIdxToMinMainFaceNodeIdx = 0; for(int fnIdx = 0; fnIdx < faceNodeCount; ++fnIdx) { int nodeIdx = elmNodes[localFaceIndices[fnIdx]]; m_canonizedMainFaceIdxes[fnIdx] = nodeIdx; if (nodeIdx < m_minMainFaceNodeIdx) { m_minMainFaceNodeIdx = nodeIdx; m_faceIdxToMinMainFaceNodeIdx = fnIdx; } } } bool isSameButOposite(const int* elmNodes, const int * localFaceIndices, int faceNodeCount) { if (faceNodeCount != static_cast(m_canonizedMainFaceIdxes.size())) return false; // Find min node index in face int minNodeIdx = std::numeric_limits::max(); int faceIdxToMinNodeIdx = 0; for (int fnIdx = 0; fnIdx < faceNodeCount; ++fnIdx) { int nodeIdx = elmNodes[localFaceIndices[fnIdx]]; if (nodeIdx < minNodeIdx) { minNodeIdx = nodeIdx; faceIdxToMinNodeIdx = fnIdx; } } // Compare faces { if (minNodeIdx != m_minMainFaceNodeIdx ) return false; int canFaceIdx = m_faceIdxToMinMainFaceNodeIdx; int fnIdx = faceIdxToMinNodeIdx; int count = 0; for (; count < faceNodeCount; --fnIdx, ++canFaceIdx, ++count) { if (fnIdx < 0) fnIdx = faceNodeCount - 1; if (canFaceIdx == faceNodeCount) canFaceIdx = 0; if (elmNodes[localFaceIndices[fnIdx]] != m_canonizedMainFaceIdxes[canFaceIdx]) return false; } return true; } } private: std::vector m_canonizedMainFaceIdxes; int m_minMainFaceNodeIdx; int m_faceIdxToMinMainFaceNodeIdx; };