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