diff --git a/FunctionSpace/BasisScalar.h b/FunctionSpace/BasisScalar.h index 0673f8a1d8f696f3b663698900d65deb1c941382..74c19e667011025236f498fd23326907ff542044 100644 --- a/FunctionSpace/BasisScalar.h +++ b/FunctionSpace/BasisScalar.h @@ -25,7 +25,7 @@ class BasisScalar: public Basis{ //! @return Returns the set of @em Polynomial%s //! defining this (scalar) Basis - const std::vector<Polynomial>& getBasis(void) const; + const std::vector<Polynomial>& getFunctions(void) const; protected: //! Instantiate a new BasisScalar @@ -37,7 +37,10 @@ class BasisScalar: public Basis{ // Inline Functions // ////////////////////// -inline const std::vector<Polynomial>& BasisScalar::getBasis(void) const{ +inline +const std::vector<Polynomial>& BasisScalar:: +getFunctions(void) const{ + return *basis; } diff --git a/FunctionSpace/BasisVector.h b/FunctionSpace/BasisVector.h index 1f60d4ef697a40ebe475756b895d5b180b87b051..77329e2f9901a3ff6c64bd0e35fdfbc581dc10c5 100644 --- a/FunctionSpace/BasisVector.h +++ b/FunctionSpace/BasisVector.h @@ -25,7 +25,7 @@ class BasisVector: public Basis{ //! @return Returns the set of @em Polynomial%s //! defining this (vectorial) Basis - const std::vector<std::vector<Polynomial> >& getBasis(void) const; + const std::vector<std::vector<Polynomial> >& getFunctions(void) const; protected: //! Instantiate a new BasisVector @@ -37,7 +37,10 @@ class BasisVector: public Basis{ // Inline Functions // ////////////////////// -inline const std::vector<std::vector<Polynomial> >& BasisVector::getBasis(void) const{ +inline +const std::vector<std::vector<Polynomial> >& BasisVector:: +getFunctions(void) const{ + return *basis; } diff --git a/FunctionSpace/FunctionSpace.h b/FunctionSpace/FunctionSpace.h index 770d3730d25c32d48af0a3e9f7e2afc1d70f54dd..4b4ce0e00580e26ebd9b92e3d7495c50eefc4acf 100644 --- a/FunctionSpace/FunctionSpace.h +++ b/FunctionSpace/FunctionSpace.h @@ -40,7 +40,6 @@ class FunctionSpace{ virtual ~FunctionSpace(void); const GroupOfElement& getSupport(void) const; - const Basis& getBasis(const MElement& element) const; int getType(void) const; unsigned int getNFunctionPerVertex(const MElement& element) const; @@ -71,10 +70,6 @@ inline const GroupOfElement& FunctionSpace::getSupport(void) const{ return *goe; } -inline const Basis& FunctionSpace::getBasis(const MElement& element) const{ - return *basis; -} - inline int FunctionSpace::getType(void) const{ return type; } diff --git a/FunctionSpace/FunctionSpaceEdge.cpp b/FunctionSpace/FunctionSpaceEdge.cpp index 698822f77297eb8596f8a473749e2677dae5a48c..ee82ae870970e066a491249be4d1075c162278d6 100644 --- a/FunctionSpace/FunctionSpaceEdge.cpp +++ b/FunctionSpace/FunctionSpaceEdge.cpp @@ -15,39 +15,39 @@ FunctionSpaceEdge::FunctionSpaceEdge(const GroupOfElement& goe, FunctionSpaceEdge::~FunctionSpaceEdge(void){ } -#include <cstdio> - fullVector<double> FunctionSpaceEdge:: interpolate(const MElement& element, const std::vector<double>& coef, const fullVector<double>& xyz) const{ + // Const Cast For MElement // MElement& eelement = const_cast<MElement&>(element); - const vector<vector<Polynomial> >& fun = - static_cast<const BasisVector&>(*basis).getBasis(); + // Get Basis Functions // + const vector<vector<Polynomial> >& fun = getBasis(element).getFunctions(); + const unsigned int nFun = fun.size(); - const unsigned int nFun = fun.size(); - - fullVector<double> val(3); - + // Get Jacobian // fullMatrix<double> invJac(3, 3); eelement.getJacobian(xyz(0), xyz(1), xyz(2), invJac); invJac.invertInPlace(); + // Get First Vertex of Element // fullVector<double> origin(3); origin(0) = eelement.getVertex(0)->x(); origin(1) = eelement.getVertex(0)->y(); origin(2) = eelement.getVertex(0)->z(); + // Map XYZ to Reference Plane (UVW) // fullVector<double> uvw = Mapper::invMap(xyz, origin, invJac); - - printf("%g, %g, %g\n", uvw(0), uvw(1), uvw(2)); - - //val(0) = 1; val(1) = 1; val(2) = 0; - - + + // Interpolate (in Reference Place) // + fullVector<double> val(3); + val(0) = 0; + val(1) = 0; + val(2) = 0; + for(unsigned int i = 0; i < nFun; i++){ fullVector<double> vi = Mapper::grad(Polynomial::at(fun[i], uvw(0), uvw(1), uvw(2)), @@ -57,5 +57,6 @@ interpolate(const MElement& element, val.axpy(vi, 1); } + // Return Interpolated Value // return val; } diff --git a/FunctionSpace/FunctionSpaceNode.cpp b/FunctionSpace/FunctionSpaceNode.cpp index 3f0dd595cd9beacf14c2df0a0a5c1f7f5b838482..aadb6aabdee8b3fbba215ead11f9b3b746028734 100644 --- a/FunctionSpace/FunctionSpaceNode.cpp +++ b/FunctionSpace/FunctionSpaceNode.cpp @@ -1,5 +1,11 @@ +#include <vector> + +#include "BasisScalar.h" +#include "Mapper.h" #include "FunctionSpaceNode.h" +using namespace std; + FunctionSpaceNode::FunctionSpaceNode(const GroupOfElement& goe, int order){ // Build 0Form Basis // @@ -14,5 +20,36 @@ interpolate(const MElement& element, const std::vector<double>& coef, const fullVector<double>& xyz) const{ - return 42; + // Const Cast For MElement // + MElement& eelement = + const_cast<MElement&>(element); + + // Get Basis Functions // + const vector<Polynomial>& fun = getBasis(element).getFunctions(); + const unsigned int nFun = fun.size(); + + // Get Jacobian // + fullMatrix<double> invJac(3, 3); + eelement.getJacobian(xyz(0), xyz(1), xyz(2), invJac); + + invJac.invertInPlace(); + + // Get First Vertex of Element (Physical Space) // + fullVector<double> origin(3); + origin(0) = eelement.getVertex(0)->x(); + origin(1) = eelement.getVertex(0)->y(); + origin(2) = eelement.getVertex(0)->z(); + + // Map XYZ to Reference Plane (UVW) // + fullVector<double> uvw = Mapper::invMap(xyz, origin, invJac); + + // Interpolate (in Reference Place) // + double val = 0; + + for(unsigned int i = 0; i < nFun; i++) + val += + fun[i].at(uvw(0), uvw(1), uvw(2)) * coef[i]; + + // Return Interpolated Value // + return val; } diff --git a/FunctionSpace/FunctionSpaceScalar.h b/FunctionSpace/FunctionSpaceScalar.h index e6c942d3ee8c20d4067ee08bbc9428efec8ad6fb..7587672ed9eac6cf6e530f560f0d4a8d4c88130a 100644 --- a/FunctionSpace/FunctionSpaceScalar.h +++ b/FunctionSpace/FunctionSpaceScalar.h @@ -2,6 +2,7 @@ #define _FUNCTIONSPACESCALAR_H_ #include "fullMatrix.h" +#include "BasisScalar.h" #include "FunctionSpace.h" class FunctionSpaceScalar : public FunctionSpace{ @@ -12,6 +13,18 @@ class FunctionSpaceScalar : public FunctionSpace{ interpolate(const MElement& element, const std::vector<double>& coef, const fullVector<double>& xyz) const = 0; + + const BasisScalar& getBasis(const MElement& element) const; }; + +////////////////////// +// Inline Functions // +////////////////////// + +inline const BasisScalar& FunctionSpaceScalar:: +getBasis(const MElement& element) const{ + return static_cast<const BasisScalar&>(*basis); +} + #endif diff --git a/FunctionSpace/FunctionSpaceVector.h b/FunctionSpace/FunctionSpaceVector.h index f711ea515f825cbab9d85526a97e9a9233715d2f..b1bb914eaa38e5e16da4b0c5efbcf22883a69ecd 100644 --- a/FunctionSpace/FunctionSpaceVector.h +++ b/FunctionSpace/FunctionSpaceVector.h @@ -2,6 +2,7 @@ #define _FUNCTIONSPACEVECTOR_H_ #include "fullMatrix.h" +#include "BasisVector.h" #include "FunctionSpace.h" class FunctionSpaceVector : public FunctionSpace{ @@ -12,6 +13,18 @@ class FunctionSpaceVector : public FunctionSpace{ interpolate(const MElement& element, const std::vector<double>& coef, const fullVector<double>& xyz) const = 0; + + const BasisVector& getBasis(const MElement& element) const; }; + +////////////////////// +// Inline Functions // +////////////////////// + +inline const BasisVector& FunctionSpaceVector:: +getBasis(const MElement& element) const{ + return static_cast<const BasisVector&>(*basis); +} + #endif diff --git a/FunctionSpace/Polynomial.cpp b/FunctionSpace/Polynomial.cpp index 7d2bf67b2c811a8c972f3eaad69f30acaeda191e..1edda763e19697aaccf4cebdedc9331709790d4a 100644 --- a/FunctionSpace/Polynomial.cpp +++ b/FunctionSpace/Polynomial.cpp @@ -1,6 +1,7 @@ #include <cmath> #include <sstream> #include <stack> + #include "Polynomial.h" using namespace std;