Go to the documentation of this file.00001
00006 #ifndef hp2dbf_partialderiv_hh
00007 #define hp2dbf_partialderiv_hh
00008
00009 #include <memory>
00010 #include "operator/bilinearForm.hh"
00011 #include "basics/typedefs.hh"
00012 #include "geometry/sharedJacobian.hh"
00013 #include "hp2D/bilinearFormHelper.hh"
00014 #include "arrayElementFormula.hh"
00015
00016
00017 namespace concepts {
00018
00019 template<class F>
00020 class Array;
00021
00022 template<class F, int dim>
00023 class Point;
00024
00025 template<class F>
00026 class Element;
00027
00028 template<class F>
00029 class ElementMatrix;
00030
00031 template<typename F, typename G>
00032 class ElementFormula;
00033 }
00034
00035 namespace vectorial {
00036
00037 template<class F, class G>
00038 class BilinearForm;
00039 }
00040
00041 namespace hp2D {
00042
00043 template<class F>
00044 class Quad;
00045
00046 class InfiniteLaguerreQuad;
00047
00048 using concepts::Real;
00049
00050
00051
00052
00059 enum partDerivType { NO_DERIV = 0, X_DERIV = 1, Y_DERIV = 2};
00060
00061
00062
00084 template<class F = Real>
00085 class BilinearFormOnePartDeriv : public concepts::BilinearForm<F>,
00086 public BilinearFormHelper_0_1_Part<F>
00087 {
00088 public:
00094 BilinearFormOnePartDeriv(const enum partDerivType i,
00095 const concepts::ElementFormulaContainer<F>
00096 frm = concepts::ElementFormulaContainer<F>());
00097
00098 virtual ~BilinearFormOnePartDeriv() {}
00099
00100 virtual BilinearFormOnePartDeriv<F>* clone() const {
00101 return new BilinearFormOnePartDeriv<F>(i_, this->frm_);
00102 }
00103
00104 virtual void operator()(const concepts::Element<Real>& elmX,
00105 const concepts::Element<Real>& elmY,
00106 concepts::ElementMatrix<F>& em);
00107
00108 protected:
00109 virtual std::ostream& info(std::ostream& os) const;
00110 private:
00112 const enum partDerivType i_;
00113
00115 concepts::ElementMatrix<Real> stiff1D_, mass1D_;
00116
00118 bool operator()(const hp2D::Quad<Real>* elmX,
00119 const hp2D::Quad<Real>* elmY,
00120 concepts::ElementMatrix<F>& em);
00121
00122 bool operator()(const InfiniteLaguerreQuad* elmX,
00123 const InfiniteLaguerreQuad* elmY,
00124 concepts::ElementMatrix<F>& em);
00125 };
00126
00127
00128
00150 template<class F = Real>
00151 class BilinearFormTwoPartDeriv : public concepts::BilinearForm<F>,
00152 public BilinearFormHelper_1_1<F>
00153 {
00154 public:
00161 BilinearFormTwoPartDeriv(const enum partDerivType i,
00162 const enum partDerivType j,
00163 const concepts::ElementFormulaContainer<F>
00164 frm = concepts::ElementFormulaContainer<F>());
00165
00166 virtual ~BilinearFormTwoPartDeriv() {}
00167
00168 virtual BilinearFormTwoPartDeriv<F>* clone() const {
00169 return new BilinearFormTwoPartDeriv<F>(i_, j_, this->frm_);
00170 }
00171
00172 virtual void operator()(const concepts::Element<Real>& elmX,
00173 const concepts::Element<Real>& elmY,
00174 concepts::ElementMatrix<F>& em);
00175
00176 protected:
00177 virtual std::ostream& info(std::ostream& os) const;
00178 private:
00180 const enum partDerivType i_, j_;
00181
00183 bool operator()(const Quad<Real>* elmX,
00184 const Quad<Real>* elmY,
00185 concepts::ElementMatrix<F>& em);
00186 };
00187
00188 }
00189
00190 #endif // hp2dbf_partialderiv_hh