From 84639941e7eafd079cbef4f230dbc8ab59dd6768 Mon Sep 17 00:00:00 2001
From: Nicolas Marsic <nicolas.marsic@gmail.com>
Date: Thu, 14 Jun 2012 15:53:23 +0000
Subject: [PATCH] LocalFunctionSpace -- The beginning

---
 FunctionSpace/CMakeLists.txt               |  4 +++
 FunctionSpace/LocalFunctionSpace.cpp       | 10 +++++++
 FunctionSpace/LocalFunctionSpace.h         | 31 ++++++++++++++++++++++
 FunctionSpace/LocalFunctionSpaceScalar.cpp | 20 ++++++++++++++
 FunctionSpace/LocalFunctionSpaceScalar.h   | 18 +++++++++++++
 FunctionSpace/LocalFunctionSpaceVector.cpp | 20 ++++++++++++++
 FunctionSpace/LocalFunctionSpaceVector.h   | 18 +++++++++++++
 7 files changed, 121 insertions(+)
 create mode 100644 FunctionSpace/LocalFunctionSpace.cpp
 create mode 100644 FunctionSpace/LocalFunctionSpace.h
 create mode 100644 FunctionSpace/LocalFunctionSpaceScalar.cpp
 create mode 100644 FunctionSpace/LocalFunctionSpaceScalar.h
 create mode 100644 FunctionSpace/LocalFunctionSpaceVector.cpp
 create mode 100644 FunctionSpace/LocalFunctionSpaceVector.h

diff --git a/FunctionSpace/CMakeLists.txt b/FunctionSpace/CMakeLists.txt
index fa18efc69d..800ad2ebd8 100644
--- a/FunctionSpace/CMakeLists.txt
+++ b/FunctionSpace/CMakeLists.txt
@@ -15,6 +15,10 @@ set(SRC
   TriNodeBasis.cpp
   TriEdgeBasis.cpp
   TriNedelecBasis.cpp
+
+  LocalFunctionSpace.cpp
+  LocalFunctionSpaceScalar.cpp
+  LocalFunctionSpaceVector.cpp
 )
 
 file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) 
diff --git a/FunctionSpace/LocalFunctionSpace.cpp b/FunctionSpace/LocalFunctionSpace.cpp
new file mode 100644
index 0000000000..8849f7e537
--- /dev/null
+++ b/FunctionSpace/LocalFunctionSpace.cpp
@@ -0,0 +1,10 @@
+#include "LocalFunctionSpace.h"
+
+LocalFunctionSpace::LocalFunctionSpace(void){
+  
+}
+
+LocalFunctionSpace::~LocalFunctionSpace(void){
+  
+}
+
diff --git a/FunctionSpace/LocalFunctionSpace.h b/FunctionSpace/LocalFunctionSpace.h
new file mode 100644
index 0000000000..374d972b4a
--- /dev/null
+++ b/FunctionSpace/LocalFunctionSpace.h
@@ -0,0 +1,31 @@
+#ifndef _LOCALFUNCTIONSPACE_H_
+#define _LOCALFUNCTIONSPACE_H_
+
+class LocalFunctionSpace{
+ protected:
+  bool scalar;
+  int  size;
+
+ public:
+  virtual ~LocalFunctionSpace(void);
+
+  bool isScalar(void) const;
+  int  getSize(void) const;
+
+ protected:
+  LocalFunctionSpace(void);
+};
+
+//////////////////////
+// Inline Functions //
+//////////////////////
+
+inline bool LocalFunctionSpace::isScalar(void) const{
+  return scalar;
+}
+
+inline int LocalFunctionSpace::getSize(void) const{
+  return size;
+}
+
+#endif
diff --git a/FunctionSpace/LocalFunctionSpaceScalar.cpp b/FunctionSpace/LocalFunctionSpaceScalar.cpp
new file mode 100644
index 0000000000..2e6598e2ff
--- /dev/null
+++ b/FunctionSpace/LocalFunctionSpaceScalar.cpp
@@ -0,0 +1,20 @@
+#include "LocalFunctionSpaceScalar.h"
+#include "BasisScalar.h"
+#include "Exception.h"
+
+LocalFunctionSpaceScalar::LocalFunctionSpaceScalar(const Basis& basis){
+  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->scalar = true;
+  this->size   = b.getSize();
+  this->basis  = &(b.getBasis());
+}
+
+LocalFunctionSpaceScalar::~LocalFunctionSpaceScalar(void){
+  // LocalFunctionSpaceScalar is *NOT* responsible
+  // for deleting 'basis'
+  // It's the Basis job
+}
diff --git a/FunctionSpace/LocalFunctionSpaceScalar.h b/FunctionSpace/LocalFunctionSpaceScalar.h
new file mode 100644
index 0000000000..04ca7adf44
--- /dev/null
+++ b/FunctionSpace/LocalFunctionSpaceScalar.h
@@ -0,0 +1,18 @@
+#ifndef _LOCALFUNCTIONSPACESCALAR_H_
+#define _LOCALFUNCTIONSPACESCALAR_H_
+
+#include <vector>
+#include "Polynomial.h"
+#include "Basis.h"
+#include "LocalFunctionSpace.h"
+
+class LocalFunctionSpaceScalar: LocalFunctionSpace{
+ protected:
+  const std::vector<Polynomial>* basis;
+
+ public:
+  LocalFunctionSpaceScalar(const Basis& basis);
+  virtual ~LocalFunctionSpaceScalar(void);
+};
+
+#endif
diff --git a/FunctionSpace/LocalFunctionSpaceVector.cpp b/FunctionSpace/LocalFunctionSpaceVector.cpp
new file mode 100644
index 0000000000..5003759ee2
--- /dev/null
+++ b/FunctionSpace/LocalFunctionSpaceVector.cpp
@@ -0,0 +1,20 @@
+#include "LocalFunctionSpaceVector.h"
+#include "BasisVector.h"
+#include "Exception.h"
+
+LocalFunctionSpaceVector::LocalFunctionSpaceVector(const Basis& basis){
+  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->scalar = false;
+  this->size   = b.getSize();
+  this->basis  = &(b.getBasis());
+}
+
+LocalFunctionSpaceVector::~LocalFunctionSpaceVector(void){
+  // LocalFunctionSpaceVector is *NOT* responsible
+  // for deleting 'basis'
+  // It's the Basis job
+}
diff --git a/FunctionSpace/LocalFunctionSpaceVector.h b/FunctionSpace/LocalFunctionSpaceVector.h
new file mode 100644
index 0000000000..1a0ebc7376
--- /dev/null
+++ b/FunctionSpace/LocalFunctionSpaceVector.h
@@ -0,0 +1,18 @@
+#ifndef _LOCALFUNCTIONSPACEVECTOR_H_
+#define _LOCALFUNCTIONSPACEVECTOR_H_
+
+#include <vector>
+#include "Polynomial.h"
+#include "Basis.h"
+#include "LocalFunctionSpace.h"
+
+class LocalFunctionSpaceVector: LocalFunctionSpace{
+ protected:
+  const std::vector<std::vector<Polynomial> >* basis;
+
+ public:
+  LocalFunctionSpaceVector(const Basis& basis);
+  virtual ~LocalFunctionSpaceVector(void);
+};
+
+#endif
-- 
GitLab