diff --git a/Solver/functionSpace.h b/Solver/functionSpace.h new file mode 100644 index 0000000000000000000000000000000000000000..e7e03f5cb8b044376fd29ae3f1281225ea029bf4 --- /dev/null +++ b/Solver/functionSpace.h @@ -0,0 +1,80 @@ +#ifndef _FUNCTION_SPACE_H_ +#define _FUNCTION_SPACE_H_ + +#include "SVector3.h" + +class STensor3{}; +class SVoid{}; + +class basisFunction{ + public: + void f(MElement *ele, double u, double v, double w, double *s) = 0; + void df(MElement *ele, double u, double v, double w, double *s) = 0; +}; + +class scalarPolynomialBasisFunction : public basisFunction{ + private: + polynomialBasis *_basis; + public: + void f(MElement *ele, double u, double v, double w, doble *s); + void df(MElement *ele, double u, double v, double w, double *s); +}; + +class vectorPolynomialBasisFunction : public basisFunction{ + private: + polynomialBasis *_basis[3]; + public: + void f(MElement *ele, double u, double v, double w, doble *s); + void df(MElement *ele, double u, double v, double w, double *s); +}; + +template<class T> struct TensorialTraits +{ + typedef T ValType; + typedef T GradType[3]; + typedef T HessType[3][3]; + typedef SVoid DivType; + typedef SVoid CurlType; +}; + +template<> struct TensorialTraits<double> +{ + typedef double ValType; + typedef SVector3 GradType; + typedef STensor3 HessType; + typedef SVoid DivType; + typedef SVoid CurlType; +}; + +template<> struct TensorialTraits<SVector3> +{ + typedef SVector3 ValType; + typedef STensor3 GradType; + typedef SVoid HessType; + typedef double DivType; + typedef SVector3 CurlType; +}; + +template<class T> +class functionSpace{ + protected: + typedef typename TensorialTraits<T>::ValType ValType; + typedef typename TensorialTraits<T>::GradType GradType; + std::vector<basisFunction*> basisFunctions; + public: + ValType f(MElement *ele, double u, double v, double w); + GradType gradf(MElement *ele, double u, double v, double w); + int getNumKeys(MElement *ele); + void getKeys(MElement *ele, Dof *keys); +}; + +template<class T> +class productFunctionSpace : public functionSpace { + private: + std::vector<functionSpace*> _spaces; + public: + ValType f(MElement *ele, double u, double v, double w); + GradType gradf(MElement *ele, double u, double v, double w); +}; + +#endif