From a88a2028824810a3ee478d3860e77feda03a1c5c Mon Sep 17 00:00:00 2001
From: Nicolas Marsic <nicolas.marsic@gmail.com>
Date: Thu, 18 Jul 2013 07:50:22 +0000
Subject: [PATCH] Adding Quad and Tet EdgeBasis with nex ReferenceSpace --
 Seems OK

---
 FunctionSpace/QuadEdgeBasis.cpp    | 100 ++++++++++++++---------------
 FunctionSpace/QuadEdgeBasis.h      |   2 +-
 FunctionSpace/QuadNedelecBasis.cpp |  30 ++++-----
 FunctionSpace/TetEdgeBasis.cpp     |  92 +++++++++++++-------------
 FunctionSpace/TetEdgeBasis.h       |   2 +-
 FunctionSpace/TetNedelecBasis.cpp  |  34 +++++-----
 6 files changed, 122 insertions(+), 138 deletions(-)

diff --git a/FunctionSpace/QuadEdgeBasis.cpp b/FunctionSpace/QuadEdgeBasis.cpp
index 5fb906d080..c4dc7d4929 100644
--- a/FunctionSpace/QuadEdgeBasis.cpp
+++ b/FunctionSpace/QuadEdgeBasis.cpp
@@ -4,17 +4,16 @@
 
 using namespace std;
 
-QuadEdgeBasis::QuadEdgeBasis(unsigned int order){
-  /*
+QuadEdgeBasis::QuadEdgeBasis(size_t order){
   // Reference Space //
   refSpace  = new QuadReferenceSpace;
   nRefSpace = refSpace->getNReferenceSpace();
 
-  const vector<const vector<const vector<unsigned int>*>*>&
-    edgeV = refSpace->getAllEdge();
+  const vector<vector<vector<size_t> > >&
+    edgeIdx = refSpace->getEdgeNodeIndex();
 
-  const vector<const vector<const vector<unsigned int>*>*>&
-    faceV = refSpace->getAllFace();
+  const vector<vector<vector<size_t> > >&
+    faceIdx = refSpace->getFaceNodeIndex();
 
   // Set Basis Type //
   this->order = order;
@@ -29,7 +28,7 @@ QuadEdgeBasis::QuadEdgeBasis(unsigned int order){
   nFunction = nVertex + nEdge + nFace + nCell;
 
   // Legendre Polynomial //
-  const unsigned int orderPlus = order + 1;
+  const size_t orderPlus = order + 1;
 
   Polynomial* legendre    = new Polynomial[orderPlus];
   Polynomial* intLegendre = new Polynomial[orderPlus];
@@ -71,23 +70,23 @@ QuadEdgeBasis::QuadEdgeBasis(unsigned int order){
   // Basis //
   basis = new vector<Polynomial>**[nRefSpace];
 
-  for(unsigned int s = 0; s < nRefSpace; s++)
+  for(size_t s = 0; s < nRefSpace; s++)
     basis[s] = new vector<Polynomial>*[nFunction];
 
   // Edge Based //
-  for(unsigned int s = 0; s < nRefSpace; s++){
-    unsigned int i = 0;
+  for(size_t s = 0; s < nRefSpace; s++){
+    size_t i = 0;
 
-    for(unsigned int e = 0; e < 4; e++){
-      for(unsigned int l = 0; l < orderPlus; l++){
+    for(size_t e = 0; e < 4; e++){
+      for(size_t l = 0; l < orderPlus; l++){
         // Nedelec
         if(l == 0){
-          Polynomial lambda = (lagrange[(*(*edgeV[s])[e])[0]] +
-                               lagrange[(*(*edgeV[s])[e])[1]]) * 0.5;
+          Polynomial lambda = (lagrange[edgeIdx[s][e][0]] +
+                               lagrange[edgeIdx[s][e][1]]) * 0.5;
 
           basis[s][i] =
-            new vector<Polynomial>((lifting[(*(*edgeV[s])[e])[1]] -
-                                    lifting[(*(*edgeV[s])[e])[0]]).gradient());
+            new vector<Polynomial>((lifting[edgeIdx[s][e][1]] -
+                                    lifting[edgeIdx[s][e][0]]).gradient());
 
           basis[s][i]->at(0).mul(lambda);
           basis[s][i]->at(1).mul(lambda);
@@ -98,11 +97,11 @@ QuadEdgeBasis::QuadEdgeBasis(unsigned int order){
         else{
           basis[s][i] =
             new vector<Polynomial>
-            ((intLegendre[l].compose(lifting[(*(*edgeV[s])[e])[1]] -
-                                     lifting[(*(*edgeV[s])[e])[0]])
+            ((intLegendre[l].compose(lifting[edgeIdx[s][e][1]] -
+                                     lifting[edgeIdx[s][e][0]])
               *
-              (lagrange[(*(*edgeV[s])[e])[0]] +
-               lagrange[(*(*edgeV[s])[e])[1]])).gradient());
+              (lagrange[edgeIdx[s][e][0]] +
+               lagrange[edgeIdx[s][e][1]])).gradient());
         }
 
         i++;
@@ -112,37 +111,37 @@ QuadEdgeBasis::QuadEdgeBasis(unsigned int order){
 
   // Face Based //
 
-  // NB: We use (*(*faceV[s])[f])[]
+  // NB: We use (*(*faceIdx[s])[f])[]
   //     where f = 0, because triangles
   //     have only ONE face: the face '0'
 
-  for(unsigned int s = 0; s < nRefSpace; s++){
-    unsigned int i = nEdge;
+  for(size_t s = 0; s < nRefSpace; s++){
+    size_t i = nEdge;
 
     // Type 1
-    for(unsigned int l1 = 1; l1 < orderPlus; l1++){
-      for(unsigned int l2 = 1; l2 < orderPlus; l2++){
+    for(size_t l1 = 1; l1 < orderPlus; l1++){
+      for(size_t l2 = 1; l2 < orderPlus; l2++){
         basis[s][i] =
           new vector<Polynomial>
-          ((intLegendre[l1].compose(lifting[(*(*faceV[s])[0])[0]] -
-                                    lifting[(*(*faceV[s])[0])[1]])
+          ((intLegendre[l1].compose(lifting[faceIdx[s][0][0]] -
+                                    lifting[faceIdx[s][0][1]])
             *
 
-            intLegendre[l2].compose(lifting[(*(*faceV[s])[0])[0]] -
-                                    lifting[(*(*faceV[s])[0])[3]])).gradient());
+            intLegendre[l2].compose(lifting[faceIdx[s][0][0]] -
+                                    lifting[faceIdx[s][0][3]])).gradient());
 
         i++;
       }
     }
 
     // Type 2
-    for(unsigned int l1 = 1; l1 < orderPlus; l1++){
-      for(unsigned int l2 = 1; l2 < orderPlus; l2++){
-        Polynomial pOne = lifting[(*(*faceV[s])[0])[0]] -
-                          lifting[(*(*faceV[s])[0])[1]];
+    for(size_t l1 = 1; l1 < orderPlus; l1++){
+      for(size_t l2 = 1; l2 < orderPlus; l2++){
+        Polynomial pOne = lifting[faceIdx[s][0][0]] -
+                          lifting[faceIdx[s][0][1]];
 
-        Polynomial pTwo = lifting[(*(*faceV[s])[0])[0]] -
-                          lifting[(*(*faceV[s])[0])[3]];
+        Polynomial pTwo = lifting[faceIdx[s][0][0]] -
+                          lifting[faceIdx[s][0][3]];
 
         Polynomial lOne =    legendre[l1].compose(pOne) *
                           intLegendre[l2].compose(pTwo);
@@ -172,15 +171,15 @@ QuadEdgeBasis::QuadEdgeBasis(unsigned int order){
     }
 
     // Type 3.1
-    for(unsigned int l1 = 1; l1 < orderPlus; l1++){
+    for(size_t l1 = 1; l1 < orderPlus; l1++){
       Polynomial tmp =
-        intLegendre[l1].compose(lifting[(*(*faceV[s])[0])[0]] -
-                                lifting[(*(*faceV[s])[0])[3]]);
+        intLegendre[l1].compose(lifting[faceIdx[s][0][0]] -
+                                lifting[faceIdx[s][0][3]]);
 
 
       basis[s][i] =
-        new vector<Polynomial>((lifting[(*(*faceV[s])[0])[0]] -
-                                lifting[(*(*faceV[s])[0])[1]]).gradient());
+        new vector<Polynomial>((lifting[faceIdx[s][0][0]] -
+                                lifting[faceIdx[s][0][1]]).gradient());
 
       basis[s][i]->at(0).mul(tmp);
       basis[s][i]->at(1).mul(tmp);
@@ -190,15 +189,15 @@ QuadEdgeBasis::QuadEdgeBasis(unsigned int order){
     }
 
     // Type 3.2
-    for(unsigned int l1 = 1; l1 < orderPlus; l1++){
+    for(size_t l1 = 1; l1 < orderPlus; l1++){
       Polynomial tmp =
-        intLegendre[l1].compose(lifting[(*(*faceV[s])[0])[0]] -
-                                lifting[(*(*faceV[s])[0])[1]]);
+        intLegendre[l1].compose(lifting[faceIdx[s][0][0]] -
+                                lifting[faceIdx[s][0][1]]);
 
 
       basis[s][i] =
-        new vector<Polynomial>((lifting[(*(*faceV[s])[0])[0]] -
-                                lifting[(*(*faceV[s])[0])[3]]).gradient());
+        new vector<Polynomial>((lifting[faceIdx[s][0][0]] -
+                                lifting[faceIdx[s][0][3]]).gradient());
 
       basis[s][i]->at(0).mul(tmp);
       basis[s][i]->at(1).mul(tmp);
@@ -221,8 +220,8 @@ QuadEdgeBasis::QuadEdgeBasis(unsigned int order){
   Polynomial  mapY(Polynomial(0.5, 0, 1, 0) +
                    Polynomial(0.5, 0, 0, 0));
 
-  for(unsigned int s = 0; s < nRefSpace; s++){
-    for(unsigned int i = 0; i < nFunction; i++){
+  for(size_t s = 0; s < nRefSpace; s++){
+    for(size_t i = 0; i < nFunction; i++){
       vector<Polynomial>* old;
       vector<Polynomial>  nxt(3);
 
@@ -239,22 +238,19 @@ QuadEdgeBasis::QuadEdgeBasis(unsigned int order){
   // Free Temporary Sapce //
   delete[] legendre;
   delete[] intLegendre;
-  */
 }
 
 QuadEdgeBasis::~QuadEdgeBasis(void){
-  /*
   // ReferenceSpace //
   delete refSpace;
 
   // Basis //
-  for(unsigned int i = 0; i < nRefSpace; i++){
-    for(unsigned int j = 0; j < nFunction; j++)
+  for(size_t i = 0; i < nRefSpace; i++){
+    for(size_t j = 0; j < nFunction; j++)
       delete basis[i][j];
 
     delete[] basis[i];
   }
 
   delete[] basis;
-  */
 }
diff --git a/FunctionSpace/QuadEdgeBasis.h b/FunctionSpace/QuadEdgeBasis.h
index 45b5060176..95d6edb66d 100644
--- a/FunctionSpace/QuadEdgeBasis.h
+++ b/FunctionSpace/QuadEdgeBasis.h
@@ -24,7 +24,7 @@ class QuadEdgeBasis: public BasisHierarchical1From{
   //! @param order The order of the Basis
   //!
   //! Returns a new Edge-Basis for Quads of the given order
-  QuadEdgeBasis(unsigned int order);
+  QuadEdgeBasis(size_t order);
 
   //! Deletes this Basis
   //!
diff --git a/FunctionSpace/QuadNedelecBasis.cpp b/FunctionSpace/QuadNedelecBasis.cpp
index 42eda0550c..a91c2e4de1 100644
--- a/FunctionSpace/QuadNedelecBasis.cpp
+++ b/FunctionSpace/QuadNedelecBasis.cpp
@@ -5,13 +5,12 @@
 using namespace std;
 
 QuadNedelecBasis::QuadNedelecBasis(void){
-  /*
   // Reference Space //
   refSpace  = new QuadReferenceSpace;
   nRefSpace = refSpace->getNReferenceSpace();
 
-  const vector<const vector<const vector<unsigned int>*>*>&
-    edgeV = refSpace->getAllEdge();
+  const vector<vector<vector<size_t> > >&
+    edgeIdx = refSpace->getEdgeNodeIndex();
 
   // Set Basis Type //
   order = 0;
@@ -59,19 +58,19 @@ QuadNedelecBasis::QuadNedelecBasis(void){
   // Basis //
   basis = new vector<Polynomial>**[nRefSpace];
 
-  for(unsigned int s = 0; s < nRefSpace; s++)
+  for(size_t s = 0; s < nRefSpace; s++)
     basis[s] = new vector<Polynomial>*[nFunction];
 
   // Edge Based (Nedelec) //
-  for(unsigned int s = 0; s < nRefSpace; s++){
-    for(unsigned int e = 0; e < 4; e++){
+  for(size_t s = 0; s < nRefSpace; s++){
+    for(size_t e = 0; e < 4; e++){
 
-      Polynomial lambda = (lagrange[(*(*edgeV[s])[e])[0]] +
-                           lagrange[(*(*edgeV[s])[e])[1]]) * 0.5;
+      Polynomial lambda = (lagrange[edgeIdx[s][e][0]] +
+                           lagrange[edgeIdx[s][e][1]]) * 0.5;
 
       basis[s][e] =
-        new vector<Polynomial>((lifting[(*(*edgeV[s])[e])[1]] -
-                                lifting[(*(*edgeV[s])[e])[0]]).gradient());
+        new vector<Polynomial>((lifting[edgeIdx[s][e][1]] -
+                                lifting[edgeIdx[s][e][0]]).gradient());
 
       basis[s][e]->at(0).mul(lambda);
       basis[s][e]->at(1).mul(lambda);
@@ -92,8 +91,8 @@ QuadNedelecBasis::QuadNedelecBasis(void){
   Polynomial  mapY(Polynomial(0.5, 0, 1, 0) +
                    Polynomial(0.5, 0, 0, 0));
 
-  for(unsigned int s = 0; s < nRefSpace; s++){
-    for(unsigned int i = 0; i < nFunction; i++){
+  for(size_t s = 0; s < nRefSpace; s++){
+    for(size_t i = 0; i < nFunction; i++){
       vector<Polynomial>* old;
       vector<Polynomial>  nxt(3);
 
@@ -106,22 +105,19 @@ QuadNedelecBasis::QuadNedelecBasis(void){
       delete old;
     }
   }
-  */
 }
 
 QuadNedelecBasis::~QuadNedelecBasis(void){
-  /*
   // ReferenceSpace //
   delete refSpace;
 
   // Basis //
-  for(unsigned int i = 0; i < nRefSpace; i++){
-    for(unsigned int j = 0; j < nFunction; j++)
+  for(size_t i = 0; i < nRefSpace; i++){
+    for(size_t j = 0; j < nFunction; j++)
       delete basis[i][j];
 
     delete[] basis[i];
   }
 
   delete[] basis;
-  */
 }
diff --git a/FunctionSpace/TetEdgeBasis.cpp b/FunctionSpace/TetEdgeBasis.cpp
index 92bb3e6649..5d3fd21a79 100644
--- a/FunctionSpace/TetEdgeBasis.cpp
+++ b/FunctionSpace/TetEdgeBasis.cpp
@@ -4,17 +4,16 @@
 
 using namespace std;
 
-TetEdgeBasis::TetEdgeBasis(unsigned int order){
-  /*
+TetEdgeBasis::TetEdgeBasis(size_t order){
   // Reference Space //
   refSpace  = new TetReferenceSpace;
   nRefSpace = refSpace->getNReferenceSpace();
 
-  const vector<const vector<const vector<unsigned int>*>*>&
-    edgeV = refSpace->getAllEdge();
+  const vector<vector<vector<size_t> > >&
+    edgeIdx = refSpace->getEdgeNodeIndex();
 
-  const vector<const vector<const vector<unsigned int>*>*>&
-    faceV = refSpace->getAllFace();
+  const vector<vector<vector<size_t> > >&
+    faceIdx = refSpace->getFaceNodeIndex();
 
   // Set Basis Type //
   this->order = order;
@@ -61,27 +60,27 @@ TetEdgeBasis::TetEdgeBasis(unsigned int order){
   // Basis //
   basis = new vector<Polynomial>**[nRefSpace];
 
-  for(unsigned int s = 0; s < nRefSpace; s++)
+  for(size_t s = 0; s < nRefSpace; s++)
     basis[s] = new vector<Polynomial>*[nFunction];
 
   // Edge Based //
-  for(unsigned int s = 0; s < nRefSpace; s++){
-    unsigned int i = 0;
+  for(size_t s = 0; s < nRefSpace; s++){
+    size_t i = 0;
 
     for(int e = 0; e < 6; e++){
       for(int l = 0; l < orderPlus; l++){
         // Nedelec
         if(l == 0){
-          vector<Polynomial> tmp1 = lagrange[(*(*edgeV[s])[e])[1]].gradient();
-          vector<Polynomial> tmp2 = lagrange[(*(*edgeV[s])[e])[0]].gradient();
+          vector<Polynomial> tmp1 = lagrange[edgeIdx[s][e][1]].gradient();
+          vector<Polynomial> tmp2 = lagrange[edgeIdx[s][e][0]].gradient();
 
-          tmp1[0].mul(lagrange[(*(*edgeV[s])[e])[0]]);
-          tmp1[1].mul(lagrange[(*(*edgeV[s])[e])[0]]);
-          tmp1[2].mul(lagrange[(*(*edgeV[s])[e])[0]]);
+          tmp1[0].mul(lagrange[edgeIdx[s][e][0]]);
+          tmp1[1].mul(lagrange[edgeIdx[s][e][0]]);
+          tmp1[2].mul(lagrange[edgeIdx[s][e][0]]);
 
-          tmp2[0].mul(lagrange[(*(*edgeV[s])[e])[1]]);
-          tmp2[1].mul(lagrange[(*(*edgeV[s])[e])[1]]);
-          tmp2[2].mul(lagrange[(*(*edgeV[s])[e])[1]]);
+          tmp2[0].mul(lagrange[edgeIdx[s][e][1]]);
+          tmp2[1].mul(lagrange[edgeIdx[s][e][1]]);
+          tmp2[2].mul(lagrange[edgeIdx[s][e][1]]);
 
           tmp2[0].sub(tmp1[0]);
           tmp2[1].sub(tmp1[1]);
@@ -94,11 +93,11 @@ TetEdgeBasis::TetEdgeBasis(unsigned int order){
         else{
           basis[s][i] =
             new vector<Polynomial>
-            ((intLegendre[l].compose(lagrange[(*(*edgeV[s])[e])[0]] -
-                                     lagrange[(*(*edgeV[s])[e])[1]]
+            ((intLegendre[l].compose(lagrange[edgeIdx[s][e][0]] -
+                                     lagrange[edgeIdx[s][e][1]]
                                      ,
-                                     lagrange[(*(*edgeV[s])[e])[0]] +
-                                     lagrange[(*(*edgeV[s])[e])[1]])).gradient());
+                                     lagrange[edgeIdx[s][e][0]] +
+                                     lagrange[edgeIdx[s][e][1]])).gradient());
         }
         i++;
       }
@@ -108,27 +107,27 @@ TetEdgeBasis::TetEdgeBasis(unsigned int order){
   // Face Based //
   // TO CHECK: Are Triangles face matching tets ?
 
-  for(unsigned int s = 0; s < nRefSpace; s++){
-    unsigned int i = nEdge;
+  for(size_t s = 0; s < nRefSpace; s++){
+    size_t i = nEdge;
 
     for(int f = 0; f < 4; f++){
-      for(unsigned int l1 = 1; l1 < order; l1++){
+      for(size_t l1 = 1; l1 < order; l1++){
         for(int l2 = 0; l2 + (int)l1 - 1 < orderMinus; l2++){
           // Preliminary Type 1
           Polynomial sum =
-            lagrange[(*(*faceV[s])[f])[0]] +
-            lagrange[(*(*faceV[s])[f])[1]] +
-            lagrange[(*(*faceV[s])[f])[2]];
+            lagrange[faceIdx[s][f][0]] +
+            lagrange[faceIdx[s][f][1]] +
+            lagrange[faceIdx[s][f][2]];
 
           Polynomial u =
-            intLegendre[l1].compose(lagrange[(*(*faceV[s])[f])[0]] -
-                                    lagrange[(*(*faceV[s])[f])[1]]
+            intLegendre[l1].compose(lagrange[faceIdx[s][f][0]] -
+                                    lagrange[faceIdx[s][f][1]]
                                     ,
-                                    lagrange[(*(*faceV[s])[f])[0]] +
-                                    lagrange[(*(*faceV[s])[f])[1]]);
+                                    lagrange[faceIdx[s][f][0]] +
+                                    lagrange[faceIdx[s][f][1]]);
           Polynomial v =
-            lagrange[(*(*faceV[s])[f])[2]] *
-            sclLegendre[l2].compose(lagrange[(*(*faceV[s])[f])[2]] * 2 - sum, sum);
+            lagrange[faceIdx[s][f][2]] *
+            sclLegendre[l2].compose(lagrange[faceIdx[s][f][2]] * 2 - sum, sum);
 
           // Preliminary Type 2
           vector<Polynomial> gradU = u.gradient();
@@ -150,18 +149,18 @@ TetEdgeBasis::TetEdgeBasis(unsigned int order){
           subGradUV[2].sub(uGradV[2]);
 
           // Preliminary Type 3
-          vector<Polynomial> gradL1 = lagrange[(*(*faceV[s])[f])[0]].gradient();
-          vector<Polynomial> gradL2 = lagrange[(*(*faceV[s])[f])[1]].gradient();
+          vector<Polynomial> gradL1 = lagrange[faceIdx[s][f][0]].gradient();
+          vector<Polynomial> gradL2 = lagrange[faceIdx[s][f][1]].gradient();
 
           vector<Polynomial> l2GradL1(gradL1);
-          l2GradL1[0].mul(lagrange[(*(*faceV[s])[f])[1]]);
-          l2GradL1[1].mul(lagrange[(*(*faceV[s])[f])[1]]);
-          l2GradL1[2].mul(lagrange[(*(*faceV[s])[f])[1]]);
+          l2GradL1[0].mul(lagrange[faceIdx[s][f][1]]);
+          l2GradL1[1].mul(lagrange[faceIdx[s][f][1]]);
+          l2GradL1[2].mul(lagrange[faceIdx[s][f][1]]);
 
           vector<Polynomial> l1GradL2(gradL2);
-          l1GradL2[0].mul(lagrange[(*(*faceV[s])[f])[0]]);
-          l1GradL2[1].mul(lagrange[(*(*faceV[s])[f])[0]]);
-          l1GradL2[2].mul(lagrange[(*(*faceV[s])[f])[0]]);
+          l1GradL2[0].mul(lagrange[faceIdx[s][f][0]]);
+          l1GradL2[1].mul(lagrange[faceIdx[s][f][0]]);
+          l1GradL2[2].mul(lagrange[faceIdx[s][f][0]]);
 
           vector<Polynomial> subGradL1L2V(l2GradL1);
           subGradL1L2V[0].sub(l1GradL2[0]);
@@ -200,8 +199,8 @@ TetEdgeBasis::TetEdgeBasis(unsigned int order){
   // Cell Based //
   const Polynomial one(1, 0, 0, 0);
 
-  for(unsigned int s = 0; s < nRefSpace; s++){
-    unsigned int i = nEdge + nFace;
+  for(size_t s = 0; s < nRefSpace; s++){
+    size_t i = nEdge + nFace;
 
     for(int l1 = 1; l1 < orderMinus; l1++){
       for(int l2 = 0; l2 + l1 - 1 <  orderMinusTwo; l2++){
@@ -322,22 +321,19 @@ TetEdgeBasis::TetEdgeBasis(unsigned int order){
   delete[] legendre;
   delete[] sclLegendre;
   delete[] intLegendre;
-  */
 }
 
 TetEdgeBasis::~TetEdgeBasis(void){
-  /*
   // ReferenceSpace //
   delete refSpace;
 
   // Basis //
-  for(unsigned int i = 0; i < nRefSpace; i++){
-    for(unsigned int j = 0; j < nFunction; j++)
+  for(size_t i = 0; i < nRefSpace; i++){
+    for(size_t j = 0; j < nFunction; j++)
       delete basis[i][j];
 
     delete[] basis[i];
   }
 
   delete[] basis;
-  */
 }
diff --git a/FunctionSpace/TetEdgeBasis.h b/FunctionSpace/TetEdgeBasis.h
index 61e4f982d2..d8e7856fd4 100644
--- a/FunctionSpace/TetEdgeBasis.h
+++ b/FunctionSpace/TetEdgeBasis.h
@@ -20,7 +20,7 @@ class TetEdgeBasis: public BasisHierarchical1From{
   //! @param order The order of the Basis
   //!
   //! Returns a new Edge-Basis for Tetrahedra of the given order
-  TetEdgeBasis(unsigned int order);
+  TetEdgeBasis(size_t order);
 
   //! Deletes this Basis
   //!
diff --git a/FunctionSpace/TetNedelecBasis.cpp b/FunctionSpace/TetNedelecBasis.cpp
index c803758152..2b06274cb9 100644
--- a/FunctionSpace/TetNedelecBasis.cpp
+++ b/FunctionSpace/TetNedelecBasis.cpp
@@ -4,13 +4,12 @@
 using namespace std;
 
 TetNedelecBasis::TetNedelecBasis(void){
-  /*
   // Reference Space //
   refSpace  = new TetReferenceSpace;
   nRefSpace = refSpace->getNReferenceSpace();
 
-  const vector<const vector<const vector<unsigned int>*>*>&
-    edgeV = refSpace->getAllEdge();
+  const vector<vector<vector<size_t> > >&
+    edgeIdx = refSpace->getEdgeNodeIndex();
 
   // Set Basis Type //
   this->order = 0;
@@ -43,22 +42,22 @@ TetNedelecBasis::TetNedelecBasis(void){
   // Basis //
   basis = new vector<Polynomial>**[nRefSpace];
 
-  for(unsigned int s = 0; s < nRefSpace; s++)
+  for(size_t s = 0; s < nRefSpace; s++)
     basis[s] = new vector<Polynomial>*[nFunction];
 
   // Edge Based (Nedelec) //
-  for(unsigned int s = 0; s < nRefSpace; s++){
-    for(unsigned int e = 0; e < 6; e++){
-      vector<Polynomial> tmp1 = lagrange[(*(*edgeV[s])[e])[1]].gradient();
-      vector<Polynomial> tmp2 = lagrange[(*(*edgeV[s])[e])[0]].gradient();
+  for(size_t s = 0; s < nRefSpace; s++){
+    for(size_t e = 0; e < 6; e++){
+      vector<Polynomial> tmp1 = lagrange[edgeIdx[s][e][1]].gradient();
+      vector<Polynomial> tmp2 = lagrange[edgeIdx[s][e][0]].gradient();
 
-      tmp1[0].mul(lagrange[(*(*edgeV[s])[e])[0]]);
-      tmp1[1].mul(lagrange[(*(*edgeV[s])[e])[0]]);
-      tmp1[2].mul(lagrange[(*(*edgeV[s])[e])[0]]);
+      tmp1[0].mul(lagrange[edgeIdx[s][e][0]]);
+      tmp1[1].mul(lagrange[edgeIdx[s][e][0]]);
+      tmp1[2].mul(lagrange[edgeIdx[s][e][0]]);
 
-      tmp2[0].mul(lagrange[(*(*edgeV[s])[e])[1]]);
-      tmp2[1].mul(lagrange[(*(*edgeV[s])[e])[1]]);
-      tmp2[2].mul(lagrange[(*(*edgeV[s])[e])[1]]);
+      tmp2[0].mul(lagrange[edgeIdx[s][e][1]]);
+      tmp2[1].mul(lagrange[edgeIdx[s][e][1]]);
+      tmp2[2].mul(lagrange[edgeIdx[s][e][1]]);
 
       tmp2[0].sub(tmp1[0]);
       tmp2[1].sub(tmp1[1]);
@@ -67,22 +66,19 @@ TetNedelecBasis::TetNedelecBasis(void){
       basis[s][e] = new vector<Polynomial>(tmp2);
     }
   }
-  */
 }
 
 TetNedelecBasis::~TetNedelecBasis(void){
-  /*
   // ReferenceSpace //
   delete refSpace;
 
   // Basis //
-  for(unsigned int i = 0; i < nRefSpace; i++){
-    for(unsigned int j = 0; j < nFunction; j++)
+  for(size_t i = 0; i < nRefSpace; i++){
+    for(size_t j = 0; j < nFunction; j++)
       delete basis[i][j];
 
     delete[] basis[i];
   }
 
   delete[] basis;
-  */
 }
-- 
GitLab