diff --git a/FunctionSpace/CMakeLists.txt b/FunctionSpace/CMakeLists.txt index 800ad2ebd8e4d7522ceaabc28954b484dad852b1..5554606cc1ad432b55bb66c9cb5eb6aea65aaa4e 100644 --- a/FunctionSpace/CMakeLists.txt +++ b/FunctionSpace/CMakeLists.txt @@ -19,6 +19,8 @@ set(SRC LocalFunctionSpace.cpp LocalFunctionSpaceScalar.cpp LocalFunctionSpaceVector.cpp + LocalFunctionSpace0Form.cpp + LocalFunctionSpace1Form.cpp ) file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) diff --git a/FunctionSpace/LocalFunctionSpace.cpp b/FunctionSpace/LocalFunctionSpace.cpp index 1632674890840124b6c8c0f170cfd351b6e84ce1..556e27c78941b58bd20c6b6a00c34d4ceb2feec8 100644 --- a/FunctionSpace/LocalFunctionSpace.cpp +++ b/FunctionSpace/LocalFunctionSpace.cpp @@ -8,27 +8,3 @@ LocalFunctionSpace::LocalFunctionSpace(void){ LocalFunctionSpace::~LocalFunctionSpace(void){ } - -void LocalFunctionSpace::selectTransform(int form){ - switch(form){ - case 0: - transform = LocalFunctionSpace::form0; - break; - - case 1: - transform = LocalFunctionSpace::form1; - break; - - case 2: - throw Exception("Mapping of 2-form not implemented"); - break; - - case 3: - throw Exception("Mapping of 3-form not implemented"); - break; - - default: - throw Exception ("Unknown '%d-form'", form); - break; - } -} diff --git a/FunctionSpace/LocalFunctionSpace.h b/FunctionSpace/LocalFunctionSpace.h index ce136fa71aa18393cef884b70c65f19481e82684..b73efff20eb88052ecc755913dfd39b963a25b6d 100644 --- a/FunctionSpace/LocalFunctionSpace.h +++ b/FunctionSpace/LocalFunctionSpace.h @@ -5,30 +5,23 @@ @class LocalFunctionSpace @brief Mother class for Local Function Spaces - This class is the @em mother (by @em inheritence) of all@n + This class is the @em mother (by @em inheritence) of all Local Function Spaces.@n A Local Function Space is a Basis on which we can interpolate on.@n In order to interpolate, a Local Function Space shall colaborate - with a Jacobian. + with an Element. */ #include "Jacobian.h" class LocalFunctionSpace{ protected: - typedef fullVector<double>(Jacobian::*JacMethod) - (const fullVector<double>&) const; - bool scalar; int size; int type; Jacobian* jac; - fullVector<double> (*transform)(const Jacobian&, - double, - double, - double); public: //! Deletes this LocalFunctionSpace @@ -59,29 +52,6 @@ class LocalFunctionSpace{ //! Instantiate a new LocalFunctionSpace //! @warning Users can't instantiate a LocalFunctionSpace LocalFunctionSpace(void); - - //! Selects the right transorm method for the Jacobian - //! @param form The @em type of the Basis used - void selectTransform(int form); - - //! Mapping of 0-form - //! @param jac The Jacobian to use - //! @param u,v,w The @em reference coordinate to map - //! @return Returns The mapped coordinate in the @em physical space - static fullVector<double> form0(const Jacobian& jac, - double u, - double v, - double w); - - //! Mapping of 1-form - //! @param jac The Jacobian to use - //! @param u,v,w The @em reference coordinate to map - //! @return Returns The mapped coordinate in the @em physical space - static fullVector<double> form1(const Jacobian& jac, - double u, - double v, - double w); - }; ////////////////////// @@ -100,19 +70,4 @@ inline int LocalFunctionSpace::getType(void) const{ return type; } -inline fullVector<double> LocalFunctionSpace::form0(const Jacobian& jac, - double u, - double v, - double w){ - return jac.map(u, v); -} - -inline fullVector<double> LocalFunctionSpace::form1(const Jacobian& jac, - double u, - double v, - double w){ - return jac.grad(u, v); - //! @todo Missing Orientation !! -} - #endif diff --git a/FunctionSpace/LocalFunctionSpaceScalar.cpp b/FunctionSpace/LocalFunctionSpaceScalar.cpp index 677e5c2a3398a115ba8171cf2223bb350053ba14..3327477a89e7b42a382a14e43e5f45b95b42a264 100644 --- a/FunctionSpace/LocalFunctionSpaceScalar.cpp +++ b/FunctionSpace/LocalFunctionSpaceScalar.cpp @@ -1,46 +1,9 @@ #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->type = b.getType(); - this->basis = &(b.getBasis()); - - selectTransform(type); +LocalFunctionSpaceScalar::LocalFunctionSpaceScalar(void){ + scalar = true; } LocalFunctionSpaceScalar::~LocalFunctionSpaceScalar(void){ - // LocalFunctionSpaceScalar is *NOT* responsible - // for deleting 'basis' - // It's the Basis job -} - -double LocalFunctionSpaceScalar::interpolate -(const fullVector<double>& coef, - double x, double y, double z) const{ - - if(coef.size() > size) - throw Exception("To many coeficients for interpolation"); - - if(coef.size() < size) - throw Exception("Not enough coeficients for interpolation"); - - - fullVector<double> uvw = jac->invMap(x, y); - double res = 0; - - for(int i = 0; i < size; ++i){ - - //transform(*jac, uvw(0), uvw(1), 0); - //! @todo Interpolation rule ... - } - return res; } diff --git a/FunctionSpace/LocalFunctionSpaceScalar.h b/FunctionSpace/LocalFunctionSpaceScalar.h index d8b6a0252f3f32946252e0aa56a38fa6551ce3c9..4b707fac83ddcb9ad6ff47f9da21de6cdbc30cc0 100644 --- a/FunctionSpace/LocalFunctionSpaceScalar.h +++ b/FunctionSpace/LocalFunctionSpaceScalar.h @@ -1,9 +1,6 @@ #ifndef _LOCALFUNCTIONSPACESCALAR_H_ #define _LOCALFUNCTIONSPACESCALAR_H_ -#include <vector> -#include "Polynomial.h" -#include "Basis.h" #include "LocalFunctionSpace.h" /** @@ -13,16 +10,8 @@ A Local Function Space build on a @em Scalar Basis. */ -class LocalFunctionSpaceScalar: LocalFunctionSpace{ - protected: - const std::vector<Polynomial>* basis; - - public: - //! Instantiate a new LocalFunctionSpaceScalar - //! @param basis The Basis used to build - //! this Function Space - LocalFunctionSpaceScalar(const Basis& basis); - +class LocalFunctionSpaceScalar: public LocalFunctionSpace{ + public: //! Deletes this LocalFunctionSpaceScalar //! virtual ~LocalFunctionSpaceScalar(void); @@ -32,8 +21,13 @@ class LocalFunctionSpaceScalar: LocalFunctionSpace{ //! Interpolation //! @param x,y,z The coordinate of the Interpolation //! @return Returns the value of the Interpolation - double interpolate(const fullVector<double>& coef, - double x, double y, double z) const; + virtual double interpolate(const fullVector<double>& coef, + double x, double y, double z) const = 0; + + protected: + //! Instantiate a new LocalFunctionSpaceScalar + //! @warning Users can't instantiate a LocalFunctionSpaceScalar + LocalFunctionSpaceScalar(void); }; #endif diff --git a/FunctionSpace/LocalFunctionSpaceVector.cpp b/FunctionSpace/LocalFunctionSpaceVector.cpp index 5003759ee22d32325db07090bb3ba45d5c871c21..7fdc870a795ed9fb2f4a84ad25fcce1505838c07 100644 --- a/FunctionSpace/LocalFunctionSpaceVector.cpp +++ b/FunctionSpace/LocalFunctionSpaceVector.cpp @@ -1,20 +1,9 @@ #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){ + scalar = false; } 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 index 57971f6eb5e7ce7ebfacc5088c5244b1a76ed238..909059eb9380045b161c05ee7772f8d9da63247e 100644 --- a/FunctionSpace/LocalFunctionSpaceVector.h +++ b/FunctionSpace/LocalFunctionSpaceVector.h @@ -1,9 +1,6 @@ #ifndef _LOCALFUNCTIONSPACEVECTOR_H_ #define _LOCALFUNCTIONSPACEVECTOR_H_ -#include <vector> -#include "Polynomial.h" -#include "Basis.h" #include "fullMatrix.h" #include "LocalFunctionSpace.h" @@ -14,16 +11,8 @@ A Local Function Space build on a @em Vectorial Basis. */ -class LocalFunctionSpaceVector: LocalFunctionSpace{ - protected: - const std::vector<std::vector<Polynomial> >* basis; - +class LocalFunctionSpaceVector: public LocalFunctionSpace{ public: - //! Instantiate a new LocalFunctionSpaceVector - //! @param basis The Basis used to build - //! this Function Space - LocalFunctionSpaceVector(const Basis& basis); - //! Deletes this LocalFunctionSpaceVector //! virtual ~LocalFunctionSpaceVector(void); @@ -33,8 +22,13 @@ class LocalFunctionSpaceVector: LocalFunctionSpace{ //! Interpolation //! @param x,y,z The coordinate of the Interpolation //! @return Returns the value of the Interpolation - fullVector<double> interpolate(const fullVector<double>& coef, - double x, double y, double z) const; + virtual fullVector<double> interpolate(const fullVector<double>& coef, + double x, double y, double z) const = 0; + + protected: + //! Instantiate a new LocalFunctionSpacaeVector + //! @warning Users can't instantiate a LocalFunctionSpaceVector + LocalFunctionSpaceVector(void); }; #endif diff --git a/FunctionSpace/Polynomial.h b/FunctionSpace/Polynomial.h index a7e73a2a476bbfb8ed49156040f655beea6e878a..fe5571e04bbd655987f775081750aedd87905b58 100644 --- a/FunctionSpace/Polynomial.h +++ b/FunctionSpace/Polynomial.h @@ -171,7 +171,7 @@ class Polynomial{ @return Returns the @em evaluation of this Polynomial at (@c x, @c y, @c z) - @fn fullVector<double> Polynomial::at(const std::vector<Polynomial>&, const double, const double y, const double z) + @fn fullVector<double> Polynomial::at(const std::vector<Polynomial>&, const double, const double, const double) @param P A vector of Polynomial%s @param x A value @param y A value