From b4ffacde8fc418172e9aadc6314e0cea1ede502e Mon Sep 17 00:00:00 2001
From: Nicolas Marsic <nicolas.marsic@gmail.com>
Date: Tue, 11 Sep 2012 13:55:47 +0000
Subject: [PATCH] Closure ...

---
 FunctionSpace/BasisScalar.h    | 17 +++++++++++
 FunctionSpace/BasisTest.cpp    |  2 +-
 FunctionSpace/TriNodeBasis.cpp | 52 +++++++++++++++++++++++-----------
 3 files changed, 54 insertions(+), 17 deletions(-)

diff --git a/FunctionSpace/BasisScalar.h b/FunctionSpace/BasisScalar.h
index 6f156f4dbe..79b32e70ad 100644
--- a/FunctionSpace/BasisScalar.h
+++ b/FunctionSpace/BasisScalar.h
@@ -21,6 +21,7 @@
 class BasisScalar: public Basis{
  protected:
   std::vector<const Polynomial*>* basis;
+  std::vector<const Polynomial*>* revBasis;
 
  public:
   //! Deletes this BasisScalar
@@ -31,6 +32,11 @@ class BasisScalar: public Basis{
   //! defining this (scalar) Basis
   const std::vector<const Polynomial*>& getFunctions(void) const;
 
+  //! @param closure A natural number
+  //! @return Returns the set of @em Polynomial%s
+  //! defining this (scalar) Basis, for the given closure
+  const std::vector<const Polynomial*>& getFunctions(unsigned int closure) const;
+
  protected:
   //! @internal
   //! Instantiates a new BasisScalar
@@ -50,4 +56,15 @@ getFunctions(void) const{
   return *basis;
 }
 
+inline
+const std::vector<const Polynomial*>& BasisScalar::
+getFunctions(unsigned int closure) const{
+  if(!closure)
+    return *basis;
+
+  else
+    return *revBasis;
+}
+
+
 #endif
diff --git a/FunctionSpace/BasisTest.cpp b/FunctionSpace/BasisTest.cpp
index 906af7f59d..dfc7031388 100644
--- a/FunctionSpace/BasisTest.cpp
+++ b/FunctionSpace/BasisTest.cpp
@@ -32,7 +32,7 @@ int basisTest(int argc, char** argv){
   writer.setDomain(goe.getAll());
 
   // Plot Basis //
-  HexEdgeBasis b(3);
+  TriNodeBasis b(3);
   
   cout << "Size: " << b.getSize() << endl;
 
diff --git a/FunctionSpace/TriNodeBasis.cpp b/FunctionSpace/TriNodeBasis.cpp
index 362bb46421..0be867a6ef 100644
--- a/FunctionSpace/TriNodeBasis.cpp
+++ b/FunctionSpace/TriNodeBasis.cpp
@@ -16,10 +16,13 @@ TriNodeBasis::TriNodeBasis(const int order){
   size    = (order + 1) * (order + 2) / 2;
 
   // Alloc Temporary Space //
-  Polynomial* legendre    = new Polynomial[order];
-  Polynomial* intLegendre = new Polynomial[order];
-  Polynomial* lagrangeSub = new Polynomial[3];
-  Polynomial* lagrangeSum = new Polynomial[3];
+  Polynomial* legendre     = new Polynomial[order];
+  Polynomial* intLegendre  = new Polynomial[order];
+
+  Polynomial  lagrangeSub[3];
+  Polynomial  lagrangeSum[3];
+  Polynomial rLagrangeSub[3];
+  Polynomial rLagrangeSum[3];
 
   // Classical and Intrated-Scaled Legendre Polynomial //
   const int orderMinus = order - 1;
@@ -28,8 +31,9 @@ TriNodeBasis::TriNodeBasis(const int order){
   Legendre::intScaled(intLegendre, order);
  
 
-  // Basis //
-  basis = new std::vector<const Polynomial*>(size);
+  // Basis (& revert) //
+     basis = new std::vector<const Polynomial*>(size);
+  revBasis = new std::vector<const Polynomial*>(size);
 
   // Vertex Based (Lagrange) // 
   (*basis)[0] = 
@@ -43,14 +47,23 @@ TriNodeBasis::TriNodeBasis(const int order){
   (*basis)[2] = 
     new Polynomial(Polynomial(1, 0, 1, 0));
 
+  // Vertex Based (revert) //
+  for(int i = 0; i < 3; i++)
+    (*revBasis)[i] = (*basis)[i];  
+
   
-  // Lagrange Sum //
-  for(int i = 0, j = 1; i < 3; i++, j = (j + 1) % 3)
-    lagrangeSum[i] = *(*basis)[i] + *(*basis)[j];
+  // Lagrange Sum (& revert) //
+  for(int i = 0, j = 1; i < 3; i++, j = (j + 1) % 3){
+     lagrangeSum[i] = *(*basis)[i] + *(*basis)[j];
+    rLagrangeSum[i] = *(*basis)[j] + *(*basis)[i];
+  }
+
 
-  // Lagrange Sub //
-  for(int i = 0, j = 1; i < 3; i++, j = (j + 1) % 3)
-    lagrangeSub[i] = *(*basis)[j] - *(*basis)[i];
+  // Lagrange Sub (& revert) //
+  for(int i = 0, j = 1; i < 3; i++, j = (j + 1) % 3){
+     lagrangeSub[i] = *(*basis)[j] - *(*basis)[i];
+    rLagrangeSub[i] = *(*basis)[i] - *(*basis)[j];
+  }
 
   
   // Edge Based //
@@ -60,7 +73,10 @@ TriNodeBasis::TriNodeBasis(const int order){
     for(int e = 0; e < 3; e++){
       (*basis)[i] = new Polynomial(
 	intLegendre[l].compose(lagrangeSub[e], lagrangeSum[e]));
-            
+
+      (*revBasis)[i] = new Polynomial(
+	intLegendre[l].compose(rLagrangeSub[e], rLagrangeSum[e]));
+      
       i++;
     }
   }
@@ -75,6 +91,7 @@ TriNodeBasis::TriNodeBasis(const int order){
 	intLegendre[l1].compose(lagrangeSub[0], lagrangeSum[0]) * 
 	legendre[l2].compose(p) * *(*basis)[2]);
       
+      (*revBasis)[i] = (*basis)[i];
       i++;
     }
   }
@@ -82,13 +99,16 @@ TriNodeBasis::TriNodeBasis(const int order){
   // Free Temporary Sapce //
   delete[] legendre;
   delete[] intLegendre;
-  delete[] lagrangeSub;
-  delete[] lagrangeSum;
 }
 
 TriNodeBasis::~TriNodeBasis(void){
-  for(int i = 0; i < size; i++)
+  for(int i = 0; i < size; i++){
     delete (*basis)[i];
+    
+    if(i >= nVertex && i < nVertex + nEdge)
+      delete (*revBasis)[i];
+  }
 
   delete basis;
+  delete revBasis;
 }
-- 
GitLab