From 77955ec1da093618c03215e230d92889d8841c2d Mon Sep 17 00:00:00 2001
From: Nicolas Marsic <nicolas.marsic@gmail.com>
Date: Mon, 18 Jun 2012 15:08:06 +0000
Subject: [PATCH] 0Form Interpolation + Beginning 1Form

---
 FunctionSpace/LocalFunctionSpace.h        |  4 ----
 FunctionSpace/LocalFunctionSpace0Form.cpp | 25 ++++++++++++++++++-
 FunctionSpace/LocalFunctionSpace0Form.h   | 16 +++++++------
 FunctionSpace/LocalFunctionSpace1Form.cpp | 29 ++++++++++++++++++++++-
 FunctionSpace/LocalFunctionSpace1Form.h   |  5 +++-
 FunctionSpace/LocalFunctionSpaceScalar.h  |  2 ++
 6 files changed, 67 insertions(+), 14 deletions(-)

diff --git a/FunctionSpace/LocalFunctionSpace.h b/FunctionSpace/LocalFunctionSpace.h
index b73efff20e..852362d999 100644
--- a/FunctionSpace/LocalFunctionSpace.h
+++ b/FunctionSpace/LocalFunctionSpace.h
@@ -13,16 +13,12 @@
    with an Element.
  */
 
-#include "Jacobian.h"
-
 class LocalFunctionSpace{
  protected:
   bool      scalar;
   int       size;
   int       type;
 
-  Jacobian* jac;
-
  public:
   //! Deletes this LocalFunctionSpace
   //!
diff --git a/FunctionSpace/LocalFunctionSpace0Form.cpp b/FunctionSpace/LocalFunctionSpace0Form.cpp
index 2751c0bbbd..45bc101dc7 100644
--- a/FunctionSpace/LocalFunctionSpace0Form.cpp
+++ b/FunctionSpace/LocalFunctionSpace0Form.cpp
@@ -1,16 +1,39 @@
 #include "LocalFunctionSpace0Form.h"
-
+#include "BasisScalar.h"
+#include "fullMatrix.h"
+#include "Exception.h"
 
 LocalFunctionSpace0Form::LocalFunctionSpace0Form(const Basis& basis, 
 						 const Element& elem){
+  if(!basis.isScalar())
+    throw Exception("Can't Create a Scalar Function Space with a Vectorial Basis"); 
+
+  const BasisScalar& b = static_cast<const BasisScalar&>(basis); 
+
+  this->size  = b.getSize(); 
+  this->type  = b.getType();  
+  this->basis = &(b.getBasis());
+
+  jac = &(elem.getJacobian());
 }
 
 
 LocalFunctionSpace0Form::~LocalFunctionSpace0Form(void){
+  // LocalFunctionSpace0From is *NOT* responsible 
+  // for deleting 'basis' 
+  // It's the Basis job 
 }
 
 
 double LocalFunctionSpace0Form::interpolate(const fullVector<double>& coef, 
 					    double x, double y, double z) const{
+  double res = 0;
+
+  for(int i = 0; i < size; i++){
+    fullVector<double> uv = jac->invMap(x, y);
+
+    res += (*basis)[i].at(uv(0), uv(1), 0.0);
+  }
 
+  return res;
 }
diff --git a/FunctionSpace/LocalFunctionSpace0Form.h b/FunctionSpace/LocalFunctionSpace0Form.h
index ade9ad4f48..ed135760e8 100644
--- a/FunctionSpace/LocalFunctionSpace0Form.h
+++ b/FunctionSpace/LocalFunctionSpace0Form.h
@@ -1,6 +1,13 @@
 #ifndef _LOCALFUNCTIONSPACE0FORM_H_
 #define _LOCALFUNCTIONSPACE0FORM_H_
 
+#include <vector>
+#include "Polynomial.h"
+#include "Basis.h"
+#include "Element.h"
+#include "Jacobian.h"
+#include "LocalFunctionSpaceScalar.h"
+
 /**
    @class LocalFunctionSpace0Form
    @brief 0 Form Local Function Spaces
@@ -8,16 +15,11 @@
    A Local Function Space build on a @em 0 @em Form
  */
 
-#include <vector>
-#include "Polynomial.h"
-#include "Basis.h"
-#include "Element.h"
-#include "LocalFunctionSpaceScalar.h"
-
 class LocalFunctionSpace0Form: public LocalFunctionSpaceScalar{
  private:
   const std::vector<Polynomial>* basis;
-  
+  Jacobian* jac;  
+
  public:
   //! Instantiate a new LocalFunctionSpace0Form
   //! @param basis The Basis used to build 
diff --git a/FunctionSpace/LocalFunctionSpace1Form.cpp b/FunctionSpace/LocalFunctionSpace1Form.cpp
index 538e22304c..0dcd28c4c8 100644
--- a/FunctionSpace/LocalFunctionSpace1Form.cpp
+++ b/FunctionSpace/LocalFunctionSpace1Form.cpp
@@ -1,12 +1,29 @@
 #include "LocalFunctionSpace1Form.h"
-
+#include "BasisVector.h"
+#include "fullMatrix.h"
+#include "Exception.h"
 
 LocalFunctionSpace1Form::LocalFunctionSpace1Form(const Basis& basis, 
 						 const Element& elem){
+  
+  if(basis.isScalar()) 
+    throw Exception("Can't Create a Vector Function Space with a Scalar Basis"); 
+  
+  const BasisVector& b = static_cast<const BasisVector&>(basis); 
+
+  this->size  = b.getSize(); 
+  this->type  = b.getType();  
+  this->basis = &(b.getBasis());
+
+  jac    = &(elem.getJacobian());
+  orient = &(elem.getAllOrientations());
 }
 
 
 LocalFunctionSpace1Form::~LocalFunctionSpace1Form(void){
+  // LocalFunctionSpace1From is *NOT* responsible 
+  // for deleting 'basis' 
+  // It's the Basis job 
 }
 
 
@@ -14,4 +31,14 @@ fullVector<double> LocalFunctionSpace1Form::
 interpolate(const fullVector<double>& coef, 
 	    double x, double y, double z) const{
 
+  //double res = 0;
+  
+  for(int i = 0; i < size; i++){
+    //fullVector<double> uv = jac->invMap(x, y);
+
+    //res += (*basis)[i].at(uv(0), uv(1), 0.0);
+  }
+
+  //return res;
+
 }
diff --git a/FunctionSpace/LocalFunctionSpace1Form.h b/FunctionSpace/LocalFunctionSpace1Form.h
index df6a3a388b..be85d87a40 100644
--- a/FunctionSpace/LocalFunctionSpace1Form.h
+++ b/FunctionSpace/LocalFunctionSpace1Form.h
@@ -12,12 +12,15 @@
 #include "Polynomial.h"
 #include "Basis.h"
 #include "Element.h"
+#include "Jacobian.h"
 #include "LocalFunctionSpaceVector.h"
 
 class LocalFunctionSpace1Form: public LocalFunctionSpaceVector{
  private:
   const std::vector<std::vector<Polynomial> >* basis;
-  
+  Jacobian* jac;
+  const std::vector<int>* orient;
+
  public:
   //! Instantiate a new LocalFunctionSpace1Form
   //! @param basis The Basis used to build 
diff --git a/FunctionSpace/LocalFunctionSpaceScalar.h b/FunctionSpace/LocalFunctionSpaceScalar.h
index 4b707fac83..991e1c1134 100644
--- a/FunctionSpace/LocalFunctionSpaceScalar.h
+++ b/FunctionSpace/LocalFunctionSpaceScalar.h
@@ -1,6 +1,8 @@
 #ifndef _LOCALFUNCTIONSPACESCALAR_H_
 #define _LOCALFUNCTIONSPACESCALAR_H_
 
+#include <vector>
+#include "Polynomial.h"
 #include "LocalFunctionSpace.h"
 
 /**
-- 
GitLab