diff --git a/FunctionSpace/FunctionSpace.cpp b/FunctionSpace/FunctionSpace.cpp index 874cafc5b94980648b2a3914e0d718926c906745..ea38989248cde6e218e375ca66a39d0d5b4b9f56 100644 --- a/FunctionSpace/FunctionSpace.cpp +++ b/FunctionSpace/FunctionSpace.cpp @@ -1,6 +1,7 @@ #include <sstream> #include "FunctionSpace.h" #include "BasisGenerator.h" +#include "ElementType.h" #include "Exception.h" using namespace std; @@ -161,8 +162,10 @@ vector<Dof> FunctionSpace::getKeys(const MElement& elem) const{ // New Element MElementFactory factory; - //MElement* permElement = factory.create(elem.getLowOrderTypeForMSH(), vertex); - MElement* permElement = factory.create(elem.getTypeForMSH(), vertex); + int parentTag = ElementType::ParentTypeFromTag(elem.getTypeForMSH()); + int lowOrderTag = ElementType::getTag(parentTag, 1, false); + + MElement* permElement = factory.create(lowOrderTag, vertex); // Edge & Face from Permuted Element // const size_t nEdge = permElement->getNumEdges(); diff --git a/FunctionSpace/ReferenceSpace.cpp b/FunctionSpace/ReferenceSpace.cpp index b139e837da3be53d549eb3135df0148cd4f207db..d11afb6f8101b636ecf0827ad51c8cc5103d468b 100644 --- a/FunctionSpace/ReferenceSpace.cpp +++ b/FunctionSpace/ReferenceSpace.cpp @@ -75,7 +75,7 @@ findCyclicPermutation(list<size_t>& listOfTrueReferenceSpace, list<size_t>::iterator it; list<size_t>::iterator end; - triple match; + triplet match; // Values For unPermutedIndex // vector<size_t> unPermutedIndex(nVertex); @@ -126,13 +126,13 @@ findCyclicPermutation(list<size_t>& listOfTrueReferenceSpace, } } -ReferenceSpace::triple ReferenceSpace:: +ReferenceSpace::triplet ReferenceSpace:: isCyclicPermutation(vector<size_t>& pTest, vector<size_t>& pRef){ // If no Face, we have no Cyclic Permutation if(!refFaceNodeIdx.size()){ - triple tri = { + triplet tri = { false, vector<size_t>(0), vector<size_t>(0) @@ -151,6 +151,17 @@ isCyclicPermutation(vector<size_t>& pTest, // Corresponding Face in Test Permutation size_t testFaceId = findCorrespondingFace(refNode, pTest); + // If no corresponding face found, we have no Cyclic Permutation + if(testFaceId == (size_t)(-1)){ + triplet tri = { + false, + vector<size_t>(0), + vector<size_t>(0) + }; + + return tri; + } + // Node IDs of Test Permutation correspnding Face const size_t nNodeInFaceTest = refFaceNodeIdx[testFaceId].size(); vector<size_t> testNode(nNodeInFaceTest); @@ -158,8 +169,8 @@ isCyclicPermutation(vector<size_t>& pTest, for(size_t i = 0; i < nNodeInFaceTest; i++) testNode[i] = pTest[refFaceNodeIdx[testFaceId][i]]; - // Return Triple - triple tri = { + // Return Triplet + triplet tri = { isFacePermutation(refNode, testNode), getRefIndexPermutation(pRef, pTest), getReverseIndexPermutation(pRef, pTest) @@ -196,38 +207,38 @@ size_t ReferenceSpace::findCorrespondingFace(vector<size_t>& face, f++; } - return f; + // If a valid face is found return it + if(f < nFace) + return f; + + // Else return (size_t)(-1) + else + return -1; } bool ReferenceSpace::isFacePermutation(vector<size_t>& refNode, vector<size_t>& testNode){ + // Check Size const size_t size = refNode.size(); - bool match = false; if(size != testNode.size()) return false; - for(size_t i = 0; i < size && !match; i++){ - bool submatch = true; + // Find refNode[0] in testNode + size_t offset = 0; - for(size_t j = 0; j < size && submatch; j++) - if(refNode[j] != testNode[j]) - submatch = false; + while(refNode[0] != testNode[offset] && offset < size) + offset++; - if(!submatch){ - size_t tmp0 = testNode[0]; - size_t tmp1 = testNode[1]; + // If refNode[0] not found in testNode, there is no face permutation + if(offset == size) + return false; - for(size_t k = 1; k < size + 1; k++){ - testNode[k % size] = tmp0; - tmp0 = tmp1; - tmp1 = testNode[(k + 1) % size]; - } - } + // Check refNode[i] and testNode[(i + offset) % size] + bool match = true; - else - match = true; - } + for(size_t i = 0; i < size && match; i++) + match = (refNode[i] == testNode[(i + offset) % size]); return match; } @@ -268,23 +279,25 @@ vector<size_t> ReferenceSpace::getReverseIndexPermutation(vector<size_t>& ref, return idxVec; } -bool ReferenceSpace::haveSameNode(vector<size_t>& face0, - vector<size_t>& face1){ +bool ReferenceSpace::haveSameNode(vector<size_t> face0, + vector<size_t> face1){ + // Check Sizes const size_t size = face0.size(); - bool matchIsPossible = true; - for(size_t i = 0; i < size && matchIsPossible; i++){ - bool submatch = false; + if(size != face1.size()) + return false; - for(size_t j = 0; j < size && !submatch; j++){ - if(face0[i] == face1[j]) - submatch = true; - } + // Sort both vectors + sort(face0.begin(), face0.end()); + sort(face1.begin(), face1.end()); - matchIsPossible = submatch; - } + // Check if elements are the same and at same position + bool match = true; - return matchIsPossible; + for(size_t i = 0; i < size && match; i++) + match = (face0[i] == face1[i]); + + return match; } void ReferenceSpace::getOrderedEdge(void){ diff --git a/FunctionSpace/ReferenceSpace.h b/FunctionSpace/ReferenceSpace.h index 04b740d8551573d1f4f9079e458a4d4b0328520e..1518a1fbec100df947e110bc69ae4433d698ecef 100644 --- a/FunctionSpace/ReferenceSpace.h +++ b/FunctionSpace/ReferenceSpace.h @@ -25,7 +25,7 @@ class ReferenceSpace{ bool first; std::vector<size_t> second; std::vector<size_t> third; - } triple; + } triplet; protected: // Element Definition // @@ -101,8 +101,8 @@ class ReferenceSpace{ std::list<std::vector<size_t> >& listOfRefNodeIndexPermutation, std::list<std::vector<size_t> >& listOfReverseNodeIndexPermutation); - triple isCyclicPermutation(std::vector<size_t>& pTest, - std::vector<size_t>& pRef); + triplet isCyclicPermutation(std::vector<size_t>& pTest, + std::vector<size_t>& pRef); size_t findCorrespondingFace(std::vector<size_t>& face, std::vector<size_t>& node); @@ -116,8 +116,8 @@ class ReferenceSpace{ std::vector<size_t> getReverseIndexPermutation(std::vector<size_t>& ref, std::vector<size_t>& test); - static bool haveSameNode(std::vector<size_t>& face0, - std::vector<size_t>& face1); + static bool haveSameNode(std::vector<size_t> face0, + std::vector<size_t> face1); size_t getPermutationIdx(const MElement& element) const;