00001
00002
00003
00004 #ifndef hpFunction1d_hh
00005 #define hpFunction1d_hh
00006
00007 #include "basics/typedefs.hh"
00008 #include "toolbox/array.hh"
00009 #include "space/function.hh"
00010 #include "element.hh"
00011
00012 namespace hp1D {
00013
00014 using concepts::Real;
00015
00016
00017
00022 template<typename F = Real,
00023 typename G = typename concepts::Realtype<F>::type>
00024 class Value : public concepts::ElementFunction<F, G> {
00025 public:
00027 virtual uint n() const { return 1; }
00028
00029 virtual void operator() (const concepts::Element<G>& elm,
00030 const concepts::Array<F>& coeff,
00031 concepts::Array<F>& val, const uint *i) const;
00032 virtual void operator() (const concepts::Element<G>& elm, const uint* j,
00033 concepts::Array<F>& val, const uint* i) const;
00034 virtual void operator() (const concepts::Element<G>& elm,
00035 const concepts::Array<F>& coeff,
00036 concepts::Array<F>& val, const Real p,
00037 const Real t = 0.0) const;
00038 virtual void operator() (const concepts::Element<G>& elm,
00039 const concepts::Array<F>& coeff,
00040 concepts::Array<F>& val, const concepts::Real2d& p,
00041 const Real t = 0.0) const;
00042 virtual void operator() (const concepts::Element<G>& elm,
00043 const concepts::Array<F>& coeff,
00044 concepts::Array<F>& val, const concepts::Real3d& p,
00045 const Real t = 0.0) const;
00046
00047 virtual Value<F,G>* clone() const {
00048 return new Value();
00049 }
00050 protected:
00051 virtual std::ostream& info(std::ostream& os) const;
00052 private:
00053 bool compute_(const hp1D::Element<G>* elm,
00054 const concepts::Array<F>& coeff,
00055 F& val, const uint i) const;
00056 bool compute_(const hp1D::Element<G>* elm, const uint j,
00057 F& val, const uint i) const;
00058 bool compute_(const hp1D::Element<G>* elm,
00059 const concepts::Array<F>& coeff,
00060 F& val, const Real p, const Real t = 0.0) const;
00061 };
00062
00063
00064
00069 template<typename F = Real,
00070 typename G = typename concepts::Realtype<F>::type>
00071 class Grad : public concepts::ElementFunction<F, G> {
00072 public:
00074 virtual uint n() const { return 1; }
00075
00076 virtual void operator() (const concepts::Element<G>& elm,
00077 const concepts::Array<F>& coeff,
00078 concepts::Array<F>& val, const uint *i) const;
00079 virtual void operator() (const concepts::Element<G>& elm, const uint* j,
00080 concepts::Array<F>& val, const uint* i) const;
00081 virtual void operator() (const concepts::Element<G>& elm,
00082 const concepts::Array<F>& coeff,
00083 concepts::Array<F>& val, const Real p,
00084 const Real t = 0.0) const;
00085 virtual void operator() (const concepts::Element<G>& elm,
00086 const concepts::Array<F>& coeff,
00087 concepts::Array<F>& val, const concepts::Real2d& p,
00088 const Real t = 0.0) const;
00089 virtual void operator() (const concepts::Element<G>& elm,
00090 const concepts::Array<F>& coeff,
00091 concepts::Array<F>& val, const concepts::Real3d& p,
00092 const Real t = 0.0) const;
00093
00094 virtual Grad<F,G>* clone() const {
00095 return new Grad();
00096 }
00097 protected:
00098 virtual std::ostream& info(std::ostream& os) const;
00099 private:
00100 bool compute_(const hp1D::Element<G>* elm,
00101 const concepts::Array<F>& coeff,
00102 F& val, const uint i) const;
00103 bool compute_(const hp1D::Element<G>* elm, const uint j,
00104 F& val, const uint i) const;
00105 bool compute_(const hp1D::Element<G>* elm,
00106 const concepts::Array<F>& coeff,
00107 F& val, const Real p, const Real t = 0.0) const;
00108 };
00109
00110 }
00111
00112 #endif // hpFunction1d_hh