From aead963103198be8e42751bd75dd7f5f2e0a946d Mon Sep 17 00:00:00 2001
From: Nicolas Marsic <nicolas.marsic@gmail.com>
Date: Tue, 8 Jan 2013 16:45:35 +0000
Subject: [PATCH] TetEdgeBasis: Seems OK now -- YEAAAAHHH \o/ -- Functions were
 good but with bad number

---
 FunctionSpace/TetEdgeBasis.cpp | 216 +++++++++++++++++++++++----------
 1 file changed, 149 insertions(+), 67 deletions(-)

diff --git a/FunctionSpace/TetEdgeBasis.cpp b/FunctionSpace/TetEdgeBasis.cpp
index 053641bc47..176ddef8d1 100644
--- a/FunctionSpace/TetEdgeBasis.cpp
+++ b/FunctionSpace/TetEdgeBasis.cpp
@@ -62,7 +62,7 @@ TetEdgeBasis::TetEdgeBasis(unsigned int order){
 
   for(unsigned int s = 0; s < nRefSpace; s++)
     (*basis)[s] = new vector<const vector<Polynomial>*>(nFunction);
-  
+    
   // Edge Based (Nedelec) //
   for(unsigned int s = 0; s < nRefSpace; s++){
     for(int e = 0; e < 6; e++){
@@ -102,97 +102,152 @@ TetEdgeBasis::TetEdgeBasis(unsigned int order){
       }
     }
   }
+  
+  // Face Based (Preliminary) //
+  unsigned int faceOffset = 0;
+
+  // Sum
+  Polynomial** sum;
+  sum = new Polynomial*[nRefSpace];
+  
+  for(unsigned int s = 0; s < nRefSpace; s++){
+    sum[s] = new Polynomial[4];
+    
+    for(unsigned int f = 0; f < 4; f++)
+      sum[s][f] = 
+	lagrange[(*(*faceV[s])[f])[0]] +
+	lagrange[(*(*faceV[s])[f])[1]] +
+	lagrange[(*(*faceV[s])[f])[2]];
+  }
+
+  // Polynomial u
+  Polynomial*** u;
+  u = new Polynomial**[nRefSpace];
+  
+  for(unsigned int s = 0; s < nRefSpace; s++){
+    u[s] = new Polynomial*[orderPlus];
+    
+    for(int l = 0; l < orderPlus; l++){
+      u[s][l] = new Polynomial[4];
+      
+      for(unsigned int f = 0; f < 4; f++)
+	u[s][l][f] = 
+	  intLegendre[l].compose(lagrange[(*(*faceV[s])[f])[0]] - 
+				  lagrange[(*(*faceV[s])[f])[1]]
+				  ,
+				  lagrange[(*(*faceV[s])[f])[0]] + 
+				  lagrange[(*(*faceV[s])[f])[1]]);
+    }
+  }
+  
+  // Polynomial v
+  Polynomial*** v;
+  v = new Polynomial**[nRefSpace];
+  
+  for(unsigned int s = 0; s < nRefSpace; s++){
+    v[s] = new Polynomial*[orderMinus];
     
-  // Face Based //
+    for(int l = 0; l < orderMinus; l++){
+      v[s][l] = new Polynomial[4];
+      
+      for(unsigned int f = 0; f < 4; f++)
+	v[s][l][f] = 
+	    lagrange[(*(*faceV[s])[f])[2]] * 
+	    sclLegendre[l].compose
+	  (lagrange[(*(*faceV[s])[f])[2]] * 2 - sum[s][f], sum[s][f]);
+    }
+  }
+
+  // Face Based (Type 1) // 
   for(unsigned int s = 0; s < nRefSpace; s++){
     unsigned int i = nEdge;
 
     for(unsigned int l1 = 1; l1 < order; l1++){
       for(int l2 = 0; l2 + (int)l1 - 1 < orderMinus; l2++){
 	for(int f = 0; f < 4; f++){
-	  // Preliminary Type 1
-	  Polynomial sum = 
-	    lagrange[(*(*faceV[s])[f])[0]] +
-	    lagrange[(*(*faceV[s])[f])[1]] +
-	    lagrange[(*(*faceV[s])[f])[2]];	  
 	  
-	  Polynomial u = 
-	    intLegendre[l1].compose(lagrange[(*(*faceV[s])[f])[0]] - 
-				    lagrange[(*(*faceV[s])[f])[1]]
-				    ,
-				    lagrange[(*(*faceV[s])[f])[0]] + 
-				    lagrange[(*(*faceV[s])[f])[1]]);
-	  Polynomial v = 
-	    lagrange[(*(*faceV[s])[f])[2]] * 
-	    sclLegendre[l2].compose(lagrange[(*(*faceV[s])[f])[2]] * 2 - sum, sum);
+	  (*(*basis)[s])[i] = 
+	    new vector<Polynomial>((u[s][l1][f] * v[s][l2][f]).gradient());
 	  
-	  // Preliminary Type 2
-	  vector<Polynomial> gradU = u.gradient();
-	  vector<Polynomial> gradV = v.gradient();
+	  i++;
+	  
+	  if(s == 0)
+	    faceOffset++;
+	}
+      }
+    }
+  }
+
+  // Face Based (Type 2) //
+  for(unsigned int s = 0; s < nRefSpace; s++){
+    unsigned int i = nEdge + faceOffset;
+
+    for(unsigned int l1 = 1; l1 < order; l1++){
+      for(int l2 = 0; l2 + (int)l1 - 1 < orderMinus; l2++){
+	for(int f = 0; f < 4; f++){	  
+	  vector<Polynomial> gradU = u[s][l1][f].gradient();
+	  vector<Polynomial> gradV = v[s][l2][f].gradient();
 
 	  vector<Polynomial> vGradU(gradU);
-	  vGradU[0].mul(v);
-	  vGradU[1].mul(v);
-	  vGradU[2].mul(v);
+	  vGradU[0].mul(v[s][l2][f]);
+	  vGradU[1].mul(v[s][l2][f]);
+	  vGradU[2].mul(v[s][l2][f]);
 
 	  vector<Polynomial> uGradV(gradV);
-	  uGradV[0].mul(u);
-	  uGradV[1].mul(u);
-	  uGradV[2].mul(u);
+	  uGradV[0].mul(u[s][l1][f]);
+	  uGradV[1].mul(u[s][l1][f]);
+	  uGradV[2].mul(u[s][l1][f]);
 
 	  vector<Polynomial> subGradUV(vGradU);
 	  subGradUV[0].sub(uGradV[0]);
 	  subGradUV[1].sub(uGradV[1]);
 	  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> 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]]);
-
-	  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]]);
-
-	  vector<Polynomial> subGradL1L2V(l2GradL1);
-	  subGradL1L2V[0].sub(l1GradL2[0]);
-	  subGradL1L2V[1].sub(l1GradL2[1]);
-	  subGradL1L2V[2].sub(l1GradL2[2]);
-
-	  subGradL1L2V[0].mul(v);
-	  subGradL1L2V[1].mul(v);
-	  subGradL1L2V[2].mul(v);
-	  
-	  
-	  // Type 1
-	  (*(*basis)[s])[i] = 
-	    new vector<Polynomial>((u * v).gradient());
-	  
-	  i++;
-	  
-	  // Type 2
 	  (*(*basis)[s])[i] =
 	    new vector<Polynomial>(subGradUV);
 
 	  i++;
-	  
-	  // Type 3
-	  if(l1 == 1){
-  	    (*(*basis)[s])[i] =
-	      new vector<Polynomial>(subGradL1L2V);
-	    
-	    i++;
-	  }
 	}
       }
     }
   }
-      
+
+  // Face Based (Type 3) //
+  for(unsigned int s = 0; s < nRefSpace; s++){
+    unsigned int i = nEdge + faceOffset * 2;
+
+    for(int l2 = 0; l2  < orderMinus; l2++){
+      for(int f = 0; f < 4; f++){
+	vector<Polynomial> gradL1 = lagrange[(*(*faceV[s])[f])[0]].gradient();
+	vector<Polynomial> gradL2 = lagrange[(*(*faceV[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]]);
+	
+	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]]);
+
+	vector<Polynomial> subGradL1L2V(l2GradL1);
+	subGradL1L2V[0].sub(l1GradL2[0]);
+	subGradL1L2V[1].sub(l1GradL2[1]);
+	subGradL1L2V[2].sub(l1GradL2[2]);
+
+	subGradL1L2V[0].mul(v[s][l2][f]);
+	subGradL1L2V[1].mul(v[s][l2][f]);
+	subGradL1L2V[2].mul(v[s][l2][f]);
+	  
+	(*(*basis)[s])[i] =
+	  new vector<Polynomial>(subGradL1L2V);
+	
+	i++;
+      }
+    }
+  }
+        
   // Cell Based //
   const Polynomial one(1, 0, 0, 0);
   
@@ -312,11 +367,38 @@ TetEdgeBasis::TetEdgeBasis(unsigned int order){
       }
     }
   }
-      
-  // Free Temporary Sapce //
+        
+  // Free Temporary Space //
+  // Legendre
   delete[] legendre;
   delete[] sclLegendre;
   delete[] intLegendre;
+
+  // Sum
+  for(unsigned int s = 0; s < nRefSpace; s++)
+    delete[] sum[s];
+  
+  delete[] sum;
+  
+  // Polynomial u
+  for(unsigned int s = 0; s < nRefSpace; s++){
+    for(int l = 0; l < orderPlus; l++)
+      delete[] u[s][l];
+
+    delete[] u[s];
+  }
+
+  delete[] u;
+
+  // Polynomial v
+  for(unsigned int s = 0; s < nRefSpace; s++){
+    for(int l = 0; l < orderMinus; l++)
+      delete[] v[s][l];
+
+    delete[] v[s];
+  }
+
+  delete[] v;
 }
 
 TetEdgeBasis::~TetEdgeBasis(void){
-- 
GitLab