From 54282dc9338bb8a8faab69fceee01c5ec5e26fd8 Mon Sep 17 00:00:00 2001
From: Nicolas Marsic <nicolas.marsic@gmail.com>
Date: Tue, 8 Apr 2014 12:41:50 +0000
Subject: [PATCH] Removing cyclic permutation stuffs from ReferenceSpace (only
 connectivity is used now)

---
 FunctionSpace/ReferenceSpace.cpp    | 161 +++-------------------------
 FunctionSpace/ReferenceSpace.h      |  15 +--
 FunctionSpace/TriReferenceSpace.cpp |  15 ---
 FunctionSpace/TriReferenceSpace.h   |   3 -
 4 files changed, 20 insertions(+), 174 deletions(-)

diff --git a/FunctionSpace/ReferenceSpace.cpp b/FunctionSpace/ReferenceSpace.cpp
index bdd10dc17e..d54c03c268 100644
--- a/FunctionSpace/ReferenceSpace.cpp
+++ b/FunctionSpace/ReferenceSpace.cpp
@@ -32,14 +32,14 @@ void ReferenceSpace::init(void){
 
   pTree = new PermutationTree(vertexSeq);
 
-  // Cyclic Permutation //
+  // Connectivity //
   list<size_t>          listOfTrueReferenceSpace;
   list<vector<size_t> > listOfRefNodeIndexPermutation;
   list<vector<size_t> > listOfReverseNodeIndexPermutation;
 
-  findCyclicPermutation(listOfTrueReferenceSpace,
-                        listOfRefNodeIndexPermutation,
-                        listOfReverseNodeIndexPermutation);
+  findConnectivity(listOfTrueReferenceSpace,
+                   listOfRefNodeIndexPermutation,
+                   listOfReverseNodeIndexPermutation);
 
   // Iterators //
   list<size_t>::iterator refSpaceIt = listOfTrueReferenceSpace.begin();
@@ -132,9 +132,10 @@ void ReferenceSpace::init(const std::string& path){
 }
 
 void ReferenceSpace::
-findCyclicPermutation(list<size_t>&          listOfTrueReferenceSpace,
-                      list<vector<size_t> >& listOfRefNodeIndexPermutation,
-                      list<vector<size_t> >& listOfReverseNodeIndexPermutation){
+findConnectivity(list<size_t>&          listOfTrueReferenceSpace,
+                 list<vector<size_t> >& listOfRefNodeIndexPermutation,
+                 list<vector<size_t> >& listOfReverseNodeIndexPermutation){
+
   // Alloc Some Data //
   const size_t nPerm = pTree->getNPermutation();
 
@@ -151,7 +152,7 @@ findCyclicPermutation(list<size_t>&          listOfTrueReferenceSpace,
   for(size_t i = 0; i < nVertex; i++)
     unPermutedIndex[i] = i;
 
-  // Find Cyclic Permutation //
+  // Find Connectivity //
   for(size_t i = 0; i < nPerm; i++){
     // No match
     match.first = false;
@@ -167,8 +168,8 @@ findCyclicPermutation(list<size_t>&          listOfTrueReferenceSpace,
       // Take Reference Space 'it'
       pTree->fillWithPermutation(*it, pRef);
 
-      // Look if it matches
-      match = isCyclicPermutation(pTest, pRef);
+      // Look if it matches (do pTest and pRef have the same connectivity ?)
+      match = isSameConnectivity(pTest, pRef);
 
       // If not, go to next Reference Space
       if(!match.first)
@@ -186,7 +187,7 @@ findCyclicPermutation(list<size_t>&          listOfTrueReferenceSpace,
       pTree->addTagToPermutation(i, i);
     }
 
-    // If a ReferenceSpace is found, and the index permutations
+    // If a ReferenceSpace is found, add the index permutations
     else{
       listOfRefNodeIndexPermutation.push_back(match.second);
       listOfReverseNodeIndexPermutation.push_back(match.third);
@@ -197,55 +198,16 @@ findCyclicPermutation(list<size_t>&          listOfTrueReferenceSpace,
 }
 
 ReferenceSpace::triplet ReferenceSpace::
-isCyclicPermutation(const vector<size_t>& pTest,
-                    const vector<size_t>& pRef) const{
+isSameConnectivity(const vector<size_t>& pTest,
+                   const vector<size_t>& pRef) const{
 
   // Triplet to return
   triplet tri;
 
-  // If no Face, we have no Cyclic Permutation
-  if(!refFaceNodeIdx.size()){
-    tri.first  = false;
-    tri.second = vector<size_t>(0);
-    tri.third  = vector<size_t>(0);
-
-    return tri;
-  }
-
-  // Node IDs of Reference Space first Face
-  const size_t   nNodeInFaceZero = refFaceNodeIdx[0].size();
-  vector<size_t> refNode(nNodeInFaceZero);
-
-  for(size_t i = 0; i < nNodeInFaceZero; i++)
-    refNode[i] = pRef[refFaceNodeIdx[0][i]];
-
-  // 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)){
-    tri.first  = false;
-    tri.second = vector<size_t>(0);
-    tri.third  = 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);
-
-  for(size_t i = 0; i < nNodeInFaceTest; i++)
-    testNode[i] = pTest[refFaceNodeIdx[testFaceId][i]];
+  // Test if we have the same connectivity (i.e. the same edges)
+  bool haveSameEdge = isSameEdge(pTest, pRef);
 
-  // Test if we have a face cyclic permutation
-  size_t isCyclic = isFacePermutation(refNode, testNode);
-
-  // Test if we have the same connectivity
-  bool isSameConnectivity = isSameEdge(pTest, pRef);
-
-  //if(isCyclic && isSameConnectivity){
-  if(isSameConnectivity){
+  if(haveSameEdge){
     tri.first  = true;
     tri.second = getRefIndexPermutation(pRef, pTest);
     tri.third  = getReverseIndexPermutation(pRef, pTest);
@@ -260,95 +222,6 @@ isCyclicPermutation(const vector<size_t>& pTest,
   return tri;
 }
 
-size_t ReferenceSpace::findCorrespondingFace(const vector<size_t>& face,
-                                             const vector<size_t>& node) const{
-  // Init Stuff //
-  const size_t nFace    = refFaceNodeIdx.size();
-  const size_t faceSize = face.size();
-  bool match = false;
-  size_t f = 0;
-
-  vector<size_t> testFace(faceSize);
-  size_t         nNodeInFace;
-
-  // Test All Face until match
-  while(!match && f < nFace){
-    nNodeInFace = refFaceNodeIdx[f].size();
-
-    if(nNodeInFace == faceSize){
-      // Get face f nodes
-      for(size_t i = 0; i < faceSize; i++)
-        testFace[i] = node[refFaceNodeIdx[f][i]];
-
-      // Look if match
-      match = haveSameNode(testFace, face);
-    }
-
-    if(!match)
-      f++;
-  }
-
-  // If a valid face is found return it
-  if(f < nFace)
-    return f;
-
-  // Else return (size_t)(-1)
-  else
-    return -1;
-}
-
-bool ReferenceSpace::haveSameNode(const vector<size_t>& face0,
-                                  const vector<size_t>& face1){
-  // Check Sizes
-  const size_t size = face0.size();
-
-  if(size != face1.size())
-    return false;
-
-  // Copy vector
-  vector<size_t> cFace0(face0);
-  vector<size_t> cFace1(face1);
-
-  // Sort both copy vectors
-  sort(cFace0.begin(), cFace0.end());
-  sort(cFace1.begin(), cFace1.end());
-
-  // Check if elements are the same and at same position
-  bool match = true;
-
-  for(size_t i = 0; i < size && match; i++)
-    match = (cFace0[i] == cFace1[i]);
-
-  return match;
-}
-
-bool ReferenceSpace::isFacePermutation(const vector<size_t>& refNode,
-                                       const vector<size_t>& testNode){
-  // Check Size
-  const size_t size = refNode.size();
-
-  if(size != testNode.size())
-    return false;
-
-  // Find refNode[0] in testNode
-  size_t offset = 0;
-
-  while(refNode[0] != testNode[offset] && offset < size)
-    offset++;
-
-  // If refNode[0] not found in testNode, there is no face permutation
-  if(offset == size)
-    return false;
-
-  // Check refNode[i] and testNode[(i + offset) % size]
-  bool match = true;
-
-  for(size_t i = 0; i < size && match; i++)
-    match = (refNode[i] == testNode[(i + offset) % size]);
-
-  return match;
-}
-
 bool ReferenceSpace::isSameEdge(const std::vector<size_t>& pTest,
                                 const std::vector<size_t>& pRef) const{
   // Set of Reference Edges
diff --git a/FunctionSpace/ReferenceSpace.h b/FunctionSpace/ReferenceSpace.h
index 07f9b8afa0..1e0e04489e 100644
--- a/FunctionSpace/ReferenceSpace.h
+++ b/FunctionSpace/ReferenceSpace.h
@@ -150,22 +150,13 @@ class ReferenceSpace{
   void getOrderedEdge(void);
   void getOrderedFace(void);
 
-  void findCyclicPermutation
+  void findConnectivity
     (std::list<size_t>&               listOfTrueReferenceSpace,
      std::list<std::vector<size_t> >& listOfRefNodeIndexPermutation,
      std::list<std::vector<size_t> >& listOfReverseNodeIndexPermutation);
 
-  triplet isCyclicPermutation(const std::vector<size_t>& pTest,
-                              const std::vector<size_t>& pRef) const;
-
-  size_t findCorrespondingFace(const std::vector<size_t>& face,
-                               const std::vector<size_t>& node) const;
-
-  static bool haveSameNode(const std::vector<size_t>& face0,
-                           const std::vector<size_t>& face1);
-
-  static bool isFacePermutation(const std::vector<size_t>& refNode,
-                                const std::vector<size_t>& testNode);
+  triplet isSameConnectivity(const std::vector<size_t>& pTest,
+                             const std::vector<size_t>& pRef) const;
 
   bool isSameEdge(const std::vector<size_t>& pTest,
                   const std::vector<size_t>& pRef) const;
diff --git a/FunctionSpace/TriReferenceSpace.cpp b/FunctionSpace/TriReferenceSpace.cpp
index 449502e939..69ecc2c04b 100644
--- a/FunctionSpace/TriReferenceSpace.cpp
+++ b/FunctionSpace/TriReferenceSpace.cpp
@@ -6,21 +6,6 @@
 using namespace std;
 
 TriReferenceSpace::TriReferenceSpace(void){
-  // Look if a serialized TriReferenceSpace is present in root //
-  // If it does, load it                                       //
-  // If not, create it and serialize it for an other time      //
-
-  try{
-    init(string("tri.refSpace"));
-  }
-
-  catch(std::exception& exception){
-    initTri();
-    serialize("tri.refSpace");
-  }
-}
-
-void TriReferenceSpace::initTri(void){
   // Vertex Definition //
   nVertex = 3;
 
diff --git a/FunctionSpace/TriReferenceSpace.h b/FunctionSpace/TriReferenceSpace.h
index 86dafed656..9f52b5d64e 100644
--- a/FunctionSpace/TriReferenceSpace.h
+++ b/FunctionSpace/TriReferenceSpace.h
@@ -17,9 +17,6 @@ class TriReferenceSpace: public ReferenceSpace{
   virtual ~TriReferenceSpace(void);
 
   virtual std::string toLatex(void) const;
-
- private:
-  void initTri(void);
 };
 
 /**
-- 
GitLab