From ba936a109e0b4afab9046419990bcfe52e4d7966 Mon Sep 17 00:00:00 2001
From: Nicolas Marsic <nicolas.marsic@gmail.com>
Date: Mon, 6 Aug 2012 15:43:08 +0000
Subject: [PATCH] Interpolation -- Node

---
 FunctionSpace/BasisTest.cpp           |  3 +-
 FunctionSpace/CMakeLists.txt          |  1 +
 FunctionSpace/FunctionSpaceNode.cpp   | 40 +++++++++++++++++++--------
 FunctionSpace/FunctionSpaceNode.h     | 14 ++++++----
 FunctionSpace/FunctionSpaceScalar.cpp |  9 ++++++
 FunctionSpace/FunctionSpaceScalar.h   | 18 ++++++++++++
 6 files changed, 66 insertions(+), 19 deletions(-)
 create mode 100644 FunctionSpace/FunctionSpaceScalar.cpp
 create mode 100644 FunctionSpace/FunctionSpaceScalar.h

diff --git a/FunctionSpace/BasisTest.cpp b/FunctionSpace/BasisTest.cpp
index a76ff1081c..24cebdb535 100644
--- a/FunctionSpace/BasisTest.cpp
+++ b/FunctionSpace/BasisTest.cpp
@@ -25,7 +25,8 @@ int ain(int argc, char** argv){
   Mesh msh(argv[1]);
 
   // Writer for .msh
-  WriterMsh writer(msh.getGroup(2).getAll());
+  WriterMsh writer;
+  writer.setDomain(msh.getGroup(2).getAll());
 
   // Plot Basis //
   HexNodeBasis b(1);
diff --git a/FunctionSpace/CMakeLists.txt b/FunctionSpace/CMakeLists.txt
index 4f0800d708..8a0101e828 100644
--- a/FunctionSpace/CMakeLists.txt
+++ b/FunctionSpace/CMakeLists.txt
@@ -22,6 +22,7 @@ set(SRC
   HexEdgeBasis.cpp
 
   FunctionSpace.cpp
+  FunctionSpaceScalar.cpp
   FunctionSpaceNode.cpp
 )
 
diff --git a/FunctionSpace/FunctionSpaceNode.cpp b/FunctionSpace/FunctionSpaceNode.cpp
index dce20c1b6d..2fa2be3b4f 100644
--- a/FunctionSpace/FunctionSpaceNode.cpp
+++ b/FunctionSpace/FunctionSpaceNode.cpp
@@ -1,12 +1,14 @@
 #include "FunctionSpaceNode.h"
 #include "Polynomial.h"
 #include "BasisScalar.h"
+#include "fullMatrix.h"
+#include "Mapper.h"
 #include "Exception.h"
 
 using namespace std;
 
 FunctionSpaceNode::FunctionSpaceNode(const GroupOfElement& goe, int order):
-FunctionSpace(goe, 0, order){
+FunctionSpaceScalar(goe, 0, order){
   // Just Call Super Constructor with basisType = 0
 }
 
@@ -14,9 +16,10 @@ FunctionSpace(goe, 0, order){
 FunctionSpaceNode::~FunctionSpaceNode(void){
 }
 
-vector<double> FunctionSpaceNode::
+void FunctionSpaceNode::
 interpolateAtNodes(const MElement& elem, 
-		   const vector<double>& coef) const{
+		   const vector<double>& coef,
+		   std::vector<double>& nodeValue) const{
   // Check
   unsigned int wS = coef.size();
   unsigned int bS = basis->getSize();
@@ -42,20 +45,33 @@ interpolateAtNodes(const MElement& elem,
   const vector<Polynomial>& fun = 
     static_cast<const BasisScalar*>(basis)->getBasis();
 
-  // Init Vector
-  vector<double> value(N);
+  // Init some stuff
+  fullMatrix<double> invJac(3, 3);
+  fullVector<double> xyz(3);
+  fullVector<double> origin(3);
+  
+  origin(0) = node[0]->x();
+  origin(1) = node[0]->y();
+  origin(2) = node[0]->z();
 
   // Interpolate
   for(unsigned int n = 0; n < N; n++){
-    const double x = node[n]->x();
-    const double y = node[n]->y();
-    const double z = node[n]->z();
+    // Map from physical to reference space 
+    xyz(0) = node[n]->x();
+    xyz(1) = node[n]->y();
+    xyz(2) = node[n]->z();
 
-    value[n] = 0;
+    element.getJacobian(xyz(0), xyz(1), xyz(2), invJac);
+    invJac.invertInPlace();
+    
+    const fullVector<double> uvw = 
+      Mapper::invMap(xyz, origin, invJac);
+
+
+    // Interpolate
+    const int id = node[n]->getNum();
 
     for(unsigned int i = 0; i < bS; i++)
-      value[n] += fun[i].at(x, y, z) * coef[i];
+      nodeValue[id] += fun[i].at(uvw(0), uvw(1), uvw(2)) * coef[i];
   }
-
-  return value;
 }
diff --git a/FunctionSpace/FunctionSpaceNode.h b/FunctionSpace/FunctionSpaceNode.h
index d63400836d..0af13f213e 100644
--- a/FunctionSpace/FunctionSpaceNode.h
+++ b/FunctionSpace/FunctionSpaceNode.h
@@ -1,15 +1,17 @@
 #ifndef _FUNCTIONSPACENODE_H_
 #define _FUNCTIONSPACENODE_H_
 
-#include "FunctionSpace.h"
+#include "FunctionSpaceScalar.h"
 
-class FunctionSpaceNode: public FunctionSpace{
+class FunctionSpaceNode: public FunctionSpaceScalar{
+ public:
   FunctionSpaceNode(const GroupOfElement& goe, int order);
-
+  
   virtual ~FunctionSpaceNode(void);
-
-  std::vector<double> interpolateAtNodes(const MElement& element, 
-					 const std::vector<double>& coef) const;
+  
+  virtual void interpolateAtNodes(const MElement& element, 
+				  const std::vector<double>& coef,
+				  std::vector<double>& nodeValue) const;
 };
 
 #endif
diff --git a/FunctionSpace/FunctionSpaceScalar.cpp b/FunctionSpace/FunctionSpaceScalar.cpp
new file mode 100644
index 0000000000..43d737cde5
--- /dev/null
+++ b/FunctionSpace/FunctionSpaceScalar.cpp
@@ -0,0 +1,9 @@
+#include "FunctionSpaceScalar.h"
+
+FunctionSpaceScalar::FunctionSpaceScalar(const GroupOfElement& goe, 
+					  int basisType, int order):
+FunctionSpace(goe, basisType, order){
+}
+
+FunctionSpaceScalar::~FunctionSpaceScalar(void){
+}
diff --git a/FunctionSpace/FunctionSpaceScalar.h b/FunctionSpace/FunctionSpaceScalar.h
new file mode 100644
index 0000000000..e8c09f65ff
--- /dev/null
+++ b/FunctionSpace/FunctionSpaceScalar.h
@@ -0,0 +1,18 @@
+#ifndef _FUNCTIONSPACESCALAR_H_
+#define _FUNCTIONSPACESCALAR_H_
+
+#include "FunctionSpace.h"
+
+class FunctionSpaceScalar: public FunctionSpace{
+ public:
+  FunctionSpaceScalar(const GroupOfElement& goe, 
+		      int basisType, int order);
+
+  virtual ~FunctionSpaceScalar(void);
+
+  virtual void interpolateAtNodes(const MElement& element, 
+				  const std::vector<double>& coef,
+				  std::vector<double>& nodeValue) const = 0;
+};
+
+#endif
-- 
GitLab